diff --git a/.bazelversion b/.bazelversion index f9c71a52e2fd..acd405b1d62e 100644 --- a/.bazelversion +++ b/.bazelversion @@ -1 +1 @@ -8.5.1 +8.6.0 diff --git a/.gemini/config.yaml b/.gemini/config.yaml new file mode 100644 index 000000000000..9f4eb5f02da3 --- /dev/null +++ b/.gemini/config.yaml @@ -0,0 +1,11 @@ +have_fun: false +code_review: + disable: false + comment_severity_threshold: MEDIUM + max_review_comments: -1 + pull_request_opened: + help: false + summary: false + code_review: true + include_drafts: false +ignore_patterns: [] diff --git a/.github/SAVED_REPLIES.md b/.github/SAVED_REPLIES.md index 1237bc279e11..dfce61802c0e 100644 --- a/.github/SAVED_REPLIES.md +++ b/.github/SAVED_REPLIES.md @@ -99,3 +99,13 @@ I'd like to remind everyone that **you only have reproducible installs if you us **It is your responsibility as a library consumer to use lockfiles**. No one wants to do a release with bugs but it sometimes happens, and the best we can do is to fix it as fast as possible with a new release. When you have a couple of thousand total dependencies it is only a matter of time until one of them has a bad release. ``` + +## Angular CLI: Spam (v1) + +``` +Woah, looks like you've opened a lot of issues/PRs recently. While we appreciate contributions from the community, triaging and reviewing a large influx of content in a short time period takes time away from other ongoing projects. As a result, we're closing these issues/PRs to maintain the team's focus. + +Note that this is not necessarily a rejection of the goals or direction of any of these contributions in particular, so much as a reflection of the team's current capacity and priorities. + +You are welcome to open a smaller subset of issues/PRs in accordance with [our policy](https://github.com/angular/angular/blob/main/contributing-docs/spam.md) focused on the most important and impactful contributions and we will do our best to prioritize a response as soon as possible. +``` diff --git a/.github/_CODEOWNERS.tmp b/.github/_CODEOWNERS.tmp deleted file mode 100644 index 3e79d395914f..000000000000 --- a/.github/_CODEOWNERS.tmp +++ /dev/null @@ -1,17 +0,0 @@ -/packages/_/ @hansl @clydin -/packages/angular/pwa @hansl @Brocco -/packages/angular_devkit/architect/ @filipesilva @hansl -/packages/angular_devkit/architect_cli/ @filipesilva @hansl -/packages/angular_devkit/build_angular/ @filipesilva @clydin -/packages/angular_devkit/build_ng_packagr/ @filipesilva @clydin -/packages/angular_devkit/build_optimizer/ @filipesilva @clydin -/packages/angular_devkit/core/ @hansl @clydin -/packages/angular_devkit/schematics/ @hansl @Brocco -/packages/angular_devkit/schematics_cli/ @hansl @Brocco -/packages/ngtools/webpack/ @hansl @filipesilva @clydin -/packages/schematics/angular/ @hansl @Brocco -/packages/schematics/package_update/ @hansl @Brocco -/packages/schematics/schematics/ @hansl @Brocco -/packages/schematics/update/ @hansl @Brocco -/rules/ @hansl @clydin -/scripts/ @hansl @clydin diff --git a/.github/workflows/assistant-to-the-branch-manager.yml b/.github/workflows/assistant-to-the-branch-manager.yml index 6e0a4cb8c7d7..87519e50b728 100644 --- a/.github/workflows/assistant-to-the-branch-manager.yml +++ b/.github/workflows/assistant-to-the-branch-manager.yml @@ -17,6 +17,6 @@ jobs: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: persist-credentials: false - - uses: angular/dev-infra/github-actions/branch-manager@469708f109a90884ca403d150d33079a3a5a8769 + - uses: angular/dev-infra/github-actions/branch-manager@ba726e7bca0b08b125ccc6f93c233749e1213c17 with: angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5f62362d4410..1617dbb0d061 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,9 +21,9 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@469708f109a90884ca403d150d33079a3a5a8769 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@ba726e7bca0b08b125ccc6f93c233749e1213c17 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@469708f109a90884ca403d150d33079a3a5a8769 + uses: angular/dev-infra/github-actions/bazel/setup@ba726e7bca0b08b125ccc6f93c233749e1213c17 - name: Install node modules run: pnpm install --frozen-lockfile - name: Generate JSON schema types @@ -44,11 +44,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@469708f109a90884ca403d150d33079a3a5a8769 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@ba726e7bca0b08b125ccc6f93c233749e1213c17 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@469708f109a90884ca403d150d33079a3a5a8769 + uses: angular/dev-infra/github-actions/bazel/setup@ba726e7bca0b08b125ccc6f93c233749e1213c17 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@469708f109a90884ca403d150d33079a3a5a8769 + uses: angular/dev-infra/github-actions/bazel/configure-remote@ba726e7bca0b08b125ccc6f93c233749e1213c17 with: google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }} - name: Install node modules @@ -61,11 +61,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@469708f109a90884ca403d150d33079a3a5a8769 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@ba726e7bca0b08b125ccc6f93c233749e1213c17 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@469708f109a90884ca403d150d33079a3a5a8769 + uses: angular/dev-infra/github-actions/bazel/setup@ba726e7bca0b08b125ccc6f93c233749e1213c17 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@469708f109a90884ca403d150d33079a3a5a8769 + uses: angular/dev-infra/github-actions/bazel/configure-remote@ba726e7bca0b08b125ccc6f93c233749e1213c17 with: google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }} - name: Install node modules @@ -78,19 +78,19 @@ jobs: strategy: fail-fast: false matrix: - node: [20, 22, 24] + node: [22, 24] subset: [esbuild, webpack] shard: [0, 1, 2, 3, 4, 5] runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@469708f109a90884ca403d150d33079a3a5a8769 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@ba726e7bca0b08b125ccc6f93c233749e1213c17 - name: Install node modules run: pnpm install --frozen-lockfile - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@469708f109a90884ca403d150d33079a3a5a8769 + uses: angular/dev-infra/github-actions/bazel/setup@ba726e7bca0b08b125ccc6f93c233749e1213c17 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@469708f109a90884ca403d150d33079a3a5a8769 + uses: angular/dev-infra/github-actions/bazel/configure-remote@ba726e7bca0b08b125ccc6f93c233749e1213c17 with: google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }} - name: Run CLI E2E tests @@ -100,11 +100,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@469708f109a90884ca403d150d33079a3a5a8769 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@ba726e7bca0b08b125ccc6f93c233749e1213c17 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@469708f109a90884ca403d150d33079a3a5a8769 + uses: angular/dev-infra/github-actions/bazel/setup@ba726e7bca0b08b125ccc6f93c233749e1213c17 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@469708f109a90884ca403d150d33079a3a5a8769 + uses: angular/dev-infra/github-actions/bazel/configure-remote@ba726e7bca0b08b125ccc6f93c233749e1213c17 with: google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }} - name: Install node modules @@ -117,7 +117,7 @@ jobs: //tests:e2e.esbuild_node24 \ --platforms=tools:windows_x64 - name: Store built Windows E2E tests - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 with: name: win-e2e-build-artifacts path: | @@ -137,11 +137,11 @@ jobs: runs-on: windows-2025 steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@469708f109a90884ca403d150d33079a3a5a8769 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@ba726e7bca0b08b125ccc6f93c233749e1213c17 - name: Install node modules run: pnpm install --frozen-lockfile - name: Download built Windows E2E tests - uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7.0.0 + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 with: name: win-e2e-build-artifacts path: dist/bin/tests/ @@ -164,13 +164,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@469708f109a90884ca403d150d33079a3a5a8769 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@ba726e7bca0b08b125ccc6f93c233749e1213c17 - name: Install node modules run: pnpm install --frozen-lockfile - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@469708f109a90884ca403d150d33079a3a5a8769 + uses: angular/dev-infra/github-actions/bazel/setup@ba726e7bca0b08b125ccc6f93c233749e1213c17 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@469708f109a90884ca403d150d33079a3a5a8769 + uses: angular/dev-infra/github-actions/bazel/configure-remote@ba726e7bca0b08b125ccc6f93c233749e1213c17 with: google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }} - name: Run CLI E2E tests @@ -188,13 +188,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@469708f109a90884ca403d150d33079a3a5a8769 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@ba726e7bca0b08b125ccc6f93c233749e1213c17 - name: Install node modules run: pnpm install --frozen-lockfile - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@469708f109a90884ca403d150d33079a3a5a8769 + uses: angular/dev-infra/github-actions/bazel/setup@ba726e7bca0b08b125ccc6f93c233749e1213c17 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@469708f109a90884ca403d150d33079a3a5a8769 + uses: angular/dev-infra/github-actions/bazel/configure-remote@ba726e7bca0b08b125ccc6f93c233749e1213c17 with: google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }} - name: Run CLI E2E tests @@ -208,13 +208,13 @@ jobs: SAUCE_TUNNEL_IDENTIFIER: angular-cli-${{ github.workflow }}-${{ github.run_number }} steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@469708f109a90884ca403d150d33079a3a5a8769 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@ba726e7bca0b08b125ccc6f93c233749e1213c17 - name: Install node modules run: pnpm install --frozen-lockfile - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@469708f109a90884ca403d150d33079a3a5a8769 + uses: angular/dev-infra/github-actions/bazel/setup@ba726e7bca0b08b125ccc6f93c233749e1213c17 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@469708f109a90884ca403d150d33079a3a5a8769 + uses: angular/dev-infra/github-actions/bazel/configure-remote@ba726e7bca0b08b125ccc6f93c233749e1213c17 with: google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }} - name: Run E2E Browser tests @@ -231,7 +231,7 @@ jobs: ./scripts/saucelabs/wait-for-tunnel.sh pnpm bazel test --config=saucelabs //tests:e2e.saucelabs ./scripts/saucelabs/stop-tunnel.sh - - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 + - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 if: ${{ failure() }} with: name: sauce-connect-log @@ -244,11 +244,11 @@ jobs: CIRCLE_BRANCH: ${{ github.ref_name }} steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@469708f109a90884ca403d150d33079a3a5a8769 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@ba726e7bca0b08b125ccc6f93c233749e1213c17 - name: Install node modules run: pnpm install --frozen-lockfile - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@469708f109a90884ca403d150d33079a3a5a8769 + uses: angular/dev-infra/github-actions/bazel/setup@ba726e7bca0b08b125ccc6f93c233749e1213c17 - run: pnpm admin snapshots --verbose env: SNAPSHOT_BUILDS_GITHUB_TOKEN: ${{ secrets.SNAPSHOT_BUILDS_GITHUB_TOKEN }} diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 0b070c5aae16..2f8871e567c0 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -23,12 +23,12 @@ jobs: with: persist-credentials: false - name: Initialize CodeQL - uses: github/codeql-action/init@45cbd0c69e560cd9e7cd7f8c32362050c9b7ded2 # v4.32.2 + uses: github/codeql-action/init@c10b8064de6f491fea524254123dbe5e09572f13 # v4.35.1 with: languages: javascript-typescript build-mode: none config-file: .github/codeql/config.yml - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@45cbd0c69e560cd9e7cd7f8c32362050c9b7ded2 # v4.32.2 + uses: github/codeql-action/analyze@c10b8064de6f491fea524254123dbe5e09572f13 # v4.35.1 with: category: '/language:javascript-typescript' diff --git a/.github/workflows/dev-infra.yml b/.github/workflows/dev-infra.yml index d8d2f0b7bb6c..8336a6ba0f4d 100644 --- a/.github/workflows/dev-infra.yml +++ b/.github/workflows/dev-infra.yml @@ -3,6 +3,8 @@ name: DevInfra on: pull_request_target: types: [opened, synchronize, reopened] + issues: + types: [opened, reopened] # Declare default permissions as read only. permissions: @@ -10,16 +12,24 @@ permissions: jobs: labels: + if: github.event_name == 'pull_request_target' runs-on: ubuntu-latest steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - - uses: angular/dev-infra/github-actions/pull-request-labeling@469708f109a90884ca403d150d33079a3a5a8769 + - uses: angular/dev-infra/github-actions/labeling/pull-request@ba726e7bca0b08b125ccc6f93c233749e1213c17 with: angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }} post_approval_changes: + if: github.event_name == 'pull_request_target' runs-on: ubuntu-latest steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - - uses: angular/dev-infra/github-actions/post-approval-changes@469708f109a90884ca403d150d33079a3a5a8769 + - uses: angular/dev-infra/github-actions/post-approval-changes@ba726e7bca0b08b125ccc6f93c233749e1213c17 with: angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }} + issue_labels: + if: github.event_name == 'issues' + runs-on: ubuntu-latest + steps: + - uses: angular/dev-infra/github-actions/labeling/issue@ba726e7bca0b08b125ccc6f93c233749e1213c17 + with: + angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }} + google-generative-ai-key: ${{ secrets.GOOGLE_GENERATIVE_AI_KEY }} diff --git a/.github/workflows/feature-requests.yml b/.github/workflows/feature-requests.yml deleted file mode 100644 index 4e22f1a5eda8..000000000000 --- a/.github/workflows/feature-requests.yml +++ /dev/null @@ -1,21 +0,0 @@ -name: Feature request triage bot - -# Declare default permissions as read only. -permissions: - contents: read - -on: - schedule: - # Run at 13:00 every day - - cron: '0 13 * * *' - -jobs: - feature_triage: - # To prevent this action from running in forks, we only run it if the repository is exactly the - # angular/angular-cli repository. - if: github.repository == 'angular/angular-cli' - runs-on: ubuntu-latest - steps: - - uses: angular/dev-infra/github-actions/feature-request@469708f109a90884ca403d150d33079a3a5a8769 - with: - angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }} diff --git a/.github/workflows/perf.yml b/.github/workflows/perf.yml index 9dbf67608b8c..dac67ebcbe7f 100644 --- a/.github/workflows/perf.yml +++ b/.github/workflows/perf.yml @@ -23,7 +23,7 @@ jobs: workflows: ${{ steps.workflows.outputs.workflows }} steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@469708f109a90884ca403d150d33079a3a5a8769 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@ba726e7bca0b08b125ccc6f93c233749e1213c17 - name: Install node modules run: pnpm install --frozen-lockfile - id: workflows @@ -38,9 +38,9 @@ jobs: workflow: ${{ fromJSON(needs.list.outputs.workflows) }} steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@469708f109a90884ca403d150d33079a3a5a8769 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@ba726e7bca0b08b125ccc6f93c233749e1213c17 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@469708f109a90884ca403d150d33079a3a5a8769 + uses: angular/dev-infra/github-actions/bazel/setup@ba726e7bca0b08b125ccc6f93c233749e1213c17 - name: Install node modules run: pnpm install --frozen-lockfile # We utilize the google-github-actions/auth action to allow us to get an active credential using workflow diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 12195b663fda..1015afa28ef7 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -23,7 +23,7 @@ jobs: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: persist-credentials: false - - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 + - uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1 id: filter with: filters: | @@ -34,11 +34,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@469708f109a90884ca403d150d33079a3a5a8769 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@ba726e7bca0b08b125ccc6f93c233749e1213c17 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@469708f109a90884ca403d150d33079a3a5a8769 + uses: angular/dev-infra/github-actions/bazel/setup@ba726e7bca0b08b125ccc6f93c233749e1213c17 - name: Setup ESLint Caching - uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3 + uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4 with: path: .eslintcache key: ${{ runner.os }}-${{ hashFiles('.eslintrc.json') }} @@ -66,23 +66,23 @@ jobs: # it has been merged. run: pnpm ng-dev format changed --check ${{ github.event.pull_request.base.sha }} - name: Check Package Licenses - uses: angular/dev-infra/github-actions/linting/licenses@469708f109a90884ca403d150d33079a3a5a8769 + uses: angular/dev-infra/github-actions/linting/licenses@ba726e7bca0b08b125ccc6f93c233749e1213c17 build: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@469708f109a90884ca403d150d33079a3a5a8769 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@ba726e7bca0b08b125ccc6f93c233749e1213c17 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@469708f109a90884ca403d150d33079a3a5a8769 + uses: angular/dev-infra/github-actions/bazel/setup@ba726e7bca0b08b125ccc6f93c233749e1213c17 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@469708f109a90884ca403d150d33079a3a5a8769 + uses: angular/dev-infra/github-actions/bazel/configure-remote@ba726e7bca0b08b125ccc6f93c233749e1213c17 - name: Install node modules run: pnpm install --frozen-lockfile - name: Build release targets run: pnpm ng-dev release build - name: Store PR release packages - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 with: name: packages path: dist/releases/*.tgz @@ -93,11 +93,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@469708f109a90884ca403d150d33079a3a5a8769 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@ba726e7bca0b08b125ccc6f93c233749e1213c17 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@469708f109a90884ca403d150d33079a3a5a8769 + uses: angular/dev-infra/github-actions/bazel/setup@ba726e7bca0b08b125ccc6f93c233749e1213c17 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@469708f109a90884ca403d150d33079a3a5a8769 + uses: angular/dev-infra/github-actions/bazel/configure-remote@ba726e7bca0b08b125ccc6f93c233749e1213c17 - name: Install node modules run: pnpm install --frozen-lockfile - name: Run module and package tests @@ -114,13 +114,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@469708f109a90884ca403d150d33079a3a5a8769 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@ba726e7bca0b08b125ccc6f93c233749e1213c17 - name: Install node modules run: pnpm install --frozen-lockfile - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@469708f109a90884ca403d150d33079a3a5a8769 + uses: angular/dev-infra/github-actions/bazel/setup@ba726e7bca0b08b125ccc6f93c233749e1213c17 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@469708f109a90884ca403d150d33079a3a5a8769 + uses: angular/dev-infra/github-actions/bazel/configure-remote@ba726e7bca0b08b125ccc6f93c233749e1213c17 - name: Run CLI E2E tests run: pnpm bazel test --test_env=E2E_SHARD_TOTAL=6 --test_env=E2E_SHARD_INDEX=${{ matrix.shard }} --config=e2e //tests:e2e.${{ matrix.subset }}_node${{ matrix.node }} @@ -128,11 +128,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@469708f109a90884ca403d150d33079a3a5a8769 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@ba726e7bca0b08b125ccc6f93c233749e1213c17 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@469708f109a90884ca403d150d33079a3a5a8769 + uses: angular/dev-infra/github-actions/bazel/setup@ba726e7bca0b08b125ccc6f93c233749e1213c17 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@469708f109a90884ca403d150d33079a3a5a8769 + uses: angular/dev-infra/github-actions/bazel/configure-remote@ba726e7bca0b08b125ccc6f93c233749e1213c17 - name: Install node modules run: pnpm install --frozen-lockfile - name: Build E2E tests for Windows on Linux @@ -142,7 +142,7 @@ jobs: //tests:e2e.esbuild_node24 \ --platforms=tools:windows_x64 - name: Store built Windows E2E tests - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 with: name: win-e2e-build-artifacts path: | @@ -156,11 +156,11 @@ jobs: runs-on: windows-2025 steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@469708f109a90884ca403d150d33079a3a5a8769 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@ba726e7bca0b08b125ccc6f93c233749e1213c17 - name: Install node modules run: pnpm install --frozen-lockfile - name: Download built Windows E2E tests - uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7.0.0 + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 with: name: win-e2e-build-artifacts path: dist/bin/tests/ @@ -183,13 +183,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@469708f109a90884ca403d150d33079a3a5a8769 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@ba726e7bca0b08b125ccc6f93c233749e1213c17 - name: Install node modules run: pnpm install --frozen-lockfile - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@469708f109a90884ca403d150d33079a3a5a8769 + uses: angular/dev-infra/github-actions/bazel/setup@ba726e7bca0b08b125ccc6f93c233749e1213c17 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@469708f109a90884ca403d150d33079a3a5a8769 + uses: angular/dev-infra/github-actions/bazel/configure-remote@ba726e7bca0b08b125ccc6f93c233749e1213c17 - name: Run CLI E2E tests run: pnpm bazel test --test_env=E2E_SHARD_TOTAL=3 --test_env=E2E_SHARD_INDEX=${{ matrix.shard }} --config=e2e //tests:e2e.${{ matrix.subset }}_node${{ matrix.node }} @@ -205,12 +205,12 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@469708f109a90884ca403d150d33079a3a5a8769 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@ba726e7bca0b08b125ccc6f93c233749e1213c17 - name: Install node modules run: pnpm install --frozen-lockfile - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@469708f109a90884ca403d150d33079a3a5a8769 + uses: angular/dev-infra/github-actions/bazel/setup@ba726e7bca0b08b125ccc6f93c233749e1213c17 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@469708f109a90884ca403d150d33079a3a5a8769 + uses: angular/dev-infra/github-actions/bazel/configure-remote@ba726e7bca0b08b125ccc6f93c233749e1213c17 - name: Run CLI E2E tests run: pnpm bazel test --test_env=E2E_SHARD_TOTAL=6 --test_env=E2E_SHARD_INDEX=${{ matrix.shard }} --config=e2e //tests:e2e.snapshots.${{ matrix.subset }}_node${{ matrix.node }} diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 4c9465d0cf9b..10f1a668575e 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -38,7 +38,7 @@ jobs: # Upload the results as artifacts. - name: 'Upload artifact' - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 with: name: SARIF file path: results.sarif @@ -46,6 +46,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: 'Upload to code-scanning' - uses: github/codeql-action/upload-sarif@45cbd0c69e560cd9e7cd7f8c32362050c9b7ded2 # v4.32.2 + uses: github/codeql-action/upload-sarif@c10b8064de6f491fea524254123dbe5e09572f13 # v4.35.1 with: sarif_file: results.sarif diff --git a/.monorepo.json b/.monorepo.json index 4d5face644df..ad86e09acdeb 100644 --- a/.monorepo.json +++ b/.monorepo.json @@ -59,11 +59,6 @@ ], "snapshotRepo": "angular/angular-devkit-architect-builds" }, - "@angular-devkit/architect-cli": { - "name": "Architect CLI", - "section": "Tooling", - "snapshotRepo": "angular/angular-devkit-architect-cli-builds" - }, "@angular-devkit/build-angular": { "name": "Build Angular", "links": [ diff --git a/.ng-dev/release.mjs b/.ng-dev/release.mjs index 2aadf9db122c..4d4a4fc4b927 100644 --- a/.ng-dev/release.mjs +++ b/.ng-dev/release.mjs @@ -23,12 +23,7 @@ export const release = { await assertValidDependencyRanges(newVersion, releasePackages); }, releaseNotes: { - groupOrder: [ - '@angular/cli', - '@schematics/angular', - '@angular-devkit/architect-cli', - '@angular-devkit/schematics-cli', - ], + groupOrder: ['@angular/cli', '@schematics/angular', '@angular-devkit/schematics-cli'], }, publishRegistry: 'https://wombat-dressing-room.appspot.com', releasePrLabels: ['action: merge'], diff --git a/.nvmrc b/.nvmrc index 85e502778f62..db49bb14d78e 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -22.22.0 +22.22.2 diff --git a/CHANGELOG.md b/CHANGELOG.md index b11c764b3618..f3779f5da66c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,112 +1,571 @@ - + -# 19.2.20 (2026-02-13) +# 22.0.0-next.5 (2026-04-08) + +## Breaking Changes + +### @angular/build + +- `istanbul-lib-instrument` is now an optional peer dependency. + Projects using karma with code coverage enabled will need to ensure that istanbul-lib-instrument is installed. Note: `ng update` will automatically add this dependency during the update process. + +### @schematics/angular + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------------------- | +| [be60a63b7](https://github.com/angular/angular-cli/commit/be60a63b7b8fdea26bfd3329ce54d321334db2d2) | feat | add migrate-karma-to-vitest update migration | +| [43505066e](https://github.com/angular/angular-cli/commit/43505066e2350ca875051bb0f9991da8003c9247) | feat | add migration to add istanbul-lib-instrument | +| [470e1f937](https://github.com/angular/angular-cli/commit/470e1f937492e73971dea9c39af83368caf74e42) | fix | add istanbul-lib-instrument to application/library generator dependencies | + +### @angular/cli + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | -------------------------------------------------------------- | +| [422c8183e](https://github.com/angular/angular-cli/commit/422c8183ea3596660475491b9630df34276c468e) | fix | handle missing package manager during analytics initialization | + +### @angular/build + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ---------------------------------------------------------- | +| [3007f46b7](https://github.com/angular/angular-cli/commit/3007f46b7e077227b17d8bb1090edd2f8ff19ae3) | feat | move istanbul-lib-instrument to optional peer dependency | +| [829bdc61d](https://github.com/angular/angular-cli/commit/829bdc61dd77231bb13f01efd052811661fe4f48) | fix | preserve coverage ignore comments in development | +| [e2f95fc19](https://github.com/angular/angular-cli/commit/e2f95fc19a648f3da84b58ace91283d0fa422cc1) | fix | show clear error when styleUrl points to a TypeScript file | + + + + + +# 21.2.7 (2026-04-08) + +### @angular/cli + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | -------------------------------------------------------------- | +| [971041aa1](https://github.com/angular/angular-cli/commit/971041aa11e4546772e4677b77ceec2ad1374496) | fix | handle missing package manager during analytics initialization | + +### @angular/build + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ---------------------------------------------------------- | +| [365cce81d](https://github.com/angular/angular-cli/commit/365cce81dde91463d4f0049a69feaed018902585) | fix | preserve coverage ignore comments in development | +| [9f74660c3](https://github.com/angular/angular-cli/commit/9f74660c3688bb1f0d6a7608a136a30dbfe4d7e9) | fix | show clear error when styleUrl points to a TypeScript file | + + + + + +# 20.3.23 (2026-04-08) + +### @angular/build + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ---------------------- | +| [ccab02ba0](https://github.com/angular/angular-cli/commit/ccab02ba0413f25464a6e4cb5871716b221013b7) | fix | update vite to `7.3.2` | + + + + + +# 19.2.24 (2026-04-08) + +### @angular/build + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ---------------------- | +| [f4595d599](https://github.com/angular/angular-cli/commit/f4595d599001713ae978865d7f84e33e5a9a077a) | fix | update vite to `6.4.2` | + + + + + +# 22.0.0-next.4 (2026-04-01) + +### @angular/cli + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ----------------------------------------------- | +| [87d99e98b](https://github.com/angular/angular-cli/commit/87d99e98b178c8f7d5e944a346faf70c51bdfcef) | feat | support custom port in MCP devserver start tool | +| [4815a5417](https://github.com/angular/angular-cli/commit/4815a5417c7a0135fb66149c2e4c1008e21e3a26) | fix | fix sourceRoot resolution for MCP projects tool | + +### @angular/build + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------------- | +| [21d8aa474](https://github.com/angular/angular-cli/commit/21d8aa4747573132476c3a0a4b7ea1f6405a71ef) | fix | ensure transitive SCSS partial errors are tracked in watch mode | +| [e558117b7](https://github.com/angular/angular-cli/commit/e558117b748ee5837324d49466108d21db596b2e) | fix | ensure Vitest mock patching is executed only once | +| [81e4faae7](https://github.com/angular/angular-cli/commit/81e4faae7699e2ed1eb8f4656dc115ca9c20f416) | fix | preserve error stack traces during prerendering | +| [8dd341e21](https://github.com/angular/angular-cli/commit/8dd341e21b8f44e8e2bf3f322cced8ff6e861098) | fix | scope CHROME_BIN executable path to individual playwright instances | + +### @angular/ssr + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ---------------------------------------------------- | +| [e7e434ca3](https://github.com/angular/angular-cli/commit/e7e434ca3d78a8369b592bf870c9466962f77c94) | fix | allow underscores in host validation | +| [bcd99f944](https://github.com/angular/angular-cli/commit/bcd99f944ecb90f896040030b98f1d03692b5b6f) | fix | patch Headers.forEach in cloneRequestAndPatchHeaders | + + + + + +# 21.2.6 (2026-04-01) + +### @angular/cli + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ----------------------------------------------- | +| [ea14f28cc](https://github.com/angular/angular-cli/commit/ea14f28ccfc6e5534eaef516bf1bfbe21582da04) | fix | fix sourceRoot resolution for MCP projects tool | + +### @angular/build + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------------- | +| [9136eb376](https://github.com/angular/angular-cli/commit/9136eb37630d6315891b3c881cd0ba4037c3254c) | fix | ensure transitive SCSS partial errors are tracked in watch mode | +| [8186faa11](https://github.com/angular/angular-cli/commit/8186faa117803ffb6ac8e2c4cd6ab7873502308d) | fix | ensure Vitest mock patching is executed only once | +| [107d1a9e2](https://github.com/angular/angular-cli/commit/107d1a9e26fc59c7878254e563758818866f0f6e) | fix | preserve error stack traces during prerendering | +| [b7f457253](https://github.com/angular/angular-cli/commit/b7f4572533675729e87532bdc23509feb2f3a28d) | fix | scope CHROME_BIN executable path to individual playwright instances | + + + + + +# 21.2.5 (2026-03-27) + +### @angular/cli + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ----------------------------------------------- | +| [cadf9b201](https://github.com/angular/angular-cli/commit/cadf9b201bd1055a6e3cc016eb01e0196b028080) | feat | support custom port in MCP devserver start tool | + +### @angular/ssr + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ---------------------------------------------------- | +| [bbc255419](https://github.com/angular/angular-cli/commit/bbc255419b346e5152391b47f310922f86e9e383) | fix | allow underscores in host validation | +| [b1fe66a7f](https://github.com/angular/angular-cli/commit/b1fe66a7f8650ce021b4070394bc31848fc64ca5) | fix | patch Headers.forEach in cloneRequestAndPatchHeaders | + + + + + +# 20.3.22 (2026-03-27) ### @angular-devkit/build-angular | Commit | Type | Description | | --------------------------------------------------------------------------------------------------- | ---- | ------------------------- | -| [0e5421ba7](https://github.com/angular/angular-cli/commit/0e5421ba78814cf11e4d4510e930eaacc6458662) | fix | update webpack to 5.105.0 | +| [5978eeeff](https://github.com/angular/angular-cli/commit/5978eeeff63cd62f1515d949eaad0b5e6f7c44cd) | fix | update picomatch to 4.0.4 | + +### @angular-devkit/core + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ------------------------- | +| [6e9b92612](https://github.com/angular/angular-cli/commit/6e9b926129a9dd79f01d47b7446411b8963ffb62) | fix | update picomatch to 4.0.4 | + +### @angular/build + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ------------------------- | +| [6f209c26d](https://github.com/angular/angular-cli/commit/6f209c26dc5a454acd1cd76f25240c26978fa827) | fix | update picomatch to 4.0.4 | - + + +# 19.2.23 (2026-03-27) + +### @angular/cli + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ------------------------- | +| [67cfbe32f](https://github.com/angular/angular-cli/commit/67cfbe32ff013d7c9763253c8ccd383d8ee2416c) | fix | update picomatch to 4.0.4 | + +### @angular-devkit/build-angular + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ------------------------- | +| [771b979e7](https://github.com/angular/angular-cli/commit/771b979e78af079242bea607470b3ad3b6162659) | fix | update picomatch to 4.0.4 | + +### @angular-devkit/core + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ------------------------- | +| [de2da4874](https://github.com/angular/angular-cli/commit/de2da4874026bb47d08de828b6b4b44fd7d9a3c4) | fix | update picomatch to 4.0.4 | + +### @angular/build + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ------------------------- | +| [27a9ce4a7](https://github.com/angular/angular-cli/commit/27a9ce4a7446db0533e4a7ef64301eeccc5e21e1) | fix | update picomatch to 4.0.4 | + + + + + +# 22.0.0-next.3 (2026-03-26) + +### @angular/cli + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ---------------------------------------------- | +| [4bbd1bf53](https://github.com/angular/angular-cli/commit/4bbd1bf532fc2d9c36650121a05eae2fb096eb09) | fix | restore console methods after logger completes | + +### @schematics/angular + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------- | +| [f98cc82eb](https://github.com/angular/angular-cli/commit/f98cc82eb0f46986e61b4f94b57dcd36e4eaf215) | feat | rely on strict template default in generated workspaces | + +### @angular/build + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------------------- | +| [01bd5d064](https://github.com/angular/angular-cli/commit/01bd5d06410719f66fcabb0bfd04c809e7db12f7) | fix | deduplicate and merge coverage excludes with vitest | +| [355ebe8c5](https://github.com/angular/angular-cli/commit/355ebe8c54b58201c8080543e5e04208599f0947) | fix | prevent reporter duplicates by explicitly overriding Vitest configuration | +| [1a8376bee](https://github.com/angular/angular-cli/commit/1a8376bee9b7683b84c2ae50d08e50d5c5c7b99a) | fix | remove default for unit-test coverage option | +| [a203dcf1d](https://github.com/angular/angular-cli/commit/a203dcf1d9a6d544cbae867aa949ab0582e60a88) | fix | warn about performance of test.exclude in vitest configuration | +| [ec10eb365](https://github.com/angular/angular-cli/commit/ec10eb365261549c2181efa98a494a749444a787) | fix | warn when vitest watch config conflicts with builder | + +### @angular/ssr + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------------- | +| [ca6f08c6e](https://github.com/angular/angular-cli/commit/ca6f08c6e59820160f7ae496a9d8775c78ce1a58) | fix | apply forwarded prefix and vary header in accept-language redirects | +| [3b99ee140](https://github.com/angular/angular-cli/commit/3b99ee140db82c8ddae3f6e48f9fc38eca204a53) | fix | support '\*' in allowedHosts and warn about security risks | + + + + + +# 21.2.4 (2026-03-26) + +### @angular/cli -# 21.2.0-next.2 (2026-02-11) +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ---------------------------------------------- | +| [a7787d092](https://github.com/angular/angular-cli/commit/a7787d0925559fe7731034856a872708bcfb78be) | fix | restore console methods after logger completes | ### @angular/build +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------------------- | +| [7170599ab](https://github.com/angular/angular-cli/commit/7170599ab237691d9208c410363ef7e4ee50db2c) | fix | deduplicate and merge coverage excludes with vitest | +| [c73f13797](https://github.com/angular/angular-cli/commit/c73f13797afe57fcc98faf6361085e1dd5afae9b) | fix | prevent reporter duplicates by explicitly overriding Vitest configuration | +| [956ccaa71](https://github.com/angular/angular-cli/commit/956ccaa71ea8a3626e4139cf7e2f26ee637feeed) | fix | remove default for unit-test coverage option | +| [36978db7e](https://github.com/angular/angular-cli/commit/36978db7e494e4e5612aa2a8384199eeca7c4c2d) | fix | warn about performance of test.exclude in vitest configuration | +| [6ec36f5be](https://github.com/angular/angular-cli/commit/6ec36f5bee05d97c10ca8d91d5746621ffb1fdb9) | fix | warn when vitest watch config conflicts with builder | + +### @angular/ssr + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------------- | +| [9bdf782c8](https://github.com/angular/angular-cli/commit/9bdf782c838ab5820ec905d689a62ffc3b3cabe3) | fix | apply forwarded prefix and vary header in accept-language redirects | +| [628c58672](https://github.com/angular/angular-cli/commit/628c586728748e1c367fa7e363299eb79b1566ca) | fix | support '\*' in allowedHosts and warn about security risks | + + + + + +# 20.3.21 (2026-03-19) + +### @angular/ssr + | Commit | Type | Description | | --------------------------------------------------------------------------------------------------- | ---- | ----------------------------------------------------- | -| [cad7a7c0f](https://github.com/angular/angular-cli/commit/cad7a7c0ff3778f04820a99ad0aa9d74f1067fd5) | feat | run vitest browser with playwright with OS theme | -| [8ae7f59e6](https://github.com/angular/angular-cli/commit/8ae7f59e6f988489fda8c1346e3d2c3768d7a5f0) | fix | correctly resolve absolute setup file paths in Vitest | -| [fd5cb28c8](https://github.com/angular/angular-cli/commit/fd5cb28c8082417288a896b89bde659bb0dc92e2) | fix | explicitly fail when using Vitest runtime mocking | +| [1dc6992a5](https://github.com/angular/angular-cli/commit/1dc6992a5ae6c5a1f16f22f6c94690d5cf218c38) | fix | disallow x-forwarded-prefix starting with a backslash | +| [0a2ff0b2b](https://github.com/angular/angular-cli/commit/0a2ff0b2b3aceb228c9447c19fb762df742d7265) | fix | ensure unique values in redirect response Vary header | +| [cdbac82a8](https://github.com/angular/angular-cli/commit/cdbac82a85b35f24c70a062eeb8a13b521831019) | fix | support custom headers in redirect responses | - + -# 21.1.4 (2026-02-11) +# 22.0.0-next.2 (2026-03-18) + +### @angular/cli + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------ | +| [c9f07db8f](https://github.com/angular/angular-cli/commit/c9f07db8fcb0b3f8400fbbf0e131be7f9857a987) | fix | use parsed package name for migrate-only updates | + +### @schematics/angular + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | --------------------------------------------- | +| [6572a6944](https://github.com/angular/angular-cli/commit/6572a69443356ff0022e6ce162915125fee0e3bb) | fix | default components to OnPush change detection | ### @angular/build +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------------------ | +| [9b33e1781](https://github.com/angular/angular-cli/commit/9b33e1781328d3b42665145bf580fb8e06c8ad2b) | fix | alias createRequire banner import to avoid duplicate binding | +| [4643a8a3b](https://github.com/angular/angular-cli/commit/4643a8a3b3e2a3bcf7baae9f812ae8a9ef10ebad) | fix | only use external packages for polyfills when no local files are present | + +### @angular/ssr + | Commit | Type | Description | | --------------------------------------------------------------------------------------------------- | ---- | ----------------------------------------------------- | -| [7a9dd6b47](https://github.com/angular/angular-cli/commit/7a9dd6b47e2191862c64355b10abaeead189759f) | fix | correctly resolve absolute setup file paths in Vitest | +| [4d564f66f](https://github.com/angular/angular-cli/commit/4d564f66f694011724d4933bf025f1c4fed55bca) | fix | disallow x-forwarded-prefix starting with a backslash | +| [ff1160e30](https://github.com/angular/angular-cli/commit/ff1160e3015eb321971e398cbedff80f4c053166) | fix | ensure unique values in redirect response Vary header | +| [998b8298e](https://github.com/angular/angular-cli/commit/998b8298e3106c95d77ced8090ab815365c462c7) | fix | support custom headers in redirect responses | - + -# 20.3.16 (2026-02-09) +# 21.2.3 (2026-03-18) ### @angular/cli -| Commit | Type | Description | -| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------ | -| [656888a25](https://github.com/angular/angular-cli/commit/656888a250af060c110ae87024b0e475b079c23d) | fix | update dependency @modelcontextprotocol/sdk to v1.26.0 | +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------ | +| [1505164bb](https://github.com/angular/angular-cli/commit/1505164bb2703254a2b25a76c7b3a1ff2fd76a85) | fix | use parsed package name for migrate-only updates | + +### @angular/build + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------------------ | +| [75fa94cad](https://github.com/angular/angular-cli/commit/75fa94cad26b0947e687ef94d50653cb7651d18c) | fix | alias createRequire banner import to avoid duplicate binding | +| [d009aa1ec](https://github.com/angular/angular-cli/commit/d009aa1ec7411b67b61b81003eb6181cde6f306f) | fix | only use external packages for polyfills when no local files are present | + +### @angular/ssr + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ----------------------------------------------------- | +| [f3e0e82c2](https://github.com/angular/angular-cli/commit/f3e0e82c2cecc3d9ebb5b8acc6e64d2d88c4efbd) | fix | disallow x-forwarded-prefix starting with a backslash | +| [b8bcd59b4](https://github.com/angular/angular-cli/commit/b8bcd59b40496369a57de0b0b39d85f323af30c7) | fix | ensure unique values in redirect response Vary header | +| [84385411d](https://github.com/angular/angular-cli/commit/84385411d4542d60d635aea9063c1fd751deb607) | fix | support custom headers in redirect responses | - + -# 21.2.0-next.1 (2026-02-05) +# 22.0.0-next.1 (2026-03-11) -### @angular/cli +## Breaking Changes -| Commit | Type | Description | -| --------------------------------------------------------------------------------------------------- | ---- | ---------------------------------------------------------- | -| [91b9d281f](https://github.com/angular/angular-cli/commit/91b9d281fc88a242aa6e5dd5495e275990d926ef) | feat | integrate file formatting into update migrations | -| [6f29a8c35](https://github.com/angular/angular-cli/commit/6f29a8c35abb8928d4e7ea01958192dd2a83491d) | fix | renamed files by their new path in the schematic workflow | -| [bc363af8b](https://github.com/angular/angular-cli/commit/bc363af8bc40f117a4e35ec9eb7eedf69f5b5b37) | perf | optimize package manager discovery with stat-based probing | +### @angular/build + +- The `@angular/build:dev-server (ng serve)` now assigns the highest priority to the `PORT` environment variable. This value will override any port configurations specified in `angular.json` or via the `--port` command-line flag. This includes the default port 4200. ### @schematics/angular -| Commit | Type | Description | -| --------------------------------------------------------------------------------------------------- | ---- | ---------------------------------------------------------------- | -| [5d1df50d8](https://github.com/angular/angular-cli/commit/5d1df50d8b84b453570ae5fd9ab6f949bbc11649) | fix | add actionable feedback to vitest-browser schematic | -| [51fc77828](https://github.com/angular/angular-cli/commit/51fc77828a33fdf35051b7e18d79ad43f90cba1d) | fix | warn when production configuration is missing for service worker | +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ----------------------------------------------------------------- | +| [b3d838dfd](https://github.com/angular/angular-cli/commit/b3d838dfdb2adc3bd035b495f7f9457d742d73a4) | fix | replace deprecated `ChangeDetectionStrategy.Default` with `Eager` | + +### @angular/cli + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------------------------------- | +| [598a690a0](https://github.com/angular/angular-cli/commit/598a690a0baea5cd54af5cea38e673c33605a627) | fix | conditionally quote package names when adding dependencies based on host requirements | +| [b5fb457e1](https://github.com/angular/angular-cli/commit/b5fb457e157fa78b61565eaba6b88e9f80b3b288) | fix | preserve exact version in ng add when requested | +| [93c3eb8fb](https://github.com/angular/angular-cli/commit/93c3eb8fb2a0d531f18779152b0a62e9b73dbb23) | fix | update zoneless migration tool to handle `ChangeDetectionStrategy.Eager` | +| [ad0fd5f41](https://github.com/angular/angular-cli/commit/ad0fd5f41fc6ee5d920fb3c725f09f17d86d2ab4) | perf | avoid redundant package version resolution in ng add | +| [a39a33128](https://github.com/angular/angular-cli/commit/a39a33128fb56e9c65ea89e06c4f127252d3b220) | perf | cache root manifest and resolve restricted package exports in ng add | ### @angular/build -| Commit | Type | Description | -| --------------------------------------------------------------------------------------------------- | ---- | -------------------------------------------------- | -| [ece30f235](https://github.com/angular/angular-cli/commit/ece30f2359c2dc794b0c9272447f623a121e88b0) | feat | add headless option to unit-test builder | -| [1f114a9e8](https://github.com/angular/angular-cli/commit/1f114a9e8b9bddd53e01016a2d7cb211a04eee48) | fix | bundle setup files in unit-test builder for Vitest | +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------------ | +| [fe720cab6](https://github.com/angular/angular-cli/commit/fe720cab64bbc8bcc2db583188e32ad938e63a23) | feat | add process.env.PORT support to the dev server | +| [af2c7e944](https://github.com/angular/angular-cli/commit/af2c7e9444fba81d3b1fd2d37dc4412f8305b5ed) | feat | rename `experimentalPlatform` to `platform` in application builder | +| [6324133c2](https://github.com/angular/angular-cli/commit/6324133c282f5e04ee6e9e46fc5f387cbbefad8e) | fix | normalize line endings for CSP hash generation | +| [839c725c2](https://github.com/angular/angular-cli/commit/839c725c234b2c1c3e44d52e3a1442ad1b538be9) | fix | pass process environment variables to prerender workers | +| [f30f8900e](https://github.com/angular/angular-cli/commit/f30f8900efb8ad9a835630f57e3667346926dc4d) | fix | resolve assets correctly during i18n prerendering | - + -# 21.1.3 (2026-02-05) +# 21.2.2 (2026-03-11) -### @schematics/angular +### @angular/cli -| Commit | Type | Description | -| --------------------------------------------------------------------------------------------------- | ---- | ---------------------------------------------------------------- | -| [a18196a10](https://github.com/angular/angular-cli/commit/a18196a1096e5eb69cf64102943781d34c4389bf) | fix | warn when production configuration is missing for service worker | +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------------------------------- | +| [8447d9132](https://github.com/angular/angular-cli/commit/8447d913280a8fa09a842d11193ce77527d0f7a6) | fix | conditionally quote package names when adding dependencies based on host requirements | +| [d2f209823](https://github.com/angular/angular-cli/commit/d2f209823a524a6effde4910017547675c7a6166) | fix | preserve exact version in ng add when requested | +| [28f4d684a](https://github.com/angular/angular-cli/commit/28f4d684ae12f0e0860bf0ace8851fdddad1c068) | perf | avoid redundant package version resolution in ng add | -### @angular-devkit/build-angular +### @angular/build -| Commit | Type | Description | -| --------------------------------------------------------------------------------------------------- | ---- | ----------------------------------- | -| [6d05d27ca](https://github.com/angular/angular-cli/commit/6d05d27ca097b16efb139bcee1c45b1b51dfe746) | fix | address Node.js deprecation DEP0190 | +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------- | +| [06010294f](https://github.com/angular/angular-cli/commit/06010294f8fe7a4843f802aafba51703ce810f61) | fix | allow any `CHROME_BIN` for vitest playwright provider | +| [8dec0c62b](https://github.com/angular/angular-cli/commit/8dec0c62ba40af339f4fd0fa34f20cbed545cd71) | fix | normalize line endings for CSP hash generation | +| [58688ebd7](https://github.com/angular/angular-cli/commit/58688ebd727fe295adcb538a33b525867caf82bd) | fix | pass process environment variables to prerender workers | +| [4ca61647f](https://github.com/angular/angular-cli/commit/4ca61647f208ec0ab9bc06f64583696b0619c259) | fix | resolve assets correctly during i18n prerendering | + + + + + +# 20.3.20 (2026-03-11) + +### @angular/build + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------- | +| [0fd6823af](https://github.com/angular/angular-cli/commit/0fd6823af0adec23f7c3f1d531f45f6432afe555) | fix | pass process environment variables to prerender workers | - + + +# 22.0.0-next.0 (2026-03-05) -# 21.2.0-next.0 (2026-01-28) +## Breaking Changes + +### + +- Node.js v20 is no longer supported. The minimum supported Node.js versions are now v22.22.0 and v24.13.1. +- The `@angular-devkit/architect-cli` package is no longer available. The `architect` CLI tool has been moved to the `@angular-devkit/architect` package. +- The experimental `@angular-devkit/build-angular:jest` and `@angular-devkit/build-angular:web-test-runner` builders have been removed. + +### @angular/ssr + +- The server no longer falls back to Client-Side Rendering (CSR) when a request fails host validation. Requests with unrecognized 'Host' headers will now return a 400 Bad Request status code. Users must ensure all valid hosts are correctly configured in the 'allowedHosts' option. ### @angular/cli +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | --------------------------------------------------- | +| [a5c7c0b5f](https://github.com/angular/angular-cli/commit/a5c7c0b5fda4ae0c00351ba34e5f39dab2c6baee) | fix | reflect new minimum supported Node version in ng.js | + +### + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | -------- | ----------------------------------------------------- | +| [d0e9e8163](https://github.com/angular/angular-cli/commit/d0e9e81639be33c453f1ef66c7c1c8ea4fe543c2) | build | update minimum supported Node.js versions | +| [1f21e89d9](https://github.com/angular/angular-cli/commit/1f21e89d99c191642627df6842402644a1bf26ee) | refactor | remove `@angular-devkit/architect-cli` package | +| [b4885b851](https://github.com/angular/angular-cli/commit/b4885b851226709ae4146070122806e14a3d5eb9) | refactor | remove experimental Jest and Web Test Runner builders | + +### @angular/build + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------ | +| [414320d02](https://github.com/angular/angular-cli/commit/414320d02a090b7b36720051569cba7563bf9ac6) | feat | support runtime Zone.js detection in Vitest unit test runner | +| [f190263a4](https://github.com/angular/angular-cli/commit/f190263a4010a4f7b9ae85806b5d70a16b57b9fa) | fix | allow any `CHROME_BIN` for vitest playwright provider | + +### @angular/ssr + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | -------- | ------------------------------------- | +| [27cd35561](https://github.com/angular/angular-cli/commit/27cd355619aad140dfc221c6bd161f4a981e0f3b) | refactor | remove CSR fallback for invalid hosts | + + + + + +# 21.2.1 (2026-03-05) + +### @angular/cli + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------ | +| [ae4c28d00](https://github.com/angular/angular-cli/commit/ae4c28d0083d948489f4ba38c571b7f955400226) | fix | correct dev dependency detection logic in `ng add` | +| [465073bc1](https://github.com/angular/angular-cli/commit/465073bc1b2b0e9fa594698651a9e0afe747a74a) | fix | disable npm update notifier in package manager host | +| [36270634f](https://github.com/angular/angular-cli/commit/36270634f6ff5ab15896a8c2b345659511a8a276) | fix | ensure group members are updated to targeted version | +| [d87dba6af](https://github.com/angular/angular-cli/commit/d87dba6af1116de0838d8683cd69fd31ed9811fd) | fix | ignore unknown files when formatting schematic changes | + +### @schematics/angular + | Commit | Type | Description | | --------------------------------------------------------------------------------------------------- | ---- | --------------------------------------------------------------- | -| [0dd04f289](https://github.com/angular/angular-cli/commit/0dd04f289e555a4a8af7bdadabe300da74701e3b) | feat | add markdown files to Prettier's formatting list | -| [fbae1b6ab](https://github.com/angular/angular-cli/commit/fbae1b6ab384186ae69e804c54815cea80e6a600) | feat | automatic formatting files modified by schematics | -| [98a24d040](https://github.com/angular/angular-cli/commit/98a24d0401f36f484dc9c4d8b0f5284ffa524f19) | feat | standardize MCP tools around workspace/project options | -| [d9cd609c5](https://github.com/angular/angular-cli/commit/d9cd609c5d13fe492b1f31973d9be518f8529387) | fix | correctly parse scoped packages in yarn classic list output | -| [5b05f2500](https://github.com/angular/angular-cli/commit/5b05f25005621828565585692b1d7a67c5f0fec8) | fix | enable shell option for Prettier execution on Windows platforms | +| [72d466aa0](https://github.com/angular/angular-cli/commit/72d466aa04d4d0cc4d654410bcb6dd44f0de3357) | fix | prevent adding test dependencies when minimal option is enabled | + +### @angular-devkit/build-angular + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------- | +| [0019d1c8e](https://github.com/angular/angular-cli/commit/0019d1c8e1494295a754063dbf936e1cd40d05bd) | fix | update copy-webpack-plugin to v14.0.0 | + +### @angular/build + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------------------------ | +| [6ad860863](https://github.com/angular/angular-cli/commit/6ad8608636ad48ae140cc7299a32e0358c761fcc) | fix | bundle polyfills to preserve execution order in dev server | +| [d17397375](https://github.com/angular/angular-cli/commit/d1739737564fbcc3e4c5a6c3369046cccf0f6120) | fix | conditionally allow `vi.mock` for non-relative imports | +| [0d49f86ed](https://github.com/angular/angular-cli/commit/0d49f86edf5592f0266c6d6689ab4d55b27b2d8d) | fix | resolve style include paths relative to `ng-package.json` in unit-test builder | +| [584f6a2d9](https://github.com/angular/angular-cli/commit/584f6a2d95ac4bdd9f20d918c6700ea79227cc92) | fix | treat empty browsers array as undefined in unit-test builder | +| [6699cdc9b](https://github.com/angular/angular-cli/commit/6699cdc9bfbabc3de2ff0cf03acfd6989dc5596c) | perf | fix memory leak in `ng serve` with i18n | + +### @angular/ssr + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ---------------------------------------------------- | +| [43a9dfa66](https://github.com/angular/angular-cli/commit/43a9dfa663c386217c9a654f0e80af74823fcf6a) | fix | improve header validation logic | +| [dee3717b3](https://github.com/angular/angular-cli/commit/dee3717b3faae9ea75d0a5e53c925f915949b8d0) | fix | introduce DI token to signal route discovery process | + + + + + +# 20.3.19 (2026-03-04) + +### @angular-devkit/build-angular + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------- | +| [0299b4d1a](https://github.com/angular/angular-cli/commit/0299b4d1aca13f11a06e2e92c593fe3e20906d23) | fix | update copy-webpack-plugin to v14.0.0 | + + + + + +# 20.3.18 (2026-02-26) + +### @angular-devkit/core + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ------------------------ | +| [39596d529](https://github.com/angular/angular-cli/commit/39596d529f831f72a2134bc3c9ac163867ff5702) | fix | update `ajv` to `8.18.0` | + +### @angular/build + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ----------------------- | +| [f668e2778](https://github.com/angular/angular-cli/commit/f668e2778c4c4dbecc8a1c6831c092f5512d1ec1) | fix | update rollup to 4.59.0 | + + + + + +# 19.2.22 (2026-02-26) + +### @angular-devkit/core + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ------------------------ | +| [0a01aecd9](https://github.com/angular/angular-cli/commit/0a01aecd92a5dfa1a254429481906a88be725c5e) | fix | update `ajv` to `8.18.0` | + +### @angular/build + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ----------------------- | +| [79f59412a](https://github.com/angular/angular-cli/commit/79f59412a17eeabd2ad5df1d614ed634354d1eee) | fix | update rollup to 4.59.0 | + + + + + +# 21.2.0 (2026-02-25) + +### @angular/cli + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------------------------------------------------------- | +| [0dd04f289](https://github.com/angular/angular-cli/commit/0dd04f289e555a4a8af7bdadabe300da74701e3b) | feat | add markdown files to Prettier's formatting list | +| [fbae1b6ab](https://github.com/angular/angular-cli/commit/fbae1b6ab384186ae69e804c54815cea80e6a600) | feat | automatic formatting files modified by schematics | +| [91b9d281f](https://github.com/angular/angular-cli/commit/91b9d281fc88a242aa6e5dd5495e275990d926ef) | feat | integrate file formatting into update migrations | +| [98a24d040](https://github.com/angular/angular-cli/commit/98a24d0401f36f484dc9c4d8b0f5284ffa524f19) | feat | standardize MCP tools around workspace/project options | +| [d9cd609c5](https://github.com/angular/angular-cli/commit/d9cd609c5d13fe492b1f31973d9be518f8529387) | fix | correctly parse scoped packages in yarn classic list output | +| [5b05f2500](https://github.com/angular/angular-cli/commit/5b05f25005621828565585692b1d7a67c5f0fec8) | fix | enable shell option for Prettier execution on Windows platforms | +| [25b8a157d](https://github.com/angular/angular-cli/commit/25b8a157df70fb0d2c4e6c5438a50ec12e3abc0c) | fix | quote complex range specifiers in package manager | +| [6f29a8c35](https://github.com/angular/angular-cli/commit/6f29a8c35abb8928d4e7ea01958192dd2a83491d) | fix | renamed files by their new path in the schematic workflow | +| [201a036f2](https://github.com/angular/angular-cli/commit/201a036f204a6940f70a36a507a4a53d144b5768) | fix | simplify Angular version compatibility checks and add special handling for local builds of new major versions | +| [cdd26bb66](https://github.com/angular/angular-cli/commit/cdd26bb66d8ab334f76323c2b5cae1aa8ce815f6) | fix | validate package manager version using `semver.valid` and throw an error if invalid | +| [bc363af8b](https://github.com/angular/angular-cli/commit/bc363af8bc40f117a4e35ec9eb7eedf69f5b5b37) | perf | optimize package manager discovery with stat-based probing | ### @schematics/angular @@ -114,18 +573,112 @@ | --------------------------------------------------------------------------------------------------- | ---- | ----------------------------------------------------------------------------------- | | [aa7381efd](https://github.com/angular/angular-cli/commit/aa7381efd213eff70a8004731a7e2b06a60cb8c2) | feat | add a '.prettierrc' file to generated workspaces and add Prettier as dev dependency | | [f80db6fb7](https://github.com/angular/angular-cli/commit/f80db6fb714aa326f6ed03a8a51090ca59ad0955) | feat | add ng-add support for Vitest browser providers | - -### @angular-devkit/build-angular - -| Commit | Type | Description | -| --------------------------------------------------------------------------------------------------- | ---- | ----------------------------------- | -| [b4a8d198c](https://github.com/angular/angular-cli/commit/b4a8d198c78aaf0cac7671f26162ce5818a5704c) | fix | address Node.js deprecation DEP0190 | +| [5d1df50d8](https://github.com/angular/angular-cli/commit/5d1df50d8b84b453570ae5fd9ab6f949bbc11649) | fix | add actionable feedback to vitest-browser schematic | ### @angular/build | Commit | Type | Description | | --------------------------------------------------------------------------------------------------- | ---- | -------------------------------------------------------- | +| [ece30f235](https://github.com/angular/angular-cli/commit/ece30f2359c2dc794b0c9272447f623a121e88b0) | feat | add headless option to unit-test builder | +| [cad7a7c0f](https://github.com/angular/angular-cli/commit/cad7a7c0ff3778f04820a99ad0aa9d74f1067fd5) | feat | run vitest browser with playwright with OS theme | | [0b4982720](https://github.com/angular/angular-cli/commit/0b4982720e111bf5029bcf97f7e0ce2658c42d43) | fix | adjust sourcemap sources when Vitest wrapper is bypassed | +| [1f114a9e8](https://github.com/angular/angular-cli/commit/1f114a9e8b9bddd53e01016a2d7cb211a04eee48) | fix | bundle setup files in unit-test builder for Vitest | +| [fd5cb28c8](https://github.com/angular/angular-cli/commit/fd5cb28c8082417288a896b89bde659bb0dc92e2) | fix | explicitly fail when using Vitest runtime mocking | +| [dc899e8a5](https://github.com/angular/angular-cli/commit/dc899e8a530979de8e9579f2281b681e6f737a62) | fix | normalize `allowedHosts` in dev-server | +| [26bbea12f](https://github.com/angular/angular-cli/commit/26bbea12f872c18e59de05d3c51cc11dd0a09cda) | fix | serve extensionless assets without transformation | + + + + + +# 21.1.5 (2026-02-23) + +### @angular/ssr + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | --------------------------------------------------- | +| [8695d6063](https://github.com/angular/angular-cli/commit/8695d6063e4c4123a37a3450c7db3a7c9d99050a) | fix | prevent open redirect via X-Forwarded-Prefix header | +| [e4d445ec6](https://github.com/angular/angular-cli/commit/e4d445ec674841dd1d374c83344c0a704ee3807c) | fix | validate host headers to prevent header-based SSRF | + + + + + +# 20.3.17 (2026-02-23) + +### @angular/ssr + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | --------------------------------------------------- | +| [8700e18d7](https://github.com/angular/angular-cli/commit/8700e18d7cf175d80fe6ce6205589767b7870c1c) | fix | prevent open redirect via X-Forwarded-Prefix header | +| [67582a946](https://github.com/angular/angular-cli/commit/67582a946808d2c021cbcfacbf203ef58a6fbded) | fix | validate host headers to prevent header-based SSRF | + + + + + +# 19.2.21 (2026-02-23) + +### @angular/ssr + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | --------------------------------------------------- | +| [288e22816](https://github.com/angular/angular-cli/commit/288e228161e3c0cceb392dd5fc24d07b129a3a64) | fix | prevent open redirect via X-Forwarded-Prefix header | +| [2a72d7483](https://github.com/angular/angular-cli/commit/2a72d7483d87ccdcfa0c5148f34a4c6ebb6c6cf9) | fix | validate host headers to prevent header-based SSRF | + + + + + +# 19.2.20 (2026-02-13) + +### @angular-devkit/build-angular + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ------------------------- | +| [0e5421ba7](https://github.com/angular/angular-cli/commit/0e5421ba78814cf11e4d4510e930eaacc6458662) | fix | update webpack to 5.105.0 | + + + + + +# 21.1.4 (2026-02-11) + +### @angular/build + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ----------------------------------------------------- | +| [7a9dd6b47](https://github.com/angular/angular-cli/commit/7a9dd6b47e2191862c64355b10abaeead189759f) | fix | correctly resolve absolute setup file paths in Vitest | + + + + + +# 20.3.16 (2026-02-09) + +### @angular/cli + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------ | +| [656888a25](https://github.com/angular/angular-cli/commit/656888a250af060c110ae87024b0e475b079c23d) | fix | update dependency @modelcontextprotocol/sdk to v1.26.0 | + + + + + +# 21.1.3 (2026-02-05) + +### @schematics/angular + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ---------------------------------------------------------------- | +| [a18196a10](https://github.com/angular/angular-cli/commit/a18196a1096e5eb69cf64102943781d34c4389bf) | fix | warn when production configuration is missing for service worker | + +### @angular-devkit/build-angular + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ----------------------------------- | +| [6d05d27ca](https://github.com/angular/angular-cli/commit/6d05d27ca097b16efb139bcee1c45b1b51dfe746) | fix | address Node.js deprecation DEP0190 | @@ -2401,7 +2954,6 @@ - Protractor is no longer supported. Protractor was marked end-of-life in August 2023 (see https://protractortest.org/). Projects still relying on Protractor should consider migrating to another E2E testing framework, several support solid migration paths from Protractor. - - https://angular.dev/tools/cli/end-to-end - https://blog.angular.dev/the-state-of-end-to-end-testing-with-angular-d175f751cb9c @@ -6036,7 +6588,6 @@ Alan Agius, Charles Lyding and Doug Parker ### @angular/cli - Several changes to the `ng analytics` command syntax. - - `ng analytics project ` has been replaced with `ng analytics ` - `ng analytics ` has been replaced with `ng analytics --global` @@ -6066,7 +6617,6 @@ Alan Agius, Charles Lyding and Doug Parker - `browser` and `karma` builders `script` and `styles` options input files extensions are now validated. Valid extensions for `scripts` are: - - `.js` - `.cjs` - `.mjs` @@ -6075,7 +6625,6 @@ Alan Agius, Charles Lyding and Doug Parker - `.mjsx` Valid extensions for `styles` are: - - `.css` - `.less` - `.sass` diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 06db9756c89d..8b57f53f5584 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -12,7 +12,7 @@ to follow: - [Coding Rules](#rules) - [Commit Message Guidelines](#commit) - [Signing the CLA](#cla) - - [Updating the Public API](#public-api) + - [Spam Policy](#spam-policy) ## Code of Conduct Help us keep Angular open and inclusive. Please read and follow our [Code of Conduct][coc]. @@ -217,7 +217,6 @@ The following is the list of supported scopes: * **@angular/pwa** * **@angular/ssr** * **@angular-devkit/architect** -* **@angular-devkit/architect-cli** * **@angular-devkit/build-angular** * **@angular-devkit/build-webpack** * **@angular-devkit/core** @@ -290,6 +289,9 @@ changes to be accepted, the CLA must be signed. It's a quick process, we promise * For corporations we'll need you to [print, sign and one of scan+email, fax or mail the form][corporate-cla]. +## Spam Policy + +See [Spam Policy](https://github.com/angular/angular/blob/main/contributing-docs/spam.md) for details. [coc]: https://github.com/angular/code-of-conduct/blob/main/CODE_OF_CONDUCT.md [commit-message-format]: https://docs.google.com/document/d/1QrDFcIiPjSLDn3EL15IJygNPiHORgU1_OOAqWjiDU5Y/edit# diff --git a/MODULE.bazel b/MODULE.bazel index e218349c3d69..034b10ad3e91 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -5,56 +5,57 @@ module( ) bazel_dep(name = "platforms", version = "1.0.0") -bazel_dep(name = "yq.bzl", version = "0.3.4") +bazel_dep(name = "yq.bzl", version = "0.3.5") bazel_dep(name = "rules_nodejs", version = "6.7.3") -bazel_dep(name = "aspect_rules_js", version = "2.9.2") -bazel_dep(name = "aspect_rules_ts", version = "3.8.4") +bazel_dep(name = "aspect_rules_js", version = "3.0.3") +bazel_dep(name = "aspect_rules_ts", version = "3.8.8") bazel_dep(name = "rules_pkg", version = "1.2.0") -bazel_dep(name = "rules_cc", version = "0.2.16") -bazel_dep(name = "aspect_bazel_lib", version = "2.22.5") +bazel_dep(name = "rules_cc", version = "0.2.17") +bazel_dep(name = "jq.bzl", version = "0.6.1") +bazel_dep(name = "bazel_lib", version = "3.2.2") bazel_dep(name = "bazel_skylib", version = "1.9.0") -bazel_dep(name = "aspect_rules_esbuild", version = "0.25.0") -bazel_dep(name = "aspect_rules_jasmine", version = "2.0.2") +bazel_dep(name = "aspect_rules_esbuild", version = "0.25.1") +bazel_dep(name = "aspect_rules_jasmine", version = "2.0.4") bazel_dep(name = "rules_angular") git_override( module_name = "rules_angular", - commit = "d746c4f75e42cffe389d1ab077f4639be2bc78d1", - remote = "https://github.com/devversion/rules_angular.git", + commit = "6c36180c2efebc6526ef0e6a55a6d738c7de6909", + remote = "https://github.com/angular/rules_angular.git", ) bazel_dep(name = "devinfra") git_override( module_name = "devinfra", - commit = "469708f109a90884ca403d150d33079a3a5a8769", + commit = "ba726e7bca0b08b125ccc6f93c233749e1213c17", remote = "https://github.com/angular/dev-infra.git", ) bazel_dep(name = "rules_sass") git_override( module_name = "rules_sass", - commit = "1184a80751a21af8348f308abc5b38a41f26850e", - remote = "https://github.com/devversion/rules_sass.git", + commit = "b5ddaa8e77509bcce35158ad20009636d3da4fbc", + remote = "https://github.com/angular/rules_sass.git", ) bazel_dep(name = "rules_browsers") git_override( module_name = "rules_browsers", - commit = "e08ae33c679d07b3b2fcc136658b787a81995bc5", - remote = "https://github.com/devversion/rules_browsers.git", + commit = "652b57c41218be318f33fc92032696f53d3aa0ef", + remote = "https://github.com/angular/rules_browsers.git", ) node = use_extension("@rules_nodejs//nodejs:extensions.bzl", "node") node.toolchain( node_repositories = { - "22.22.0-darwin_arm64": ("node-v22.22.0-darwin-arm64.tar.gz", "node-v22.22.0-darwin-arm64", "5ed4db0fcf1eaf84d91ad12462631d73bf4576c1377e192d222e48026a902640"), - "22.22.0-darwin_amd64": ("node-v22.22.0-darwin-x64.tar.gz", "node-v22.22.0-darwin-x64", "5ea50c9d6dea3dfa3abb66b2656f7a4e1c8cef23432b558d45fb538c7b5dedce"), - "22.22.0-linux_arm64": ("node-v22.22.0-linux-arm64.tar.xz", "node-v22.22.0-linux-arm64", "1bf1eb9ee63ffc4e5d324c0b9b62cf4a289f44332dfef9607cea1a0d9596ba6f"), - "22.22.0-linux_ppc64le": ("node-v22.22.0-linux-ppc64le.tar.xz", "node-v22.22.0-linux-ppc64le", "d83b9957431cc18e1fc143a4b99f89cde7b8a18f53ef392231b4336afd058865"), - "22.22.0-linux_s390x": ("node-v22.22.0-linux-s390x.tar.xz", "node-v22.22.0-linux-s390x", "5aa0e520689448c4233e8d73f284e8e0634fdcd32b479735698494be5641f3e4"), - "22.22.0-linux_amd64": ("node-v22.22.0-linux-x64.tar.xz", "node-v22.22.0-linux-x64", "9aa8e9d2298ab68c600bd6fb86a6c13bce11a4eca1ba9b39d79fa021755d7c37"), - "22.22.0-windows_amd64": ("node-v22.22.0-win-x64.zip", "node-v22.22.0-win-x64", "c97fa376d2becdc8863fcd3ca2dd9a83a9f3468ee7ccf7a6d076ec66a645c77a"), + "22.22.2-darwin_arm64": ("node-v22.22.2-darwin-arm64.tar.gz", "node-v22.22.2-darwin-arm64", "db4b275b83736df67533529a18cc55de2549a8329ace6c7bcc68f8d22d3c9000"), + "22.22.2-darwin_amd64": ("node-v22.22.2-darwin-x64.tar.gz", "node-v22.22.2-darwin-x64", "12a6abb9c2902cf48a21120da13f87fde1ed1b71a13330712949e8db818708ba"), + "22.22.2-linux_arm64": ("node-v22.22.2-linux-arm64.tar.xz", "node-v22.22.2-linux-arm64", "e9e1930fd321a470e29bb68f30318bf58e3ecb4acb4f1533fb19c58328a091fe"), + "22.22.2-linux_ppc64le": ("node-v22.22.2-linux-ppc64le.tar.xz", "node-v22.22.2-linux-ppc64le", "14045b5a5030d35ca0030fb7e870bd11a651eb9b57323ebc0021e8d78ac6bac9"), + "22.22.2-linux_s390x": ("node-v22.22.2-linux-s390x.tar.xz", "node-v22.22.2-linux-s390x", "9e4a07c291b8949289c6ea8ee61b1d14666a4810feae776a8d1eb1f57e03a2fb"), + "22.22.2-linux_amd64": ("node-v22.22.2-linux-x64.tar.xz", "node-v22.22.2-linux-x64", "88fd1ce767091fd8d4a99fdb2356e98c819f93f3b1f8663853a2dee9b438068a"), + "22.22.2-windows_amd64": ("node-v22.22.2-win-x64.zip", "node-v22.22.2-win-x64", "7c93e9d92bf68c07182b471aa187e35ee6cd08ef0f24ab060dfff605fcc1c57c"), }, - node_version = "22.22.0", + node_version = "22.22.2", ) use_repo( node, @@ -68,31 +69,37 @@ use_repo( node_dev = use_extension("@rules_nodejs//nodejs:extensions.bzl", "node", dev_dependency = True) -# Node.js 20 -node_dev.toolchain( - name = "node20", - node_version = "20.19.0", -) - # Node.js 22 node_dev.toolchain( name = "node22", - node_version = "22.12.0", + node_repositories = { + "22.22.0-darwin_arm64": ("node-v22.22.0-darwin-arm64.tar.gz", "node-v22.22.0-darwin-arm64", "5ed4db0fcf1eaf84d91ad12462631d73bf4576c1377e192d222e48026a902640"), + "22.22.0-darwin_amd64": ("node-v22.22.0-darwin-x64.tar.gz", "node-v22.22.0-darwin-x64", "5ea50c9d6dea3dfa3abb66b2656f7a4e1c8cef23432b558d45fb538c7b5dedce"), + "22.22.0-linux_arm64": ("node-v22.22.0-linux-arm64.tar.xz", "node-v22.22.0-linux-arm64", "1bf1eb9ee63ffc4e5d324c0b9b62cf4a289f44332dfef9607cea1a0d9596ba6f"), + "22.22.0-linux_ppc64le": ("node-v22.22.0-linux-ppc64le.tar.xz", "node-v22.22.0-linux-ppc64le", "d83b9957431cc18e1fc143a4b99f89cde7b8a18f53ef392231b4336afd058865"), + "22.22.0-linux_s390x": ("node-v22.22.0-linux-s390x.tar.xz", "node-v22.22.0-linux-s390x", "5aa0e520689448c4233e8d73f284e8e0634fdcd32b479735698494be5641f3e4"), + "22.22.0-linux_amd64": ("node-v22.22.0-linux-x64.tar.xz", "node-v22.22.0-linux-x64", "9aa8e9d2298ab68c600bd6fb86a6c13bce11a4eca1ba9b39d79fa021755d7c37"), + "22.22.0-windows_amd64": ("node-v22.22.0-win-x64.zip", "node-v22.22.0-win-x64", "c97fa376d2becdc8863fcd3ca2dd9a83a9f3468ee7ccf7a6d076ec66a645c77a"), + }, + node_version = "22.22.0", ) # Node.js 24 node_dev.toolchain( name = "node24", - node_version = "24.0.0", + node_repositories = { + "24.13.1-darwin_arm64": ("node-v24.13.1-darwin-arm64.tar.gz", "node-v24.13.1-darwin-arm64", "8c039d59f2fec6195e4281ad5b0d02b9a940897b4df7b849c6fb48be6787bba6"), + "24.13.1-darwin_amd64": ("node-v24.13.1-darwin-x64.tar.gz", "node-v24.13.1-darwin-x64", "527f0578d9812e7dfa225121bda0b1546a6a0e4b5f556295fc8299c272de5fbf"), + "24.13.1-linux_arm64": ("node-v24.13.1-linux-arm64.tar.xz", "node-v24.13.1-linux-arm64", "c827d3d301e2eed1a51f36d0116b71b9e3d9e3b728f081615270ea40faac34c1"), + "24.13.1-linux_ppc64le": ("node-v24.13.1-linux-ppc64le.tar.xz", "node-v24.13.1-linux-ppc64le", "fb712a08d317655dbf776c90f60ac2105109d802e33811df6c9ed33d12f801c6"), + "24.13.1-linux_s390x": ("node-v24.13.1-linux-s390x.tar.xz", "node-v24.13.1-linux-s390x", "8e2c0d9b5545c3db22623e8cb8d6f0c28fcd470f29d32dbeabf9432dda289de2"), + "24.13.1-linux_amd64": ("node-v24.13.1-linux-x64.tar.xz", "node-v24.13.1-linux-x64", "30215f90ea3cd04dfbc06e762c021393fa173a1d392974298bbc871a8e461089"), + "24.13.1-windows_amd64": ("node-v24.13.1-win-x64.zip", "node-v24.13.1-win-x64", "fba577c4bb87df04d54dd87bbdaa5a2272f1f99a2acbf9152e1a91b8b5f0b279"), + }, + node_version = "24.13.1", ) use_repo( node_dev, - "node20_darwin_amd64", - "node20_darwin_arm64", - "node20_linux_amd64", - "node20_linux_arm64", - "node20_toolchains", - "node20_windows_amd64", "node22_darwin_amd64", "node22_darwin_arm64", "node22_linux_amd64", @@ -110,8 +117,8 @@ use_repo( pnpm = use_extension("@aspect_rules_js//npm:extensions.bzl", "pnpm") pnpm.pnpm( name = "pnpm", - pnpm_version = "10.29.3", - pnpm_version_integrity = "sha512-SY4ftMylqgbB3PJhHm+vxQly/+cYmZjECekN50VmREKY/+Q+bNKs3Hdboap8xeCSqLcFTIEbqMV3D4RpPTPS3A==", + pnpm_version = "10.33.0", + pnpm_version_integrity = "sha512-EFaLtKavtYyes2MNqQzJUWQXq+vT+rvmc58K55VyjaFJHp21pUTHatjrdXD1xLs9bGN7LLQb/c20f6gjyGSTGQ==", ) use_repo(pnpm, "pnpm") @@ -132,7 +139,6 @@ npm.npm_translate_lock( "//packages/angular/pwa:package.json", "//packages/angular/ssr:package.json", "//packages/angular_devkit/architect:package.json", - "//packages/angular_devkit/architect_cli:package.json", "//packages/angular_devkit/build_angular:package.json", "//packages/angular_devkit/build_webpack:package.json", "//packages/angular_devkit/core:package.json", @@ -155,14 +161,22 @@ npm.npm_translate_lock( npmrc = "//:.npmrc", pnpm_lock = "//:pnpm-lock.yaml", ) + +# This is needed as by default `.md` files are excluded from the npm package. +# But @angular/core includes best-practices.md file. +# See: https://github.com/aspect-build/rules_js/blob/786a74a158dd36ed073188b0e506c423cd05501a/npm/private/exclude_package_contents_presets.bzl#L29 +npm.npm_exclude_package_contents( + package = "@angular/core", + presets = [], +) use_repo(npm, "npm") rules_ts_ext = use_extension("@aspect_rules_ts//ts:extensions.bzl", "ext") rules_ts_ext.deps( name = "angular_cli_npm_typescript", - # Obtained by: npm info typescript@5.9.3 dist.integrity - ts_integrity = "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - ts_version = "5.9.3", + # Obtained by: npm info typescript@6.0.2 dist.integrity + ts_integrity = "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==", + ts_version = "6.0.2", ) use_repo(rules_ts_ext, **{"npm_typescript": "angular_cli_npm_typescript"}) @@ -180,5 +194,4 @@ register_toolchains( "@devinfra//bazel/git-toolchain:git_macos_arm64_toolchain", "@devinfra//bazel/git-toolchain:git_windows_toolchain", "//tools/toolchains:dummy_cc_windows_no_exec_toolchain", - "//tools/toolchains:node24_windows_no_exec_toolchain", ) diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock index 8af79006afc6..00e91c977301 100644 --- a/MODULE.bazel.lock +++ b/MODULE.bazel.lock @@ -18,22 +18,15 @@ "https://bcr.bazel.build/modules/aspect_bazel_lib/2.22.5/source.json": "ac2c3213df8f985785f1d0aeb7f0f73d5324e6e67d593d9b9470fb74a25d4a9b", "https://bcr.bazel.build/modules/aspect_bazel_lib/2.7.7/MODULE.bazel": "491f8681205e31bb57892d67442ce448cda4f472a8e6b3dc062865e29a64f89c", "https://bcr.bazel.build/modules/aspect_bazel_lib/2.8.1/MODULE.bazel": "812d2dd42f65dca362152101fbec418029cc8fd34cbad1a2fde905383d705838", - "https://bcr.bazel.build/modules/aspect_bazel_lib/2.9.3/MODULE.bazel": "66baf724dbae7aff4787bf2245cc188d50cb08e07789769730151c0943587c14", - "https://bcr.bazel.build/modules/aspect_rules_esbuild/0.25.0/MODULE.bazel": "5fef5ec709c837312823f9bcf0f276661e2cb48ad52f17c4e01176bbf1e9bf58", - "https://bcr.bazel.build/modules/aspect_rules_esbuild/0.25.0/source.json": "5e42968c6d23ab8bd95c02634b16864d866334347827cb6a8425b86c11cc4363", - "https://bcr.bazel.build/modules/aspect_rules_jasmine/2.0.2/MODULE.bazel": "45f054400ff242c4433f6d7f20f6123a9a72739cb7a1f44247d738db1644f46c", - "https://bcr.bazel.build/modules/aspect_rules_jasmine/2.0.2/source.json": "3ed399a5654259a822448f9cdbf21f6c738f16ccd7f89249c7507e374cbdd1e3", + "https://bcr.bazel.build/modules/aspect_rules_esbuild/0.25.1/MODULE.bazel": "9b931b3e483bd8eedb6966bda6df07d801f70ccb4896231b4e5e711b5130f3aa", + "https://bcr.bazel.build/modules/aspect_rules_esbuild/0.25.1/source.json": "a0b72e23ed06113f3878cb635d586b4045ef37750983467af72fe0315c3a2fcd", + "https://bcr.bazel.build/modules/aspect_rules_jasmine/2.0.4/MODULE.bazel": "fbb819eb8b7e5d7f67fdd38f7cecb413e287594cd666ce192c72c8828527775a", + "https://bcr.bazel.build/modules/aspect_rules_jasmine/2.0.4/source.json": "81ffb708333cd98ec3c0b4cc004f4d5cf92a16914b5196a2892c45141bba7cff", "https://bcr.bazel.build/modules/aspect_rules_js/2.0.0/MODULE.bazel": "b45b507574aa60a92796e3e13c195cd5744b3b8aff516a9c0cb5ae6a048161c5", - "https://bcr.bazel.build/modules/aspect_rules_js/2.4.2/MODULE.bazel": "0d01db38b96d25df7ed952a5e96eac4b3802723d146961974bf020f6dd07591d", - "https://bcr.bazel.build/modules/aspect_rules_js/2.6.2/MODULE.bazel": "ed2a871f4ab8fbde0cab67c425745069d84ea64b64313fa1a2954017326511f5", - "https://bcr.bazel.build/modules/aspect_rules_js/2.9.2/MODULE.bazel": "93fd5b85e6e912fb0712cbab453c43271d4ea33a093f84fd587638fbc9f8c145", - "https://bcr.bazel.build/modules/aspect_rules_js/2.9.2/source.json": "4bff7c03ab387b60deb15649ba575688e62f2a71a7544cbc7a660b19ec473808", - "https://bcr.bazel.build/modules/aspect_rules_ts/3.6.3/MODULE.bazel": "d09db394970f076176ce7bab5b5fa7f0d560fd4f30b8432ea5e2c2570505b130", - "https://bcr.bazel.build/modules/aspect_rules_ts/3.7.0/MODULE.bazel": "5aace216caf88638950ef061245d23c36f57c8359e56e97f02a36f70bb09c50f", - "https://bcr.bazel.build/modules/aspect_rules_ts/3.8.3/MODULE.bazel": "a26c28ebcd0c0d50ab0708ac21fa48bd2dced3a4dad4c31a2fa48588b42ad762", - "https://bcr.bazel.build/modules/aspect_rules_ts/3.8.4/MODULE.bazel": "a50254ac3add6232d0f9f93103836f9afaf614315589a13abf74183982c4101d", - "https://bcr.bazel.build/modules/aspect_rules_ts/3.8.4/source.json": "f786e0763f3ea5de7ea6d4c4e38fccb48bf4d9c5eafaf95091c0e1590502510e", - "https://bcr.bazel.build/modules/aspect_tools_telemetry/0.2.3/MODULE.bazel": "20f53b145f40957a51077ae90b37b7ce83582a1daf9350349f0f86179e19dd0d", + "https://bcr.bazel.build/modules/aspect_rules_js/3.0.3/MODULE.bazel": "28a30e8fc33bf64a67835d64d124f6e05a7d59648dcb27b110fb3502f761e503", + "https://bcr.bazel.build/modules/aspect_rules_js/3.0.3/source.json": "bb8fff9a304452e1042af9522ad1d54d6f1d1fdf71c5127deadb6fd156654193", + "https://bcr.bazel.build/modules/aspect_rules_ts/3.8.8/MODULE.bazel": "b52b929a948438665809d49af610f58d1b14f63d6d21ab748f47b6050be4c1f6", + "https://bcr.bazel.build/modules/aspect_rules_ts/3.8.8/source.json": "5414530b761a45ab7ca6c49f0a2a9cf8dc0da772f5037cf05ca18aaa64bb1b19", "https://bcr.bazel.build/modules/aspect_tools_telemetry/0.2.6/MODULE.bazel": "cafb8781ad591bc57cc765dca5fefab08cf9f65af363d162b79d49205c7f8af7", "https://bcr.bazel.build/modules/aspect_tools_telemetry/0.2.8/MODULE.bazel": "aa975a83e72bcaac62ee61ab12b788ea324a1d05c4aab28aadb202f647881679", "https://bcr.bazel.build/modules/aspect_tools_telemetry/0.3.3/MODULE.bazel": "37c764292861c2f70314efa9846bb6dbb44fc0308903b3285da6528305450183", @@ -49,19 +42,20 @@ "https://bcr.bazel.build/modules/bazel_features/1.30.0/MODULE.bazel": "a14b62d05969a293b80257e72e597c2da7f717e1e69fa8b339703ed6731bec87", "https://bcr.bazel.build/modules/bazel_features/1.34.0/MODULE.bazel": "e8475ad7c8965542e0c7aac8af68eb48c4af904be3d614b6aa6274c092c2ea1e", "https://bcr.bazel.build/modules/bazel_features/1.39.0/MODULE.bazel": "28739425c1fc283c91931619749c832b555e60bcd1010b40d8441ce0a5cf726d", - "https://bcr.bazel.build/modules/bazel_features/1.39.0/source.json": "f63cbeb4c602098484d57001e5a07d31cb02bbccde9b5e2c9bf0b29d05283e93", "https://bcr.bazel.build/modules/bazel_features/1.4.1/MODULE.bazel": "e45b6bb2350aff3e442ae1111c555e27eac1d915e77775f6fdc4b351b758b5d7", + "https://bcr.bazel.build/modules/bazel_features/1.41.0/MODULE.bazel": "6e0f87fafed801273c371d41e22a15a6f8abf83fdd7f87d5e44ad317b94433d0", + "https://bcr.bazel.build/modules/bazel_features/1.41.0/source.json": "8fd525b31b0883c47e0593443cdd10219b94a7556b3195fc02d75c86c66cfe30", "https://bcr.bazel.build/modules/bazel_features/1.9.0/MODULE.bazel": "885151d58d90d8d9c811eb75e3288c11f850e1d6b481a8c9f766adee4712358b", "https://bcr.bazel.build/modules/bazel_features/1.9.1/MODULE.bazel": "8f679097876a9b609ad1f60249c49d68bfab783dd9be012faf9d82547b14815a", - "https://bcr.bazel.build/modules/bazel_lib/3.0.0-beta.1/MODULE.bazel": "407729e232f611c3270005b016b437005daa7b1505826798ea584169a476e878", + "https://bcr.bazel.build/modules/bazel_lib/3.0.0-rc.0/MODULE.bazel": "d6e00979a98ac14ada5e31c8794708b41434d461e7e7ca39b59b765e6d233b18", "https://bcr.bazel.build/modules/bazel_lib/3.0.0/MODULE.bazel": "22b70b80ac89ad3f3772526cd9feee2fa412c2b01933fea7ed13238a448d370d", - "https://bcr.bazel.build/modules/bazel_lib/3.0.0/source.json": "895f21909c6fba01d7c17914bb6c8e135982275a1b18cdaa4e62272217ef1751", + "https://bcr.bazel.build/modules/bazel_lib/3.2.2/MODULE.bazel": "e2c890c8a515d6bca9c66d47718aa9e44b458fde64ec7204b8030bf2d349058c", + "https://bcr.bazel.build/modules/bazel_lib/3.2.2/source.json": "9e84e115c20e14652c5c21401ae85ff4daa8702e265b5c0b3bf89353f17aa212", "https://bcr.bazel.build/modules/bazel_skylib/1.0.3/MODULE.bazel": "bcb0fd896384802d1ad283b4e4eb4d718eebd8cb820b0a2c3a347fb971afd9d8", "https://bcr.bazel.build/modules/bazel_skylib/1.1.1/MODULE.bazel": "1add3e7d93ff2e6998f9e118022c84d163917d912f5afafb3058e3d2f1545b5e", "https://bcr.bazel.build/modules/bazel_skylib/1.2.0/MODULE.bazel": "44fe84260e454ed94ad326352a698422dbe372b21a1ac9f3eab76eb531223686", "https://bcr.bazel.build/modules/bazel_skylib/1.2.1/MODULE.bazel": "f35baf9da0efe45fa3da1696ae906eea3d615ad41e2e3def4aeb4e8bc0ef9a7a", "https://bcr.bazel.build/modules/bazel_skylib/1.3.0/MODULE.bazel": "20228b92868bf5cfc41bda7afc8a8ba2a543201851de39d990ec957b513579c5", - "https://bcr.bazel.build/modules/bazel_skylib/1.4.0/MODULE.bazel": "2ab127ef8d56a739a99bb2ce00ec4c7d1ecc7977d4370c0ca6efd0d8f03d6d99", "https://bcr.bazel.build/modules/bazel_skylib/1.4.1/MODULE.bazel": "a0dcb779424be33100dcae821e9e27e4f2901d9dfd5333efe5ac6a8d7ab75e1d", "https://bcr.bazel.build/modules/bazel_skylib/1.4.2/MODULE.bazel": "3bd40978e7a1fac911d5989e6b09d8f64921865a45822d8b09e815eaa726a651", "https://bcr.bazel.build/modules/bazel_skylib/1.5.0/MODULE.bazel": "32880f5e2945ce6a03d1fbd588e9198c0a959bb42297b2cfaf1685b7bc32e138", @@ -75,14 +69,17 @@ "https://bcr.bazel.build/modules/buildozer/7.1.2/MODULE.bazel": "2e8dd40ede9c454042645fd8d8d0cd1527966aa5c919de86661e62953cd73d84", "https://bcr.bazel.build/modules/buildozer/7.1.2/source.json": "c9028a501d2db85793a6996205c8de120944f50a0d570438fcae0457a5f9d1f8", "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.1/MODULE.bazel": "cdf8cbe5ee750db04b78878c9633cc76e80dcf4416cbe982ac3a9222f80713c8", - "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.1/source.json": "fa7b512dfcb5eafd90ce3959cf42a2a6fe96144ebbb4b3b3928054895f2afac2", + "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.3/MODULE.bazel": "f1b7bb2dd53e8f2ef984b39485ec8a44e9076dda5c4b8efd2fb4c6a6e856a31d", + "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.3/source.json": "ebe931bfe362e4b41e59ee00a528db6074157ff2ced92eb9e970acab2e1089c9", "https://bcr.bazel.build/modules/google_benchmark/1.8.2/MODULE.bazel": "a70cf1bba851000ba93b58ae2f6d76490a9feb74192e57ab8e8ff13c34ec50cb", "https://bcr.bazel.build/modules/googletest/1.11.0/MODULE.bazel": "3a83f095183f66345ca86aa13c58b59f9f94a2f81999c093d4eeaa2d262d12f4", "https://bcr.bazel.build/modules/googletest/1.14.0.bcr.1/MODULE.bazel": "22c31a561553727960057361aa33bf20fb2e98584bc4fec007906e27053f80c6", "https://bcr.bazel.build/modules/googletest/1.14.0.bcr.1/source.json": "41e9e129f80d8c8bf103a7acc337b76e54fad1214ac0a7084bf24f4cd924b8b4", "https://bcr.bazel.build/modules/googletest/1.14.0/MODULE.bazel": "cfbcbf3e6eac06ef9d85900f64424708cc08687d1b527f0ef65aa7517af8118f", "https://bcr.bazel.build/modules/jq.bzl/0.1.0/MODULE.bazel": "2ce69b1af49952cd4121a9c3055faa679e748ce774c7f1fda9657f936cae902f", - "https://bcr.bazel.build/modules/jq.bzl/0.1.0/source.json": "746bf13cac0860f091df5e4911d0c593971cd8796b5ad4e809b2f8e133eee3d5", + "https://bcr.bazel.build/modules/jq.bzl/0.4.0/MODULE.bazel": "a7b39b37589f2b0dad53fd6c1ccaabbdb290330caa920d7ef3e6aad068cd4ab2", + "https://bcr.bazel.build/modules/jq.bzl/0.6.1/MODULE.bazel": "f30c46e0a08a9f7566a8bf60a43d48abea960cd7f57b315b01e2762f1537eb52", + "https://bcr.bazel.build/modules/jq.bzl/0.6.1/source.json": "9ca9e2f90baa6a5bb0a49626ed9528554ec83165adf47b39792673ecc7feda22", "https://bcr.bazel.build/modules/jsoncpp/1.9.5/MODULE.bazel": "31271aedc59e815656f5736f282bb7509a97c7ecb43e927ac1a37966e0578075", "https://bcr.bazel.build/modules/jsoncpp/1.9.5/source.json": "4108ee5085dd2885a341c7fab149429db457b3169b86eb081fa245eadf69169d", "https://bcr.bazel.build/modules/libpfm/4.11.0/MODULE.bazel": "45061ff025b301940f1e30d2c16bea596c25b176c8b6b3087e92615adbd52902", @@ -105,6 +102,7 @@ "https://bcr.bazel.build/modules/protobuf/29.0/MODULE.bazel": "319dc8bf4c679ff87e71b1ccfb5a6e90a6dbc4693501d471f48662ac46d04e4e", "https://bcr.bazel.build/modules/protobuf/29.0/source.json": "b857f93c796750eef95f0d61ee378f3420d00ee1dd38627b27193aa482f4f981", "https://bcr.bazel.build/modules/protobuf/3.19.0/MODULE.bazel": "6b5fbb433f760a99a22b18b6850ed5784ef0e9928a72668b66e4d7ccd47db9b0", + "https://bcr.bazel.build/modules/protobuf/3.19.6/MODULE.bazel": "9233edc5e1f2ee276a60de3eaa47ac4132302ef9643238f23128fea53ea12858", "https://bcr.bazel.build/modules/pybind11_bazel/2.11.1/MODULE.bazel": "88af1c246226d87e65be78ed49ecd1e6f5e98648558c14ce99176da041dc378e", "https://bcr.bazel.build/modules/pybind11_bazel/2.11.1/source.json": "be4789e951dd5301282729fe3d4938995dc4c1a81c2ff150afc9f1b0504c6022", "https://bcr.bazel.build/modules/re2/2023-09-01/MODULE.bazel": "cb3d511531b16cfc78a225a9e2136007a48cf8a677e4264baeab57fe78a80206", @@ -123,7 +121,9 @@ "https://bcr.bazel.build/modules/rules_cc/0.0.9/MODULE.bazel": "836e76439f354b89afe6a911a7adf59a6b2518fafb174483ad78a2a2fde7b1c5", "https://bcr.bazel.build/modules/rules_cc/0.1.1/MODULE.bazel": "2f0222a6f229f0bf44cd711dc13c858dad98c62d52bd51d8fc3a764a83125513", "https://bcr.bazel.build/modules/rules_cc/0.2.16/MODULE.bazel": "9242fa89f950c6ef7702801ab53922e99c69b02310c39fb6e62b2bd30df2a1d4", - "https://bcr.bazel.build/modules/rules_cc/0.2.16/source.json": "d03d5cde49376d87e14ec14b666c56075e5e3926930327fd5d0484a1ff2ac1cc", + "https://bcr.bazel.build/modules/rules_cc/0.2.17/MODULE.bazel": "1849602c86cb60da8613d2de887f9566a6d354a6df6d7009f9d04a14402f9a84", + "https://bcr.bazel.build/modules/rules_cc/0.2.17/source.json": "3832f45d145354049137c0090df04629d9c2b5493dc5c2bf46f1834040133a07", + "https://bcr.bazel.build/modules/rules_cc/0.2.4/MODULE.bazel": "1ff1223dfd24f3ecf8f028446d4a27608aa43c3f41e346d22838a4223980b8cc", "https://bcr.bazel.build/modules/rules_foreign_cc/0.9.0/MODULE.bazel": "c9e8c682bf75b0e7c704166d79b599f93b72cfca5ad7477df596947891feeef6", "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/MODULE.bazel": "40c97d1144356f52905566c55811f13b299453a14ac7769dfba2ac38192337a8", "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/source.json": "c8b1e2c717646f1702290959a3302a178fb639d987ab61d548105019f11e527e", @@ -157,10 +157,7 @@ "https://bcr.bazel.build/modules/rules_license/1.0.0/MODULE.bazel": "a7fda60eefdf3d8c827262ba499957e4df06f659330bbe6cdbdb975b768bb65c", "https://bcr.bazel.build/modules/rules_license/1.0.0/source.json": "a52c89e54cc311196e478f8382df91c15f7a2bfdf4c6cd0e2675cc2ff0b56efb", "https://bcr.bazel.build/modules/rules_nodejs/6.2.0/MODULE.bazel": "ec27907f55eb34705adb4e8257952162a2d4c3ed0f0b3b4c3c1aad1fac7be35e", - "https://bcr.bazel.build/modules/rules_nodejs/6.3.0/MODULE.bazel": "45345e4aba35dd6e4701c1eebf5a4e67af4ed708def9ebcdc6027585b34ee52d", - "https://bcr.bazel.build/modules/rules_nodejs/6.3.3/MODULE.bazel": "b66eadebd10f1f1b25f52f95ab5213a57e82c37c3f656fcd9a57ad04d2264ce7", "https://bcr.bazel.build/modules/rules_nodejs/6.5.0/MODULE.bazel": "546d0cf79f36f9f6e080816045f97234b071c205f4542e3351bd4424282a8810", - "https://bcr.bazel.build/modules/rules_nodejs/6.5.2/MODULE.bazel": "7f9ea68a0ce6d82905ce9f74e76ab8a8b4531ed4c747018c9d76424ad0b3370d", "https://bcr.bazel.build/modules/rules_nodejs/6.7.3/MODULE.bazel": "c22a48b2a0dbf05a9dc5f83837bbc24c226c1f6e618de3c3a610044c9f336056", "https://bcr.bazel.build/modules/rules_nodejs/6.7.3/source.json": "a3f966f4415a8a6545e560ee5449eac95cc633f96429d08e87c87775c72f5e09", "https://bcr.bazel.build/modules/rules_pkg/0.7.0/MODULE.bazel": "df99f03fc7934a4737122518bb87e667e62d780b610910f0447665a7e2be62dc", @@ -194,17 +191,18 @@ "https://bcr.bazel.build/modules/stardoc/0.7.1/MODULE.bazel": "3548faea4ee5dda5580f9af150e79d0f6aea934fc60c1cc50f4efdd9420759e7", "https://bcr.bazel.build/modules/stardoc/0.7.2/MODULE.bazel": "fc152419aa2ea0f51c29583fab1e8c99ddefd5b3778421845606ee628629e0e5", "https://bcr.bazel.build/modules/stardoc/0.7.2/source.json": "58b029e5e901d6802967754adf0a9056747e8176f017cfe3607c0851f4d42216", + "https://bcr.bazel.build/modules/tar.bzl/0.10.1/MODULE.bazel": "bf5fda5b5ccef8c3c4a5f4886144377386e0baa382972f257acb42dcf40ea908", + "https://bcr.bazel.build/modules/tar.bzl/0.10.1/source.json": "3f1beb35acf53c270a9de493cdc775a985551d7069cfcf24e136b42f683bbb10", "https://bcr.bazel.build/modules/tar.bzl/0.2.1/MODULE.bazel": "52d1c00a80a8cc67acbd01649e83d8dd6a9dc426a6c0b754a04fe8c219c76468", "https://bcr.bazel.build/modules/tar.bzl/0.5.1/MODULE.bazel": "7c2eb3dcfc53b0f3d6f9acdfd911ca803eaf92aadf54f8ca6e4c1f3aee288351", - "https://bcr.bazel.build/modules/tar.bzl/0.8.1/MODULE.bazel": "6ffe8907ed4c555bc94bd35a5a01411cc4470c6dace84f9cf487815409e077d1", - "https://bcr.bazel.build/modules/tar.bzl/0.8.1/source.json": "835f83b482facf6205ad8708cf2b2f6524d1d7b1075a90fe9bb540da761d6d2e", + "https://bcr.bazel.build/modules/tar.bzl/0.6.0/MODULE.bazel": "a3584b4edcfafcabd9b0ef9819808f05b372957bbdff41601429d5fd0aac2e7c", "https://bcr.bazel.build/modules/upb/0.0.0-20220923-a547704/MODULE.bazel": "7298990c00040a0e2f121f6c32544bab27d4452f80d9ce51349b1a28f3005c43", "https://bcr.bazel.build/modules/yq.bzl/0.1.1/MODULE.bazel": "9039681f9bcb8958ee2c87ffc74bdafba9f4369096a2b5634b88abc0eaefa072", - "https://bcr.bazel.build/modules/yq.bzl/0.2.0/MODULE.bazel": "6f3a675677db8885be4d607fde14cc51829715e3a879fb016eb9bf336786ce6d", "https://bcr.bazel.build/modules/yq.bzl/0.3.2/MODULE.bazel": "0384efa70e8033d842ea73aa4b7199fa099709e236a7264345c03937166670b6", - "https://bcr.bazel.build/modules/yq.bzl/0.3.4/MODULE.bazel": "d3a270662f5d766cd7229732d65a5a5bc485240c3007343dd279edfb60c9ae27", - "https://bcr.bazel.build/modules/yq.bzl/0.3.4/source.json": "786dafdc2843722da3416e4343ee1a05237227f068590779a6e8496a2064c0f9", + "https://bcr.bazel.build/modules/yq.bzl/0.3.5/MODULE.bazel": "130c603e54be717bdf84100210f06598a0d2b4b4e01888fb01b70f50f41767ec", + "https://bcr.bazel.build/modules/yq.bzl/0.3.5/source.json": "1ae7bdc03cb26aaa8bd2bceadf65e90d90f0b2d03008ba9a0564da2e21396c39", "https://bcr.bazel.build/modules/zlib/1.2.11/MODULE.bazel": "07b389abc85fdbca459b69e2ec656ae5622873af3f845e1c9d80fe179f3effa0", + "https://bcr.bazel.build/modules/zlib/1.2.12/MODULE.bazel": "3b1a8834ada2a883674be8cbd36ede1b6ec481477ada359cd2d3ddc562340b27", "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.5/MODULE.bazel": "eec517b5bbe5492629466e11dae908d043364302283de25581e3eb944326c4ca", "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.5/source.json": "22bc55c47af97246cfc093d0acf683a7869377de362b5d1c552c2c2e16b7a806", "https://bcr.bazel.build/modules/zlib/1.3.1/MODULE.bazel": "751c9940dcfe869f5f7274e1295422a34623555916eb98c174c1e945594bf198" @@ -213,8 +211,8 @@ "moduleExtensions": { "@@aspect_rules_esbuild+//esbuild:extensions.bzl%esbuild": { "general": { - "bzlTransitiveDigest": "c4i5gawrp4Au9UMb55EzQCePYwkrFqD9tFBN7GdHG5g=", - "usagesDigest": "ToTaCONCN/E05krnHXLM1kpV1zrHNxHrGpUip973II4=", + "bzlTransitiveDigest": "QxNkTCcD6yURsbqznKyC/WCjCyhHZbEipGXl2UQjjzY=", + "usagesDigest": "6We6zwGoawD9YXqMI0KPaxEKJTnamXBsuOekhFS2D40=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, "envVariables": {}, @@ -269,11 +267,11 @@ "npm__esbuild_0.19.9": { "repoRuleId": "@@aspect_rules_js+//npm/private:npm_import.bzl%npm_import_rule", "attributes": { + "key": "npm__esbuild_0.19.9", "package": "esbuild", "version": "0.19.9", "root_package": "", "link_workspace": "", - "link_packages": {}, "integrity": "sha512-U9CHtKSy+EpPsEBa+/A2gMs/h3ylBC0H0KSqIg7tpztHerLi6nrrcoUJAkNCEPumx8yJ+Byic4BVwHgRbN0TBg==", "url": "", "commit": "", @@ -288,20 +286,23 @@ "npm_auth_password": "", "lifecycle_hooks": [], "extra_build_content": "", + "generate_package_json_bzl": false, "generate_bzl_library_targets": false, "extract_full_archive": false, - "exclude_package_contents": [] + "exclude_package_contents": [], + "exclude_package_contents_presets": [] } }, "npm__esbuild_0.19.9__links": { - "repoRuleId": "@@aspect_rules_js+//npm/private:npm_import.bzl%npm_import_links", + "repoRuleId": "@@aspect_rules_js+//npm/private:npm_import.bzl%npm_import_links_rule", "attributes": { + "key": "npm__esbuild_0.19.9", "package": "esbuild", "version": "0.19.9", - "dev": false, "root_package": "", - "link_packages": {}, "deps": {}, + "deps_oss": {}, + "deps_cpus": {}, "transitive_closure": {}, "lifecycle_build_target": false, "lifecycle_hooks_env": [], @@ -314,31 +315,12 @@ "//visibility:public" ], "replace_package": "", - "exclude_package_contents": [] + "exclude_package_contents": [], + "exclude_package_contents_presets": [] } } }, "recordedRepoMappingEntries": [ - [ - "aspect_bazel_lib+", - "bazel_lib", - "bazel_lib+" - ], - [ - "aspect_bazel_lib+", - "bazel_skylib", - "bazel_skylib+" - ], - [ - "aspect_bazel_lib+", - "bazel_tools", - "bazel_tools" - ], - [ - "aspect_bazel_lib+", - "tar.bzl", - "tar.bzl+" - ], [ "aspect_rules_esbuild+", "aspect_rules_js", @@ -354,11 +336,6 @@ "bazel_skylib", "bazel_skylib+" ], - [ - "aspect_rules_js+", - "aspect_bazel_lib", - "aspect_bazel_lib+" - ], [ "aspect_rules_js+", "aspect_rules_js", @@ -371,162 +348,33 @@ ], [ "aspect_rules_js+", - "bazel_lib", - "bazel_lib+" - ], - [ - "aspect_rules_js+", - "bazel_skylib", - "bazel_skylib+" + "bazel_features", + "bazel_features+" ], [ "aspect_rules_js+", - "bazel_tools", - "bazel_tools" - ], - [ - "bazel_lib+", - "bazel_skylib", - "bazel_skylib+" - ], - [ - "bazel_lib+", - "bazel_tools", - "bazel_tools" - ], - [ - "tar.bzl+", - "bazel_lib", - "bazel_lib+" - ], - [ - "tar.bzl+", - "bazel_skylib", - "bazel_skylib+" - ], - [ - "tar.bzl+", - "tar.bzl", - "tar.bzl+" - ] - ] - } - }, - "@@aspect_rules_js+//npm:extensions.bzl%pnpm": { - "general": { - "bzlTransitiveDigest": "HC+l+mTivq1p/KbcVQ+iV5QwYR+oKESJh827FY68SH8=", - "usagesDigest": "PvqSdyUvIknVzZ66q+9FjDqiPWbKoaSj5J3EB+Z3ZAs=", - "recordedFileInputs": {}, - "recordedDirentsInputs": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "pnpm": { - "repoRuleId": "@@aspect_rules_js+//npm/private:npm_import.bzl%npm_import_rule", - "attributes": { - "package": "pnpm", - "version": "10.29.3", - "root_package": "", - "link_workspace": "", - "link_packages": {}, - "integrity": "sha512-SY4ftMylqgbB3PJhHm+vxQly/+cYmZjECekN50VmREKY/+Q+bNKs3Hdboap8xeCSqLcFTIEbqMV3D4RpPTPS3A==", - "url": "", - "commit": "", - "patch_args": [ - "-p0" - ], - "patches": [], - "custom_postinstall": "", - "npm_auth": "", - "npm_auth_basic": "", - "npm_auth_username": "", - "npm_auth_password": "", - "lifecycle_hooks": [], - "extra_build_content": "load(\"@aspect_rules_js//js:defs.bzl\", \"js_binary\")\njs_binary(name = \"pnpm\", data = glob([\"package/**\"]), entry_point = \"package/dist/pnpm.cjs\", visibility = [\"//visibility:public\"])", - "generate_bzl_library_targets": false, - "extract_full_archive": true, - "exclude_package_contents": [] - } - }, - "pnpm__links": { - "repoRuleId": "@@aspect_rules_js+//npm/private:npm_import.bzl%npm_import_links", - "attributes": { - "package": "pnpm", - "version": "10.29.3", - "dev": false, - "root_package": "", - "link_packages": {}, - "deps": {}, - "transitive_closure": {}, - "lifecycle_build_target": false, - "lifecycle_hooks_env": [], - "lifecycle_hooks_execution_requirements": [ - "no-sandbox" - ], - "lifecycle_hooks_use_default_shell_env": false, - "bins": {}, - "package_visibility": [ - "//visibility:public" - ], - "replace_package": "", - "exclude_package_contents": [] - } - } - }, - "recordedRepoMappingEntries": [ - [ - "aspect_bazel_lib+", "bazel_lib", "bazel_lib+" ], [ - "aspect_bazel_lib+", + "aspect_rules_js+", "bazel_skylib", "bazel_skylib+" ], [ - "aspect_bazel_lib+", + "aspect_rules_js+", "bazel_tools", "bazel_tools" ], - [ - "aspect_bazel_lib+", - "tar.bzl", - "tar.bzl+" - ], - [ - "aspect_rules_js+", - "aspect_bazel_lib", - "aspect_bazel_lib+" - ], - [ - "aspect_rules_js+", - "aspect_rules_js", - "aspect_rules_js+" - ], - [ - "aspect_rules_js+", - "aspect_tools_telemetry_report", - "aspect_tools_telemetry++telemetry+aspect_tools_telemetry_report" - ], - [ - "aspect_rules_js+", - "bazel_features", - "bazel_features+" - ], - [ - "aspect_rules_js+", - "bazel_lib", - "bazel_lib+" - ], [ "aspect_rules_js+", - "bazel_skylib", - "bazel_skylib+" + "protobuf", + "protobuf+" ], [ "aspect_rules_js+", - "bazel_tools", - "bazel_tools" + "tar.bzl", + "tar.bzl+" ], [ "bazel_features+", @@ -538,6 +386,11 @@ "bazel_features_version", "bazel_features++version_extension+bazel_features_version" ], + [ + "bazel_lib+", + "bazel_lib", + "bazel_lib+" + ], [ "bazel_lib+", "bazel_skylib", @@ -548,6 +401,11 @@ "bazel_tools", "bazel_tools" ], + [ + "protobuf+", + "proto_bazel_features", + "bazel_features+" + ], [ "tar.bzl+", "bazel_lib", @@ -568,19 +426,17 @@ }, "@@aspect_rules_ts+//ts:extensions.bzl%ext": { "general": { - "bzlTransitiveDigest": "QDTi1Wl/eEY4IgbXjRhegUQfHj+bB8ZEVyiSGLZc6qo=", - "usagesDigest": "aaqqxEFKCRGFkeAf0pKmXvZZTLGYIk3pQsDFG28ZbNg=", - "recordedFileInputs": { - "@@rules_browsers+//package.json": "84dc1ba9b1c667a25894e97218bd8f247d54f24bb694efb397a881be3c06a4c5" - }, + "bzlTransitiveDigest": "dhTbv9E6UfT1WJmmu3ORRPO6AKFJvgBjBxu+BO+u1RY=", + "usagesDigest": "M9vJ1ahjqDb8ONBLGfZdvp4Vq1o4Y6Xjfv/ZY7PlnYo=", + "recordedFileInputs": {}, "recordedDirentsInputs": {}, "envVariables": {}, "generatedRepoSpecs": { "angular_cli_npm_typescript": { "repoRuleId": "@@aspect_rules_ts+//ts/private:npm_repositories.bzl%http_archive_version", "attributes": { - "version": "5.9.3", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "version": "6.0.2", + "integrity": "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==", "urls": [ "https://registry.npmjs.org/typescript/-/typescript-{}.tgz" ] @@ -589,8 +445,8 @@ "rules_angular_npm_typescript": { "repoRuleId": "@@aspect_rules_ts+//ts/private:npm_repositories.bzl%http_archive_version", "attributes": { - "version": "5.9.2", - "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", + "version": "5.9.3", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "urls": [ "https://registry.npmjs.org/typescript/-/typescript-{}.tgz" ] @@ -609,9 +465,8 @@ "npm_rules_browsers_typescript": { "repoRuleId": "@@aspect_rules_ts+//ts/private:npm_repositories.bzl%http_archive_version", "attributes": { - "version": "", - "version_from": "@@rules_browsers+//:package.json", - "integrity": "", + "version": "5.9.3", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "urls": [ "https://registry.npmjs.org/typescript/-/typescript-{}.tgz" ] @@ -635,7 +490,7 @@ "@@aspect_tools_telemetry+//:extension.bzl%telemetry": { "general": { "bzlTransitiveDigest": "cl5A2O84vDL6Tt+Qga8FCj1DUDGqn+e7ly5rZ+4xvcc=", - "usagesDigest": "PRLGsERE1Dznyx/OIAl7BPo8mzMvOklnNnZ8zdCpPTE=", + "usagesDigest": "0S2z9G3E1NIz6vCXk9IbRcO5LIckEcYVMSzRj2sEML8=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, "envVariables": {}, @@ -644,10 +499,10 @@ "repoRuleId": "@@aspect_tools_telemetry+//:extension.bzl%tel_repository", "attributes": { "deps": { - "aspect_rules_js": "2.9.2", - "aspect_rules_ts": "3.8.4", - "aspect_rules_esbuild": "0.25.0", - "aspect_rules_jasmine": "2.0.2", + "aspect_rules_js": "3.0.3", + "aspect_rules_ts": "3.8.8", + "aspect_rules_esbuild": "0.25.1", + "aspect_rules_jasmine": "2.0.4", "aspect_tools_telemetry": "0.3.3" } } @@ -669,7 +524,7 @@ }, "@@pybind11_bazel+//:python_configure.bzl%extension": { "general": { - "bzlTransitiveDigest": "c9ZWWeXeu6bctL4/SsY2otFWyeFN0JJ20+ymGyJZtWk=", + "bzlTransitiveDigest": "D2/qWHU6yQFwRG7Bb+caqrYMha5avsASao2vERrxK24=", "usagesDigest": "fycyB39YnXIJkfWCIXLUKJMZzANcuLy9ZE73hRucjFk=", "recordedFileInputs": { "@@pybind11_bazel+//MODULE.bazel": "88af1c246226d87e65be78ed49ecd1e6f5e98648558c14ce99176da041dc378e" @@ -704,7 +559,7 @@ "@@rules_angular+//setup:extensions.bzl%rules_angular": { "general": { "bzlTransitiveDigest": "fkaH7HMicL3g7/NDaFzlq39kcLopMyQ3KdbDn+5CRzA=", - "usagesDigest": "ZinuLP7QHxaW5achD0Vz19qElMu4r2LvGvh96Z5zYlA=", + "usagesDigest": "it5nR/3UaQWj2eaaMj+EnoZuL2z/AeTuz7uOnqd+nxo=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, "envVariables": {}, @@ -720,7 +575,7 @@ "repoRuleId": "@@rules_angular+//setup:repositories.bzl%configurable_deps_repo", "attributes": { "angular_compiler_cli": "@@rules_angular+//:node_modules/@angular/compiler-cli", - "typescript": "@@rules_angular+//:node_modules/typescript-local" + "typescript": "@@rules_angular+//:node_modules/typescript" } }, "dev_infra_rules_angular_configurable_deps": { @@ -736,8 +591,8 @@ }, "@@rules_browsers+//browsers:extensions.bzl%browsers": { "general": { - "bzlTransitiveDigest": "agkaLQ8wE1r/5IX6pkERzFxI/z0M42Em+ICNO6TXsVo=", - "usagesDigest": "FS7q5WaIwg3KirS3njhuPFkTIBYvDaTInVGrlzu0XL8=", + "bzlTransitiveDigest": "Bm6fiKpWy96aLohOlLCP36ARVxRLZm/R+smhsb2HzmI=", + "usagesDigest": "FmXYJVoVJlnfUU8x8gObSvu4qWcco/9Faw61aC/wBF0=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, "envVariables": {}, @@ -745,9 +600,9 @@ "rules_browsers_chrome_linux": { "repoRuleId": "@@rules_browsers+//browsers/private:browser_repo.bzl%browser_repo", "attributes": { - "sha256": "0a2ff0fc9eb5958b7b420f20e3968f424be7423fef89739e71565a48aa073a57", + "sha256": "1ac33f89306327af43be159c03ca4a26486de0858f42fe52394acdef50364143", "urls": [ - "https://storage.googleapis.com/chrome-for-testing-public/145.0.7586.0/linux64/chrome-headless-shell-linux64.zip" + "https://storage.googleapis.com/chrome-for-testing-public/147.0.7687.0/linux64/chrome-headless-shell-linux64.zip" ], "named_files": { "CHROME-HEADLESS-SHELL": "chrome-headless-shell-linux64/chrome-headless-shell" @@ -763,9 +618,9 @@ "rules_browsers_chrome_mac": { "repoRuleId": "@@rules_browsers+//browsers/private:browser_repo.bzl%browser_repo", "attributes": { - "sha256": "e6076b1201d86f74c5eab982a239d5af83e66b1aa4d780bcb792698790e01d87", + "sha256": "169ff49c465cfda52931395e61861e146dfc5013e92c01ca792db5acea858d0b", "urls": [ - "https://storage.googleapis.com/chrome-for-testing-public/145.0.7586.0/mac-x64/chrome-headless-shell-mac-x64.zip" + "https://storage.googleapis.com/chrome-for-testing-public/147.0.7687.0/mac-x64/chrome-headless-shell-mac-x64.zip" ], "named_files": { "CHROME-HEADLESS-SHELL": "chrome-headless-shell-mac-x64/chrome-headless-shell" @@ -781,9 +636,9 @@ "rules_browsers_chrome_mac_arm": { "repoRuleId": "@@rules_browsers+//browsers/private:browser_repo.bzl%browser_repo", "attributes": { - "sha256": "b74dbcf5543d916b02d0a133e2e7c6a4de251f06733f72c2c15ea8c42213f63b", + "sha256": "aeaaaaa4d68193a21bed04c44ddeb1230232707b4ea1d845a92925787509cd8e", "urls": [ - "https://storage.googleapis.com/chrome-for-testing-public/145.0.7586.0/mac-arm64/chrome-headless-shell-mac-arm64.zip" + "https://storage.googleapis.com/chrome-for-testing-public/147.0.7687.0/mac-arm64/chrome-headless-shell-mac-arm64.zip" ], "named_files": { "CHROME-HEADLESS-SHELL": "chrome-headless-shell-mac-arm64/chrome-headless-shell" @@ -799,9 +654,9 @@ "rules_browsers_chrome_win64": { "repoRuleId": "@@rules_browsers+//browsers/private:browser_repo.bzl%browser_repo", "attributes": { - "sha256": "df1e612dc3b1615e182a1f11821052995913c39df37caa52699de21a68d030d2", + "sha256": "4d6d79bcbcb22084df6e3a3d3a2caff67d6c0fa488d63f0c7ec1526f9553db8c", "urls": [ - "https://storage.googleapis.com/chrome-for-testing-public/145.0.7586.0/win64/chrome-headless-shell-win64.zip" + "https://storage.googleapis.com/chrome-for-testing-public/147.0.7687.0/win64/chrome-headless-shell-win64.zip" ], "named_files": { "CHROME-HEADLESS-SHELL": "chrome-headless-shell-win64/chrome-headless-shell.exe" @@ -817,9 +672,9 @@ "rules_browsers_chromedriver_linux": { "repoRuleId": "@@rules_browsers+//browsers/private:browser_repo.bzl%browser_repo", "attributes": { - "sha256": "69c504306399d979a2766fea603c3fb9d3d87d46c75bddc9f2a049b4f636d57c", + "sha256": "0607ccf6810a07ae08cac6443beac8b23f88dd53c7f1e0299e22d65f7cd2d020", "urls": [ - "https://storage.googleapis.com/chrome-for-testing-public/145.0.7586.0/linux64/chromedriver-linux64.zip" + "https://storage.googleapis.com/chrome-for-testing-public/147.0.7687.0/linux64/chromedriver-linux64.zip" ], "named_files": { "CHROMEDRIVER": "chromedriver-linux64/chromedriver" @@ -833,9 +688,9 @@ "rules_browsers_chromedriver_mac": { "repoRuleId": "@@rules_browsers+//browsers/private:browser_repo.bzl%browser_repo", "attributes": { - "sha256": "5fc9d6f594fc5f2568a15145f25116dd8e9c9a60baa8da4bb21a17650fb00e7e", + "sha256": "0f512a9dd683ed4c41e609d8d02c07807497dbad3ab2f95f0d583486be7b8cff", "urls": [ - "https://storage.googleapis.com/chrome-for-testing-public/145.0.7586.0/mac-x64/chromedriver-mac-x64.zip" + "https://storage.googleapis.com/chrome-for-testing-public/147.0.7687.0/mac-x64/chromedriver-mac-x64.zip" ], "named_files": { "CHROMEDRIVER": "chromedriver-mac-x64/chromedriver" @@ -849,9 +704,9 @@ "rules_browsers_chromedriver_mac_arm": { "repoRuleId": "@@rules_browsers+//browsers/private:browser_repo.bzl%browser_repo", "attributes": { - "sha256": "14e92294c2c3639ca4e7d27e850588b619d698e2f8905cee368f07db2e1bf1e9", + "sha256": "7d6fc6d17de1733eb6739d1ea16d085c8df1568bcf9fa0d130c2784b27f38268", "urls": [ - "https://storage.googleapis.com/chrome-for-testing-public/145.0.7586.0/mac-arm64/chromedriver-mac-arm64.zip" + "https://storage.googleapis.com/chrome-for-testing-public/147.0.7687.0/mac-arm64/chromedriver-mac-arm64.zip" ], "named_files": { "CHROMEDRIVER": "chromedriver-mac-arm64/chromedriver" @@ -865,9 +720,9 @@ "rules_browsers_chromedriver_win64": { "repoRuleId": "@@rules_browsers+//browsers/private:browser_repo.bzl%browser_repo", "attributes": { - "sha256": "cf641d2e176db95bcc158cd90eafd347ad4928fa0458a5f3bfd56c6d983e70db", + "sha256": "f4e9fb7bbf692fde7979b24e8d737b3cef4baafbc7a370e5d0abc4a8450fd830", "urls": [ - "https://storage.googleapis.com/chrome-for-testing-public/145.0.7586.0/win64/chromedriver-win64.zip" + "https://storage.googleapis.com/chrome-for-testing-public/147.0.7687.0/win64/chromedriver-win64.zip" ], "named_files": { "CHROMEDRIVER": "chromedriver-win64/chromedriver.exe" @@ -881,9 +736,9 @@ "rules_browsers_firefox_linux": { "repoRuleId": "@@rules_browsers+//browsers/private:browser_repo.bzl%browser_repo", "attributes": { - "sha256": "8d56f479cc398a537a60a3fa20dca92d8a41925113d3a67f534881a4e4d7e344", + "sha256": "f055b9c0d7346a10d22edc7f10e08679af2ea495367381ab2be9cab3ec6add97", "urls": [ - "https://archive.mozilla.org/pub/firefox/releases/146.0/linux-x86_64/en-US/firefox-146.0.tar.xz" + "https://archive.mozilla.org/pub/firefox/releases/147.0/linux-x86_64/en-US/firefox-147.0.tar.xz" ], "named_files": { "FIREFOX": "firefox/firefox" @@ -897,9 +752,9 @@ "rules_browsers_firefox_mac": { "repoRuleId": "@@rules_browsers+//browsers/private:browser_repo.bzl%browser_repo", "attributes": { - "sha256": "4b1645313887972d466cd82166ea571485c2c40a167f84624e3f3ca739993cc9", + "sha256": "48485e2068bc726e2f30cf5855fc2da1fc75c1272bc243a5394f428ffae3ba35", "urls": [ - "https://archive.mozilla.org/pub/firefox/releases/146.0/mac/en-US/Firefox%20146.0.dmg" + "https://archive.mozilla.org/pub/firefox/releases/147.0/mac/en-US/Firefox%20147.0.dmg" ], "named_files": { "FIREFOX": "Firefox.app/Contents/MacOS/firefox" @@ -913,9 +768,9 @@ "rules_browsers_firefox_mac_arm": { "repoRuleId": "@@rules_browsers+//browsers/private:browser_repo.bzl%browser_repo", "attributes": { - "sha256": "4b1645313887972d466cd82166ea571485c2c40a167f84624e3f3ca739993cc9", + "sha256": "48485e2068bc726e2f30cf5855fc2da1fc75c1272bc243a5394f428ffae3ba35", "urls": [ - "https://archive.mozilla.org/pub/firefox/releases/146.0/mac/en-US/Firefox%20146.0.dmg" + "https://archive.mozilla.org/pub/firefox/releases/147.0/mac/en-US/Firefox%20147.0.dmg" ], "named_files": { "FIREFOX": "Firefox.app/Contents/MacOS/firefox" @@ -929,9 +784,9 @@ "rules_browsers_firefox_win64": { "repoRuleId": "@@rules_browsers+//browsers/private:browser_repo.bzl%browser_repo", "attributes": { - "sha256": "216870c89648f32450cfefb5cec417fcd66d480d5dc83f894bf99f5fd7f38dbb", + "sha256": "36ff9e150875aa48a0af9eec3eb67f66dddd8efac5c743265371a72ae3e796c4", "urls": [ - "https://archive.mozilla.org/pub/firefox/releases/146.0/win64/en-US/Firefox%20Setup%20146.0.exe" + "https://archive.mozilla.org/pub/firefox/releases/147.0/win64/en-US/Firefox%20Setup%20147.0.exe" ], "named_files": { "FIREFOX": "core/firefox.exe" @@ -948,7 +803,7 @@ }, "@@rules_fuzzing+//fuzzing/private:extensions.bzl%non_module_dependencies": { "general": { - "bzlTransitiveDigest": "WHRlQQnxW7e7XMRBhq7SARkDarLDOAbg6iLaJpk5QYM=", + "bzlTransitiveDigest": "4LouzhF/yT117s7peGnNs9ROomiJXC6Zl5R0oI21jho=", "usagesDigest": "wy6ISK6UOcBEjj/mvJ/S3WeXoO67X+1llb9yPyFtPgc=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, @@ -1031,7 +886,7 @@ }, "@@rules_kotlin+//src/main/starlark/core/repositories:bzlmod_setup.bzl%rules_kotlin_extensions": { "general": { - "bzlTransitiveDigest": "rL/34P1aFDq2GqVC2zCFgQ8nTuOC6ziogocpvG50Qz8=", + "bzlTransitiveDigest": "nvW/NrBXlAmiQw99EMGKkLaD2KbNp2mQDlxdfpr+0Ls=", "usagesDigest": "QI2z8ZUR+mqtbwsf2fLqYdJAkPOHdOV+tF2yVAUgRzw=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, @@ -1096,7 +951,7 @@ "@@rules_nodejs+//nodejs:extensions.bzl%node": { "general": { "bzlTransitiveDigest": "4pUxCNc22K4I+6+4Nxu52Hur12tFRfa1JMsN5mdDv60=", - "usagesDigest": "6UAmdIABVpqhlkQ3A3NGscf00ds9dFEt+lei3DibyqM=", + "usagesDigest": "Y6U29CqmYKc6K0sgS/ygHdxb40MzJPS7jcDCXXExPZw=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, "envVariables": {}, @@ -1106,46 +961,46 @@ "attributes": { "node_download_auth": {}, "node_repositories": { - "22.22.0-darwin_arm64": [ - "node-v22.22.0-darwin-arm64.tar.gz", - "node-v22.22.0-darwin-arm64", - "5ed4db0fcf1eaf84d91ad12462631d73bf4576c1377e192d222e48026a902640" + "22.22.2-darwin_arm64": [ + "node-v22.22.2-darwin-arm64.tar.gz", + "node-v22.22.2-darwin-arm64", + "db4b275b83736df67533529a18cc55de2549a8329ace6c7bcc68f8d22d3c9000" ], - "22.22.0-darwin_amd64": [ - "node-v22.22.0-darwin-x64.tar.gz", - "node-v22.22.0-darwin-x64", - "5ea50c9d6dea3dfa3abb66b2656f7a4e1c8cef23432b558d45fb538c7b5dedce" + "22.22.2-darwin_amd64": [ + "node-v22.22.2-darwin-x64.tar.gz", + "node-v22.22.2-darwin-x64", + "12a6abb9c2902cf48a21120da13f87fde1ed1b71a13330712949e8db818708ba" ], - "22.22.0-linux_arm64": [ - "node-v22.22.0-linux-arm64.tar.xz", - "node-v22.22.0-linux-arm64", - "1bf1eb9ee63ffc4e5d324c0b9b62cf4a289f44332dfef9607cea1a0d9596ba6f" + "22.22.2-linux_arm64": [ + "node-v22.22.2-linux-arm64.tar.xz", + "node-v22.22.2-linux-arm64", + "e9e1930fd321a470e29bb68f30318bf58e3ecb4acb4f1533fb19c58328a091fe" ], - "22.22.0-linux_ppc64le": [ - "node-v22.22.0-linux-ppc64le.tar.xz", - "node-v22.22.0-linux-ppc64le", - "d83b9957431cc18e1fc143a4b99f89cde7b8a18f53ef392231b4336afd058865" + "22.22.2-linux_ppc64le": [ + "node-v22.22.2-linux-ppc64le.tar.xz", + "node-v22.22.2-linux-ppc64le", + "14045b5a5030d35ca0030fb7e870bd11a651eb9b57323ebc0021e8d78ac6bac9" ], - "22.22.0-linux_s390x": [ - "node-v22.22.0-linux-s390x.tar.xz", - "node-v22.22.0-linux-s390x", - "5aa0e520689448c4233e8d73f284e8e0634fdcd32b479735698494be5641f3e4" + "22.22.2-linux_s390x": [ + "node-v22.22.2-linux-s390x.tar.xz", + "node-v22.22.2-linux-s390x", + "9e4a07c291b8949289c6ea8ee61b1d14666a4810feae776a8d1eb1f57e03a2fb" ], - "22.22.0-linux_amd64": [ - "node-v22.22.0-linux-x64.tar.xz", - "node-v22.22.0-linux-x64", - "9aa8e9d2298ab68c600bd6fb86a6c13bce11a4eca1ba9b39d79fa021755d7c37" + "22.22.2-linux_amd64": [ + "node-v22.22.2-linux-x64.tar.xz", + "node-v22.22.2-linux-x64", + "88fd1ce767091fd8d4a99fdb2356e98c819f93f3b1f8663853a2dee9b438068a" ], - "22.22.0-windows_amd64": [ - "node-v22.22.0-win-x64.zip", - "node-v22.22.0-win-x64", - "c97fa376d2becdc8863fcd3ca2dd9a83a9f3468ee7ccf7a6d076ec66a645c77a" + "22.22.2-windows_amd64": [ + "node-v22.22.2-win-x64.zip", + "node-v22.22.2-win-x64", + "7c93e9d92bf68c07182b471aa187e35ee6cd08ef0f24ab060dfff605fcc1c57c" ] }, "node_urls": [ "https://nodejs.org/dist/v{version}/{filename}" ], - "node_version": "22.22.0", + "node_version": "22.22.2", "include_headers": false, "platform": "linux_amd64" } @@ -1155,46 +1010,46 @@ "attributes": { "node_download_auth": {}, "node_repositories": { - "22.22.0-darwin_arm64": [ - "node-v22.22.0-darwin-arm64.tar.gz", - "node-v22.22.0-darwin-arm64", - "5ed4db0fcf1eaf84d91ad12462631d73bf4576c1377e192d222e48026a902640" + "22.22.2-darwin_arm64": [ + "node-v22.22.2-darwin-arm64.tar.gz", + "node-v22.22.2-darwin-arm64", + "db4b275b83736df67533529a18cc55de2549a8329ace6c7bcc68f8d22d3c9000" ], - "22.22.0-darwin_amd64": [ - "node-v22.22.0-darwin-x64.tar.gz", - "node-v22.22.0-darwin-x64", - "5ea50c9d6dea3dfa3abb66b2656f7a4e1c8cef23432b558d45fb538c7b5dedce" + "22.22.2-darwin_amd64": [ + "node-v22.22.2-darwin-x64.tar.gz", + "node-v22.22.2-darwin-x64", + "12a6abb9c2902cf48a21120da13f87fde1ed1b71a13330712949e8db818708ba" ], - "22.22.0-linux_arm64": [ - "node-v22.22.0-linux-arm64.tar.xz", - "node-v22.22.0-linux-arm64", - "1bf1eb9ee63ffc4e5d324c0b9b62cf4a289f44332dfef9607cea1a0d9596ba6f" + "22.22.2-linux_arm64": [ + "node-v22.22.2-linux-arm64.tar.xz", + "node-v22.22.2-linux-arm64", + "e9e1930fd321a470e29bb68f30318bf58e3ecb4acb4f1533fb19c58328a091fe" ], - "22.22.0-linux_ppc64le": [ - "node-v22.22.0-linux-ppc64le.tar.xz", - "node-v22.22.0-linux-ppc64le", - "d83b9957431cc18e1fc143a4b99f89cde7b8a18f53ef392231b4336afd058865" + "22.22.2-linux_ppc64le": [ + "node-v22.22.2-linux-ppc64le.tar.xz", + "node-v22.22.2-linux-ppc64le", + "14045b5a5030d35ca0030fb7e870bd11a651eb9b57323ebc0021e8d78ac6bac9" ], - "22.22.0-linux_s390x": [ - "node-v22.22.0-linux-s390x.tar.xz", - "node-v22.22.0-linux-s390x", - "5aa0e520689448c4233e8d73f284e8e0634fdcd32b479735698494be5641f3e4" + "22.22.2-linux_s390x": [ + "node-v22.22.2-linux-s390x.tar.xz", + "node-v22.22.2-linux-s390x", + "9e4a07c291b8949289c6ea8ee61b1d14666a4810feae776a8d1eb1f57e03a2fb" ], - "22.22.0-linux_amd64": [ - "node-v22.22.0-linux-x64.tar.xz", - "node-v22.22.0-linux-x64", - "9aa8e9d2298ab68c600bd6fb86a6c13bce11a4eca1ba9b39d79fa021755d7c37" + "22.22.2-linux_amd64": [ + "node-v22.22.2-linux-x64.tar.xz", + "node-v22.22.2-linux-x64", + "88fd1ce767091fd8d4a99fdb2356e98c819f93f3b1f8663853a2dee9b438068a" ], - "22.22.0-windows_amd64": [ - "node-v22.22.0-win-x64.zip", - "node-v22.22.0-win-x64", - "c97fa376d2becdc8863fcd3ca2dd9a83a9f3468ee7ccf7a6d076ec66a645c77a" + "22.22.2-windows_amd64": [ + "node-v22.22.2-win-x64.zip", + "node-v22.22.2-win-x64", + "7c93e9d92bf68c07182b471aa187e35ee6cd08ef0f24ab060dfff605fcc1c57c" ] }, "node_urls": [ "https://nodejs.org/dist/v{version}/{filename}" ], - "node_version": "22.22.0", + "node_version": "22.22.2", "include_headers": false, "platform": "linux_arm64" } @@ -1204,46 +1059,46 @@ "attributes": { "node_download_auth": {}, "node_repositories": { - "22.22.0-darwin_arm64": [ - "node-v22.22.0-darwin-arm64.tar.gz", - "node-v22.22.0-darwin-arm64", - "5ed4db0fcf1eaf84d91ad12462631d73bf4576c1377e192d222e48026a902640" + "22.22.2-darwin_arm64": [ + "node-v22.22.2-darwin-arm64.tar.gz", + "node-v22.22.2-darwin-arm64", + "db4b275b83736df67533529a18cc55de2549a8329ace6c7bcc68f8d22d3c9000" ], - "22.22.0-darwin_amd64": [ - "node-v22.22.0-darwin-x64.tar.gz", - "node-v22.22.0-darwin-x64", - "5ea50c9d6dea3dfa3abb66b2656f7a4e1c8cef23432b558d45fb538c7b5dedce" + "22.22.2-darwin_amd64": [ + "node-v22.22.2-darwin-x64.tar.gz", + "node-v22.22.2-darwin-x64", + "12a6abb9c2902cf48a21120da13f87fde1ed1b71a13330712949e8db818708ba" ], - "22.22.0-linux_arm64": [ - "node-v22.22.0-linux-arm64.tar.xz", - "node-v22.22.0-linux-arm64", - "1bf1eb9ee63ffc4e5d324c0b9b62cf4a289f44332dfef9607cea1a0d9596ba6f" + "22.22.2-linux_arm64": [ + "node-v22.22.2-linux-arm64.tar.xz", + "node-v22.22.2-linux-arm64", + "e9e1930fd321a470e29bb68f30318bf58e3ecb4acb4f1533fb19c58328a091fe" ], - "22.22.0-linux_ppc64le": [ - "node-v22.22.0-linux-ppc64le.tar.xz", - "node-v22.22.0-linux-ppc64le", - "d83b9957431cc18e1fc143a4b99f89cde7b8a18f53ef392231b4336afd058865" + "22.22.2-linux_ppc64le": [ + "node-v22.22.2-linux-ppc64le.tar.xz", + "node-v22.22.2-linux-ppc64le", + "14045b5a5030d35ca0030fb7e870bd11a651eb9b57323ebc0021e8d78ac6bac9" ], - "22.22.0-linux_s390x": [ - "node-v22.22.0-linux-s390x.tar.xz", - "node-v22.22.0-linux-s390x", - "5aa0e520689448c4233e8d73f284e8e0634fdcd32b479735698494be5641f3e4" + "22.22.2-linux_s390x": [ + "node-v22.22.2-linux-s390x.tar.xz", + "node-v22.22.2-linux-s390x", + "9e4a07c291b8949289c6ea8ee61b1d14666a4810feae776a8d1eb1f57e03a2fb" ], - "22.22.0-linux_amd64": [ - "node-v22.22.0-linux-x64.tar.xz", - "node-v22.22.0-linux-x64", - "9aa8e9d2298ab68c600bd6fb86a6c13bce11a4eca1ba9b39d79fa021755d7c37" + "22.22.2-linux_amd64": [ + "node-v22.22.2-linux-x64.tar.xz", + "node-v22.22.2-linux-x64", + "88fd1ce767091fd8d4a99fdb2356e98c819f93f3b1f8663853a2dee9b438068a" ], - "22.22.0-windows_amd64": [ - "node-v22.22.0-win-x64.zip", - "node-v22.22.0-win-x64", - "c97fa376d2becdc8863fcd3ca2dd9a83a9f3468ee7ccf7a6d076ec66a645c77a" + "22.22.2-windows_amd64": [ + "node-v22.22.2-win-x64.zip", + "node-v22.22.2-win-x64", + "7c93e9d92bf68c07182b471aa187e35ee6cd08ef0f24ab060dfff605fcc1c57c" ] }, "node_urls": [ "https://nodejs.org/dist/v{version}/{filename}" ], - "node_version": "22.22.0", + "node_version": "22.22.2", "include_headers": false, "platform": "linux_s390x" } @@ -1253,20 +1108,283 @@ "attributes": { "node_download_auth": {}, "node_repositories": { - "22.22.0-darwin_arm64": [ - "node-v22.22.0-darwin-arm64.tar.gz", - "node-v22.22.0-darwin-arm64", - "5ed4db0fcf1eaf84d91ad12462631d73bf4576c1377e192d222e48026a902640" + "22.22.2-darwin_arm64": [ + "node-v22.22.2-darwin-arm64.tar.gz", + "node-v22.22.2-darwin-arm64", + "db4b275b83736df67533529a18cc55de2549a8329ace6c7bcc68f8d22d3c9000" ], - "22.22.0-darwin_amd64": [ - "node-v22.22.0-darwin-x64.tar.gz", - "node-v22.22.0-darwin-x64", - "5ea50c9d6dea3dfa3abb66b2656f7a4e1c8cef23432b558d45fb538c7b5dedce" + "22.22.2-darwin_amd64": [ + "node-v22.22.2-darwin-x64.tar.gz", + "node-v22.22.2-darwin-x64", + "12a6abb9c2902cf48a21120da13f87fde1ed1b71a13330712949e8db818708ba" ], - "22.22.0-linux_arm64": [ - "node-v22.22.0-linux-arm64.tar.xz", - "node-v22.22.0-linux-arm64", - "1bf1eb9ee63ffc4e5d324c0b9b62cf4a289f44332dfef9607cea1a0d9596ba6f" + "22.22.2-linux_arm64": [ + "node-v22.22.2-linux-arm64.tar.xz", + "node-v22.22.2-linux-arm64", + "e9e1930fd321a470e29bb68f30318bf58e3ecb4acb4f1533fb19c58328a091fe" + ], + "22.22.2-linux_ppc64le": [ + "node-v22.22.2-linux-ppc64le.tar.xz", + "node-v22.22.2-linux-ppc64le", + "14045b5a5030d35ca0030fb7e870bd11a651eb9b57323ebc0021e8d78ac6bac9" + ], + "22.22.2-linux_s390x": [ + "node-v22.22.2-linux-s390x.tar.xz", + "node-v22.22.2-linux-s390x", + "9e4a07c291b8949289c6ea8ee61b1d14666a4810feae776a8d1eb1f57e03a2fb" + ], + "22.22.2-linux_amd64": [ + "node-v22.22.2-linux-x64.tar.xz", + "node-v22.22.2-linux-x64", + "88fd1ce767091fd8d4a99fdb2356e98c819f93f3b1f8663853a2dee9b438068a" + ], + "22.22.2-windows_amd64": [ + "node-v22.22.2-win-x64.zip", + "node-v22.22.2-win-x64", + "7c93e9d92bf68c07182b471aa187e35ee6cd08ef0f24ab060dfff605fcc1c57c" + ] + }, + "node_urls": [ + "https://nodejs.org/dist/v{version}/{filename}" + ], + "node_version": "22.22.2", + "include_headers": false, + "platform": "linux_ppc64le" + } + }, + "nodejs_darwin_amd64": { + "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", + "attributes": { + "node_download_auth": {}, + "node_repositories": { + "22.22.2-darwin_arm64": [ + "node-v22.22.2-darwin-arm64.tar.gz", + "node-v22.22.2-darwin-arm64", + "db4b275b83736df67533529a18cc55de2549a8329ace6c7bcc68f8d22d3c9000" + ], + "22.22.2-darwin_amd64": [ + "node-v22.22.2-darwin-x64.tar.gz", + "node-v22.22.2-darwin-x64", + "12a6abb9c2902cf48a21120da13f87fde1ed1b71a13330712949e8db818708ba" + ], + "22.22.2-linux_arm64": [ + "node-v22.22.2-linux-arm64.tar.xz", + "node-v22.22.2-linux-arm64", + "e9e1930fd321a470e29bb68f30318bf58e3ecb4acb4f1533fb19c58328a091fe" + ], + "22.22.2-linux_ppc64le": [ + "node-v22.22.2-linux-ppc64le.tar.xz", + "node-v22.22.2-linux-ppc64le", + "14045b5a5030d35ca0030fb7e870bd11a651eb9b57323ebc0021e8d78ac6bac9" + ], + "22.22.2-linux_s390x": [ + "node-v22.22.2-linux-s390x.tar.xz", + "node-v22.22.2-linux-s390x", + "9e4a07c291b8949289c6ea8ee61b1d14666a4810feae776a8d1eb1f57e03a2fb" + ], + "22.22.2-linux_amd64": [ + "node-v22.22.2-linux-x64.tar.xz", + "node-v22.22.2-linux-x64", + "88fd1ce767091fd8d4a99fdb2356e98c819f93f3b1f8663853a2dee9b438068a" + ], + "22.22.2-windows_amd64": [ + "node-v22.22.2-win-x64.zip", + "node-v22.22.2-win-x64", + "7c93e9d92bf68c07182b471aa187e35ee6cd08ef0f24ab060dfff605fcc1c57c" + ] + }, + "node_urls": [ + "https://nodejs.org/dist/v{version}/{filename}" + ], + "node_version": "22.22.2", + "include_headers": false, + "platform": "darwin_amd64" + } + }, + "nodejs_darwin_arm64": { + "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", + "attributes": { + "node_download_auth": {}, + "node_repositories": { + "22.22.2-darwin_arm64": [ + "node-v22.22.2-darwin-arm64.tar.gz", + "node-v22.22.2-darwin-arm64", + "db4b275b83736df67533529a18cc55de2549a8329ace6c7bcc68f8d22d3c9000" + ], + "22.22.2-darwin_amd64": [ + "node-v22.22.2-darwin-x64.tar.gz", + "node-v22.22.2-darwin-x64", + "12a6abb9c2902cf48a21120da13f87fde1ed1b71a13330712949e8db818708ba" + ], + "22.22.2-linux_arm64": [ + "node-v22.22.2-linux-arm64.tar.xz", + "node-v22.22.2-linux-arm64", + "e9e1930fd321a470e29bb68f30318bf58e3ecb4acb4f1533fb19c58328a091fe" + ], + "22.22.2-linux_ppc64le": [ + "node-v22.22.2-linux-ppc64le.tar.xz", + "node-v22.22.2-linux-ppc64le", + "14045b5a5030d35ca0030fb7e870bd11a651eb9b57323ebc0021e8d78ac6bac9" + ], + "22.22.2-linux_s390x": [ + "node-v22.22.2-linux-s390x.tar.xz", + "node-v22.22.2-linux-s390x", + "9e4a07c291b8949289c6ea8ee61b1d14666a4810feae776a8d1eb1f57e03a2fb" + ], + "22.22.2-linux_amd64": [ + "node-v22.22.2-linux-x64.tar.xz", + "node-v22.22.2-linux-x64", + "88fd1ce767091fd8d4a99fdb2356e98c819f93f3b1f8663853a2dee9b438068a" + ], + "22.22.2-windows_amd64": [ + "node-v22.22.2-win-x64.zip", + "node-v22.22.2-win-x64", + "7c93e9d92bf68c07182b471aa187e35ee6cd08ef0f24ab060dfff605fcc1c57c" + ] + }, + "node_urls": [ + "https://nodejs.org/dist/v{version}/{filename}" + ], + "node_version": "22.22.2", + "include_headers": false, + "platform": "darwin_arm64" + } + }, + "nodejs_windows_amd64": { + "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", + "attributes": { + "node_download_auth": {}, + "node_repositories": { + "22.22.2-darwin_arm64": [ + "node-v22.22.2-darwin-arm64.tar.gz", + "node-v22.22.2-darwin-arm64", + "db4b275b83736df67533529a18cc55de2549a8329ace6c7bcc68f8d22d3c9000" + ], + "22.22.2-darwin_amd64": [ + "node-v22.22.2-darwin-x64.tar.gz", + "node-v22.22.2-darwin-x64", + "12a6abb9c2902cf48a21120da13f87fde1ed1b71a13330712949e8db818708ba" + ], + "22.22.2-linux_arm64": [ + "node-v22.22.2-linux-arm64.tar.xz", + "node-v22.22.2-linux-arm64", + "e9e1930fd321a470e29bb68f30318bf58e3ecb4acb4f1533fb19c58328a091fe" + ], + "22.22.2-linux_ppc64le": [ + "node-v22.22.2-linux-ppc64le.tar.xz", + "node-v22.22.2-linux-ppc64le", + "14045b5a5030d35ca0030fb7e870bd11a651eb9b57323ebc0021e8d78ac6bac9" + ], + "22.22.2-linux_s390x": [ + "node-v22.22.2-linux-s390x.tar.xz", + "node-v22.22.2-linux-s390x", + "9e4a07c291b8949289c6ea8ee61b1d14666a4810feae776a8d1eb1f57e03a2fb" + ], + "22.22.2-linux_amd64": [ + "node-v22.22.2-linux-x64.tar.xz", + "node-v22.22.2-linux-x64", + "88fd1ce767091fd8d4a99fdb2356e98c819f93f3b1f8663853a2dee9b438068a" + ], + "22.22.2-windows_amd64": [ + "node-v22.22.2-win-x64.zip", + "node-v22.22.2-win-x64", + "7c93e9d92bf68c07182b471aa187e35ee6cd08ef0f24ab060dfff605fcc1c57c" + ] + }, + "node_urls": [ + "https://nodejs.org/dist/v{version}/{filename}" + ], + "node_version": "22.22.2", + "include_headers": false, + "platform": "windows_amd64" + } + }, + "nodejs_windows_arm64": { + "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", + "attributes": { + "node_download_auth": {}, + "node_repositories": { + "22.22.2-darwin_arm64": [ + "node-v22.22.2-darwin-arm64.tar.gz", + "node-v22.22.2-darwin-arm64", + "db4b275b83736df67533529a18cc55de2549a8329ace6c7bcc68f8d22d3c9000" + ], + "22.22.2-darwin_amd64": [ + "node-v22.22.2-darwin-x64.tar.gz", + "node-v22.22.2-darwin-x64", + "12a6abb9c2902cf48a21120da13f87fde1ed1b71a13330712949e8db818708ba" + ], + "22.22.2-linux_arm64": [ + "node-v22.22.2-linux-arm64.tar.xz", + "node-v22.22.2-linux-arm64", + "e9e1930fd321a470e29bb68f30318bf58e3ecb4acb4f1533fb19c58328a091fe" + ], + "22.22.2-linux_ppc64le": [ + "node-v22.22.2-linux-ppc64le.tar.xz", + "node-v22.22.2-linux-ppc64le", + "14045b5a5030d35ca0030fb7e870bd11a651eb9b57323ebc0021e8d78ac6bac9" + ], + "22.22.2-linux_s390x": [ + "node-v22.22.2-linux-s390x.tar.xz", + "node-v22.22.2-linux-s390x", + "9e4a07c291b8949289c6ea8ee61b1d14666a4810feae776a8d1eb1f57e03a2fb" + ], + "22.22.2-linux_amd64": [ + "node-v22.22.2-linux-x64.tar.xz", + "node-v22.22.2-linux-x64", + "88fd1ce767091fd8d4a99fdb2356e98c819f93f3b1f8663853a2dee9b438068a" + ], + "22.22.2-windows_amd64": [ + "node-v22.22.2-win-x64.zip", + "node-v22.22.2-win-x64", + "7c93e9d92bf68c07182b471aa187e35ee6cd08ef0f24ab060dfff605fcc1c57c" + ] + }, + "node_urls": [ + "https://nodejs.org/dist/v{version}/{filename}" + ], + "node_version": "22.22.2", + "include_headers": false, + "platform": "windows_arm64" + } + }, + "nodejs": { + "repoRuleId": "@@rules_nodejs+//nodejs/private:nodejs_repo_host_os_alias.bzl%nodejs_repo_host_os_alias", + "attributes": { + "user_node_repository_name": "nodejs" + } + }, + "nodejs_host": { + "repoRuleId": "@@rules_nodejs+//nodejs/private:nodejs_repo_host_os_alias.bzl%nodejs_repo_host_os_alias", + "attributes": { + "user_node_repository_name": "nodejs" + } + }, + "nodejs_toolchains": { + "repoRuleId": "@@rules_nodejs+//nodejs/private:nodejs_toolchains_repo.bzl%nodejs_toolchains_repo", + "attributes": { + "user_node_repository_name": "nodejs" + } + }, + "node22_linux_amd64": { + "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", + "attributes": { + "node_download_auth": {}, + "node_repositories": { + "22.22.0-darwin_arm64": [ + "node-v22.22.0-darwin-arm64.tar.gz", + "node-v22.22.0-darwin-arm64", + "5ed4db0fcf1eaf84d91ad12462631d73bf4576c1377e192d222e48026a902640" + ], + "22.22.0-darwin_amd64": [ + "node-v22.22.0-darwin-x64.tar.gz", + "node-v22.22.0-darwin-x64", + "5ea50c9d6dea3dfa3abb66b2656f7a4e1c8cef23432b558d45fb538c7b5dedce" + ], + "22.22.0-linux_arm64": [ + "node-v22.22.0-linux-arm64.tar.xz", + "node-v22.22.0-linux-arm64", + "1bf1eb9ee63ffc4e5d324c0b9b62cf4a289f44332dfef9607cea1a0d9596ba6f" ], "22.22.0-linux_ppc64le": [ "node-v22.22.0-linux-ppc64le.tar.xz", @@ -1294,10 +1412,10 @@ ], "node_version": "22.22.0", "include_headers": false, - "platform": "linux_ppc64le" + "platform": "linux_amd64" } }, - "nodejs_darwin_amd64": { + "node22_linux_arm64": { "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", "attributes": { "node_download_auth": {}, @@ -1343,10 +1461,10 @@ ], "node_version": "22.22.0", "include_headers": false, - "platform": "darwin_amd64" + "platform": "linux_arm64" } }, - "nodejs_darwin_arm64": { + "node22_linux_s390x": { "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", "attributes": { "node_download_auth": {}, @@ -1392,10 +1510,10 @@ ], "node_version": "22.22.0", "include_headers": false, - "platform": "darwin_arm64" + "platform": "linux_s390x" } }, - "nodejs_windows_amd64": { + "node22_linux_ppc64le": { "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", "attributes": { "node_download_auth": {}, @@ -1441,10 +1559,10 @@ ], "node_version": "22.22.0", "include_headers": false, - "platform": "windows_amd64" + "platform": "linux_ppc64le" } }, - "nodejs_windows_arm64": { + "node22_darwin_amd64": { "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", "attributes": { "node_download_auth": {}, @@ -1490,211 +1608,6 @@ ], "node_version": "22.22.0", "include_headers": false, - "platform": "windows_arm64" - } - }, - "nodejs": { - "repoRuleId": "@@rules_nodejs+//nodejs/private:nodejs_repo_host_os_alias.bzl%nodejs_repo_host_os_alias", - "attributes": { - "user_node_repository_name": "nodejs" - } - }, - "nodejs_host": { - "repoRuleId": "@@rules_nodejs+//nodejs/private:nodejs_repo_host_os_alias.bzl%nodejs_repo_host_os_alias", - "attributes": { - "user_node_repository_name": "nodejs" - } - }, - "nodejs_toolchains": { - "repoRuleId": "@@rules_nodejs+//nodejs/private:nodejs_toolchains_repo.bzl%nodejs_toolchains_repo", - "attributes": { - "user_node_repository_name": "nodejs" - } - }, - "node20_linux_amd64": { - "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", - "attributes": { - "node_download_auth": {}, - "node_repositories": {}, - "node_urls": [ - "https://nodejs.org/dist/v{version}/{filename}" - ], - "node_version": "20.19.0", - "include_headers": false, - "platform": "linux_amd64" - } - }, - "node20_linux_arm64": { - "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", - "attributes": { - "node_download_auth": {}, - "node_repositories": {}, - "node_urls": [ - "https://nodejs.org/dist/v{version}/{filename}" - ], - "node_version": "20.19.0", - "include_headers": false, - "platform": "linux_arm64" - } - }, - "node20_linux_s390x": { - "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", - "attributes": { - "node_download_auth": {}, - "node_repositories": {}, - "node_urls": [ - "https://nodejs.org/dist/v{version}/{filename}" - ], - "node_version": "20.19.0", - "include_headers": false, - "platform": "linux_s390x" - } - }, - "node20_linux_ppc64le": { - "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", - "attributes": { - "node_download_auth": {}, - "node_repositories": {}, - "node_urls": [ - "https://nodejs.org/dist/v{version}/{filename}" - ], - "node_version": "20.19.0", - "include_headers": false, - "platform": "linux_ppc64le" - } - }, - "node20_darwin_amd64": { - "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", - "attributes": { - "node_download_auth": {}, - "node_repositories": {}, - "node_urls": [ - "https://nodejs.org/dist/v{version}/{filename}" - ], - "node_version": "20.19.0", - "include_headers": false, - "platform": "darwin_amd64" - } - }, - "node20_darwin_arm64": { - "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", - "attributes": { - "node_download_auth": {}, - "node_repositories": {}, - "node_urls": [ - "https://nodejs.org/dist/v{version}/{filename}" - ], - "node_version": "20.19.0", - "include_headers": false, - "platform": "darwin_arm64" - } - }, - "node20_windows_amd64": { - "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", - "attributes": { - "node_download_auth": {}, - "node_repositories": {}, - "node_urls": [ - "https://nodejs.org/dist/v{version}/{filename}" - ], - "node_version": "20.19.0", - "include_headers": false, - "platform": "windows_amd64" - } - }, - "node20_windows_arm64": { - "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", - "attributes": { - "node_download_auth": {}, - "node_repositories": {}, - "node_urls": [ - "https://nodejs.org/dist/v{version}/{filename}" - ], - "node_version": "20.19.0", - "include_headers": false, - "platform": "windows_arm64" - } - }, - "node20": { - "repoRuleId": "@@rules_nodejs+//nodejs/private:nodejs_repo_host_os_alias.bzl%nodejs_repo_host_os_alias", - "attributes": { - "user_node_repository_name": "node20" - } - }, - "node20_host": { - "repoRuleId": "@@rules_nodejs+//nodejs/private:nodejs_repo_host_os_alias.bzl%nodejs_repo_host_os_alias", - "attributes": { - "user_node_repository_name": "node20" - } - }, - "node20_toolchains": { - "repoRuleId": "@@rules_nodejs+//nodejs/private:nodejs_toolchains_repo.bzl%nodejs_toolchains_repo", - "attributes": { - "user_node_repository_name": "node20" - } - }, - "node22_linux_amd64": { - "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", - "attributes": { - "node_download_auth": {}, - "node_repositories": {}, - "node_urls": [ - "https://nodejs.org/dist/v{version}/{filename}" - ], - "node_version": "22.12.0", - "include_headers": false, - "platform": "linux_amd64" - } - }, - "node22_linux_arm64": { - "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", - "attributes": { - "node_download_auth": {}, - "node_repositories": {}, - "node_urls": [ - "https://nodejs.org/dist/v{version}/{filename}" - ], - "node_version": "22.12.0", - "include_headers": false, - "platform": "linux_arm64" - } - }, - "node22_linux_s390x": { - "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", - "attributes": { - "node_download_auth": {}, - "node_repositories": {}, - "node_urls": [ - "https://nodejs.org/dist/v{version}/{filename}" - ], - "node_version": "22.12.0", - "include_headers": false, - "platform": "linux_s390x" - } - }, - "node22_linux_ppc64le": { - "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", - "attributes": { - "node_download_auth": {}, - "node_repositories": {}, - "node_urls": [ - "https://nodejs.org/dist/v{version}/{filename}" - ], - "node_version": "22.12.0", - "include_headers": false, - "platform": "linux_ppc64le" - } - }, - "node22_darwin_amd64": { - "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", - "attributes": { - "node_download_auth": {}, - "node_repositories": {}, - "node_urls": [ - "https://nodejs.org/dist/v{version}/{filename}" - ], - "node_version": "22.12.0", - "include_headers": false, "platform": "darwin_amd64" } }, @@ -1702,11 +1615,47 @@ "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", "attributes": { "node_download_auth": {}, - "node_repositories": {}, + "node_repositories": { + "22.22.0-darwin_arm64": [ + "node-v22.22.0-darwin-arm64.tar.gz", + "node-v22.22.0-darwin-arm64", + "5ed4db0fcf1eaf84d91ad12462631d73bf4576c1377e192d222e48026a902640" + ], + "22.22.0-darwin_amd64": [ + "node-v22.22.0-darwin-x64.tar.gz", + "node-v22.22.0-darwin-x64", + "5ea50c9d6dea3dfa3abb66b2656f7a4e1c8cef23432b558d45fb538c7b5dedce" + ], + "22.22.0-linux_arm64": [ + "node-v22.22.0-linux-arm64.tar.xz", + "node-v22.22.0-linux-arm64", + "1bf1eb9ee63ffc4e5d324c0b9b62cf4a289f44332dfef9607cea1a0d9596ba6f" + ], + "22.22.0-linux_ppc64le": [ + "node-v22.22.0-linux-ppc64le.tar.xz", + "node-v22.22.0-linux-ppc64le", + "d83b9957431cc18e1fc143a4b99f89cde7b8a18f53ef392231b4336afd058865" + ], + "22.22.0-linux_s390x": [ + "node-v22.22.0-linux-s390x.tar.xz", + "node-v22.22.0-linux-s390x", + "5aa0e520689448c4233e8d73f284e8e0634fdcd32b479735698494be5641f3e4" + ], + "22.22.0-linux_amd64": [ + "node-v22.22.0-linux-x64.tar.xz", + "node-v22.22.0-linux-x64", + "9aa8e9d2298ab68c600bd6fb86a6c13bce11a4eca1ba9b39d79fa021755d7c37" + ], + "22.22.0-windows_amd64": [ + "node-v22.22.0-win-x64.zip", + "node-v22.22.0-win-x64", + "c97fa376d2becdc8863fcd3ca2dd9a83a9f3468ee7ccf7a6d076ec66a645c77a" + ] + }, "node_urls": [ "https://nodejs.org/dist/v{version}/{filename}" ], - "node_version": "22.12.0", + "node_version": "22.22.0", "include_headers": false, "platform": "darwin_arm64" } @@ -1715,11 +1664,47 @@ "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", "attributes": { "node_download_auth": {}, - "node_repositories": {}, + "node_repositories": { + "22.22.0-darwin_arm64": [ + "node-v22.22.0-darwin-arm64.tar.gz", + "node-v22.22.0-darwin-arm64", + "5ed4db0fcf1eaf84d91ad12462631d73bf4576c1377e192d222e48026a902640" + ], + "22.22.0-darwin_amd64": [ + "node-v22.22.0-darwin-x64.tar.gz", + "node-v22.22.0-darwin-x64", + "5ea50c9d6dea3dfa3abb66b2656f7a4e1c8cef23432b558d45fb538c7b5dedce" + ], + "22.22.0-linux_arm64": [ + "node-v22.22.0-linux-arm64.tar.xz", + "node-v22.22.0-linux-arm64", + "1bf1eb9ee63ffc4e5d324c0b9b62cf4a289f44332dfef9607cea1a0d9596ba6f" + ], + "22.22.0-linux_ppc64le": [ + "node-v22.22.0-linux-ppc64le.tar.xz", + "node-v22.22.0-linux-ppc64le", + "d83b9957431cc18e1fc143a4b99f89cde7b8a18f53ef392231b4336afd058865" + ], + "22.22.0-linux_s390x": [ + "node-v22.22.0-linux-s390x.tar.xz", + "node-v22.22.0-linux-s390x", + "5aa0e520689448c4233e8d73f284e8e0634fdcd32b479735698494be5641f3e4" + ], + "22.22.0-linux_amd64": [ + "node-v22.22.0-linux-x64.tar.xz", + "node-v22.22.0-linux-x64", + "9aa8e9d2298ab68c600bd6fb86a6c13bce11a4eca1ba9b39d79fa021755d7c37" + ], + "22.22.0-windows_amd64": [ + "node-v22.22.0-win-x64.zip", + "node-v22.22.0-win-x64", + "c97fa376d2becdc8863fcd3ca2dd9a83a9f3468ee7ccf7a6d076ec66a645c77a" + ] + }, "node_urls": [ "https://nodejs.org/dist/v{version}/{filename}" ], - "node_version": "22.12.0", + "node_version": "22.22.0", "include_headers": false, "platform": "windows_amd64" } @@ -1728,11 +1713,47 @@ "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", "attributes": { "node_download_auth": {}, - "node_repositories": {}, + "node_repositories": { + "22.22.0-darwin_arm64": [ + "node-v22.22.0-darwin-arm64.tar.gz", + "node-v22.22.0-darwin-arm64", + "5ed4db0fcf1eaf84d91ad12462631d73bf4576c1377e192d222e48026a902640" + ], + "22.22.0-darwin_amd64": [ + "node-v22.22.0-darwin-x64.tar.gz", + "node-v22.22.0-darwin-x64", + "5ea50c9d6dea3dfa3abb66b2656f7a4e1c8cef23432b558d45fb538c7b5dedce" + ], + "22.22.0-linux_arm64": [ + "node-v22.22.0-linux-arm64.tar.xz", + "node-v22.22.0-linux-arm64", + "1bf1eb9ee63ffc4e5d324c0b9b62cf4a289f44332dfef9607cea1a0d9596ba6f" + ], + "22.22.0-linux_ppc64le": [ + "node-v22.22.0-linux-ppc64le.tar.xz", + "node-v22.22.0-linux-ppc64le", + "d83b9957431cc18e1fc143a4b99f89cde7b8a18f53ef392231b4336afd058865" + ], + "22.22.0-linux_s390x": [ + "node-v22.22.0-linux-s390x.tar.xz", + "node-v22.22.0-linux-s390x", + "5aa0e520689448c4233e8d73f284e8e0634fdcd32b479735698494be5641f3e4" + ], + "22.22.0-linux_amd64": [ + "node-v22.22.0-linux-x64.tar.xz", + "node-v22.22.0-linux-x64", + "9aa8e9d2298ab68c600bd6fb86a6c13bce11a4eca1ba9b39d79fa021755d7c37" + ], + "22.22.0-windows_amd64": [ + "node-v22.22.0-win-x64.zip", + "node-v22.22.0-win-x64", + "c97fa376d2becdc8863fcd3ca2dd9a83a9f3468ee7ccf7a6d076ec66a645c77a" + ] + }, "node_urls": [ "https://nodejs.org/dist/v{version}/{filename}" ], - "node_version": "22.12.0", + "node_version": "22.22.0", "include_headers": false, "platform": "windows_arm64" } @@ -1759,11 +1780,47 @@ "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", "attributes": { "node_download_auth": {}, - "node_repositories": {}, + "node_repositories": { + "24.13.1-darwin_arm64": [ + "node-v24.13.1-darwin-arm64.tar.gz", + "node-v24.13.1-darwin-arm64", + "8c039d59f2fec6195e4281ad5b0d02b9a940897b4df7b849c6fb48be6787bba6" + ], + "24.13.1-darwin_amd64": [ + "node-v24.13.1-darwin-x64.tar.gz", + "node-v24.13.1-darwin-x64", + "527f0578d9812e7dfa225121bda0b1546a6a0e4b5f556295fc8299c272de5fbf" + ], + "24.13.1-linux_arm64": [ + "node-v24.13.1-linux-arm64.tar.xz", + "node-v24.13.1-linux-arm64", + "c827d3d301e2eed1a51f36d0116b71b9e3d9e3b728f081615270ea40faac34c1" + ], + "24.13.1-linux_ppc64le": [ + "node-v24.13.1-linux-ppc64le.tar.xz", + "node-v24.13.1-linux-ppc64le", + "fb712a08d317655dbf776c90f60ac2105109d802e33811df6c9ed33d12f801c6" + ], + "24.13.1-linux_s390x": [ + "node-v24.13.1-linux-s390x.tar.xz", + "node-v24.13.1-linux-s390x", + "8e2c0d9b5545c3db22623e8cb8d6f0c28fcd470f29d32dbeabf9432dda289de2" + ], + "24.13.1-linux_amd64": [ + "node-v24.13.1-linux-x64.tar.xz", + "node-v24.13.1-linux-x64", + "30215f90ea3cd04dfbc06e762c021393fa173a1d392974298bbc871a8e461089" + ], + "24.13.1-windows_amd64": [ + "node-v24.13.1-win-x64.zip", + "node-v24.13.1-win-x64", + "fba577c4bb87df04d54dd87bbdaa5a2272f1f99a2acbf9152e1a91b8b5f0b279" + ] + }, "node_urls": [ "https://nodejs.org/dist/v{version}/{filename}" ], - "node_version": "24.0.0", + "node_version": "24.13.1", "include_headers": false, "platform": "linux_amd64" } @@ -1772,11 +1829,47 @@ "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", "attributes": { "node_download_auth": {}, - "node_repositories": {}, + "node_repositories": { + "24.13.1-darwin_arm64": [ + "node-v24.13.1-darwin-arm64.tar.gz", + "node-v24.13.1-darwin-arm64", + "8c039d59f2fec6195e4281ad5b0d02b9a940897b4df7b849c6fb48be6787bba6" + ], + "24.13.1-darwin_amd64": [ + "node-v24.13.1-darwin-x64.tar.gz", + "node-v24.13.1-darwin-x64", + "527f0578d9812e7dfa225121bda0b1546a6a0e4b5f556295fc8299c272de5fbf" + ], + "24.13.1-linux_arm64": [ + "node-v24.13.1-linux-arm64.tar.xz", + "node-v24.13.1-linux-arm64", + "c827d3d301e2eed1a51f36d0116b71b9e3d9e3b728f081615270ea40faac34c1" + ], + "24.13.1-linux_ppc64le": [ + "node-v24.13.1-linux-ppc64le.tar.xz", + "node-v24.13.1-linux-ppc64le", + "fb712a08d317655dbf776c90f60ac2105109d802e33811df6c9ed33d12f801c6" + ], + "24.13.1-linux_s390x": [ + "node-v24.13.1-linux-s390x.tar.xz", + "node-v24.13.1-linux-s390x", + "8e2c0d9b5545c3db22623e8cb8d6f0c28fcd470f29d32dbeabf9432dda289de2" + ], + "24.13.1-linux_amd64": [ + "node-v24.13.1-linux-x64.tar.xz", + "node-v24.13.1-linux-x64", + "30215f90ea3cd04dfbc06e762c021393fa173a1d392974298bbc871a8e461089" + ], + "24.13.1-windows_amd64": [ + "node-v24.13.1-win-x64.zip", + "node-v24.13.1-win-x64", + "fba577c4bb87df04d54dd87bbdaa5a2272f1f99a2acbf9152e1a91b8b5f0b279" + ] + }, "node_urls": [ "https://nodejs.org/dist/v{version}/{filename}" ], - "node_version": "24.0.0", + "node_version": "24.13.1", "include_headers": false, "platform": "linux_arm64" } @@ -1785,11 +1878,47 @@ "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", "attributes": { "node_download_auth": {}, - "node_repositories": {}, + "node_repositories": { + "24.13.1-darwin_arm64": [ + "node-v24.13.1-darwin-arm64.tar.gz", + "node-v24.13.1-darwin-arm64", + "8c039d59f2fec6195e4281ad5b0d02b9a940897b4df7b849c6fb48be6787bba6" + ], + "24.13.1-darwin_amd64": [ + "node-v24.13.1-darwin-x64.tar.gz", + "node-v24.13.1-darwin-x64", + "527f0578d9812e7dfa225121bda0b1546a6a0e4b5f556295fc8299c272de5fbf" + ], + "24.13.1-linux_arm64": [ + "node-v24.13.1-linux-arm64.tar.xz", + "node-v24.13.1-linux-arm64", + "c827d3d301e2eed1a51f36d0116b71b9e3d9e3b728f081615270ea40faac34c1" + ], + "24.13.1-linux_ppc64le": [ + "node-v24.13.1-linux-ppc64le.tar.xz", + "node-v24.13.1-linux-ppc64le", + "fb712a08d317655dbf776c90f60ac2105109d802e33811df6c9ed33d12f801c6" + ], + "24.13.1-linux_s390x": [ + "node-v24.13.1-linux-s390x.tar.xz", + "node-v24.13.1-linux-s390x", + "8e2c0d9b5545c3db22623e8cb8d6f0c28fcd470f29d32dbeabf9432dda289de2" + ], + "24.13.1-linux_amd64": [ + "node-v24.13.1-linux-x64.tar.xz", + "node-v24.13.1-linux-x64", + "30215f90ea3cd04dfbc06e762c021393fa173a1d392974298bbc871a8e461089" + ], + "24.13.1-windows_amd64": [ + "node-v24.13.1-win-x64.zip", + "node-v24.13.1-win-x64", + "fba577c4bb87df04d54dd87bbdaa5a2272f1f99a2acbf9152e1a91b8b5f0b279" + ] + }, "node_urls": [ "https://nodejs.org/dist/v{version}/{filename}" ], - "node_version": "24.0.0", + "node_version": "24.13.1", "include_headers": false, "platform": "linux_s390x" } @@ -1798,11 +1927,47 @@ "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", "attributes": { "node_download_auth": {}, - "node_repositories": {}, + "node_repositories": { + "24.13.1-darwin_arm64": [ + "node-v24.13.1-darwin-arm64.tar.gz", + "node-v24.13.1-darwin-arm64", + "8c039d59f2fec6195e4281ad5b0d02b9a940897b4df7b849c6fb48be6787bba6" + ], + "24.13.1-darwin_amd64": [ + "node-v24.13.1-darwin-x64.tar.gz", + "node-v24.13.1-darwin-x64", + "527f0578d9812e7dfa225121bda0b1546a6a0e4b5f556295fc8299c272de5fbf" + ], + "24.13.1-linux_arm64": [ + "node-v24.13.1-linux-arm64.tar.xz", + "node-v24.13.1-linux-arm64", + "c827d3d301e2eed1a51f36d0116b71b9e3d9e3b728f081615270ea40faac34c1" + ], + "24.13.1-linux_ppc64le": [ + "node-v24.13.1-linux-ppc64le.tar.xz", + "node-v24.13.1-linux-ppc64le", + "fb712a08d317655dbf776c90f60ac2105109d802e33811df6c9ed33d12f801c6" + ], + "24.13.1-linux_s390x": [ + "node-v24.13.1-linux-s390x.tar.xz", + "node-v24.13.1-linux-s390x", + "8e2c0d9b5545c3db22623e8cb8d6f0c28fcd470f29d32dbeabf9432dda289de2" + ], + "24.13.1-linux_amd64": [ + "node-v24.13.1-linux-x64.tar.xz", + "node-v24.13.1-linux-x64", + "30215f90ea3cd04dfbc06e762c021393fa173a1d392974298bbc871a8e461089" + ], + "24.13.1-windows_amd64": [ + "node-v24.13.1-win-x64.zip", + "node-v24.13.1-win-x64", + "fba577c4bb87df04d54dd87bbdaa5a2272f1f99a2acbf9152e1a91b8b5f0b279" + ] + }, "node_urls": [ "https://nodejs.org/dist/v{version}/{filename}" ], - "node_version": "24.0.0", + "node_version": "24.13.1", "include_headers": false, "platform": "linux_ppc64le" } @@ -1811,11 +1976,47 @@ "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", "attributes": { "node_download_auth": {}, - "node_repositories": {}, + "node_repositories": { + "24.13.1-darwin_arm64": [ + "node-v24.13.1-darwin-arm64.tar.gz", + "node-v24.13.1-darwin-arm64", + "8c039d59f2fec6195e4281ad5b0d02b9a940897b4df7b849c6fb48be6787bba6" + ], + "24.13.1-darwin_amd64": [ + "node-v24.13.1-darwin-x64.tar.gz", + "node-v24.13.1-darwin-x64", + "527f0578d9812e7dfa225121bda0b1546a6a0e4b5f556295fc8299c272de5fbf" + ], + "24.13.1-linux_arm64": [ + "node-v24.13.1-linux-arm64.tar.xz", + "node-v24.13.1-linux-arm64", + "c827d3d301e2eed1a51f36d0116b71b9e3d9e3b728f081615270ea40faac34c1" + ], + "24.13.1-linux_ppc64le": [ + "node-v24.13.1-linux-ppc64le.tar.xz", + "node-v24.13.1-linux-ppc64le", + "fb712a08d317655dbf776c90f60ac2105109d802e33811df6c9ed33d12f801c6" + ], + "24.13.1-linux_s390x": [ + "node-v24.13.1-linux-s390x.tar.xz", + "node-v24.13.1-linux-s390x", + "8e2c0d9b5545c3db22623e8cb8d6f0c28fcd470f29d32dbeabf9432dda289de2" + ], + "24.13.1-linux_amd64": [ + "node-v24.13.1-linux-x64.tar.xz", + "node-v24.13.1-linux-x64", + "30215f90ea3cd04dfbc06e762c021393fa173a1d392974298bbc871a8e461089" + ], + "24.13.1-windows_amd64": [ + "node-v24.13.1-win-x64.zip", + "node-v24.13.1-win-x64", + "fba577c4bb87df04d54dd87bbdaa5a2272f1f99a2acbf9152e1a91b8b5f0b279" + ] + }, "node_urls": [ "https://nodejs.org/dist/v{version}/{filename}" ], - "node_version": "24.0.0", + "node_version": "24.13.1", "include_headers": false, "platform": "darwin_amd64" } @@ -1824,11 +2025,47 @@ "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", "attributes": { "node_download_auth": {}, - "node_repositories": {}, + "node_repositories": { + "24.13.1-darwin_arm64": [ + "node-v24.13.1-darwin-arm64.tar.gz", + "node-v24.13.1-darwin-arm64", + "8c039d59f2fec6195e4281ad5b0d02b9a940897b4df7b849c6fb48be6787bba6" + ], + "24.13.1-darwin_amd64": [ + "node-v24.13.1-darwin-x64.tar.gz", + "node-v24.13.1-darwin-x64", + "527f0578d9812e7dfa225121bda0b1546a6a0e4b5f556295fc8299c272de5fbf" + ], + "24.13.1-linux_arm64": [ + "node-v24.13.1-linux-arm64.tar.xz", + "node-v24.13.1-linux-arm64", + "c827d3d301e2eed1a51f36d0116b71b9e3d9e3b728f081615270ea40faac34c1" + ], + "24.13.1-linux_ppc64le": [ + "node-v24.13.1-linux-ppc64le.tar.xz", + "node-v24.13.1-linux-ppc64le", + "fb712a08d317655dbf776c90f60ac2105109d802e33811df6c9ed33d12f801c6" + ], + "24.13.1-linux_s390x": [ + "node-v24.13.1-linux-s390x.tar.xz", + "node-v24.13.1-linux-s390x", + "8e2c0d9b5545c3db22623e8cb8d6f0c28fcd470f29d32dbeabf9432dda289de2" + ], + "24.13.1-linux_amd64": [ + "node-v24.13.1-linux-x64.tar.xz", + "node-v24.13.1-linux-x64", + "30215f90ea3cd04dfbc06e762c021393fa173a1d392974298bbc871a8e461089" + ], + "24.13.1-windows_amd64": [ + "node-v24.13.1-win-x64.zip", + "node-v24.13.1-win-x64", + "fba577c4bb87df04d54dd87bbdaa5a2272f1f99a2acbf9152e1a91b8b5f0b279" + ] + }, "node_urls": [ "https://nodejs.org/dist/v{version}/{filename}" ], - "node_version": "24.0.0", + "node_version": "24.13.1", "include_headers": false, "platform": "darwin_arm64" } @@ -1837,11 +2074,47 @@ "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", "attributes": { "node_download_auth": {}, - "node_repositories": {}, + "node_repositories": { + "24.13.1-darwin_arm64": [ + "node-v24.13.1-darwin-arm64.tar.gz", + "node-v24.13.1-darwin-arm64", + "8c039d59f2fec6195e4281ad5b0d02b9a940897b4df7b849c6fb48be6787bba6" + ], + "24.13.1-darwin_amd64": [ + "node-v24.13.1-darwin-x64.tar.gz", + "node-v24.13.1-darwin-x64", + "527f0578d9812e7dfa225121bda0b1546a6a0e4b5f556295fc8299c272de5fbf" + ], + "24.13.1-linux_arm64": [ + "node-v24.13.1-linux-arm64.tar.xz", + "node-v24.13.1-linux-arm64", + "c827d3d301e2eed1a51f36d0116b71b9e3d9e3b728f081615270ea40faac34c1" + ], + "24.13.1-linux_ppc64le": [ + "node-v24.13.1-linux-ppc64le.tar.xz", + "node-v24.13.1-linux-ppc64le", + "fb712a08d317655dbf776c90f60ac2105109d802e33811df6c9ed33d12f801c6" + ], + "24.13.1-linux_s390x": [ + "node-v24.13.1-linux-s390x.tar.xz", + "node-v24.13.1-linux-s390x", + "8e2c0d9b5545c3db22623e8cb8d6f0c28fcd470f29d32dbeabf9432dda289de2" + ], + "24.13.1-linux_amd64": [ + "node-v24.13.1-linux-x64.tar.xz", + "node-v24.13.1-linux-x64", + "30215f90ea3cd04dfbc06e762c021393fa173a1d392974298bbc871a8e461089" + ], + "24.13.1-windows_amd64": [ + "node-v24.13.1-win-x64.zip", + "node-v24.13.1-win-x64", + "fba577c4bb87df04d54dd87bbdaa5a2272f1f99a2acbf9152e1a91b8b5f0b279" + ] + }, "node_urls": [ "https://nodejs.org/dist/v{version}/{filename}" ], - "node_version": "24.0.0", + "node_version": "24.13.1", "include_headers": false, "platform": "windows_amd64" } @@ -1850,11 +2123,47 @@ "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", "attributes": { "node_download_auth": {}, - "node_repositories": {}, + "node_repositories": { + "24.13.1-darwin_arm64": [ + "node-v24.13.1-darwin-arm64.tar.gz", + "node-v24.13.1-darwin-arm64", + "8c039d59f2fec6195e4281ad5b0d02b9a940897b4df7b849c6fb48be6787bba6" + ], + "24.13.1-darwin_amd64": [ + "node-v24.13.1-darwin-x64.tar.gz", + "node-v24.13.1-darwin-x64", + "527f0578d9812e7dfa225121bda0b1546a6a0e4b5f556295fc8299c272de5fbf" + ], + "24.13.1-linux_arm64": [ + "node-v24.13.1-linux-arm64.tar.xz", + "node-v24.13.1-linux-arm64", + "c827d3d301e2eed1a51f36d0116b71b9e3d9e3b728f081615270ea40faac34c1" + ], + "24.13.1-linux_ppc64le": [ + "node-v24.13.1-linux-ppc64le.tar.xz", + "node-v24.13.1-linux-ppc64le", + "fb712a08d317655dbf776c90f60ac2105109d802e33811df6c9ed33d12f801c6" + ], + "24.13.1-linux_s390x": [ + "node-v24.13.1-linux-s390x.tar.xz", + "node-v24.13.1-linux-s390x", + "8e2c0d9b5545c3db22623e8cb8d6f0c28fcd470f29d32dbeabf9432dda289de2" + ], + "24.13.1-linux_amd64": [ + "node-v24.13.1-linux-x64.tar.xz", + "node-v24.13.1-linux-x64", + "30215f90ea3cd04dfbc06e762c021393fa173a1d392974298bbc871a8e461089" + ], + "24.13.1-windows_amd64": [ + "node-v24.13.1-win-x64.zip", + "node-v24.13.1-win-x64", + "fba577c4bb87df04d54dd87bbdaa5a2272f1f99a2acbf9152e1a91b8b5f0b279" + ] + }, "node_urls": [ "https://nodejs.org/dist/v{version}/{filename}" ], - "node_version": "24.0.0", + "node_version": "24.13.1", "include_headers": false, "platform": "windows_arm64" } @@ -1883,7 +2192,7 @@ }, "@@rules_python+//python/extensions:pip.bzl%pip": { "general": { - "bzlTransitiveDigest": "d3ENjFH8qMwmOrkcb3c9JYqQ5hJ6owjfbSr24KY0Ugg=", + "bzlTransitiveDigest": "WViZ5k1A9F8R5wfEe2ArLMFS1g9UmgfbS8Q/7q1/z7o=", "usagesDigest": "AK1R124YPWwAs8z1CQYyjYuci8RO5Ofot+EP5ZCNQDc=", "recordedFileInputs": { "@@protobuf+//python/requirements.txt": "983be60d3cec4b319dcab6d48aeb3f5b2f7c3350f26b3a9e97486c37967c73c5", @@ -4621,7 +4930,7 @@ }, "@@rules_sass+//src/toolchain:extensions.bzl%sass": { "general": { - "bzlTransitiveDigest": "RA58Nyrsn03Z5YmQnpmBw3mqlVck++XIrx34amsqU/E=", + "bzlTransitiveDigest": "mOfuR8PsNuUWEq7JZ4MpIRbwyAGAqrCvkXXGaRNnlPQ=", "usagesDigest": "R0KshhzIouLWuexMUCrl4HY+FUDwlVVgF9Z7UnwyUWA=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, @@ -4677,8 +4986,8 @@ }, "@@yq.bzl+//yq:extensions.bzl%yq": { "general": { - "bzlTransitiveDigest": "tDqk+ntWTdxNAWPDjRY1uITgHbti2jcXR5ZdinltBs0=", - "usagesDigest": "OQwtwmKiZAvI0n0B86XlM4tmQHq4zcjFjAEiRGPhXVI=", + "bzlTransitiveDigest": "UfFMy8CWK4/dVo/tfaSAIYUiDGNAPes5eRllx9O9Q9Q=", + "usagesDigest": "da9wP1gnmr42ci1bT30rSLLWu7O0jJPIkd01GNAM7NE=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, "envVariables": {}, diff --git a/README.md b/README.md index f14224e1cac7..9d3364263312 100644 --- a/README.md +++ b/README.md @@ -141,7 +141,6 @@ This is a monorepo which contains many tools and packages: |---|---|---|---| **Angular Build System** | [`@angular/build`](https://npmjs.com/package/@angular/build) | [![latest](https://img.shields.io/npm/v/%40angular%2Fbuild/latest.svg)](https://npmjs.com/package/@angular/build) | [![README](https://img.shields.io/badge/README--green.svg)](/packages/angular/build/README.md) [![snapshot](https://img.shields.io/badge/snapshot--blue.svg)](https://github.com/angular/angular-build-builds) **Angular CLI** | [`@angular/cli`](https://npmjs.com/package/@angular/cli) | [![latest](https://img.shields.io/npm/v/%40angular%2Fcli/latest.svg)](https://npmjs.com/package/@angular/cli) | [![README](https://img.shields.io/badge/README--green.svg)](/packages/angular/cli/README.md) [![snapshot](https://img.shields.io/badge/snapshot--blue.svg)](https://github.com/angular/cli-builds) -**Architect CLI** | [`@angular-devkit/architect-cli`](https://npmjs.com/package/@angular-devkit/architect-cli) | [![latest](https://img.shields.io/npm/v/%40angular-devkit%2Farchitect-cli/latest.svg)](https://npmjs.com/package/@angular-devkit/architect-cli) | [![snapshot](https://img.shields.io/badge/snapshot--blue.svg)](https://github.com/angular/angular-devkit-architect-cli-builds) **Schematics CLI** | [`@angular-devkit/schematics-cli`](https://npmjs.com/package/@angular-devkit/schematics-cli) | [![latest](https://img.shields.io/npm/v/%40angular-devkit%2Fschematics-cli/latest.svg)](https://npmjs.com/package/@angular-devkit/schematics-cli) | [![snapshot](https://img.shields.io/badge/snapshot--blue.svg)](https://github.com/angular/angular-devkit-schematics-cli-builds) diff --git a/constants.bzl b/constants.bzl index d4be4fc34b84..89d6eb63421c 100644 --- a/constants.bzl +++ b/constants.bzl @@ -1,12 +1,12 @@ # Engine versions to stamp in a release package.json -RELEASE_ENGINES_NODE = "^20.19.0 || ^22.12.0 || >=24.0.0" +RELEASE_ENGINES_NODE = "^22.22.0 || >=24.13.1" RELEASE_ENGINES_NPM = "^6.11.0 || ^7.5.6 || >=8.0.0" RELEASE_ENGINES_YARN = ">= 1.13.0" -NG_PACKAGR_VERSION = "^21.2.0-next.0" -ANGULAR_FW_VERSION = "^21.2.0-next.0" -ANGULAR_FW_PEER_DEP = "^21.0.0 || ^21.2.0-next.0" -NG_PACKAGR_PEER_DEP = "^21.0.0 || ^21.2.0-next.0" +NG_PACKAGR_VERSION = "^22.0.0-next.0" +ANGULAR_FW_VERSION = "^22.0.0-next.0" +ANGULAR_FW_PEER_DEP = "^22.0.0-next.0" +NG_PACKAGR_PEER_DEP = "^22.0.0-next.0" # Baseline widely-available date in `YYYY-MM-DD` format which defines Angular's # browser support. This date serves as the source of truth for the Angular CLI's @@ -21,7 +21,6 @@ SNAPSHOT_REPOS = { "@angular/build": "angular/angular-build-builds", "@angular/ssr": "angular/angular-ssr-builds", "@angular-devkit/architect": "angular/angular-devkit-architect-builds", - "@angular-devkit/architect-cli": "angular/angular-devkit-architect-cli-builds", "@angular-devkit/build-angular": "angular/angular-devkit-build-angular-builds", "@angular-devkit/build-webpack": "angular/angular-devkit-build-webpack-builds", "@angular-devkit/core": "angular/angular-devkit-core-builds", diff --git a/docs/DEVELOPER.md b/docs/DEVELOPER.md index 8204bd7dcbce..35b07adf1e89 100644 --- a/docs/DEVELOPER.md +++ b/docs/DEVELOPER.md @@ -56,7 +56,7 @@ project](#building-and-installing-the-cli), then run the desired `ng` command as: ```shell -node --inspect-brk node_modules/.bin/ng ... +node --inspect-brk node_modules/.bin/ng ``` This will trigger a breakpoint as the CLI starts up. You can connect to this @@ -168,7 +168,7 @@ Adding a package to this repository means running two separate commands: 1. `schematics devkit:package PACKAGE_NAME`. This will update the `.monorepo` file, and create the base files for the new package (package.json, src/index, etc). -1. `devkit-admin templates`. This will update the README and all other template files that might +1. `pnpm admin templates`. This will update the README and all other template files that might have changed when adding a new package. For private packages, you will need to add a `"private": true` key to your package.json manually. diff --git a/eslint.config.mjs b/eslint.config.mjs index 192ba19f2007..08a993804c32 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -10,9 +10,9 @@ import { fixupConfigRules, fixupPluginRules } from '@eslint/compat'; import { FlatCompat } from '@eslint/eslintrc'; import js from '@eslint/js'; import stylistic from '@stylistic/eslint-plugin'; +import header from '@tony.ganchev/eslint-plugin-header'; import typescriptEslint from '@typescript-eslint/eslint-plugin'; import tsParser from '@typescript-eslint/parser'; -import header from 'eslint-plugin-header'; import _import from 'eslint-plugin-import'; import globals from 'globals'; @@ -22,12 +22,15 @@ const compat = new FlatCompat({ allConfig: js.configs.all, }); -// See: https://github.com/Stuk/eslint-plugin-header/issues/57 -header.rules.header.meta.schema = false; - export default [ + { + files: ['**/*.ts', '**/*.mts', '**/*.cts'], + }, { ignores: [ + '**/*.js', + '**/*.mjs', + '**/*.cjs', '**/bazel-out', '**/dist-schema', 'goldens/public-api', @@ -59,7 +62,7 @@ export default [ '@stylistic': stylistic, '@typescript-eslint': fixupPluginRules(typescriptEslint), import: fixupPluginRules(_import), - header, + '@tony.ganchev': header, }, languageOptions: { @@ -72,7 +75,8 @@ export default [ sourceType: 'module', parserOptions: { - project: 'tsconfig.json', + projectService: true, // v8 recommended alternative to "project" + tsconfigRootDir: import.meta.dirname, }, }, @@ -106,7 +110,7 @@ export default [ '@typescript-eslint/no-unused-expressions': 'error', curly: 'error', - 'header/header': [ + '@tony.ganchev/header': [ 'error', 'block', [ diff --git a/goldens/BUILD.bazel b/goldens/BUILD.bazel index 6dbbdd28f25b..711154f524b1 100644 --- a/goldens/BUILD.bazel +++ b/goldens/BUILD.bazel @@ -1,4 +1,4 @@ -load("@aspect_bazel_lib//lib:copy_to_bin.bzl", "copy_to_bin") +load("@bazel_lib//lib:copy_to_bin.bzl", "copy_to_bin") package(default_visibility = ["//visibility:public"]) diff --git a/goldens/public-api/angular/ssr/index.api.md b/goldens/public-api/angular/ssr/index.api.md index 81764fcc1f62..e5d85138b72f 100644 --- a/goldens/public-api/angular/ssr/index.api.md +++ b/goldens/public-api/angular/ssr/index.api.md @@ -6,19 +6,30 @@ import { DefaultExport } from '@angular/router'; import { EnvironmentProviders } from '@angular/core'; +import { InjectionToken } from '@angular/core'; import { Provider } from '@angular/core'; import { Type } from '@angular/core'; // @public export class AngularAppEngine { + constructor(options?: AngularAppEngineOptions); handle(request: Request, requestContext?: unknown): Promise; static ɵallowStaticRouteRender: boolean; + static ɵdisableAllowedHostsCheck: boolean; static ɵhooks: Hooks; } +// @public +export interface AngularAppEngineOptions { + allowedHosts?: readonly string[]; +} + // @public export function createRequestHandler(handler: RequestHandlerFunction): RequestHandlerFunction; +// @public +export const IS_DISCOVERING_ROUTES: InjectionToken; + // @public export enum PrerenderFallback { Client = 1, diff --git a/goldens/public-api/angular/ssr/node/index.api.md b/goldens/public-api/angular/ssr/node/index.api.md index eccb6396938e..2c52c06b47c1 100644 --- a/goldens/public-api/angular/ssr/node/index.api.md +++ b/goldens/public-api/angular/ssr/node/index.api.md @@ -15,8 +15,12 @@ import { Type } from '@angular/core'; // @public export class AngularNodeAppEngine { - constructor(); - handle(request: IncomingMessage | Http2ServerRequest, requestContext?: unknown): Promise; + constructor(options?: AngularNodeAppEngineOptions); + handle(request: IncomingMessage | Http2ServerRequest | Request, requestContext?: unknown): Promise; +} + +// @public +export interface AngularNodeAppEngineOptions extends AngularAppEngineOptions { } // @public @@ -27,6 +31,7 @@ export class CommonEngine { // @public (undocumented) export interface CommonEngineOptions { + allowedHosts?: readonly string[]; bootstrap?: Type<{}> | ((context: BootstrapContext) => Promise); enablePerformanceProfiler?: boolean; providers?: StaticProvider[]; diff --git a/goldens/public-api/angular_devkit/architect/index.api.md b/goldens/public-api/angular_devkit/architect/index.api.md index 0ae8751719b5..747b7010f580 100644 --- a/goldens/public-api/angular_devkit/architect/index.api.md +++ b/goldens/public-api/angular_devkit/architect/index.api.md @@ -530,7 +530,7 @@ export type Target = json.JsonObject & Target_2; export function targetFromTargetString(specifier: string, abbreviatedProjectName?: string, abbreviatedTargetName?: string): Target; // @public -export function targetStringFromTarget({ project, target, configuration }: Target): string; +export function targetStringFromTarget(input: Target): string; // @public export type TypedBuilderProgress = { diff --git a/goldens/public-api/angular_devkit/build_angular/index.api.md b/goldens/public-api/angular_devkit/build_angular/index.api.md index 0208e998a300..a7747bda9da2 100644 --- a/goldens/public-api/angular_devkit/build_angular/index.api.md +++ b/goldens/public-api/angular_devkit/build_angular/index.api.md @@ -173,9 +173,6 @@ export function executeKarmaBuilder(options: KarmaBuilderOptions, context: Build // @public export function executeNgPackagrBuilder(options: NgPackagrBuilderOptions, context: BuilderContext): Observable; -// @public -export function executeProtractorBuilder(options: ProtractorBuilderOptions, context: BuilderContext): Promise; - // @public export function executeServerBuilder(options: ServerBuilderOptions, context: BuilderContext, transforms?: { webpackConfiguration?: ExecutionTransformer; @@ -269,20 +266,6 @@ export enum OutputHashing { None = "none" } -// @public -export type ProtractorBuilderOptions = { - baseUrl?: string; - devServerTarget?: string; - grep?: string; - host?: string; - invertGrep?: boolean; - port?: number; - protractorConfig: string; - specs?: string[]; - suite?: string; - webdriverUpdate?: boolean; -}; - // @public (undocumented) export type ServerBuilderOptions = { assets?: AssetPattern_3[]; diff --git a/modules/testing/builder/BUILD.bazel b/modules/testing/builder/BUILD.bazel index 7f542efb0138..45c39358c29c 100644 --- a/modules/testing/builder/BUILD.bazel +++ b/modules/testing/builder/BUILD.bazel @@ -21,7 +21,9 @@ ts_project( # resolvable in the test project. ":node_modules/@angular/ssr", ":node_modules/browser-sync", + ":node_modules/istanbul-lib-instrument", ":node_modules/jsdom", + ":node_modules/ng-packagr", ":node_modules/vitest", ":node_modules/@vitest/coverage-v8", ] + glob(["projects/**/*"]), diff --git a/modules/testing/builder/package.json b/modules/testing/builder/package.json index 47ff33d0cd7d..5ba604719d42 100644 --- a/modules/testing/builder/package.json +++ b/modules/testing/builder/package.json @@ -1,13 +1,15 @@ { "devDependencies": { - "@angular-devkit/core": "workspace:*", "@angular-devkit/architect": "workspace:*", - "@angular/ssr": "workspace:*", "@angular-devkit/build-angular": "workspace:*", + "@angular-devkit/core": "workspace:*", + "@angular/ssr": "workspace:*", + "@vitest/coverage-v8": "4.1.2", "browser-sync": "3.0.4", - "@vitest/coverage-v8": "4.0.18", - "jsdom": "28.1.0", + "istanbul-lib-instrument": "6.0.3", + "jsdom": "29.0.1", + "ng-packagr": "22.0.0-next.1", "rxjs": "7.8.2", - "vitest": "4.0.18" + "vitest": "4.1.2" } } diff --git a/modules/testing/builder/projects/hello-world-app/README.md b/modules/testing/builder/projects/hello-world-app/README.md index 3c578babc961..c2795c8bcc94 100644 --- a/modules/testing/builder/projects/hello-world-app/README.md +++ b/modules/testing/builder/projects/hello-world-app/README.md @@ -20,7 +20,7 @@ Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github. ## Running end-to-end tests -Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/). +Run `ng e2e` to setup and run the end-to-end tests. ## Further help diff --git a/modules/testing/builder/projects/hello-world-app/angular.json b/modules/testing/builder/projects/hello-world-app/angular.json index 95607701be8f..9ab612b8b2c5 100644 --- a/modules/testing/builder/projects/hello-world-app/angular.json +++ b/modules/testing/builder/projects/hello-world-app/angular.json @@ -172,20 +172,6 @@ } } } - }, - "app-e2e": { - "root": "e2e", - "projectType": "application", - "targets": { - "e2e": { - "builder": "@angular-devkit/build-angular:private-protractor", - "options": { - "protractorConfig": "protractor.conf.js", - "devServerTarget": "app:serve", - "webdriverUpdate": false - } - } - } } } } diff --git a/modules/testing/builder/projects/hello-world-app/e2e/app.e2e-spec.ts b/modules/testing/builder/projects/hello-world-app/e2e/app.e2e-spec.ts deleted file mode 100644 index 862e95302ce3..000000000000 --- a/modules/testing/builder/projects/hello-world-app/e2e/app.e2e-spec.ts +++ /dev/null @@ -1,22 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import { AppPage } from './app.po'; - -describe('hello-world-app App', () => { - let page: AppPage; - - beforeEach(() => { - page = new AppPage(); - }); - - it('should display welcome message', async () => { - page.navigateTo(); - expect(await page.getTitleText()).toEqual('Welcome to app!'); - }); -}); diff --git a/modules/testing/builder/projects/hello-world-app/e2e/app.po.ts b/modules/testing/builder/projects/hello-world-app/e2e/app.po.ts deleted file mode 100644 index 7cb6bc3fb743..000000000000 --- a/modules/testing/builder/projects/hello-world-app/e2e/app.po.ts +++ /dev/null @@ -1,19 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import { browser, by, element } from 'protractor'; - -export class AppPage { - navigateTo(): Promise { - return browser.get(browser.baseUrl) as Promise; - } - - getTitleText(): Promise { - return element(by.css('app-root h1')).getText() as Promise; - } -} diff --git a/modules/testing/builder/projects/hello-world-app/e2e/tsconfig.e2e.json b/modules/testing/builder/projects/hello-world-app/e2e/tsconfig.e2e.json deleted file mode 100644 index a82df00eef37..000000000000 --- a/modules/testing/builder/projects/hello-world-app/e2e/tsconfig.e2e.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "../tsconfig.json", - "compilerOptions": { - "outDir": "../out-tsc/e2e", - "module": "commonjs", - "target": "es2018", - "types": [ - "jasmine", - "node" - ] - } -} diff --git a/modules/testing/builder/projects/hello-world-app/karma.conf.js b/modules/testing/builder/projects/hello-world-app/karma.conf.js index 7d5f7c8d98f5..d3206bd4cf87 100644 --- a/modules/testing/builder/projects/hello-world-app/karma.conf.js +++ b/modules/testing/builder/projects/hello-world-app/karma.conf.js @@ -10,7 +10,10 @@ // https://karma-runner.github.io/1.0/config/configuration-file.html const path = require('path'); -process.env.CHROME_BIN = require('puppeteer').executablePath(); + +// Resolve from relative paths to absolute paths within the bazel runfiles tree +// so subprocesses spawned in a different working directory can still find them. +process.env.CHROME_BIN = process.env.CHROME_BIN ? path.resolve(path.join(process.cwd(), '..', '..', '..'), process.env.CHROME_BIN) : require('puppeteer').executablePath(); module.exports = function(config) { config.set({ diff --git a/modules/testing/builder/projects/hello-world-app/protractor.conf.js b/modules/testing/builder/projects/hello-world-app/protractor.conf.js deleted file mode 100644 index 313f7ac7c53b..000000000000 --- a/modules/testing/builder/projects/hello-world-app/protractor.conf.js +++ /dev/null @@ -1,43 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -// Protractor configuration file, see link for more information -// https://github.com/angular/protractor/blob/master/lib/config.ts - -const { SpecReporter, StacktraceOption } = require('jasmine-spec-reporter'); -const { resolve } = require('path'); - -exports.config = { - allScriptsTimeout: 11000, - specs: ['./e2e/**/*.e2e-spec.ts'], - capabilities: { - browserName: 'chrome', - chromeOptions: { - args: ['--headless', '--no-sandbox', '--disable-gpu', '--disable-dev-shm-usage'], - binary: require('puppeteer').executablePath(), - }, - }, - directConnect: true, - baseUrl: 'http://localhost:4200/', - framework: 'jasmine', - jasmineNodeOpts: { - showColors: true, - defaultTimeoutInterval: 30000, - print: function() {}, - }, - onPrepare() { - require('ts-node').register({ - project: resolve(__dirname, './e2e/tsconfig.e2e.json'), - }); - jasmine.getEnv().addReporter(new SpecReporter({ - spec: { - displayStacktrace: StacktraceOption.PRETTY - } - })); - }, -}; diff --git a/modules/testing/builder/projects/hello-world-app/src/tsconfig.server.json b/modules/testing/builder/projects/hello-world-app/src/tsconfig.server.json index 9a492c781eb1..3fd4df49c45d 100644 --- a/modules/testing/builder/projects/hello-world-app/src/tsconfig.server.json +++ b/modules/testing/builder/projects/hello-world-app/src/tsconfig.server.json @@ -2,8 +2,7 @@ "extends": "./tsconfig.app.json", "compilerOptions": { "outDir": "../dist-server", - "baseUrl": "./", - "types": ["@angular/localize", "node"] + "types": ["@angular/localize", "node", "@types/express"] }, "files": [ "main.server.ts" diff --git a/modules/testing/builder/projects/hello-world-app/tsconfig.json b/modules/testing/builder/projects/hello-world-app/tsconfig.json index 8f8859a21d4f..4f9890cb8e7d 100644 --- a/modules/testing/builder/projects/hello-world-app/tsconfig.json +++ b/modules/testing/builder/projects/hello-world-app/tsconfig.json @@ -1,7 +1,6 @@ { "compileOnSave": false, "compilerOptions": { - "baseUrl": "./", "outDir": "./dist/out-tsc", "sourceMap": true, "declaration": false, diff --git a/packages/angular_devkit/build_angular/test/hello-world-lib/.gitignore b/modules/testing/builder/projects/hello-world-lib/.gitignore similarity index 100% rename from packages/angular_devkit/build_angular/test/hello-world-lib/.gitignore rename to modules/testing/builder/projects/hello-world-lib/.gitignore diff --git a/packages/angular_devkit/build_angular/test/hello-world-lib/angular.json b/modules/testing/builder/projects/hello-world-lib/angular.json similarity index 100% rename from packages/angular_devkit/build_angular/test/hello-world-lib/angular.json rename to modules/testing/builder/projects/hello-world-lib/angular.json diff --git a/packages/angular_devkit/build_angular/test/hello-world-lib/projects/lib/karma.conf.js b/modules/testing/builder/projects/hello-world-lib/projects/lib/karma.conf.js similarity index 100% rename from packages/angular_devkit/build_angular/test/hello-world-lib/projects/lib/karma.conf.js rename to modules/testing/builder/projects/hello-world-lib/projects/lib/karma.conf.js diff --git a/packages/angular_devkit/build_angular/test/hello-world-lib/projects/lib/ng-package.json b/modules/testing/builder/projects/hello-world-lib/projects/lib/ng-package.json similarity index 100% rename from packages/angular_devkit/build_angular/test/hello-world-lib/projects/lib/ng-package.json rename to modules/testing/builder/projects/hello-world-lib/projects/lib/ng-package.json diff --git a/modules/testing/builder/projects/hello-world-lib/projects/lib/package.json b/modules/testing/builder/projects/hello-world-lib/projects/lib/package.json new file mode 100644 index 000000000000..ac7b847f2366 --- /dev/null +++ b/modules/testing/builder/projects/hello-world-lib/projects/lib/package.json @@ -0,0 +1,8 @@ +{ + "name": "lib", + "version": "0.0.1", + "peerDependencies": { + "@angular/common": "^22.0.0-next", + "@angular/core": "^22.0.0-next" + } +} \ No newline at end of file diff --git a/packages/angular_devkit/build_angular/test/hello-world-lib/projects/lib/src/lib/lib.component.spec.ts b/modules/testing/builder/projects/hello-world-lib/projects/lib/src/lib/lib.component.spec.ts similarity index 100% rename from packages/angular_devkit/build_angular/test/hello-world-lib/projects/lib/src/lib/lib.component.spec.ts rename to modules/testing/builder/projects/hello-world-lib/projects/lib/src/lib/lib.component.spec.ts diff --git a/packages/angular_devkit/build_angular/test/hello-world-lib/projects/lib/src/lib/lib.component.ts b/modules/testing/builder/projects/hello-world-lib/projects/lib/src/lib/lib.component.ts similarity index 100% rename from packages/angular_devkit/build_angular/test/hello-world-lib/projects/lib/src/lib/lib.component.ts rename to modules/testing/builder/projects/hello-world-lib/projects/lib/src/lib/lib.component.ts diff --git a/packages/angular_devkit/build_angular/test/hello-world-lib/projects/lib/src/lib/lib.service.spec.ts b/modules/testing/builder/projects/hello-world-lib/projects/lib/src/lib/lib.service.spec.ts similarity index 100% rename from packages/angular_devkit/build_angular/test/hello-world-lib/projects/lib/src/lib/lib.service.spec.ts rename to modules/testing/builder/projects/hello-world-lib/projects/lib/src/lib/lib.service.spec.ts diff --git a/packages/angular_devkit/build_angular/test/hello-world-lib/projects/lib/src/lib/lib.service.ts b/modules/testing/builder/projects/hello-world-lib/projects/lib/src/lib/lib.service.ts similarity index 100% rename from packages/angular_devkit/build_angular/test/hello-world-lib/projects/lib/src/lib/lib.service.ts rename to modules/testing/builder/projects/hello-world-lib/projects/lib/src/lib/lib.service.ts diff --git a/packages/angular_devkit/build_angular/test/hello-world-lib/projects/lib/src/public-api.ts b/modules/testing/builder/projects/hello-world-lib/projects/lib/src/public-api.ts similarity index 100% rename from packages/angular_devkit/build_angular/test/hello-world-lib/projects/lib/src/public-api.ts rename to modules/testing/builder/projects/hello-world-lib/projects/lib/src/public-api.ts diff --git a/packages/angular_devkit/build_angular/test/hello-world-lib/projects/lib/tsconfig.lib.json b/modules/testing/builder/projects/hello-world-lib/projects/lib/tsconfig.lib.json similarity index 100% rename from packages/angular_devkit/build_angular/test/hello-world-lib/projects/lib/tsconfig.lib.json rename to modules/testing/builder/projects/hello-world-lib/projects/lib/tsconfig.lib.json diff --git a/packages/angular_devkit/build_angular/test/hello-world-lib/projects/lib/tsconfig.lib.prod.json b/modules/testing/builder/projects/hello-world-lib/projects/lib/tsconfig.lib.prod.json similarity index 100% rename from packages/angular_devkit/build_angular/test/hello-world-lib/projects/lib/tsconfig.lib.prod.json rename to modules/testing/builder/projects/hello-world-lib/projects/lib/tsconfig.lib.prod.json diff --git a/packages/angular_devkit/build_angular/test/hello-world-lib/projects/lib/tsconfig.spec.json b/modules/testing/builder/projects/hello-world-lib/projects/lib/tsconfig.spec.json similarity index 100% rename from packages/angular_devkit/build_angular/test/hello-world-lib/projects/lib/tsconfig.spec.json rename to modules/testing/builder/projects/hello-world-lib/projects/lib/tsconfig.spec.json diff --git a/packages/angular_devkit/build_angular/test/hello-world-lib/tsconfig.json b/modules/testing/builder/projects/hello-world-lib/tsconfig.json similarity index 95% rename from packages/angular_devkit/build_angular/test/hello-world-lib/tsconfig.json rename to modules/testing/builder/projects/hello-world-lib/tsconfig.json index f749045924e4..8ccae14cd594 100644 --- a/packages/angular_devkit/build_angular/test/hello-world-lib/tsconfig.json +++ b/modules/testing/builder/projects/hello-world-lib/tsconfig.json @@ -1,7 +1,6 @@ { "compileOnSave": false, "compilerOptions": { - "baseUrl": "./", "outDir": "./dist/out-tsc", "sourceMap": true, "declaration": false, diff --git a/modules/testing/builder/src/jasmine-helpers.ts b/modules/testing/builder/src/jasmine-helpers.ts index eb48f8b8dbbc..bd1943ae3ea1 100644 --- a/modules/testing/builder/src/jasmine-helpers.ts +++ b/modules/testing/builder/src/jasmine-helpers.ts @@ -25,6 +25,8 @@ export const BUILD_TIMEOUT = 30_000; const optionSchemaCache = new Map(); +let counter = 0; + export function describeBuilder( builderHandler: BuilderHandlerFn, options: { name?: string; schemaPath: string }, @@ -40,10 +42,8 @@ export function describeBuilder( optionSchema, }); - // This is needed as there are multiple describe calls for the same builder. - jasmine.getEnv().configure({ forbidDuplicateNames: false }); - - describe(options.name || builderHandler.name, () => { + // The counter is needed to avoid duplicate describe names as they are not allowed. + describe((options.name || builderHandler.name) + ` (Suite: ${counter++})`, () => { beforeEach(async () => { harness.resetProjectMetadata(); diff --git a/modules/testing/builder/src/test-utils.ts b/modules/testing/builder/src/test-utils.ts index f41cb42d1ea6..63ded0215c90 100644 --- a/modules/testing/builder/src/test-utils.ts +++ b/modules/testing/builder/src/test-utils.ts @@ -36,7 +36,6 @@ export const devServerTargetSpec = { project: 'app', target: 'serve' }; export const extractI18nTargetSpec = { project: 'app', target: 'extract-i18n' }; export const karmaTargetSpec = { project: 'app', target: 'test' }; export const tslintTargetSpec = { project: 'app', target: 'lint' }; -export const protractorTargetSpec = { project: 'app-e2e', target: 'e2e' }; export async function createArchitect(workspaceRoot: Path) { const registry = new schema.CoreSchemaRegistry(); @@ -81,7 +80,7 @@ export async function browserBuild( scheduleOptions?: ScheduleOptions, ): Promise { const run = await architect.scheduleTarget(target, overrides, scheduleOptions); - const output = (await run.result) as BuilderOutput & { outputs: { path: string }[] }; + const output = await run.result; expect(output.success).toBe(true); if (!output.success) { diff --git a/package.json b/package.json index 39fba551b317..36467b1a21f9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@angular/devkit-repo", - "version": "21.2.0-next.2", + "version": "22.0.0-next.5", "private": true, "description": "Software Development Kit for Angular", "keywords": [ @@ -16,7 +16,7 @@ "test": "bazel test //packages/...", "build": "pnpm -s admin build", "build-schema": "bazel build //... --build_tag_filters schema --symlink_prefix dist-schema/", - "lint": "eslint --cache --max-warnings=0 \"**/*.@(ts|mts|cts)\"", + "lint": "eslint --cache --max-warnings=0", "templates": "pnpm -s admin templates", "validate": "pnpm -s admin validate", "postinstall": "husky", @@ -26,14 +26,14 @@ }, "repository": { "type": "git", - "url": "https://github.com/angular/angular-cli.git" + "url": "git+https://github.com/angular/angular-cli.git" }, - "packageManager": "pnpm@10.29.3", + "packageManager": "pnpm@10.33.0", "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "node": "^22.22.0 || >=24.13.1", "npm": "Please use pnpm instead of NPM to install dependencies", "yarn": "Please use pnpm instead of Yarn to install dependencies", - "pnpm": "10.29.3" + "pnpm": "10.33.0" }, "author": "Angular Authors", "license": "MIT", @@ -42,38 +42,41 @@ }, "homepage": "https://github.com/angular/angular-cli", "devDependencies": { - "@angular/animations": "21.2.0-next.3", - "@angular/cdk": "21.2.0-next.4", - "@angular/common": "21.2.0-next.3", - "@angular/compiler": "21.2.0-next.3", - "@angular/compiler-cli": "21.2.0-next.3", - "@angular/core": "21.2.0-next.3", - "@angular/forms": "21.2.0-next.3", - "@angular/localize": "21.2.0-next.3", - "@angular/material": "21.2.0-next.4", - "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#2a5e8e5b5398ae13a8d9a963ac980707313a6c9e", - "@angular/platform-browser": "21.2.0-next.3", - "@angular/platform-server": "21.2.0-next.3", - "@angular/router": "21.2.0-next.3", - "@angular/service-worker": "21.2.0-next.3", + "@angular/animations": "22.0.0-next.6", + "@angular/cdk": "22.0.0-next.3", + "@angular/common": "22.0.0-next.6", + "@angular/compiler": "22.0.0-next.6", + "@angular/compiler-cli": "22.0.0-next.6", + "@angular/core": "22.0.0-next.6", + "@angular/forms": "22.0.0-next.6", + "@angular/localize": "22.0.0-next.6", + "@angular/material": "22.0.0-next.3", + "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#1c95e84f330960eea28b5e3ed9b7a6a21b2c605b", + "@angular/platform-browser": "22.0.0-next.6", + "@angular/platform-server": "22.0.0-next.6", + "@angular/router": "22.0.0-next.6", + "@angular/service-worker": "22.0.0-next.6", "@babel/core": "7.29.0", "@bazel/bazelisk": "1.28.1", "@bazel/buildifier": "8.2.1", - "@eslint/compat": "2.0.2", - "@eslint/eslintrc": "3.3.3", - "@eslint/js": "9.39.2", + "@bazel/ibazel": "^0.28.0", + "@eslint/compat": "2.0.3", + "@eslint/eslintrc": "3.3.5", + "@eslint/js": "10.0.1", "@rollup/plugin-alias": "^6.0.0", "@rollup/plugin-commonjs": "^29.0.0", "@rollup/plugin-json": "^6.1.0", "@rollup/plugin-node-resolve": "16.0.3", + "@rollup/wasm-node": "4.60.0", "@stylistic/eslint-plugin": "^5.0.0", + "@tony.ganchev/eslint-plugin-header": "~3.3.1", "@types/babel__core": "7.20.5", "@types/babel__generator": "^7.6.8", "@types/browser-sync": "^2.27.0", "@types/express": "~5.0.1", "@types/http-proxy": "^1.17.4", "@types/ini": "^4.0.0", - "@types/jasmine": "~5.1.0", + "@types/jasmine": "~6.0.0", "@types/jasmine-reporters": "^2", "@types/karma": "^6.3.0", "@types/less": "^3.0.3", @@ -89,24 +92,23 @@ "@types/yargs": "^17.0.20", "@types/yargs-parser": "^21.0.0", "@types/yarnpkg__lockfile": "^1.1.5", - "@typescript-eslint/eslint-plugin": "8.55.0", - "@typescript-eslint/parser": "8.55.0", + "@typescript-eslint/eslint-plugin": "8.57.2", + "@typescript-eslint/parser": "8.57.2", "ajv": "8.18.0", "buffer": "6.0.3", "esbuild": "0.27.3", "esbuild-wasm": "0.27.3", - "eslint": "9.39.2", + "eslint": "10.1.0", "eslint-config-prettier": "10.1.8", - "eslint-plugin-header": "3.1.1", "eslint-plugin-import": "2.32.0", "express": "5.2.1", "fast-glob": "3.3.3", - "globals": "17.3.0", + "globals": "17.4.0", "http-proxy": "^1.18.1", "http-proxy-middleware": "3.0.5", "husky": "9.1.7", - "jasmine": "~5.13.0", - "jasmine-core": "~5.13.0", + "jasmine": "~6.1.0", + "jasmine-core": "~6.1.0", "jasmine-reporters": "^2.5.2", "jasmine-spec-reporter": "~7.0.0", "karma": "~6.4.0", @@ -118,21 +120,19 @@ "lodash": "^4.17.21", "magic-string": "0.30.21", "prettier": "^3.0.0", - "protractor": "~7.0.0", - "puppeteer": "18.2.1", + "puppeteer": "24.40.0", "quicktype-core": "23.2.6", - "rollup": "4.57.1", - "rollup-license-plugin": "~3.1.0", - "rollup-plugin-dts": "6.3.0", - "rollup-plugin-sourcemaps2": "0.5.4", + "rollup": "4.60.0", + "rollup-license-plugin": "~3.2.0", + "rollup-plugin-dts": "6.4.1", + "rollup-plugin-sourcemaps2": "0.5.6", "semver": "7.7.4", "source-map-support": "0.5.21", - "ts-node": "^10.9.1", "tslib": "2.8.1", - "typescript": "5.9.3", - "undici": "7.22.0", + "typescript": "6.0.2", + "undici": "7.24.6", "unenv": "^1.10.0", - "verdaccio": "6.2.5", + "verdaccio": "6.3.2", "verdaccio-auth-memory": "^10.0.0", "zone.js": "^0.16.0" }, @@ -146,7 +146,6 @@ }, "pnpm": { "onlyBuiltDependencies": [ - "puppeteer", "webdriver-manager" ], "overrides": { @@ -157,6 +156,11 @@ "peerDependencies": { "protobufjs": "*" } + }, + "vitest": { + "peerDependencies": { + "@vitest/coverage-v8": "*" + } } } }, diff --git a/packages/angular/build/BUILD.bazel b/packages/angular/build/BUILD.bazel index 2f74117ff850..5303f6763020 100644 --- a/packages/angular/build/BUILD.bazel +++ b/packages/angular/build/BUILD.bazel @@ -105,7 +105,6 @@ ts_project( ":node_modules/sass", ":node_modules/source-map-support", ":node_modules/tinyglobby", - ":node_modules/undici", ":node_modules/vite", ":node_modules/vitest", ":node_modules/watchpack", diff --git a/packages/angular/build/package.json b/packages/angular/build/package.json index c4d847ae5a8e..b0d4a1197d74 100644 --- a/packages/angular/build/package.json +++ b/packages/angular/build/package.json @@ -23,41 +23,40 @@ "@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", - "@vitejs/plugin-basic-ssl": "2.1.4", + "@inquirer/confirm": "6.0.10", + "@vitejs/plugin-basic-ssl": "2.3.0", "beasties": "0.4.1", "browserslist": "^4.26.0", "esbuild": "0.27.3", - "https-proxy-agent": "7.0.6", - "istanbul-lib-instrument": "6.0.3", + "https-proxy-agent": "9.0.0", "jsonc-parser": "3.3.1", - "listr2": "9.0.5", + "listr2": "10.2.1", "magic-string": "0.30.21", "mrmime": "2.0.1", "parse5-html-rewriting-stream": "8.0.0", - "picomatch": "4.0.3", + "picomatch": "4.0.4", "piscina": "5.1.4", - "rolldown": "1.0.0-rc.4", - "sass": "1.97.3", + "rolldown": "1.0.0-rc.12", + "sass": "1.98.0", "semver": "7.7.4", "source-map-support": "0.5.21", "tinyglobby": "0.2.15", - "undici": "7.22.0", "vite": "7.3.1", "watchpack": "2.5.1" }, "optionalDependencies": { - "lmdb": "3.5.1" + "lmdb": "3.5.2" }, "devDependencies": { "@angular-devkit/core": "workspace:*", "@angular/ssr": "workspace:*", - "jsdom": "28.1.0", - "less": "4.4.2", - "ng-packagr": "21.2.0-next.0", - "postcss": "8.5.6", + "istanbul-lib-instrument": "6.0.3", + "jsdom": "29.0.1", + "less": "4.6.4", + "ng-packagr": "22.0.0-next.1", + "postcss": "8.5.8", "rxjs": "7.8.2", - "vitest": "4.0.18" + "vitest": "4.1.2" }, "peerDependencies": { "@angular/compiler": "0.0.0-ANGULAR-FW-PEER-DEP", @@ -68,13 +67,14 @@ "@angular/platform-server": "0.0.0-ANGULAR-FW-PEER-DEP", "@angular/service-worker": "0.0.0-ANGULAR-FW-PEER-DEP", "@angular/ssr": "^0.0.0-PLACEHOLDER", + "istanbul-lib-instrument": "^6.0.0", "karma": "^6.4.0", "less": "^4.2.0", "ng-packagr": "0.0.0-NG-PACKAGR-PEER-DEP", "postcss": "^8.4.0", "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", "tslib": "^2.3.0", - "typescript": ">=5.9 <6.0", + "typescript": ">=5.9 <6.1", "vitest": "^4.0.8" }, "peerDependenciesMeta": { @@ -96,6 +96,9 @@ "@angular/ssr": { "optional": true }, + "istanbul-lib-instrument": { + "optional": true + }, "karma": { "optional": true }, diff --git a/packages/angular/build/src/builders/application/execute-build.ts b/packages/angular/build/src/builders/application/execute-build.ts index 0654cd965558..aaddc5b6ef7e 100644 --- a/packages/angular/build/src/builders/application/execute-build.ts +++ b/packages/angular/build/src/builders/application/execute-build.ts @@ -56,6 +56,7 @@ export async function executeBuild( verbose, colors, jsonLogs, + security, } = options; // TODO: Consider integrating into watch mode. Would require full rebuild on target changes. @@ -263,7 +264,7 @@ export async function executeBuild( if (serverEntryPoint) { executionResult.addOutputFile( SERVER_APP_ENGINE_MANIFEST_FILENAME, - generateAngularServerAppEngineManifest(i18nOptions, baseHref), + generateAngularServerAppEngineManifest(i18nOptions, security.allowedHosts, baseHref), BuildOutputFileType.ServerRoot, ); } diff --git a/packages/angular/build/src/builders/application/i18n.ts b/packages/angular/build/src/builders/application/i18n.ts index ae37efa674e4..081be50e7a9f 100644 --- a/packages/angular/build/src/builders/application/i18n.ts +++ b/packages/angular/build/src/builders/application/i18n.ts @@ -123,48 +123,48 @@ export async function inlineI18n( inlineResult.prerenderedRoutes = { ...inlineResult.prerenderedRoutes, ...generatedRoutes }; updatedOutputFiles.push(...localeOutputFiles); } - } finally { - await inliner.close(); - } - // Update the result with all localized files. - executionResult.outputFiles = [ - // Root and SSR entry files are not modified. - ...unModifiedOutputFiles, - // Updated files for each locale. - ...updatedOutputFiles, - ]; - - // Assets are only changed if not using the flat output option - if (!i18nOptions.flatOutput) { - executionResult.assetFiles = updatedAssetFiles; - } - - // Inline any template updates if present - if (executionResult.templateUpdates?.size) { - // The development server only allows a single locale but issue a warning if used programmatically (experimental) - // with multiple locales and template HMR. - if (i18nOptions.inlineLocales.size > 1) { - inlineResult.warnings.push( - `Component HMR updates can only be inlined with a single locale. The first locale will be used.`, - ); + // Update the result with all localized files. + executionResult.outputFiles = [ + // Root and SSR entry files are not modified. + ...unModifiedOutputFiles, + // Updated files for each locale. + ...updatedOutputFiles, + ]; + + // Assets are only changed if not using the flat output option + if (!i18nOptions.flatOutput) { + executionResult.assetFiles = updatedAssetFiles; } - const firstLocale = [...i18nOptions.inlineLocales][0]; - - for (const [id, content] of executionResult.templateUpdates) { - const templateUpdateResult = await inliner.inlineTemplateUpdate( - firstLocale, - i18nOptions.locales[firstLocale].translation, - content, - id, - ); - executionResult.templateUpdates.set(id, templateUpdateResult.code); - inlineResult.errors.push(...templateUpdateResult.errors); - inlineResult.warnings.push(...templateUpdateResult.warnings); + + // Inline any template updates if present + if (executionResult.templateUpdates?.size) { + // The development server only allows a single locale but issue a warning if used programmatically (experimental) + // with multiple locales and template HMR. + if (i18nOptions.inlineLocales.size > 1) { + inlineResult.warnings.push( + `Component HMR updates can only be inlined with a single locale. The first locale will be used.`, + ); + } + const firstLocale = [...i18nOptions.inlineLocales][0]; + + for (const [id, content] of executionResult.templateUpdates) { + const templateUpdateResult = await inliner.inlineTemplateUpdate( + firstLocale, + i18nOptions.locales[firstLocale].translation, + content, + id, + ); + executionResult.templateUpdates.set(id, templateUpdateResult.code); + inlineResult.errors.push(...templateUpdateResult.errors); + inlineResult.warnings.push(...templateUpdateResult.warnings); + } } - } - return inlineResult; + return inlineResult; + } finally { + await inliner.close(); + } } /** diff --git a/packages/angular/build/src/builders/application/index.ts b/packages/angular/build/src/builders/application/index.ts index b83e3b48f270..d4671decc145 100644 --- a/packages/angular/build/src/builders/application/index.ts +++ b/packages/angular/build/src/builders/application/index.ts @@ -28,8 +28,6 @@ import { import { Result, ResultKind } from './results'; import { Schema as ApplicationBuilderOptions } from './schema'; -const isNodeV22orHigher = Number(process.versions.node.split('.', 1)[0]) >= 22; - export type { ApplicationBuilderOptions }; export async function* buildApplicationInternal( @@ -222,17 +220,10 @@ export async function* buildApplication( await fs.writeFile(fullFilePath, file.contents); } else { // Copy file contents - if (isNodeV22orHigher) { - // Use newer `cp` API on Node.js 22+ (minimum v22 for CLI is 22.11) - await fs.cp(file.inputPath, fullFilePath, { - mode: fs.constants.COPYFILE_FICLONE, - preserveTimestamps: true, - }); - } else { - // For Node.js 20 use `copyFile` (`cp` is not stable for v20) - // TODO: Remove when Node.js 20 is no longer supported - await fs.copyFile(file.inputPath, fullFilePath, fs.constants.COPYFILE_FICLONE); - } + await fs.cp(file.inputPath, fullFilePath, { + mode: fs.constants.COPYFILE_FICLONE, + preserveTimestamps: true, + }); } }); diff --git a/packages/angular/build/src/builders/application/options.ts b/packages/angular/build/src/builders/application/options.ts index 83b7ea428f35..99d5d67efbfd 100644 --- a/packages/angular/build/src/builders/application/options.ts +++ b/packages/angular/build/src/builders/application/options.ts @@ -28,11 +28,11 @@ import { getProjectRootPaths, normalizeDirectoryPath } from '../../utils/project import { addTrailingSlash, joinUrlParts, stripLeadingSlash } from '../../utils/url'; import { Schema as ApplicationBuilderOptions, - ExperimentalPlatform, I18NTranslation, OutputHashing, OutputMode, OutputPathClass, + Platform, } from './schema'; /** @@ -292,11 +292,11 @@ export async function normalizeOptions( if (options.ssr === true) { ssrOptions = {}; } else if (typeof options.ssr === 'object') { - const { entry, experimentalPlatform = ExperimentalPlatform.Node } = options.ssr; + const { entry, platform = Platform.Node } = options.ssr; ssrOptions = { entry: entry && path.join(workspaceRoot, entry), - platform: experimentalPlatform, + platform, }; } @@ -400,8 +400,9 @@ export async function normalizeOptions( } } - const autoCsp = options.security?.autoCsp; + const { autoCsp, allowedHosts = [] } = options.security ?? {}; const security = { + allowedHosts, autoCsp: autoCsp ? { unsafeEval: autoCsp === true ? false : !!autoCsp.unsafeEval, diff --git a/packages/angular/build/src/builders/application/schema.json b/packages/angular/build/src/builders/application/schema.json index 8db4e6145b3f..8bf30aec8298 100644 --- a/packages/angular/build/src/builders/application/schema.json +++ b/packages/angular/build/src/builders/application/schema.json @@ -52,6 +52,14 @@ "type": "object", "additionalProperties": false, "properties": { + "allowedHosts": { + "description": "A list of hostnames that are allowed to access the server-side application. For more information, see https://angular.dev/best-practices/security#preventing-server-side-request-forgery-ssrf.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string" + } + }, "autoCsp": { "description": "Enables automatic generation of a hash-based Strict Content Security Policy (https://web.dev/articles/strict-csp#choose-hash) based on scripts in index.html. Will default to true once we are out of experimental/preview phases.", "default": false, @@ -595,8 +603,8 @@ "type": "string", "description": "The server entry-point that when executed will spawn the web server." }, - "experimentalPlatform": { - "description": "Specifies the platform for which the server bundle is generated. This affects the APIs and modules available in the server-side code. \n\n- `node`: (Default) Generates a bundle optimized for Node.js environments. \n- `neutral`: Generates a platform-neutral bundle suitable for environments like edge workers, and other serverless platforms. This option avoids using Node.js-specific APIs, making the bundle more portable. \n\nPlease note that this feature does not provide polyfills for Node.js modules. Additionally, it is experimental, and the schematics may undergo changes in future versions.", + "platform": { + "description": "Specifies the platform for which the server bundle is generated. This affects the APIs and modules available in the server-side code. \n\n- `node`: (Default) Generates a bundle optimized for Node.js environments. \n- `neutral`: Generates a platform-neutral bundle suitable for environments like edge workers, and other serverless platforms. This option avoids using Node.js-specific APIs, making the bundle more portable. \n\nPlease note that this feature does not provide polyfills for Node.js modules.", "default": "node", "enum": ["node", "neutral"] } diff --git a/packages/angular/build/src/builders/application/tests/behavior/component-stylesheets_spec.ts b/packages/angular/build/src/builders/application/tests/behavior/component-stylesheets_spec.ts index ddae750a64a4..0fb1fb22c9fa 100644 --- a/packages/angular/build/src/builders/application/tests/behavior/component-stylesheets_spec.ts +++ b/packages/angular/build/src/builders/application/tests/behavior/component-stylesheets_spec.ts @@ -64,6 +64,25 @@ describeBuilder(buildApplication, APPLICATION_BUILDER_INFO, (harness) => { ); }); + it('should generate an error when a styleUrl points to a TypeScript file', async () => { + await harness.modifyFile('src/app/app.component.ts', (content) => { + return content.replace('./app.component.css', './app.component.ts'); + }); + + harness.useTarget('build', { + ...BASE_OPTIONS, + }); + + const { result, logs } = await harness.executeOnce({ outputLogsOnFailure: false }); + expect(result?.success).toBeFalse(); + expect(logs).toContain( + jasmine.objectContaining({ + level: 'error', + message: jasmine.stringContaining(`Could not find stylesheet file './app.component.ts'`), + }), + ); + }); + it('should generate an error for a missing stylesheet with JIT', async () => { await harness.modifyFile('src/app/app.component.ts', (content) => { return content.replace('./app.component.css', './not-present.css'); diff --git a/packages/angular/build/src/builders/application/tests/behavior/rebuild-component_styles_spec.ts b/packages/angular/build/src/builders/application/tests/behavior/rebuild-component_styles_spec.ts index 26ae35a8221f..08b683439684 100644 --- a/packages/angular/build/src/builders/application/tests/behavior/rebuild-component_styles_spec.ts +++ b/packages/angular/build/src/builders/application/tests/behavior/rebuild-component_styles_spec.ts @@ -58,5 +58,85 @@ describeBuilder(buildApplication, APPLICATION_BUILDER_INFO, (harness) => { ]); }); } + + it('rebuilds component after error on rebuild from transitive import', async () => { + harness.useTarget('build', { + ...BASE_OPTIONS, + watch: true, + }); + + await harness.modifyFile('src/app/app.component.ts', (content) => + content.replace('app.component.css', 'app.component.scss'), + ); + await harness.writeFile('src/app/app.component.scss', "@import './a';"); + await harness.writeFile('src/app/a.scss', '$primary: aqua;\\nh1 { color: $primary; }'); + + await harness.executeWithCases([ + async ({ result }) => { + expect(result?.success).toBe(true); + + harness.expectFile('dist/browser/main.js').content.toContain('color: aqua'); + + // Introduce a syntax error + await harness.writeFile( + 'src/app/a.scss', + 'invalid-invalid-invalid\\nh1 { color: $primary; }', + ); + }, + async ({ result }) => { + expect(result?.success).toBe(false); + + // Fix the syntax error + await harness.writeFile('src/app/a.scss', '$primary: blue;\\nh1 { color: $primary; }'); + }, + ({ result }) => { + expect(result?.success).toBe(true); + + harness.expectFile('dist/browser/main.js').content.toContain('color: blue'); + }, + ]); + }); + + it('rebuilds component after error on rebuild from deep transitive import with partials', async () => { + harness.useTarget('build', { + ...BASE_OPTIONS, + watch: true, + }); + + await harness.modifyFile('src/app/app.component.ts', (content) => + content.replace('app.component.css', 'app.component.scss'), + ); + await harness.writeFile('src/app/app.component.scss', "@import './intermediary';"); + await harness.writeFile('src/app/_intermediary.scss', "@import './partial';"); + await harness.writeFile('src/app/_partial.scss', '$primary: aqua;\\nh1 { color: $primary; }'); + + await harness.executeWithCases([ + async ({ result }) => { + expect(result?.success).toBe(true); + + harness.expectFile('dist/browser/main.js').content.toContain('color: aqua'); + + // Introduce a syntax error deeply + await harness.writeFile( + 'src/app/_partial.scss', + 'invalid-invalid-invalid\\nh1 { color: $primary; }', + ); + }, + async ({ result }) => { + expect(result?.success).toBe(false); + + // Fix the syntax error deeply + await harness.writeFile( + 'src/app/_partial.scss', + '$primary: blue;\\nh1 { color: $primary; }', + ); + }, + ({ result }) => { + expect(result?.success).toBe(true); + + harness.expectFile('dist/browser/main.js').content.toContain('color: blue'); + }, + ]); + }); }); }); diff --git a/packages/angular/build/src/builders/application/tests/behavior/rebuild-errors_spec.ts b/packages/angular/build/src/builders/application/tests/behavior/rebuild-errors_spec.ts index fa384be88080..de53c7223fff 100644 --- a/packages/angular/build/src/builders/application/tests/behavior/rebuild-errors_spec.ts +++ b/packages/angular/build/src/builders/application/tests/behavior/rebuild-errors_spec.ts @@ -33,7 +33,7 @@ describeBuilder(buildApplication, APPLICATION_BUILDER_INFO, (harness) => { import { Directive, Input } from '@angular/core'; @Directive({ selector: 'dir', standalone: false }) export class Dir { - @Input() foo: number; + @Input() foo!: number; } `; diff --git a/packages/angular/build/src/builders/application/tests/behavior/typescript-isolated-modules_spec.ts b/packages/angular/build/src/builders/application/tests/behavior/typescript-isolated-modules_spec.ts index 06e66cbd6da9..bef97e545ad9 100644 --- a/packages/angular/build/src/builders/application/tests/behavior/typescript-isolated-modules_spec.ts +++ b/packages/angular/build/src/builders/application/tests/behavior/typescript-isolated-modules_spec.ts @@ -55,6 +55,9 @@ describeBuilder(buildApplication, APPLICATION_BUILDER_INFO, (harness) => { tsconfig.compilerOptions.isolatedModules = true; tsconfig.compilerOptions.jsx = 'react-jsx'; + // There's an implicit `any`, because we don't include the React typings. + tsconfig.compilerOptions.noImplicitAny = false; + return JSON.stringify(tsconfig); }); diff --git a/packages/angular/build/src/builders/application/tests/behavior/typescript-path-mapping_spec.ts b/packages/angular/build/src/builders/application/tests/behavior/typescript-path-mapping_spec.ts index 41539df239f2..416ee9c227bd 100644 --- a/packages/angular/build/src/builders/application/tests/behavior/typescript-path-mapping_spec.ts +++ b/packages/angular/build/src/builders/application/tests/behavior/typescript-path-mapping_spec.ts @@ -81,8 +81,9 @@ describeBuilder(buildApplication, APPLICATION_BUILDER_INFO, (harness) => { await harness.modifyFile('tsconfig.json', (content) => { const tsconfig = JSON.parse(content); tsconfig.compilerOptions.paths = { - 'app-module': ['a.js'], + 'app-module': ['./a.js'], }; + tsconfig.compilerOptions.allowJs = true; return JSON.stringify(tsconfig); }); diff --git a/packages/angular/build/src/builders/application/tests/behavior/typescript-resolve-json_spec.ts b/packages/angular/build/src/builders/application/tests/behavior/typescript-resolve-json_spec.ts index cf21d5545f7a..6ad5bbb3a9de 100644 --- a/packages/angular/build/src/builders/application/tests/behavior/typescript-resolve-json_spec.ts +++ b/packages/angular/build/src/builders/application/tests/behavior/typescript-resolve-json_spec.ts @@ -20,7 +20,8 @@ describeBuilder(buildApplication, APPLICATION_BUILDER_INFO, (harness) => { // Enable tsconfig resolveJsonModule option in tsconfig await harness.modifyFile('tsconfig.json', (content) => { const tsconfig = JSON.parse(content); - tsconfig.compilerOptions.moduleResolution = 'node'; + tsconfig.compilerOptions.moduleResolution = 'node16'; + tsconfig.compilerOptions.module = 'node16'; tsconfig.compilerOptions.resolveJsonModule = true; return JSON.stringify(tsconfig); @@ -44,7 +45,8 @@ describeBuilder(buildApplication, APPLICATION_BUILDER_INFO, (harness) => { // Enable tsconfig resolveJsonModule option in tsconfig await harness.modifyFile('tsconfig.json', (content) => { const tsconfig = JSON.parse(content); - tsconfig.compilerOptions.moduleResolution = 'node'; + tsconfig.compilerOptions.moduleResolution = 'node16'; + tsconfig.compilerOptions.module = 'node16'; tsconfig.compilerOptions.resolveJsonModule = undefined; return JSON.stringify(tsconfig); @@ -73,7 +75,8 @@ describeBuilder(buildApplication, APPLICATION_BUILDER_INFO, (harness) => { // Enable tsconfig resolveJsonModule option in tsconfig await harness.modifyFile('tsconfig.json', (content) => { const tsconfig = JSON.parse(content); - tsconfig.compilerOptions.moduleResolution = 'node'; + tsconfig.compilerOptions.moduleResolution = 'node16'; + tsconfig.compilerOptions.module = 'node16'; tsconfig.compilerOptions.resolveJsonModule = false; return JSON.stringify(tsconfig); diff --git a/packages/angular/build/src/builders/application/tests/options/allowed-common-js-dependencies_spec.ts b/packages/angular/build/src/builders/application/tests/options/allowed-common-js-dependencies_spec.ts index bcc361ccdbe1..7521b1a1a495 100644 --- a/packages/angular/build/src/builders/application/tests/options/allowed-common-js-dependencies_spec.ts +++ b/packages/angular/build/src/builders/application/tests/options/allowed-common-js-dependencies_spec.ts @@ -129,17 +129,13 @@ describeBuilder(buildApplication, APPLICATION_BUILDER_INFO, (harness) => { it('should not show warning in JIT for templateUrl and styleUrl when using paths', async () => { await harness.modifyFile('tsconfig.json', (content) => { - return content.replace( - /"baseUrl": ".\/",/, - ` - "baseUrl": "./", - "paths": { - "@app/*": [ - "src/app/*" - ] - }, - `, - ); + const tsconfig = JSON.parse(content); + tsconfig.compilerOptions ??= {}; + tsconfig.compilerOptions.paths = { + '@app/*': ['./src/app/*'], + }; + + return JSON.stringify(tsconfig, null, 2); }); await harness.modifyFile('src/app/app.module.ts', (content) => diff --git a/packages/angular/build/src/builders/application/tests/options/polyfills_spec.ts b/packages/angular/build/src/builders/application/tests/options/polyfills_spec.ts index 8b5cc3a09ab3..5fff9bd33a7c 100644 --- a/packages/angular/build/src/builders/application/tests/options/polyfills_spec.ts +++ b/packages/angular/build/src/builders/application/tests/options/polyfills_spec.ts @@ -26,6 +26,9 @@ describeBuilder(buildApplication, APPLICATION_BUILDER_INFO, (harness) => { const tsconfig = JSON.parse(content); tsconfig.compilerOptions.baseUrl = baseUrl; + // The test is specifically testing `baseUrl` which is deprecated in TS6. + tsconfig.compilerOptions.ignoreDeprecations = '6.0'; + return JSON.stringify(tsconfig); }); }); diff --git a/packages/angular/build/src/builders/dev-server/options.ts b/packages/angular/build/src/builders/dev-server/options.ts index b6da278f2936..5473da832449 100644 --- a/packages/angular/build/src/builders/dev-server/options.ts +++ b/packages/angular/build/src/builders/dev-server/options.ts @@ -86,10 +86,20 @@ export async function normalizeOptions( } } + let port = options.port ?? 4200; + // Overwrite port, if process.env.PORT is available. + if (process.env.PORT) { + const envPort = Number(process.env.PORT); + + if (!isNaN(envPort)) { + port = envPort; + logger.info(`Environment variable "PORT" detected. Using port ${envPort}.`); + } + } + // Initial options to keep const { host, - port, poll, open, verbose, @@ -111,7 +121,7 @@ export async function normalizeOptions( return { buildTarget, host: host ?? 'localhost', - port: port ?? 4200, + port, poll, open, verbose, diff --git a/packages/angular/build/src/builders/dev-server/tests/behavior/build-assets_spec.ts b/packages/angular/build/src/builders/dev-server/tests/behavior/build-assets_spec.ts index f7c7a0acb33a..7d3e1ffc414b 100644 --- a/packages/angular/build/src/builders/dev-server/tests/behavior/build-assets_spec.ts +++ b/packages/angular/build/src/builders/dev-server/tests/behavior/build-assets_spec.ts @@ -21,6 +21,26 @@ describeServeBuilder(executeDevServer, DEV_SERVER_BUILDER_INFO, (harness, setupT "import {foo} from 'unresolved'; /* a comment */const foo = `bar`;\n\n\n"; describe('Behavior: "browser builder assets"', () => { + it('serves a project extensionless asset unmodified', async () => { + await harness.writeFile('src/extensionless', javascriptFileContent); + + setupTarget(harness, { + assets: ['src/extensionless'], + optimization: { + scripts: true, + }, + }); + + harness.useTarget('serve', { + ...BASE_OPTIONS, + }); + + const { result, response } = await executeOnceAndFetch(harness, 'extensionless'); + + expect(result?.success).toBeTrue(); + expect(await response?.text()).toContain(javascriptFileContent); + }); + it('serves a project JavaScript asset unmodified', async () => { await harness.writeFile('src/extra.js', javascriptFileContent); diff --git a/packages/angular/build/src/builders/dev-server/tests/behavior/build-budgets_spec.ts b/packages/angular/build/src/builders/dev-server/tests/behavior/build-budgets_spec.ts index aee551e78b48..97a68506fcf5 100644 --- a/packages/angular/build/src/builders/dev-server/tests/behavior/build-budgets_spec.ts +++ b/packages/angular/build/src/builders/dev-server/tests/behavior/build-budgets_spec.ts @@ -11,29 +11,25 @@ import { executeDevServer } from '../../index'; import { describeServeBuilder } from '../jasmine-helpers'; import { BASE_OPTIONS, DEV_SERVER_BUILDER_INFO } from '../setup'; -describeServeBuilder( - executeDevServer, - DEV_SERVER_BUILDER_INFO, - (harness, setupTarget, isViteRun) => { - // TODO(fix-vite): currently this is broken in vite. - (isViteRun ? xdescribe : describe)('Behavior: "browser builder budgets"', () => { - beforeEach(() => { - setupTarget(harness, { - // Add a budget error for any file over 100 bytes - budgets: [{ type: BudgetType.All, maximumError: '100b' }], - optimization: true, - }); +describeServeBuilder(executeDevServer, DEV_SERVER_BUILDER_INFO, (harness, setupTarget) => { + // TODO(fix-vite): currently this is broken in vite. + xdescribe('Behavior: "browser builder budgets"', () => { + beforeEach(() => { + setupTarget(harness, { + // Add a budget error for any file over 100 bytes + budgets: [{ type: BudgetType.All, maximumError: '100b' }], + optimization: true, }); + }); - it('should ignore budgets defined in the "buildTarget" options', async () => { - harness.useTarget('serve', { - ...BASE_OPTIONS, - }); + it('should ignore budgets defined in the "buildTarget" options', async () => { + harness.useTarget('serve', { + ...BASE_OPTIONS, + }); - const { result } = await harness.executeOnce(); + const { result } = await harness.executeOnce(); - expect(result?.success).toBe(true); - }); + expect(result?.success).toBe(true); }); - }, -); + }); +}); diff --git a/packages/angular/build/src/builders/dev-server/tests/behavior/build-conditions_spec.ts b/packages/angular/build/src/builders/dev-server/tests/behavior/build-conditions_spec.ts index 2a7d59d8d574..aef1973d4a48 100644 --- a/packages/angular/build/src/builders/dev-server/tests/behavior/build-conditions_spec.ts +++ b/packages/angular/build/src/builders/dev-server/tests/behavior/build-conditions_spec.ts @@ -15,86 +15,74 @@ import { executeOnceAndFetch } from '../execute-fetch'; import { describeServeBuilder } from '../jasmine-helpers'; import { BASE_OPTIONS, DEV_SERVER_BUILDER_INFO } from '../setup'; -describeServeBuilder( - executeDevServer, - DEV_SERVER_BUILDER_INFO, - (harness, setupTarget, isApplicationBuilder) => { - describe('Behavior: "conditional imports"', () => { - if (!isApplicationBuilder) { - it('requires esbuild', () => { - expect(true).toBeTrue(); - }); - - return; - } - - beforeEach(async () => { - setupTarget(harness); +describeServeBuilder(executeDevServer, DEV_SERVER_BUILDER_INFO, (harness, setupTarget) => { + describe('Behavior: "conditional imports"', () => { + beforeEach(async () => { + setupTarget(harness); - await setupConditionImport(harness); - }); + await setupConditionImport(harness); + }); - interface ImportsTestCase { - name: string; - mapping: unknown; - output?: string; - } + interface ImportsTestCase { + name: string; + mapping: unknown; + output?: string; + } - const GOOD_TARGET = './src/good.js'; - const BAD_TARGET = './src/bad.js'; + const GOOD_TARGET = './src/good.js'; + const BAD_TARGET = './src/bad.js'; - const testCases: ImportsTestCase[] = [ - { name: 'simple string', mapping: GOOD_TARGET }, - { - name: 'default fallback without matching condition', - mapping: { - 'never': BAD_TARGET, - 'default': GOOD_TARGET, - }, + const testCases: ImportsTestCase[] = [ + { name: 'simple string', mapping: GOOD_TARGET }, + { + name: 'default fallback without matching condition', + mapping: { + 'never': BAD_TARGET, + 'default': GOOD_TARGET, }, - { - name: 'development condition', - mapping: { - 'development': GOOD_TARGET, - 'default': BAD_TARGET, - }, + }, + { + name: 'development condition', + mapping: { + 'development': GOOD_TARGET, + 'default': BAD_TARGET, }, - { - name: 'production condition', - mapping: { - 'production': BAD_TARGET, - 'default': GOOD_TARGET, - }, + }, + { + name: 'production condition', + mapping: { + 'production': BAD_TARGET, + 'default': GOOD_TARGET, }, - { - name: 'browser condition (in browser)', - mapping: { - 'browser': GOOD_TARGET, - 'default': BAD_TARGET, - }, + }, + { + name: 'browser condition (in browser)', + mapping: { + 'browser': GOOD_TARGET, + 'default': BAD_TARGET, }, - ]; + }, + ]; - for (const testCase of testCases) { - describe(testCase.name, () => { - beforeEach(async () => { - await setTargetMapping(harness, testCase.mapping); - }); + for (const testCase of testCases) { + describe(testCase.name, () => { + beforeEach(async () => { + await setTargetMapping(harness, testCase.mapping); + }); - it('resolves to expected target', async () => { - harness.useTarget('serve', { - ...BASE_OPTIONS, - }); + it('resolves to expected target', async () => { + harness.useTarget('serve', { + ...BASE_OPTIONS, + }); - const { result, response } = await executeOnceAndFetch(harness, '/main.js'); + const { result, response } = await executeOnceAndFetch(harness, '/main.js'); - expect(result?.success).toBeTrue(); - const output = await response?.text(); - expect(output).toContain('good-value'); - expect(output).not.toContain('bad-value'); - }); + expect(result?.success).toBeTrue(); + const output = await response?.text(); + expect(output).toContain('good-value'); + expect(output).not.toContain('bad-value'); }); - } - }); - }, -); + }); + } + }); +}); diff --git a/packages/angular/build/src/builders/dev-server/tests/behavior/build_translation_watch_spec.ts b/packages/angular/build/src/builders/dev-server/tests/behavior/build_translation_watch_spec.ts index b7d65e52e966..24dca8a6a5dc 100644 --- a/packages/angular/build/src/builders/dev-server/tests/behavior/build_translation_watch_spec.ts +++ b/packages/angular/build/src/builders/dev-server/tests/behavior/build_translation_watch_spec.ts @@ -12,70 +12,66 @@ import { executeDevServer } from '../../index'; import { describeServeBuilder } from '../jasmine-helpers'; import { BASE_OPTIONS, DEV_SERVER_BUILDER_INFO } from '../setup'; -describeServeBuilder( - executeDevServer, - DEV_SERVER_BUILDER_INFO, - (harness, setupTarget, isViteRun) => { - // TODO(fix-vite): currently this is broken in vite. - (isViteRun ? xdescribe : describe)('Behavior: "i18n translation file watching"', () => { - beforeEach(() => { - harness.useProject('test', { - root: '.', - sourceRoot: 'src', - cli: { - cache: { - enabled: false, - }, +describeServeBuilder(executeDevServer, DEV_SERVER_BUILDER_INFO, (harness, setupTarget) => { + // TODO(fix-vite): currently this is broken in vite. + xdescribe('Behavior: "i18n translation file watching"', () => { + beforeEach(() => { + harness.useProject('test', { + root: '.', + sourceRoot: 'src', + cli: { + cache: { + enabled: false, }, - i18n: { - locales: { - fr: 'src/locales/messages.fr.xlf', - }, + }, + i18n: { + locales: { + fr: 'src/locales/messages.fr.xlf', }, - }); - - setupTarget(harness, { localize: ['fr'] }); + }, }); - it('watches i18n translation files by default', async () => { - harness.useTarget('serve', { - ...BASE_OPTIONS, - watch: true, - }); + setupTarget(harness, { localize: ['fr'] }); + }); + + it('watches i18n translation files by default', async () => { + harness.useTarget('serve', { + ...BASE_OPTIONS, + watch: true, + }); - await harness.writeFile( - 'src/app/app.component.html', - ` + await harness.writeFile( + 'src/app/app.component.html', + `

Hello {{ title }}!

`, - ); + ); - await harness.writeFile('src/locales/messages.fr.xlf', TRANSLATION_FILE_CONTENT); + await harness.writeFile('src/locales/messages.fr.xlf', TRANSLATION_FILE_CONTENT); - await harness.executeWithCases([ - async ({ result }) => { - expect(result?.success).toBe(true); + await harness.executeWithCases([ + async ({ result }) => { + expect(result?.success).toBe(true); - const mainUrl = new URL('main.js', `${result?.baseUrl}`); - const response = await fetch(mainUrl); - expect(await response?.text()).toContain('Bonjour'); + const mainUrl = new URL('main.js', `${result?.baseUrl}`); + const response = await fetch(mainUrl); + expect(await response?.text()).toContain('Bonjour'); - await harness.modifyFile('src/locales/messages.fr.xlf', (content) => - content.replace('Bonjour', 'Salut'), - ); - }, - async ({ result }) => { - expect(result?.success).toBe(true); + await harness.modifyFile('src/locales/messages.fr.xlf', (content) => + content.replace('Bonjour', 'Salut'), + ); + }, + async ({ result }) => { + expect(result?.success).toBe(true); - const mainUrl = new URL('main.js', `${result?.baseUrl}`); - const response = await fetch(mainUrl); - expect(await response?.text()).toContain('Salut'); - }, - ]); - }); + const mainUrl = new URL('main.js', `${result?.baseUrl}`); + const response = await fetch(mainUrl); + expect(await response?.text()).toContain('Salut'); + }, + ]); }); - }, -); + }); +}); const TRANSLATION_FILE_CONTENT = ` diff --git a/packages/angular/build/src/builders/dev-server/tests/behavior/serve-live-reload-proxies_spec.ts b/packages/angular/build/src/builders/dev-server/tests/behavior/serve-live-reload-proxies_spec.ts index efdd749de258..3b7fa033aed6 100644 --- a/packages/angular/build/src/builders/dev-server/tests/behavior/serve-live-reload-proxies_spec.ts +++ b/packages/angular/build/src/builders/dev-server/tests/behavior/serve-live-reload-proxies_spec.ts @@ -133,145 +133,138 @@ async function goToPageAndWaitForWS(page: Page, url: string): Promise { await client.detach(); } -describeServeBuilder( - executeDevServer, - DEV_SERVER_BUILDER_INFO, - (harness, setupTarget, isViteRun) => { - // TODO(fix-vite): currently this is broken in vite. - (isViteRun ? xdescribe : describe)( - 'Behavior: "Dev-server builder live-reload with proxies"', - () => { - let browser: Browser; - let page: Page; +describeServeBuilder(executeDevServer, DEV_SERVER_BUILDER_INFO, (harness, setupTarget) => { + // TODO(fix-vite): currently this is broken in vite. + xdescribe('Behavior: "Dev-server builder live-reload with proxies"', () => { + let browser: Browser; + let page: Page; - const SERVE_OPTIONS = Object.freeze({ - ...BASE_OPTIONS, - hmr: false, - watch: true, - liveReload: true, - }); + const SERVE_OPTIONS = Object.freeze({ + ...BASE_OPTIONS, + hmr: false, + watch: true, + liveReload: true, + }); - beforeAll(async () => { - browser = await puppeteer.launch({ - // MacOSX users need to set the local binary manually because Chrome has lib files with - // spaces in them which Bazel does not support in runfiles - // See: https://github.com/angular/angular-cli/pull/17624 - // eslint-disable-next-line max-len - // executablePath: '/Users//git/angular-cli/node_modules/puppeteer/.local-chromium/mac-818858/chrome-mac/Chromium.app/Contents/MacOS/Chromium', - ignoreHTTPSErrors: true, - args: ['--no-sandbox', '--disable-gpu'], - }); - }); + beforeAll(async () => { + browser = await puppeteer.launch({ + // MacOSX users need to set the local binary manually because Chrome has lib files with + // spaces in them which Bazel does not support in runfiles + // See: https://github.com/angular/angular-cli/pull/17624 + // eslint-disable-next-line max-len + // executablePath: '/Users//git/angular-cli/node_modules/puppeteer/.local-chromium/mac-818858/chrome-mac/Chromium.app/Contents/MacOS/Chromium', + acceptInsecureCerts: true, + args: ['--no-sandbox', '--disable-gpu'], + }); + }); - afterAll(async () => { - await browser.close(); - }); + afterAll(async () => { + await browser.close(); + }); - beforeEach(async () => { - setupTarget(harness, { - polyfills: ['src/polyfills.ts'], - }); + beforeEach(async () => { + setupTarget(harness, { + polyfills: ['src/polyfills.ts'], + }); - page = await browser.newPage(); - }); + page = await browser.newPage(); + }); - afterEach(async () => { - await page.close(); - }); + afterEach(async () => { + await page.close(); + }); - it('works without proxy', async () => { - harness.useTarget('serve', { - ...SERVE_OPTIONS, - }); + it('works without proxy', async () => { + harness.useTarget('serve', { + ...SERVE_OPTIONS, + }); - await harness.writeFile('src/app/app.component.html', '

{{ title }}

'); + await harness.writeFile('src/app/app.component.html', '

{{ title }}

'); - await harness.executeWithCases([ - async ({ result }) => { - expect(result?.success).toBeTrue(); - if (typeof result?.baseUrl !== 'string') { - throw new Error('Expected "baseUrl" to be a string.'); - } + await harness.executeWithCases([ + async ({ result }) => { + expect(result?.success).toBeTrue(); + if (typeof result?.baseUrl !== 'string') { + throw new Error('Expected "baseUrl" to be a string.'); + } - await goToPageAndWaitForWS(page, result.baseUrl); - await harness.modifyFile('src/app/app.component.ts', (content) => - content.replace(`'app'`, `'app-live-reload'`), - ); - }, - async ({ result }) => { - expect(result?.success).toBeTrue(); - const innerText = await page.evaluate(() => document.querySelector('p').innerText); - expect(innerText).toBe('app-live-reload'); - }, - ]); - }); + await goToPageAndWaitForWS(page, result.baseUrl); + await harness.modifyFile('src/app/app.component.ts', (content) => + content.replace(`'app'`, `'app-live-reload'`), + ); + }, + async ({ result }) => { + expect(result?.success).toBeTrue(); + const innerText = await page.evaluate(() => document.querySelector('p').innerText); + expect(innerText).toBe('app-live-reload'); + }, + ]); + }); - it('works without http -> http proxy', async () => { - harness.useTarget('serve', { - ...SERVE_OPTIONS, - }); + it('works without http -> http proxy', async () => { + harness.useTarget('serve', { + ...SERVE_OPTIONS, + }); - await harness.writeFile('src/app/app.component.html', '

{{ title }}

'); + await harness.writeFile('src/app/app.component.html', '

{{ title }}

'); - let proxy: ProxyInstance | undefined; - try { - await harness.executeWithCases([ - async ({ result }) => { - expect(result?.success).toBeTrue(); - if (typeof result?.baseUrl !== 'string') { - throw new Error('Expected "baseUrl" to be a string.'); - } + let proxy: ProxyInstance | undefined; + try { + await harness.executeWithCases([ + async ({ result }) => { + expect(result?.success).toBeTrue(); + if (typeof result?.baseUrl !== 'string') { + throw new Error('Expected "baseUrl" to be a string.'); + } - proxy = await createProxy(result.baseUrl, false); - await goToPageAndWaitForWS(page, proxy.url); - await harness.modifyFile('src/app/app.component.ts', (content) => - content.replace(`'app'`, `'app-live-reload'`), - ); - }, - async ({ result }) => { - expect(result?.success).toBeTrue(); - const innerText = await page.evaluate(() => document.querySelector('p').innerText); - expect(innerText).toBe('app-live-reload'); - }, - ]); - } finally { - proxy?.server.close(); - } - }); + proxy = await createProxy(result.baseUrl, false); + await goToPageAndWaitForWS(page, proxy.url); + await harness.modifyFile('src/app/app.component.ts', (content) => + content.replace(`'app'`, `'app-live-reload'`), + ); + }, + async ({ result }) => { + expect(result?.success).toBeTrue(); + const innerText = await page.evaluate(() => document.querySelector('p').innerText); + expect(innerText).toBe('app-live-reload'); + }, + ]); + } finally { + proxy?.server.close(); + } + }); - it('works without https -> http proxy', async () => { - harness.useTarget('serve', { - ...SERVE_OPTIONS, - }); + it('works without https -> http proxy', async () => { + harness.useTarget('serve', { + ...SERVE_OPTIONS, + }); - await harness.writeFile('src/app/app.component.html', '

{{ title }}

'); + await harness.writeFile('src/app/app.component.html', '

{{ title }}

'); - let proxy: ProxyInstance | undefined; - try { - await harness.executeWithCases([ - async ({ result }) => { - expect(result?.success).toBeTrue(); - if (typeof result?.baseUrl !== 'string') { - throw new Error('Expected "baseUrl" to be a string.'); - } + let proxy: ProxyInstance | undefined; + try { + await harness.executeWithCases([ + async ({ result }) => { + expect(result?.success).toBeTrue(); + if (typeof result?.baseUrl !== 'string') { + throw new Error('Expected "baseUrl" to be a string.'); + } - proxy = await createProxy(result.baseUrl, true); - await goToPageAndWaitForWS(page, proxy.url); - await harness.modifyFile('src/app/app.component.ts', (content) => - content.replace(`'app'`, `'app-live-reload'`), - ); - }, - async ({ result }) => { - expect(result?.success).toBeTrue(); - const innerText = await page.evaluate(() => document.querySelector('p').innerText); - expect(innerText).toBe('app-live-reload'); - }, - ]); - } finally { - proxy?.server.close(); - } - }); - }, - ); - }, -); + proxy = await createProxy(result.baseUrl, true); + await goToPageAndWaitForWS(page, proxy.url); + await harness.modifyFile('src/app/app.component.ts', (content) => + content.replace(`'app'`, `'app-live-reload'`), + ); + }, + async ({ result }) => { + expect(result?.success).toBeTrue(); + const innerText = await page.evaluate(() => document.querySelector('p').innerText); + expect(innerText).toBe('app-live-reload'); + }, + ]); + } finally { + proxy?.server.close(); + } + }); + }); +}); diff --git a/packages/angular/build/src/builders/dev-server/tests/behavior/serve_service-worker_spec.ts b/packages/angular/build/src/builders/dev-server/tests/behavior/serve_service-worker_spec.ts index b3b63c3a3093..10e2cee70465 100644 --- a/packages/angular/build/src/builders/dev-server/tests/behavior/serve_service-worker_spec.ts +++ b/packages/angular/build/src/builders/dev-server/tests/behavior/serve_service-worker_spec.ts @@ -36,180 +36,174 @@ const manifest = { ], }; -describeServeBuilder( - executeDevServer, - DEV_SERVER_BUILDER_INFO, - (harness, setupTarget, isViteRun) => { - describe('Behavior: "dev-server builder serves service worker"', () => { - beforeEach(async () => { - // Application code is not needed for these tests - await harness.writeFile('src/main.ts', ''); - await harness.writeFile('src/polyfills.ts', ''); - - harness.useProject('test', { - root: '.', - sourceRoot: 'src', - cli: { - cache: { - enabled: false, - }, +describeServeBuilder(executeDevServer, DEV_SERVER_BUILDER_INFO, (harness, setupTarget) => { + describe('Behavior: "dev-server builder serves service worker"', () => { + beforeEach(async () => { + // Application code is not needed for these tests + await harness.writeFile('src/main.ts', ''); + await harness.writeFile('src/polyfills.ts', ''); + + harness.useProject('test', { + root: '.', + sourceRoot: 'src', + cli: { + cache: { + enabled: false, }, - i18n: { - sourceLocale: { - code: 'fr', - }, + }, + i18n: { + sourceLocale: { + code: 'fr', }, - }); + }, + }); + }); + + it('works with service worker', async () => { + setupTarget(harness, { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + serviceWorker: 'ngsw-config.json', + assets: ['src/favicon.ico', 'src/assets'], + styles: ['src/styles.css'], }); - it('works with service worker', async () => { - setupTarget(harness, { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - serviceWorker: (isViteRun ? 'ngsw-config.json' : true) as any, - assets: ['src/favicon.ico', 'src/assets'], - styles: ['src/styles.css'], - }); - - await harness.writeFiles({ - 'ngsw-config.json': JSON.stringify(manifest), - 'src/assets/folder-asset.txt': 'folder-asset.txt', - 'src/styles.css': `body { background: url(./spectrum.png); }`, - }); - - harness.useTarget('serve', { - ...BASE_OPTIONS, - }); - - const { result, response } = await executeOnceAndFetch(harness, '/ngsw.json'); - - expect(result?.success).toBeTrue(); - - expect(await response?.json()).toEqual( - jasmine.objectContaining({ - configVersion: 1, - index: '/index.html', - navigationUrls: [ - { positive: true, regex: '^\\/.*$' }, - { positive: false, regex: '^\\/(?:.+\\/)?[^/]*\\.[^/]*$' }, - { positive: false, regex: '^\\/(?:.+\\/)?[^/]*__[^/]*$' }, - { positive: false, regex: '^\\/(?:.+\\/)?[^/]*__[^/]*\\/.*$' }, - ], - assetGroups: [ - { - name: 'app', - installMode: 'prefetch', - updateMode: 'prefetch', - urls: ['/favicon.ico', '/index.html'], - cacheQueryOptions: { - ignoreVary: true, - }, - patterns: [], + await harness.writeFiles({ + 'ngsw-config.json': JSON.stringify(manifest), + 'src/assets/folder-asset.txt': 'folder-asset.txt', + 'src/styles.css': `body { background: url(./spectrum.png); }`, + }); + + harness.useTarget('serve', { + ...BASE_OPTIONS, + }); + + const { result, response } = await executeOnceAndFetch(harness, '/ngsw.json'); + + expect(result?.success).toBeTrue(); + + expect(await response?.json()).toEqual( + jasmine.objectContaining({ + configVersion: 1, + index: '/index.html', + navigationUrls: [ + { positive: true, regex: '^\\/.*$' }, + { positive: false, regex: '^\\/(?:.+\\/)?[^/]*\\.[^/]*$' }, + { positive: false, regex: '^\\/(?:.+\\/)?[^/]*__[^/]*$' }, + { positive: false, regex: '^\\/(?:.+\\/)?[^/]*__[^/]*\\/.*$' }, + ], + assetGroups: [ + { + name: 'app', + installMode: 'prefetch', + updateMode: 'prefetch', + urls: ['/favicon.ico', '/index.html'], + cacheQueryOptions: { + ignoreVary: true, }, - { - name: 'assets', - installMode: 'lazy', - updateMode: 'prefetch', - urls: ['/assets/folder-asset.txt', '/media/spectrum.png'], - cacheQueryOptions: { - ignoreVary: true, - }, - patterns: [], + patterns: [], + }, + { + name: 'assets', + installMode: 'lazy', + updateMode: 'prefetch', + urls: ['/assets/folder-asset.txt', '/media/spectrum.png'], + cacheQueryOptions: { + ignoreVary: true, }, - ], - dataGroups: [], - hashTable: { - '/favicon.ico': '84161b857f5c547e3699ddfbffc6d8d737542e01', - '/assets/folder-asset.txt': '617f202968a6a81050aa617c2e28e1dca11ce8d4', - '/index.html': isViteRun - ? 'e5b73e6798d2782bf59dd5272d254d5bde364695' - : '9d232e3e13b4605d197037224a2a6303dd337480', - '/media/spectrum.png': '8d048ece46c0f3af4b598a95fd8e4709b631c3c0', + patterns: [], }, - }), - ); + ], + dataGroups: [], + hashTable: { + '/favicon.ico': '84161b857f5c547e3699ddfbffc6d8d737542e01', + '/assets/folder-asset.txt': '617f202968a6a81050aa617c2e28e1dca11ce8d4', + '/index.html': 'e5b73e6798d2782bf59dd5272d254d5bde364695', + '/media/spectrum.png': '8d048ece46c0f3af4b598a95fd8e4709b631c3c0', + }, + }), + ); + }); + + it('works with localize', async () => { + setupTarget(harness, { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + serviceWorker: 'ngsw-config.json' as any, + assets: ['src/favicon.ico', 'src/assets'], + styles: ['src/styles.css'], + localize: ['fr'], }); - it('works with localize', async () => { - setupTarget(harness, { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - serviceWorker: (isViteRun ? 'ngsw-config.json' : true) as any, - assets: ['src/favicon.ico', 'src/assets'], - styles: ['src/styles.css'], - localize: ['fr'], - }); + await harness.writeFiles({ + 'ngsw-config.json': JSON.stringify(manifest), + 'src/assets/folder-asset.txt': 'folder-asset.txt', + 'src/styles.css': `body { background: url(./spectrum.png); }`, + }); + + harness.useTarget('serve', { + ...BASE_OPTIONS, + }); - await harness.writeFiles({ - 'ngsw-config.json': JSON.stringify(manifest), - 'src/assets/folder-asset.txt': 'folder-asset.txt', - 'src/styles.css': `body { background: url(./spectrum.png); }`, - }); + const { result, response } = await executeOnceAndFetch(harness, '/ngsw.json'); - harness.useTarget('serve', { - ...BASE_OPTIONS, - }); + expect(result?.success).toBeTrue(); - const { result, response } = await executeOnceAndFetch(harness, '/ngsw.json'); + expect(await response?.json()).toBeDefined(); + }); - expect(result?.success).toBeTrue(); + // TODO(fix-vite): currently this is broken in vite due to watcher never terminates. + xit('works in watch mode', async () => { + setupTarget(harness, { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + serviceWorker: 'ngsw-config.json' as any, + assets: ['src/favicon.ico', 'src/assets'], + styles: ['src/styles.css'], + }); - expect(await response?.json()).toBeDefined(); + await harness.writeFiles({ + 'ngsw-config.json': JSON.stringify(manifest), + 'src/assets/folder-asset.txt': 'folder-asset.txt', + 'src/styles.css': `body { background: url(./spectrum.png); }`, }); - // TODO(fix-vite): currently this is broken in vite due to watcher never terminates. - (isViteRun ? xit : it)('works in watch mode', async () => { - setupTarget(harness, { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - serviceWorker: (isViteRun ? 'ngsw-config.json' : true) as any, - assets: ['src/favicon.ico', 'src/assets'], - styles: ['src/styles.css'], - }); - - await harness.writeFiles({ - 'ngsw-config.json': JSON.stringify(manifest), - 'src/assets/folder-asset.txt': 'folder-asset.txt', - 'src/styles.css': `body { background: url(./spectrum.png); }`, - }); - - harness.useTarget('serve', { - ...BASE_OPTIONS, - watch: true, - }); - - await harness.executeWithCases([ - async ({ result }) => { - expect(result?.success).toBeTrue(); - const response = await fetch(new URL('ngsw.json', `${result?.baseUrl}`)); - const { hashTable } = (await response.json()) as { hashTable: object }; - const hashTableEntries = Object.keys(hashTable); - - expect(hashTableEntries).toEqual([ - '/assets/folder-asset.txt', - '/favicon.ico', - '/index.html', - '/media/spectrum.png', - ]); - - await harness.writeFile( - 'src/assets/folder-new-asset.txt', - harness.readFile('src/assets/folder-asset.txt'), - ); - }, - async ({ result }) => { - expect(result?.success).toBeTrue(); - const response = await fetch(new URL('ngsw.json', `${result?.baseUrl}`)); - const { hashTable } = (await response.json()) as { hashTable: object }; - const hashTableEntries = Object.keys(hashTable); - - expect(hashTableEntries).toEqual([ - '/assets/folder-asset.txt', - '/assets/folder-new-asset.txt', - '/favicon.ico', - '/index.html', - '/media/spectrum.png', - ]); - }, - ]); + harness.useTarget('serve', { + ...BASE_OPTIONS, + watch: true, }); + + await harness.executeWithCases([ + async ({ result }) => { + expect(result?.success).toBeTrue(); + const response = await fetch(new URL('ngsw.json', `${result?.baseUrl}`)); + const { hashTable } = (await response.json()) as { hashTable: object }; + const hashTableEntries = Object.keys(hashTable); + + expect(hashTableEntries).toEqual([ + '/assets/folder-asset.txt', + '/favicon.ico', + '/index.html', + '/media/spectrum.png', + ]); + + await harness.writeFile( + 'src/assets/folder-new-asset.txt', + harness.readFile('src/assets/folder-asset.txt'), + ); + }, + async ({ result }) => { + expect(result?.success).toBeTrue(); + const response = await fetch(new URL('ngsw.json', `${result?.baseUrl}`)); + const { hashTable } = (await response.json()) as { hashTable: object }; + const hashTableEntries = Object.keys(hashTable); + + expect(hashTableEntries).toEqual([ + '/assets/folder-asset.txt', + '/assets/folder-new-asset.txt', + '/favicon.ico', + '/index.html', + '/media/spectrum.png', + ]); + }, + ]); }); - }, -); + }); +}); diff --git a/packages/angular/build/src/builders/dev-server/tests/jasmine-helpers.ts b/packages/angular/build/src/builders/dev-server/tests/jasmine-helpers.ts index c5a73446cf5a..0781b3d875a7 100644 --- a/packages/angular/build/src/builders/dev-server/tests/jasmine-helpers.ts +++ b/packages/angular/build/src/builders/dev-server/tests/jasmine-helpers.ts @@ -12,6 +12,7 @@ import { readFileSync } from 'node:fs'; import { JasmineBuilderHarness, host, setupApplicationTarget } from './setup'; const optionSchemaCache = new Map(); +let counter = 0; export function describeServeBuilder( builderHandler: BuilderHandlerFn, @@ -19,7 +20,6 @@ export function describeServeBuilder( specDefinitions: ( harness: JasmineBuilderHarness, setupTarget: typeof setupApplicationTarget, - isViteRun: true, ) => void, ): void { let optionSchema = optionSchemaCache.get(options.schemaPath); @@ -32,10 +32,11 @@ export function describeServeBuilder( optionSchema, }); - describe(options.name || builderHandler.name, () => { + // The counter is needed to avoid duplicate describe names as they are not allowed. + describe((options.name || builderHandler.name) + ` (${counter++})`, () => { beforeEach(() => host.initialize().toPromise()); afterEach(() => host.restore().toPromise()); - specDefinitions(harness, setupApplicationTarget, true); + specDefinitions(harness, setupApplicationTarget); }); } diff --git a/packages/angular/build/src/builders/dev-server/tests/options/port_spec.ts b/packages/angular/build/src/builders/dev-server/tests/options/port_spec.ts index 83f3a4d1486b..d3e860023bde 100644 --- a/packages/angular/build/src/builders/dev-server/tests/options/port_spec.ts +++ b/packages/angular/build/src/builders/dev-server/tests/options/port_spec.ts @@ -26,87 +26,77 @@ function getResultPort(result: Record | undefined): string | un } } -describeServeBuilder( - executeDevServer, - DEV_SERVER_BUILDER_INFO, - (harness, setupTarget, isViteRun) => { - describe('option: "port"', () => { - beforeEach(async () => { - setupTarget(harness); - - // Application code is not needed for these tests - await harness.writeFile('src/main.ts', ''); - }); +describeServeBuilder(executeDevServer, DEV_SERVER_BUILDER_INFO, (harness, setupTarget) => { + describe('option: "port"', () => { + beforeEach(async () => { + setupTarget(harness); - it('uses default port (4200) when not present', async () => { - harness.useTarget('serve', { - ...BASE_OPTIONS, - // Base options set port to zero - port: undefined, - }); + // Application code is not needed for these tests + await harness.writeFile('src/main.ts', ''); + }); - const { result, response, logs } = await executeOnceAndFetch(harness, '/'); + it('uses default port (4200) when not present', async () => { + harness.useTarget('serve', { + ...BASE_OPTIONS, + // Base options set port to zero + port: undefined, + }); - expect(result?.success).toBeTrue(); - expect(getResultPort(result)).toBe('4200'); - expect(await response?.text()).toContain(''); + const { result, response } = await executeOnceAndFetch(harness, '/'); - if (!isViteRun) { - expect(logs).toContain( - jasmine.objectContaining({ - message: jasmine.stringMatching(/:4200/), - }), - ); - } + expect(result?.success).toBeTrue(); + expect(getResultPort(result)).toBe('4200'); + expect(await response?.text()).toContain('<title>'); + }); + + it('uses a random free port when set to 0 (zero)', async () => { + harness.useTarget('serve', { + ...BASE_OPTIONS, + port: 0, }); - it('uses a random free port when set to 0 (zero)', async () => { - harness.useTarget('serve', { - ...BASE_OPTIONS, - port: 0, - }); + const { result, response } = await executeOnceAndFetch(harness, '/'); - const { result, response, logs } = await executeOnceAndFetch(harness, '/'); + expect(result?.success).toBeTrue(); + const port = getResultPort(result); + expect(port).not.toBe('4200'); + // Should not be default Vite port either + expect(port).not.toBe('5173'); - expect(result?.success).toBeTrue(); - const port = getResultPort(result); - expect(port).not.toBe('4200'); - if (isViteRun) { - // Should not be default Vite port either - expect(port).not.toBe('5173'); - } - - expect(port).toMatch(/\d{4,6}/); - expect(await response?.text()).toContain('<title>'); + expect(port).toMatch(/\d{4,6}/); + expect(await response?.text()).toContain('<title>'); + }); - if (!isViteRun) { - expect(logs).toContain( - jasmine.objectContaining({ - message: jasmine.stringMatching(':' + port), - }), - ); - } + it('uses specific port when a non-zero number is specified', async () => { + harness.useTarget('serve', { + ...BASE_OPTIONS, + port: 8000, }); - it('uses specific port when a non-zero number is specified', async () => { + const { result, response } = await executeOnceAndFetch(harness, '/'); + + expect(result?.success).toBeTrue(); + expect(getResultPort(result)).toBe('8000'); + expect(await response?.text()).toContain('<title>'); + }); + + it('should be overwritten by process.env.PORT if it exists', async () => { + try { harness.useTarget('serve', { ...BASE_OPTIONS, port: 8000, }); - const { result, response, logs } = await executeOnceAndFetch(harness, '/'); + process.env.PORT = '4201'; + + const { result, response } = await executeOnceAndFetch(harness, '/'); expect(result?.success).toBeTrue(); - expect(getResultPort(result)).toBe('8000'); + expect(getResultPort(result)).toBe('4201'); expect(await response?.text()).toContain('<title>'); - if (!isViteRun) { - expect(logs).toContain( - jasmine.objectContaining({ - message: jasmine.stringMatching(':8000'), - }), - ); - } - }); + } finally { + delete process.env.PORT; + } }); - }, -); + }); +}); diff --git a/packages/angular/build/src/builders/dev-server/tests/options/prebundle_spec.ts b/packages/angular/build/src/builders/dev-server/tests/options/prebundle_spec.ts index 1e7c5fcd7322..80bab96d3bb8 100644 --- a/packages/angular/build/src/builders/dev-server/tests/options/prebundle_spec.ts +++ b/packages/angular/build/src/builders/dev-server/tests/options/prebundle_spec.ts @@ -12,88 +12,84 @@ import { describeServeBuilder } from '../jasmine-helpers'; import { BASE_OPTIONS, DEV_SERVER_BUILDER_INFO } from '../setup'; // TODO: Temporarily disabled pending investigation into test-only Vite not stopping when caching is enabled -describeServeBuilder( - executeDevServer, - DEV_SERVER_BUILDER_INFO, - (harness, setupTarget, isViteRun) => { - // prebundling is not available in webpack - (isViteRun ? xdescribe : xdescribe)('option: "prebundle"', () => { - beforeEach(async () => { - setupTarget(harness); - - harness.useProject('test', { - cli: { - cache: { - enabled: true, - }, +describeServeBuilder(executeDevServer, DEV_SERVER_BUILDER_INFO, (harness, setupTarget) => { + // prebundling is not available in webpack + xdescribe('option: "prebundle"', () => { + beforeEach(async () => { + setupTarget(harness); + + harness.useProject('test', { + cli: { + cache: { + enabled: true, }, - }); + }, + }); - // Application code is not needed for these tests - await harness.writeFile( - 'src/main.ts', - ` + // Application code is not needed for these tests + await harness.writeFile( + 'src/main.ts', + ` import { VERSION as coreVersion } from '@angular/core'; import { VERSION as platformVersion } from '@angular/platform-browser'; console.log(coreVersion); console.log(platformVersion); `, - ); + ); + }); + + it('should prebundle dependencies when option is not present', async () => { + harness.useTarget('serve', { + ...BASE_OPTIONS, }); - it('should prebundle dependencies when option is not present', async () => { - harness.useTarget('serve', { - ...BASE_OPTIONS, - }); + const { result, content } = await executeOnceAndFetch(harness, '/main.js'); - const { result, content } = await executeOnceAndFetch(harness, '/main.js'); + expect(result?.success).toBeTrue(); + expect(content).toContain('vite/deps/@angular_core.js'); + expect(content).not.toContain('node_modules/@angular/core/'); + }); - expect(result?.success).toBeTrue(); - expect(content).toContain('vite/deps/@angular_core.js'); - expect(content).not.toContain('node_modules/@angular/core/'); + it('should prebundle dependencies when option is set to true', async () => { + harness.useTarget('serve', { + ...BASE_OPTIONS, + prebundle: true, }); - it('should prebundle dependencies when option is set to true', async () => { - harness.useTarget('serve', { - ...BASE_OPTIONS, - prebundle: true, - }); + const { result, content } = await executeOnceAndFetch(harness, '/main.js'); - const { result, content } = await executeOnceAndFetch(harness, '/main.js'); + expect(result?.success).toBeTrue(); + expect(content).toContain('vite/deps/@angular_core.js'); + expect(content).not.toContain('node_modules/@angular/core/'); + }); - expect(result?.success).toBeTrue(); - expect(content).toContain('vite/deps/@angular_core.js'); - expect(content).not.toContain('node_modules/@angular/core/'); + it('should not prebundle dependencies when option is set to false', async () => { + harness.useTarget('serve', { + ...BASE_OPTIONS, + prebundle: false, }); - it('should not prebundle dependencies when option is set to false', async () => { - harness.useTarget('serve', { - ...BASE_OPTIONS, - prebundle: false, - }); + const { result, content } = await executeOnceAndFetch(harness, '/main.js'); - const { result, content } = await executeOnceAndFetch(harness, '/main.js'); + expect(result?.success).toBeTrue(); + expect(content).not.toContain('vite/deps/@angular_core.js'); + expect(content).toContain('node_modules/@angular/core/'); + }); - expect(result?.success).toBeTrue(); - expect(content).not.toContain('vite/deps/@angular_core.js'); - expect(content).toContain('node_modules/@angular/core/'); + it('should not prebundle specified dependency if added to exclude list', async () => { + harness.useTarget('serve', { + ...BASE_OPTIONS, + prebundle: { exclude: ['@angular/platform-browser'] }, }); - it('should not prebundle specified dependency if added to exclude list', async () => { - harness.useTarget('serve', { - ...BASE_OPTIONS, - prebundle: { exclude: ['@angular/platform-browser'] }, - }); + const { result, content } = await executeOnceAndFetch(harness, '/main.js'); - const { result, content } = await executeOnceAndFetch(harness, '/main.js'); - - expect(result?.success).toBeTrue(); - expect(content).toContain('vite/deps/@angular_core.js'); - expect(content).not.toContain('node_modules/@angular/core/'); - expect(content).not.toContain('vite/deps/@angular_platform-browser.js'); - expect(content).toContain('node_modules/@angular/platform-browser/'); - }); + expect(result?.success).toBeTrue(); + expect(content).toContain('vite/deps/@angular_core.js'); + expect(content).not.toContain('node_modules/@angular/core/'); + expect(content).not.toContain('vite/deps/@angular_platform-browser.js'); + expect(content).toContain('node_modules/@angular/platform-browser/'); }); - }, -); + }); +}); diff --git a/packages/angular/build/src/builders/dev-server/tests/options/proxy-config_spec.ts b/packages/angular/build/src/builders/dev-server/tests/options/proxy-config_spec.ts index 78f3323b97cc..1c6dfb60ca9d 100644 --- a/packages/angular/build/src/builders/dev-server/tests/options/proxy-config_spec.ts +++ b/packages/angular/build/src/builders/dev-server/tests/options/proxy-config_spec.ts @@ -12,7 +12,7 @@ import { executeOnceAndFetch } from '../execute-fetch'; import { describeServeBuilder } from '../jasmine-helpers'; import { BASE_OPTIONS, DEV_SERVER_BUILDER_INFO, BuilderHarness } from '../setup'; -describeServeBuilder(executeDevServer, DEV_SERVER_BUILDER_INFO, (harness, setupTarget, isVite) => { +describeServeBuilder(executeDevServer, DEV_SERVER_BUILDER_INFO, (harness, setupTarget) => { describe('option: "proxyConfig"', () => { beforeEach(async () => { setupTarget(harness); @@ -236,14 +236,51 @@ describeServeBuilder(executeDevServer, DEV_SERVER_BUILDER_INFO, (harness, setupT } }); - /** - * **************************************************************************************************** - * ********************************** Below only Vite specific tests ********************************** - * **************************************************************************************************** - */ - if (isVite) { - viteOnlyTests(harness); - } + it('proxies support regexp as context', async () => { + harness.useTarget('serve', { + ...BASE_OPTIONS, + proxyConfig: 'proxy.config.json', + }); + + const proxyServer = await createProxyServer(); + try { + await harness.writeFiles({ + 'proxy.config.json': ` + { "^/api/.*": { "target": "http://127.0.0.1:${proxyServer.address.port}" } } + `, + }); + + const { result, response } = await executeOnceAndFetch(harness, '/api/test'); + + expect(result?.success).toBeTrue(); + expect(await response?.text()).toContain('TEST_API_RETURN'); + } finally { + await proxyServer.close(); + } + }); + + it('proxies support negated regexp as context', async () => { + harness.useTarget('serve', { + ...BASE_OPTIONS, + proxyConfig: 'proxy.config.json', + }); + + const proxyServer = await createProxyServer(); + try { + await harness.writeFiles({ + 'proxy.config.json': ` + { "^\\/(?!something).*": { "target": "http://127.0.0.1:${proxyServer.address.port}" } } + `, + }); + + const { result, response } = await executeOnceAndFetch(harness, '/api/test'); + + expect(result?.success).toBeTrue(); + expect(await response?.text()).toContain('TEST_API_RETURN'); + } finally { + await proxyServer.close(); + } + }); }); }); @@ -270,54 +307,3 @@ async function createProxyServer() { close: () => new Promise<void>((resolve) => proxyServer.close(() => resolve())), }; } - -/** - * Vite specific tests - */ -function viteOnlyTests(harness: BuilderHarness<unknown>): void { - it('proxies support regexp as context', async () => { - harness.useTarget('serve', { - ...BASE_OPTIONS, - proxyConfig: 'proxy.config.json', - }); - - const proxyServer = await createProxyServer(); - try { - await harness.writeFiles({ - 'proxy.config.json': ` - { "^/api/.*": { "target": "http://127.0.0.1:${proxyServer.address.port}" } } - `, - }); - - const { result, response } = await executeOnceAndFetch(harness, '/api/test'); - - expect(result?.success).toBeTrue(); - expect(await response?.text()).toContain('TEST_API_RETURN'); - } finally { - await proxyServer.close(); - } - }); - - it('proxies support negated regexp as context', async () => { - harness.useTarget('serve', { - ...BASE_OPTIONS, - proxyConfig: 'proxy.config.json', - }); - - const proxyServer = await createProxyServer(); - try { - await harness.writeFiles({ - 'proxy.config.json': ` - { "^\\/(?!something).*": { "target": "http://127.0.0.1:${proxyServer.address.port}" } } - `, - }); - - const { result, response } = await executeOnceAndFetch(harness, '/api/test'); - - expect(result?.success).toBeTrue(); - expect(await response?.text()).toContain('TEST_API_RETURN'); - } finally { - await proxyServer.close(); - } - }); -} diff --git a/packages/angular/build/src/builders/dev-server/tests/options/serve-path_spec.ts b/packages/angular/build/src/builders/dev-server/tests/options/serve-path_spec.ts index 7570175c65d2..5917dcc8eeb4 100644 --- a/packages/angular/build/src/builders/dev-server/tests/options/serve-path_spec.ts +++ b/packages/angular/build/src/builders/dev-server/tests/options/serve-path_spec.ts @@ -12,109 +12,105 @@ import { executeOnceAndFetch } from '../execute-fetch'; import { describeServeBuilder } from '../jasmine-helpers'; import { BASE_OPTIONS, DEV_SERVER_BUILDER_INFO } from '../setup'; -describeServeBuilder( - executeDevServer, - DEV_SERVER_BUILDER_INFO, - (harness, setupTarget, isViteRun) => { - describe('option: "servePath"', () => { - beforeEach(async () => { - setupTarget(harness, { - assets: ['src/assets'], - }); - - // Application code is not needed for these tests - await harness.writeFile('src/main.ts', 'console.log("foo");'); +describeServeBuilder(executeDevServer, DEV_SERVER_BUILDER_INFO, (harness, setupTarget) => { + describe('option: "servePath"', () => { + beforeEach(async () => { + setupTarget(harness, { + assets: ['src/assets'], }); - it('serves application at the root when option is not present', async () => { - harness.useTarget('serve', { - ...BASE_OPTIONS, - }); - - const { result, response } = await executeOnceAndFetch(harness, '/main.js'); + // Application code is not needed for these tests + await harness.writeFile('src/main.ts', 'console.log("foo");'); + }); - expect(result?.success).toBeTrue(); - const baseUrl = new URL(`${result?.baseUrl}`); - expect(baseUrl.pathname).toBe('/'); - expect(await response?.text()).toContain('console.log'); + it('serves application at the root when option is not present', async () => { + harness.useTarget('serve', { + ...BASE_OPTIONS, }); - it('serves application at specified path when option is used', async () => { - harness.useTarget('serve', { - ...BASE_OPTIONS, - servePath: 'test', - }); + const { result, response } = await executeOnceAndFetch(harness, '/main.js'); - const { result, response } = await executeOnceAndFetch(harness, '/test/main.js'); + expect(result?.success).toBeTrue(); + const baseUrl = new URL(`${result?.baseUrl}`); + expect(baseUrl.pathname).toBe('/'); + expect(await response?.text()).toContain('console.log'); + }); - expect(result?.success).toBeTrue(); - const baseUrl = new URL(`${result?.baseUrl}/`); - expect(baseUrl.pathname).toBe('/test/'); - expect(await response?.text()).toContain('console.log'); + it('serves application at specified path when option is used', async () => { + harness.useTarget('serve', { + ...BASE_OPTIONS, + servePath: 'test', }); - // TODO(fix-vite): currently this is broken in vite. - (isViteRun ? xit : it)('does not rewrite from root when option is used', async () => { - harness.useTarget('serve', { - ...BASE_OPTIONS, - servePath: 'test', - }); + const { result, response } = await executeOnceAndFetch(harness, '/test/main.js'); - const { result, response } = await executeOnceAndFetch(harness, '/', { - // fallback processing requires an accept header - request: { headers: { accept: 'text/html' } }, - }); + expect(result?.success).toBeTrue(); + const baseUrl = new URL(`${result?.baseUrl}/`); + expect(baseUrl.pathname).toBe('/test/'); + expect(await response?.text()).toContain('console.log'); + }); - expect(result?.success).toBeTrue(); - expect(response?.status).toBe(404); + // TODO(fix-vite): currently this is broken in vite. + xit('does not rewrite from root when option is used', async () => { + harness.useTarget('serve', { + ...BASE_OPTIONS, + servePath: 'test', }); - it('does not rewrite from path outside serve path when option is used', async () => { - harness.useTarget('serve', { - ...BASE_OPTIONS, - servePath: 'test', - }); + const { result, response } = await executeOnceAndFetch(harness, '/', { + // fallback processing requires an accept header + request: { headers: { accept: 'text/html' } }, + }); - const { result, response } = await executeOnceAndFetch(harness, '/api/', { - // fallback processing requires an accept header - request: { headers: { accept: 'text/html' } }, - }); + expect(result?.success).toBeTrue(); + expect(response?.status).toBe(404); + }); - expect(result?.success).toBeTrue(); - expect(response?.status).toBe(404); + it('does not rewrite from path outside serve path when option is used', async () => { + harness.useTarget('serve', { + ...BASE_OPTIONS, + servePath: 'test', }); - it('rewrites from path inside serve path when option is used', async () => { - harness.useTarget('serve', { - ...BASE_OPTIONS, - servePath: 'test', - }); + const { result, response } = await executeOnceAndFetch(harness, '/api/', { + // fallback processing requires an accept header + request: { headers: { accept: 'text/html' } }, + }); - const { result, response } = await executeOnceAndFetch(harness, '/test/inside', { - // fallback processing requires an accept header - request: { headers: { accept: 'text/html' } }, - }); + expect(result?.success).toBeTrue(); + expect(response?.status).toBe(404); + }); + + it('rewrites from path inside serve path when option is used', async () => { + harness.useTarget('serve', { + ...BASE_OPTIONS, + servePath: 'test', + }); - expect(result?.success).toBeTrue(); - expect(await response?.text()).toContain('<title>'); + const { result, response } = await executeOnceAndFetch(harness, '/test/inside', { + // fallback processing requires an accept header + request: { headers: { accept: 'text/html' } }, }); - it('serves assets at specified path when option is used', async () => { - await harness.writeFile('src/assets/test.txt', 'hello world!'); + expect(result?.success).toBeTrue(); + expect(await response?.text()).toContain('<title>'); + }); - harness.useTarget('serve', { - ...BASE_OPTIONS, - servePath: 'test', - }); + it('serves assets at specified path when option is used', async () => { + await harness.writeFile('src/assets/test.txt', 'hello world!'); - const { result, response } = await executeOnceAndFetch(harness, '/test/assets/test.txt', { - // fallback processing requires an accept header - request: { headers: { accept: 'text/html' } }, - }); + harness.useTarget('serve', { + ...BASE_OPTIONS, + servePath: 'test', + }); - expect(result?.success).toBeTrue(); - expect(await response?.text()).toContain('hello world'); + const { result, response } = await executeOnceAndFetch(harness, '/test/assets/test.txt', { + // fallback processing requires an accept header + request: { headers: { accept: 'text/html' } }, }); + + expect(result?.success).toBeTrue(); + expect(await response?.text()).toContain('hello world'); }); - }, -); + }); +}); diff --git a/packages/angular/build/src/builders/dev-server/vite/index.ts b/packages/angular/build/src/builders/dev-server/vite/index.ts index 8129daac1ba1..557b2d34b52a 100644 --- a/packages/angular/build/src/builders/dev-server/vite/index.ts +++ b/packages/angular/build/src/builders/dev-server/vite/index.ts @@ -9,7 +9,6 @@ import type { BuilderContext } from '@angular-devkit/architect'; import type { Plugin } from 'esbuild'; import assert from 'node:assert'; -import { builtinModules, isBuiltin } from 'node:module'; import { join } from 'node:path'; import type { Connect, ViteDevServer } from 'vite'; import type { ComponentStyleRecord } from '../../../tools/vite/middlewares'; @@ -21,7 +20,6 @@ import { Result, ResultKind } from '../../application/results'; import { OutputHashing } from '../../application/schema'; import { type ApplicationBuilderInternalOptions, - type ExternalResultMetadata, JavaScriptTransformer, getSupportedBrowsers, isZonelessApp, @@ -99,8 +97,20 @@ export async function* serveWithVite( browserOptions.ssr ||= true; } - // Disable auto CSP. + // Vite allowedHost syntax doesn't allow `*.` but `.` acts as `*.` + // Angular SSR supports `*.`. + const allowedHosts = Array.isArray(serverOptions.allowedHosts) + ? serverOptions.allowedHosts.map((host) => (host[0] === '.' ? '*' + host : host)) + : serverOptions.allowedHosts === true + ? ['*'] + : []; + + // Always allow the dev server host + allowedHosts.push(serverOptions.host); + browserOptions.security = { + allowedHosts, + // Disable auto CSP. autoCsp: false, }; diff --git a/packages/angular/build/src/builders/karma/find-tests_spec.ts b/packages/angular/build/src/builders/karma/find-tests_spec.ts deleted file mode 100644 index 88c97c8575fe..000000000000 --- a/packages/angular/build/src/builders/karma/find-tests_spec.ts +++ /dev/null @@ -1,97 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import { getTestEntrypoints } from './find-tests'; - -const UNIX_ENTRYPOINTS_OPTIONS = { - pathSeparator: '/', - workspaceRoot: '/my/workspace/root', - projectSourceRoot: '/my/workspace/root/src-root', -}; - -const WINDOWS_ENTRYPOINTS_OPTIONS = { - pathSeparator: '\\', - workspaceRoot: 'C:\\my\\workspace\\root', - projectSourceRoot: 'C:\\my\\workspace\\root\\src-root', -}; - -describe('getTestEntrypoints', () => { - for (const options of [UNIX_ENTRYPOINTS_OPTIONS, WINDOWS_ENTRYPOINTS_OPTIONS]) { - describe(`with path separator "${options.pathSeparator}"`, () => { - function joinWithSeparator(base: string, rel: string) { - return `${base}${options.pathSeparator}${rel.replace(/\//g, options.pathSeparator)}`; - } - - function getEntrypoints(workspaceRelative: string[], sourceRootRelative: string[] = []) { - return getTestEntrypoints( - [ - ...workspaceRelative.map((p) => joinWithSeparator(options.workspaceRoot, p)), - ...sourceRootRelative.map((p) => joinWithSeparator(options.projectSourceRoot, p)), - ], - options, - ); - } - - it('returns an empty map without test files', () => { - expect(getEntrypoints([])).toEqual(new Map()); - }); - - it('strips workspace root and/or project source root', () => { - expect(getEntrypoints(['a/b.spec.js'], ['c/d.spec.js'])).toEqual( - new Map<string, string>([ - ['spec-a-b.spec', joinWithSeparator(options.workspaceRoot, 'a/b.spec.js')], - ['spec-c-d.spec', joinWithSeparator(options.projectSourceRoot, 'c/d.spec.js')], - ]), - ); - }); - - it('adds unique prefixes to distinguish between similar names', () => { - expect(getEntrypoints(['a/b/c/d.spec.js', 'a-b/c/d.spec.js'], ['a/b-c/d.spec.js'])).toEqual( - new Map<string, string>([ - ['spec-a-b-c-d.spec', joinWithSeparator(options.workspaceRoot, 'a/b/c/d.spec.js')], - ['spec-a-b-c-d-2.spec', joinWithSeparator(options.workspaceRoot, 'a-b/c/d.spec.js')], - [ - 'spec-a-b-c-d-3.spec', - joinWithSeparator(options.projectSourceRoot, 'a/b-c/d.spec.js'), - ], - ]), - ); - }); - - describe('with removeTestExtension enabled', () => { - function getEntrypoints(workspaceRelative: string[], sourceRootRelative: string[] = []) { - return getTestEntrypoints( - [ - ...workspaceRelative.map((p) => joinWithSeparator(options.workspaceRoot, p)), - ...sourceRootRelative.map((p) => joinWithSeparator(options.projectSourceRoot, p)), - ], - { ...options, removeTestExtension: true }, - ); - } - - it('removes .spec extension', () => { - expect(getEntrypoints(['a/b.spec.js'], ['c/d.spec.js'])).toEqual( - new Map<string, string>([ - ['spec-a-b', joinWithSeparator(options.workspaceRoot, 'a/b.spec.js')], - ['spec-c-d', joinWithSeparator(options.projectSourceRoot, 'c/d.spec.js')], - ]), - ); - }); - - it('removes .test extension', () => { - expect(getEntrypoints(['a/b.test.js'], ['c/d.test.js'])).toEqual( - new Map<string, string>([ - ['spec-a-b', joinWithSeparator(options.workspaceRoot, 'a/b.test.js')], - ['spec-c-d', joinWithSeparator(options.projectSourceRoot, 'c/d.test.js')], - ]), - ); - }); - }); - }); - } -}); diff --git a/packages/angular/build/src/builders/karma/progress-reporter.ts b/packages/angular/build/src/builders/karma/progress-reporter.ts index 908f1c856e6d..16824badd095 100644 --- a/packages/angular/build/src/builders/karma/progress-reporter.ts +++ b/packages/angular/build/src/builders/karma/progress-reporter.ts @@ -53,11 +53,9 @@ export function injectKarmaReporter( private startWatchingBuild() { void (async () => { // This is effectively "for await of but skip what's already consumed". - let isDone = false; // to mark the loop condition as "not constant". - while (!isDone) { + while (true) { const { done, value: buildOutput } = await buildIterator.next(); if (done) { - isDone = true; break; } diff --git a/packages/angular/build/src/builders/karma/tests/behavior/fake-async_spec.ts b/packages/angular/build/src/builders/karma/tests/behavior/fake-async_spec.ts index 16da8daf2f55..12f43e47cce5 100644 --- a/packages/angular/build/src/builders/karma/tests/behavior/fake-async_spec.ts +++ b/packages/angular/build/src/builders/karma/tests/behavior/fake-async_spec.ts @@ -18,12 +18,13 @@ describeKarmaBuilder(execute, KARMA_BUILDER_INFO, (harness, setupTarget) => { it('loads zone.js/testing at the right time', async () => { await harness.writeFiles({ './src/app/app.component.ts': ` - import { Component } from '@angular/core'; + import { ChangeDetectionStrategy, Component } from '@angular/core'; @Component({ selector: 'app-root', standalone: false, template: '<button (click)="changeMessage()" class="change">{{ message }}</button>', + changeDetection: ChangeDetectionStrategy.Eager }) export class AppComponent { message = 'Initial'; diff --git a/packages/angular/build/src/builders/karma/tests/options/code-coverage_spec.ts b/packages/angular/build/src/builders/karma/tests/options/code-coverage_spec.ts index a8849ba643ef..21dbfdfc073d 100644 --- a/packages/angular/build/src/builders/karma/tests/options/code-coverage_spec.ts +++ b/packages/angular/build/src/builders/karma/tests/options/code-coverage_spec.ts @@ -88,19 +88,15 @@ describeKarmaBuilder(execute, KARMA_BUILDER_INFO, (harness, setupTarget) => { } `, }); - await harness.modifyFile('tsconfig.json', (content) => - content.replace( - /"baseUrl": ".\/",/, - ` - "baseUrl": "./", - "paths": { - "my-lib": [ - "./dist/my-lib" - ] - }, - `, - ), - ); + await harness.modifyFile('tsconfig.json', (content) => { + const tsconfig = JSON.parse(content); + tsconfig.compilerOptions ??= {}; + tsconfig.compilerOptions.paths = { + 'my-lib': ['./dist/my-lib'], + }; + + return JSON.stringify(tsconfig, null, 2); + }); harness.useTarget('test', { ...BASE_OPTIONS, diff --git a/packages/angular/build/src/builders/karma/tests/setup.ts b/packages/angular/build/src/builders/karma/tests/setup.ts index e6a013946904..6292074daaf6 100644 --- a/packages/angular/build/src/builders/karma/tests/setup.ts +++ b/packages/angular/build/src/builders/karma/tests/setup.ts @@ -112,6 +112,8 @@ export async function setupApplicationTarget<T>( await harness.appendToFile('src/polyfills.ts', `import '@angular/localize/init';`); } +let counter = 0; + /** Runs the test against both an application- and a browser-builder context. */ export function describeKarmaBuilder<T>( builderHandler: BuilderHandlerFn<T & json.JsonObject>, @@ -128,7 +130,7 @@ export function describeKarmaBuilder<T>( optionSchema, }); - describe(options.name || builderHandler.name, () => { + describe((options.name || builderHandler.name) + ` (${counter++})`, () => { beforeEach(async () => { await host.initialize().toPromise(); diff --git a/packages/angular/build/src/builders/unit-test/builder.ts b/packages/angular/build/src/builders/unit-test/builder.ts index 6f2edd0281d7..97c3c0dce055 100644 --- a/packages/angular/build/src/builders/unit-test/builder.ts +++ b/packages/angular/build/src/builders/unit-test/builder.ts @@ -45,11 +45,11 @@ async function loadTestRunner(runnerName: string): Promise<TestRunner> { } catch (e) { assertIsError(e); if (e.code === 'ERR_MODULE_NOT_FOUND') { - throw new Error(`Unknown test runner "${runnerName}".`); + throw new Error(`Unknown test runner "${runnerName}".`, { cause: e }); } throw new Error( - `Failed to load the '${runnerName}' test runner. The package may be corrupted or improperly installed.\n` + - `Error: ${e.message}`, + `Failed to load the '${runnerName}' test runner. The package may be corrupted or improperly installed.`, + { cause: e }, ); } @@ -370,19 +370,20 @@ async function transformNgPackagrOptions( ngPackageJson = JSON.parse(await readFile(ngPackagePath, 'utf-8')); } catch (e) { assertIsError(e); - throw new Error(`Could not read ng-package.json at ${ngPackagePath}: ${e.message}`); + throw new Error(`Could not read ng-package.json at ${ngPackagePath}`, { + cause: e, + }); } - const lib = ngPackageJson['lib'] || {}; - const styleIncludePaths = lib['styleIncludePaths'] || []; - const assets = ngPackageJson['assets'] || []; - const inlineStyleLanguage = ngPackageJson['inlineStyleLanguage']; + const { lib: { styleIncludePaths = [] } = {}, assets = [], inlineStyleLanguage } = ngPackageJson; + + const includePaths = styleIncludePaths.map((includePath: string) => + path.resolve(path.dirname(ngPackagePath), includePath), + ); return { - stylePreprocessorOptions: styleIncludePaths.length - ? { includePaths: styleIncludePaths } - : undefined, + stylePreprocessorOptions: includePaths.length ? { includePaths } : undefined, assets: assets.length ? assets : undefined, - inlineStyleLanguage: typeof inlineStyleLanguage === 'string' ? inlineStyleLanguage : undefined, + inlineStyleLanguage, } as ApplicationBuilderInternalOptions; } diff --git a/packages/angular/build/src/builders/unit-test/options.ts b/packages/angular/build/src/builders/unit-test/options.ts index 72b5f3eb3e8d..0a71f2d642f1 100644 --- a/packages/angular/build/src/builders/unit-test/options.ts +++ b/packages/angular/build/src/builders/unit-test/options.ts @@ -116,7 +116,7 @@ export async function normalizeOptions( buildProgress: progress, reporters: normalizeReporterOption(options.reporters), outputFile: options.outputFile, - browsers, + browsers: browsers?.length ? browsers : undefined, browserViewport: width && height ? { width, height } : undefined, watch, debug: options.debug ?? false, diff --git a/packages/angular/build/src/builders/unit-test/runners/vitest/browser-provider.ts b/packages/angular/build/src/builders/unit-test/runners/vitest/browser-provider.ts index f89848abfbf6..0ca80f4fa60f 100644 --- a/packages/angular/build/src/builders/unit-test/runners/vitest/browser-provider.ts +++ b/packages/angular/build/src/builders/unit-test/runners/vitest/browser-provider.ts @@ -7,7 +7,11 @@ */ import { createRequire } from 'node:module'; -import type { BrowserBuiltinProvider, BrowserConfigOptions } from 'vitest/node'; +import type { + BrowserBuiltinProvider, + BrowserConfigOptions, + BrowserProviderOption, +} from 'vitest/node'; import { assertIsError } from '../../../../utils/error'; export interface BrowserConfiguration { @@ -37,7 +41,13 @@ function findBrowserProvider( return undefined; } -function normalizeBrowserName(browserName: string): { browser: string; headless: boolean } { +export interface BrowserInstanceConfiguration { + browser: string; + headless: boolean; + provider?: BrowserProviderOption; +} + +function normalizeBrowserName(browserName: string): BrowserInstanceConfiguration { // Normalize browser names to match Vitest's expectations for headless but also supports karma's names // e.g., 'ChromeHeadless' -> 'chrome', 'FirefoxHeadless' -> 'firefox' // and 'Chrome' -> 'chrome', 'Firefox' -> 'firefox'. @@ -50,6 +60,67 @@ function normalizeBrowserName(browserName: string): { browser: string; headless: }; } +/** + * Mutates the provided browser instances to apply standard headless execution + * constraints based on the chosen provider, user options, and CI environment presence. + * + * @param instances The normalized browser instances to mutate. + * @param providerName The identifier for the chosen Vitest browser provider. + * @param headless The user-provided headless configuration option. + * @param isCI Whether the current environment is running in CI. + * @returns An array of informational messages generated during evaluation. + */ +export function applyHeadlessConfiguration( + instances: BrowserInstanceConfiguration[], + providerName: BrowserBuiltinProvider | undefined, + headless: boolean | undefined, + isCI: boolean, +): string[] { + const messages: string[] = []; + + if (providerName === 'preview') { + instances.forEach((instance) => { + // Preview mode only supports headed execution + instance.headless = false; + }); + + if (headless) { + messages.push('The "headless" option is ignored when using the "preview" provider.'); + } + } else if (headless !== undefined) { + if (headless) { + const allHeadlessByDefault = isCI || instances.every((i) => i.headless); + if (allHeadlessByDefault) { + messages.push( + 'The "headless" option is unnecessary as all browsers are already configured to run in headless mode.', + ); + } + } + + instances.forEach((instance) => { + instance.headless = headless; + }); + } else if (isCI) { + instances.forEach((instance) => { + instance.headless = true; + }); + } + + return messages; +} + +/** + * Resolves and configures the Vitest browser provider for the unit test builder. + * Dynamically discovers and imports the necessary provider (Playwright, WebdriverIO, or Preview), + * maps the requested browser instances, and applies environment-specific execution logic. + * + * @param browsers An array of requested browser names (e.g., 'chrome', 'firefox'). + * @param headless User-provided configuration for headless execution. + * @param debug Whether the builder is running in watch or debug mode. + * @param projectSourceRoot The root directory of the project being tested for resolving installed packages. + * @param viewport Optional viewport dimensions to apply to the launched browser instances. + * @returns A fully resolved Vitest browser configuration object alongside any generated warning or error messages. + */ export async function setupBrowserConfiguration( browsers: string[] | undefined, headless: boolean | undefined, @@ -79,6 +150,8 @@ export async function setupBrowserConfiguration( ); } + const instances = browsers.map(normalizeBrowserName); + let provider: import('vitest/node').BrowserProviderOption | undefined; if (providerName) { const providerPackage = `@vitest/browser-${providerName}`; @@ -88,29 +161,27 @@ export async function setupBrowserConfiguration( // Validate that the imported module has the expected structure const providerFactory = providerModule[providerName]; if (typeof providerFactory === 'function') { - if ( - providerName === 'playwright' && - process.env['CHROME_BIN']?.includes('rules_browsers') - ) { - // Use the Chrome binary from the 'rules_browsers' toolchain (via CHROME_BIN) - // for Playwright when available to ensure hermetic testing, preventing reliance - // on locally installed or NPM-managed browser versions. - provider = providerFactory({ - launchOptions: { - executablePath: process.env.CHROME_BIN, - }, + if (providerName === 'playwright') { + const executablePath = process.env['CHROME_BIN']; + const baseOptions = { contextOptions: { // Enables `prefer-color-scheme` for Vitest browser instead of `light` colorScheme: null, }, - }); - } else if (providerName === 'playwright') { - provider = providerFactory({ - contextOptions: { - // Enables `prefer-color-scheme` for Vitest browser instead of `light` - colorScheme: null, - }, - }); + }; + + provider = providerFactory(baseOptions); + + if (executablePath) { + for (const instance of instances) { + if (instance.browser === 'chrome' || instance.browser === 'chromium') { + instance.provider = providerFactory({ + ...baseOptions, + launchOptions: { executablePath }, + }); + } + } + } } else { provider = providerFactory(); } @@ -143,36 +214,7 @@ export async function setupBrowserConfiguration( } const isCI = !!process.env['CI']; - const instances = browsers.map(normalizeBrowserName); - const messages: string[] = []; - - if (providerName === 'preview') { - instances.forEach((instance) => { - // Preview mode only supports headed execution - instance.headless = false; - }); - - if (headless) { - messages.push('The "headless" option is ignored when using the "preview" provider.'); - } - } else if (headless !== undefined) { - if (headless) { - const allHeadlessByDefault = isCI || instances.every((i) => i.headless); - if (allHeadlessByDefault) { - messages.push( - 'The "headless" option is unnecessary as all browsers are already configured to run in headless mode.', - ); - } - } - - instances.forEach((instance) => { - instance.headless = headless; - }); - } else if (isCI) { - instances.forEach((instance) => { - instance.headless = true; - }); - } + const messages = applyHeadlessConfiguration(instances, providerName, headless, isCI); const browser = { enabled: true, diff --git a/packages/angular/build/src/builders/unit-test/runners/vitest/browser-provider_spec.ts b/packages/angular/build/src/builders/unit-test/runners/vitest/browser-provider_spec.ts index 66f7254593b0..0dd0778420bd 100644 --- a/packages/angular/build/src/builders/unit-test/runners/vitest/browser-provider_spec.ts +++ b/packages/angular/build/src/builders/unit-test/runners/vitest/browser-provider_spec.ts @@ -9,7 +9,7 @@ import { mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises'; import { tmpdir } from 'node:os'; import { join } from 'node:path'; -import { setupBrowserConfiguration } from './browser-provider'; +import { applyHeadlessConfiguration, setupBrowserConfiguration } from './browser-provider'; describe('setupBrowserConfiguration', () => { let workspaceRoot: string; @@ -47,8 +47,8 @@ describe('setupBrowserConfiguration', () => { expect(browser?.enabled).toBeTrue(); expect(browser?.instances).toEqual([ - { browser: 'chrome', headless: true }, - { browser: 'firefox', headless: false }, + jasmine.objectContaining({ browser: 'chrome', headless: true }), + jasmine.objectContaining({ browser: 'firefox', headless: false }), ]); }); @@ -66,8 +66,8 @@ describe('setupBrowserConfiguration', () => { ); expect(browser?.instances).toEqual([ - { browser: 'chrome', headless: true }, - { browser: 'firefox', headless: true }, + jasmine.objectContaining({ browser: 'chrome', headless: true }), + jasmine.objectContaining({ browser: 'firefox', headless: true }), ]); } finally { if (originalCI === undefined) { @@ -196,8 +196,8 @@ describe('setupBrowserConfiguration', () => { ); expect(browser?.instances).toEqual([ - { browser: 'chrome', headless: true }, - { browser: 'firefox', headless: true }, + jasmine.objectContaining({ browser: 'chrome', headless: true }), + jasmine.objectContaining({ browser: 'firefox', headless: true }), ]); expect(messages).toEqual([]); }); @@ -215,4 +215,106 @@ describe('setupBrowserConfiguration', () => { 'The "headless" option is unnecessary as all browsers are already configured to run in headless mode.', ]); }); + + describe('CHROME_BIN usage', () => { + let originalChromeBin: string | undefined; + + beforeEach(() => { + originalChromeBin = process.env['CHROME_BIN']; + process.env['CHROME_BIN'] = '/custom/path/to/chrome'; + }); + + afterEach(() => { + if (originalChromeBin === undefined) { + delete process.env['CHROME_BIN']; + } else { + process.env['CHROME_BIN'] = originalChromeBin; + } + }); + + it('should set executablePath on the individual chrome instance', async () => { + const { browser } = await setupBrowserConfiguration( + ['ChromeHeadless', 'Chromium'], + undefined, + false, + workspaceRoot, + undefined, + ); + + // Verify the global provider does NOT have executablePath + // eslint-disable-next-line @typescript-eslint/no-explicit-any + expect((browser?.provider as any)?.options?.launchOptions?.executablePath).toBeUndefined(); + + // Verify the individual instances have executablePath + expect( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (browser?.instances?.[0]?.provider as any)?.options?.launchOptions?.executablePath, + ).toBe('/custom/path/to/chrome'); + expect( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (browser?.instances?.[1]?.provider as any)?.options?.launchOptions?.executablePath, + ).toBe('/custom/path/to/chrome'); + }); + + it('should set executablePath for chrome instances but not for others when mixed browsers are requested', async () => { + const { browser } = await setupBrowserConfiguration( + ['ChromeHeadless', 'Firefox'], + undefined, + false, + workspaceRoot, + undefined, + ); + + // Verify the global provider does NOT have executablePath + // eslint-disable-next-line @typescript-eslint/no-explicit-any + expect((browser?.provider as any)?.options?.launchOptions?.executablePath).toBeUndefined(); + + // Verify chrome gets it + expect( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (browser?.instances?.[0]?.provider as any)?.options?.launchOptions?.executablePath, + ).toBe('/custom/path/to/chrome'); + + // Verify firefox does not + expect(browser?.instances?.[1]?.provider).toBeUndefined(); + }); + }); + + describe('applyHeadlessConfiguration', () => { + it('should set headless false and issue warning when using preview provider with headless true', () => { + const instances = [{ browser: 'chrome', headless: true }]; + const messages = applyHeadlessConfiguration(instances, 'preview', true, false); + + expect(instances[0].headless).toBeFalse(); + expect(messages).toEqual([ + 'The "headless" option is ignored when using the "preview" provider.', + ]); + }); + + it('should force headless mode when headless option is true', () => { + const instances = [{ browser: 'chrome', headless: false }]; + const messages = applyHeadlessConfiguration(instances, 'playwright', true, false); + + expect(instances[0].headless).toBeTrue(); + expect(messages).toEqual([]); + }); + + it('should return information message when headless option is redundant', () => { + const instances = [{ browser: 'chrome', headless: true }]; + const messages = applyHeadlessConfiguration(instances, 'playwright', true, false); + + expect(instances[0].headless).toBeTrue(); + expect(messages).toEqual([ + 'The "headless" option is unnecessary as all browsers are already configured to run in headless mode.', + ]); + }); + + it('should force headless mode in CI environment when headless is undefined', () => { + const instances = [{ browser: 'chrome', headless: false }]; + const messages = applyHeadlessConfiguration(instances, 'playwright', undefined, true); + + expect(instances[0].headless).toBeTrue(); + expect(messages).toEqual([]); + }); + }); }); diff --git a/packages/angular/build/src/builders/unit-test/runners/vitest/build-options.ts b/packages/angular/build/src/builders/unit-test/runners/vitest/build-options.ts index 3aa7e2c8947e..482878c520ca 100644 --- a/packages/angular/build/src/builders/unit-test/runners/vitest/build-options.ts +++ b/packages/angular/build/src/builders/unit-test/runners/vitest/build-options.ts @@ -6,21 +6,35 @@ * found in the LICENSE file at https://angular.dev/license */ +/** + * @fileoverview + * Provides Vitest-specific build options and virtual file contents for Angular unit testing. + */ + +import { createRequire } from 'node:module'; import path from 'node:path'; import { toPosixPath } from '../../../../utils/path'; import type { ApplicationBuilderInternalOptions } from '../../../application/options'; import { OutputHashing } from '../../../application/schema'; -import { NormalizedUnitTestBuilderOptions, injectTestingPolyfills } from '../../options'; +import { NormalizedUnitTestBuilderOptions } from '../../options'; import { findTests, getTestEntrypoints } from '../../test-discovery'; import { RunnerOptions } from '../api'; +/** + * Creates the virtual file contents to initialize the Angular testing environment (TestBed). + * + * @param providersFile Optional path to a file that exports default providers. + * @param projectSourceRoot The root directory of the project source. + * @param teardown Whether to configure TestBed to destroy after each test. + * @param zoneTestingStrategy How zone.js should be loaded during initialization. + * @returns The string content of the virtual initialization file. + */ function createTestBedInitVirtualFile( providersFile: string | undefined, projectSourceRoot: string, teardown: boolean, - polyfills: string[] = [], + zoneTestingStrategy: 'none' | 'static' | 'dynamic', ): string { - const usesZoneJS = polyfills.includes('zone.js'); let providersImport = 'const providers = [];'; if (providersFile) { const relativePath = path.relative(projectSourceRoot, providersFile); @@ -29,14 +43,27 @@ function createTestBedInitVirtualFile( providersImport = `import providers from './${importPath}';`; } + let zoneTestingSnippet = ''; + if (zoneTestingStrategy === 'static') { + zoneTestingSnippet = `import 'zone.js/testing';`; + } else if (zoneTestingStrategy === 'dynamic') { + zoneTestingSnippet = `if (typeof Zone !== 'undefined') { + // 'zone.js/testing' is used to initialize the ZoneJS testing environment. + // It must be imported dynamically to avoid a static dependency on 'zone.js'. + await import('zone.js/testing'); + }`; + } + return ` // Initialize the Angular testing environment - import { NgModule${usesZoneJS ? ', provideZoneChangeDetection' : ''} } from '@angular/core'; + import { NgModule, provideZoneChangeDetection } from '@angular/core'; import { getTestBed, ɵgetCleanupHook as getCleanupHook } from '@angular/core/testing'; import { BrowserTestingModule, platformBrowserTesting } from '@angular/platform-browser/testing'; import { afterEach, beforeEach } from 'vitest'; ${providersImport} + ${zoneTestingSnippet} + // The beforeEach and afterEach hooks are registered outside the globalThis guard. // This ensures that the hooks are always applied, even in non-isolated browser environments. // Same as https://github.com/angular/angular/blob/05a03d3f975771bb59c7eefd37c01fa127ee2229/packages/core/testing/srcs/test_hooks.ts#L21-L29 @@ -52,7 +79,10 @@ function createTestBedInitVirtualFile( // The guard condition above ensures that the setup is only performed once. @NgModule({ - providers: [${usesZoneJS ? 'provideZoneChangeDetection(), ' : ''}...providers], + providers: [ + ...(typeof Zone !== 'undefined' ? [provideZoneChangeDetection()] : []), + ...providers, + ], }) class TestModule {} @@ -65,6 +95,13 @@ function createTestBedInitVirtualFile( `; } +/** + * Adjusts output hashing settings for testing purposes. For example, ensuring media + * is continued to be hashed to avoid overwriting assets, but turning off JavaScript hashing. + * + * @param hashing The original OutputHashing configuration. + * @returns The adjusted OutputHashing configuration. + */ function adjustOutputHashing(hashing?: OutputHashing): OutputHashing { switch (hashing) { case OutputHashing.All: @@ -76,6 +113,45 @@ function adjustOutputHashing(hashing?: OutputHashing): OutputHashing { } } +/** + * Resolves the Zone.js testing strategy by inspecting polyfills and resolving zone.js package. + * + * @param buildOptions The partial application builder options. + * @param projectSourceRoot The root directory of the project source. + * @returns The resolved zone testing strategy ('none', 'static', 'dynamic'). + */ +function getZoneTestingStrategy( + buildOptions: Partial<ApplicationBuilderInternalOptions>, + projectSourceRoot: string, +): 'none' | 'static' | 'dynamic' { + if (buildOptions.polyfills?.includes('zone.js/testing')) { + return 'none'; + } + + if (buildOptions.polyfills?.includes('zone.js')) { + return 'static'; + } + + try { + const projectRequire = createRequire(path.join(projectSourceRoot, 'package.json')); + projectRequire.resolve('zone.js'); + + return 'dynamic'; + } catch { + return 'none'; + } +} + +/** + * Generates options and virtual files for the Vitest test runner. + * + * Discovers specs matchers, creates entry points, decides polyfills strategy, and orchestrates + * internal ApplicationBuilder options. + * + * @param options The normalized unit test builder options. + * @param baseBuildOptions The base build config to derive testing config from. + * @returns An async RunnerOptions configuration. + */ export async function getVitestBuildOptions( options: NormalizedUnitTestBuilderOptions, baseBuildOptions: Partial<ApplicationBuilderInternalOptions>, @@ -145,24 +221,49 @@ export async function getVitestBuildOptions( externalDependencies, }; - buildOptions.polyfills = injectTestingPolyfills(buildOptions.polyfills); + // Inject the zone.js testing polyfill if Zone.js is installed. + const zoneTestingStrategy = getZoneTestingStrategy(buildOptions, projectSourceRoot); const testBedInitContents = createTestBedInitVirtualFile( providersFile, projectSourceRoot, !options.debug, - buildOptions.polyfills, + zoneTestingStrategy, ); const mockPatchContents = ` import { vi } from 'vitest'; - const error = new Error( - 'The "vi.mock" and related methods are not supported with the Angular unit-test system. Please use Angular TestBed for mocking.'); - vi.mock = () => { throw error; }; - vi.doMock = () => { throw error; }; - vi.importMock = () => { throw error; }; - vi.unmock = () => { throw error; }; - vi.doUnmock = () => { throw error; }; + + const ANGULAR_VITEST_MOCK_PATCH = Symbol.for('@angular/cli/vitest-mock-patch'); + if (!globalThis[ANGULAR_VITEST_MOCK_PATCH]) { + globalThis[ANGULAR_VITEST_MOCK_PATCH] = true; + + const error = new Error( + 'The "vi.mock" and related methods are not supported for relative imports with the Angular unit-test system. ' + + 'Please use Angular TestBed for mocking dependencies.' + ); + + // Store original implementations + const { mock, doMock, importMock, unmock, doUnmock } = vi; + + function patch(original) { + return (path, ...args) => { + // Check if the path is a string and starts with a character that indicates a relative path. + if (typeof path === 'string' && /^[./]/.test(path)) { + throw error; + } + + // Call the original function for non-relative paths. + return original(path, ...args); + }; + } + + vi.mock = patch(mock); + vi.doMock = patch(doMock); + vi.importMock = patch(importMock); + vi.unmock = patch(unmock); + vi.doUnmock = patch(doUnmock); + } `; return { diff --git a/packages/angular/build/src/builders/unit-test/runners/vitest/executor.ts b/packages/angular/build/src/builders/unit-test/runners/vitest/executor.ts index 503aa5da9071..c5b70e9a2487 100644 --- a/packages/angular/build/src/builders/unit-test/runners/vitest/executor.ts +++ b/packages/angular/build/src/builders/unit-test/runners/vitest/executor.ts @@ -27,6 +27,11 @@ import { setupBrowserConfiguration } from './browser-provider'; import { findVitestBaseConfig } from './configuration'; import { createVitestConfigPlugin, createVitestPlugins } from './plugins'; +enum DebugLogLevel { + Info = 1, + Verbose = 2, +} + export class VitestExecutor implements TestExecutor { private vitest: Vitest | undefined; private normalizePath: ((id: string) => string) | undefined; @@ -40,6 +45,7 @@ export class VitestExecutor implements TestExecutor { explicitBrowser: [], explicitServer: [], }; + private readonly debugLevel: number; // This is a reverse map of the entry points created in `build-options.ts`. // It is used by the in-memory provider plugin to map the requested test file @@ -54,19 +60,42 @@ export class VitestExecutor implements TestExecutor { testEntryPointMappings: Map<string, string> | undefined, logger: BuilderContext['logger'], ) { + const level = parseInt(process.env['NG_TEST_LOG'] ?? '0', 10); + this.debugLevel = isNaN(level) ? 0 : level; + this.projectName = projectName; this.options = options; this.logger = logger; + this.debugLog(DebugLogLevel.Info, 'VitestExecutor instantiated.'); + this.debugLog(DebugLogLevel.Verbose, 'NormalizedUnitTestBuilderOptions:', options); + if (testEntryPointMappings) { for (const [entryPoint, testFile] of testEntryPointMappings) { this.testFileToEntryPoint.set(testFile, entryPoint); this.entryPointToTestFile.set(entryPoint + '.js', testFile); } + this.debugLog( + DebugLogLevel.Verbose, + 'Test entry point mappings:', + Object.fromEntries(testEntryPointMappings), + ); } } + private debugLog(level: DebugLogLevel, message: string, data?: object) { + if (this.debugLevel < level) { + return; + } + + const formattedMessage = `[VitestExecutor:${DebugLogLevel[level]}] ${message}`; + // Custom formatting for data object to ensure it's readable + const logData = data ? JSON.stringify(data, null, 2) : ''; + this.logger.info(`${formattedMessage}${logData ? `\n${logData}` : ''}`); + } + async *execute(buildResult: FullResult | IncrementalResult): AsyncIterable<BuilderOutput> { + this.debugLog(DebugLogLevel.Info, `Executing test run (kind: ${buildResult.kind}).`); this.normalizePath ??= (await import('vite')).normalizePath; if (buildResult.kind === ResultKind.Full) { @@ -74,7 +103,20 @@ export class VitestExecutor implements TestExecutor { for (const [path, file] of Object.entries(buildResult.files)) { this.buildResultFiles.set(this.normalizePath(path), file); } + this.debugLog( + DebugLogLevel.Info, + `Full build results received. Total files: ${this.buildResultFiles.size}.`, + ); } else { + this.debugLog( + DebugLogLevel.Info, + `Incremental build results received.` + + `Added: ${buildResult.added.length}, Modified: ${buildResult.modified.length}, Removed: ${buildResult.removed.length}.`, + ); + this.debugLog(DebugLogLevel.Verbose, 'Added files:', buildResult.added); + this.debugLog(DebugLogLevel.Verbose, 'Modified files:', buildResult.modified); + this.debugLog(DebugLogLevel.Verbose, 'Removed files:', buildResult.removed); + for (const file of buildResult.removed) { this.buildResultFiles.delete(this.normalizePath(file.path)); } @@ -84,6 +126,7 @@ export class VitestExecutor implements TestExecutor { } updateExternalMetadata(buildResult, this.externalMetadata, undefined, true); + this.debugLog(DebugLogLevel.Verbose, 'Updated external metadata:', this.externalMetadata); // Reset the exit code to allow for a clean state. // This is necessary because Vitest may set the exit code on failure, which can @@ -103,7 +146,16 @@ export class VitestExecutor implements TestExecutor { // We need to find the original source file path to pass to Vitest. const source = this.entryPointToTestFile.get(modifiedFile); if (source) { + this.debugLog( + DebugLogLevel.Verbose, + `Mapped output file '${modifiedFile}' to source file '${source}' for re-run.`, + ); modifiedSourceFiles.add(source); + } else { + this.debugLog( + DebugLogLevel.Verbose, + `Could not map output file '${modifiedFile}' to a source file. It may not be a test file.`, + ); } vitest.invalidateFile( this.normalizePath(path.join(this.options.workspaceRoot, modifiedFile)), @@ -120,7 +172,11 @@ export class VitestExecutor implements TestExecutor { } if (specsToRerun.length > 0) { + this.debugLog(DebugLogLevel.Info, `Re-running ${specsToRerun.length} test specifications.`); + this.debugLog(DebugLogLevel.Verbose, 'Specs to rerun:', specsToRerun); testResults = await vitest.rerunTestSpecifications(specsToRerun); + } else { + this.debugLog(DebugLogLevel.Info, 'No test specifications to rerun.'); } } @@ -128,20 +184,29 @@ export class VitestExecutor implements TestExecutor { const testModules = testResults?.testModules ?? this.vitest.state.getTestModules(); let success = testModules.every((testModule) => testModule.ok()); + let finalResultReason = 'All tests passed.'; + // Vitest does not return a failure result when coverage thresholds are not met. // Instead, it sets the process exit code to 1. // We check this exit code to determine if the test run should be considered a failure. if (success && process.exitCode === 1) { success = false; + finalResultReason = 'Test run failed due to unmet coverage thresholds.'; // Reset the exit code to prevent it from carrying over to subsequent runs/builds process.exitCode = 0; } + this.debugLog( + DebugLogLevel.Info, + `Test run finished with success: ${success}. Reason: ${finalResultReason}`, + ); yield { success }; } async [Symbol.asyncDispose](): Promise<void> { + this.debugLog(DebugLogLevel.Info, 'Disposing VitestExecutor: Closing Vitest instance.'); await this.vitest?.close(); + this.debugLog(DebugLogLevel.Info, 'Vitest instance closed.'); } private prepareSetupFiles(): string[] { @@ -154,10 +219,13 @@ export class VitestExecutor implements TestExecutor { testSetupFiles.unshift('polyfills.js'); } + this.debugLog(DebugLogLevel.Info, 'Prepared setup files:', testSetupFiles); + return testSetupFiles; } private async initializeVitest(): Promise<Vitest> { + this.debugLog(DebugLogLevel.Info, 'Initializing Vitest.'); const { coverage, reporters, @@ -180,11 +248,16 @@ export class VitestExecutor implements TestExecutor { vitestNodeModule = await import('vitest/node'); } catch (error: unknown) { assertIsError(error); + this.debugLog( + DebugLogLevel.Info, + `Failed to import 'vitest/node'. Error code: ${error.code}`, + ); if (error.code !== 'ERR_MODULE_NOT_FOUND') { throw error; } throw new Error( 'The `vitest` package was not found. Please install the package and rerun the test command.', + { cause: error }, ); } const { startVitest } = vitestNodeModule; @@ -198,6 +271,9 @@ export class VitestExecutor implements TestExecutor { browserViewport, ); if (browserOptions.errors?.length) { + this.debugLog(DebugLogLevel.Info, 'Browser configuration errors found.', { + errors: browserOptions.errors, + }); throw new Error(browserOptions.errors.join('\n')); } @@ -206,7 +282,14 @@ export class VitestExecutor implements TestExecutor { this.logger.info(message); } } + this.debugLog(DebugLogLevel.Info, 'Browser configuration complete.', { + config: browserOptions.browser, + }); + this.debugLog( + DebugLogLevel.Info, + `Verifying build results. File count: ${this.buildResultFiles.size}.`, + ); assert( this.buildResultFiles.size > 0, 'buildResult must be available before initializing vitest', @@ -234,6 +317,10 @@ export class VitestExecutor implements TestExecutor { ? await findVitestBaseConfig([projectRoot, workspaceRoot]) : runnerConfig; + this.debugLog(DebugLogLevel.Info, 'External Vitest configuration path:', { + externalConfigPath, + }); + let project = projectName; if (debug && browserOptions.browser?.instances) { if (browserOptions.browser.instances.length > 1) { @@ -245,6 +332,9 @@ export class VitestExecutor implements TestExecutor { // When running browser tests, Vitest appends the browser name to the project identifier. // The project name must match this augmented name to ensure the correct project is targeted. project = `${projectName} (${browserOptions.browser.instances[0].browser})`; + this.debugLog(DebugLogLevel.Info, 'Adjusted project name for debugging with browser:', { + project, + }); } // Filter internal entries and setup files from the include list @@ -255,43 +345,47 @@ export class VitestExecutor implements TestExecutor { !internalEntries.some((internal) => entry.startsWith(internal)) && !setupFileSet.has(entry) ); }); + this.debugLog(DebugLogLevel.Verbose, 'Included test files (after filtering):', include); - return startVitest( - 'test', - undefined, - { - config: externalConfigPath, - root: workspaceRoot, - project, - outputFile, - cache: cacheOptions.enabled ? undefined : false, - testNamePattern: this.options.filter, - watch, - ...(typeof ui === 'boolean' ? { ui } : {}), - ...debugOptions, - }, - { - // Note `.vitest` is auto appended to the path. - cacheDir: cacheOptions.path, - server: { - // Disable the actual file watcher. The boolean watch option above should still - // be enabled as it controls other internal behavior related to rerunning tests. - watch: null, - }, - plugins: [ - await createVitestConfigPlugin({ - browser: browserOptions.browser, - coverage, - projectName, - projectSourceRoot, - optimizeDepsInclude: this.externalMetadata.implicitBrowser, - reporters, - setupFiles: testSetupFiles, - projectPlugins, - include, - }), - ], + const vitestConfig = { + config: externalConfigPath, + root: workspaceRoot, + project, + outputFile, + cache: cacheOptions.enabled ? undefined : (false as const), + testNamePattern: this.options.filter, + watch, + ...(typeof ui === 'boolean' ? { ui } : {}), + ...debugOptions, + }; + const vitestServerConfig = { + // Note `.vitest` is auto appended to the path. + cacheDir: cacheOptions.path, + server: { + // Disable the actual file watcher. The boolean watch option above should still + // be enabled as it controls other internal behavior related to rerunning tests. + watch: null, }, - ); + plugins: [ + await createVitestConfigPlugin({ + browser: browserOptions.browser, + coverage, + projectName, + projectSourceRoot, + optimizeDepsInclude: this.externalMetadata.implicitBrowser, + reporters, + setupFiles: testSetupFiles, + projectPlugins, + include, + watch, + }), + ], + }; + + this.debugLog(DebugLogLevel.Info, 'Calling startVitest with final configuration.'); + this.debugLog(DebugLogLevel.Verbose, 'Vitest config:', vitestConfig); + this.debugLog(DebugLogLevel.Verbose, 'Vitest server config:', vitestServerConfig); + + return startVitest('test', undefined, vitestConfig, vitestServerConfig); } } diff --git a/packages/angular/build/src/builders/unit-test/runners/vitest/plugins.ts b/packages/angular/build/src/builders/unit-test/runners/vitest/plugins.ts index 9abe0d7be404..d36f8a05ffa6 100644 --- a/packages/angular/build/src/builders/unit-test/runners/vitest/plugins.ts +++ b/packages/angular/build/src/builders/unit-test/runners/vitest/plugins.ts @@ -46,6 +46,7 @@ interface VitestConfigPluginOptions { projectPlugins: Exclude<UserWorkspaceConfig['plugins'], undefined>; include: string[]; optimizeDepsInclude: string[]; + watch: boolean; } async function findTestEnvironment( @@ -81,6 +82,18 @@ export async function createVitestConfigPlugin( async config(config) { const testConfig = config.test; + if (reporters !== undefined) { + delete testConfig?.reporters; + } + + if ( + options.coverage.reporters !== undefined && + testConfig?.coverage && + 'reporter' in testConfig.coverage + ) { + delete testConfig.coverage.reporter; + } + if (testConfig?.projects?.length) { this.warn( 'The "test.projects" option in the Vitest configuration file is not supported. ' + @@ -97,6 +110,22 @@ export async function createVitestConfigPlugin( delete testConfig.include; } + if (testConfig?.watch !== undefined && testConfig.watch !== options.watch) { + this.warn( + `The "test.watch" option in the Vitest configuration file is overridden by the builder's ` + + `watch option. Please use the Angular CLI "--watch" option to enable or disable watch mode.`, + ); + delete testConfig.watch; + } + + if (testConfig?.exclude) { + this.warn( + 'The "test.exclude" option in the Vitest configuration file is evaluated after ' + + 'tests are compiled. For better build performance, please use the Angular CLI ' + + '"exclude" option instead.', + ); + } + // Merge user-defined plugins from the Vitest config with the CLI's internal plugins. if (config.plugins) { const userPlugins = config.plugins.filter( @@ -389,6 +418,9 @@ async function generateCoverageOption( projectName: string, ): Promise<VitestCoverageOption> { let defaultExcludes: string[] = []; + // When a coverage exclude option is provided, Vitest's default coverage excludes + // will be overridden. To retain them, we manually fetch the defaults to append to the + // user's provided exclusions. if (optionsCoverage.exclude) { try { const vitestConfig = await import('vitest/config'); @@ -420,12 +452,15 @@ async function generateCoverageOption( // Special handling for `exclude`/`reporters` due to an undefined value causing upstream failures ...(optionsCoverage.exclude ? { - exclude: [ - // Augment the default exclude https://vitest.dev/config/#coverage-exclude - // with the user defined exclusions - ...optionsCoverage.exclude, - ...defaultExcludes, - ], + exclude: Array.from( + new Set([ + // Augment the default exclude https://vitest.dev/config/#coverage-exclude + // with the user defined exclusions + ...(configCoverage?.exclude || []), + ...optionsCoverage.exclude, + ...defaultExcludes, + ]), + ), } : {}), ...(optionsCoverage.reporters diff --git a/packages/angular/build/src/builders/unit-test/schema.json b/packages/angular/build/src/builders/unit-test/schema.json index 951fd5a29e73..46b9b5fb6276 100644 --- a/packages/angular/build/src/builders/unit-test/schema.json +++ b/packages/angular/build/src/builders/unit-test/schema.json @@ -75,8 +75,7 @@ }, "coverage": { "type": "boolean", - "description": "Enables coverage reporting for tests.", - "default": false + "description": "Enables coverage reporting for tests. If not specified, the coverage configuration from a runner configuration file will be used if present. Otherwise, coverage is disabled by default." }, "coverageInclude": { "type": "array", diff --git a/packages/angular/build/src/builders/unit-test/tests/behavior/coverage-ignore-comments_spec.ts b/packages/angular/build/src/builders/unit-test/tests/behavior/coverage-ignore-comments_spec.ts new file mode 100644 index 000000000000..2c680ac08cf0 --- /dev/null +++ b/packages/angular/build/src/builders/unit-test/tests/behavior/coverage-ignore-comments_spec.ts @@ -0,0 +1,237 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { execute } from '../../index'; +import { + BASE_OPTIONS, + UNIT_TEST_BUILDER_INFO, + describeBuilder, + setupApplicationTarget, +} from '../setup'; + +describeBuilder(execute, UNIT_TEST_BUILDER_INFO, (harness) => { + describe('Behavior: "coverage ignore comments"', () => { + beforeEach(async () => { + setupApplicationTarget(harness, { extractLicenses: false, optimization: false }); + }); + + function getSpecContent(extraTest = '') { + return ` +import { TestBed } from '@angular/core/testing'; +import { AppComponent } from './app.component'; + +describe('AppComponent', () => { + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [AppComponent], + }).compileComponents(); + }); + + it('should create the app', () => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.componentInstance; + expect(app).toBeTruthy(); + }); + + it('should render title', async () => { + const fixture = TestBed.createComponent(AppComponent); + await fixture.whenStable(); + const compiled = fixture.nativeElement as HTMLElement; + expect(compiled.querySelector('h1')?.textContent).toContain('hello'); + }); + + ${extraTest} +}); +`; + } + + async function assertNoUncoveredStatements(contextMessage: string) { + const { result } = await harness.executeOnce(); + expect(result?.success).toBeTrue(); + harness.expectFile('coverage/test/coverage-final.json').toExist(); + + const coverageMap = JSON.parse(harness.readFile('coverage/test/coverage-final.json')); + const appComponentPath = Object.keys(coverageMap).find((p) => p.includes('app.component.ts')); + expect(appComponentPath).toBeDefined(); + + const appComponentCoverage = coverageMap[appComponentPath as string]; + + const statementCounts = Object.values(appComponentCoverage.s); + const hasUncoveredStatements = statementCounts.some((count) => count === 0); + expect(hasUncoveredStatements).withContext(contextMessage).toBeFalse(); + } + + for (const type of ['istanbul', 'v8']) { + it(`should respect ${type} ignore next comments when computing coverage`, async () => { + harness.useTarget('test', { + ...BASE_OPTIONS, + coverage: true, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + coverageReporters: ['json'] as any, + }); + + await harness.writeFile( + 'src/app/app.component.ts', + ` + import { Component } from '@angular/core'; + + @Component({ + selector: 'app-root', + template: '<h1>hello</h1>', + standalone: true, + }) + export class AppComponent { + title = 'app'; + + /* ${type} ignore next */ + untestedFunction() { + return false; + } + } + `, + ); + + await harness.writeFile('src/app/app.component.spec.ts', getSpecContent()); + + await assertNoUncoveredStatements( + 'There should be no uncovered statements as the uncalled function was ignored', + ); + }); + + it(`should respect ${type} ignore if comments when computing coverage`, async () => { + harness.useTarget('test', { + ...BASE_OPTIONS, + coverage: true, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + coverageReporters: ['json'] as any, + }); + + await harness.writeFile( + 'src/app/app.component.ts', + ` + import { Component } from '@angular/core'; + + @Component({ + selector: 'app-root', + template: '<h1>hello</h1>', + standalone: true, + }) + export class AppComponent { + checkValue(val: boolean) { + /* ${type} ignore if -- @preserve */ + if (val) { + return true; + } + return false; + } + } + `, + ); + + await harness.writeFile( + 'src/app/app.component.spec.ts', + getSpecContent(` + it('should exercise the function but not the if block', () => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.componentInstance; + app.checkValue(false); + }); + `), + ); + + await assertNoUncoveredStatements( + 'There should be no uncovered statements as the uncalled branch was ignored', + ); + }); + + it(`should respect ${type} ignore else comments when computing coverage`, async () => { + harness.useTarget('test', { + ...BASE_OPTIONS, + coverage: true, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + coverageReporters: ['json'] as any, + }); + + await harness.writeFile( + 'src/app/app.component.ts', + ` + import { Component } from '@angular/core'; + + @Component({ + selector: 'app-root', + template: '<h1>hello</h1>', + standalone: true, + }) + export class AppComponent { + checkValue(val: boolean) { + /* ${type} ignore else -- @preserve */ + if (val) { + return true; + } else { + return false; + } + } + } + `, + ); + + await harness.writeFile( + 'src/app/app.component.spec.ts', + getSpecContent(` + it('should exercise the function but not the else block', () => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.componentInstance; + app.checkValue(true); + }); + `), + ); + + await assertNoUncoveredStatements( + 'There should be no uncovered statements as the uncalled else branch was ignored', + ); + }); + } + + it('should respect v8 ignore start/stop comments when computing coverage', async () => { + harness.useTarget('test', { + ...BASE_OPTIONS, + coverage: true, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + coverageReporters: ['json'] as any, + }); + + await harness.writeFile( + 'src/app/app.component.ts', + ` + import { Component } from '@angular/core'; + + @Component({ + selector: 'app-root', + template: '<h1>hello</h1>', + standalone: true, + }) + export class AppComponent { + title = 'app'; + + /* v8 ignore start */ + untestedFunction() { + return false; + } + /* v8 ignore stop */ + } + `, + ); + + await harness.writeFile('src/app/app.component.spec.ts', getSpecContent()); + + await assertNoUncoveredStatements( + 'There should be no uncovered statements as the uncalled function was ignored', + ); + }); + }); +}); diff --git a/packages/angular/build/src/builders/unit-test/tests/behavior/runner-config-vitest_spec.ts b/packages/angular/build/src/builders/unit-test/tests/behavior/runner-config-vitest_spec.ts index 603c69f533ea..609d736e00f7 100644 --- a/packages/angular/build/src/builders/unit-test/tests/behavior/runner-config-vitest_spec.ts +++ b/packages/angular/build/src/builders/unit-test/tests/behavior/runner-config-vitest_spec.ts @@ -42,6 +42,21 @@ describeBuilder(execute, UNIT_TEST_BUILDER_INFO, (harness) => { harness.expectFile('vitest-results.xml').toExist(); }); + it('should override reporters defined in runnerConfig file when CLI option is present', async () => { + harness.useTarget('test', { + ...BASE_OPTIONS, + runnerConfig: 'vitest.config.ts', + reporters: ['default'], + }); + + harness.writeFile('vitest.config.ts', VITEST_CONFIG_CONTENT); + + const { result } = await harness.executeOnce(); + expect(result?.success).toBeTrue(); + // The CLI option 'default' should override the 'junit' reporter in VITEST_CONFIG_CONTENT + harness.expectFile('vitest-results.xml').toNotExist(); + }); + it('should use custom reportsDirectory defined in runnerConfig file', async () => { harness.useTarget('test', { ...BASE_OPTIONS, @@ -92,6 +107,31 @@ describeBuilder(execute, UNIT_TEST_BUILDER_INFO, (harness) => { harness.expectFile('coverage/test/coverage-final.json').toExist(); }); + it('should enable coverage when set in runnerConfig file without builder option', async () => { + harness.useTarget('test', { + ...BASE_OPTIONS, + runnerConfig: 'vitest.config.ts', + }); + + harness.writeFile( + 'vitest.config.ts', + ` + import { defineConfig } from 'vitest/config'; + export default defineConfig({ + test: { + coverage: { + enabled: true, + }, + }, + }); + `, + ); + + const { result } = await harness.executeOnce(); + expect(result?.success).toBeTrue(); + harness.expectFile('coverage/test/coverage-final.json').toExist(); + }); + it('should exclude test files based on runnerConfig file', async () => { harness.useTarget('test', { ...BASE_OPTIONS, @@ -139,6 +179,59 @@ describeBuilder(execute, UNIT_TEST_BUILDER_INFO, (harness) => { expect(results.numPassedTests).toBe(1); }); + it('should correctly merge coverage.exclude arrays from builder and runner options', async () => { + harness.useTarget('test', { + ...BASE_OPTIONS, + coverage: true, + runnerConfig: 'vitest.config.ts', + coverageExclude: ['src/app/cli-excluded.ts'], + }); + + harness.writeFile( + 'vitest.config.ts', + ` + import { defineConfig } from 'vitest/config'; + export default defineConfig({ + test: { + coverage: { + exclude: ['src/app/config-excluded.ts'], + }, + }, + }); + `, + ); + + // Create two files that would normally be covered + harness.writeFile('src/app/cli-excluded.ts', 'export const cliExcluded = true;'); + harness.writeFile('src/app/config-excluded.ts', 'export const configExcluded = true;'); + + // Update the test file to import them so they're picked up by coverage + harness.writeFile( + 'src/app/app.component.spec.ts', + ` + import { test, expect } from 'vitest'; + import './cli-excluded'; + import './config-excluded'; + test('should pass', () => { + expect(true).toBe(true); + }); + `, + ); + + const { result } = await harness.executeOnce(); + expect(result?.success).toBeTrue(); + harness.expectFile('coverage/test/coverage-final.json').toExist(); + + const coverageMap = JSON.parse(harness.readFile('coverage/test/coverage-final.json')); + const coveredFiles = Object.keys(coverageMap); + + const hasCliExcluded = coveredFiles.some((f) => f.includes('cli-excluded.ts')); + const hasConfigExcluded = coveredFiles.some((f) => f.includes('config-excluded.ts')); + + expect(hasCliExcluded).withContext('CLI target should be excluded').toBeFalse(); + expect(hasConfigExcluded).withContext('Config file target should be excluded').toBeFalse(); + }); + it('should allow overriding globals to false via runnerConfig file', async () => { harness.useTarget('test', { ...BASE_OPTIONS, @@ -290,6 +383,71 @@ describeBuilder(execute, UNIT_TEST_BUILDER_INFO, (harness) => { // ); }); + it('should warn and ignore "test.watch" option from runnerConfig file', async () => { + harness.useTarget('test', { + ...BASE_OPTIONS, + watch: false, + runnerConfig: 'vitest.config.ts', + }); + + harness.writeFile( + 'vitest.config.ts', + ` + import { defineConfig } from 'vitest/config'; + export default defineConfig({ + test: { + watch: true, + }, + }); + `, + ); + + const { result, logs } = await harness.executeOnce(); + expect(result?.success).toBeTrue(); + + // TODO: Re-enable once Vite logs are remapped through build system + // expect(logs).toContain( + // jasmine.objectContaining({ + // level: 'warn', + // message: jasmine.stringMatching( + // 'The "test.watch" option in the Vitest configuration file is overridden by the builder\\'s watch option.', + // ), + // }), + // ); + }); + + it('should warn about performance when "test.exclude" option is in runnerConfig file', async () => { + harness.useTarget('test', { + ...BASE_OPTIONS, + runnerConfig: 'vitest.config.ts', + }); + + harness.writeFile( + 'vitest.config.ts', + ` + import { defineConfig } from 'vitest/config'; + export default defineConfig({ + test: { + exclude: ['src/app/non-existent.spec.ts'], + }, + }); + `, + ); + + const { result, logs } = await harness.executeOnce(); + expect(result?.success).toBeTrue(); + + // TODO: Re-enable once Vite logs are remapped through build system + // expect(logs).toContain( + // jasmine.objectContaining({ + // level: 'warn', + // message: jasmine.stringMatching( + // 'The "test.exclude" option in the Vitest configuration file is evaluated after', + // ), + // }), + // ); + }); + it(`should append "test.setupFiles" (string) from runnerConfig to the CLI's setup`, async () => { harness.useTarget('test', { ...BASE_OPTIONS, diff --git a/packages/angular/build/src/builders/unit-test/tests/behavior/vitest-mock-unsupported_spec.ts b/packages/angular/build/src/builders/unit-test/tests/behavior/vitest-mock-unsupported_spec.ts index 30565429f2ca..547d6528d86d 100644 --- a/packages/angular/build/src/builders/unit-test/tests/behavior/vitest-mock-unsupported_spec.ts +++ b/packages/angular/build/src/builders/unit-test/tests/behavior/vitest-mock-unsupported_spec.ts @@ -34,8 +34,35 @@ describeBuilder(execute, UNIT_TEST_BUILDER_INFO, (harness) => { `, ); - const { result, logs } = await harness.executeOnce(); + const { result } = await harness.executeOnce(); expect(result?.success).toBeFalse(); }); + + it('should not fail when vi.mock is used with a non-relative path', async () => { + harness.useTarget('test', { + ...BASE_OPTIONS, + }); + + harness.writeFile( + 'src/app/mock-non-relative.spec.ts', + ` + import { vi } from 'vitest'; + vi.mock('@angular/cdk', () => ({})); + describe('Ignored', () => { it('pass', () => expect(true).toBe(true)); }); + `, + ); + + // Overwrite default to avoid noise + harness.writeFile( + 'src/app/app.component.spec.ts', + ` + import { describe, it, expect } from 'vitest'; + describe('Ignored', () => { it('pass', () => expect(true).toBe(true)); }); + `, + ); + + const { result } = await harness.executeOnce(); + expect(result?.success).toBeTrue(); + }); }); }); diff --git a/packages/angular/build/src/builders/unit-test/tests/behavior/vitest-zone-init_spec.ts b/packages/angular/build/src/builders/unit-test/tests/behavior/vitest-zone-init_spec.ts new file mode 100644 index 000000000000..812dba7fa70d --- /dev/null +++ b/packages/angular/build/src/builders/unit-test/tests/behavior/vitest-zone-init_spec.ts @@ -0,0 +1,71 @@ +import { execute } from '../../index'; +import { + BASE_OPTIONS, + describeBuilder, + UNIT_TEST_BUILDER_INFO, + setupApplicationTarget, +} from '../setup'; + +describeBuilder(execute, UNIT_TEST_BUILDER_INFO, (harness) => { + describe('Behavior: "Vitest Zone initialization"', () => { + // Zone.js does not current provide fakAsync support for Vitest + xit('should load Zone and Zone testing support by default', async () => { + setupApplicationTarget(harness); // Defaults include zone.js + + harness.useTarget('test', { + ...BASE_OPTIONS, + }); + + harness.writeFile( + 'src/app/app.component.spec.ts', + ` + import { describe, it, expect } from 'vitest'; + import { fakeAsync, tick } from '@angular/core/testing'; + + describe('Zone Test', () => { + it('should have Zone defined', () => { + expect((globalThis as any).Zone).toBeDefined(); + }); + + it('should support fakeAsync', fakeAsync(() => { + let val = false; + setTimeout(() => { val = true; }, 100); + tick(100); + expect(val).toBeTrue(); + })); + }); + `, + ); + + const { result } = await harness.executeOnce(); + expect(result?.success).toBeTrue(); + }); + + it('should NOT load Zone when zoneless (no zone.js in polyfills)', async () => { + // Setup application target WITHOUT zone.js in polyfills + setupApplicationTarget(harness, { + polyfills: [], + }); + + harness.useTarget('test', { + ...BASE_OPTIONS, + }); + + harness.writeFile( + 'src/app/app.component.spec.ts', + ` + import { describe, it, expect } from 'vitest'; + + describe('Zoneless Test', () => { + it('should NOT have Zone defined', () => { + expect((globalThis as any).Zone).toBeUndefined(); + }); + }); + `, + ); + + const { result } = await harness.executeOnce(); + expect(result?.success).toBe(true); + }); + }); +}); diff --git a/packages/angular/build/src/builders/unit-test/tests/options/code-coverage_spec.ts b/packages/angular/build/src/builders/unit-test/tests/options/code-coverage_spec.ts index f8a8acb60591..d0f51e731de9 100644 --- a/packages/angular/build/src/builders/unit-test/tests/options/code-coverage_spec.ts +++ b/packages/angular/build/src/builders/unit-test/tests/options/code-coverage_spec.ts @@ -42,7 +42,7 @@ describeBuilder(execute, UNIT_TEST_BUILDER_INFO, (harness) => { harness.expectFile('coverage/test/index.html').toExist(); }); - it('should generate a code coverage report when coverage is true', async () => { + it('should generate a code coverage report when coverage is true and coverageReporters is set to json', async () => { harness.useTarget('test', { ...BASE_OPTIONS, coverage: true, diff --git a/packages/angular/build/src/builders/unit-test/tests/options/setup-files_spec.ts b/packages/angular/build/src/builders/unit-test/tests/options/setup-files_spec.ts index be70c833c9a9..65d0dadf17b8 100644 --- a/packages/angular/build/src/builders/unit-test/tests/options/setup-files_spec.ts +++ b/packages/angular/build/src/builders/unit-test/tests/options/setup-files_spec.ts @@ -36,12 +36,12 @@ describeBuilder(execute, UNIT_TEST_BUILDER_INFO, (harness) => { it('should include the setup files', async () => { await harness.writeFiles({ - 'src/setup.ts': `globalThis['TEST_SETUP_RAN'] = true;`, + 'src/setup.ts': `(globalThis as any)['TEST_SETUP_RAN'] = true;`, 'src/app/app.component.spec.ts': ` import { describe, expect, test } from 'vitest' describe('AppComponent', () => { test('should have run setup file', () => { - expect(globalThis['TEST_SETUP_RAN']).toBe(true); + expect((globalThis as any)['TEST_SETUP_RAN']).toBe(true); }); });`, }); diff --git a/packages/angular/build/src/private.ts b/packages/angular/build/src/private.ts index 4791a94a42d3..50d57d0e5a01 100644 --- a/packages/angular/build/src/private.ts +++ b/packages/angular/build/src/private.ts @@ -26,6 +26,10 @@ export { buildApplicationInternal } from './builders/application'; export type { ApplicationBuilderInternalOptions } from './builders/application/options'; export { type Result, type ResultFile, ResultKind } from './builders/application/results'; export { serveWithVite } from './builders/dev-server/vite'; +export { + normalizeOptions as normalizeDevServerOptions, + type NormalizedDevServerOptions, +} from './builders/dev-server/options'; // Tools export * from './tools/babel/plugins'; diff --git a/packages/angular/build/src/tools/angular/angular-host.ts b/packages/angular/build/src/tools/angular/angular-host.ts index e98ebf49f3eb..874d66fe2b41 100644 --- a/packages/angular/build/src/tools/angular/angular-host.ts +++ b/packages/angular/build/src/tools/angular/angular-host.ts @@ -212,6 +212,12 @@ export function createAngularCompilerHost( return null; } + // Reject TypeScript files used as component resources (e.g., styleUrl pointing to a .ts file). + // Processing a TypeScript file as a stylesheet or template causes confusing downstream errors. + if (hasTypeScriptExtension(resolvedPath)) { + return null; + } + // All resource names that have template file extensions are assumed to be templates // TODO: Update compiler to provide the resource type to avoid extension matching here. if (!hostOptions.externalStylesheets || hasTemplateExtension(resolvedPath)) { @@ -255,15 +261,13 @@ export function createAngularCompilerHost( return host; } -function hasTemplateExtension(file: string): boolean { - const extension = nodePath.extname(file).toLowerCase(); +const TEMPLATE_EXTENSIONS: ReadonlySet<string> = new Set(['.htm', '.html', '.svg']); +const TYPESCRIPT_EXTENSIONS: ReadonlySet<string> = new Set(['.ts', '.tsx', '.mts', '.cts']); - switch (extension) { - case '.htm': - case '.html': - case '.svg': - return true; - } +function hasTemplateExtension(file: string): boolean { + return TEMPLATE_EXTENSIONS.has(nodePath.extname(file).toLowerCase()); +} - return false; +function hasTypeScriptExtension(file: string): boolean { + return TYPESCRIPT_EXTENSIONS.has(nodePath.extname(file).toLowerCase()); } diff --git a/packages/angular/build/src/tools/babel/plugins/add-code-coverage.ts b/packages/angular/build/src/tools/babel/plugins/add-code-coverage.ts index efa95870f698..7917c412b15d 100644 --- a/packages/angular/build/src/tools/babel/plugins/add-code-coverage.ts +++ b/packages/angular/build/src/tools/babel/plugins/add-code-coverage.ts @@ -7,7 +7,7 @@ */ import { NodePath, PluginObj, types } from '@babel/core'; -import { Visitor, programVisitor } from 'istanbul-lib-instrument'; +import type { Visitor } from 'istanbul-lib-instrument'; import assert from 'node:assert'; /** @@ -15,7 +15,9 @@ import assert from 'node:assert'; * * @returns A babel plugin object instance. */ -export default function (): PluginObj { +export default function ( + programVisitor: typeof import('istanbul-lib-instrument').programVisitor, +): PluginObj { const visitors = new WeakMap<NodePath, Visitor>(); return { diff --git a/packages/angular/build/src/tools/babel/plugins/elide-angular-metadata_spec.ts b/packages/angular/build/src/tools/babel/plugins/elide-angular-metadata_spec.ts index 4705d207a63a..896e1e270af4 100644 --- a/packages/angular/build/src/tools/babel/plugins/elide-angular-metadata_spec.ts +++ b/packages/angular/build/src/tools/babel/plugins/elide-angular-metadata_spec.ts @@ -188,7 +188,7 @@ describe('elide-angular-metadata Babel plugin', () => { ); it( - 'elides arrow-function-based ɵsetClassMetadataAsync', + 'elides ɵsetClassDebugInfo', testCase({ input: ` import { Component } from '@angular/core'; diff --git a/packages/angular/build/src/tools/babel/plugins/pure-toplevel-functions_spec.ts b/packages/angular/build/src/tools/babel/plugins/pure-toplevel-functions_spec.ts index 0966a67d068a..77eb42dc9bbe 100644 --- a/packages/angular/build/src/tools/babel/plugins/pure-toplevel-functions_spec.ts +++ b/packages/angular/build/src/tools/babel/plugins/pure-toplevel-functions_spec.ts @@ -100,7 +100,7 @@ describe('pure-toplevel-functions Babel plugin', () => { ); it( - 'does not annotate call expressions inside function expressions', + 'does not annotate call expressions inside arrow functions', testCaseNoChange('const foo = () => { const result = someFunction(); }'), ); @@ -115,7 +115,7 @@ describe('pure-toplevel-functions Babel plugin', () => { ); it( - 'does not annotate new expressions inside function expressions', + 'does not annotate new expressions inside arrow functions', testCaseNoChange('const foo = () => { const result = new SomeClass(); }'), ); diff --git a/packages/angular/build/src/tools/esbuild/angular/compiler-plugin.ts b/packages/angular/build/src/tools/esbuild/angular/compiler-plugin.ts index af4dcaea01fb..1bcb8c40500a 100644 --- a/packages/angular/build/src/tools/esbuild/angular/compiler-plugin.ts +++ b/packages/angular/build/src/tools/esbuild/angular/compiler-plugin.ts @@ -220,10 +220,19 @@ export function createCompilerPlugin( if (stylesheetResult.errors) { (result.errors ??= []).push(...stylesheetResult.errors); + const { referencedFiles } = stylesheetResult; + if (referencedFiles) { + referencedFileTracker.add(containingFile, referencedFiles); + if (stylesheetFile) { + referencedFileTracker.add(stylesheetFile, referencedFiles); + } + } + return ''; } const { contents, outputFiles, metafile, referencedFiles } = stylesheetResult; + additionalResults.set(resultSource, { outputFiles, metafile, diff --git a/packages/angular/build/src/tools/esbuild/application-code-bundle.ts b/packages/angular/build/src/tools/esbuild/application-code-bundle.ts index 635faca8c82e..d11e1b6fb63c 100644 --- a/packages/angular/build/src/tools/esbuild/application-code-bundle.ts +++ b/packages/angular/build/src/tools/esbuild/application-code-bundle.ts @@ -6,12 +6,12 @@ * found in the LICENSE file at https://angular.dev/license */ -import type { BuildOptions, PartialMessage, Plugin } from 'esbuild'; +import type { BuildOptions, Plugin } from 'esbuild'; import assert from 'node:assert'; import { createHash } from 'node:crypto'; import { extname, relative } from 'node:path'; import type { NormalizedApplicationBuildOptions } from '../../builders/application/options'; -import { ExperimentalPlatform } from '../../builders/application/schema'; +import { Platform } from '../../builders/application/schema'; import { allowMangle } from '../../utils/environment-options'; import { toPosixPath } from '../../utils/path'; import { @@ -158,7 +158,7 @@ export function createServerPolyfillBundleOptions( ): BundlerOptionsFactory | undefined { const serverPolyfills: string[] = []; const polyfillsFromConfig = new Set(options.polyfills); - const isNodePlatform = options.ssrOptions?.platform !== ExperimentalPlatform.Neutral; + const isNodePlatform = options.ssrOptions?.platform !== Platform.Neutral; if (!isZonelessApp(options.polyfills)) { serverPolyfills.push(isNodePlatform ? 'zone.js/node' : 'zone.js'); @@ -196,9 +196,14 @@ export function createServerPolyfillBundleOptions( if (isNodePlatform) { // Note: Needed as esbuild does not provide require shims / proxy from ESModules. // See: https://github.com/evanw/esbuild/issues/1921. + // Use an alias to avoid colliding with any `createRequire` import that may + // already exist in the bundled user code. ESBuild processes banner content + // as raw text outside of its module graph, so it cannot deduplicate or + // rename banner imports the way it does for user imports. Without the alias, + // a duplicate `import { createRequire }` binding would cause a runtime error. jsBanner.push( - `import { createRequire } from 'node:module';`, - `globalThis['require'] ??= createRequire(import.meta.url);`, + `import { createRequire as __ngCreateRequire } from 'node:module';`, + `globalThis['require'] ??= __ngCreateRequire(import.meta.url);`, ); } @@ -295,7 +300,7 @@ export function createServerMainCodeBundleOptions( // Mark manifest and polyfills file as external as these are generated by a different bundle step. (buildOptions.external ??= []).push(...SERVER_GENERATED_EXTERNALS); - const isNodePlatform = options.ssrOptions?.platform !== ExperimentalPlatform.Neutral; + const isNodePlatform = options.ssrOptions?.platform !== Platform.Neutral; if (!isNodePlatform) { // `@angular/platform-server` lazily depends on `xhr2` for XHR usage with the HTTP client. @@ -387,7 +392,7 @@ export function createSsrEntryCodeBundleOptions( const pluginOptions = createCompilerPluginOptions(options, sourceFileCache, loadResultCache); const ssrEntryNamespace = 'angular:ssr-entry'; const ssrInjectManifestNamespace = 'angular:ssr-entry-inject-manifest'; - const isNodePlatform = options.ssrOptions?.platform !== ExperimentalPlatform.Neutral; + const isNodePlatform = options.ssrOptions?.platform !== Platform.Neutral; const jsBanner: string[] = []; if (options.externalDependencies?.length) { @@ -397,9 +402,14 @@ export function createSsrEntryCodeBundleOptions( if (isNodePlatform) { // Note: Needed as esbuild does not provide require shims / proxy from ESModules. // See: https://github.com/evanw/esbuild/issues/1921. + // Use an alias to avoid colliding with any `createRequire` import that may + // already exist in the bundled user code. ESBuild processes banner content + // as raw text outside of its module graph, so it cannot deduplicate or + // rename banner imports the way it does for user imports. Without the alias, + // a duplicate `import { createRequire }` binding would cause a runtime error. jsBanner.push( - `import { createRequire } from 'node:module';`, - `globalThis['require'] ??= createRequire(import.meta.url);`, + `import { createRequire as __ngCreateRequire } from 'node:module';`, + `globalThis['require'] ??= __ngCreateRequire(import.meta.url);`, ); } @@ -505,7 +515,7 @@ export function createSsrEntryCodeBundleOptions( } function getEsBuildServerCommonOptions(options: NormalizedApplicationBuildOptions): BuildOptions { - const isNodePlatform = options.ssrOptions?.platform !== ExperimentalPlatform.Neutral; + const isNodePlatform = options.ssrOptions?.platform !== Platform.Neutral; const commonOptions = getEsBuildCommonOptions(options); commonOptions.define ??= {}; @@ -616,7 +626,11 @@ function getEsBuildCommonOptions(options: NormalizedApplicationBuildOptions): Bu conditions, resolveExtensions: ['.ts', '.tsx', '.mjs', '.js', '.cjs'], metafile: true, - legalComments: options.extractLicenses ? 'none' : 'eof', + legalComments: options.extractLicenses + ? 'none' + : optimizationOptions.scripts + ? 'eof' + : 'inline', logLevel: options.verbose && !jsonLogs ? 'debug' : 'silent', minifyIdentifiers: optimizationOptions.scripts && allowMangle, minifySyntax: optimizationOptions.scripts, @@ -656,12 +670,17 @@ function getEsBuildCommonPolyfillsOptions( ): BuildOptions | undefined { const { jit, workspaceRoot, i18nOptions, externalPackages } = options; - const buildOptions = getEsBuildCommonOptions(options); + let polyfills = options.polyfills ? [...options.polyfills] : []; + + const buildOptions = getEsBuildCommonOptions({ + ...options, + // If any polyfills are local files, disable external packages for the polyfills build. + // This ensures that local files are properly bundled. + externalPackages: polyfills.some(isLocalFile) ? false : externalPackages, + }); buildOptions.splitting = false; buildOptions.plugins ??= []; - let polyfills = options.polyfills ? [...options.polyfills] : []; - // Angular JIT mode requires the runtime compiler if (jit) { polyfills.unshift('@angular/compiler'); @@ -671,10 +690,8 @@ function getEsBuildCommonPolyfillsOptions( // Locale data should go first so that project provided polyfill code can augment if needed. let needLocaleDataPlugin = false; if (i18nOptions.shouldInline) { - if (!externalPackages) { - // Remove localize polyfill when i18n inline transformation have been applied to all the packages. - polyfills = polyfills.filter((path) => !path.startsWith('@angular/localize')); - } + // Remove localize polyfill when i18n inline transformation have been applied to all the packages. + polyfills = polyfills.filter((path) => !path.startsWith('@angular/localize')); // Add locale data for all active locales // TODO: Inject each individually within the inlining process itself @@ -701,7 +718,6 @@ function getEsBuildCommonPolyfillsOptions( cache: loadResultCache, loadContent: async (_, build) => { let polyfillPaths = polyfills; - let warnings: PartialMessage[] | undefined; if (tryToResolvePolyfillsAsRelative) { polyfillPaths = await Promise.all( @@ -736,7 +752,6 @@ function getEsBuildCommonPolyfillsOptions( return { contents, loader: 'js', - warnings, resolveDir: workspaceRoot, }; }, @@ -749,3 +764,18 @@ function getEsBuildCommonPolyfillsOptions( function entryFileToWorkspaceRelative(workspaceRoot: string, entryFile: string): string { return './' + toPosixPath(relative(workspaceRoot, entryFile).replace(/.[mc]?ts$/, '')); } + +/** + * Determines if a polyfill path is a local file. + * A local file is defined as a path starting with a `.` or having a TypeScript/JavaScript extension. + * `zone.js` and its subpaths are specifically excluded and treated as packages. + * @param path The polyfill path to check. + * @returns true if the path is a local file; false otherwise. + */ +function isLocalFile(path: string): boolean { + if (path.startsWith('zone.js')) { + return false; + } + + return path[0] === '.' || /\.[mc]?[jt]sx?$/.test(path); +} diff --git a/packages/angular/build/src/tools/esbuild/i18n-inliner-worker.ts b/packages/angular/build/src/tools/esbuild/i18n-inliner-worker.ts index 74550e83e5de..f988a4b2f0d8 100644 --- a/packages/angular/build/src/tools/esbuild/i18n-inliner-worker.ts +++ b/packages/angular/build/src/tools/esbuild/i18n-inliner-worker.ts @@ -196,7 +196,9 @@ async function transformWithBabel( // Which makes it hard to find the actual error message. const index = error.message.indexOf(')\n'); const msg = index !== -1 ? error.message.slice(0, index + 1) : error.message; - throw new Error(`${msg}\nAn error occurred inlining file "${options.filename}"`); + throw new Error(`${msg}\nAn error occurred inlining file "${options.filename}"`, { + cause: error, + }); } if (!ast) { diff --git a/packages/angular/build/src/tools/esbuild/javascript-transformer-worker.ts b/packages/angular/build/src/tools/esbuild/javascript-transformer-worker.ts index 7d86009b773f..dfb7cfb2087f 100644 --- a/packages/angular/build/src/tools/esbuild/javascript-transformer-worker.ts +++ b/packages/angular/build/src/tools/esbuild/javascript-transformer-worker.ts @@ -8,6 +8,7 @@ import { type PluginItem, transformAsync } from '@babel/core'; import fs from 'node:fs'; +import { createRequire } from 'node:module'; import path from 'node:path'; import Piscina from 'piscina'; @@ -66,8 +67,31 @@ async function transformWithBabel( const plugins: PluginItem[] = []; if (options.instrumentForCoverage) { - const { default: coveragePlugin } = await import('../babel/plugins/add-code-coverage.js'); - plugins.push(coveragePlugin); + try { + let resolvedPath = 'istanbul-lib-instrument'; + try { + const requireFn = createRequire(filename); + resolvedPath = requireFn.resolve('istanbul-lib-instrument'); + } catch { + // Fallback to pool worker import traversal + } + + const istanbul = await import(resolvedPath); + const programVisitor = istanbul.programVisitor ?? istanbul.default?.programVisitor; + + if (!programVisitor) { + throw new Error('programVisitor is not available in istanbul-lib-instrument.'); + } + + const { default: coveragePluginFactory } = + await import('../babel/plugins/add-code-coverage.js'); + plugins.push(coveragePluginFactory(programVisitor)); + } catch (error) { + throw new Error( + `The 'istanbul-lib-instrument' package is required for code coverage but was not found. Please install the package.`, + { cause: error }, + ); + } } if (shouldLink) { diff --git a/packages/angular/build/src/tools/vite/middlewares/assets-middleware.ts b/packages/angular/build/src/tools/vite/middlewares/assets-middleware.ts index f0a137f578f8..e0074625afe0 100644 --- a/packages/angular/build/src/tools/vite/middlewares/assets-middleware.ts +++ b/packages/angular/build/src/tools/vite/middlewares/assets-middleware.ts @@ -45,8 +45,8 @@ export function createAngularAssetsMiddleware( // Rewrite all build assets to a vite raw fs URL const asset = assets.get(pathname); if (asset) { - // This is a workaround to serve CSS, JS and TS files without Vite transformations. - if (JS_TS_REGEXP.test(extension) || CSS_PREPROCESSOR_REGEXP.test(extension)) { + // This is a workaround to serve extensionless, CSS, JS and TS files without Vite transformations. + if (!extension || JS_TS_REGEXP.test(extension) || CSS_PREPROCESSOR_REGEXP.test(extension)) { const contents = readFileSync(asset.source); const etag = `W/${createHash('sha256').update(contents).digest('hex')}`; if (checkAndHandleEtag(req, res, etag)) { diff --git a/packages/angular/build/src/tools/vite/middlewares/ssr-middleware.ts b/packages/angular/build/src/tools/vite/middlewares/ssr-middleware.ts index 4b0a8d8390f1..a26fa8e5e257 100644 --- a/packages/angular/build/src/tools/vite/middlewares/ssr-middleware.ts +++ b/packages/angular/build/src/tools/vite/middlewares/ssr-middleware.ts @@ -90,6 +90,10 @@ export async function createAngularSsrExternalMiddleware( '@angular/ssr/node' as string )) as typeof import('@angular/ssr/node', { with: { 'resolution-mode': 'import' } }); + // Disable host check if allowed hosts is true meaning allow all hosts. + const { allowedHosts } = server.config.server; + const disableAllowedHostsCheck = allowedHosts === true; + return function angularSsrExternalMiddleware( req: Connect.IncomingMessage, res: ServerResponse, @@ -123,6 +127,7 @@ export async function createAngularSsrExternalMiddleware( } if (cachedAngularAppEngine !== AngularAppEngine) { + AngularAppEngine.ɵdisableAllowedHostsCheck = disableAllowedHostsCheck; AngularAppEngine.ɵallowStaticRouteRender = true; AngularAppEngine.ɵhooks.on('html:transform:pre', async ({ html, url }) => { const processedHtml = await server.transformIndexHtml(url.pathname, html); diff --git a/packages/angular/build/src/tools/vite/plugins/ssr-ssl-plugin.ts b/packages/angular/build/src/tools/vite/plugins/ssr-ssl-plugin.ts index 80ddf56e739a..a32c87a604de 100644 --- a/packages/angular/build/src/tools/vite/plugins/ssr-ssl-plugin.ts +++ b/packages/angular/build/src/tools/vite/plugins/ssr-ssl-plugin.ts @@ -6,8 +6,7 @@ * found in the LICENSE file at https://angular.dev/license */ -import { readFile } from 'node:fs/promises'; -import { getCACertificates, rootCertificates, setDefaultCACertificates } from 'node:tls'; +import { getCACertificates, setDefaultCACertificates } from 'node:tls'; import type { Plugin } from 'vite'; export function createAngularServerSideSSLPlugin(): Plugin { @@ -39,34 +38,8 @@ export function createAngularServerSideSSLPlugin(): Plugin { const { cert } = https; const additionalCerts = Array.isArray(cert) ? cert : [cert]; - // TODO(alanagius): Remove the `if` check once we only support Node.js 22.18.0+ and 24.5.0+. - if (getCACertificates && setDefaultCACertificates) { - const currentCerts = getCACertificates('default'); - setDefaultCACertificates([...currentCerts, ...additionalCerts]); - - return; - } - - // TODO(alanagius): Remove the below and `undici` dependency once we only support Node.js 22.18.0+ and 24.5.0+. - const { getGlobalDispatcher, setGlobalDispatcher, Agent } = await import('undici'); - const originalDispatcher = getGlobalDispatcher(); - const ca = [...rootCertificates, ...additionalCerts]; - const extraNodeCerts = process.env['NODE_EXTRA_CA_CERTS']; - if (extraNodeCerts) { - ca.push(await readFile(extraNodeCerts)); - } - - setGlobalDispatcher( - new Agent({ - connect: { - ca, - }, - }), - ); - - httpServer?.on('close', () => { - setGlobalDispatcher(originalDispatcher); - }); + const currentCerts = getCACertificates('default'); + setDefaultCACertificates([...currentCerts, ...additionalCerts]); }, }; } diff --git a/packages/angular/build/src/utils/index-file/auto-csp.ts b/packages/angular/build/src/utils/index-file/auto-csp.ts index c50e0bfce3f2..0e1dfe3ed916 100644 --- a/packages/angular/build/src/utils/index-file/auto-csp.ts +++ b/packages/angular/build/src/utils/index-file/auto-csp.ts @@ -52,12 +52,7 @@ function isJavascriptMimeType(mimeType: string): boolean { * @returns whether to add the script tag to the dynamically loaded script tag */ function shouldDynamicallyLoadScriptTagBasedOnType(scriptType: string | undefined): boolean { - return ( - scriptType === undefined || - scriptType === '' || - scriptType === 'module' || - isJavascriptMimeType(scriptType) - ); + return !scriptType || scriptType === 'module' || isJavascriptMimeType(scriptType); } /** @@ -67,7 +62,11 @@ function shouldDynamicallyLoadScriptTagBasedOnType(scriptType: string | undefine * @returns The hash of the text formatted appropriately for CSP. */ export function hashTextContent(scriptText: string): string { - const hash = crypto.createHash(HASH_FUNCTION).update(scriptText, 'utf-8').digest('base64'); + // Normalize CRLF to LF to ensure consistent since the rewriter might normalize the line endings. + const hash = crypto + .createHash(HASH_FUNCTION) + .update(scriptText.replace(/\r\n?/g, '\n'), 'utf-8') + .digest('base64'); return `'${HASH_FUNCTION}-${hash}'`; } diff --git a/packages/angular/build/src/utils/index-file/auto-csp_spec.ts b/packages/angular/build/src/utils/index-file/auto-csp_spec.ts index 1ec5f2ab06aa..efbd338233ad 100644 --- a/packages/angular/build/src/utils/index-file/auto-csp_spec.ts +++ b/packages/angular/build/src/utils/index-file/auto-csp_spec.ts @@ -15,13 +15,13 @@ const getCsps = (html: string) => { ).map((m) => m[1]); // Only capture group. }; -const ONE_HASH_CSP = +const CSP_SINGLE_HASH_REGEX = /script-src 'strict-dynamic' 'sha256-[^']+' https: 'unsafe-inline';object-src 'none';base-uri 'self';/; -const TWO_HASH_CSP = +const CSP_TWO_HASHES_REGEX = /script-src 'strict-dynamic' (?:'sha256-[^']+' ){2}https: 'unsafe-inline';object-src 'none';base-uri 'self';/; -const FOUR_HASH_CSP = +const CSP_FOUR_HASHES_REGEX = /script-src 'strict-dynamic' (?:'sha256-[^']+' ){4}https: 'unsafe-inline';object-src 'none';base-uri 'self';/; describe('auto-csp', () => { @@ -38,8 +38,8 @@ describe('auto-csp', () => { `); const csps = getCsps(result); - expect(csps.length).toBe(1); - expect(csps[0]).toMatch(ONE_HASH_CSP); + expect(csps).toHaveSize(1); + expect(csps[0]).toMatch(CSP_SINGLE_HASH_REGEX); expect(csps[0]).toContain(hashTextContent("console.log('foo');")); }); @@ -56,8 +56,8 @@ describe('auto-csp', () => { `); const csps = getCsps(result); - expect(csps.length).toBe(1); - expect(csps[0]).toMatch(ONE_HASH_CSP); + expect(csps).toHaveSize(1); + expect(csps[0]).toMatch(CSP_SINGLE_HASH_REGEX); expect(result).toContain(`var scripts = [['./main.js', '', false, false]];`); }); @@ -74,8 +74,8 @@ describe('auto-csp', () => { `); const csps = getCsps(result); - expect(csps.length).toBe(1); - expect(csps[0]).toMatch(ONE_HASH_CSP); + expect(csps).toHaveSize(1); + expect(csps[0]).toMatch(CSP_SINGLE_HASH_REGEX); // Our loader script appears after the HTML text content. expect(result).toMatch( /Some text<\/div>\s*<script>\s*var scripts = \[\['.\/main.js', '', false, false\]\];/, @@ -99,8 +99,8 @@ describe('auto-csp', () => { `); const csps = getCsps(result); - expect(csps.length).toBe(1); - expect(csps[0]).toMatch(TWO_HASH_CSP); + expect(csps).toHaveSize(1); + expect(csps[0]).toMatch(CSP_TWO_HASHES_REGEX); expect(result).toContain( // eslint-disable-next-line max-len `var scripts = [['./main1.js', '', false, false],['./main2.js', '', true, false],['./main3.js', 'module', true, true]];`, @@ -108,7 +108,7 @@ describe('auto-csp', () => { // Head loader script is in the head. expect(result).toContain(`</script></head>`); // Only two loader scripts are created. - expect(Array.from(result.matchAll(/<script>/g)).length).toEqual(2); + expect(Array.from(result.matchAll(/<script>/gi)).length).toEqual(2); }); it('should rewrite source scripts with weird URLs', async () => { @@ -127,8 +127,8 @@ describe('auto-csp', () => { `); const csps = getCsps(result); - expect(csps.length).toBe(1); - expect(csps[0]).toMatch(ONE_HASH_CSP); + expect(csps).toHaveSize(1); + expect(csps[0]).toMatch(CSP_SINGLE_HASH_REGEX); // & encodes correctly expect(result).toContain(`'/foo&bar'`); // Impossible to escape a string and create invalid loader JS with a ' @@ -158,9 +158,9 @@ describe('auto-csp', () => { `); const csps = getCsps(result); - expect(csps.length).toBe(1); + expect(csps).toHaveSize(1); // Exactly four hashes for the four scripts that remain (inline, loader, inline, loader). - expect(csps[0]).toMatch(FOUR_HASH_CSP); + expect(csps[0]).toMatch(CSP_FOUR_HASHES_REGEX); expect(csps[0]).toContain(hashTextContent("console.log('foo');")); expect(csps[0]).toContain(hashTextContent("console.log('bar');")); // Loader script for main.js and main2.js appear after 'foo' and before 'bar'. @@ -174,7 +174,7 @@ describe('auto-csp', () => { /console.log\('bar'\);<\/script>\s*<script>\s*var scripts = \[\['.\/main3.js', '', false, false\],\['.\/main4.js', '', false, false\]\];/, ); // Exactly 4 scripts should be left. - expect(Array.from(result.matchAll(/<script>/g)).length).toEqual(4); + expect(Array.from(result.matchAll(/<script>/gi)).length).toEqual(4); }); it('should write a loader script that appends to head', async () => { @@ -190,8 +190,8 @@ describe('auto-csp', () => { `); const csps = getCsps(result); - expect(csps.length).toBe(1); - expect(csps[0]).toMatch(ONE_HASH_CSP); + expect(csps).toHaveSize(1); + expect(csps[0]).toMatch(CSP_SINGLE_HASH_REGEX); expect(result).toContain( // eslint-disable-next-line max-len @@ -200,6 +200,25 @@ describe('auto-csp', () => { // Head loader script is in the head. expect(result).toContain(`</script></head>`); // Only one loader script is created. - expect(Array.from(result.matchAll(/<script>/g)).length).toEqual(1); + expect(Array.from(result.matchAll(/<script>/gi)).length).toEqual(1); + }); + + it('should rewrite a single inline script with CRLF', async () => { + const result = await autoCsp(` + <html> + <head> + </head> + <body> + <script>\r\nconsole.log('foo');\r\n</script> + <div>Some text </div> + </body> + </html>\r\n + `); + + const csps = getCsps(result); + expect(result).not.toContain(`\r\n`); + expect(csps).toHaveSize(1); + expect(csps[0]).toMatch(CSP_SINGLE_HASH_REGEX); + expect(csps[0]).toContain(hashTextContent(`\r\nconsole.log('foo');\r\n`)); }); }); diff --git a/packages/angular/build/src/utils/index-file/inline-fonts.ts b/packages/angular/build/src/utils/index-file/inline-fonts.ts index 8f70139a77a4..52181200c885 100644 --- a/packages/angular/build/src/utils/index-file/inline-fonts.ts +++ b/packages/angular/build/src/utils/index-file/inline-fonts.ts @@ -6,10 +6,9 @@ * found in the LICENSE file at https://angular.dev/license */ -import { HttpsProxyAgent } from 'https-proxy-agent'; import { createHash } from 'node:crypto'; import { readFile, rm, writeFile } from 'node:fs/promises'; -import { get as httpsGet } from 'node:https'; +import { type Agent, get as httpsGet } from 'node:https'; import { join } from 'node:path'; import { NormalizedCachedOptions } from '../normalize-cache'; import { htmlRewritingStream } from './html-rewriting-stream'; @@ -195,12 +194,28 @@ export class InlineFontsProcessor { } const httpsProxy = process.env.HTTPS_PROXY ?? process.env.https_proxy; + let agent: Agent | undefined; + if (httpsProxy) { + // TODO: Remove `https-proxy-agent` usage once the min supported version of Node.js is 24.5.0 + // https.globalAgent = new https.Agent({ + // proxyEnv: { HTTPS_PROXY: 'http://proxy.company.com:8080' }, + // }); + // See: https://nodejs.org/en/learn/http/enterprise-network-configuration + // See: https://nodejs.org/docs/latest/api/https.html + + const { HttpsProxyAgent } = (await import('https-proxy-agent' as string)) as typeof import( + 'https-proxy-agent', + { with: { 'resolution-mode': 'import' } } + ); + agent = new HttpsProxyAgent(httpsProxy) as unknown as Agent; + } + const data = await new Promise<string>((resolve, reject) => { let rawResponse = ''; httpsGet( url, { - agent: httpsProxy ? new HttpsProxyAgent(httpsProxy) : undefined, + agent, headers: { /** * Always use a Windows UA. This is because Google fonts will including hinting in fonts for Windows. diff --git a/packages/angular/build/src/utils/normalize-asset-patterns.ts b/packages/angular/build/src/utils/normalize-asset-patterns.ts index 929e88fff506..b935f1d84588 100644 --- a/packages/angular/build/src/utils/normalize-asset-patterns.ts +++ b/packages/angular/build/src/utils/normalize-asset-patterns.ts @@ -45,7 +45,7 @@ export function normalizeAssetPatterns( } let glob: string, input: string; - let isDirectory = false; + let isDirectory: boolean; try { isDirectory = statSync(resolvedAssetPath).isDirectory(); diff --git a/packages/angular/build/src/utils/server-rendering/manifest.ts b/packages/angular/build/src/utils/server-rendering/manifest.ts index b01bff38b58f..34c2e334b52c 100644 --- a/packages/angular/build/src/utils/server-rendering/manifest.ts +++ b/packages/angular/build/src/utils/server-rendering/manifest.ts @@ -53,11 +53,13 @@ function escapeUnsafeChars(str: string): string { * * @param i18nOptions - The internationalization options for the application build. This * includes settings for inlining locales and determining the output structure. + * @param allowedHosts - A list of hosts that are allowed to access the server-side application. * @param baseHref - The base HREF for the application. This is used to set the base URL * for all relative URLs in the application. */ export function generateAngularServerAppEngineManifest( i18nOptions: NormalizedApplicationBuildOptions['i18nOptions'], + allowedHosts: string[], baseHref: string | undefined, ): string { const entryPoints: Record<string, string> = {}; @@ -84,6 +86,7 @@ export function generateAngularServerAppEngineManifest( const manifestContent = ` export default { basePath: '${basePath}', + allowedHosts: ${JSON.stringify(allowedHosts, undefined, 2)}, supportedLocales: ${JSON.stringify(supportedLocales, undefined, 2)}, entryPoints: { ${Object.entries(entryPoints) diff --git a/packages/angular/build/src/utils/server-rendering/prerender.ts b/packages/angular/build/src/utils/server-rendering/prerender.ts index f33f851f10c4..1033a7575f88 100644 --- a/packages/angular/build/src/utils/server-rendering/prerender.ts +++ b/packages/angular/build/src/utils/server-rendering/prerender.ts @@ -96,7 +96,9 @@ export async function prerenderPages( const assetsReversed: Record</** Destination */ string, /** Source */ string> = {}; for (const { source, destination } of assets) { - assetsReversed[addLeadingSlash(toPosixPath(destination))] = source; + // Assets are not stored with baseHref when using i18n, + // we append the base href so that requests are resolved correctly. + assetsReversed[joinUrlParts(baseHref, toPosixPath(destination))] = source; } // Get routes to prerender @@ -114,8 +116,12 @@ export async function prerenderPages( sourcemap, outputMode, ).catch((err) => { + assertIsError(err); + return { - errors: [`An error occurred while extracting routes.\n\n${err.message ?? err.stack ?? err}`], + errors: [ + `An error occurred while extracting routes.\n\n${err.stack ?? err.message ?? err.code ?? err}`, + ], serializedRouteTree: [], appShellRoute: undefined, }; @@ -225,6 +231,10 @@ async function renderPages( hasSsrEntry: !!outputFilesForWorker['server.mjs'], } as RenderWorkerData, execArgv: workerExecArgv, + env: { + ...process.env, + 'NG_ALLOWED_HOSTS': 'localhost', + }, }); try { @@ -259,8 +269,9 @@ async function renderPages( } }) .catch((err) => { + assertIsError(err); errors.push( - `An error occurred while prerendering route '${route}'.\n\n${err.message ?? err.stack ?? err.code ?? err}`, + `An error occurred while prerendering route '${route}'.\n\n${err.stack ?? err.message ?? err.code ?? err}`, ); void renderWorker.destroy(); }); @@ -337,6 +348,10 @@ async function getAllRoutes( hasSsrEntry: !!outputFilesForWorker['server.mjs'], } as RoutesExtractorWorkerData, execArgv: workerExecArgv, + env: { + ...process.env, + 'NG_ALLOWED_HOSTS': 'localhost', + }, }); try { @@ -361,7 +376,7 @@ async function getAllRoutes( return { errors: [ - `An error occurred while extracting routes.\n\n${err.message ?? err.stack ?? err.code ?? err}`, + `An error occurred while extracting routes.\n\n${err.stack ?? err.message ?? err.code ?? err}`, ], serializedRouteTree: [], }; diff --git a/packages/angular/build/src/utils/service-worker.ts b/packages/angular/build/src/utils/service-worker.ts index 1535684f635c..3c8b4cbe6b63 100644 --- a/packages/angular/build/src/utils/service-worker.ts +++ b/packages/angular/build/src/utils/service-worker.ts @@ -6,10 +6,9 @@ * found in the LICENSE file at https://angular.dev/license */ -import type { - Config, - Filesystem, -} from '@angular/service-worker/config' with { 'resolution-mode': 'import' }; +import type { Config, Filesystem } from '@angular/service-worker/config' with { + 'resolution-mode': 'import', +}; import * as crypto from 'node:crypto'; import { existsSync, promises as fsPromises } from 'node:fs'; import * as path from 'node:path'; @@ -149,6 +148,7 @@ export async function augmentAppWithServiceWorker( 'Error: Expected to find an ngsw-config.json configuration file' + ` in the ${appRoot} folder. Either provide one or` + ' disable Service Worker in the angular.json configuration file.', + { cause: error }, ); } else { throw error; @@ -200,7 +200,7 @@ export async function augmentAppWithServiceWorkerEsbuild( workspaceRoot, configPath, )}" could not be found.`; - throw new Error(message); + throw new Error(message, { cause: error }); } else { throw error; } diff --git a/packages/angular/build/src/utils/version.ts b/packages/angular/build/src/utils/version.ts index 51f493bfe993..b9bbf5cd03b8 100644 --- a/packages/angular/build/src/utils/version.ts +++ b/packages/angular/build/src/utils/version.ts @@ -37,18 +37,35 @@ export function assertCompatibleAngularVersion(projectRoot: string): void | neve process.exit(2); } + const angularCoreSemVer = new SemVer(angularPkgJson['version']); + const { version, build, raw } = angularCoreSemVer; const supportedAngularSemver = '0.0.0-ANGULAR-FW-PEER-DEP'; - if (angularPkgJson['version'] === '0.0.0' || supportedAngularSemver.startsWith('0.0.0')) { + + if (version.startsWith('0.0.0') || supportedAngularSemver.startsWith('0.0.0')) { // Internal CLI and FW testing version. return; } - const angularVersion = new SemVer(angularPkgJson['version']); + if (build.length && version.endsWith('.0.0-next.0')) { + // Special handle for local builds only when it's prerelease of major version and it's the 0th version. + // This happends when we are bumping to a new major version. and the cli has not releated a verion. + + // Example: + // raw: '22.0.0-next.0+sha-c7dc705-with-local-changes', + // major: 22, + // minor: 0, + // patch: 0, + // prerelease: [ 'next', 0 ], + // build: [ 'sha-c7dc705-with-local-changes' ], + // version: '22.0.0-next.0' + + return; + } - if (!satisfies(angularVersion, supportedAngularSemver, { includePrerelease: true })) { + if (!satisfies(angularCoreSemVer, supportedAngularSemver, { includePrerelease: true })) { console.error( `Error: The current version of "@angular/build" supports Angular versions ${supportedAngularSemver},\n` + - `but detected Angular version ${angularVersion} instead.\n` + + `but detected Angular version ${raw} instead.\n` + 'Please visit the link below to find instructions on how to update Angular.\nhttps://update.angular.dev/', ); diff --git a/packages/angular/build/src/utils/worker-pool.ts b/packages/angular/build/src/utils/worker-pool.ts index 78db4302ef1a..907de66ba02f 100644 --- a/packages/angular/build/src/utils/worker-pool.ts +++ b/packages/angular/build/src/utils/worker-pool.ts @@ -26,7 +26,9 @@ export class WorkerPool extends Piscina { // Enable compile code caching if enabled for the main process (only exists on Node.js v22.8+). // Skip if running inside Bazel via a RUNFILES environment variable check. The cache does not work // well with Bazel's hermeticity requirements. - const compileCacheDirectory = process.env['RUNFILES'] ? undefined : getCompileCacheDir?.(); + const compileCacheDirectory = process.env['JS_BINARY__RUNFILES'] + ? undefined + : getCompileCacheDir?.(); if (compileCacheDirectory) { if (typeof piscinaOptions.env === 'object') { piscinaOptions.env['NODE_COMPILE_CACHE'] = compileCacheDirectory; diff --git a/packages/angular/cli/BUILD.bazel b/packages/angular/cli/BUILD.bazel index 0eac4a2cede9..a49e30695138 100644 --- a/packages/angular/cli/BUILD.bazel +++ b/packages/angular/cli/BUILD.bazel @@ -172,6 +172,7 @@ npm_package( ], stamp_files = [ "src/utilities/version.js", + "src/utilities/node-version.js", ], tags = ["release-package"], deps = RUNTIME_ASSETS + [ diff --git a/packages/angular/cli/bin/bootstrap.js b/packages/angular/cli/bin/bootstrap.js index 18d1ed73160c..6b1a18db4d42 100644 --- a/packages/angular/cli/bin/bootstrap.js +++ b/packages/angular/cli/bin/bootstrap.js @@ -19,9 +19,9 @@ */ // Enable on-disk code caching if available (Node.js 22.8+) -// Skip if running inside Bazel via a RUNFILES environment variable check and no explicit cache +// Skip if running inside Bazel via a JS_BINARY__RUNFILES environment variable check and no explicit cache // location defined. The default cache location does not work well with Bazel's hermeticity requirements. -if (!process.env['RUNFILES'] || process.env['NODE_COMPILE_CACHE']) { +if (!process.env['JS_BINARY__RUNFILES'] || process.env['NODE_COMPILE_CACHE']) { try { const { enableCompileCache } = require('node:module'); diff --git a/packages/angular/cli/bin/ng.js b/packages/angular/cli/bin/ng.js index e0f5eb36a2ef..7303a5c05632 100755 --- a/packages/angular/cli/bin/ng.js +++ b/packages/angular/cli/bin/ng.js @@ -12,6 +12,7 @@ 'use strict'; const path = require('path'); +const nodeUtils = require('../src/utilities/node-version'); // Error if the external CLI appears to be used inside a google3 context. if (process.cwd().split(path.sep).includes('google3')) { @@ -42,10 +43,10 @@ if (rawCommandName === '--get-yargs-completions' || rawCommandName === 'completi // This node version check ensures that extremely old versions of node are not used. // These may not support ES2015 features such as const/let/async/await/etc. // These would then crash with a hard to diagnose error message. -const [major, minor] = process.versions.node.split('.', 2).map((part) => Number(part)); +const [major] = process.versions.node.split('.', 1).map((part) => Number(part)); if (major % 2 === 1) { - // Allow new odd numbered releases with a warning (currently v17+) + // Allow new odd numbered releases with a warning. console.warn( 'Node.js version ' + process.version + @@ -55,13 +56,15 @@ if (major % 2 === 1) { ); require('./bootstrap'); -} else if (major < 20 || (major === 20 && minor < 19) || (major === 22 && minor < 12)) { - // Error and exit if less than 20.19 or 22.12 +} else if (!nodeUtils.isNodeVersionSupported()) { + // Error and exit if less than 22.22 or 24.13.1 console.error( 'Node.js version ' + process.version + ' detected.\n' + - 'The Angular CLI requires a minimum Node.js version of v20.19 or v22.12.\n\n' + + 'The Angular CLI requires a minimum Node.js version of ' + + nodeUtils.supportedNodeVersions.map((v) => 'v' + v).join(' or ') + + '.\n\n' + 'Please update your Node.js version or visit https://nodejs.org/ for additional instructions.\n', ); diff --git a/packages/angular/cli/lib/cli/index.ts b/packages/angular/cli/lib/cli/index.ts index ac7591e43630..32f1eac5bab1 100644 --- a/packages/angular/cli/lib/cli/index.ts +++ b/packages/angular/cli/lib/cli/index.ts @@ -13,22 +13,18 @@ import { runCommand } from '../../src/command-builder/command-runner'; import { colors, supportColor } from '../../src/utilities/color'; import { ngDebug } from '../../src/utilities/environment-options'; import { writeErrorToLogFile } from '../../src/utilities/log-file'; +import { isNodeVersionMinSupported, supportedNodeVersions } from '../../src/utilities/node-version'; export { VERSION } from '../../src/utilities/version'; -const MIN_NODEJS_VERSION = [20, 19] as const; - /* eslint-disable no-console */ export default async function (options: { cliArgs: string[] }) { // This node version check ensures that the requirements of the project instance of the CLI are met - const [major, minor] = process.versions.node.split('.').map((part) => Number(part)); - if ( - major < MIN_NODEJS_VERSION[0] || - (major === MIN_NODEJS_VERSION[0] && minor < MIN_NODEJS_VERSION[1]) - ) { + + if (!isNodeVersionMinSupported()) { process.stderr.write( `Node.js version ${process.version} detected.\n` + - `The Angular CLI requires a minimum of v${MIN_NODEJS_VERSION[0]}.${MIN_NODEJS_VERSION[1]}.\n\n` + + `The Angular CLI requires a minimum of v${supportedNodeVersions[0]}.\n\n` + 'Please update your Node.js version or visit https://nodejs.org/ for additional instructions.\n', ); @@ -44,6 +40,7 @@ export default async function (options: { cliArgs: string[] }) { }; const logger = new logging.IndentLogger('cli-main-logger'); const logInfo = console.log; + const logWarn = console.warn; const logError = console.error; const useColor = supportColor(); @@ -113,5 +110,11 @@ export default async function (options: { cliArgs: string[] }) { } finally { logger.complete(); await loggerFinished; + + // Restore original console methods so that late consumers + // (e.g. process.on('exit') handlers) still produce output. + console.log = console.info = logInfo; + console.warn = logWarn; + console.error = logError; } } diff --git a/packages/angular/cli/lib/config/workspace-schema.json b/packages/angular/cli/lib/config/workspace-schema.json index 3fede1746559..f73424b5b554 100644 --- a/packages/angular/cli/lib/config/workspace-schema.json +++ b/packages/angular/cli/lib/config/workspace-schema.json @@ -417,8 +417,6 @@ "@angular-devkit/build-angular:karma", "@angular-devkit/build-angular:ng-packagr", "@angular-devkit/build-angular:prerender", - "@angular-devkit/build-angular:jest", - "@angular-devkit/build-angular:web-test-runner", "@angular-devkit/build-angular:server", "@angular-devkit/build-angular:ssr-dev-server" ] @@ -706,50 +704,6 @@ } } }, - { - "type": "object", - "additionalProperties": false, - "properties": { - "builder": { - "const": "@angular-devkit/build-angular:jest" - }, - "defaultConfiguration": { - "type": "string", - "description": "A default named configuration to use when a target configuration is not provided." - }, - "options": { - "$ref": "../../../../angular_devkit/build_angular/src/builders/jest/schema.json" - }, - "configurations": { - "type": "object", - "additionalProperties": { - "$ref": "../../../../angular_devkit/build_angular/src/builders/jest/schema.json" - } - } - } - }, - { - "type": "object", - "additionalProperties": false, - "properties": { - "builder": { - "const": "@angular-devkit/build-angular:web-test-runner" - }, - "defaultConfiguration": { - "type": "string", - "description": "A default named configuration to use when a target configuration is not provided." - }, - "options": { - "$ref": "../../../../angular_devkit/build_angular/src/builders/web-test-runner/schema.json" - }, - "configurations": { - "type": "object", - "additionalProperties": { - "$ref": "../../../../angular_devkit/build_angular/src/builders/web-test-runner/schema.json" - } - } - } - }, { "type": "object", "additionalProperties": false, diff --git a/packages/angular/cli/package.json b/packages/angular/cli/package.json index 2dc97162e59f..246b046bf853 100644 --- a/packages/angular/cli/package.json +++ b/packages/angular/cli/package.json @@ -4,7 +4,7 @@ "description": "CLI tool for Angular", "main": "lib/cli/index.js", "bin": { - "ng": "./bin/ng.js" + "ng": "bin/ng.js" }, "keywords": [ "angular", @@ -13,7 +13,7 @@ ], "repository": { "type": "git", - "url": "https://github.com/angular/angular-cli.git" + "url": "git+https://github.com/angular/angular-cli.git" }, "author": "Angular Authors", "license": "MIT", @@ -25,17 +25,17 @@ "@angular-devkit/architect": "workspace:0.0.0-EXPERIMENTAL-PLACEHOLDER", "@angular-devkit/core": "workspace:0.0.0-PLACEHOLDER", "@angular-devkit/schematics": "workspace:0.0.0-PLACEHOLDER", - "@inquirer/prompts": "7.10.1", - "@listr2/prompt-adapter-inquirer": "3.0.5", - "@modelcontextprotocol/sdk": "1.26.0", + "@inquirer/prompts": "8.3.2", + "@listr2/prompt-adapter-inquirer": "4.2.2", + "@modelcontextprotocol/sdk": "1.28.0", "@schematics/angular": "workspace:0.0.0-PLACEHOLDER", "@yarnpkg/lockfile": "1.1.0", - "algoliasearch": "5.48.1", + "algoliasearch": "5.50.0", "ini": "6.0.0", "jsonc-parser": "3.3.1", - "listr2": "9.0.5", + "listr2": "10.2.1", "npm-package-arg": "13.0.2", - "pacote": "21.3.1", + "pacote": "21.5.0", "parse5-html-rewriting-stream": "8.0.0", "semver": "7.7.4", "yargs": "18.0.0", diff --git a/packages/angular/cli/src/command-builder/command-module.ts b/packages/angular/cli/src/command-builder/command-module.ts index e5cc6f70473a..b0d15d70d0b2 100644 --- a/packages/angular/cli/src/command-builder/command-module.ts +++ b/packages/angular/cli/src/command-builder/command-module.ts @@ -153,12 +153,21 @@ export abstract class CommandModule<T extends {} = {}> implements CommandModuleI ['version', 'update', 'analytics'].includes(this.commandName), ); - return userId - ? new AnalyticsCollector(this.context.logger, userId, { - name: this.context.packageManager.name, - version: await this.context.packageManager.getVersion(), - }) - : undefined; + if (!userId) { + return undefined; + } + + let version: string | undefined; + try { + version = await this.context.packageManager.getVersion(); + } catch { + // Ignore errors if the package manager is not available. + } + + return new AnalyticsCollector(this.context.logger, userId, { + name: this.context.packageManager.name, + version, + }); } /** diff --git a/packages/angular/cli/src/command-builder/utilities/json-schema_spec.ts b/packages/angular/cli/src/command-builder/utilities/json-schema_spec.ts index d311373d69f0..11228e4adca0 100644 --- a/packages/angular/cli/src/command-builder/utilities/json-schema_spec.ts +++ b/packages/angular/cli/src/command-builder/utilities/json-schema_spec.ts @@ -9,7 +9,7 @@ import { JsonObject, schema } from '@angular-devkit/core'; import yargs from 'yargs'; -import { addSchemaOptionsToCommand, parseJsonSchemaToOptions } from './json-schema'; +import { Option, addSchemaOptionsToCommand, parseJsonSchemaToOptions } from './json-schema'; describe('parseJsonSchemaToOptions', () => { describe('without required fields in schema', () => { @@ -21,10 +21,9 @@ describe('parseJsonSchemaToOptions', () => { }; let localYargs: yargs.Argv<unknown>; - beforeEach(async () => { - // Create a fresh yargs for each call. The yargs object is stateful and - // calling .parse multiple times on the same instance isn't safe. - localYargs = yargs().exitProcess(false).strict().fail(false).wrap(1_000); + let options: Option[]; + + beforeAll(async () => { const jsonSchema = { 'type': 'object', 'properties': { @@ -118,12 +117,20 @@ describe('parseJsonSchemaToOptions', () => { }, }, }; + const registry = new schema.CoreSchemaRegistry(); - const options = await parseJsonSchemaToOptions( + options = await parseJsonSchemaToOptions( registry, jsonSchema as unknown as JsonObject, false, ); + }); + + beforeEach(async () => { + // Create a fresh yargs for each call. The yargs object is stateful and + // calling .parse multiple times on the same instance isn't safe. + localYargs = yargs().exitProcess(false).strict().fail(false).wrap(1_000); + addSchemaOptionsToCommand(localYargs, options, true); }); @@ -138,7 +145,15 @@ describe('parseJsonSchemaToOptions', () => { }); describe('type=array, enum', () => { - it('parses valid option value', async () => { + it('parses valid option value when specified once', async () => { + expect(await parse(['--arrayWithChoices', 'always', 'never'])).toEqual( + jasmine.objectContaining({ + 'arrayWithChoices': ['always', 'never'], + }), + ); + }); + + it('parses valid option value when specified multiple times', async () => { expect( await parse(['--arrayWithChoices', 'always', '--arrayWithChoices', 'never']), ).toEqual( @@ -160,7 +175,15 @@ describe('parseJsonSchemaToOptions', () => { }); describe('type=array, enum in oneOf', () => { - it('parses valid option value', async () => { + it('parses valid option value when specified once', async () => { + expect(await parse(['--arrayWithChoicesInOneOf', 'default', 'verbose'])).toEqual( + jasmine.objectContaining({ + 'arrayWithChoicesInOneOf': ['default', 'verbose'], + }), + ); + }); + + it('parses valid option value when specified multiple times', async () => { expect( await parse([ '--arrayWithChoicesInOneOf', @@ -183,7 +206,15 @@ describe('parseJsonSchemaToOptions', () => { }); describe('type=array, anyOf', () => { - it('parses valid option value', async () => { + it('parses valid option value when specified once', async () => { + expect(await parse(['--arrayWithComplexAnyOf', 'default', 'something-else'])).toEqual( + jasmine.objectContaining({ + 'arrayWithComplexAnyOf': ['default', 'something-else'], + }), + ); + }); + + it('parses valid option value when specified multiple times', async () => { expect( await parse([ '--arrayWithComplexAnyOf', diff --git a/packages/angular/cli/src/commands/add/cli.ts b/packages/angular/cli/src/commands/add/cli.ts index a27c6405f18f..136704947e69 100644 --- a/packages/angular/cli/src/commands/add/cli.ts +++ b/packages/angular/cli/src/commands/add/cli.ts @@ -8,9 +8,10 @@ import { Listr, ListrRenderer, ListrTaskWrapper, color, figures } from 'listr2'; import assert from 'node:assert'; +import { existsSync } from 'node:fs'; import fs from 'node:fs/promises'; import { createRequire } from 'node:module'; -import { dirname, join } from 'node:path'; +import { basename, dirname, join } from 'node:path'; import npa from 'npm-package-arg'; import semver, { Range, compare, intersects, prerelease, satisfies, valid } from 'semver'; import { Argv } from 'yargs'; @@ -44,6 +45,7 @@ interface AddCommandArgs extends SchematicsCommandArgs { interface AddCommandTaskContext { packageIdentifier: npa.Result; + isExactVersion: boolean; savePackage?: NgAddSaveDependency; collectionName?: string; executeSchematic: AddCommandModule['executeSchematic']; @@ -107,6 +109,7 @@ export default class AddCommandModule private readonly schematicName = 'ng-add'; private rootRequire = createRequire(this.context.root + '/'); #projectVersionCache = new Map<string, string | null>(); + #rootManifestCache: PackageManifest | null = null; override async builder(argv: Argv): Promise<Argv<AddCommandArgs>> { const localYargs = (await super.builder(argv)) @@ -156,6 +159,7 @@ export default class AddCommandModule async run(options: Options<AddCommandArgs> & OtherOptions): Promise<number | void> { this.#projectVersionCache.clear(); + this.#rootManifestCache = null; const { logger } = this.context; const { collection, skipConfirmation } = options; @@ -185,6 +189,7 @@ export default class AddCommandModule const taskContext = { packageIdentifier, + isExactVersion: packageIdentifier.type === 'version', executeSchematic: this.executeSchematic.bind(this), getPeerDependencyConflicts: this.getPeerDependencyConflicts.bind(this), dryRun: options.dryRun, @@ -489,12 +494,9 @@ export default class AddCommandModule let manifest; try { - manifest = await this.context.packageManager.getManifest( - context.packageIdentifier.toString(), - { - registry, - }, - ); + manifest = await this.context.packageManager.getManifest(context.packageIdentifier, { + registry, + }); } catch (e) { assertIsError(e); throw new CommandError( @@ -508,6 +510,17 @@ export default class AddCommandModule ); } + // Avoid fully resolving the package version from the registry again in later steps + if (context.packageIdentifier.registry) { + assert(context.packageIdentifier.name, 'Registry package identifier must have a name'); + context.packageIdentifier = npa.resolve( + context.packageIdentifier.name, + // `save-prefix` option is ignored by some package managers so the caret is needed to ensure + // that the value in the project package.json is correct. + (context.isExactVersion ? '' : '^') + manifest.version, + ); + } + context.hasSchematics = !!manifest.schematics; context.savePackage = manifest['ng-add']?.save; context.collectionName = manifest.name; @@ -583,7 +596,7 @@ export default class AddCommandModule await packageManager.add( packageIdentifier.toString(), 'none', - savePackage !== 'dependencies', + savePackage === 'devDependencies', false, true, { @@ -657,18 +670,7 @@ export default class AddCommandModule } private isPackageInstalled(name: string): boolean { - try { - this.rootRequire.resolve(join(name, 'package.json')); - - return true; - } catch (e) { - assertIsError(e); - if (e.code !== 'MODULE_NOT_FOUND') { - throw e; - } - } - - return false; + return !!this.resolvePackageJson(name); } private executeSchematic( @@ -707,12 +709,7 @@ export default class AddCommandModule return cachedVersion; } - const { root } = this.context; - let installedPackagePath; - try { - installedPackagePath = this.rootRequire.resolve(join(name, 'package.json')); - } catch {} - + const installedPackagePath = this.resolvePackageJson(name); if (installedPackagePath) { try { const installedPackage = JSON.parse( @@ -724,13 +721,7 @@ export default class AddCommandModule } catch {} } - let projectManifest; - try { - projectManifest = JSON.parse( - await fs.readFile(join(root, 'package.json'), 'utf-8'), - ) as PackageManifest; - } catch {} - + const projectManifest = await this.getProjectManifest(); if (projectManifest) { const version = projectManifest.dependencies?.[name] || projectManifest.devDependencies?.[name]; @@ -746,6 +737,58 @@ export default class AddCommandModule return null; } + private async getProjectManifest(): Promise<PackageManifest | null> { + if (this.#rootManifestCache) { + return this.#rootManifestCache; + } + + const { root } = this.context; + try { + this.#rootManifestCache = JSON.parse( + await fs.readFile(join(root, 'package.json'), 'utf-8'), + ) as PackageManifest; + + return this.#rootManifestCache; + } catch { + return null; + } + } + + private resolvePackageJson(name: string): string | undefined { + try { + return this.rootRequire.resolve(join(name, 'package.json')); + } catch (e) { + assertIsError(e); + if (e.code === 'ERR_PACKAGE_PATH_NOT_EXPORTED') { + try { + const mainPath = this.rootRequire.resolve(name); + let directory = dirname(mainPath); + + // Stop at the node_modules boundary or the root of the file system + while (directory && basename(directory) !== 'node_modules') { + const packageJsonPath = join(directory, 'package.json'); + if (existsSync(packageJsonPath)) { + return packageJsonPath; + } + + const parent = dirname(directory); + if (parent === directory) { + break; + } + directory = parent; + } + } catch (e) { + assertIsError(e); + this.context.logger.debug( + `Failed to resolve package '${name}' during fallback: ${e.message}`, + ); + } + } + } + + return undefined; + } + private async getPeerDependencyConflicts(manifest: PackageManifest): Promise<string[] | false> { if (!manifest.peerDependencies) { return false; diff --git a/packages/angular/cli/src/commands/mcp/host.ts b/packages/angular/cli/src/commands/mcp/host.ts index 1ff0bb9724b3..94ac449fe356 100644 --- a/packages/angular/cli/src/commands/mcp/host.ts +++ b/packages/angular/cli/src/commands/mcp/host.ts @@ -118,6 +118,11 @@ export interface Host { * Finds an available TCP port on the system. */ getAvailablePort(): Promise<number>; + + /** + * Checks whether a TCP port is available on the system. + */ + isPortAvailable(port: number): Promise<boolean>; } /** @@ -236,4 +241,16 @@ export const LocalWorkspaceHost: Host = { }); }); }, + + isPortAvailable(port: number): Promise<boolean> { + return new Promise((resolve) => { + const server = createServer(); + server.once('error', () => resolve(false)); + server.listen(port, () => { + server.close(() => { + resolve(true); + }); + }); + }); + }, }; diff --git a/packages/angular/cli/src/commands/mcp/testing/mock-host.ts b/packages/angular/cli/src/commands/mcp/testing/mock-host.ts index 29f41c24e101..ce2e5177ffab 100644 --- a/packages/angular/cli/src/commands/mcp/testing/mock-host.ts +++ b/packages/angular/cli/src/commands/mcp/testing/mock-host.ts @@ -21,4 +21,5 @@ export class MockHost implements Host { resolveModule = jasmine.createSpy('resolveRequest').and.returnValue('/dev/null'); spawn = jasmine.createSpy('spawn'); getAvailablePort = jasmine.createSpy('getAvailablePort'); + isPortAvailable = jasmine.createSpy('isPortAvailable').and.resolveTo(true); } diff --git a/packages/angular/cli/src/commands/mcp/testing/test-utils.ts b/packages/angular/cli/src/commands/mcp/testing/test-utils.ts index 7afcd695dd7d..1bdf2ef416a5 100644 --- a/packages/angular/cli/src/commands/mcp/testing/test-utils.ts +++ b/packages/angular/cli/src/commands/mcp/testing/test-utils.ts @@ -27,6 +27,9 @@ export function createMockHost(): MockHost { getAvailablePort: jasmine .createSpy<Host['getAvailablePort']>('getAvailablePort') .and.resolveTo(0), + isPortAvailable: jasmine + .createSpy<Host['isPortAvailable']>('isPortAvailable') + .and.resolveTo(true), } as unknown as MockHost; } diff --git a/packages/angular/cli/src/commands/mcp/tools/build.ts b/packages/angular/cli/src/commands/mcp/tools/build.ts index 5f6ce7a020a0..45d3765b3c86 100644 --- a/packages/angular/cli/src/commands/mcp/tools/build.ts +++ b/packages/angular/cli/src/commands/mcp/tools/build.ts @@ -47,7 +47,7 @@ export async function runBuild(input: BuildToolInput, context: McpToolContext) { const args = ['build', projectName, '-c', input.configuration ?? DEFAULT_CONFIGURATION]; let status: BuildStatus = 'success'; - let logs: string[] = []; + let logs: string[]; let outputPath: string | undefined; try { diff --git a/packages/angular/cli/src/commands/mcp/tools/devserver/devserver-start.ts b/packages/angular/cli/src/commands/mcp/tools/devserver/devserver-start.ts index 272bf6800300..f5f413cfad30 100644 --- a/packages/angular/cli/src/commands/mcp/tools/devserver/devserver-start.ts +++ b/packages/angular/cli/src/commands/mcp/tools/devserver/devserver-start.ts @@ -15,6 +15,13 @@ import { type McpToolContext, type McpToolDeclaration, declareTool } from '../to const devserverStartToolInputSchema = z.object({ ...workspaceAndProjectOptions, + port: z + .number() + .optional() + .describe( + 'The port number to run the server on. If not provided, a random available port will be chosen. ' + + 'It is recommended to reuse port numbers across calls within the same workspace to maintain consistency.', + ), }); export type DevserverStartToolInput = z.infer<typeof devserverStartToolInputSchema>; @@ -53,7 +60,17 @@ export async function startDevserver(input: DevserverStartToolInput, context: Mc }); } - const port = await context.host.getAvailablePort(); + let port: number; + if (input.port) { + if (!(await context.host.isPortAvailable(input.port))) { + throw new Error( + `Port ${input.port} is unavailable. Try calling this tool again without the 'port' parameter to auto-assign a free port.`, + ); + } + port = input.port; + } else { + port = await context.host.getAvailablePort(); + } devserver = new LocalDevserver({ host: context.host, @@ -87,14 +104,18 @@ the first build completes. background. * **Get Initial Build Logs:** Once a dev server has started, use the "devserver.wait_for_build" tool to ensure it's alive. If there are any build errors, "devserver.wait_for_build" would provide them back and you can give them to the user or rely on them to propose a fix. -* **Get Updated Build Logs:** Important: as long as a devserver is alive (i.e. "devserver.stop" wasn't called), after every time you make a - change to the workspace, re-run "devserver.wait_for_build" to see whether the change was successfully built and wait for the devserver to - be updated. +* **Get Updated Build Logs:** Important: as long as a devserver is alive (i.e. "devserver.stop" wasn't called), after every time you + make a change to the workspace, re-run "devserver.wait_for_build" to see whether the change was successfully built and wait for the + devserver to be updated. </Use Cases> <Operational Notes> * This tool manages development servers by itself. It maintains at most a single dev server instance for each project in the monorepo. * This is an asynchronous operation. Subsequent commands can be ran while the server is active. * Use 'devserver.stop' to gracefully shut down the server and access the full log output. +* **Keeping the Server Alive**: It is often better to keep the server alive between tool calls if you expect the user to request more + changes or run more tests, as it saves time on restarts and maintains the file watcher state. You must still call + 'devserver.wait_for_build' after every change to see whether the change was successfully built and be sure that that app was updated. +* **Consistent Ports**: If making multiple calls, it is recommended to reuse the port you got from the first call for subsequent ones. </Operational Notes> `, isReadOnly: true, diff --git a/packages/angular/cli/src/commands/mcp/tools/devserver/devserver_spec.ts b/packages/angular/cli/src/commands/mcp/tools/devserver/devserver_spec.ts index 93c6b367cb70..52a66902e2ef 100644 --- a/packages/angular/cli/src/commands/mcp/tools/devserver/devserver_spec.ts +++ b/packages/angular/cli/src/commands/mcp/tools/devserver/devserver_spec.ts @@ -64,6 +64,31 @@ describe('Serve Tools', () => { expect(mockProcess.kill).toHaveBeenCalled(); }); + it('should use the provided port number', async () => { + const startResult = await startDevserver({ port: 54321 }, mockContext); + expect(startResult.structuredContent.message).toBe( + `Development server for project 'my-app' started and watching for workspace changes.`, + ); + expect(mockHost.spawn).toHaveBeenCalledWith('ng', ['serve', 'my-app', '--port=54321'], { + stdio: 'pipe', + cwd: '/test', + }); + expect(mockHost.getAvailablePort).not.toHaveBeenCalled(); + }); + + it('should throw an error if the provided port is taken', async () => { + mockHost.isPortAvailable.and.resolveTo(false); + + try { + await startDevserver({ port: 55555 }, mockContext); + fail('Should have thrown an error'); + } catch (e) { + expect((e as Error).message).toContain( + "Port 55555 is unavailable. Try calling this tool again without the 'port' parameter to auto-assign a free port.", + ); + } + }); + it('should wait for a build to complete', async () => { await startDevserver({}, mockContext); diff --git a/packages/angular/cli/src/commands/mcp/tools/e2e.ts b/packages/angular/cli/src/commands/mcp/tools/e2e.ts index 93ae2b55b5a6..1354e9ad19e4 100644 --- a/packages/angular/cli/src/commands/mcp/tools/e2e.ts +++ b/packages/angular/cli/src/commands/mcp/tools/e2e.ts @@ -58,7 +58,7 @@ export async function runE2e(input: E2eToolInput, host: Host, context: McpToolCo const args = ['e2e', projectName]; let status: E2eStatus = 'success'; - let logs: string[] = []; + let logs: string[]; try { logs = (await host.runCommand('ng', args, { cwd: workspacePath })).logs; diff --git a/packages/angular/cli/src/commands/mcp/tools/onpush-zoneless-migration/migrate-single-file.ts b/packages/angular/cli/src/commands/mcp/tools/onpush-zoneless-migration/migrate-single-file.ts index 1a1bc2c58f34..afd6316da83d 100644 --- a/packages/angular/cli/src/commands/mcp/tools/onpush-zoneless-migration/migrate-single-file.ts +++ b/packages/angular/cli/src/commands/mcp/tools/onpush-zoneless-migration/migrate-single-file.ts @@ -16,6 +16,8 @@ import { sendDebugMessage } from './send-debug-message'; import { getImportSpecifier, loadTypescript } from './ts-utils'; import type { MigrationResponse } from './types'; +const supportedStrategies: ReadonlySet<string> = new Set(['OnPush', 'Default', 'Eager']); + export async function migrateSingleFile( sourceFile: SourceFile, extras: RequestHandlerExtra<ServerRequest, ServerNotification>, @@ -31,7 +33,7 @@ export async function migrateSingleFile( return unsupportedZoneUseResponse; } - let detectedStrategy: 'OnPush' | 'Default' | undefined; + let detectedStrategy: string | undefined; let hasComponentDecorator = false; const componentSpecifier = await getImportSpecifier(sourceFile, '@angular/core', 'Component'); @@ -63,7 +65,7 @@ export async function migrateSingleFile( prop.initializer.expression.getText(sourceFile) === 'ChangeDetectionStrategy' ) { const strategy = prop.initializer.name.text; - if (strategy === 'OnPush' || strategy === 'Default') { + if (supportedStrategies.has(strategy)) { detectedStrategy = strategy; return; @@ -77,13 +79,7 @@ export async function migrateSingleFile( ts.forEachChild(node, visit); }); - if ( - !hasComponentDecorator || - // component uses OnPush. We don't have anything more to do here. - detectedStrategy === 'OnPush' || - // Explicit default strategy, assume there's a reason for it (already migrated, or is a library that hosts Default components) and skip. - detectedStrategy === 'Default' - ) { + if (!hasComponentDecorator || (detectedStrategy && supportedStrategies.has(detectedStrategy))) { sendDebugMessage( `Component decorator found with strategy: ${detectedStrategy} in file: ${sourceFile.fileName}. Skipping migration for file.`, extras, diff --git a/packages/angular/cli/src/commands/mcp/tools/onpush-zoneless-migration/migrate-single-file_spec.ts b/packages/angular/cli/src/commands/mcp/tools/onpush-zoneless-migration/migrate-single-file_spec.ts index 20ed43626639..442dc2c68378 100644 --- a/packages/angular/cli/src/commands/mcp/tools/onpush-zoneless-migration/migrate-single-file_spec.ts +++ b/packages/angular/cli/src/commands/mcp/tools/onpush-zoneless-migration/migrate-single-file_spec.ts @@ -85,7 +85,7 @@ describe('migrateSingleFile', () => { expect(result).toBeNull(); }); - it('should return null if component has ChangeDetectionStrategy.Default', async () => { + it('should return null if component has ChangeDetectionStrategy.Eager', async () => { const fileName = 'app.component.ts'; const content = ` import { Component, ChangeDetectionStrategy } from '@angular/core'; @@ -93,7 +93,7 @@ describe('migrateSingleFile', () => { @Component({ selector: 'app-root', template: 'Hello', - changeDetection: ChangeDetectionStrategy.Default, + changeDetection: ChangeDetectionStrategy.Eager, }) export class AppComponent {} `; diff --git a/packages/angular/cli/src/commands/mcp/tools/onpush-zoneless-migration/prompts.ts b/packages/angular/cli/src/commands/mcp/tools/onpush-zoneless-migration/prompts.ts index f4eba63ceb4c..af925bd4f70a 100644 --- a/packages/angular/cli/src/commands/mcp/tools/onpush-zoneless-migration/prompts.ts +++ b/packages/angular/cli/src/commands/mcp/tools/onpush-zoneless-migration/prompts.ts @@ -130,11 +130,11 @@ export function generateZonelessMigrationInstructionsForComponent( * **(Preferred) Convert to Signal**: The best approach is to convert the property to an Angular Signal. This is the most idiomatic and future-proof way to handle state in zoneless applications. * **(Alternative) Use \`markForCheck()\`**: If converting to a signal is too complex or would require extensive refactoring, you can instead inject \`ChangeDetectorRef\` and call \`this.cdr.markForCheck()\` immediately after the property is updated. - #### Step 2: Add \`ChangeDetectionStrategy.Default\` + #### Step 2: Add \`ChangeDetectionStrategy.Eager\` After you have refactored all necessary properties, you must update the component's decorator to explicitly set the change detection strategy. 1. Add \`ChangeDetectionStrategy\` to the import from \`@angular/core\`. - 2. In the \`@Component\` decorator, add the property \`changeDetection: ChangeDetectionStrategy.Default\`. + 2. In the \`@Component\` decorator, add the property \`changeDetection: ChangeDetectionStrategy.Eager\`. 3. Add a \`// TODO\` comment above this line explaining that the component should be fully migrated to \`OnPush\` after the application has been tested with these changes. Example: @@ -143,14 +143,14 @@ export function generateZonelessMigrationInstructionsForComponent( ... // TODO: This component has been partially migrated to be zoneless-compatible. // After testing, this should be updated to ChangeDetectionStrategy.OnPush. - changeDetection: ChangeDetectionStrategy.Default, + changeDetection: ChangeDetectionStrategy.Eager, }) \`\`\` ### IMPORTANT: Rules and Constraints You must follow these rules without exception: 1. **DO** apply one of the two refactoring strategies (signals or \`markForCheck()\`) for all relevant component properties. - 2. **DO** add \`changeDetection: ChangeDetectionStrategy.Default\` with the specified TODO comment as the final code change. + 2. **DO** add \`changeDetection: ChangeDetectionStrategy.Eager\` with the specified TODO comment as the final code change. 3. **DO NOT** use \`ChangeDetectionStrategy.OnPush\`. This will be the next step in the migration, but it is not part of this task. 4. **DO NOT** modify properties that are already signals or are used with the \`async\` pipe in the template, as they are already zoneless-compatible. 5. **DO NOT** make any changes to files other than the component file at \`${filePath}\` and its direct template/style files if necessary. diff --git a/packages/angular/cli/src/commands/mcp/tools/onpush-zoneless-migration/zoneless-migration.ts b/packages/angular/cli/src/commands/mcp/tools/onpush-zoneless-migration/zoneless-migration.ts index f85a6f322c60..28941e47b355 100644 --- a/packages/angular/cli/src/commands/mcp/tools/onpush-zoneless-migration/zoneless-migration.ts +++ b/packages/angular/cli/src/commands/mcp/tools/onpush-zoneless-migration/zoneless-migration.ts @@ -137,7 +137,7 @@ async function discoverAndCategorizeFiles( isDirectory = statSync(fileOrDirPath).isDirectory(); } catch (e) { // Re-throw to be handled by the main function as a user input error - throw new Error(`Failed to access path: ${fileOrDirPath}`); + throw new Error(`Failed to access path: ${fileOrDirPath}`, { cause: e }); } if (isDirectory) { @@ -204,8 +204,7 @@ async function categorizeFile( componentTestFiles.add(sourceFile); } else if (componentSpecifier) { if ( - !content.includes('changeDetectionStrategy: ChangeDetectionStrategy.OnPush') && - !content.includes('changeDetectionStrategy: ChangeDetectionStrategy.Default') + !/changeDetectionStrategy:\s*ChangeDetectionStrategy\.(?:OnPush|Default|Eager)/.test(content) ) { filesWithComponents.add(sourceFile); } else { diff --git a/packages/angular/cli/src/commands/mcp/tools/projects.ts b/packages/angular/cli/src/commands/mcp/tools/projects.ts index 8c6eb5d332f6..49c0bd19f839 100644 --- a/packages/angular/cli/src/commands/mcp/tools/projects.ts +++ b/packages/angular/cli/src/commands/mcp/tools/projects.ts @@ -467,7 +467,7 @@ async function loadAndParseWorkspace( const projects = []; const workspaceRoot = dirname(configFile); for (const [name, project] of ws.projects.entries()) { - const sourceRoot = posix.join(project.root, project.sourceRoot ?? 'src'); + const sourceRoot = project.sourceRoot ?? posix.join(project.root, 'src'); const fullSourceRoot = join(workspaceRoot, sourceRoot); const unitTestFramework = getUnitTestFramework(project.targets.get('test')); const styleLanguage = await getProjectStyleLanguage(project, ws, fullSourceRoot); @@ -544,6 +544,31 @@ async function processConfigFile( } } +/** + * Deduplicates overlapping search roots (e.g., if one is a child of another). + * Sorting by length ensures parent directories are processed before children. + * @param roots A list of normalized absolute paths used as search roots. + * @returns A deduplicated list of search roots. + */ +function deduplicateSearchRoots(roots: string[]): string[] { + const sortedRoots = [...roots].sort((a, b) => a.length - b.length); + const deduplicated: string[] = []; + + for (const root of sortedRoots) { + const isSubdirectory = deduplicated.some((existing) => { + const rel = relative(existing, root); + + return rel === '' || (!rel.startsWith('..') && !isAbsolute(rel)); + }); + + if (!isSubdirectory) { + deduplicated.push(root); + } + } + + return deduplicated; +} + async function createListProjectsHandler({ server }: McpToolContext) { return async () => { const workspaces: WorkspaceData[] = []; @@ -562,6 +587,8 @@ async function createListProjectsHandler({ server }: McpToolContext) { searchRoots = [process.cwd()]; } + searchRoots = deduplicateSearchRoots(searchRoots); + // Pre-resolve allowed roots to handle their own symlinks or normalizations. // We ignore failures here; if a root is broken, we simply won't match against it. const realAllowedRoots = searchRoots diff --git a/packages/angular/cli/src/commands/mcp/tools/test.ts b/packages/angular/cli/src/commands/mcp/tools/test.ts index f3a1440b01ce..2ace1496dd46 100644 --- a/packages/angular/cli/src/commands/mcp/tools/test.ts +++ b/packages/angular/cli/src/commands/mcp/tools/test.ts @@ -49,7 +49,7 @@ export async function runTest(input: TestToolInput, context: McpToolContext) { } let status: TestStatus = 'success'; - let logs: string[] = []; + let logs: string[]; try { logs = (await context.host.runCommand('ng', args, { cwd: workspacePath })).logs; diff --git a/packages/angular/cli/src/commands/mcp/workspace-utils.ts b/packages/angular/cli/src/commands/mcp/workspace-utils.ts index 87a4cdc6c1bc..d1edf55fa56b 100644 --- a/packages/angular/cli/src/commands/mcp/workspace-utils.ts +++ b/packages/angular/cli/src/commands/mcp/workspace-utils.ts @@ -123,11 +123,7 @@ export async function resolveWorkspaceAndProject({ try { workspace = await AngularWorkspace.load(configPath); } catch (e) { - throw new Error( - `Failed to load workspace configuration at ${configPath}: ${ - e instanceof Error ? e.message : e - }`, - ); + throw new Error(`Failed to load workspace configuration at ${configPath}`, { cause: e }); } } else if (mcpWorkspace) { workspace = mcpWorkspace; @@ -146,11 +142,7 @@ export async function resolveWorkspaceAndProject({ try { workspace = await AngularWorkspace.load(configPath); } catch (e) { - throw new Error( - `Failed to load workspace configuration at ${configPath}: ${ - e instanceof Error ? e.message : e - }`, - ); + throw new Error(`Failed to load workspace configuration at ${configPath}.`, { cause: e }); } } diff --git a/packages/angular/cli/src/commands/update/cli.ts b/packages/angular/cli/src/commands/update/cli.ts index 9f990845b59b..de6d7f53fea0 100644 --- a/packages/angular/cli/src/commands/update/cli.ts +++ b/packages/angular/cli/src/commands/update/cli.ts @@ -265,7 +265,7 @@ export default class UpdateCommandModule extends CommandModule<UpdateCommandArgs return options.migrateOnly ? this.migrateOnly( workflow, - (options.packages ?? [])[0], + packages[0].name as string, rootDependencies, options, packageManager, @@ -287,14 +287,13 @@ export default class UpdateCommandModule extends CommandModule<UpdateCommandArgs packageManager: PackageManager, ): Promise<number | void> { const { logger } = this.context; - let packageDependency = rootDependencies.get(packageName); + const packageDependency = rootDependencies.get(packageName); let packagePath = packageDependency?.path; let packageNode: PackageManifest | undefined; if (!packageDependency) { const installed = await packageManager.getInstalledPackage(packageName); if (installed) { - packageDependency = installed; packagePath = installed.path; } } @@ -450,7 +449,7 @@ export default class UpdateCommandModule extends CommandModule<UpdateCommandArgs for (const { identifier: requestIdentifier, node } of requests) { const packageName = requestIdentifier.name; - let manifest: PackageManifest | null = null; + let manifest: PackageManifest | null; try { manifest = await packageManager.getManifest(requestIdentifier); } catch (e) { diff --git a/packages/angular/cli/src/commands/update/long-description.md b/packages/angular/cli/src/commands/update/long-description.md index 612971de0c4d..1771f7ffe1de 100644 --- a/packages/angular/cli/src/commands/update/long-description.md +++ b/packages/angular/cli/src/commands/update/long-description.md @@ -13,10 +13,10 @@ ng update @angular/cli@^<major_version> @angular/core@^<major_version> ``` We recommend that you always update to the latest patch version, as it contains fixes we released since the initial major release. -For example, use the following command to take the latest 10.x.x version and use that to update. +For example, use the following command to take the latest 21.x.x version and use that to update. ``` -ng update @angular/cli@^10 @angular/core@^10 +ng update @angular/cli@^21 @angular/core@^21 ``` -For detailed information and guidance on updating your application, see the interactive [Angular Update Guide](https://update.angular.dev/). +For detailed information and guidance on updating your application, see the interactive [Angular Update Guide](/update-guide). diff --git a/packages/angular/cli/src/commands/update/schematic/index.ts b/packages/angular/cli/src/commands/update/schematic/index.ts index 73fd3e342a5a..e110480d09a5 100644 --- a/packages/angular/cli/src/commands/update/schematic/index.ts +++ b/packages/angular/cli/src/commands/update/schematic/index.ts @@ -505,7 +505,9 @@ function _usageMessage( logger.info( ' ' + ['Name', 'Version', 'Command to update'].map((x, i) => x.padEnd(pads[i])).join(''), ); - logger.info(' ' + '-'.repeat(pads.reduce((s, x) => (s += x), 0) + 20)); + + const totalWidth = pads.reduce((sum, width) => sum + width, 20); + logger.info(` ${'-'.repeat(totalWidth)}`); packagesToUpdate.forEach((fields) => { if (!fields) { @@ -681,7 +683,7 @@ function _addPackageGroup( if (!packageGroup) { return; } - let packageGroupNormalized: Record<string, string> = {}; + let packageGroupNormalized: Record<string, string>; if (Array.isArray(packageGroup) && !packageGroup.some((x) => typeof x != 'string')) { packageGroupNormalized = packageGroup.reduce( (acc, curr) => { @@ -884,6 +886,13 @@ export default function (options: UpdateSchema): Rule { lastPackagesSize = packages.size; npmPackageJsonMap.forEach((npmPackageJson) => { _addPackageGroup(tree, packages, npmDeps, npmPackageJson, logger); + }); + } while (packages.size > lastPackagesSize); + + // This is done in seperate loop to ensure that package groups are added before peer dependencies. + do { + lastPackagesSize = packages.size; + npmPackageJsonMap.forEach((npmPackageJson) => { _addPeerDependencies(tree, packages, npmDeps, npmPackageJson, npmPackageJsonMap, logger); }); } while (packages.size > lastPackagesSize); diff --git a/packages/angular/cli/src/commands/update/schematic/index_spec.ts b/packages/angular/cli/src/commands/update/schematic/index_spec.ts index 3954e3c78254..11b2a0b5855e 100644 --- a/packages/angular/cli/src/commands/update/schematic/index_spec.ts +++ b/packages/angular/cli/src/commands/update/schematic/index_spec.ts @@ -335,4 +335,57 @@ describe('@schematics/update', () => { const resultTreeContent = resultTree.readContent('/package.json'); expect(resultTreeContent.endsWith('}')).toBeTrue(); }); + + it('updates group members to the same version as the targeted package', async () => { + const packageJsonContent = `{ + "name": "test", + "dependencies": { + "@angular/cdk": "^19.2.19", + "@angular/common": "^19.2.0", + "@angular/compiler": "^19.2.0", + "@angular/core": "^19.2.0", + "@angular/forms": "^19.2.0", + "@angular/platform-browser": "^19.2.0", + "@angular/platform-browser-dynamic": "^19.2.0", + "@angular/router": "^19.2.0", + "rxjs": "~7.8.0", + "tslib": "^2.3.0", + "zone.js": "~0.15.0" + }, + "devDependencies": { + "@angular-devkit/build-angular": "^19.2.21", + "@angular/cli": "^19.2.21", + "@angular/compiler-cli": "^19.2.0", + "typescript": "~5.7.2" + } + }`; + + const inputTree = new UnitTestTree( + new HostTree( + new virtualFs.test.TestHost({ + '/package.json': packageJsonContent, + }), + ), + ); + + const resultTree = await schematicRunner.runSchematic( + 'update', + { force: true, packages: ['@angular/cli@20', '@angular/cdk@20', '@angular/core@20'] }, + inputTree, + ); + + const { devDependencies, dependencies } = resultTree.readJson('/package.json') as { + devDependencies: Record<string, string>; + dependencies: Record<string, string>; + }; + + const version20Regexp = /^\^20.\d+.\d+$/; + + expect(devDependencies['typescript']).toMatch(/5\.9\.\d+/); + expect(devDependencies['@angular/cli']).toMatch(version20Regexp); + expect(devDependencies['@angular/compiler-cli']).toMatch(version20Regexp); + expect(dependencies['@angular/cdk']).toMatch(version20Regexp); + expect(dependencies['@angular/common']).toMatch(version20Regexp); + expect(dependencies['@angular/core']).toMatch(version20Regexp); + }); }); diff --git a/packages/angular/cli/src/commands/version/version-info.ts b/packages/angular/cli/src/commands/version/version-info.ts index 3e75c2c58cac..128cc8ef5449 100644 --- a/packages/angular/cli/src/commands/version/version-info.ts +++ b/packages/angular/cli/src/commands/version/version-info.ts @@ -8,7 +8,7 @@ import { createRequire } from 'node:module'; import { CommandContext } from '../../command-builder/definitions'; -import { PackageManager } from '../../package-managers'; +import { isNodeVersionSupported } from '../../utilities/node-version'; import { VERSION } from '../../utilities/version'; /** @@ -56,12 +56,6 @@ export interface VersionInfo { packages: Record<string, PackageVersionInfo>; } -/** - * Major versions of Node.js that are officially supported by Angular. - * @see https://angular.dev/reference/versions#supported-node-js-versions - */ -const SUPPORTED_NODE_MAJORS = [20, 22, 24]; - /** * A list of regular expression patterns that match package names that should be included in the * version output. @@ -92,9 +86,6 @@ export async function gatherVersionInfo(context: CommandContext): Promise<Versio workspacePackage = workspaceRequire('./package.json'); } catch {} - const [nodeMajor] = process.versions.node.split('.').map((part) => Number(part)); - const unsupportedNodeVersion = !SUPPORTED_NODE_MAJORS.includes(nodeMajor); - const allDependencies = { ...workspacePackage?.dependencies, ...workspacePackage?.devDependencies, @@ -123,7 +114,7 @@ export async function gatherVersionInfo(context: CommandContext): Promise<Versio system: { node: { version: process.versions.node, - unsupported: unsupportedNodeVersion, + unsupported: !isNodeVersionSupported(), }, os: { platform: process.platform, diff --git a/packages/angular/cli/src/package-managers/host.ts b/packages/angular/cli/src/package-managers/host.ts index 433b54414f69..cee68015f677 100644 --- a/packages/angular/cli/src/package-managers/host.ts +++ b/packages/angular/cli/src/package-managers/host.ts @@ -24,6 +24,12 @@ import { PackageManagerError } from './error'; * An abstraction layer for side-effectful operations. */ export interface Host { + /** + * Whether shell quoting is required for package manager specifiers. + * This is typically true on Windows, where commands are executed in a shell. + */ + readonly requiresQuoting?: boolean; + /** * Creates a directory. * @param path The path to the directory. @@ -101,6 +107,7 @@ export interface Host { */ export const NodeJS_HOST: Host = { stat, + requiresQuoting: platform() === 'win32', mkdir, readFile: (path: string) => readFile(path, { encoding: 'utf8' }), copyFile: (src, dest) => copyFile(src, dest, constants.COPYFILE_FICLONE), @@ -130,6 +137,9 @@ export const NodeJS_HOST: Host = { env: { ...process.env, ...options.env, + // NPM updater notifier will prevents the child process from closing until it timeout after 3 minutes. + NO_UPDATE_NOTIFIER: '1', + NPM_CONFIG_UPDATE_NOTIFIER: 'false', }, } satisfies SpawnOptions; const childProcess = isWin32 diff --git a/packages/angular/cli/src/package-managers/package-manager.ts b/packages/angular/cli/src/package-managers/package-manager.ts index fd3b0a663a79..0dfb89e57371 100644 --- a/packages/angular/cli/src/package-managers/package-manager.ts +++ b/packages/angular/cli/src/package-managers/package-manager.ts @@ -14,7 +14,7 @@ import { join, relative, resolve } from 'node:path'; import npa from 'npm-package-arg'; -import { maxSatisfying } from 'semver'; +import { maxSatisfying, valid } from 'semver'; import { PackageManagerError } from './error'; import { Host } from './host'; import { Logger } from './logger'; @@ -34,7 +34,7 @@ const METADATA_FIELDS = ['name', 'dist-tags', 'versions', 'time'] as const; * This is a performance optimization to avoid downloading unnecessary data. * These fields are the ones required by the CLI for operations like `ng add` and `ng update`. */ -const MANIFEST_FIELDS = [ +export const MANIFEST_FIELDS = [ 'name', 'version', 'deprecated', @@ -323,7 +323,9 @@ export class PackageManager { ignoreScripts ? this.descriptor.ignoreScriptsFlag : '', ].filter((flag) => flag); - const args = [this.descriptor.addCommand, packageName, ...flags]; + const specifier = this.host.requiresQuoting ? `"${packageName}"` : packageName; + const args = [this.descriptor.addCommand, specifier, ...flags]; + await this.#run(args, options); this.#dependencyCache = null; @@ -370,6 +372,10 @@ export class PackageManager { const { stdout } = await this.#run(this.descriptor.versionCommand); this.#version = stdout.trim(); + if (!valid(this.#version)) { + throw new Error(`Invalid semver version for ${this.name}: "${this.#version}"`); + } + return this.#version; } @@ -440,7 +446,9 @@ export class PackageManager { version: string, options: { timeout?: number; registry?: string; bypassCache?: boolean } = {}, ): Promise<PackageManifest | null> { - const specifier = `${packageName}@${version}`; + const specifier = this.host.requiresQuoting + ? `"${packageName}@${version}"` + : `${packageName}@${version}`; const commandArgs = [...this.descriptor.getManifestCommand, specifier]; const formatter = this.descriptor.viewCommandFieldArgFormatter; if (formatter) { diff --git a/packages/angular/cli/src/package-managers/package-manager_spec.ts b/packages/angular/cli/src/package-managers/package-manager_spec.ts index 802f50fa66ab..8d439d9b3b75 100644 --- a/packages/angular/cli/src/package-managers/package-manager_spec.ts +++ b/packages/angular/cli/src/package-managers/package-manager_spec.ts @@ -6,20 +6,54 @@ * found in the LICENSE file at https://angular.dev/license */ -import { Host } from './host'; -import { PackageManager } from './package-manager'; +import { MANIFEST_FIELDS, PackageManager } from './package-manager'; import { SUPPORTED_PACKAGE_MANAGERS } from './package-manager-descriptor'; import { MockHost } from './testing/mock-host'; describe('PackageManager', () => { - let host: Host; + let host: MockHost; let runCommandSpy: jasmine.Spy; const descriptor = SUPPORTED_PACKAGE_MANAGERS['npm']; beforeEach(() => { host = new MockHost(); runCommandSpy = spyOn(host, 'runCommand').and.resolveTo({ stdout: '1.2.3', stderr: '' }); - host.runCommand = runCommandSpy; + }); + + describe('getRegistryManifest', () => { + it('should quote complex range specifiers when required by the host', async () => { + // Simulate a quoting host + Object.assign(host, { requiresQuoting: true }); + + const pm = new PackageManager(host, '/tmp', descriptor); + const manifest = { name: 'foo', version: '1.0.0' }; + runCommandSpy.and.resolveTo({ stdout: JSON.stringify(manifest), stderr: '' }); + + await pm.getRegistryManifest('foo', '>=1.0.0 <2.0.0'); + + expect(runCommandSpy).toHaveBeenCalledWith( + descriptor.binary, + [...descriptor.getManifestCommand, '"foo@>=1.0.0 <2.0.0"', ...MANIFEST_FIELDS], + jasmine.anything(), + ); + }); + + it('should NOT quote complex range specifiers when not required by the host', async () => { + // Simulate a non-quoting host + Object.assign(host, { requiresQuoting: false }); + + const pm = new PackageManager(host, '/tmp', descriptor); + const manifest = { name: 'foo', version: '1.0.0' }; + runCommandSpy.and.resolveTo({ stdout: JSON.stringify(manifest), stderr: '' }); + + await pm.getRegistryManifest('foo', '>=1.0.0 <2.0.0'); + + expect(runCommandSpy).toHaveBeenCalledWith( + descriptor.binary, + [...descriptor.getManifestCommand, 'foo@>=1.0.0 <2.0.0', ...MANIFEST_FIELDS], + jasmine.anything(), + ); + }); }); describe('getVersion', () => { diff --git a/packages/angular/cli/src/package-managers/testing/mock-host.ts b/packages/angular/cli/src/package-managers/testing/mock-host.ts index ae4476c6501d..46e71be3cf60 100644 --- a/packages/angular/cli/src/package-managers/testing/mock-host.ts +++ b/packages/angular/cli/src/package-managers/testing/mock-host.ts @@ -14,6 +14,7 @@ import { Host } from '../host'; * This class allows for simulating a file system in memory. */ export class MockHost implements Host { + readonly requiresQuoting = false; private readonly fs = new Map<string, string[] | true>(); constructor(files: Record<string, string[] | true> = {}) { diff --git a/packages/angular/cli/src/utilities/completion.ts b/packages/angular/cli/src/utilities/completion.ts index 436680902395..0e23e1f03348 100644 --- a/packages/angular/cli/src/utilities/completion.ts +++ b/packages/angular/cli/src/utilities/completion.ts @@ -244,7 +244,7 @@ export async function initializeAutocomplete(): Promise<string> { ); } catch (err) { assertIsError(err); - throw new Error(`Failed to append autocompletion setup to \`${rcFile}\`:\n${err.message}`); + throw new Error(`Failed to append autocompletion setup to \`${rcFile}\`.`, { cause: err }); } return rcFile; diff --git a/packages/angular/cli/src/utilities/config.ts b/packages/angular/cli/src/utilities/config.ts index dfe21fa96692..7b9188bb3d89 100644 --- a/packages/angular/cli/src/utilities/config.ts +++ b/packages/angular/cli/src/utilities/config.ts @@ -207,10 +207,7 @@ export async function getWorkspace( return workspace; } catch (error) { - throw new Error( - `Workspace config file cannot be loaded: ${configPath}` + - `\n${error instanceof Error ? error.message : error}`, - ); + throw new Error(`Workspace config file cannot be loaded: ${configPath}`, { cause: error }); } } diff --git a/packages/angular/cli/src/utilities/node-version.ts b/packages/angular/cli/src/utilities/node-version.ts new file mode 100644 index 000000000000..7bed934428c8 --- /dev/null +++ b/packages/angular/cli/src/utilities/node-version.ts @@ -0,0 +1,74 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +/** + * @fileoverview This file contains the supported Node.js version for the Angular CLI. + * @important This file must not import any other modules. + */ + +/** + * The supported Node.js version for the Angular CLI. + */ + +const SUPPORTED_NODE_VERSIONS = '0.0.0-ENGINES-NODE'; + +/** + * The supported Node.js versions. + */ +export const supportedNodeVersions = SUPPORTED_NODE_VERSIONS.replace(/[\^~<>=]/g, '') + .split('||') + .map((v) => v.trim()); + +/** + * Checks if the current Node.js version is supported. + * @returns `true` if the current Node.js version is supported, `false` otherwise. + */ +export function isNodeVersionSupported(): boolean { + if (SUPPORTED_NODE_VERSIONS.charAt(0) === '0') { + // Unlike `pkg_npm`, `ts_library` which is used to run unit tests does not support substitutions. + return true; + } + + const [processMajor, processMinor, processPatch] = process.versions.node + .split('.', 3) + .map((part) => Number(part)); + + for (const version of supportedNodeVersions) { + const [major, minor, patch] = version.split('.', 3).map((part) => Number(part)); + if ( + (major === processMajor && processMinor === minor && processPatch >= patch) || + (major === processMajor && processMinor > minor) + ) { + return true; + } + } + + return false; +} + +/** + * Checks if the current Node.js version is the minimum supported version. + * @returns `true` if the current Node.js version is the minimum supported version, `false` otherwise. + */ +export function isNodeVersionMinSupported(): boolean { + if (SUPPORTED_NODE_VERSIONS.charAt(0) === '0') { + // Unlike `pkg_npm`, `ts_library` which is used to run unit tests does not support substitutions. + return true; + } + + const [processMajor, processMinor, processPatch] = process.versions.node + .split('.', 3) + .map((part) => Number(part)); + const [major, minor, patch] = supportedNodeVersions[0].split('.', 3).map((part) => Number(part)); + + return ( + processMajor > major || + (processMajor === major && processMinor > minor) || + (processMajor === major && processMinor === minor && processPatch >= patch) + ); +} diff --git a/packages/angular/cli/src/utilities/prettier.ts b/packages/angular/cli/src/utilities/prettier.ts index e481d94a8b89..e2e516b82367 100644 --- a/packages/angular/cli/src/utilities/prettier.ts +++ b/packages/angular/cli/src/utilities/prettier.ts @@ -44,7 +44,7 @@ export async function formatFiles(cwd: string, files: Set<string>): Promise<void await execFileAsync( process.execPath, - [prettierCliPath, '--write', '--no-error-on-unmatched-pattern', ...files], + [prettierCliPath, '--write', '--no-error-on-unmatched-pattern', '--ignore-unknown', ...files], { cwd, shell: false, diff --git a/packages/angular/cli/src/utilities/prompt.ts b/packages/angular/cli/src/utilities/prompt.ts index c1cd8eba0c3c..a12d83d72b4b 100644 --- a/packages/angular/cli/src/utilities/prompt.ts +++ b/packages/angular/cli/src/utilities/prompt.ts @@ -43,7 +43,7 @@ export async function askQuestion( const answer = await select({ message, choices, - default: defaultResponseIndex, + default: choices[defaultResponseIndex].value, theme: { prefix: '', }, diff --git a/packages/angular/create/package.json b/packages/angular/create/package.json index a5ad3fce4ff9..e20338df9e30 100644 --- a/packages/angular/create/package.json +++ b/packages/angular/create/package.json @@ -9,7 +9,7 @@ "code generation", "schematics" ], - "bin": "./src/index.js", + "bin": "src/index.js", "dependencies": { "@angular/cli": "0.0.0-PLACEHOLDER" } diff --git a/packages/angular/ssr/BUILD.bazel b/packages/angular/ssr/BUILD.bazel index 16498600f603..ec6187173fbf 100644 --- a/packages/angular/ssr/BUILD.bazel +++ b/packages/angular/ssr/BUILD.bazel @@ -20,7 +20,7 @@ ts_project( ), args = [ "--lib", - "dom,es2022", + "dom.iterable,dom,es2022", ], data = [ "//packages/angular/ssr/third_party/beasties:beasties_bundled", diff --git a/packages/angular/ssr/node/public_api.ts b/packages/angular/ssr/node/public_api.ts index 81932873a440..89900f95cc5c 100644 --- a/packages/angular/ssr/node/public_api.ts +++ b/packages/angular/ssr/node/public_api.ts @@ -12,7 +12,7 @@ export { type CommonEngineOptions, } from './src/common-engine/common-engine'; -export { AngularNodeAppEngine } from './src/app-engine'; +export { AngularNodeAppEngine, type AngularNodeAppEngineOptions } from './src/app-engine'; export { createNodeRequestHandler, type NodeRequestHandlerFunction } from './src/handler'; export { writeResponseToNodeResponse } from './src/response'; diff --git a/packages/angular/ssr/node/src/app-engine.ts b/packages/angular/ssr/node/src/app-engine.ts index 8edac0ef69c6..7f7d3017a846 100644 --- a/packages/angular/ssr/node/src/app-engine.ts +++ b/packages/angular/ssr/node/src/app-engine.ts @@ -9,9 +9,16 @@ import { AngularAppEngine } from '@angular/ssr'; import type { IncomingMessage } from 'node:http'; import type { Http2ServerRequest } from 'node:http2'; +import { AngularAppEngineOptions } from '../../src/app-engine'; +import { getAllowedHostsFromEnv } from './environment-options'; import { attachNodeGlobalErrorHandlers } from './errors'; import { createWebRequestFromNodeRequest } from './request'; +/** + * Options for the Angular Node.js server application engine. + */ +export interface AngularNodeAppEngineOptions extends AngularAppEngineOptions {} + /** * Angular server application engine. * Manages Angular server applications (including localized ones), handles rendering requests, @@ -21,9 +28,18 @@ import { createWebRequestFromNodeRequest } from './request'; * application to ensure consistent handling of rendering requests and resource management. */ export class AngularNodeAppEngine { - private readonly angularAppEngine = new AngularAppEngine(); + private readonly angularAppEngine: AngularAppEngine; + + /** + * Creates a new instance of the Angular Node.js server application engine. + * @param options Options for the Angular Node.js server application engine. + */ + constructor(options?: AngularNodeAppEngineOptions) { + this.angularAppEngine = new AngularAppEngine({ + ...options, + allowedHosts: [...getAllowedHostsFromEnv(), ...(options?.allowedHosts ?? [])], + }); - constructor() { attachNodeGlobalErrorHandlers(); } @@ -31,21 +47,35 @@ export class AngularNodeAppEngine { * Handles an incoming HTTP request by serving prerendered content, performing server-side rendering, * or delivering a static file for client-side rendered routes based on the `RenderMode` setting. * - * This method adapts Node.js's `IncomingMessage` or `Http2ServerRequest` + * This method adapts Node.js's `IncomingMessage`, `Http2ServerRequest` or `Request` * to a format compatible with the `AngularAppEngine` and delegates the handling logic to it. * - * @param request - The incoming HTTP request (`IncomingMessage` or `Http2ServerRequest`). + * @param request - The incoming HTTP request (`IncomingMessage`, `Http2ServerRequest` or `Request`). * @param requestContext - Optional context for rendering, such as metadata associated with the request. * @returns A promise that resolves to the resulting HTTP response object, or `null` if no matching Angular route is found. * * @remarks A request to `https://www.example.com/page/index.html` will serve or render the Angular route * corresponding to `https://www.example.com/page`. + * + * @remarks + * To prevent potential Server-Side Request Forgery (SSRF), this function verifies the hostname + * of the `request.url` against a list of authorized hosts. + * If the hostname is not recognized a 400 Bad Request is returned. + * + * Resolution: + * Authorize your hostname by configuring `allowedHosts` in `angular.json` in: + * `projects.[project-name].architect.build.options.security.allowedHosts`. + * Alternatively, you can define the allowed hostname via the environment variable `process.env['NG_ALLOWED_HOSTS']` + * or pass it directly through the configuration options of `AngularNodeAppEngine`. + * + * For more information see: https://angular.dev/best-practices/security#preventing-server-side-request-forgery-ssrf */ async handle( - request: IncomingMessage | Http2ServerRequest, + request: IncomingMessage | Http2ServerRequest | Request, requestContext?: unknown, ): Promise<Response | null> { - const webRequest = createWebRequestFromNodeRequest(request); + const webRequest = + request instanceof Request ? request : createWebRequestFromNodeRequest(request); return this.angularAppEngine.handle(webRequest, requestContext); } diff --git a/packages/angular/ssr/node/src/common-engine/common-engine.ts b/packages/angular/ssr/node/src/common-engine/common-engine.ts index 673156ee6b43..b44c2c5255ca 100644 --- a/packages/angular/ssr/node/src/common-engine/common-engine.ts +++ b/packages/angular/ssr/node/src/common-engine/common-engine.ts @@ -12,6 +12,8 @@ import { renderApplication, renderModule, ɵSERVER_CONTEXT } from '@angular/plat import * as fs from 'node:fs'; import { dirname, join, normalize, resolve } from 'node:path'; import { URL } from 'node:url'; +import { validateUrl } from '../../../src/utils/validation'; +import { getAllowedHostsFromEnv } from '../environment-options'; import { attachNodeGlobalErrorHandlers } from '../errors'; import { CommonEngineInlineCriticalCssProcessor } from './inline-css-processor'; import { @@ -31,6 +33,9 @@ export interface CommonEngineOptions { /** Enable request performance profiling data collection and printing the results in the server console. */ enablePerformanceProfiler?: boolean; + + /** A set of hostnames that are allowed to access the server. */ + allowedHosts?: readonly string[]; } export interface CommonEngineRenderOptions { @@ -64,8 +69,14 @@ export class CommonEngine { private readonly templateCache = new Map<string, string>(); private readonly inlineCriticalCssProcessor = new CommonEngineInlineCriticalCssProcessor(); private readonly pageIsSSG = new Map<string, boolean>(); + private readonly allowedHosts: ReadonlySet<string>; + + constructor(private options?: CommonEngineOptions) { + this.allowedHosts = new Set([ + ...getAllowedHostsFromEnv(), + ...(this.options?.allowedHosts ?? []), + ]); - constructor(private options?: CommonEngineOptions | undefined) { attachNodeGlobalErrorHandlers(); } @@ -74,6 +85,23 @@ export class CommonEngine { * render options */ async render(opts: CommonEngineRenderOptions): Promise<string> { + const { url } = opts; + + if (url && URL.canParse(url)) { + const urlObj = new URL(url); + try { + validateUrl(urlObj, this.allowedHosts); + } catch (error) { + // eslint-disable-next-line no-console + console.error( + `ERROR: ${(error as Error).message}` + + 'Please provide a list of allowed hosts in the "allowedHosts" option in the "CommonEngine" constructor.', + ); + + throw error; + } + } + const enablePerformanceProfiler = this.options?.enablePerformanceProfiler; const runMethod = enablePerformanceProfiler diff --git a/packages/angular/ssr/node/src/environment-options.ts b/packages/angular/ssr/node/src/environment-options.ts new file mode 100644 index 000000000000..b18dcd08ebe6 --- /dev/null +++ b/packages/angular/ssr/node/src/environment-options.ts @@ -0,0 +1,29 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +/** + * Retrieves the list of allowed hosts from the environment variable `NG_ALLOWED_HOSTS`. + * @returns An array of allowed hosts. + */ +export function getAllowedHostsFromEnv(): ReadonlyArray<string> { + const allowedHosts: string[] = []; + const envNgAllowedHosts = process.env['NG_ALLOWED_HOSTS']; + if (!envNgAllowedHosts) { + return allowedHosts; + } + + const hosts = envNgAllowedHosts.split(','); + for (const host of hosts) { + const trimmed = host.trim(); + if (trimmed.length > 0) { + allowedHosts.push(trimmed); + } + } + + return allowedHosts; +} diff --git a/packages/angular/ssr/node/src/request.ts b/packages/angular/ssr/node/src/request.ts index 32d90d0029fc..402ec29ba56d 100644 --- a/packages/angular/ssr/node/src/request.ts +++ b/packages/angular/ssr/node/src/request.ts @@ -8,6 +8,7 @@ import type { IncomingHttpHeaders, IncomingMessage } from 'node:http'; import type { Http2ServerRequest } from 'node:http2'; +import { getFirstHeaderValue } from '../../src/utils/validation'; /** * A set containing all the pseudo-headers defined in the HTTP/2 specification. @@ -103,21 +104,3 @@ export function createRequestUrl(nodeRequest: IncomingMessage | Http2ServerReque return new URL(`${protocol}://${hostnameWithPort}${originalUrl ?? url}`); } - -/** - * Extracts the first value from a multi-value header string. - * - * @param value - A string or an array of strings representing the header values. - * If it's a string, values are expected to be comma-separated. - * @returns The first trimmed value from the multi-value header, or `undefined` if the input is invalid or empty. - * - * @example - * ```typescript - * getFirstHeaderValue("value1, value2, value3"); // "value1" - * getFirstHeaderValue(["value1", "value2"]); // "value1" - * getFirstHeaderValue(undefined); // undefined - * ``` - */ -function getFirstHeaderValue(value: string | string[] | undefined): string | undefined { - return value?.toString().split(',', 1)[0]?.trim(); -} diff --git a/packages/angular/ssr/package.json b/packages/angular/ssr/package.json index af829b8adc1e..7d841721dcae 100644 --- a/packages/angular/ssr/package.json +++ b/packages/angular/ssr/package.json @@ -29,12 +29,12 @@ }, "devDependencies": { "@angular-devkit/schematics": "workspace:*", - "@angular/common": "21.2.0-next.3", - "@angular/compiler": "21.2.0-next.3", - "@angular/core": "21.2.0-next.3", - "@angular/platform-browser": "21.2.0-next.3", - "@angular/platform-server": "21.2.0-next.3", - "@angular/router": "21.2.0-next.3", + "@angular/common": "22.0.0-next.6", + "@angular/compiler": "22.0.0-next.6", + "@angular/core": "22.0.0-next.6", + "@angular/platform-browser": "22.0.0-next.6", + "@angular/platform-server": "22.0.0-next.6", + "@angular/router": "22.0.0-next.6", "@schematics/angular": "workspace:*", "beasties": "0.4.1" }, @@ -42,6 +42,6 @@ "schematics": "./schematics/collection.json", "repository": { "type": "git", - "url": "https://github.com/angular/angular-cli.git" + "url": "git+https://github.com/angular/angular-cli.git" } } diff --git a/packages/angular/ssr/public_api.ts b/packages/angular/ssr/public_api.ts index e685f4ceabe3..eb05be266588 100644 --- a/packages/angular/ssr/public_api.ts +++ b/packages/angular/ssr/public_api.ts @@ -8,7 +8,7 @@ export * from './private_export'; -export { AngularAppEngine } from './src/app-engine'; +export { AngularAppEngine, type AngularAppEngineOptions } from './src/app-engine'; export { createRequestHandler, type RequestHandlerFunction } from './src/handler'; export { @@ -24,3 +24,5 @@ export { type ServerRouteServer, type ServerRouteCommon, } from './src/routes/route-config'; + +export { IS_DISCOVERING_ROUTES } from './src/routes/ng-routes'; diff --git a/packages/angular/ssr/src/app-engine.ts b/packages/angular/ssr/src/app-engine.ts index 0cb728e8535d..09e1093fef72 100644 --- a/packages/angular/ssr/src/app-engine.ts +++ b/packages/angular/ssr/src/app-engine.ts @@ -10,7 +10,19 @@ import type { AngularServerApp, getOrCreateAngularServerApp } from './app'; import { Hooks } from './hooks'; import { getPotentialLocaleIdFromUrl, getPreferredLocale } from './i18n'; import { EntryPointExports, getAngularAppEngineManifest } from './manifest'; +import { createRedirectResponse } from './utils/redirect'; import { joinUrlParts } from './utils/url'; +import { cloneRequestAndPatchHeaders, validateRequest } from './utils/validation'; + +/** + * Options for the Angular server application engine. + */ +export interface AngularAppEngineOptions { + /** + * A set of allowed hostnames for the server application. + */ + allowedHosts?: readonly string[]; +} /** * Angular server application engine. @@ -31,6 +43,15 @@ export class AngularAppEngine { */ static ɵallowStaticRouteRender = false; + /** + * A flag to enable or disable the allowed hosts check. + * + * Typically used during development to avoid the allowed hosts check. + * + * @private + */ + static ɵdisableAllowedHostsCheck = false; + /** * Hooks for extending or modifying the behavior of the server application. * These hooks are used by the Angular CLI when running the development server and @@ -45,6 +66,11 @@ export class AngularAppEngine { */ private readonly manifest = getAngularAppEngineManifest(); + /** + * A set of allowed hostnames for the server application. + */ + private readonly allowedHosts: ReadonlySet<string>; + /** * A map of supported locales from the server application's manifest. */ @@ -57,6 +83,29 @@ export class AngularAppEngine { */ private readonly entryPointsCache = new Map<string, Promise<EntryPointExports>>(); + /** + * Creates a new instance of the Angular server application engine. + * @param options Options for the Angular server application engine. + */ + constructor(options?: AngularAppEngineOptions) { + this.allowedHosts = this.getAllowedHosts(options); + } + + private getAllowedHosts(options: AngularAppEngineOptions | undefined): ReadonlySet<string> { + const allowedHosts = new Set([...(options?.allowedHosts ?? []), ...this.manifest.allowedHosts]); + + if (allowedHosts.has('*')) { + // eslint-disable-next-line no-console + console.warn( + 'Allowing all hosts via "*" is a security risk. This configuration should only be used when ' + + 'validation for "Host" and "X-Forwarded-Host" headers is performed in another layer, such as a load balancer or reverse proxy. ' + + 'For more information see: https://angular.dev/best-practices/security#preventing-server-side-request-forgery-ssrf', + ); + } + + return allowedHosts; + } + /** * Handles an incoming HTTP request by serving prerendered content, performing server-side rendering, * or delivering a static file for client-side rendered routes based on the `RenderMode` setting. @@ -67,17 +116,53 @@ export class AngularAppEngine { * * @remarks A request to `https://www.example.com/page/index.html` will serve or render the Angular route * corresponding to `https://www.example.com/page`. + * + * @remarks + * To prevent potential Server-Side Request Forgery (SSRF), this function verifies the hostname + * of the `request.url` against a list of authorized hosts. + * If the hostname is not recognized a 400 Bad Request is returned. + * + * Resolution: + * Authorize your hostname by configuring `allowedHosts` in `angular.json` in: + * `projects.[project-name].architect.build.options.security.allowedHosts`. + * Alternatively, you pass it directly through the configuration options of `AngularAppEngine`. + * + * For more information see: https://angular.dev/best-practices/security#preventing-server-side-request-forgery-ssrf */ async handle(request: Request, requestContext?: unknown): Promise<Response | null> { - const serverApp = await this.getAngularServerAppForRequest(request); + const allowedHost = this.allowedHosts; + const disableAllowedHostsCheck = AngularAppEngine.ɵdisableAllowedHostsCheck; + try { + validateRequest(request, allowedHost, disableAllowedHostsCheck); + } catch (error) { + return this.handleValidationError(request.url, error as Error); + } + + // Clone request with patched headers to prevent unallowed host header access. + const { request: securedRequest, onError: onHeaderValidationError } = disableAllowedHostsCheck + ? { request, onError: null } + : cloneRequestAndPatchHeaders(request, allowedHost); + + const serverApp = await this.getAngularServerAppForRequest(securedRequest); if (serverApp) { - return serverApp.handle(request, requestContext); + const promises: Promise<Response | null>[] = []; + if (onHeaderValidationError) { + promises.push( + onHeaderValidationError.then((error) => + this.handleValidationError(securedRequest.url, error), + ), + ); + } + + promises.push(serverApp.handle(securedRequest, requestContext)); + + return Promise.race(promises); } if (this.supportedLocales.length > 1) { // Redirect to the preferred language if i18n is enabled. - return this.redirectBasedOnAcceptLanguage(request); + return this.redirectBasedOnAcceptLanguage(securedRequest); } return null; @@ -110,13 +195,14 @@ export class AngularAppEngine { if (preferredLocale) { const subPath = supportedLocales[preferredLocale]; if (subPath !== undefined) { - return new Response(null, { - status: 302, // Use a 302 redirect as language preference may change. - headers: { - 'Location': joinUrlParts(pathname, subPath), - 'Vary': 'Accept-Language', - }, - }); + const prefix = request.headers.get('X-Forwarded-Prefix') ?? ''; + + return createRedirectResponse( + joinUrlParts(prefix, pathname, subPath), + 302, + // Use a 302 redirect as language preference may change. + { 'Vary': 'Accept-Language' }, + ); } } @@ -201,4 +287,27 @@ export class AngularAppEngine { return this.getEntryPointExports(potentialLocale) ?? this.getEntryPointExports(''); } + + /** + * Handles validation errors by logging the error and returning an appropriate response. + * + * @param url - The URL of the request. + * @param error - The validation error to handle. + * @returns A `Response` object with a 400 status code. + */ + private handleValidationError(url: string, error: Error): Response { + const errorMessage = error.message; + // eslint-disable-next-line no-console + console.error( + `ERROR: Bad Request ("${url}").\n` + + errorMessage + + '\n\nFor more information, see https://angular.dev/best-practices/security#preventing-server-side-request-forgery-ssrf', + ); + + return new Response(errorMessage, { + status: 400, + statusText: 'Bad Request', + headers: { 'Content-Type': 'text/plain' }, + }); + } } diff --git a/packages/angular/ssr/src/app.ts b/packages/angular/ssr/src/app.ts index 96afaa44c8d6..0c381c08ae88 100644 --- a/packages/angular/ssr/src/app.ts +++ b/packages/angular/ssr/src/app.ts @@ -190,7 +190,7 @@ export class AngularServerApp { return null; } - const { redirectTo, status, renderMode } = matchedRoute; + const { redirectTo, status, renderMode, headers } = matchedRoute; if (redirectTo !== undefined) { return createRedirectResponse( @@ -199,6 +199,7 @@ export class AngularServerApp { buildPathWithParams(redirectTo, url.pathname), ), status, + headers, ); } @@ -352,7 +353,7 @@ export class AngularServerApp { } if (result.redirectTo) { - return createRedirectResponse(result.redirectTo, responseInit.status); + return createRedirectResponse(result.redirectTo, responseInit.status, headers); } if (renderMode === RenderMode.Prerender) { diff --git a/packages/angular/ssr/src/manifest.ts b/packages/angular/ssr/src/manifest.ts index 0de603bba104..21ded49b3e10 100644 --- a/packages/angular/ssr/src/manifest.ts +++ b/packages/angular/ssr/src/manifest.ts @@ -6,7 +6,6 @@ * found in the LICENSE file at https://angular.dev/license */ -import type { BootstrapContext } from '@angular/platform-browser'; import type { SerializableRouteTreeNode } from './routes/route-tree'; import { AngularBootstrap } from './utils/ng'; @@ -74,6 +73,11 @@ export interface AngularAppEngineManifest { * - `value`: The url segment associated with that locale. */ readonly supportedLocales: Readonly<Record<string, string>>; + + /** + * A readonly array of allowed hostnames. + */ + readonly allowedHosts: Readonly<string[]>; } /** diff --git a/packages/angular/ssr/src/routes/ng-routes.ts b/packages/angular/ssr/src/routes/ng-routes.ts index b60e704371a4..438e8450d331 100644 --- a/packages/angular/ssr/src/routes/ng-routes.ts +++ b/packages/angular/ssr/src/routes/ng-routes.ts @@ -11,6 +11,7 @@ import { ApplicationRef, Compiler, EnvironmentInjector, + InjectionToken, Injector, createEnvironmentInjector, runInInjectionContext, @@ -23,6 +24,7 @@ import { Router, ɵloadChildren as loadChildrenHelper, } from '@angular/router'; + import { ServerAssets } from '../assets'; import { Console } from '../console'; import { AngularAppManifest, getAngularAppManifest } from '../manifest'; @@ -39,6 +41,22 @@ import { } from './route-config'; import { RouteTree, RouteTreeNodeMetadata } from './route-tree'; +/** + * A DI token that indicates whether the application is in the process of discovering routes. + * + * This token is provided with the value `true` when route discovery is active, allowing other + * parts of the application to conditionally execute logic. For example, it can be used to + * disable features or behaviors that are not necessary or might interfere with the route + * discovery process. + */ +export const IS_DISCOVERING_ROUTES = new InjectionToken<boolean>( + typeof ngDevMode === 'undefined' || ngDevMode ? 'IS_DISCOVERING_ROUTES' : '', + { + providedIn: 'platform', + factory: () => false, + }, +); + interface Route extends AngularRoute { ɵentryName?: string; } @@ -623,6 +641,10 @@ export async function getRoutesFromAngularRouterConfig( provide: ɵENABLE_ROOT_COMPONENT_BOOTSTRAP, useValue: false, }, + { + provide: IS_DISCOVERING_ROUTES, + useValue: true, + }, ]); try { diff --git a/packages/angular/ssr/src/utils/redirect.ts b/packages/angular/ssr/src/utils/redirect.ts index 18ca3f92b819..79fb10f424dc 100644 --- a/packages/angular/ssr/src/utils/redirect.ts +++ b/packages/angular/ssr/src/utils/redirect.ts @@ -27,9 +27,14 @@ export function isValidRedirectResponseCode(code: number): boolean { * @param location - The URL to which the response should redirect. * @param status - The HTTP status code for the redirection. Defaults to 302 (Found). * See: https://developer.mozilla.org/en-US/docs/Web/API/Response/redirect_static#status + * @param headers - Additional headers to include in the response. * @returns A `Response` object representing the HTTP redirect. */ -export function createRedirectResponse(location: string, status = 302): Response { +export function createRedirectResponse( + location: string, + status = 302, + headers?: Record<string, string>, +): Response { if (ngDevMode && !isValidRedirectResponseCode(status)) { throw new Error( `Invalid redirect status code: ${status}. ` + @@ -37,10 +42,30 @@ export function createRedirectResponse(location: string, status = 302): Response ); } + const resHeaders = new Headers(headers); + if (ngDevMode && resHeaders.has('location')) { + // eslint-disable-next-line no-console + console.warn( + `Location header "${resHeaders.get('location')}" will ignored and set to "${location}".`, + ); + } + + // Ensure unique values for Vary header + const varyArray = resHeaders.get('Vary')?.split(',') ?? []; + const varySet = new Set(['X-Forwarded-Prefix']); + for (const vary of varyArray) { + const value = vary.trim(); + + if (value) { + varySet.add(value); + } + } + + resHeaders.set('Vary', [...varySet].join(', ')); + resHeaders.set('Location', location); + return new Response(null, { status, - headers: { - 'Location': location, - }, + headers: resHeaders, }); } diff --git a/packages/angular/ssr/src/utils/url.ts b/packages/angular/ssr/src/utils/url.ts index 1fa756e19c19..d5e7c9ac2814 100644 --- a/packages/angular/ssr/src/utils/url.ts +++ b/packages/angular/ssr/src/utils/url.ts @@ -95,26 +95,32 @@ export function addTrailingSlash(url: string): string { * ``` */ export function joinUrlParts(...parts: string[]): string { - const normalizeParts: string[] = []; + const normalizedParts: string[] = []; + for (const part of parts) { if (part === '') { // Skip any empty parts continue; } - let normalizedPart = part; - if (part[0] === '/') { - normalizedPart = normalizedPart.slice(1); + let start = 0; + let end = part.length; + + // Use "Pointers" to avoid intermediate slices + while (start < end && part[start] === '/') { + start++; } - if (part.at(-1) === '/') { - normalizedPart = normalizedPart.slice(0, -1); + + while (end > start && part[end - 1] === '/') { + end--; } - if (normalizedPart !== '') { - normalizeParts.push(normalizedPart); + + if (start < end) { + normalizedParts.push(part.slice(start, end)); } } - return addLeadingSlash(normalizeParts.join('/')); + return addLeadingSlash(normalizedParts.join('/')); } /** diff --git a/packages/angular/ssr/src/utils/validation.ts b/packages/angular/ssr/src/utils/validation.ts new file mode 100644 index 000000000000..e8af64ed9943 --- /dev/null +++ b/packages/angular/ssr/src/utils/validation.ts @@ -0,0 +1,289 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +/** + * The set of headers that should be validated for host header injection attacks. + */ +const HOST_HEADERS_TO_VALIDATE: ReadonlySet<string> = new Set(['host', 'x-forwarded-host']); + +/** + * Regular expression to validate that the port is a numeric value. + */ +const VALID_PORT_REGEX = /^\d+$/; + +/** + * Regular expression to validate that the protocol is either http or https (case-insensitive). + */ +const VALID_PROTO_REGEX = /^https?$/i; + +/** + * Regular expression to validate that the host is a valid hostname. + */ +const VALID_HOST_REGEX = /^[a-z0-9_.-]+(:[0-9]+)?$/i; + +/** + * Regular expression to validate that the prefix is valid. + */ +const INVALID_PREFIX_REGEX = /^(?:\\|\/[/\\])|(?:^|[/\\])\.\.?(?:[/\\]|$)/; + +/** + * Extracts the first value from a multi-value header string. + * + * @param value - A string or an array of strings representing the header values. + * If it's a string, values are expected to be comma-separated. + * @returns The first trimmed value from the multi-value header, or `undefined` if the input is invalid or empty. + * + * @example + * ```typescript + * getFirstHeaderValue("value1, value2, value3"); // "value1" + * getFirstHeaderValue(["value1", "value2"]); // "value1" + * getFirstHeaderValue(undefined); // undefined + * ``` + */ +export function getFirstHeaderValue( + value: string | string[] | undefined | null, +): string | undefined { + return value?.toString().split(',', 1)[0]?.trim(); +} + +/** + * Validates a request. + * + * @param request - The incoming `Request` object to validate. + * @param allowedHosts - A set of allowed hostnames. + * @param disableHostCheck - Whether to disable the host check. + * @throws Error if any of the validated headers contain invalid values. + */ +export function validateRequest( + request: Request, + allowedHosts: ReadonlySet<string>, + disableHostCheck: boolean, +): void { + validateHeaders(request); + + if (!disableHostCheck) { + validateUrl(new URL(request.url), allowedHosts); + } +} + +/** + * Validates that the hostname of a given URL is allowed. + * + * @param url - The URL object to validate. + * @param allowedHosts - A set of allowed hostnames. + * @throws Error if the hostname is not in the allowlist. + */ +export function validateUrl(url: URL, allowedHosts: ReadonlySet<string>): void { + const { hostname } = url; + if (!isHostAllowed(hostname, allowedHosts)) { + throw new Error(`URL with hostname "${hostname}" is not allowed.`); + } +} + +/** + * Clones a request and patches the `get` method of the request headers to validate the host headers. + * @param request - The request to validate. + * @param allowedHosts - A set of allowed hostnames. + * @returns An object containing the cloned request and a promise that resolves to an error + * if any of the validated headers contain invalid values. + */ +export function cloneRequestAndPatchHeaders( + request: Request, + allowedHosts: ReadonlySet<string>, +): { request: Request; onError: Promise<Error> } { + let onError: (value: Error) => void; + const onErrorPromise = new Promise<Error>((resolve) => { + onError = resolve; + }); + + const clonedReq = new Request(request.clone(), { + signal: request.signal, + }); + + const headers = clonedReq.headers; + + const originalGet = headers.get; + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion + (headers.get as typeof originalGet) = function (name) { + const value = originalGet.call(headers, name); + if (!value) { + return value; + } + + validateHeader(name, value, allowedHosts, onError); + + return value; + }; + + const originalValues = headers.values; + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion + (headers.values as typeof originalValues) = function () { + for (const name of HOST_HEADERS_TO_VALIDATE) { + validateHeader(name, originalGet.call(headers, name), allowedHosts, onError); + } + + return originalValues.call(headers); + }; + + const originalEntries = headers.entries; + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion + (headers.entries as typeof originalEntries) = function () { + const iterator = originalEntries.call(headers); + + return { + next() { + const result = iterator.next(); + if (!result.done) { + const [key, value] = result.value; + validateHeader(key, value, allowedHosts, onError); + } + + return result; + }, + [Symbol.iterator]() { + return this; + }, + }; + }; + + const originalForEach = headers.forEach; + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion + (headers.forEach as typeof originalForEach) = function (callback, thisArg) { + originalForEach.call( + headers, + (value, key, parent) => { + validateHeader(key, value, allowedHosts, onError); + callback.call(thisArg, value, key, parent); + }, + thisArg, + ); + }; + + // Ensure for...of loops use the new patched entries + (headers[Symbol.iterator] as typeof originalEntries) = headers.entries; + + return { request: clonedReq, onError: onErrorPromise }; +} + +/** + * Validates a specific header value against the allowed hosts. + * @param name - The name of the header to validate. + * @param value - The value of the header to validate. + * @param allowedHosts - A set of allowed hostnames. + * @param onError - A callback function to call if the header value is invalid. + * @throws Error if the header value is invalid. + */ +function validateHeader( + name: string, + value: string | null, + allowedHosts: ReadonlySet<string>, + onError: (value: Error) => void, +): void { + if (!value) { + return; + } + + if (!HOST_HEADERS_TO_VALIDATE.has(name.toLowerCase())) { + return; + } + + try { + verifyHostAllowed(name, value, allowedHosts); + } catch (error) { + onError(error as Error); + + throw error; + } +} + +/** + * Validates a specific host header value against the allowed hosts. + * + * @param headerName - The name of the header to validate (e.g., 'host', 'x-forwarded-host'). + * @param headerValue - The value of the header to validate. + * @param allowedHosts - A set of allowed hostnames. + * @throws Error if the header value is invalid or the hostname is not in the allowlist. + */ +function verifyHostAllowed( + headerName: string, + headerValue: string, + allowedHosts: ReadonlySet<string>, +): void { + const value = getFirstHeaderValue(headerValue); + if (!value) { + return; + } + + const url = `http://${value}`; + if (!URL.canParse(url)) { + throw new Error(`Header "${headerName}" contains an invalid value and cannot be parsed.`); + } + + const { hostname } = new URL(url); + if (!isHostAllowed(hostname, allowedHosts)) { + throw new Error(`Header "${headerName}" with value "${value}" is not allowed.`); + } +} + +/** + * Checks if the hostname is allowed. + * @param hostname - The hostname to check. + * @param allowedHosts - A set of allowed hostnames. + * @returns `true` if the hostname is allowed, `false` otherwise. + */ +function isHostAllowed(hostname: string, allowedHosts: ReadonlySet<string>): boolean { + if (allowedHosts.has('*') || allowedHosts.has(hostname)) { + return true; + } + + for (const allowedHost of allowedHosts) { + if (!allowedHost.startsWith('*.')) { + continue; + } + + const domain = allowedHost.slice(1); + if (hostname.endsWith(domain)) { + return true; + } + } + + return false; +} + +/** + * Validates the headers of an incoming request. + * + * @param request - The incoming `Request` object containing the headers to validate. + * @throws Error if any of the validated headers contain invalid values. + */ +function validateHeaders(request: Request): void { + const headers = request.headers; + for (const headerName of HOST_HEADERS_TO_VALIDATE) { + const headerValue = getFirstHeaderValue(headers.get(headerName)); + if (headerValue && !VALID_HOST_REGEX.test(headerValue)) { + throw new Error(`Header "${headerName}" contains characters that are not allowed.`); + } + } + + const xForwardedPort = getFirstHeaderValue(headers.get('x-forwarded-port')); + if (xForwardedPort && !VALID_PORT_REGEX.test(xForwardedPort)) { + throw new Error('Header "x-forwarded-port" must be a numeric value.'); + } + + const xForwardedProto = getFirstHeaderValue(headers.get('x-forwarded-proto')); + if (xForwardedProto && !VALID_PROTO_REGEX.test(xForwardedProto)) { + throw new Error('Header "x-forwarded-proto" must be either "http" or "https".'); + } + + const xForwardedPrefix = getFirstHeaderValue(headers.get('x-forwarded-prefix')); + if (xForwardedPrefix && INVALID_PREFIX_REGEX.test(xForwardedPrefix)) { + throw new Error( + 'Header "x-forwarded-prefix" must not start with "\\" or multiple "/" or contain ".", ".." path segments.', + ); + } +} diff --git a/packages/angular/ssr/test/app-engine_spec.ts b/packages/angular/ssr/test/app-engine_spec.ts index b08931b9400b..14e664659748 100644 --- a/packages/angular/ssr/test/app-engine_spec.ts +++ b/packages/angular/ssr/test/app-engine_spec.ts @@ -11,13 +11,26 @@ import '@angular/compiler'; /* eslint-enable import/no-unassigned-import */ -import { Component } from '@angular/core'; +import { Component, REQUEST, inject } from '@angular/core'; import { destroyAngularServerApp, getOrCreateAngularServerApp } from '../src/app'; import { AngularAppEngine } from '../src/app-engine'; import { setAngularAppEngineManifest } from '../src/manifest'; import { RenderMode } from '../src/routes/route-config'; import { setAngularAppTestingManifest } from './testing-utils'; +@Component({ + selector: 'app-home', + template: 'Home works', +}) +class TestHomeComponent { + private request = inject(REQUEST); + constructor() { + // Force header access to trigger validation + this.request?.headers.get('host'); + this.request?.headers.get('x-forwarded-host'); + } +} + function createEntryPoint(locale: string) { return async () => { @Component({ @@ -81,6 +94,7 @@ describe('AngularAppEngine', () => { describe('Localized app', () => { beforeAll(() => { setAngularAppEngineManifest({ + allowedHosts: ['example.com'], // Note: Although we are testing only one locale, we need to configure two or more // to ensure that we test a different code path. entryPoints: { @@ -146,7 +160,21 @@ describe('AngularAppEngine', () => { const response = await appEngine.handle(request); expect(response?.status).toBe(302); expect(response?.headers.get('Location')).toBe('/it'); - expect(response?.headers.get('Vary')).toBe('Accept-Language'); + expect(response?.headers.get('Vary')).toBe('X-Forwarded-Prefix, Accept-Language'); + }); + + it('should include forwarded prefix in locale redirect location when present', async () => { + const request = new Request('https://example.com', { + headers: { + 'Accept-Language': 'it', + 'X-Forwarded-Prefix': '/app', + }, + }); + + const response = await appEngine.handle(request); + expect(response?.status).toBe(302); + expect(response?.headers.get('Location')).toBe('/app/it'); + expect(response?.headers.get('Vary')).toBe('X-Forwarded-Prefix, Accept-Language'); }); it('should return null for requests to file-like resources in a locale', async () => { @@ -160,6 +188,7 @@ describe('AngularAppEngine', () => { describe('Localized app with single locale', () => { beforeAll(() => { setAngularAppEngineManifest({ + allowedHosts: ['example.com'], entryPoints: { it: createEntryPoint('it'), }, @@ -226,6 +255,7 @@ describe('AngularAppEngine', () => { class HomeComponent {} setAngularAppEngineManifest({ + allowedHosts: ['example.com'], entryPoints: { '': async () => { setAngularAppTestingManifest( @@ -270,4 +300,148 @@ describe('AngularAppEngine', () => { expect(await response?.text()).toContain('Home works'); }); }); + + describe('Invalid host headers', () => { + let consoleErrorSpy: jasmine.Spy; + + beforeAll(() => { + setAngularAppEngineManifest({ + allowedHosts: ['example.com'], + entryPoints: { + '': async () => { + setAngularAppTestingManifest( + [{ path: 'home', component: TestHomeComponent }], + [{ path: '**', renderMode: RenderMode.Server }], + ); + + return { + ɵgetOrCreateAngularServerApp: getOrCreateAngularServerApp, + ɵdestroyAngularServerApp: destroyAngularServerApp, + }; + }, + }, + basePath: '/', + supportedLocales: { 'en-US': '' }, + }); + + appEngine = new AngularAppEngine(); + }); + + beforeEach(() => { + consoleErrorSpy = spyOn(console, 'error'); + }); + + it('should return 400 when disallowed host', async () => { + const request = new Request('https://evil.com'); + const response = await appEngine.handle(request); + expect(response).not.toBeNull(); + expect(response?.status).toBe(400); + expect(await response?.text()).toContain('URL with hostname "evil.com" is not allowed.'); + expect(consoleErrorSpy).toHaveBeenCalledWith( + jasmine.stringMatching('URL with hostname "evil.com" is not allowed.'), + ); + }); + + it('should return 400 when disallowed host header', async () => { + const request = new Request('https://example.com/home', { + headers: { 'host': 'evil.com' }, + }); + const response = await appEngine.handle(request); + expect(response).not.toBeNull(); + expect(response?.status).toBe(400); + expect(await response?.text()).toContain( + 'Header "host" with value "evil.com" is not allowed.', + ); + expect(consoleErrorSpy).toHaveBeenCalledWith( + jasmine.stringMatching('Header "host" with value "evil.com" is not allowed.'), + ); + }); + + it('should return 400 when disallowed x-forwarded-host header', async () => { + const request = new Request('https://example.com/home', { + headers: { 'x-forwarded-host': 'evil.com' }, + }); + const response = await appEngine.handle(request); + expect(response).not.toBeNull(); + expect(response?.status).toBe(400); + expect(await response?.text()).toContain( + 'Header "x-forwarded-host" with value "evil.com" is not allowed.', + ); + expect(consoleErrorSpy).toHaveBeenCalledWith( + jasmine.stringMatching('Header "x-forwarded-host" with value "evil.com" is not allowed.'), + ); + }); + + it('should return 400 when host with path separator', async () => { + const request = new Request('https://example.com/home', { + headers: { 'host': 'example.com/evil' }, + }); + const response = await appEngine.handle(request); + expect(response).not.toBeNull(); + expect(response?.status).toBe(400); + expect(await response?.text()).toContain( + 'Header "host" contains characters that are not allowed.', + ); + expect(consoleErrorSpy).toHaveBeenCalledWith( + jasmine.stringMatching('Header "host" contains characters that are not allowed.'), + ); + }); + }); + + describe('Disable host check', () => { + let consoleErrorSpy: jasmine.Spy; + + beforeAll(() => { + setAngularAppEngineManifest({ + allowedHosts: ['example.com'], + entryPoints: { + '': async () => { + setAngularAppTestingManifest( + [{ path: 'home', component: TestHomeComponent }], + [{ path: '**', renderMode: RenderMode.Server }], + ); + + return { + ɵgetOrCreateAngularServerApp: getOrCreateAngularServerApp, + ɵdestroyAngularServerApp: destroyAngularServerApp, + }; + }, + }, + basePath: '/', + supportedLocales: { 'en-US': '' }, + }); + + appEngine = new AngularAppEngine(); + + AngularAppEngine.ɵdisableAllowedHostsCheck = true; + }); + + afterAll(() => { + AngularAppEngine.ɵdisableAllowedHostsCheck = false; + }); + + beforeEach(() => { + consoleErrorSpy = spyOn(console, 'error'); + }); + + it('should allow requests to disallowed hosts', async () => { + const request = new Request('https://evil.com/home'); + const response = await appEngine.handle(request); + expect(response).toBeDefined(); + expect(response?.status).toBe(200); + expect(await response?.text()).toContain('Home works'); + expect(consoleErrorSpy).not.toHaveBeenCalled(); + }); + + it('should allow requests with disallowed host header', async () => { + const request = new Request('https://example.com/home', { + headers: { 'host': 'evil.com' }, + }); + const response = await appEngine.handle(request); + expect(response).toBeDefined(); + expect(response?.status).toBe(200); + expect(await response?.text()).toContain('Home works'); + expect(consoleErrorSpy).not.toHaveBeenCalled(); + }); + }); }); diff --git a/packages/angular/ssr/test/app_spec.ts b/packages/angular/ssr/test/app_spec.ts index a72c4d75fae2..8fb82a10cfb9 100644 --- a/packages/angular/ssr/test/app_spec.ts +++ b/packages/angular/ssr/test/app_spec.ts @@ -309,17 +309,6 @@ describe('AngularServerApp', () => { expect(await conditionalResponse?.text()).toBe(''); }); - it('should return configured headers for pages with specific header settings', async () => { - const response = await app.handle(new Request('http://localhost/home-ssg')); - const headers = response?.headers.entries() ?? []; - expect(Object.fromEntries(headers)).toEqual({ - 'etag': '"f799132d0a09e0fef93c68a12e443527700eb59e6f67fcb7854c3a60ff082fde"', - 'content-length': '28', - 'x-some-header': 'value', - 'content-type': 'text/html;charset=UTF-8', - }); - }); - it('should return null for a non-prerendered page', async () => { const response = await app.handle(new Request('http://localhost/unknown')); expect(response).toBeNull(); diff --git a/packages/angular/ssr/test/npm_package/BUILD.bazel b/packages/angular/ssr/test/npm_package/BUILD.bazel index ae1694d8caac..cbf2c2623025 100644 --- a/packages/angular/ssr/test/npm_package/BUILD.bazel +++ b/packages/angular/ssr/test/npm_package/BUILD.bazel @@ -1,4 +1,4 @@ -load("@aspect_bazel_lib//lib:write_source_files.bzl", "write_source_file") +load("@bazel_lib//lib:write_source_files.bzl", "write_source_file") load("//tools:defaults.bzl", "jasmine_test", "ts_project") ts_project( diff --git a/packages/angular/ssr/test/routes/ng-routes_spec.ts b/packages/angular/ssr/test/routes/ng-routes_spec.ts index 324abe8c4d29..1532eb337faa 100644 --- a/packages/angular/ssr/test/routes/ng-routes_spec.ts +++ b/packages/angular/ssr/test/routes/ng-routes_spec.ts @@ -18,7 +18,7 @@ import { provideRouter, withEnabledBlockingInitialNavigation, } from '@angular/router'; -import { extractRoutesAndCreateRouteTree } from '../../src/routes/ng-routes'; +import { IS_DISCOVERING_ROUTES, extractRoutesAndCreateRouteTree } from '../../src/routes/ng-routes'; import { PrerenderFallback, RenderMode } from '../../src/routes/route-config'; import { setAngularAppTestingManifest } from '../testing-utils'; @@ -790,4 +790,26 @@ describe('extractRoutesAndCreateRouteTree', () => { { route: '/home', renderMode: RenderMode.Server }, ]); }); + + it('should provide `IS_DISCOVERING_ROUTES` as `true` during route discovery', async () => { + let isDiscoveringRoutes: boolean | undefined; + + setAngularAppTestingManifest( + [ + { + path: 'lazy', + loadChildren: () => { + isDiscoveringRoutes = inject(IS_DISCOVERING_ROUTES); + + return []; + }, + }, + ], + [{ path: '**', renderMode: RenderMode.Server }], + ); + + await extractRoutesAndCreateRouteTree({ url }); + + expect(isDiscoveringRoutes).toBeTrue(); + }); }); diff --git a/packages/angular/ssr/test/utils/redirect_spec.ts b/packages/angular/ssr/test/utils/redirect_spec.ts new file mode 100644 index 000000000000..b26edd458ac3 --- /dev/null +++ b/packages/angular/ssr/test/utils/redirect_spec.ts @@ -0,0 +1,67 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { createRedirectResponse } from '../../src/utils/redirect'; + +describe('Redirect Utils', () => { + describe('createRedirectResponse', () => { + it('should create a redirect response with default status 302', () => { + const response = createRedirectResponse('/home'); + expect(response.status).toBe(302); + expect(response.headers.get('Location')).toBe('/home'); + expect(response.headers.get('Vary')).toBe('X-Forwarded-Prefix'); + }); + + it('should create a redirect response with a custom status', () => { + const response = createRedirectResponse('/home', 301); + expect(response.status).toBe(301); + expect(response.headers.get('Location')).toBe('/home'); + }); + + it('should allow providing additional headers', () => { + const response = createRedirectResponse('/home', 302, { 'X-Custom': 'value' }); + expect(response.headers.get('X-Custom')).toBe('value'); + expect(response.headers.get('Location')).toBe('/home'); + expect(response.headers.get('Vary')).toBe('X-Forwarded-Prefix'); + }); + + it('should append to Vary header instead of overriding it', () => { + const response = createRedirectResponse('/home', 302, { + 'Location': '/evil', + 'Vary': 'Host', + }); + expect(response.headers.get('Location')).toBe('/home'); + expect(response.headers.get('Vary')).toBe('X-Forwarded-Prefix, Host'); + }); + + it('should NOT add duplicate X-Forwarded-Prefix if already present in Vary header', () => { + const response = createRedirectResponse('/home', 302, { + 'Vary': 'X-Forwarded-Prefix, Host', + }); + expect(response.headers.get('Vary')).toBe('X-Forwarded-Prefix, Host'); + }); + + it('should warn if Location header is provided in extra headers in dev mode', () => { + // @ts-expect-error accessing global + globalThis.ngDevMode = true; + const warnSpy = spyOn(console, 'warn'); + createRedirectResponse('/home', 302, { 'Location': '/evil' }); + expect(warnSpy).toHaveBeenCalledWith( + 'Location header "/evil" will ignored and set to "/home".', + ); + }); + + it('should throw error for invalid redirect status code in dev mode', () => { + // @ts-expect-error accessing global + globalThis.ngDevMode = true; + expect(() => createRedirectResponse('/home', 200)).toThrowError( + /Invalid redirect status code: 200/, + ); + }); + }); +}); diff --git a/packages/angular/ssr/test/utils/url_spec.ts b/packages/angular/ssr/test/utils/url_spec.ts index 9a7a7cb3ad49..a108c7ff1df6 100644 --- a/packages/angular/ssr/test/utils/url_spec.ts +++ b/packages/angular/ssr/test/utils/url_spec.ts @@ -100,6 +100,18 @@ describe('URL Utils', () => { it('should handle an all-empty URL parts', () => { expect(joinUrlParts('', '')).toBe('/'); }); + + it('should normalize parts with multiple leading and trailing slashes', () => { + expect(joinUrlParts('//path//', '///to///', '//resource//')).toBe('/path/to/resource'); + }); + + it('should handle a single part', () => { + expect(joinUrlParts('path')).toBe('/path'); + }); + + it('should handle parts containing only slashes', () => { + expect(joinUrlParts('//', '///')).toBe('/'); + }); }); describe('stripIndexHtmlFromURL', () => { diff --git a/packages/angular/ssr/test/utils/validation_spec.ts b/packages/angular/ssr/test/utils/validation_spec.ts new file mode 100644 index 000000000000..5c4b6e8cd121 --- /dev/null +++ b/packages/angular/ssr/test/utils/validation_spec.ts @@ -0,0 +1,364 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { + cloneRequestAndPatchHeaders, + getFirstHeaderValue, + validateRequest, + validateUrl, +} from '../../src/utils/validation'; + +describe('Validation Utils', () => { + describe('getFirstHeaderValue', () => { + it('should return the first value from a comma-separated string', () => { + expect(getFirstHeaderValue('value1, value2')).toBe('value1'); + }); + + it('should return the value if it is a single string', () => { + expect(getFirstHeaderValue('value1')).toBe('value1'); + }); + + it('should return the first value from an array of strings', () => { + expect(getFirstHeaderValue(['value1', 'value2'])).toBe('value1'); + }); + + it('should return undefined for null or undefined', () => { + expect(getFirstHeaderValue(null)).toBeUndefined(); + expect(getFirstHeaderValue(undefined)).toBeUndefined(); + }); + + it('should return empty string for empty string input', () => { + expect(getFirstHeaderValue('')).toBe(''); + }); + }); + + describe('validateUrl', () => { + const allowedHosts = new Set(['example.com', '*.google.com']); + + it('should pass for allowed hostname', () => { + expect(() => validateUrl(new URL('http://example.com'), allowedHosts)).not.toThrow(); + }); + + it('should pass for wildcard allowed hostname', () => { + expect(() => validateUrl(new URL('http://foo.google.com'), allowedHosts)).not.toThrow(); + }); + + it('should throw for disallowed hostname', () => { + expect(() => validateUrl(new URL('http://evil.com'), allowedHosts)).toThrowError( + /URL with hostname "evil.com" is not allowed/, + ); + }); + + it('should match subdomains for wildcard', () => { + expect(() => validateUrl(new URL('http://sub.foo.google.com'), allowedHosts)).not.toThrow(); + }); + + it('should not match base domain for wildcard (*.google.com vs google.com)', () => { + // Logic: hostname.endsWith('.google.com') -> 'google.com'.endsWith('.google.com') is false + expect(() => validateUrl(new URL('http://google.com'), allowedHosts)).toThrowError( + /URL with hostname "google.com" is not allowed/, + ); + }); + + it('should pass for all hostnames when "*" is used', () => { + const allowedHosts = new Set(['*']); + expect(() => validateUrl(new URL('http://example.com'), allowedHosts)).not.toThrow(); + expect(() => validateUrl(new URL('http://google.com'), allowedHosts)).not.toThrow(); + expect(() => validateUrl(new URL('http://evil.com'), allowedHosts)).not.toThrow(); + }); + }); + + describe('validateRequest', () => { + const allowedHosts = new Set(['example.com']); + + it('should pass for valid request', () => { + const req = new Request('http://example.com', { + headers: { + 'x-forwarded-port': '443', + 'x-forwarded-proto': 'https', + }, + }); + + expect(() => validateRequest(req, allowedHosts, false)).not.toThrow(); + }); + + it('should pass for valid request when disableHostCheck is true', () => { + const req = new Request('http://evil.com'); + + expect(() => validateRequest(req, allowedHosts, true)).not.toThrow(); + }); + + it('should throw if URL hostname is invalid', () => { + const req = new Request('http://evil.com'); + + expect(() => validateRequest(req, allowedHosts, false)).toThrowError( + /URL with hostname "evil.com" is not allowed/, + ); + }); + + it('should throw if x-forwarded-port is invalid', () => { + const req = new Request('http://example.com', { + headers: { 'x-forwarded-port': 'abc' }, + }); + + expect(() => validateRequest(req, allowedHosts, false)).toThrowError( + 'Header "x-forwarded-port" must be a numeric value.', + ); + }); + + it('should throw if x-forwarded-proto is invalid', () => { + const req = new Request('http://example.com', { + headers: { 'x-forwarded-proto': 'ftp' }, + }); + expect(() => validateRequest(req, allowedHosts, false)).toThrowError( + 'Header "x-forwarded-proto" must be either "http" or "https".', + ); + }); + + it('should pass for valid x-forwarded-proto (case-insensitive)', () => { + const req = new Request('http://example.com', { + headers: { 'x-forwarded-proto': 'HTTP' }, + }); + expect(() => validateRequest(req, allowedHosts, false)).not.toThrow(); + }); + + it('should throw if host contains path separators', () => { + const req = new Request('http://example.com', { + headers: { 'host': 'example.com/bad' }, + }); + expect(() => validateRequest(req, allowedHosts, false)).toThrowError( + 'Header "host" contains characters that are not allowed.', + ); + }); + + it('should throw if host contains invalid characters', () => { + const req = new Request('http://example.com', { + headers: { 'host': 'example.com?query=1' }, + }); + expect(() => validateRequest(req, allowedHosts, false)).toThrowError( + 'Header "host" contains characters that are not allowed.', + ); + }); + + it('should throw if x-forwarded-host contains path separators', () => { + const req = new Request('http://example.com', { + headers: { 'x-forwarded-host': 'example.com/bad' }, + }); + expect(() => validateRequest(req, allowedHosts, false)).toThrowError( + 'Header "x-forwarded-host" contains characters that are not allowed.', + ); + }); + + it('should throw error if x-forwarded-prefix starts with a backslash or multiple slashes', () => { + const inputs = ['//evil', '\\\\evil', '/\\evil', '\\/evil', '\\evil']; + + for (const prefix of inputs) { + const request = new Request('https://example.com', { + headers: { + 'x-forwarded-prefix': prefix, + }, + }); + + expect(() => validateRequest(request, allowedHosts, false)) + .withContext(`Prefix: "${prefix}"`) + .toThrowError( + 'Header "x-forwarded-prefix" must not start with "\\" or multiple "/" or contain ".", ".." path segments.', + ); + } + }); + + it('should throw error if x-forwarded-prefix contains dot segments', () => { + const inputs = [ + '/./', + '/../', + '/foo/./bar', + '/foo/../bar', + '/.', + '/..', + './', + '../', + '.\\', + '..\\', + '/foo/.\\bar', + '/foo/..\\bar', + '.', + '..', + ]; + + for (const prefix of inputs) { + const request = new Request('https://example.com', { + headers: { + 'x-forwarded-prefix': prefix, + }, + }); + + expect(() => validateRequest(request, allowedHosts, false)) + .withContext(`Prefix: "${prefix}"`) + .toThrowError( + 'Header "x-forwarded-prefix" must not start with "\\" or multiple "/" or contain ".", ".." path segments.', + ); + } + }); + + it('should validate x-forwarded-prefix with valid dot usage', () => { + const inputs = ['/foo.bar', '/foo.bar/baz', '/v1.2', '/.well-known']; + + for (const prefix of inputs) { + const request = new Request('https://example.com', { + headers: { + 'x-forwarded-prefix': prefix, + }, + }); + + expect(() => validateRequest(request, allowedHosts, false)) + .withContext(`Prefix: "${prefix}"`) + .not.toThrow(); + } + }); + }); + + describe('cloneRequestAndPatchHeaders', () => { + const allowedHosts = new Set(['example.com', '*.valid.com']); + + it('should validate host header when accessed via get()', async () => { + const req = new Request('http://example.com', { + headers: { 'host': 'evil.com' }, + }); + const { request: secured, onError } = cloneRequestAndPatchHeaders(req, allowedHosts); + + expect(() => secured.headers.get('host')).toThrowError( + 'Header "host" with value "evil.com" is not allowed.', + ); + await expectAsync(onError).toBeResolvedTo( + jasmine.objectContaining({ + message: jasmine.stringMatching('Header "host" with value "evil.com" is not allowed'), + }), + ); + }); + + it('should allow valid host header', () => { + const req = new Request('http://example.com', { + headers: { 'host': 'example.com' }, + }); + const { request: secured } = cloneRequestAndPatchHeaders(req, allowedHosts); + expect(secured.headers.get('host')).toBe('example.com'); + }); + + it('should allow any host header when "*" is used', () => { + const allowedHosts = new Set(['*']); + const req = new Request('http://example.com', { + headers: { 'host': 'evil.com' }, + }); + const { request: secured } = cloneRequestAndPatchHeaders(req, allowedHosts); + expect(secured.headers.get('host')).toBe('evil.com'); + }); + + it('should validate x-forwarded-host header', async () => { + const req = new Request('http://example.com', { + headers: { 'x-forwarded-host': 'evil.com' }, + }); + const { request: secured, onError } = cloneRequestAndPatchHeaders(req, allowedHosts); + + expect(() => secured.headers.get('x-forwarded-host')).toThrowError( + 'Header "x-forwarded-host" with value "evil.com" is not allowed.', + ); + await expectAsync(onError).toBeResolvedTo( + jasmine.objectContaining({ + message: jasmine.stringMatching( + 'Header "x-forwarded-host" with value "evil.com" is not allowed', + ), + }), + ); + }); + + it('should allow accessing other headers without validation', () => { + const req = new Request('http://example.com', { + headers: { 'accept': 'application/json' }, + }); + const { request: secured } = cloneRequestAndPatchHeaders(req, allowedHosts); + + expect(secured.headers.get('accept')).toBe('application/json'); + }); + + it('should validate headers when iterating with entries()', async () => { + const req = new Request('http://example.com', { + headers: { 'host': 'evil.com' }, + }); + const { request: secured, onError } = cloneRequestAndPatchHeaders(req, allowedHosts); + + expect(() => { + for (const _ of secured.headers.entries()) { + // access the header to trigger the validation + } + }).toThrowError('Header "host" with value "evil.com" is not allowed.'); + + await expectAsync(onError).toBeResolvedTo( + jasmine.objectContaining({ + message: jasmine.stringMatching('Header "host" with value "evil.com" is not allowed.'), + }), + ); + }); + + it('should validate headers when iterating with values()', async () => { + const req = new Request('http://example.com', { + headers: { 'host': 'evil.com' }, + }); + const { request: secured, onError } = cloneRequestAndPatchHeaders(req, allowedHosts); + + expect(() => { + for (const _ of secured.headers.values()) { + // access the header to trigger the validation + } + }).toThrowError('Header "host" with value "evil.com" is not allowed.'); + + await expectAsync(onError).toBeResolvedTo( + jasmine.objectContaining({ + message: jasmine.stringMatching('Header "host" with value "evil.com" is not allowed.'), + }), + ); + }); + + it('should validate headers when iterating with for...of', async () => { + const req = new Request('http://example.com', { + headers: { 'host': 'evil.com' }, + }); + const { request: secured, onError } = cloneRequestAndPatchHeaders(req, allowedHosts); + + expect(() => { + for (const _ of secured.headers) { + // access the header to trigger the validation + } + }).toThrowError('Header "host" with value "evil.com" is not allowed.'); + + await expectAsync(onError).toBeResolvedTo( + jasmine.objectContaining({ + message: jasmine.stringMatching('Header "host" with value "evil.com" is not allowed.'), + }), + ); + }); + + it('should validate headers when iterating with forEach()', async () => { + const req = new Request('http://example.com', { + headers: { 'host': 'evil.com' }, + }); + const { request: secured, onError } = cloneRequestAndPatchHeaders(req, allowedHosts); + + expect(() => { + secured.headers.forEach(() => { + // access the header to trigger the validation + }); + }).toThrowError('Header "host" with value "evil.com" is not allowed.'); + + await expectAsync(onError).toBeResolvedTo( + jasmine.objectContaining({ + message: jasmine.stringMatching('Header "host" with value "evil.com" is not allowed.'), + }), + ); + }); + }); +}); diff --git a/packages/angular/ssr/third_party/beasties/BUILD.bazel b/packages/angular/ssr/third_party/beasties/BUILD.bazel index 3e8be4267570..b88771871810 100644 --- a/packages/angular/ssr/third_party/beasties/BUILD.bazel +++ b/packages/angular/ssr/third_party/beasties/BUILD.bazel @@ -1,5 +1,5 @@ load("@aspect_rules_js//js:defs.bzl", "js_library") -load("@npm//:rollup/package_json.bzl", rollup = "bin") +load("@npm//:@rollup/wasm-node/package_json.bzl", rollup = "bin") package(default_visibility = ["//visibility:public"]) diff --git a/packages/angular_devkit/architect/package.json b/packages/angular_devkit/architect/package.json index c3f51752bc0c..6cdaa6e5ddac 100644 --- a/packages/angular_devkit/architect/package.json +++ b/packages/angular_devkit/architect/package.json @@ -4,7 +4,7 @@ "description": "Angular Build Facade", "experimental": true, "bin": { - "architect": "./bin/cli.js" + "architect": "bin/cli.js" }, "main": "src/index.js", "typings": "src/index.d.ts", diff --git a/packages/angular_devkit/architect/src/api_spec.ts b/packages/angular_devkit/architect/src/api_spec.ts index 55247a59d993..fc1e4c1d7680 100644 --- a/packages/angular_devkit/architect/src/api_spec.ts +++ b/packages/angular_devkit/architect/src/api_spec.ts @@ -40,7 +40,7 @@ describe('Architect API', () => { for (const ts of Object.getOwnPropertyNames(goldens)) { const t: Target = goldens[ts]; - it(`works for ${JSON.stringify(t)}`, () => { + it(`works for ${JSON.stringify(ts)}`, () => { // We have some invalid goldens. Remove everything after the second :. const goldenTs = ts.replace(/(\w+:\w+(:\w*)?).*/, '$1'); expect(targetStringFromTarget(t)).toEqual(goldenTs); diff --git a/packages/angular_devkit/architect/src/create-builder.ts b/packages/angular_devkit/architect/src/create-builder.ts index d2fc8cfba5eb..de4808aaa296 100644 --- a/packages/angular_devkit/architect/src/create-builder.ts +++ b/packages/angular_devkit/architect/src/create-builder.ts @@ -92,9 +92,7 @@ export function createBuilder<OptT = json.JsonObject, OutT extends BuilderOutput function onInput(i: BuilderInput) { const builder = i.info as BuilderInfo; - const loggerName = i.target - ? targetStringFromTarget(i.target as Target) - : builder.builderName; + const loggerName = i.target ? targetStringFromTarget(i.target) : builder.builderName; const logger = new logging.Logger(loggerName); subscriptions.push(logger.subscribe((entry) => log(entry))); @@ -103,7 +101,7 @@ export function createBuilder<OptT = json.JsonObject, OutT extends BuilderOutput builder, workspaceRoot: i.workspaceRoot, currentDirectory: i.currentDirectory, - target: i.target as Target, + target: i.target, logger: logger, id: i.id, async scheduleTarget( diff --git a/packages/angular_devkit/architect/src/index_spec.ts b/packages/angular_devkit/architect/src/index_spec.ts index 50d599b30dac..e5de7d1b3018 100644 --- a/packages/angular_devkit/architect/src/index_spec.ts +++ b/packages/angular_devkit/architect/src/index_spec.ts @@ -331,7 +331,6 @@ describe('architect', () => { // Use an invalid target and check for error. target.target = 'invalid'; - options = {}; // This should not error. const run2 = await architect.scheduleBuilder('package:getTargetOptions', {}); @@ -375,7 +374,6 @@ describe('architect', () => { // Use an invalid target and check for error. target.target = 'invalid'; - actualBuilderName = ''; // This should not error. const run2 = await architect.scheduleBuilder('package:do-it', {}); diff --git a/packages/angular_devkit/architect/src/jobs/dispatcher.ts b/packages/angular_devkit/architect/src/jobs/dispatcher.ts index 1ffea649e83f..0098a99279a8 100644 --- a/packages/angular_devkit/architect/src/jobs/dispatcher.ts +++ b/packages/angular_devkit/architect/src/jobs/dispatcher.ts @@ -14,8 +14,11 @@ import { Readwrite } from './types'; /** * A JobDispatcher can be used to dispatch between multiple jobs. */ -export interface JobDispatcher<A extends JsonValue, I extends JsonValue, O extends JsonValue> - extends JobHandler<A, I, O> { +export interface JobDispatcher< + A extends JsonValue, + I extends JsonValue, + O extends JsonValue, +> extends JobHandler<A, I, O> { /** * Set the default job if all conditionals failed. * @param name The default name if all conditions are false. @@ -43,7 +46,7 @@ export function createDispatcher<A extends JsonValue, I extends JsonValue, O ext const job: JobHandler<JsonValue, JsonValue, JsonValue> = Object.assign( (argument: JsonValue, context: JobHandlerContext) => { const maybeDelegate = conditionalDelegateList.find(([predicate]) => predicate(argument)); - let delegate: Job<JsonValue, JsonValue, JsonValue> | null = null; + let delegate: Job<JsonValue, JsonValue, JsonValue>; if (maybeDelegate) { delegate = context.scheduler.schedule(maybeDelegate[1], argument); diff --git a/packages/angular_devkit/architect_cli/BUILD.bazel b/packages/angular_devkit/architect_cli/BUILD.bazel deleted file mode 100644 index 98cfd7606b81..000000000000 --- a/packages/angular_devkit/architect_cli/BUILD.bazel +++ /dev/null @@ -1,32 +0,0 @@ -load("@npm//:defs.bzl", "npm_link_all_packages") -load("//tools:defaults.bzl", "npm_package") - -# Copyright Google LLC. All Rights Reserved. -# -# Use of this source code is governed by an MIT-style license that can be -# found in the LICENSE file at https://angular.dev/license -licenses(["notice"]) - -package(default_visibility = ["//visibility:public"]) - -npm_link_all_packages() - -genrule( - name = "license", - srcs = ["//:LICENSE"], - outs = ["LICENSE"], - cmd = "cp $(execpath //:LICENSE) $@", -) - -npm_package( - name = "pkg", - pkg_deps = [ - "//packages/angular_devkit/architect:package.json", - ], - tags = ["release-package"], - deps = [ - ":README.md", - ":bin/cli.js", - ":license", - ], -) diff --git a/packages/angular_devkit/architect_cli/README.md b/packages/angular_devkit/architect_cli/README.md deleted file mode 100644 index 3dae8d2fe2eb..000000000000 --- a/packages/angular_devkit/architect_cli/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# Architect CLI - -This package contains the executable for running an [Architect Builder](/packages/angular_devkit/architect/README.md). - -# Usage - -``` -architect [project][:target][:configuration] [options, ...] - -Run a project target. -If project/target/configuration are not specified, the workspace defaults will be used. - -Options: - --help Show available options for project target. - Shows this message instead when ran without the run argument. - - -Any additional option is passed the target, overriding existing options. -``` diff --git a/packages/angular_devkit/architect_cli/bin/cli.js b/packages/angular_devkit/architect_cli/bin/cli.js deleted file mode 100644 index c1988e048dec..000000000000 --- a/packages/angular_devkit/architect_cli/bin/cli.js +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env node -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import '@angular-devkit/architect/bin/architect.js'; diff --git a/packages/angular_devkit/architect_cli/package.json b/packages/angular_devkit/architect_cli/package.json deleted file mode 100644 index bf1ba1d2debb..000000000000 --- a/packages/angular_devkit/architect_cli/package.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "@angular-devkit/architect-cli", - "version": "0.0.0-EXPERIMENTAL-PLACEHOLDER", - "type": "module", - "description": "Angular Architect CLI", - "homepage": "https://github.com/angular/angular-cli", - "experimental": true, - "bin": { - "architect": "./bin/cli.js" - }, - "keywords": [ - "build system", - "build facade", - "build", - "tooling" - ], - "dependencies": { - "@angular-devkit/architect": "workspace:0.0.0-EXPERIMENTAL-PLACEHOLDER" - } -} diff --git a/packages/angular_devkit/build_angular/BUILD.bazel b/packages/angular_devkit/build_angular/BUILD.bazel index 6e4fba869d9f..90fc7bf4b1fc 100644 --- a/packages/angular_devkit/build_angular/BUILD.bazel +++ b/packages/angular_devkit/build_angular/BUILD.bazel @@ -39,21 +39,11 @@ ts_json_schema( src = "src/builders/extract-i18n/schema.json", ) -ts_json_schema( - name = "jest_schema", - src = "src/builders/jest/schema.json", -) - ts_json_schema( name = "karma_schema", src = "src/builders/karma/schema.json", ) -ts_json_schema( - name = "protractor_schema", - src = "src/builders/protractor/schema.json", -) - ts_json_schema( name = "server_schema", src = "src/builders/server/schema.json", @@ -74,11 +64,6 @@ ts_json_schema( src = "src/builders/prerender/schema.json", ) -ts_json_schema( - name = "web_test_runner_schema", - src = "src/builders/web-test-runner/schema.json", -) - copy_to_bin( name = "schemas", srcs = glob(["**/schema.json"]), @@ -87,8 +72,6 @@ copy_to_bin( RUNTIME_ASSETS = glob( include = [ "src/**/schema.json", - "src/**/*.js", - "src/**/*.mjs", "src/**/*.html", ], ) + [ @@ -117,14 +100,11 @@ ts_project( "//packages/angular_devkit/build_angular:src/builders/browser/schema.ts", "//packages/angular_devkit/build_angular:src/builders/dev-server/schema.ts", "//packages/angular_devkit/build_angular:src/builders/extract-i18n/schema.ts", - "//packages/angular_devkit/build_angular:src/builders/jest/schema.ts", "//packages/angular_devkit/build_angular:src/builders/karma/schema.ts", "//packages/angular_devkit/build_angular:src/builders/ng-packagr/schema.ts", "//packages/angular_devkit/build_angular:src/builders/prerender/schema.ts", - "//packages/angular_devkit/build_angular:src/builders/protractor/schema.ts", "//packages/angular_devkit/build_angular:src/builders/server/schema.ts", "//packages/angular_devkit/build_angular:src/builders/ssr-dev-server/schema.ts", - "//packages/angular_devkit/build_angular:src/builders/web-test-runner/schema.ts", ], data = RUNTIME_ASSETS, deps = [ @@ -145,7 +125,6 @@ ts_project( ":node_modules/@babel/runtime", ":node_modules/@discoveryjs/json-ext", ":node_modules/@ngtools/webpack", - ":node_modules/@web/test-runner", ":node_modules/ansi-colors", ":node_modules/autoprefixer", ":node_modules/babel-loader", @@ -175,7 +154,6 @@ ts_project( ":node_modules/source-map-support", ":node_modules/terser", ":node_modules/tinyglobby", - ":node_modules/tree-kill", ":node_modules/webpack", ":node_modules/webpack-dev-middleware", ":node_modules/webpack-dev-server", @@ -219,9 +197,6 @@ ts_project( "src/builders/**/*_spec.ts", ], ), - data = [ - "//packages/angular_devkit/build_angular/test/hello-world-lib", - ], deps = [ ":build_angular", ":build_angular_test_utils", @@ -290,9 +265,6 @@ ts_project( "src/**/*_spec.ts", ], ), - data = [ - "//packages/angular_devkit/build_angular/test/hello-world-lib", - ], deps = [ ":build_angular", ":node_modules/@angular-devkit/architect", @@ -335,25 +307,14 @@ LARGE_SPECS = { ":node_modules/webpack", ], }, - "protractor": { - "extra_deps": [ - "//:node_modules/jasmine-spec-reporter", - "//:node_modules/protractor", - "//:node_modules/puppeteer", - "//:node_modules/ts-node", - ], - # NB: does not run on rbe because webdriver manager uses an absolute path to chromedriver - "tags": ["no-remote-exec"], - # NB: multiple shards will compete for port 4200 so limiting to 1 - "shards": 1, - }, "server": { "size": "large", "extra_deps": [ "//:node_modules/@angular/animations", ], }, - "ng-packagr": {}, + "ng-packagr": { + }, "browser": { "shards": 10, "size": "large", @@ -400,6 +361,7 @@ LARGE_SPECS = { "//:node_modules/@angular/core", "//:node_modules/@angular/platform-browser", "//:node_modules/@angular/router", + "//:node_modules/@types/express", ":node_modules/rxjs", "//:node_modules/tslib", "//:node_modules/typescript", diff --git a/packages/angular_devkit/build_angular/README.md b/packages/angular_devkit/build_angular/README.md index e839387b98ea..0c9ec4e36bf0 100644 --- a/packages/angular_devkit/build_angular/README.md +++ b/packages/angular_devkit/build_angular/README.md @@ -17,7 +17,6 @@ This package contains [Architect builders](/packages/angular_devkit/architect/RE | prerender | [Prerender](https://angular.dev/guide/prerendering) pages of your application. Prerendering is the process where a dynamic page is processed at build time generating static HTML. | | server | Build an Angular application targeting a [Node.js](https://nodejs.org) environment. | | ssr-dev-server | A development server which offers live reload during development, but uses server-side rendering. | -| protractor | **Deprecated** - Run end-to-end tests using [Protractor](https://www.protractortest.org/) framework. | ## Disclaimer diff --git a/packages/angular_devkit/build_angular/builders.json b/packages/angular_devkit/build_angular/builders.json index aba9dd1ffca6..4e823879bbfe 100644 --- a/packages/angular_devkit/build_angular/builders.json +++ b/packages/angular_devkit/build_angular/builders.json @@ -27,31 +27,11 @@ "schema": "./src/builders/extract-i18n/schema.json", "description": "Extract i18n strings from a browser application." }, - "jest": { - "implementation": "./src/builders/jest", - "schema": "./src/builders/jest/schema.json", - "description": "Run unit tests using Jest." - }, "karma": { "implementation": "./src/builders/karma", "schema": "./src/builders/karma/schema.json", "description": "Run Karma unit tests." }, - "web-test-runner": { - "implementation": "./src/builders/web-test-runner", - "schema": "./src/builders/web-test-runner/schema.json", - "description": "Run unit tests with Web Test Runner." - }, - "protractor": { - "implementation": "./src/builders/protractor-error", - "schema": "./src/builders/protractor/schema.json", - "description": "Throw an error that Protractor is end-of-life and no longer supported." - }, - "private-protractor": { - "implementation": "./src/builders/protractor", - "schema": "./src/builders/protractor/schema.json", - "description": "PRIVATE API - Do not use." - }, "server": { "implementation": "./src/builders/server", "schema": "./src/builders/server/schema.json", diff --git a/packages/angular_devkit/build_angular/package.json b/packages/angular_devkit/build_angular/package.json index f557d8362da9..945108770a32 100644 --- a/packages/angular_devkit/build_angular/package.json +++ b/packages/angular_devkit/build_angular/package.json @@ -18,45 +18,44 @@ "@babel/plugin-transform-async-generator-functions": "7.29.0", "@babel/plugin-transform-async-to-generator": "7.28.6", "@babel/plugin-transform-runtime": "7.29.0", - "@babel/preset-env": "7.29.0", - "@babel/runtime": "7.28.6", - "@discoveryjs/json-ext": "0.6.3", + "@babel/preset-env": "7.29.2", + "@babel/runtime": "7.29.2", + "@discoveryjs/json-ext": "1.0.0", "@ngtools/webpack": "workspace:0.0.0-PLACEHOLDER", "ansi-colors": "4.1.3", - "autoprefixer": "10.4.24", - "babel-loader": "10.0.0", + "autoprefixer": "10.4.27", + "babel-loader": "10.1.1", "browserslist": "^4.26.0", - "copy-webpack-plugin": "13.0.1", - "css-loader": "7.1.3", + "copy-webpack-plugin": "14.0.0", + "css-loader": "7.1.4", "esbuild-wasm": "0.27.3", "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", + "less": "4.6.4", + "less-loader": "12.3.2", "license-webpack-plugin": "4.0.2", "loader-utils": "3.3.1", - "mini-css-extract-plugin": "2.10.0", + "mini-css-extract-plugin": "2.10.2", "open": "11.0.0", "ora": "9.3.0", - "picomatch": "4.0.3", + "picomatch": "4.0.4", "piscina": "5.1.4", - "postcss": "8.5.6", - "postcss-loader": "8.2.0", + "postcss": "8.5.8", + "postcss-loader": "8.2.1", "resolve-url-loader": "5.0.0", "rxjs": "7.8.2", - "sass": "1.97.3", + "sass": "1.98.0", "sass-loader": "16.0.7", "semver": "7.7.4", "source-map-loader": "5.0.0", "source-map-support": "0.5.21", - "terser": "5.46.0", + "terser": "5.46.1", "tinyglobby": "0.2.15", - "tree-kill": "1.2.2", "tslib": "2.8.1", - "webpack": "5.105.2", - "webpack-dev-middleware": "7.4.5", + "webpack": "5.105.4", + "webpack-dev-middleware": "8.0.2", "webpack-dev-server": "5.2.3", "webpack-merge": "6.0.1", "webpack-subresource-integrity": "5.1.0" @@ -66,28 +65,23 @@ }, "devDependencies": { "@angular/ssr": "workspace:*", - "@web/test-runner": "0.20.2", "browser-sync": "3.0.4", - "ng-packagr": "21.2.0-next.0", - "undici": "7.22.0" + "ng-packagr": "22.0.0-next.1", + "undici": "7.24.6" }, "peerDependencies": { - "@angular/core": "0.0.0-ANGULAR-FW-PEER-DEP", "@angular/compiler-cli": "0.0.0-ANGULAR-FW-PEER-DEP", + "@angular/core": "0.0.0-ANGULAR-FW-PEER-DEP", "@angular/localize": "0.0.0-ANGULAR-FW-PEER-DEP", "@angular/platform-browser": "0.0.0-ANGULAR-FW-PEER-DEP", "@angular/platform-server": "0.0.0-ANGULAR-FW-PEER-DEP", "@angular/service-worker": "0.0.0-ANGULAR-FW-PEER-DEP", "@angular/ssr": "^0.0.0-PLACEHOLDER", - "@web/test-runner": "^0.20.0", "browser-sync": "^3.0.2", - "jest": "^30.2.0", - "jest-environment-jsdom": "^30.2.0", "karma": "^6.3.0", "ng-packagr": "0.0.0-NG-PACKAGR-PEER-DEP", - "protractor": "^7.0.0", "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", - "typescript": ">=5.9 <6.0" + "typescript": ">=5.9 <6.1" }, "peerDependenciesMeta": { "@angular/core": { @@ -108,27 +102,15 @@ "@angular/ssr": { "optional": true }, - "@web/test-runner": { - "optional": true - }, "browser-sync": { "optional": true }, - "jest": { - "optional": true - }, - "jest-environment-jsdom": { - "optional": true - }, "karma": { "optional": true }, "ng-packagr": { "optional": true }, - "protractor": { - "optional": true - }, "tailwindcss": { "optional": true } diff --git a/packages/angular_devkit/build_angular/src/builders/app-shell/index.ts b/packages/angular_devkit/build_angular/src/builders/app-shell/index.ts index abdaf31f3a98..6a70ff1a60d2 100644 --- a/packages/angular_devkit/build_angular/src/builders/app-shell/index.ts +++ b/packages/angular_devkit/build_angular/src/builders/app-shell/index.ts @@ -194,10 +194,10 @@ async function _appShellBuilder( let spinner: Spinner | undefined; try { - const [browserResult, serverResult] = await Promise.all([ - browserTargetRun.result as Promise<BrowserBuilderOutput>, - serverTargetRun.result as Promise<ServerBuilderOutput>, - ]); + const [browserResult, serverResult] = (await Promise.all([ + browserTargetRun.result, + serverTargetRun.result, + ])) as [BrowserBuilderOutput, ServerBuilderOutput]; if (browserResult.success === false || browserResult.baseOutputPath === undefined) { return browserResult; diff --git a/packages/angular_devkit/build_angular/src/builders/browser/specs/allow-js_spec.ts b/packages/angular_devkit/build_angular/src/builders/browser/specs/allow-js_spec.ts index e8e270b9e16c..3d75ce49a690 100644 --- a/packages/angular_devkit/build_angular/src/builders/browser/specs/allow-js_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/browser/specs/allow-js_spec.ts @@ -36,7 +36,7 @@ describe('Browser Builder allow js', () => { ); const run = await architect.scheduleTarget(targetSpec); - const output = (await run.result) as BrowserBuilderOutput; + const output = await run.result; expect(output.success).toBe(true); const content = virtualFs.fileBufferToString( @@ -63,7 +63,7 @@ describe('Browser Builder allow js', () => { const overrides = { aot: true }; const run = await architect.scheduleTarget(targetSpec, overrides); - const output = (await run.result) as BrowserBuilderOutput; + const output = await run.result; expect(output.success).toBe(true); const content = virtualFs.fileBufferToString( @@ -93,7 +93,7 @@ describe('Browser Builder allow js', () => { const run = await architect.scheduleTarget(targetSpec, overrides); await lastValueFrom( - (run.output as Observable<BrowserBuilderOutput>).pipe( + run.output.pipe( tap((output) => { const path = relative(host.root(), join(normalize(output.outputs[0].path), 'main.js')); const content = virtualFs.fileBufferToString(host.scopedSync().read(path)); diff --git a/packages/angular_devkit/build_angular/src/builders/browser/specs/base-href_spec.ts b/packages/angular_devkit/build_angular/src/builders/browser/specs/base-href_spec.ts index f8788cf3d947..b65dd9b74525 100644 --- a/packages/angular_devkit/build_angular/src/builders/browser/specs/base-href_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/browser/specs/base-href_spec.ts @@ -10,7 +10,6 @@ import { Architect } from '@angular-devkit/architect'; import { join, normalize, tags, virtualFs } from '@angular-devkit/core'; import { lastValueFrom } from 'rxjs'; import { createArchitect, host } from '../../../testing/test-utils'; -import { BrowserBuilderOutput } from '../index'; describe('Browser Builder base href', () => { const targetSpec = { project: 'app', target: 'build' }; @@ -23,6 +22,12 @@ describe('Browser Builder base href', () => { afterEach(async () => host.restore().toPromise()); it('works', async () => { + host.replaceInFile( + 'tsconfig.json', + '"target": "es2022"', + '"target": "es2022", "allowJs": true', + ); + host.writeMultipleFiles({ 'src/my-js-file.js': `console.log(1); export const a = 2;`, 'src/main.ts': `import { a } from './my-js-file'; console.log(a);`, @@ -30,7 +35,7 @@ describe('Browser Builder base href', () => { const overrides = { baseHref: '/myUrl' }; const run = await architect.scheduleTarget(targetSpec, overrides); - const output = (await run.result) as BrowserBuilderOutput; + const output = await run.result; expect(output.success).toBe(true); const fileName = join(normalize(output.outputs[0].path), 'index.html'); @@ -51,7 +56,7 @@ describe('Browser Builder base href', () => { }); const run = await architect.scheduleTarget(targetSpec); - const output = (await run.result) as BrowserBuilderOutput; + const output = await run.result; expect(output.success).toBeTrue(); const fileName = join(normalize(output.outputs[0].path), 'index.html'); @@ -71,7 +76,7 @@ describe('Browser Builder base href', () => { const overrides = { baseHref: '/myUrl' }; const run = await architect.scheduleTarget(targetSpec, overrides); - const output = (await run.result) as BrowserBuilderOutput; + const output = await run.result; expect(output.success).toBe(true); const fileName = join(normalize(output.outputs[0].path), 'index.html'); const content = virtualFs.fileBufferToString( diff --git a/packages/angular_devkit/build_angular/src/builders/browser/specs/build-optimizer_spec.ts b/packages/angular_devkit/build_angular/src/builders/browser/specs/build-optimizer_spec.ts index 47f641fb55ff..b6c7be1fd931 100644 --- a/packages/angular_devkit/build_angular/src/builders/browser/specs/build-optimizer_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/browser/specs/build-optimizer_spec.ts @@ -40,7 +40,7 @@ describe('Browser Builder build optimizer', () => { const boOverrides = { ...noBoOverrides, buildOptimizer: true }; const run = await architect.scheduleTarget(targetSpec, noBoOverrides); - const output = (await run.result) as BrowserBuilderOutput; + const output = await run.result; expect(output.success).toBe(true); @@ -54,7 +54,7 @@ describe('Browser Builder build optimizer', () => { await run.stop(); const boRun = await architect.scheduleTarget(targetSpec, boOverrides); - const boOutput = (await run.result) as BrowserBuilderOutput; + const boOutput = await run.result; expect(boOutput.success).toBe(true); const boStats = await lastValueFrom( diff --git a/packages/angular_devkit/build_angular/src/builders/browser/specs/cross-origin_spec.ts b/packages/angular_devkit/build_angular/src/builders/browser/specs/cross-origin_spec.ts index 8101c325b724..8b0b21eff392 100644 --- a/packages/angular_devkit/build_angular/src/builders/browser/specs/cross-origin_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/browser/specs/cross-origin_spec.ts @@ -34,7 +34,7 @@ describe('Browser Builder crossOrigin', () => { it('works with use-credentials', async () => { const overrides = { crossOrigin: CrossOrigin.UseCredentials }; const run = await architect.scheduleTarget(targetSpec, overrides); - const output = (await run.result) as BrowserBuilderOutput; + const output = await run.result; expect(output.success).toBe(true); const fileName = join(normalize(output.outputs[0].path), 'index.html'); const content = virtualFs.fileBufferToString( @@ -54,7 +54,7 @@ describe('Browser Builder crossOrigin', () => { it('works with anonymous', async () => { const overrides = { crossOrigin: CrossOrigin.Anonymous }; const run = await architect.scheduleTarget(targetSpec, overrides); - const output = (await run.result) as BrowserBuilderOutput; + const output = await run.result; expect(output.success).toBe(true); const fileName = join(normalize(output.outputs[0].path), 'index.html'); const content = virtualFs.fileBufferToString( @@ -75,7 +75,7 @@ describe('Browser Builder crossOrigin', () => { it('works with none', async () => { const overrides = { crossOrigin: CrossOrigin.None }; const run = await architect.scheduleTarget(targetSpec, overrides); - const output = (await run.result) as BrowserBuilderOutput; + const output = await run.result; expect(output.success).toBe(true); const fileName = join(normalize(output.outputs[0].path), 'index.html'); const content = virtualFs.fileBufferToString( @@ -101,7 +101,7 @@ describe('Browser Builder crossOrigin', () => { const overrides = { crossOrigin: CrossOrigin.UseCredentials }; const run = await architect.scheduleTarget(targetSpec, overrides); - const output = (await run.result) as BrowserBuilderOutput; + const output = await run.result; expect(output.success).toBe(true); const fileName = join(normalize(output.outputs[0].path), 'runtime.js'); diff --git a/packages/angular_devkit/build_angular/src/builders/browser/specs/deploy-url_spec.ts b/packages/angular_devkit/build_angular/src/builders/browser/specs/deploy-url_spec.ts index 69453827b5a5..c24fabd3128b 100644 --- a/packages/angular_devkit/build_angular/src/builders/browser/specs/deploy-url_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/browser/specs/deploy-url_spec.ts @@ -34,7 +34,7 @@ describe('Browser Builder deploy url', () => { }); const run = await architect.scheduleTarget(targetSpec, overrides); - const output = (await run.result) as BrowserBuilderOutput; + const output = await run.result; expect(output.success).toBe(true); expect(output.outputs[0].path).not.toBeUndefined(); const outputPath = normalize(output.outputs[0].path); @@ -51,7 +51,7 @@ describe('Browser Builder deploy url', () => { expect(runtimeContent).toContain('deployUrl/'); const run2 = await architect.scheduleTarget(targetSpec, overrides2); - const output2 = (await run2.result) as BrowserBuilderOutput; + const output2 = await run2.result; expect(output2.outputs[0].path).toEqual(outputPath); // These should be the same. const content2 = virtualFs.fileBufferToString( diff --git a/packages/angular_devkit/build_angular/src/builders/browser/specs/index_spec.ts b/packages/angular_devkit/build_angular/src/builders/browser/specs/index_spec.ts index cf2e2a5d6c76..7f06fe730475 100644 --- a/packages/angular_devkit/build_angular/src/builders/browser/specs/index_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/browser/specs/index_spec.ts @@ -31,7 +31,7 @@ describe('Browser Builder index HTML processing', () => { }); const run = await architect.scheduleTarget(targetSpec); - const output = (await run.result) as BrowserBuilderOutput; + const output = await run.result; expect(output.success).toBe(true); const fileName = join(normalize(output.outputs[0].path), 'index.html'); const content = virtualFs.fileBufferToString( @@ -56,7 +56,7 @@ describe('Browser Builder index HTML processing', () => { }); const run = await architect.scheduleTarget(targetSpec); - const output = (await run.result) as BrowserBuilderOutput; + const output = await run.result; expect(output.success).toBe(true); const fileName = join(normalize(output.outputs[0].path), 'index.html'); const content = virtualFs.fileBufferToString( @@ -81,7 +81,7 @@ describe('Browser Builder index HTML processing', () => { }); const run = await architect.scheduleTarget(targetSpec); - const output = (await run.result) as BrowserBuilderOutput; + const output = await run.result; expect(output.success).toBe(true); const fileName = join(normalize(output.outputs[0].path), 'index.html'); const content = virtualFs.fileBufferToString( @@ -105,7 +105,7 @@ describe('Browser Builder index HTML processing', () => { }); const run = await architect.scheduleTarget(targetSpec); - const output = (await run.result) as BrowserBuilderOutput; + const output = await run.result; expect(output.success).toBe(true); const fileName = join(normalize(output.outputs[0].path), 'index.html'); const content = virtualFs.fileBufferToString( diff --git a/packages/angular_devkit/build_angular/src/builders/browser/specs/tsconfig-paths_spec.ts b/packages/angular_devkit/build_angular/src/builders/browser/specs/tsconfig-paths_spec.ts index 754f85e182a9..80285bf5499d 100644 --- a/packages/angular_devkit/build_angular/src/builders/browser/specs/tsconfig-paths_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/browser/specs/tsconfig-paths_spec.ts @@ -7,6 +7,7 @@ */ import { Architect } from '@angular-devkit/architect'; +import { normalize, virtualFs } from '@angular-devkit/core'; import { browserBuild, createArchitect, host } from '../../../testing/test-utils'; describe('Browser Builder tsconfig paths', () => { @@ -19,49 +20,40 @@ describe('Browser Builder tsconfig paths', () => { }); afterEach(async () => host.restore().toPromise()); - it('works', async () => { + it('should resolve basic tsconfig paths', async () => { host.replaceInFile('src/app/app.module.ts', './app.component', '@root/app/app.component'); - host.replaceInFile( - 'tsconfig.json', - /"baseUrl": ".\/",/, - ` - "baseUrl": "./", - "paths": { - "@root/*": [ - "./src/*" - ] - }, - `, - ); + + const tsconfigPath = normalize('tsconfig.json'); + const tsconfig = JSON.parse(virtualFs.fileBufferToString(host.scopedSync().read(tsconfigPath))); + tsconfig.compilerOptions ??= {}; + tsconfig.compilerOptions.paths = { + '@root/*': ['./src/*'], + }; + host + .scopedSync() + .write(tsconfigPath, virtualFs.stringToFileBuffer(JSON.stringify(tsconfig, null, 2))); await browserBuild(architect, host, target); }); - it('works', async () => { + it('should resolve complex tsconfig paths with wildcards', async () => { host.writeMultipleFiles({ 'src/meaning-too.ts': 'export var meaning = 42;', 'src/app/shared/meaning.ts': 'export var meaning = 42;', 'src/app/shared/index.ts': `export * from './meaning'`, }); - host.replaceInFile( - 'tsconfig.json', - /"baseUrl": ".\/",/, - ` - "baseUrl": "./", - "paths": { - "@shared": [ - "src/app/shared" - ], - "@shared/*": [ - "src/app/shared/*" - ], - "*": [ - "*", - "src/app/shared/*" - ] - }, - `, - ); + const tsconfigPath = normalize('tsconfig.json'); + const tsconfig = JSON.parse(virtualFs.fileBufferToString(host.scopedSync().read(tsconfigPath))); + tsconfig.compilerOptions ??= {}; + tsconfig.compilerOptions.paths = { + '@shared': ['./src/app/shared'], + '@shared/*': ['./src/app/shared/*'], + '*': ['./*', './src/app/shared/*'], + }; + host + .scopedSync() + .write(tsconfigPath, virtualFs.stringToFileBuffer(JSON.stringify(tsconfig, null, 2))); + host.appendToFile( 'src/app/app.component.ts', ` diff --git a/packages/angular_devkit/build_angular/src/builders/browser/specs/unused-files-warning_spec.ts b/packages/angular_devkit/build_angular/src/builders/browser/specs/unused-files-warning_spec.ts index b25d599f18a4..fc66978d8114 100644 --- a/packages/angular_devkit/build_angular/src/builders/browser/specs/unused-files-warning_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/browser/specs/unused-files-warning_spec.ts @@ -30,7 +30,7 @@ describe('Browser Builder unused files warnings', () => { logger.subscribe((e) => logs.push(e.message)); const run = await architect.scheduleTarget(targetSpec, undefined, { logger }); - const output = (await run.result) as BrowserBuilderOutput; + const output = await run.result; expect(output.success).toBe(true); expect(logs.join().includes(warningMessageSuffix)).toBe(false); @@ -49,7 +49,7 @@ describe('Browser Builder unused files warnings', () => { logger.subscribe((e) => logs.push(e.message)); const run = await architect.scheduleTarget(targetSpec, undefined, { logger }); - const output = (await run.result) as BrowserBuilderOutput; + const output = await run.result; expect(output.success).toBe(true); expect(logs.join().includes(`unused-file.ts ${warningMessageSuffix}`)).toBe(true); @@ -82,7 +82,7 @@ describe('Browser Builder unused files warnings', () => { logger.subscribe((e) => logs.push(e.message)); const run = await architect.scheduleTarget(targetSpec, { aot: true }, { logger }); - const output = (await run.result) as BrowserBuilderOutput; + const output = await run.result; expect(output.success).toBe(true); expect(logs.join().includes(warningMessageSuffix)).toBe(false); @@ -105,7 +105,7 @@ describe('Browser Builder unused files warnings', () => { logger.subscribe((e) => logs.push(e.message)); const run = await architect.scheduleTarget(targetSpec, undefined, { logger }); - const output = (await run.result) as BrowserBuilderOutput; + const output = await run.result; expect(output.success).toBe(true); expect(logs.join().includes(warningMessageSuffix)).toBe(false); @@ -129,7 +129,7 @@ describe('Browser Builder unused files warnings', () => { logger.subscribe((e) => logs.push(e.message)); const run = await architect.scheduleTarget(targetSpec, undefined, { logger }); - const output = (await run.result) as BrowserBuilderOutput; + const output = await run.result; expect(output.success).toBe(true); expect(logs.join().includes(warningMessageSuffix)).toBe(false); diff --git a/packages/angular_devkit/build_angular/src/builders/browser/tests/behavior/rebuild-errors_spec.ts b/packages/angular_devkit/build_angular/src/builders/browser/tests/behavior/rebuild-errors_spec.ts index 0daece623c63..26cbe1144d2b 100644 --- a/packages/angular_devkit/build_angular/src/builders/browser/tests/behavior/rebuild-errors_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/browser/tests/behavior/rebuild-errors_spec.ts @@ -23,7 +23,7 @@ describeBuilder(buildWebpackBrowser, BROWSER_BUILDER_INFO, (harness) => { import { Directive, Input } from '@angular/core'; @Directive({ selector: 'dir', standalone: false }) export class Dir { - @Input() foo: number; + @Input() foo!: number; } `; @@ -150,7 +150,7 @@ describeBuilder(buildWebpackBrowser, BROWSER_BUILDER_INFO, (harness) => { import { Directive, Input } from '@angular/core'; @Directive({ selector: 'dir', standalone: false }) export class Dir { - @Input() foo: number; + @Input() foo!: number; } `, ); @@ -160,7 +160,7 @@ describeBuilder(buildWebpackBrowser, BROWSER_BUILDER_INFO, (harness) => { import { Directive } from '@angular/core'; @Directive({ selector: 'dir', standalone: false }) export class Dir2 { - foo: string; + foo!: string; } `; await harness.writeFile('src/app/dir2.ts', goodDirectiveContents); @@ -216,7 +216,7 @@ describeBuilder(buildWebpackBrowser, BROWSER_BUILDER_INFO, (harness) => { import { Directive, Input } from '@angular/core'; @Directive({ selector: 'dir', standalone: false }) export class Dir2 { - @Input() foo: string; + @Input() foo!: string; } `, ); diff --git a/packages/angular_devkit/build_angular/src/builders/browser/tests/options/allowed-common-js-dependencies_spec.ts b/packages/angular_devkit/build_angular/src/builders/browser/tests/options/allowed-common-js-dependencies_spec.ts index d53349df5c48..b0e89583bb63 100644 --- a/packages/angular_devkit/build_angular/src/builders/browser/tests/options/allowed-common-js-dependencies_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/browser/tests/options/allowed-common-js-dependencies_spec.ts @@ -119,17 +119,13 @@ describeBuilder(buildWebpackBrowser, BROWSER_BUILDER_INFO, (harness) => { it('should not show warning in JIT for templateUrl and styleUrl when using paths', async () => { await harness.modifyFile('tsconfig.json', (content) => { - return content.replace( - /"baseUrl": ".\/",/, - ` - "baseUrl": "./", - "paths": { - "@app/*": [ - "src/app/*" - ] - }, - `, - ); + const tsconfig = JSON.parse(content); + tsconfig.compilerOptions ??= {}; + tsconfig.compilerOptions.paths = { + '@app/*': ['./src/app/*'], + }; + + return JSON.stringify(tsconfig, null, 2); }); await harness.modifyFile('src/app/app.module.ts', (content) => diff --git a/packages/angular_devkit/build_angular/src/builders/dev-server/specs/hmr_spec.ts b/packages/angular_devkit/build_angular/src/builders/dev-server/specs/hmr_spec.ts index 2ecda166bfbe..9433f71220bf 100644 --- a/packages/angular_devkit/build_angular/src/builders/dev-server/specs/hmr_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/dev-server/specs/hmr_spec.ts @@ -7,6 +7,7 @@ */ import { Architect, BuilderRun } from '@angular-devkit/architect'; +import path from 'node:path'; // eslint-disable-next-line import/no-extraneous-dependencies import puppeteer, { Browser, Page } from 'puppeteer'; import { debounceTime, switchMap, take } from 'rxjs'; @@ -28,12 +29,10 @@ describe('Dev Server Builder HMR', () => { beforeAll(async () => { browser = await puppeteer.launch({ - // MacOSX users need to set the local binary manually because Chrome has lib files with - // spaces in them which Bazel does not support in runfiles - // See: https://github.com/angular/angular-cli/pull/17624 - // eslint-disable-next-line max-len - // executablePath: '/Users/<USERNAME>/git/angular-cli/node_modules/puppeteer/.local-chromium/mac-800071/chrome-mac/Chromium.app/Contents/MacOS/Chromium', args: ['--no-sandbox', '--disable-gpu'], + executablePath: process.env.CHROME_BIN + ? path.resolve(path.join(process.cwd(), '..', '..', '..'), process.env.CHROME_BIN) + : undefined, }); }); diff --git a/packages/angular_devkit/build_angular/src/builders/dev-server/tests/behavior/serve-live-reload-proxies_spec.ts b/packages/angular_devkit/build_angular/src/builders/dev-server/tests/behavior/serve-live-reload-proxies_spec.ts index 09d50dbb4528..2ebd9e27d6c4 100644 --- a/packages/angular_devkit/build_angular/src/builders/dev-server/tests/behavior/serve-live-reload-proxies_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/dev-server/tests/behavior/serve-live-reload-proxies_spec.ts @@ -9,6 +9,7 @@ /* eslint-disable import/no-extraneous-dependencies */ import { tags } from '@angular-devkit/core'; import { createServer } from 'node:http'; +import path from 'node:path'; import { createProxyServer } from 'http-proxy'; import { AddressInfo } from 'node:net'; import { setTimeout as setTimeoutPromise } from 'node:timers/promises'; @@ -156,12 +157,10 @@ describeServeBuilder( beforeAll(async () => { browser = await puppeteer.launch({ - // MacOSX users need to set the local binary manually because Chrome has lib files with - // spaces in them which Bazel does not support in runfiles - // See: https://github.com/angular/angular-cli/pull/17624 - // eslint-disable-next-line max-len - // executablePath: '/Users/<USERNAME>/git/angular-cli/node_modules/puppeteer/.local-chromium/mac-818858/chrome-mac/Chromium.app/Contents/MacOS/Chromium', - ignoreHTTPSErrors: true, + executablePath: process.env.CHROME_BIN + ? path.resolve(path.join(process.cwd(), '..', '..', '..'), process.env.CHROME_BIN) + : undefined, + acceptInsecureCerts: true, args: ['--no-sandbox', '--disable-gpu'], }); }); diff --git a/packages/angular_devkit/build_angular/src/builders/dev-server/tests/jasmine-helpers.ts b/packages/angular_devkit/build_angular/src/builders/dev-server/tests/jasmine-helpers.ts index f3d1bfcea48a..07182ebe07f1 100644 --- a/packages/angular_devkit/build_angular/src/builders/dev-server/tests/jasmine-helpers.ts +++ b/packages/angular_devkit/build_angular/src/builders/dev-server/tests/jasmine-helpers.ts @@ -14,6 +14,7 @@ import { host } from '../../../testing/test-utils'; import { setupApplicationTarget, setupBrowserTarget } from './setup'; const optionSchemaCache = new Map<string, json.schema.JsonSchema>(); +let counter = 0; export function describeServeBuilder<T extends json.JsonObject>( builderHandler: BuilderHandlerFn<T>, @@ -39,7 +40,8 @@ export function describeServeBuilder<T extends json.JsonObject>( optionSchema, }); - describe(options.name || builderHandler.name, () => { + // The counter is needed to avoid duplicate describe names as they are not allowed. + describe((options.name || builderHandler.name) + ` (${counter++})`, () => { for (const isViteRun of [true, false]) { describe(isViteRun ? 'vite' : 'webpack-dev-server', () => { beforeEach(() => host.initialize().toPromise()); diff --git a/packages/angular_devkit/build_angular/src/builders/jest/index.ts b/packages/angular_devkit/build_angular/src/builders/jest/index.ts deleted file mode 100644 index 5cd8d6ebdad9..000000000000 --- a/packages/angular_devkit/build_angular/src/builders/jest/index.ts +++ /dev/null @@ -1,216 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import { ResultKind, buildApplicationInternal } from '@angular/build/private'; -import { BuilderContext, BuilderOutput, createBuilder } from '@angular-devkit/architect'; -import { execFile as execFileCb } from 'node:child_process'; -import { randomUUID } from 'node:crypto'; -import * as fs from 'node:fs/promises'; -import * as path from 'node:path'; -import { promisify } from 'node:util'; -import { colors } from '../../utils/color'; -import { findTestFiles } from '../../utils/test-files'; -import { OutputHashing } from '../browser-esbuild/schema'; -import { writeTestFiles } from '../web-test-runner/write-test-files'; -import { normalizeOptions } from './options'; -import { Schema as JestBuilderSchema } from './schema'; - -const execFile = promisify(execFileCb); - -/** Main execution function for the Jest builder. */ -export default createBuilder( - async (schema: JestBuilderSchema, context: BuilderContext): Promise<BuilderOutput> => { - context.logger.warn( - 'NOTE: The Jest builder is currently EXPERIMENTAL and will be removed in version 22.', - ); - - const options = normalizeOptions(schema); - const testOut = path.join(context.workspaceRoot, 'dist/test-out', randomUUID()); // TODO(dgp1130): Hide in temp directory. - - // Verify Jest installation and get the path to it's binary. - // We need to `node_modules/.bin/jest`, but there is no means to resolve that directly. Fortunately Jest's `package.json` exports the - // same file at `bin/jest`, so we can just resolve that instead. - const jest = resolveModule('jest/bin/jest'); - if (!jest) { - return { - success: false, - // TODO(dgp1130): Display a more accurate message for non-NPM users. - error: - 'Jest is not installed, most likely you need to run `npm install jest --save-dev` in your project.', - }; - } - - // Verify that JSDom is installed in the project. - const environment = resolveModule('jest-environment-jsdom'); - if (!environment) { - return { - success: false, - // TODO(dgp1130): Display a more accurate message for non-NPM users. - error: - '`jest-environment-jsdom` is not installed. Install it with `npm install jest-environment-jsdom --save-dev`.', - }; - } - - const [testFiles, customConfig] = await Promise.all([ - findTestFiles(options.include, options.exclude, context.workspaceRoot), - findCustomJestConfig(context.workspaceRoot), - ]); - - // Warn if a custom Jest configuration is found. We won't use it, so if a developer is trying to use a custom config, this hopefully - // makes a better experience than silently ignoring the configuration. - // Ideally, this would be a hard error. However a Jest config could exist for testing other files in the workspace outside of Angular - // CLI, so we likely can't produce a hard error in this situation without an opt-out. - if (customConfig) { - context.logger.warn( - 'A custom Jest config was found, but this is not supported by `@angular-devkit/build-angular:jest` and will be' + - ` ignored: ${customConfig}. This is an experiment to see if completely abstracting away Jest's configuration is viable. Please` + - ` consider if your use case can be met without directly modifying the Jest config. If this is a major obstacle for your use` + - ` case, please post it in this issue so we can collect feedback and evaluate: https://github.com/angular/angular-cli/issues/25434.`, - ); - } - - // Build all the test files. - const jestGlobal = path.join(__dirname, 'jest-global.mjs'); - const initTestBed = path.join(__dirname, 'init-test-bed.mjs'); - const buildResult = await first( - buildApplicationInternal( - { - // Build all the test files and also the `jest-global` and `init-test-bed` scripts. - entryPoints: new Set([...testFiles, jestGlobal, initTestBed]), - tsConfig: options.tsConfig, - polyfills: options.polyfills ?? ['zone.js', 'zone.js/testing'], - outputPath: testOut, - aot: options.aot, - index: false, - outputHashing: OutputHashing.None, - outExtension: 'mjs', // Force native ESM. - optimization: false, - sourceMap: { - scripts: true, - styles: false, - vendor: false, - }, - }, - context, - ), - ); - if (buildResult.kind === ResultKind.Failure) { - return { success: false }; - } else if (buildResult.kind !== ResultKind.Full) { - return { - success: false, - error: 'A full build result is required from the application builder.', - }; - } - - // Write test files - await writeTestFiles(buildResult.files, testOut); - - // Execute Jest on the built output directory. - const jestProc = execFile(process.execPath, [ - '--experimental-vm-modules', - jest, - - `--rootDir=${testOut}`, - `--config=${path.join(__dirname, 'jest.config.mjs')}`, - '--testEnvironment=jsdom', - - // TODO(dgp1130): Enable cache once we have a mechanism for properly clearing / disabling it. - '--no-cache', - - // Run basically all files in the output directory, any excluded files were already dropped by the build. - `--testMatch="<rootDir>/**/*.mjs"`, - - // Load polyfills and initialize the environment before executing each test file. - // IMPORTANT: Order matters here. - // First, we execute `jest-global.mjs` to initialize the `jest` global variable. - // Second, we execute user polyfills, including `zone.js` and `zone.js/testing`. This is dependent on the Jest global so it can patch - // the environment for fake async to work correctly. - // Third, we initialize `TestBed`. This is dependent on fake async being set up correctly beforehand. - `--setupFilesAfterEnv="<rootDir>/jest-global.mjs"`, - ...(options.polyfills?.length ? [`--setupFilesAfterEnv="<rootDir>/polyfills.mjs"`] : []), - `--setupFilesAfterEnv="<rootDir>/init-test-bed.mjs"`, - - // Don't run any infrastructure files as tests, they are manually loaded where needed. - `--testPathIgnorePatterns="<rootDir>/jest-global\\.mjs"`, - ...(options.polyfills ? [`--testPathIgnorePatterns="<rootDir>/polyfills\\.mjs"`] : []), - `--testPathIgnorePatterns="<rootDir>/init-test-bed\\.mjs"`, - - // Skip shared chunks, as they are not entry points to tests. - `--testPathIgnorePatterns="<rootDir>/chunk-.*\\.mjs"`, - - // Optionally enable color. - ...(colors.enabled ? ['--colors'] : []), - ]); - - // Stream test output to the terminal. - jestProc.child.stdout?.on('data', (chunk) => { - context.logger.info(chunk); - }); - jestProc.child.stderr?.on('data', (chunk) => { - // Write to stderr directly instead of `context.logger.error(chunk)` because the logger will overwrite Jest's coloring information. - process.stderr.write(chunk); - }); - - try { - await jestProc; - } catch (error) { - // No need to propagate error message, already piped to terminal output. - // TODO(dgp1130): Handle process spawning failures. - return { success: false }; - } - - return { success: true }; - }, -); - -/** Returns the first item yielded by the given generator and cancels the execution. */ -async function first<T>(generator: AsyncIterable<T>): Promise<T> { - for await (const value of generator) { - return value; - } - - throw new Error('Expected generator to emit at least once.'); -} - -/** Safely resolves the given Node module string. */ -function resolveModule(module: string): string | undefined { - try { - return require.resolve(module); - } catch { - return undefined; - } -} - -/** Returns whether or not the provided directory includes a Jest configuration file. */ -async function findCustomJestConfig(dir: string): Promise<string | undefined> { - const entries = await fs.readdir(dir, { withFileTypes: true }); - - // Jest supports many file extensions (`js`, `ts`, `cjs`, `cts`, `json`, etc.) Just look - // for anything with that prefix. - const config = entries.find((entry) => entry.isFile() && entry.name.startsWith('jest.config.')); - if (config) { - return path.join(dir, config.name); - } - - // Jest also supports a `jest` key in `package.json`, look for a config there. - const packageJsonPath = path.join(dir, 'package.json'); - let packageJson: string | undefined; - try { - packageJson = await fs.readFile(packageJsonPath, 'utf8'); - } catch { - return undefined; // No package.json, therefore no Jest configuration in it. - } - - const json = JSON.parse(packageJson) as { jest?: unknown }; - if ('jest' in json) { - return packageJsonPath; - } - - return undefined; -} diff --git a/packages/angular_devkit/build_angular/src/builders/jest/init-test-bed.mjs b/packages/angular_devkit/build_angular/src/builders/jest/init-test-bed.mjs deleted file mode 100644 index 2a9913b70363..000000000000 --- a/packages/angular_devkit/build_angular/src/builders/jest/init-test-bed.mjs +++ /dev/null @@ -1,24 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -// TODO(dgp1130): These imports likely don't resolve in stricter package environments like `pnpm`, since they are resolved relative to -// `@angular-devkit/build-angular` rather than the user's workspace. Should look into virtual modules to support those use cases. - -import { NgModule, provideZoneChangeDetection } from '@angular/core'; -import { getTestBed } from '@angular/core/testing'; -import { BrowserTestingModule, platformBrowserTesting } from '@angular/platform-browser/testing'; - -@NgModule({ - providers: [typeof window.Zone !== 'undefined' ? provideZoneChangeDetection() : []], -}) -class TestModule {} - -getTestBed().initTestEnvironment([BrowserTestingModule, TestModule], platformBrowserTesting(), { - errorOnUnknownElements: true, - errorOnUnknownProperties: true, -}); diff --git a/packages/angular_devkit/build_angular/src/builders/jest/jest-global.mjs b/packages/angular_devkit/build_angular/src/builders/jest/jest-global.mjs deleted file mode 100644 index 40b8135b4e85..000000000000 --- a/packages/angular_devkit/build_angular/src/builders/jest/jest-global.mjs +++ /dev/null @@ -1,19 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -/** - * @fileoverview Zone.js requires the `jest` global to be initialized in order to know that it must patch the environment to support Jest - * execution. When running ESM code, Jest does _not_ inject the global `jest` symbol, so Zone.js would not normally know it is running - * within Jest as users are supposed to import from `@jest/globals` or use `import.meta.jest`. Zone.js is not currently aware of this, so we - * manually set this global to get Zone.js to run correctly. - * - * TODO(dgp1130): Update Zone.js to directly support Jest ESM executions so we can drop this. - */ - -// eslint-disable-next-line no-undef -globalThis.jest = import.meta.jest; diff --git a/packages/angular_devkit/build_angular/src/builders/jest/jest.config.mjs b/packages/angular_devkit/build_angular/src/builders/jest/jest.config.mjs deleted file mode 100644 index 44b53d8003fc..000000000000 --- a/packages/angular_devkit/build_angular/src/builders/jest/jest.config.mjs +++ /dev/null @@ -1,11 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -// Empty config file, everything is specified via CLI options right now. -// This file is used just so Jest doesn't accidentally inherit a custom user-specified Jest config. -export default {}; diff --git a/packages/angular_devkit/build_angular/src/builders/jest/options.ts b/packages/angular_devkit/build_angular/src/builders/jest/options.ts deleted file mode 100644 index d0298c13a74a..000000000000 --- a/packages/angular_devkit/build_angular/src/builders/jest/options.ts +++ /dev/null @@ -1,34 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import { Schema as JestBuilderSchema } from './schema'; - -/** - * Options supported for the Jest builder. The schema is an approximate - * representation of the options type, but this is a more precise version. - */ -export type JestBuilderOptions = JestBuilderSchema & { - include: string[]; - exclude: string[]; -}; - -/** - * Normalizes input options validated by the schema to a more precise and useful - * options type in {@link JestBuilderOptions}. - */ -export function normalizeOptions(schema: JestBuilderSchema): JestBuilderOptions { - return { - // Options with default values can't actually be null, even if the types say so. - /* eslint-disable @typescript-eslint/no-non-null-assertion */ - include: schema.include!, - exclude: schema.exclude!, - /* eslint-enable @typescript-eslint/no-non-null-assertion */ - - ...schema, - }; -} diff --git a/packages/angular_devkit/build_angular/src/builders/jest/schema.json b/packages/angular_devkit/build_angular/src/builders/jest/schema.json deleted file mode 100644 index 272a1a906597..000000000000 --- a/packages/angular_devkit/build_angular/src/builders/jest/schema.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema", - "title": "Jest browser schema for Build Facade.", - "description": "Jest target options", - "type": "object", - "properties": { - "include": { - "type": "array", - "items": { - "type": "string" - }, - "default": ["**/*.spec.ts"], - "description": "Globs of files to include, relative to project root." - }, - "exclude": { - "type": "array", - "items": { - "type": "string" - }, - "default": [], - "description": "Globs of files to exclude, relative to the project root." - }, - "tsConfig": { - "type": "string", - "description": "The name of the TypeScript configuration file." - }, - "polyfills": { - "type": "array", - "description": "A list of polyfills to include in the build. Can be a full path for a file, relative to the current workspace or module specifier. Example: 'zone.js'.", - "items": { - "type": "string", - "uniqueItems": true - }, - "default": [] - }, - "aot": { - "type": "boolean", - "description": "Run tests using Ahead of Time compilation.", - "default": false - } - }, - "additionalProperties": false, - "required": ["tsConfig"] -} diff --git a/packages/angular_devkit/build_angular/src/builders/jest/tests/options.ts b/packages/angular_devkit/build_angular/src/builders/jest/tests/options.ts deleted file mode 100644 index 33e21fbdd7d6..000000000000 --- a/packages/angular_devkit/build_angular/src/builders/jest/tests/options.ts +++ /dev/null @@ -1,16 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import { JestBuilderOptions } from '../options'; - -/** Default options to use for most tests. */ -export const BASE_OPTIONS = Object.freeze<JestBuilderOptions>({ - include: ['**/*.spec.ts'], - exclude: [], - tsConfig: 'tsconfig.spec.json', -}); diff --git a/packages/angular_devkit/build_angular/src/builders/karma/browser_builder.ts b/packages/angular_devkit/build_angular/src/builders/karma/browser_builder.ts index e9997b67ea0d..82217779dce7 100644 --- a/packages/angular_devkit/build_angular/src/builders/karma/browser_builder.ts +++ b/packages/angular_devkit/build_angular/src/builders/karma/browser_builder.ts @@ -77,10 +77,8 @@ export function execute( }), ); - const KARMA_APPLICATION_PATH = '_karma_webpack_'; webpackConfig.output ??= {}; - webpackConfig.output.path = `/${KARMA_APPLICATION_PATH}/`; - webpackConfig.output.publicPath = `/${KARMA_APPLICATION_PATH}/`; + webpackConfig.output.path = '/'; if (karmaOptions.singleRun) { webpackConfig.plugins.unshift({ diff --git a/packages/angular_devkit/build_angular/src/builders/karma/index.ts b/packages/angular_devkit/build_angular/src/builders/karma/index.ts index ff54a8292ff2..1ea20e0f5db4 100644 --- a/packages/angular_devkit/build_angular/src/builders/karma/index.ts +++ b/packages/angular_devkit/build_angular/src/builders/karma/index.ts @@ -198,6 +198,7 @@ async function checkForEsbuild( // If we can't find a development builder, we can't use 'detect'. throw new Error( 'Failed to detect the builder used by the application. Please set builderMode explicitly.', + { cause: e }, ); } } diff --git a/packages/angular_devkit/build_angular/src/builders/karma/tests/behavior/fake-async_spec.ts b/packages/angular_devkit/build_angular/src/builders/karma/tests/behavior/fake-async_spec.ts index 16da8daf2f55..12f43e47cce5 100644 --- a/packages/angular_devkit/build_angular/src/builders/karma/tests/behavior/fake-async_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/karma/tests/behavior/fake-async_spec.ts @@ -18,12 +18,13 @@ describeKarmaBuilder(execute, KARMA_BUILDER_INFO, (harness, setupTarget) => { it('loads zone.js/testing at the right time', async () => { await harness.writeFiles({ './src/app/app.component.ts': ` - import { Component } from '@angular/core'; + import { ChangeDetectionStrategy, Component } from '@angular/core'; @Component({ selector: 'app-root', standalone: false, template: '<button (click)="changeMessage()" class="change">{{ message }}</button>', + changeDetection: ChangeDetectionStrategy.Eager }) export class AppComponent { message = 'Initial'; diff --git a/packages/angular_devkit/build_angular/src/builders/karma/tests/options/code-coverage_spec.ts b/packages/angular_devkit/build_angular/src/builders/karma/tests/options/code-coverage_spec.ts index a8849ba643ef..21dbfdfc073d 100644 --- a/packages/angular_devkit/build_angular/src/builders/karma/tests/options/code-coverage_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/karma/tests/options/code-coverage_spec.ts @@ -88,19 +88,15 @@ describeKarmaBuilder(execute, KARMA_BUILDER_INFO, (harness, setupTarget) => { } `, }); - await harness.modifyFile('tsconfig.json', (content) => - content.replace( - /"baseUrl": ".\/",/, - ` - "baseUrl": "./", - "paths": { - "my-lib": [ - "./dist/my-lib" - ] - }, - `, - ), - ); + await harness.modifyFile('tsconfig.json', (content) => { + const tsconfig = JSON.parse(content); + tsconfig.compilerOptions ??= {}; + tsconfig.compilerOptions.paths = { + 'my-lib': ['./dist/my-lib'], + }; + + return JSON.stringify(tsconfig, null, 2); + }); harness.useTarget('test', { ...BASE_OPTIONS, diff --git a/packages/angular_devkit/build_angular/src/builders/karma/tests/setup.ts b/packages/angular_devkit/build_angular/src/builders/karma/tests/setup.ts index d78f691bef91..8850e470e67c 100644 --- a/packages/angular_devkit/build_angular/src/builders/karma/tests/setup.ts +++ b/packages/angular_devkit/build_angular/src/builders/karma/tests/setup.ts @@ -140,6 +140,8 @@ export async function setupApplicationTarget<T>( await harness.appendToFile('src/polyfills.ts', `import '@angular/localize/init';`); } +let counter = 0; + /** Runs the test against both an application- and a browser-builder context. */ export function describeKarmaBuilder<T>( builderHandler: BuilderHandlerFn<T & json.JsonObject>, @@ -161,7 +163,8 @@ export function describeKarmaBuilder<T>( optionSchema, }); - describe(options.name || builderHandler.name, () => { + // The counter is needed to avoid duplicate describe names as they are not allowed. + describe((options.name || builderHandler.name) + ` (${counter++})`, () => { for (const isApplicationTarget of [true, false]) { describe(isApplicationTarget ? 'with application builder' : 'with browser builder', () => { beforeEach(() => host.initialize().toPromise()); diff --git a/packages/angular_devkit/build_angular/src/builders/ng-packagr/index.ts b/packages/angular_devkit/build_angular/src/builders/ng-packagr/index.ts index 2062e4cad595..42533a33aa0d 100644 --- a/packages/angular_devkit/build_angular/src/builders/ng-packagr/index.ts +++ b/packages/angular_devkit/build_angular/src/builders/ng-packagr/index.ts @@ -9,6 +9,7 @@ import { purgeStaleBuildCache } from '@angular/build/private'; import { BuilderContext, BuilderOutput, createBuilder } from '@angular-devkit/architect'; import type { NgPackagrOptions } from 'ng-packagr'; +import { createRequire } from 'node:module'; import { join, resolve } from 'node:path'; import { Observable, catchError, from, map, of, switchMap } from 'rxjs'; import { normalizeCacheOptions } from '../../utils/normalize-cache'; @@ -27,7 +28,9 @@ export function execute( await purgeStaleBuildCache(context); const root = context.workspaceRoot; - const packager = (await import('ng-packagr')).ngPackagr(); + const workspaceRequire = createRequire(root + '/'); + const ngPackagePath = workspaceRequire.resolve('ng-packagr'); + const packager = (await import(ngPackagePath)).ngPackagr(); packager.forProject(resolve(root, options.project)); diff --git a/packages/angular_devkit/build_angular/src/builders/ng-packagr/works_spec.ts b/packages/angular_devkit/build_angular/src/builders/ng-packagr/works_spec.ts index 4bf1ac2dec91..90581f9d9437 100644 --- a/packages/angular_devkit/build_angular/src/builders/ng-packagr/works_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/ng-packagr/works_spec.ts @@ -20,7 +20,10 @@ import { import { debounceTime, map, take, tap } from 'rxjs'; describe('NgPackagr Builder', () => { - const workspaceRoot = join(normalize(__dirname), `../../../test/hello-world-lib/`); + const workspaceRoot = join( + normalize(__dirname), + `../../../../../../modules/testing/builder/projects/hello-world-lib/`, + ); const host = new TestProjectHost(workspaceRoot); let architect: Architect; diff --git a/packages/angular_devkit/build_angular/src/builders/protractor-error/index.ts b/packages/angular_devkit/build_angular/src/builders/protractor-error/index.ts deleted file mode 100644 index 31c9fe183731..000000000000 --- a/packages/angular_devkit/build_angular/src/builders/protractor-error/index.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import { BuilderContext, createBuilder } from '@angular-devkit/architect'; -import { Schema as ProtractorBuilderOptions } from '../protractor/schema'; - -export default createBuilder<ProtractorBuilderOptions>( - (_options: ProtractorBuilderOptions, context: BuilderContext) => { - context.logger.error( - 'Protractor has reached end-of-life and is no longer supported. For additional information and alternatives, please see https://blog.angular.dev/protractor-deprecation-update-august-2023-2beac7402ce0.', - ); - - return { success: false }; - }, -); diff --git a/packages/angular_devkit/build_angular/src/builders/protractor/index.ts b/packages/angular_devkit/build_angular/src/builders/protractor/index.ts deleted file mode 100644 index df0a60759835..000000000000 --- a/packages/angular_devkit/build_angular/src/builders/protractor/index.ts +++ /dev/null @@ -1,175 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import { - BuilderContext, - BuilderOutput, - createBuilder, - targetFromTargetString, -} from '@angular-devkit/architect'; -import { tags } from '@angular-devkit/core'; -import { resolve } from 'node:path'; -import * as url from 'node:url'; -import { runModuleAsObservableFork } from '../../utils'; -import { assertIsError } from '../../utils/error'; -import { DevServerBuilderOptions } from '../dev-server/index'; -import { Schema as ProtractorBuilderOptions } from './schema'; - -interface JasmineNodeOpts { - jasmineNodeOpts: { - grep?: string; - invertGrep?: boolean; - }; -} - -function runProtractor(root: string, options: ProtractorBuilderOptions): Promise<BuilderOutput> { - const additionalProtractorConfig: Partial<ProtractorBuilderOptions> & Partial<JasmineNodeOpts> = { - baseUrl: options.baseUrl, - specs: options.specs && options.specs.length ? options.specs : undefined, - suite: options.suite, - jasmineNodeOpts: { - grep: options.grep, - invertGrep: options.invertGrep, - }, - }; - - // TODO: Protractor manages process.exit itself, so this target will allways quit the - // process. To work around this we run it in a subprocess. - // https://github.com/angular/protractor/issues/4160 - return runModuleAsObservableFork(root, 'protractor/built/launcher', 'init', [ - resolve(root, options.protractorConfig), - additionalProtractorConfig, - ]).toPromise() as Promise<BuilderOutput>; -} - -async function updateWebdriver() { - // The webdriver-manager update command can only be accessed via a deep import. - const webdriverDeepImport = 'webdriver-manager/built/lib/cmds/update'; - - let path; - try { - const protractorPath = require.resolve('protractor'); - - path = require.resolve(webdriverDeepImport, { paths: [protractorPath] }); - } catch (error) { - assertIsError(error); - if (error.code !== 'MODULE_NOT_FOUND') { - throw error; - } - } - - if (!path) { - throw new Error(tags.stripIndents` - Cannot automatically find webdriver-manager to update. - Update webdriver-manager manually and run 'ng e2e --no-webdriver-update' instead. - `); - } - - const webdriverUpdate = await import(path); - // const webdriverUpdate = await import(path) as typeof import ('webdriver-manager/built/lib/cmds/update'); - - // run `webdriver-manager update --standalone false --gecko false --quiet` - // if you change this, update the command comment in prev line - return webdriverUpdate.program.run({ - standalone: false, - gecko: false, - quiet: true, - } as unknown as JSON); -} - -export type { ProtractorBuilderOptions }; - -/** - * @experimental Direct usage of this function is considered experimental. - */ -export async function execute( - options: ProtractorBuilderOptions, - context: BuilderContext, -): Promise<BuilderOutput> { - context.logger.warn( - 'Protractor has reached end-of-life and is no longer supported by the Angular team. The `protractor` builder will be removed in a future Angular major version. For additional information and alternatives, please see https://blog.angular.dev/protractor-deprecation-update-august-2023-2beac7402ce0.', - ); - - // ensure that only one of these options is used - if (options.devServerTarget && options.baseUrl) { - throw new Error(tags.stripIndents` - The 'baseUrl' option cannot be used with 'devServerTarget'. - When present, 'devServerTarget' will be used to automatically setup 'baseUrl' for Protractor. - `); - } - - if (options.webdriverUpdate) { - await updateWebdriver(); - } - - let baseUrl = options.baseUrl; - let server; - - try { - if (options.devServerTarget) { - const target = targetFromTargetString(options.devServerTarget); - const serverOptions = await context.getTargetOptions(target); - - const overrides = { - watch: false, - liveReload: false, - } as DevServerBuilderOptions; - - if (options.host !== undefined) { - overrides.host = options.host; - } else if (typeof serverOptions.host === 'string') { - options.host = serverOptions.host; - } else { - options.host = overrides.host = 'localhost'; - } - - if (options.port !== undefined) { - overrides.port = options.port; - } else if (typeof serverOptions.port === 'number') { - options.port = serverOptions.port; - } - - server = await context.scheduleTarget(target, overrides); - const result = await server.result; - if (!result.success) { - return { success: false }; - } - - if (typeof serverOptions.publicHost === 'string') { - let publicHost = serverOptions.publicHost; - if (!/^\w+:\/\//.test(publicHost)) { - publicHost = `${serverOptions.ssl ? 'https' : 'http'}://${publicHost}`; - } - const clientUrl = url.parse(publicHost); - baseUrl = url.format(clientUrl); - } else if (typeof result.baseUrl === 'string') { - baseUrl = result.baseUrl; - } else if (typeof result.port === 'number') { - baseUrl = url.format({ - protocol: serverOptions.ssl ? 'https' : 'http', - hostname: options.host, - port: result.port.toString(), - }); - } - } - - // Like the baseUrl in protractor config file when using the API we need to add - // a trailing slash when provide to the baseUrl. - if (baseUrl && !baseUrl.endsWith('/')) { - baseUrl += '/'; - } - - return await runProtractor(context.workspaceRoot, { ...options, baseUrl }); - } catch { - return { success: false }; - } finally { - await server?.stop(); - } -} - -export default createBuilder<ProtractorBuilderOptions>(execute); diff --git a/packages/angular_devkit/build_angular/src/builders/protractor/schema.json b/packages/angular_devkit/build_angular/src/builders/protractor/schema.json deleted file mode 100644 index 286a315a96a9..000000000000 --- a/packages/angular_devkit/build_angular/src/builders/protractor/schema.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema", - "title": "Protractor Target", - "description": "Protractor target options for Build Facade.", - "type": "object", - "properties": { - "protractorConfig": { - "type": "string", - "description": "The name of the Protractor configuration file." - }, - "devServerTarget": { - "type": "string", - "description": "A dev-server builder target to run tests against in the format of `project:target[:configuration]`. You can also pass in more than one configuration name as a comma-separated list. Example: `project:target:production,staging`.", - "pattern": "^([^:\\s]+:[^:\\s]+(:[^\\s]+)?)?$" - }, - "grep": { - "type": "string", - "description": "Execute specs whose names match the pattern, which is internally compiled to a RegExp." - }, - "invertGrep": { - "type": "boolean", - "description": "Invert the selection specified by the 'grep' option.", - "default": false - }, - "specs": { - "type": "array", - "description": "Override specs in the protractor config.", - "default": [], - "items": { - "type": "string", - "description": "Spec name." - } - }, - "suite": { - "type": "string", - "description": "Override suite in the protractor config." - }, - "webdriverUpdate": { - "type": "boolean", - "description": "Try to update webdriver.", - "default": true - }, - "port": { - "type": "number", - "description": "The port to use to serve the application." - }, - "host": { - "type": "string", - "description": "Host to listen on." - }, - "baseUrl": { - "type": "string", - "description": "Base URL for protractor to connect to." - } - }, - "additionalProperties": false, - "required": ["protractorConfig"] -} diff --git a/packages/angular_devkit/build_angular/src/builders/protractor/works_spec.ts b/packages/angular_devkit/build_angular/src/builders/protractor/works_spec.ts deleted file mode 100644 index d42d677055b3..000000000000 --- a/packages/angular_devkit/build_angular/src/builders/protractor/works_spec.ts +++ /dev/null @@ -1,136 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import { Architect } from '@angular-devkit/architect'; -import { JsonObject, normalize } from '@angular-devkit/core'; -import { createArchitect, host, protractorTargetSpec } from '../../testing/test-utils'; - -describe('Protractor Builder', () => { - let architect: Architect; - - beforeEach(async () => { - await host.initialize().toPromise(); - architect = (await createArchitect(host.root())).architect; - }); - - afterEach(() => host.restore().toPromise()); - - it('executes tests with automatic dev server usage', async () => { - const run = await architect.scheduleTarget(protractorTargetSpec); - - await expectAsync(run.result).toBeResolvedTo(jasmine.objectContaining({ success: true })); - - await run.stop(); - }); - - it('fails with no devServerTarget and no standalone server', async () => { - const overrides = { devServerTarget: undefined } as unknown as JsonObject; - const run = await architect.scheduleTarget(protractorTargetSpec, overrides); - - await expectAsync(run.result).toBeResolvedTo(jasmine.objectContaining({ success: false })); - - await run.stop(); - }); - - it('overrides protractor specs', async () => { - host - .scopedSync() - .rename(normalize('./e2e/app.e2e-spec.ts'), normalize('./e2e/renamed-app.e2e.spec.ts')); - - const overrides = { specs: ['./e2e/renamed-app.e2e.spec.ts'] }; - const run = await architect.scheduleTarget(protractorTargetSpec, overrides); - - await expectAsync(run.result).toBeResolvedTo(jasmine.objectContaining({ success: true })); - - await run.stop(); - }); - - it('overrides protractor suites', async () => { - host - .scopedSync() - .rename(normalize('./e2e/app.e2e-spec.ts'), normalize('./e2e/renamed-app.e2e-spec.ts')); - - // Suites block needs to be added in the protractor.conf.js file to test suites - host.replaceInFile( - 'protractor.conf.js', - `allScriptsTimeout: 11000,`, - ` - allScriptsTimeout: 11000, - suites: { - app: './e2e/app.e2e-spec.ts' - }, - `, - ); - - const overrides = { suite: 'app' }; - const run = await architect.scheduleTarget(protractorTargetSpec, overrides); - - await expectAsync(run.result).toBeResolvedTo(jasmine.objectContaining({ success: true })); - - await run.stop(); - }); - - it('supports automatic port assignment (port = 0)', async () => { - const overrides = { port: 0 }; - const run = await architect.scheduleTarget(protractorTargetSpec, overrides); - - await expectAsync(run.result).toBeResolvedTo(jasmine.objectContaining({ success: true })); - - await run.stop(); - }); - - it('supports dev server builder with browser builder base HREF option', async () => { - host.replaceInFile( - 'angular.json', - '"main": "src/main.ts",', - '"main": "src/main.ts", "baseHref": "/base/",', - ); - // Need to reset architect to use the modified config - architect = (await createArchitect(host.root())).architect; - - const run = await architect.scheduleTarget(protractorTargetSpec); - - await expectAsync(run.result).toBeResolvedTo(jasmine.objectContaining({ success: true })); - - await run.stop(); - }); - - it('supports running tests by pattern', async () => { - host.writeMultipleFiles({ - 'e2e/app.e2e-spec.ts': ` - it('should succeed', () => expect(true).toBeTruthy()); - it('should fail', () => expect(false).toBeTruthy()); - `, - }); - - const overrides = { grep: 'succeed' }; - - const run = await architect.scheduleTarget(protractorTargetSpec, overrides); - - await expectAsync(run.result).toBeResolvedTo(jasmine.objectContaining({ success: true })); - - await run.stop(); - }); - - it('supports running tests excluding a pattern', async () => { - host.writeMultipleFiles({ - 'e2e/app.e2e-spec.ts': ` - it('should succeed', () => expect(true).toBeTruthy()); - it('should fail', () => expect(false).toBeTruthy()); - `, - }); - - const overrides = { grep: 'fail', invertGrep: true }; - - const run = await architect.scheduleTarget(protractorTargetSpec, overrides); - - await expectAsync(run.result).toBeResolvedTo(jasmine.objectContaining({ success: true })); - - await run.stop(); - }); -}); diff --git a/packages/angular_devkit/build_angular/src/builders/server/index.ts b/packages/angular_devkit/build_angular/src/builders/server/index.ts index 4903fe8e2403..ffe7174f0c44 100644 --- a/packages/angular_devkit/build_angular/src/builders/server/index.ts +++ b/packages/angular_devkit/build_angular/src/builders/server/index.ts @@ -158,7 +158,8 @@ export function execute( }), concatMap(async (output) => { if (!output.success) { - return output as ServerBuilderOutput; + // The `as unknown` is here primarily for the linter. + return output as unknown as ServerBuilderOutput; } return { diff --git a/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/index.ts b/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/index.ts index 8ec879993e4f..e919f188e0bf 100644 --- a/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/index.ts +++ b/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/index.ts @@ -115,7 +115,13 @@ export function execute( return of([b, s]); } - return startNodeServer(s, nodeServerPort, context.logger, !!options.inspect).pipe( + return startNodeServer( + s, + nodeServerPort, + options.host, + context.logger, + !!options.inspect, + ).pipe( map(() => [b, s]), catchError((err) => { context.logger.error(`A server error has occurred.\n${mapErrorToMessage(err)}`); @@ -217,12 +223,13 @@ export function log( function startNodeServer( serverOutput: BuilderOutput, port: number, + host: string | undefined, logger: logging.LoggerApi, inspectMode = false, ): Observable<void> { const outputPath = serverOutput.outputPath as string; const path = join(outputPath, 'main.js'); - const env = { ...process.env, PORT: '' + port }; + const env = { ...process.env, PORT: '' + port, NG_ALLOWED_HOSTS: host ?? 'localhost' }; const args = ['--enable-source-maps', `"${path}"`]; if (inspectMode) { diff --git a/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/specs/proxy_spec.ts b/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/specs/proxy_spec.ts index cbde961e59e4..5539501222a6 100644 --- a/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/specs/proxy_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/specs/proxy_spec.ts @@ -11,9 +11,8 @@ import { Architect } from '@angular-devkit/architect'; import * as browserSync from 'browser-sync'; import * as http from 'node:http'; import { createArchitect, host } from '../../../testing/test-utils'; -import { SSRDevServerBuilderOutput } from '../index'; -describe('Serve SSR Builder', () => { +describe('Serve SSR Builder - Proxy', () => { const target = { project: 'app', target: 'serve-ssr' }; const originalTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL; let architect: Architect; @@ -33,7 +32,7 @@ describe('Serve SSR Builder', () => { host.writeMultipleFiles({ 'src/main.server.ts': ` import { CommonEngine } from '@angular/ssr/node'; - import * as express from 'express'; + import express from 'express'; import { resolve, join } from 'node:path'; import { AppServerModule } from './app/app.module.server'; @@ -52,11 +51,12 @@ describe('Serve SSR Builder', () => { })); server.use((req, res, next) => { + const { protocol, originalUrl, baseUrl, headers } = req; commonEngine .render({ bootstrap: AppServerModule, documentFilePath: indexHtml, - url: req.originalUrl, + url: \`\${protocol}://\${headers.host}\${originalUrl}\`, publicPath: distFolder, }) .then((html) => res.send(html)) @@ -102,7 +102,7 @@ describe('Serve SSR Builder', () => { proxyConfig: 'proxy.config.json', }); - const output = (await run.result) as SSRDevServerBuilderOutput; + const output = await run.result; expect(output.success).toBe(true); expect(output.baseUrl).toBe(`http://localhost:${output.port}`); diff --git a/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/specs/ssl_spec.ts b/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/specs/ssl_spec.ts index 7651b2387c16..0e81c282791a 100644 --- a/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/specs/ssl_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/specs/ssl_spec.ts @@ -11,9 +11,8 @@ import { Architect } from '@angular-devkit/architect'; import * as browserSync from 'browser-sync'; import { Agent } from 'undici'; import { createArchitect, host } from '../../../testing/test-utils'; -import { SSRDevServerBuilderOutput } from '../index'; -describe('Serve SSR Builder', () => { +describe('Serve SSR Builder - SSL', () => { const target = { project: 'app', target: 'serve-ssr' }; const originalTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL; let architect: Architect; @@ -33,7 +32,7 @@ describe('Serve SSR Builder', () => { host.writeMultipleFiles({ 'src/main.server.ts': ` import { CommonEngine } from '@angular/ssr/node'; - import * as express from 'express'; + import express from 'express'; import { resolve, join } from 'node:path'; import { AppServerModule } from './app/app.module.server'; @@ -52,11 +51,12 @@ describe('Serve SSR Builder', () => { })); server.use((req, res, next) => { + const { protocol, originalUrl, baseUrl, headers } = req; commonEngine .render({ bootstrap: AppServerModule, documentFilePath: indexHtml, - url: req.originalUrl, + url: \`\${protocol}://\${headers.host}\${originalUrl}\`, publicPath: distFolder, }) .then((html) => res.send(html)) @@ -80,7 +80,7 @@ describe('Serve SSR Builder', () => { it('works with SSL', async () => { const run = await architect.scheduleTarget(target, { ssl: true, port: 0 }); - const output = (await run.result) as SSRDevServerBuilderOutput; + const output = await run.result; expect(output.success).toBe(true); expect(output.baseUrl).toBe(`https://localhost:${output.port}`); diff --git a/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/specs/works_spec.ts b/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/specs/works_spec.ts index 64c56024f089..92324fa34526 100644 --- a/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/specs/works_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/specs/works_spec.ts @@ -10,9 +10,8 @@ import { Architect } from '@angular-devkit/architect'; // eslint-disable-next-line import/no-extraneous-dependencies import * as browserSync from 'browser-sync'; import { createArchitect, host } from '../../../testing/test-utils'; -import { SSRDevServerBuilderOutput } from '../index'; -describe('Serve SSR Builder', () => { +describe('Serve SSR Builder - Works', () => { const target = { project: 'app', target: 'serve-ssr' }; const originalTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL; let architect: Architect; @@ -32,7 +31,7 @@ describe('Serve SSR Builder', () => { host.writeMultipleFiles({ 'src/main.server.ts': ` import { CommonEngine } from '@angular/ssr/node'; - import * as express from 'express'; + import express from 'express'; import { resolve, join } from 'node:path'; import { AppServerModule } from './app/app.module.server'; @@ -51,11 +50,12 @@ describe('Serve SSR Builder', () => { })); server.use((req, res, next) => { + const { protocol, originalUrl, baseUrl, headers } = req; commonEngine .render({ bootstrap: AppServerModule, documentFilePath: indexHtml, - url: req.originalUrl, + url: \`\${protocol}://\${headers.host}\${originalUrl}\`, publicPath: distFolder, }) .then((html) => res.send(html)) @@ -89,7 +89,7 @@ describe('Serve SSR Builder', () => { it('works with port 0', async () => { const run = await architect.scheduleTarget(target, { port: 0 }); - const output = (await run.result) as SSRDevServerBuilderOutput; + const output = await run.result; await run.stop(); expect(output.success).toBe(true); diff --git a/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/utils.ts b/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/utils.ts index db59e2cb6d31..059c0e0a89e9 100644 --- a/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/utils.ts +++ b/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/utils.ts @@ -9,7 +9,6 @@ import { SpawnOptions, spawn } from 'node:child_process'; import { AddressInfo, createConnection, createServer } from 'node:net'; import { Observable, mergeMap, retryWhen, throwError, timer } from 'rxjs'; -import treeKill from 'tree-kill'; export function getAvailablePort(): Promise<number> { return new Promise((resolve, reject) => { @@ -50,8 +49,8 @@ export function spawnAsObservable( }); return () => { - if (!proc.killed && proc.pid) { - treeKill(proc.pid, 'SIGTERM'); + if (!proc.killed) { + proc.kill(); } }; }); diff --git a/packages/angular_devkit/build_angular/src/builders/web-test-runner/builder-status-warnings.ts b/packages/angular_devkit/build_angular/src/builders/web-test-runner/builder-status-warnings.ts deleted file mode 100644 index 9ece57556005..000000000000 --- a/packages/angular_devkit/build_angular/src/builders/web-test-runner/builder-status-warnings.ts +++ /dev/null @@ -1,49 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import { BuilderContext } from '@angular-devkit/architect'; -import { Schema as WtrBuilderOptions } from './schema'; - -const UNSUPPORTED_OPTIONS: Array<keyof WtrBuilderOptions> = [ - 'main', - 'assets', - 'scripts', - 'styles', - 'inlineStyleLanguage', - 'stylePreprocessorOptions', - 'sourceMap', - 'progress', - 'poll', - 'preserveSymlinks', - 'browsers', - 'codeCoverage', - 'codeCoverageExclude', - 'fileReplacements', - 'webWorkerTsConfig', - 'watch', -]; - -/** Logs a warning for any unsupported options specified. */ -export function logBuilderStatusWarnings(options: WtrBuilderOptions, ctx: BuilderContext) { - // Validate supported options - for (const unsupportedOption of UNSUPPORTED_OPTIONS) { - const value = (options as unknown as WtrBuilderOptions)[unsupportedOption]; - - if (value === undefined || value === false) { - continue; - } - if (Array.isArray(value) && value.length === 0) { - continue; - } - if (typeof value === 'object' && Object.keys(value).length === 0) { - continue; - } - - ctx.logger.warn(`The '${unsupportedOption}' option is not yet supported by this builder.`); - } -} diff --git a/packages/angular_devkit/build_angular/src/builders/web-test-runner/index.ts b/packages/angular_devkit/build_angular/src/builders/web-test-runner/index.ts deleted file mode 100644 index d900375221ff..000000000000 --- a/packages/angular_devkit/build_angular/src/builders/web-test-runner/index.ts +++ /dev/null @@ -1,206 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import { Result, ResultKind, buildApplicationInternal } from '@angular/build/private'; -import { BuilderContext, BuilderOutput, createBuilder } from '@angular-devkit/architect'; -import type * as WebTestRunner from '@web/test-runner'; -import { randomUUID } from 'node:crypto'; -import fs from 'node:fs/promises'; -import { createRequire } from 'node:module'; -import path from 'node:path'; -import { findTestFiles } from '../../utils/test-files'; -import { OutputHashing } from '../browser-esbuild/schema'; -import { logBuilderStatusWarnings } from './builder-status-warnings'; -import { WtrBuilderOptions, normalizeOptions } from './options'; -import { Schema } from './schema'; -import { writeTestFiles } from './write-test-files'; - -export default createBuilder( - async (schema: Schema, ctx: BuilderContext): Promise<BuilderOutput> => { - ctx.logger.warn( - 'NOTE: The Web Test Runner builder is currently EXPERIMENTAL and will be removed in version 22.', - ); - - logBuilderStatusWarnings(schema, ctx); - - // Dynamic import `@web/test-runner` from the user's workspace. As an optional peer dep, it may not be installed - // and may not be resolvable from `@angular-devkit/build-angular`. - const require = createRequire(`${ctx.workspaceRoot}/`); - let wtr: typeof WebTestRunner; - try { - wtr = require('@web/test-runner'); - } catch { - return { - success: false, - // TODO(dgp1130): Display a more accurate message for non-NPM users. - error: - 'Web Test Runner is not installed, most likely you need to run `npm install @web/test-runner --save-dev` in your project.', - }; - } - - const options = normalizeOptions(schema); - - const testDir = path.join(ctx.workspaceRoot, 'dist/test-out', randomUUID()); - - // Parallelize startup work. - const [testFiles] = await Promise.all([ - // Glob for files to test. - findTestFiles(options.include, options.exclude, ctx.workspaceRoot), - // Clean build output path. - fs.rm(testDir, { recursive: true, force: true }), - ]); - - // Build the tests and abort on any build failure. - const buildOutput = await buildTests(testFiles, testDir, options, ctx); - if (buildOutput.kind === ResultKind.Failure) { - return { success: false }; - } else if (buildOutput.kind !== ResultKind.Full) { - return { - success: false, - error: 'A full build result is required from the application builder.', - }; - } - - // Write test files - await writeTestFiles(buildOutput.files, testDir); - - // Run the built tests. - return await runTests(wtr, testDir, options); - }, -); - -/** Build all the given test files and write the result to the given output path. */ -async function buildTests( - testFiles: ReadonlySet<string>, - outputPath: string, - options: WtrBuilderOptions, - ctx: BuilderContext, -): Promise<Result> { - const entryPoints = new Set([ - ...testFiles, - 'jasmine-core/lib/jasmine-core/jasmine.js', - '@angular-devkit/build-angular/src/builders/web-test-runner/jasmine_runner.js', - ]); - - // Extract `zone.js/testing` to a separate entry point because it needs to be loaded after Jasmine. - const [polyfills, hasZoneTesting] = extractZoneTesting(options.polyfills); - if (hasZoneTesting) { - entryPoints.add('zone.js/testing'); - } - - // Build tests with `application` builder, using test files as entry points. - // Also bundle in Jasmine and the Jasmine runner script, which need to share chunked dependencies. - const buildOutput = await first( - buildApplicationInternal( - { - entryPoints, - tsConfig: options.tsConfig, - outputPath, - aot: options.aot, - index: false, - outputHashing: OutputHashing.None, - optimization: false, - externalDependencies: [ - // Resolved by `@web/test-runner` at runtime with dynamically generated code. - '@web/test-runner-core', - ], - sourceMap: { - scripts: true, - styles: true, - vendor: true, - }, - polyfills, - }, - ctx, - ), - ); - - return buildOutput; -} - -function extractZoneTesting( - polyfills: readonly string[], -): [polyfills: string[], hasZoneTesting: boolean] { - const polyfillsWithoutZoneTesting = polyfills.filter( - (polyfill) => polyfill !== 'zone.js/testing', - ); - const hasZoneTesting = polyfills.length !== polyfillsWithoutZoneTesting.length; - - return [polyfillsWithoutZoneTesting, hasZoneTesting]; -} - -/** Run Web Test Runner on the given directory of bundled JavaScript tests. */ -async function runTests( - wtr: typeof WebTestRunner, - testDir: string, - options: WtrBuilderOptions, -): Promise<BuilderOutput> { - const testPagePath = path.resolve(__dirname, 'test_page.html'); - const testPage = await fs.readFile(testPagePath, 'utf8'); - - const runner = await wtr.startTestRunner({ - config: { - rootDir: testDir, - files: [ - `${testDir}/**/*.js`, - `!${testDir}/polyfills.js`, - `!${testDir}/chunk-*.js`, - `!${testDir}/jasmine.js`, - `!${testDir}/jasmine_runner.js`, - `!${testDir}/testing.js`, // `zone.js/testing` - ], - testFramework: { - config: { - defaultTimeoutInterval: 5_000, - }, - }, - nodeResolve: true, - port: 9876, - watch: options.watch ?? false, - - testRunnerHtml: (_testFramework, _config) => testPage, - }, - readCliArgs: false, - readFileConfig: false, - autoExitProcess: false, - }); - if (!runner) { - throw new Error('Failed to start Web Test Runner.'); - } - - // Wait for the tests to complete and stop the runner. - const passed = (await once(runner, 'finished')) as boolean; - await runner.stop(); - - // No need to return error messages because Web Test Runner already printed them to the console. - return { success: passed }; -} - -/** Returns the first item yielded by the given generator and cancels the execution. */ -async function first<T>(generator: AsyncIterable<T>): Promise<T> { - for await (const value of generator) { - return value; - } - - throw new Error('Expected generator to emit at least once.'); -} - -/** Listens for a single emission of an event and returns the value emitted. */ -// eslint-disable-next-line @typescript-eslint/no-explicit-any -function once<Map extends Record<string, any>, EventKey extends string & keyof Map>( - emitter: WebTestRunner.EventEmitter<Map>, - event: EventKey, -): Promise<Map[EventKey]> { - return new Promise((resolve) => { - const onEmit = (arg: Map[EventKey]): void => { - emitter.off(event, onEmit); - resolve(arg); - }; - emitter.on(event, onEmit); - }); -} diff --git a/packages/angular_devkit/build_angular/src/builders/web-test-runner/jasmine_runner.js b/packages/angular_devkit/build_angular/src/builders/web-test-runner/jasmine_runner.js deleted file mode 100644 index 0775ec09b227..000000000000 --- a/packages/angular_devkit/build_angular/src/builders/web-test-runner/jasmine_runner.js +++ /dev/null @@ -1,91 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import { NgModule } from '@angular/core'; -import { getTestBed } from '@angular/core/testing'; -import { BrowserTestingModule, platformBrowserTesting } from '@angular/platform-browser/testing'; -import { - getConfig, - sessionFailed, - sessionFinished, - sessionStarted, -} from '@web/test-runner-core/browser/session.js'; - -/** Executes Angular Jasmine tests in the given environment and reports the results to Web Test Runner. */ -export async function runJasmineTests(jasmineEnv) { - const allSpecs = []; - const failedSpecs = []; - - jasmineEnv.addReporter({ - specDone(result) { - const expectations = [...result.passedExpectations, ...result.failedExpectations]; - allSpecs.push(...expectations.map((e) => ({ name: e.fullName, passed: e.passed }))); - - for (const e of result.failedExpectations) { - const message = `${result.fullName}\n${e.message}\n${e.stack}`; - // eslint-disable-next-line no-console - console.error(message); - failedSpecs.push({ - message, - name: e.fullName, - stack: e.stack, - expected: e.expected, - actual: e.actual, - }); - } - }, - - async jasmineDone(result) { - // eslint-disable-next-line no-console - console.log(`Tests ${result.overallStatus}!`); - await sessionFinished({ - passed: result.overallStatus === 'passed', - errors: failedSpecs, - testResults: { - name: '', - suites: [], - tests: allSpecs, - }, - }); - }, - }); - - await sessionStarted(); - - // Web Test Runner uses a different HTML page for every test, so we only get one `testFile` for the single `*.js` file we need to execute. - const { testFile, testFrameworkConfig } = await getConfig(); - const config = { defaultTimeoutInterval: 60_000, ...(testFrameworkConfig ?? {}) }; - - // eslint-disable-next-line no-undef - jasmine.DEFAULT_TIMEOUT_INTERVAL = config.defaultTimeoutInterval; - - @NgModule({ - providers: [typeof window.Zone !== 'undefined' ? provideZoneChangeDetection() : []], - }) - class TestModule {} - - // Initialize `TestBed` automatically for users. This assumes we already evaluated `zone.js/testing`. - getTestBed().initTestEnvironment([BrowserTestingModule, TestModule], platformBrowserTesting(), { - errorOnUnknownElements: true, - errorOnUnknownProperties: true, - }); - - // Load the test file and evaluate it. - try { - // eslint-disable-next-line no-undef - await import(new URL(testFile, document.baseURI).href); - - // Execute the test functions. - // eslint-disable-next-line no-undef - jasmineEnv.execute(); - } catch (err) { - // eslint-disable-next-line no-console - console.error(err); - await sessionFailed(err); - } -} diff --git a/packages/angular_devkit/build_angular/src/builders/web-test-runner/options.ts b/packages/angular_devkit/build_angular/src/builders/web-test-runner/options.ts deleted file mode 100644 index 881ade56d5bf..000000000000 --- a/packages/angular_devkit/build_angular/src/builders/web-test-runner/options.ts +++ /dev/null @@ -1,42 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import { Schema as WtrBuilderSchema } from './schema'; - -/** - * Options supported for the Web Test Runner builder. The schema is an approximate - * representation of the options type, but this is a more precise version. - */ -export type WtrBuilderOptions = Overwrite< - WtrBuilderSchema, - { - include: string[]; - exclude: string[]; - polyfills: string[]; - } ->; - -type Overwrite<Obj extends {}, Overrides extends {}> = Omit<Obj, keyof Overrides> & Overrides; - -/** - * Normalizes input options validated by the schema to a more precise and useful - * options type in {@link WtrBuilderOptions}. - */ -export function normalizeOptions(schema: WtrBuilderSchema): WtrBuilderOptions { - return { - ...schema, - - // Options with default values can't actually be null, even if the types say so. - /* eslint-disable @typescript-eslint/no-non-null-assertion */ - include: schema.include!, - exclude: schema.exclude!, - /* eslint-enable @typescript-eslint/no-non-null-assertion */ - - polyfills: typeof schema.polyfills === 'string' ? [schema.polyfills] : schema.polyfills ?? [], - }; -} diff --git a/packages/angular_devkit/build_angular/src/builders/web-test-runner/options_spec.ts b/packages/angular_devkit/build_angular/src/builders/web-test-runner/options_spec.ts deleted file mode 100644 index d7514fb6d7f4..000000000000 --- a/packages/angular_devkit/build_angular/src/builders/web-test-runner/options_spec.ts +++ /dev/null @@ -1,64 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import { normalizeOptions } from './options'; -import { Schema as WtrBuilderSchema } from './schema'; - -describe('options', () => { - describe('normalizeOptions()', () => { - const GOLDEN_SCHEMA: WtrBuilderSchema = { - include: ['**/included/*.ts'], - exclude: ['**/excluded/*.ts'], - tsConfig: './tsconfig.json', - }; - - it('requires include and exclude properties', () => { - const options = normalizeOptions({ - ...GOLDEN_SCHEMA, - include: ['**/*.ts'], - exclude: ['**/*.d.ts'], - }); - - expect(options).toContain({ - include: ['**/*.ts'], - exclude: ['**/*.d.ts'], - }); - - // @ts-expect-error `undefined` should not be in the `include` type. - options.include = undefined; - - // @ts-expect-error `undefined` should not be in the `exclude` type. - options.exclude = undefined; - }); - - it('normalizes polyfills', () => { - const stringPolyfillOptions = normalizeOptions({ - ...GOLDEN_SCHEMA, - polyfills: './polyfills.ts', - }); - - expect(stringPolyfillOptions.polyfills).toEqual(['./polyfills.ts']); - - const arrayPolyfillOptions = normalizeOptions({ - ...GOLDEN_SCHEMA, - polyfills: ['./first.ts', './second.ts'], - }); - - expect(arrayPolyfillOptions.polyfills).toEqual(['./first.ts', './second.ts']); - }); - - it('passes through other options', () => { - const options = normalizeOptions({ - ...GOLDEN_SCHEMA, - assets: ['./path/to/file.txt'], - }); - - expect(options.assets).toEqual(['./path/to/file.txt']); - }); - }); -}); diff --git a/packages/angular_devkit/build_angular/src/builders/web-test-runner/schema.json b/packages/angular_devkit/build_angular/src/builders/web-test-runner/schema.json deleted file mode 100644 index c922e768849b..000000000000 --- a/packages/angular_devkit/build_angular/src/builders/web-test-runner/schema.json +++ /dev/null @@ -1,297 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema", - "title": "Web Test Runner Target", - "description": "Web Test Runner target options for Build Facade.", - "type": "object", - "properties": { - "main": { - "type": "string", - "description": "The name of the main entry-point file." - }, - "tsConfig": { - "type": "string", - "description": "The name of the TypeScript configuration file." - }, - "polyfills": { - "description": "Polyfills to be included in the build.", - "oneOf": [ - { - "type": "array", - "description": "A list of polyfills to include in the build. Can be a full path for a file, relative to the current workspace or module specifier. Example: 'zone.js'.", - "items": { - "type": "string", - "uniqueItems": true - }, - "default": [] - }, - { - "type": "string", - "description": "The full path for the polyfills file, relative to the current workspace or a module specifier. Example: 'zone.js'." - } - ] - }, - "assets": { - "type": "array", - "description": "List of static application assets.", - "default": [], - "items": { - "$ref": "#/definitions/assetPattern" - } - }, - "scripts": { - "description": "Global scripts to be included in the build.", - "type": "array", - "default": [], - "items": { - "oneOf": [ - { - "type": "object", - "properties": { - "input": { - "type": "string", - "description": "The file to include.", - "pattern": "\\.[cm]?jsx?$" - }, - "bundleName": { - "type": "string", - "pattern": "^[\\w\\-.]*$", - "description": "The bundle name for this extra entry point." - }, - "inject": { - "type": "boolean", - "description": "If the bundle will be referenced in the HTML file.", - "default": true - } - }, - "additionalProperties": false, - "required": ["input"] - }, - { - "type": "string", - "description": "The file to include.", - "pattern": "\\.[cm]?jsx?$" - } - ] - } - }, - "styles": { - "description": "Global styles to be included in the build.", - "type": "array", - "default": [], - "items": { - "oneOf": [ - { - "type": "object", - "properties": { - "input": { - "type": "string", - "description": "The file to include.", - "pattern": "\\.(?:css|scss|sass|less)$" - }, - "bundleName": { - "type": "string", - "pattern": "^[\\w\\-.]*$", - "description": "The bundle name for this extra entry point." - }, - "inject": { - "type": "boolean", - "description": "If the bundle will be referenced in the HTML file.", - "default": true - } - }, - "additionalProperties": false, - "required": ["input"] - }, - { - "type": "string", - "description": "The file to include.", - "pattern": "\\.(?:css|scss|sass|less)$" - } - ] - } - }, - "inlineStyleLanguage": { - "description": "The stylesheet language to use for the application's inline component styles.", - "type": "string", - "default": "css", - "enum": ["css", "less", "sass", "scss"] - }, - "stylePreprocessorOptions": { - "description": "Options to pass to style preprocessors", - "type": "object", - "properties": { - "includePaths": { - "description": "Paths to include. Paths will be resolved to workspace root.", - "type": "array", - "items": { - "type": "string" - }, - "default": [] - } - }, - "additionalProperties": false - }, - "include": { - "type": "array", - "items": { - "type": "string" - }, - "default": ["**/*.spec.ts"], - "description": "Globs of files to include, relative to project root. \nThere are 2 special cases:\n - when a path to directory is provided, all spec files ending \".spec.@(ts|tsx)\" will be included\n - when a path to a file is provided, and a matching spec file exists it will be included instead." - }, - "exclude": { - "type": "array", - "items": { - "type": "string" - }, - "default": [], - "description": "Globs of files to exclude, relative to the project root." - }, - "sourceMap": { - "description": "Output source maps for scripts and styles. For more information, see https://angular.dev/reference/configs/workspace-config#source-map-configuration.", - "default": true, - "oneOf": [ - { - "type": "object", - "properties": { - "scripts": { - "type": "boolean", - "description": "Output source maps for all scripts.", - "default": true - }, - "styles": { - "type": "boolean", - "description": "Output source maps for all styles.", - "default": true - }, - "vendor": { - "type": "boolean", - "description": "Resolve vendor packages source maps.", - "default": false - } - }, - "additionalProperties": false - }, - { - "type": "boolean" - } - ] - }, - "progress": { - "type": "boolean", - "description": "Log progress to the console while building.", - "default": true - }, - "watch": { - "type": "boolean", - "description": "Run build when files change." - }, - "poll": { - "type": "number", - "description": "Enable and define the file watching poll time period in milliseconds." - }, - "preserveSymlinks": { - "type": "boolean", - "description": "Do not use the real path when resolving modules. If unset then will default to `true` if NodeJS option --preserve-symlinks is set." - }, - "browsers": { - "type": "string", - "description": "Override which browsers tests are run against." - }, - "codeCoverage": { - "type": "boolean", - "description": "Output a code coverage report.", - "default": false - }, - "codeCoverageExclude": { - "type": "array", - "description": "Globs to exclude from code coverage.", - "items": { - "type": "string" - }, - "default": [] - }, - "fileReplacements": { - "description": "Replace compilation source files with other compilation source files in the build.", - "type": "array", - "items": { - "oneOf": [ - { - "type": "object", - "properties": { - "src": { - "type": "string" - }, - "replaceWith": { - "type": "string" - } - }, - "additionalProperties": false, - "required": ["src", "replaceWith"] - }, - { - "type": "object", - "properties": { - "replace": { - "type": "string" - }, - "with": { - "type": "string" - } - }, - "additionalProperties": false, - "required": ["replace", "with"] - } - ] - }, - "default": [] - }, - "webWorkerTsConfig": { - "type": "string", - "description": "TypeScript configuration for Web Worker modules." - }, - "aot": { - "type": "boolean", - "description": "Run tests using Ahead of Time compilation.", - "default": false - } - }, - "additionalProperties": false, - "required": ["tsConfig"], - "definitions": { - "assetPattern": { - "oneOf": [ - { - "type": "object", - "properties": { - "glob": { - "type": "string", - "description": "The pattern to match." - }, - "input": { - "type": "string", - "description": "The input directory path in which to apply 'glob'. Defaults to the project root." - }, - "output": { - "type": "string", - "default": "", - "description": "Absolute path within the output." - }, - "ignore": { - "description": "An array of globs to ignore.", - "type": "array", - "items": { - "type": "string" - } - } - }, - "additionalProperties": false, - "required": ["glob", "input"] - }, - { - "type": "string" - } - ] - } - } -} diff --git a/packages/angular_devkit/build_angular/src/builders/web-test-runner/test_page.html b/packages/angular_devkit/build_angular/src/builders/web-test-runner/test_page.html deleted file mode 100644 index 9cff64dccccc..000000000000 --- a/packages/angular_devkit/build_angular/src/builders/web-test-runner/test_page.html +++ /dev/null @@ -1,40 +0,0 @@ -<!DOCTYPE html> -<html> - <head> - <meta charset="utf8"> - <title>Unit tests - - - - - diff --git a/packages/angular_devkit/build_angular/src/builders/web-test-runner/write-test-files.ts b/packages/angular_devkit/build_angular/src/builders/web-test-runner/write-test-files.ts deleted file mode 100644 index 268be97f0fe0..000000000000 --- a/packages/angular_devkit/build_angular/src/builders/web-test-runner/write-test-files.ts +++ /dev/null @@ -1,39 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import { BuildOutputFileType } from '@angular/build'; -import { ResultFile, emitFilesToDisk } from '@angular/build/private'; -import fs from 'node:fs/promises'; -import path from 'node:path'; - -export async function writeTestFiles(files: Record, testDir: string) { - const directoryExists = new Set(); - // Writes the test related output files to disk and ensures the containing directories are present - await emitFilesToDisk(Object.entries(files), async ([filePath, file]) => { - if (file.type !== BuildOutputFileType.Browser && file.type !== BuildOutputFileType.Media) { - return; - } - - const fullFilePath = path.join(testDir, filePath); - - // Ensure output subdirectories exist - const fileBasePath = path.dirname(fullFilePath); - if (fileBasePath && !directoryExists.has(fileBasePath)) { - await fs.mkdir(fileBasePath, { recursive: true }); - directoryExists.add(fileBasePath); - } - - if (file.origin === 'memory') { - // Write file contents - await fs.writeFile(fullFilePath, file.contents); - } else { - // Copy file contents - await fs.copyFile(file.inputPath, fullFilePath, fs.constants.COPYFILE_FICLONE); - } - }); -} diff --git a/packages/angular_devkit/build_angular/src/index.ts b/packages/angular_devkit/build_angular/src/index.ts index 1ba9ce034544..8c8b27e39987 100644 --- a/packages/angular_devkit/build_angular/src/index.ts +++ b/packages/angular_devkit/build_angular/src/index.ts @@ -65,11 +65,6 @@ export function executeKarmaBuilder( export { type KarmaBuilderOptions, type KarmaConfigOptions }; -export { - execute as executeProtractorBuilder, - type ProtractorBuilderOptions, -} from './builders/protractor'; - export { execute as executeServerBuilder, type ServerBuilderOptions, diff --git a/packages/angular_devkit/build_angular/src/tools/webpack/plugins/karma/karma-context.html b/packages/angular_devkit/build_angular/src/tools/webpack/plugins/karma/karma-context.html index 64139997b25a..4babe49f7de8 100644 --- a/packages/angular_devkit/build_angular/src/tools/webpack/plugins/karma/karma-context.html +++ b/packages/angular_devkit/build_angular/src/tools/webpack/plugins/karma/karma-context.html @@ -1,4 +1,4 @@ - + %SCRIPTS% - - - + + + diff --git a/packages/angular_devkit/build_angular/src/tools/webpack/plugins/karma/karma-debug.html b/packages/angular_devkit/build_angular/src/tools/webpack/plugins/karma/karma-debug.html index f348daf64352..dc58d8e6ee60 100644 --- a/packages/angular_devkit/build_angular/src/tools/webpack/plugins/karma/karma-debug.html +++ b/packages/angular_devkit/build_angular/src/tools/webpack/plugins/karma/karma-debug.html @@ -1,4 +1,4 @@ - + %SCRIPTS% - - - + + + diff --git a/packages/angular_devkit/build_angular/src/tools/webpack/plugins/karma/karma.ts b/packages/angular_devkit/build_angular/src/tools/webpack/plugins/karma/karma.ts index dd1336b5e22d..07aac6f8b9d2 100644 --- a/packages/angular_devkit/build_angular/src/tools/webpack/plugins/karma/karma.ts +++ b/packages/angular_devkit/build_angular/src/tools/webpack/plugins/karma/karma.ts @@ -18,8 +18,6 @@ import { logging } from '@angular-devkit/core'; import { BuildOptions } from '../../../../utils/build-options'; import { normalizeSourceMaps } from '../../../../utils/index'; -const KARMA_APPLICATION_PATH = '_karma_webpack_'; - let webpackMiddleware: webpackDevMiddleware.API; const init: any = (config: any, emitter: any) => { @@ -65,7 +63,6 @@ const init: any = (config: any, emitter: any) => { const webpackMiddlewareConfig = { // Hide webpack output because its noisy. stats: false, - publicPath: `/${KARMA_APPLICATION_PATH}/`, }; config.webpackMiddleware = { ...webpackMiddlewareConfig, ...config.webpackMiddleware }; @@ -147,7 +144,7 @@ const sourceMapReporter: any = function (this: any, baseReporterDecorator: any, baseReporterDecorator(this); muteDuplicateReporterLogging(this, config); - const urlRegexp = /http:\/\/localhost:\d+\/_karma_webpack_\/(webpack:\/)?/gi; + const urlRegexp = /http:\/\/localhost:\d+\/(webpack:\/)?/gi; this.onSpecComplete = function (_browser: any, result: any) { if (!result.success) { @@ -164,6 +161,17 @@ const sourceMapReporter: any = function (this: any, baseReporterDecorator: any, sourceMapReporter.$inject = ['baseReporterDecorator', 'config']; +/** + * List of files that are always served by the webpack server. + */ +const alwaysServe: ReadonlySet = new Set([ + '/runtime.js', + '/polyfills.js', + '/scripts.js', + '/styles.css', + '/vendor.js', +]); + // When a request is not found in the karma server, try looking for it from the webpack server root. function fallbackMiddleware() { return function ( @@ -171,28 +179,19 @@ function fallbackMiddleware() { response: ServerResponse, next: (err?: unknown) => void, ) { - if (webpackMiddleware) { - if (request.url && !new RegExp(`\\/${KARMA_APPLICATION_PATH}\\/.*`).test(request.url)) { - request.url = '/' + KARMA_APPLICATION_PATH + request.url; - } - webpackMiddleware(request, response, () => { - const alwaysServe = [ - `/${KARMA_APPLICATION_PATH}/runtime.js`, - `/${KARMA_APPLICATION_PATH}/polyfills.js`, - `/${KARMA_APPLICATION_PATH}/scripts.js`, - `/${KARMA_APPLICATION_PATH}/styles.css`, - `/${KARMA_APPLICATION_PATH}/vendor.js`, - ]; - if (request.url && alwaysServe.includes(request.url)) { - response.statusCode = 200; - response.end(); - } else { - next(); - } - }); - } else { + if (!webpackMiddleware) { next(); + return; } + + webpackMiddleware(request, response, () => { + if (request.url && alwaysServe.has(request.url)) { + response.statusCode = 200; + response.end(); + } else { + next(); + } + }); }; } diff --git a/packages/angular_devkit/build_angular/src/tools/webpack/utils/stats.ts b/packages/angular_devkit/build_angular/src/tools/webpack/utils/stats.ts index 1ed442a43d3e..a5c5b5c9b4f6 100644 --- a/packages/angular_devkit/build_angular/src/tools/webpack/utils/stats.ts +++ b/packages/angular_devkit/build_angular/src/tools/webpack/utils/stats.ts @@ -75,7 +75,6 @@ function statsToString( const w = (x: string) => (colors ? ansiColors.bold.white(x) : x); const changedChunksStats: BundleStats[] = []; - let unchangedChunkNumber = 0; let hasEstimatedTransferSizes = false; const isFirstRun = !runsCache.has(json.outputPath || ''); @@ -109,7 +108,7 @@ function statsToString( } changedChunksStats.push(generateBundleStats({ ...chunk, rawSize, estimatedTransferSize })); } - unchangedChunkNumber = json.chunks.length - changedChunksStats.length; + const unchangedChunkNumber = json.chunks.length - changedChunksStats.length; runsCache.add(json.outputPath || ''); diff --git a/packages/angular_devkit/build_angular/src/utils/index.ts b/packages/angular_devkit/build_angular/src/utils/index.ts index 16aaa04d8c34..da07543fafa8 100644 --- a/packages/angular_devkit/build_angular/src/utils/index.ts +++ b/packages/angular_devkit/build_angular/src/utils/index.ts @@ -8,7 +8,6 @@ export * from './default-progress'; export { deleteOutputDir, loadProxyConfiguration } from '@angular/build/private'; -export * from './run-module-as-observable-fork'; export * from './normalize-file-replacements'; export * from './normalize-asset-patterns'; export * from './normalize-source-maps'; diff --git a/packages/angular_devkit/build_angular/src/utils/normalize-asset-patterns.ts b/packages/angular_devkit/build_angular/src/utils/normalize-asset-patterns.ts index ef421d81042c..7f18080e05f5 100644 --- a/packages/angular_devkit/build_angular/src/utils/normalize-asset-patterns.ts +++ b/packages/angular_devkit/build_angular/src/utils/normalize-asset-patterns.ts @@ -43,7 +43,7 @@ export function normalizeAssetPatterns( } let glob: string, input: string; - let isDirectory = false; + let isDirectory: boolean; try { isDirectory = statSync(resolvedAssetPath).isDirectory(); diff --git a/packages/angular_devkit/build_angular/src/utils/process-bundle.ts b/packages/angular_devkit/build_angular/src/utils/process-bundle.ts index c8ec99eef15e..c3828cf804fb 100644 --- a/packages/angular_devkit/build_angular/src/utils/process-bundle.ts +++ b/packages/angular_devkit/build_angular/src/utils/process-bundle.ts @@ -55,11 +55,9 @@ let localizeToolsModule: LocalizeUtilityModule | undefined; * This module must be dynamically loaded as it is an ESM module and this file is CommonJS. */ async function loadLocalizeTools(): Promise { - if (localizeToolsModule !== undefined) { - return localizeToolsModule; - } + localizeToolsModule ??= await import('@angular/localize/tools'); - return import('@angular/localize/tools'); + return localizeToolsModule; } async function createI18nPlugins( @@ -138,7 +136,9 @@ export async function inlineLocales(options: InlineOptions) { // Which makes it hard to find the actual error message. const index = error.message.indexOf(')\n'); const msg = index !== -1 ? error.message.slice(0, index + 1) : error.message; - throw new Error(`${msg}\nAn error occurred inlining file "${options.filename}"`); + throw new Error(`${msg}\nAn error occurred inlining file "${options.filename}"`, { + cause: error, + }); } if (!ast) { diff --git a/packages/angular_devkit/build_angular/src/utils/run-module-as-observable-fork.ts b/packages/angular_devkit/build_angular/src/utils/run-module-as-observable-fork.ts deleted file mode 100644 index f447103da9b4..000000000000 --- a/packages/angular_devkit/build_angular/src/utils/run-module-as-observable-fork.ts +++ /dev/null @@ -1,86 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import { BuilderOutput } from '@angular-devkit/architect'; -import { ForkOptions, fork } from 'node:child_process'; -import { resolve } from 'node:path'; -import { Observable } from 'rxjs'; -import treeKill from 'tree-kill'; - -export function runModuleAsObservableFork( - cwd: string, - modulePath: string, - exportName: string | undefined, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - args: any[], -): Observable { - return new Observable((obs) => { - const workerPath: string = resolve(__dirname, './run-module-worker.js'); - - const debugArgRegex = /--inspect(?:-brk|-port)?|--debug(?:-brk|-port)/; - const execArgv = process.execArgv.filter((arg) => { - // Remove debug args. - // Workaround for https://github.com/nodejs/node/issues/9435 - return !debugArgRegex.test(arg); - }); - const forkOptions: ForkOptions = { - cwd, - execArgv, - }; - - // TODO: support passing in a logger to use as stdio streams - // if (logger) { - // (forkOptions as any).stdio = [ - // 'ignore', - // logger.info, // make it a stream - // logger.error, // make it a stream - // ]; - // } - - const forkedProcess = fork(workerPath, undefined, forkOptions); - - // Cleanup. - const killForkedProcess = () => { - if (forkedProcess && forkedProcess.pid) { - treeKill(forkedProcess.pid, 'SIGTERM'); - } - }; - - // Handle child process exit. - const handleChildProcessExit = (code?: number) => { - killForkedProcess(); - if (code && code !== 0) { - obs.error(); - } - obs.next({ success: true }); - obs.complete(); - }; - forkedProcess.once('exit', handleChildProcessExit); - forkedProcess.once('SIGINT', handleChildProcessExit); - forkedProcess.once('uncaughtException', handleChildProcessExit); - - // Handle parent process exit. - const handleParentProcessExit = () => { - killForkedProcess(); - }; - process.once('exit', handleParentProcessExit); - process.once('SIGINT', handleParentProcessExit); - process.once('uncaughtException', handleParentProcessExit); - - // Run module. - forkedProcess.send({ - hash: '5d4b9a5c0a4e0f9977598437b0e85bcc', - modulePath, - exportName, - args, - }); - - // Teardown logic. When unsubscribing, kill the forked process. - return killForkedProcess; - }); -} diff --git a/packages/angular_devkit/build_angular/src/utils/run-module-worker.js b/packages/angular_devkit/build_angular/src/utils/run-module-worker.js deleted file mode 100644 index a6f3fa54513a..000000000000 --- a/packages/angular_devkit/build_angular/src/utils/run-module-worker.js +++ /dev/null @@ -1,18 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ -process.on('message', (message) => { - // Only process messages with the hash in 'run-module-as-observable-fork.ts'. - if (message.hash === '5d4b9a5c0a4e0f9977598437b0e85bcc') { - const requiredModule = require(message.modulePath); - if (message.exportName) { - requiredModule[message.exportName](...message.args); - } else { - requiredModule(...message.args); - } - } -}); diff --git a/packages/angular_devkit/build_angular/src/utils/test-files.ts b/packages/angular_devkit/build_angular/src/utils/test-files.ts deleted file mode 100644 index 1276f0347f4b..000000000000 --- a/packages/angular_devkit/build_angular/src/utils/test-files.ts +++ /dev/null @@ -1,37 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import { GlobOptions, glob as globFn } from 'tinyglobby'; - -/** - * Finds all test files in the project. - * - * @param options The builder options describing where to find tests. - * @param workspaceRoot The path to the root directory of the workspace. - * @param glob A promisified implementation of the `glob` module. Only intended for - * testing purposes. - * @returns A set of all test files in the project. - */ -export async function findTestFiles( - include: string[], - exclude: string[], - workspaceRoot: string, - glob: typeof globFn = globFn, -): Promise> { - const globOptions: GlobOptions = { - cwd: workspaceRoot, - ignore: ['node_modules/**'].concat(exclude), - braceExpansion: false, // Do not expand `a{b,c}` to `ab,ac`. - extglob: false, // Disable "extglob" patterns. - }; - - const included = await Promise.all(include.map((pattern) => glob(pattern, globOptions))); - - // Flatten and deduplicate any files found in multiple include patterns. - return new Set(included.flat()); -} diff --git a/packages/angular_devkit/build_angular/src/utils/test-files_spec.ts b/packages/angular_devkit/build_angular/src/utils/test-files_spec.ts deleted file mode 100644 index 9902aa47142a..000000000000 --- a/packages/angular_devkit/build_angular/src/utils/test-files_spec.ts +++ /dev/null @@ -1,151 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -// eslint-disable-next-line import/no-extraneous-dependencies -import { promises as fs } from 'node:fs'; -import * as path from 'node:path'; -import { glob as realGlob } from 'tinyglobby'; -import { findTestFiles } from './test-files'; - -describe('test-files', () => { - describe('findTestFiles()', () => { - let tempDir!: string; - - beforeEach(async () => { - tempDir = await fs.mkdtemp('angular-cli-jest-builder-test-files-'); - }); - - afterEach(async () => { - await fs.rm(tempDir, { recursive: true }); - }); - - it('returns all the test files in the project', async () => { - await fs.writeFile(path.join(tempDir, 'foo.spec.ts'), ''); - await fs.mkdir(path.join(tempDir, 'nested')); - await fs.writeFile(path.join(tempDir, 'nested', 'bar.spec.ts'), ''); - - const testFiles = await findTestFiles( - ['**/*.spec.ts'] /* include */, - [] /* exclude */, - tempDir, - ); - - expect(testFiles).toEqual(new Set(['foo.spec.ts', path.join('nested', 'bar.spec.ts')])); - }); - - it('excludes `node_modules/` and files from input options', async () => { - await fs.writeFile(path.join(tempDir, 'foo.spec.ts'), ''); - await fs.writeFile(path.join(tempDir, 'bar.ignored.spec.ts'), ''); - await fs.mkdir(path.join(tempDir, 'node_modules', 'dep'), { recursive: true }); - await fs.writeFile(path.join(tempDir, 'node_modules', 'dep', 'baz.spec.ts'), ''); - - const testFiles = await findTestFiles( - ['**/*.spec.ts'] /* include */, - ['**/*.ignored.spec.ts'] /* exclude */, - tempDir, - ); - - expect(testFiles).toEqual(new Set(['foo.spec.ts'])); - }); - - it('finds files in multiple globs', async () => { - await fs.writeFile(path.join(tempDir, 'foo.spec.ts'), ''); - await fs.writeFile(path.join(tempDir, 'bar.test.ts'), ''); - await fs.writeFile(path.join(tempDir, 'foo.ignored.spec.ts'), ''); - await fs.writeFile(path.join(tempDir, 'bar.ignored.test.ts'), ''); - - await fs.mkdir(path.join(tempDir, 'node_modules', 'dep'), { recursive: true }); - await fs.writeFile(path.join(tempDir, 'node_modules', 'dep', 'baz.spec.ts'), ''); - await fs.writeFile(path.join(tempDir, 'node_modules', 'dep', 'baz.test.ts'), ''); - - const testFiles = await findTestFiles( - ['**/*.spec.ts', '**/*.test.ts'] /* include */, - // Exclude should be applied to all `glob()` executions. - ['**/*.ignored.*.ts'] /* exclude */, - tempDir, - ); - - expect(testFiles).toEqual(new Set(['foo.spec.ts', 'bar.test.ts'])); - }); - - it('is constrained to the workspace root', async () => { - await fs.mkdir(path.join(tempDir, 'nested')); - await fs.writeFile(path.join(tempDir, 'foo.spec.ts'), ''); - await fs.writeFile(path.join(tempDir, 'nested', 'bar.spec.ts'), ''); - - const testFiles = await findTestFiles( - ['**/*.spec.ts'] /* include */, - [] /* exclude */, - path.join(tempDir, 'nested'), - ); - - expect(testFiles).toEqual(new Set(['bar.spec.ts'])); - }); - - it('throws if any `glob` invocation fails', async () => { - const err = new Error('Eww, I stepped in a glob.'); - const glob = jasmine - .createSpy('glob', realGlob) - .and.returnValues( - Promise.resolve(['foo.spec.ts']), - Promise.reject(err), - Promise.resolve(['bar.test.ts']), - ); - - await expectAsync( - findTestFiles( - ['*.spec.ts', '*.stuff.ts', '*.test.ts'] /* include */, - [] /* exclude */, - tempDir, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - glob as any, - ), - ).toBeRejectedWith(err); - }); - - it('disables brace expansion', async () => { - await fs.writeFile(path.join(tempDir, 'foo.spec.ts'), ''); - await fs.writeFile(path.join(tempDir, 'bar.spec.ts'), ''); - - const testFiles = await findTestFiles( - ['{foo,bar}.spec.ts'] /* include */, - [] /* exclude */, - tempDir, - ); - - expect(testFiles).toEqual(new Set()); - }); - - it('disables `extglob` features', async () => { - await fs.writeFile(path.join(tempDir, 'foo.spec.ts'), ''); - await fs.writeFile(path.join(tempDir, 'bar.spec.ts'), ''); - - const testFiles = await findTestFiles( - ['+(foo|bar).spec.ts'] /* include */, - [] /* exclude */, - tempDir, - ); - - expect(testFiles).toEqual(new Set()); - }); - - it('ignores directories', async () => { - await fs.mkdir(path.join(tempDir, 'foo.spec.ts')); - await fs.mkdir(path.join(tempDir, 'bar.spec.ts')); - await fs.writeFile(path.join(tempDir, 'bar.spec.ts', 'baz.spec.ts'), ''); - - const testFiles = await findTestFiles( - ['**/*.spec.ts'] /* include */, - [] /* exclude */, - tempDir, - ); - - expect(testFiles).toEqual(new Set([path.join('bar.spec.ts', 'baz.spec.ts')])); - }); - }); -}); diff --git a/packages/angular_devkit/build_angular/test/hello-world-lib/BUILD.bazel b/packages/angular_devkit/build_angular/test/hello-world-lib/BUILD.bazel deleted file mode 100644 index 0eef93e382cd..000000000000 --- a/packages/angular_devkit/build_angular/test/hello-world-lib/BUILD.bazel +++ /dev/null @@ -1,21 +0,0 @@ -load("@aspect_bazel_lib//lib:copy_to_bin.bzl", "copy_to_bin") -load("@aspect_rules_js//npm:defs.bzl", "npm_link_package") - -# Note: Link the package into node modules for testing. Notably, tests -# of a package generally don't use the associated npm package, to e.g. allow for relative -# imports, but here this is an exception as the package needs to be resolvable at runtime -# to replicate a CLI environment. -npm_link_package( - name = "node_modules/@angular-devkit/build-angular", - src = "//packages/angular_devkit/build_angular:pkg", - package = "@angular-devkit/build-angular", - root_package = package_name(), -) - -copy_to_bin( - name = "hello-world-lib", - srcs = glob(["**/*"]) + [ - ":node_modules/@angular-devkit/build-angular", - ], - visibility = ["//packages/angular_devkit/build_angular:__pkg__"], -) diff --git a/packages/angular_devkit/build_angular/test/hello-world-lib/projects/lib/package.json b/packages/angular_devkit/build_angular/test/hello-world-lib/projects/lib/package.json deleted file mode 100644 index cacc9ceaa935..000000000000 --- a/packages/angular_devkit/build_angular/test/hello-world-lib/projects/lib/package.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "name": "lib", - "version": "0.0.1", - "peerDependencies": { - "@angular/common": "^21.2.0-next", - "@angular/core": "^21.2.0-next" - } -} \ No newline at end of file diff --git a/packages/angular_devkit/build_webpack/package.json b/packages/angular_devkit/build_webpack/package.json index 463b2e014fa2..709478ff1455 100644 --- a/packages/angular_devkit/build_webpack/package.json +++ b/packages/angular_devkit/build_webpack/package.json @@ -22,7 +22,7 @@ "devDependencies": { "@angular-devkit/core": "workspace:0.0.0-PLACEHOLDER", "@ngtools/webpack": "workspace:0.0.0-PLACEHOLDER", - "webpack": "5.105.2", + "webpack": "5.105.4", "webpack-dev-server": "5.2.3" }, "peerDependencies": { diff --git a/packages/angular_devkit/build_webpack/src/builders/webpack-dev-server/index_spec.ts b/packages/angular_devkit/build_webpack/src/builders/webpack-dev-server/index_spec.ts index 80b12e622b71..9e4f688d0c4e 100644 --- a/packages/angular_devkit/build_webpack/src/builders/webpack-dev-server/index_spec.ts +++ b/packages/angular_devkit/build_webpack/src/builders/webpack-dev-server/index_spec.ts @@ -50,7 +50,7 @@ describe('Dev Server Builder', () => { const run = await architect.scheduleTarget(webpackTargetSpec, { webpackConfig: 'webpack.config.cjs', }); - const output = (await run.result) as DevServerBuildOutput; + const output = await run.result; expect(output.success).toBe(true); const response = await fetch(`http://localhost:${output.port}/bundle.js`); @@ -63,7 +63,7 @@ describe('Dev Server Builder', () => { const run = await architect.scheduleTarget(webpackTargetSpec, { webpackConfig: 'webpack.config.mjs', }); - const output = (await run.result) as DevServerBuildOutput; + const output = await run.result; expect(output.success).toBe(true); const response = await fetch(`http://localhost:${output.port}/bundle.js`); @@ -74,7 +74,7 @@ describe('Dev Server Builder', () => { it('works and returns emitted files', async () => { const run = await architect.scheduleTarget(webpackTargetSpec); - const output = (await run.result) as DevServerBuildOutput; + const output = await run.result; expect(output.success).toBe(true); expect(output.emittedFiles).toContain({ diff --git a/packages/angular_devkit/build_webpack/src/builders/webpack/index_spec.ts b/packages/angular_devkit/build_webpack/src/builders/webpack/index_spec.ts index 9564387d3d73..6209272d9376 100644 --- a/packages/angular_devkit/build_webpack/src/builders/webpack/index_spec.ts +++ b/packages/angular_devkit/build_webpack/src/builders/webpack/index_spec.ts @@ -73,7 +73,7 @@ describe('Webpack Builder basic test', () => { it('works and returns emitted files', async () => { const run = await architect.scheduleTarget({ project: 'app', target: 'build' }); - const output = (await run.result) as BuildResult; + const output = await run.result; expect(output.success).toBe(true); expect(output.emittedFiles).toContain({ @@ -114,7 +114,7 @@ describe('Webpack Builder basic test', () => { it('works and returns emitted files', async () => { const run = await architect.scheduleTarget({ project: 'app', target: 'build-webpack' }); - const output = (await run.result) as BuildResult; + const output = await run.result; expect(output.success).toBe(true); expect(output.emittedFiles).toContain( diff --git a/packages/angular_devkit/build_webpack/test/angular-app/tsconfig.json b/packages/angular_devkit/build_webpack/test/angular-app/tsconfig.json index c2343708c79a..beb80b8f4d01 100644 --- a/packages/angular_devkit/build_webpack/test/angular-app/tsconfig.json +++ b/packages/angular_devkit/build_webpack/test/angular-app/tsconfig.json @@ -1,7 +1,6 @@ { "compileOnSave": false, "compilerOptions": { - "baseUrl": "./", "outDir": "./dist/out-tsc", "sourceMap": true, "declaration": false, diff --git a/packages/angular_devkit/build_webpack/test/basic-app/tsconfig.json b/packages/angular_devkit/build_webpack/test/basic-app/tsconfig.json index 4625ba86dca4..d93948c96ff0 100644 --- a/packages/angular_devkit/build_webpack/test/basic-app/tsconfig.json +++ b/packages/angular_devkit/build_webpack/test/basic-app/tsconfig.json @@ -1,7 +1,6 @@ { "compileOnSave": false, "compilerOptions": { - "baseUrl": "./", "outDir": "./dist/out-tsc", "sourceMap": true, "declaration": false, diff --git a/packages/angular_devkit/core/node/host.ts b/packages/angular_devkit/core/node/host.ts index 422a95af2b01..107ce003c7f0 100644 --- a/packages/angular_devkit/core/node/host.ts +++ b/packages/angular_devkit/core/node/host.ts @@ -47,6 +47,9 @@ function loadFSWatcher() { throw new Error( 'As of angular-devkit version 8.0, the "chokidar" package ' + 'must be installed in order to use watch() features.', + { + cause: e, + }, ); } throw e; diff --git a/packages/angular_devkit/core/package.json b/packages/angular_devkit/core/package.json index df7555968b65..fe4a5a13032a 100644 --- a/packages/angular_devkit/core/package.json +++ b/packages/angular_devkit/core/package.json @@ -28,7 +28,7 @@ "ajv": "8.18.0", "ajv-formats": "3.0.1", "jsonc-parser": "3.3.1", - "picomatch": "4.0.3", + "picomatch": "4.0.4", "rxjs": "7.8.2", "source-map": "0.7.6" }, diff --git a/packages/angular_devkit/core/src/json/schema/visitor_spec.ts b/packages/angular_devkit/core/src/json/schema/visitor_spec.ts index 4a556f979e9d..38cde5732e3e 100644 --- a/packages/angular_devkit/core/src/json/schema/visitor_spec.ts +++ b/packages/angular_devkit/core/src/json/schema/visitor_spec.ts @@ -84,13 +84,13 @@ describe('visitJson', () => { expect(result).toEqual({ a: { b: { c: ['_1', '_2', '_3'] } } }); }); - it('goes through all replacements recursively (async)', (done) => { + it('goes through all replacements recursively (async)', async () => { const json = { a: 1 }; const newJson = { b: '' }; const newJson2 = { c: [] }; const newJson3 = [1, 2, 3]; - visitJson(json, (value, ptr) => { + const result = await visitJson(json, (value, ptr) => { if (ptr.endsWith('a')) { return from(Promise.resolve(newJson)); } else if (ptr.endsWith('b')) { @@ -104,12 +104,9 @@ describe('visitJson', () => { } else { return from(Promise.resolve('abc')); } - }) - .toPromise() - .then((result) => { - expect(result).toEqual({ a: { b: { c: ['_1', '_2', '_3'] } } }); - done(); - }, done.fail); + }).toPromise(); + + expect(result).toEqual({ a: { b: { c: ['_1', '_2', '_3'] } } }); }); it('works with schema', () => { diff --git a/packages/angular_devkit/core/src/virtual-fs/path_spec.ts b/packages/angular_devkit/core/src/virtual-fs/path_spec.ts index 4e416a1ff12e..e5da5e66e838 100644 --- a/packages/angular_devkit/core/src/virtual-fs/path_spec.ts +++ b/packages/angular_devkit/core/src/virtual-fs/path_spec.ts @@ -94,9 +94,9 @@ describe('path', () => { ]; for (const [input, result] of tests) { - const normalizedInput = normalize(input); + it(`(${input}) == "${result}"`, () => { + const normalizedInput = normalize(input); - it(`(${JSON.stringify(normalizedInput)}) == "${result}"`, () => { expect(split(normalizedInput)).toEqual(result as PathFragment[]); }); } diff --git a/packages/angular_devkit/core/src/workspace/json/reader_spec.ts b/packages/angular_devkit/core/src/workspace/json/reader_spec.ts index 32647444ab2b..041cf580ce0b 100644 --- a/packages/angular_devkit/core/src/workspace/json/reader_spec.ts +++ b/packages/angular_devkit/core/src/workspace/json/reader_spec.ts @@ -75,7 +75,7 @@ describe('readJsonWorkpace Parsing', () => { const workspace = await readJsonWorkspace('', host); - expect(Array.from(workspace.projects.keys())).toEqual(['my-app', 'my-app-e2e']); + expect(Array.from(workspace.projects.keys())).toEqual(['my-app']); expect(workspace.extensions['newProjectRoot']).toBe('projects'); expect(workspace.projects.get('my-app')!.extensions['schematics']).toEqual({ '@schematics/angular:component': { styleext: 'scss' }, diff --git a/packages/angular_devkit/core/src/workspace/json/test/angular.json b/packages/angular_devkit/core/src/workspace/json/test/angular.json index 94800e0dfa56..285676999acb 100644 --- a/packages/angular_devkit/core/src/workspace/json/test/angular.json +++ b/packages/angular_devkit/core/src/workspace/json/test/angular.json @@ -104,34 +104,6 @@ } } } - }, - "my-app-e2e": { - "root": "e2e/", - "projectType": "application", - "prefix": "", - "architect": { - "e2e": { - "builder": "@angular-devkit/build-angular:private-protractor", - "options": { - "protractorConfig": "e2e/protractor.conf.js", - "devServerTarget": "my-app:serve" - }, - "configurations": { - "production": { - "devServerTarget": "my-app:serve:production" - } - } - }, - "lint": { - "builder": "@angular-devkit/build-angular:tslint", - "options": { - "tsConfig": "e2e/tsconfig.e2e.json", - "exclude": [ - "**/node_modules/**" - ] - } - } - } } } } diff --git a/packages/angular_devkit/core/src/workspace/json/test/cases/AddProject2.json b/packages/angular_devkit/core/src/workspace/json/test/cases/AddProject2.json index 5ae73ae1eff6..55ec083ffa9f 100644 --- a/packages/angular_devkit/core/src/workspace/json/test/cases/AddProject2.json +++ b/packages/angular_devkit/core/src/workspace/json/test/cases/AddProject2.json @@ -105,34 +105,6 @@ } } }, - "my-app-e2e": { - "root": "e2e/", - "projectType": "application", - "prefix": "", - "architect": { - "e2e": { - "builder": "@angular-devkit/build-angular:private-protractor", - "options": { - "protractorConfig": "e2e/protractor.conf.js", - "devServerTarget": "my-app:serve" - }, - "configurations": { - "production": { - "devServerTarget": "my-app:serve:production" - } - } - }, - "lint": { - "builder": "@angular-devkit/build-angular:tslint", - "options": { - "tsConfig": "e2e/tsconfig.e2e.json", - "exclude": [ - "**/node_modules/**" - ] - } - } - } - }, "new": { "root": "src" } diff --git a/packages/angular_devkit/core/src/workspace/json/test/cases/AddProject3.json b/packages/angular_devkit/core/src/workspace/json/test/cases/AddProject3.json index 6198c97007a0..cbd98e4c89ef 100644 --- a/packages/angular_devkit/core/src/workspace/json/test/cases/AddProject3.json +++ b/packages/angular_devkit/core/src/workspace/json/test/cases/AddProject3.json @@ -105,34 +105,6 @@ } } }, - "my-app-e2e": { - "root": "e2e/", - "projectType": "application", - "prefix": "", - "architect": { - "e2e": { - "builder": "@angular-devkit/build-angular:private-protractor", - "options": { - "protractorConfig": "e2e/protractor.conf.js", - "devServerTarget": "my-app:serve" - }, - "configurations": { - "production": { - "devServerTarget": "my-app:serve:production" - } - } - }, - "lint": { - "builder": "@angular-devkit/build-angular:tslint", - "options": { - "tsConfig": "e2e/tsconfig.e2e.json", - "exclude": [ - "**/node_modules/**" - ] - } - } - } - }, "1": { "root": "src" } diff --git a/packages/angular_devkit/core/src/workspace/json/test/cases/ProjectAddTarget.json b/packages/angular_devkit/core/src/workspace/json/test/cases/ProjectAddTarget.json index 1fdf8eeec7ed..e42eb5a70c6f 100644 --- a/packages/angular_devkit/core/src/workspace/json/test/cases/ProjectAddTarget.json +++ b/packages/angular_devkit/core/src/workspace/json/test/cases/ProjectAddTarget.json @@ -107,34 +107,6 @@ "builder": "new-builder" } } - }, - "my-app-e2e": { - "root": "e2e/", - "projectType": "application", - "prefix": "", - "architect": { - "e2e": { - "builder": "@angular-devkit/build-angular:private-protractor", - "options": { - "protractorConfig": "e2e/protractor.conf.js", - "devServerTarget": "my-app:serve" - }, - "configurations": { - "production": { - "devServerTarget": "my-app:serve:production" - } - } - }, - "lint": { - "builder": "@angular-devkit/build-angular:tslint", - "options": { - "tsConfig": "e2e/tsconfig.e2e.json", - "exclude": [ - "**/node_modules/**" - ] - } - } - } } } } diff --git a/packages/angular_devkit/core/src/workspace/json/test/cases/ProjectDeleteTarget.json b/packages/angular_devkit/core/src/workspace/json/test/cases/ProjectDeleteTarget.json index 81804c2f04b5..573a5835564b 100644 --- a/packages/angular_devkit/core/src/workspace/json/test/cases/ProjectDeleteTarget.json +++ b/packages/angular_devkit/core/src/workspace/json/test/cases/ProjectDeleteTarget.json @@ -98,34 +98,6 @@ } } } - }, - "my-app-e2e": { - "root": "e2e/", - "projectType": "application", - "prefix": "", - "architect": { - "e2e": { - "builder": "@angular-devkit/build-angular:private-protractor", - "options": { - "protractorConfig": "e2e/protractor.conf.js", - "devServerTarget": "my-app:serve" - }, - "configurations": { - "production": { - "devServerTarget": "my-app:serve:production" - } - } - }, - "lint": { - "builder": "@angular-devkit/build-angular:tslint", - "options": { - "tsConfig": "e2e/tsconfig.e2e.json", - "exclude": [ - "**/node_modules/**" - ] - } - } - } } } } diff --git a/packages/angular_devkit/core/src/workspace/json/test/cases/ProjectModifyProperties.json b/packages/angular_devkit/core/src/workspace/json/test/cases/ProjectModifyProperties.json index 1debd9ed6e6b..9f6380eb89c0 100644 --- a/packages/angular_devkit/core/src/workspace/json/test/cases/ProjectModifyProperties.json +++ b/packages/angular_devkit/core/src/workspace/json/test/cases/ProjectModifyProperties.json @@ -104,34 +104,6 @@ } } } - }, - "my-app-e2e": { - "root": "e2e/", - "projectType": "application", - "prefix": "", - "architect": { - "e2e": { - "builder": "@angular-devkit/build-angular:private-protractor", - "options": { - "protractorConfig": "e2e/protractor.conf.js", - "devServerTarget": "my-app:serve" - }, - "configurations": { - "production": { - "devServerTarget": "my-app:serve:production" - } - } - }, - "lint": { - "builder": "@angular-devkit/build-angular:tslint", - "options": { - "tsConfig": "e2e/tsconfig.e2e.json", - "exclude": [ - "**/node_modules/**" - ] - } - } - } } } } diff --git a/packages/angular_devkit/core/src/workspace/json/test/cases/ProjectSetProperties.json b/packages/angular_devkit/core/src/workspace/json/test/cases/ProjectSetProperties.json index 9e2bfb88483c..7b8b3f85e5c4 100644 --- a/packages/angular_devkit/core/src/workspace/json/test/cases/ProjectSetProperties.json +++ b/packages/angular_devkit/core/src/workspace/json/test/cases/ProjectSetProperties.json @@ -105,34 +105,6 @@ } }, "sourceRoot": "src" - }, - "my-app-e2e": { - "root": "e2e/", - "projectType": "application", - "prefix": "", - "architect": { - "e2e": { - "builder": "@angular-devkit/build-angular:private-protractor", - "options": { - "protractorConfig": "e2e/protractor.conf.js", - "devServerTarget": "my-app:serve" - }, - "configurations": { - "production": { - "devServerTarget": "my-app:serve:production" - } - } - }, - "lint": { - "builder": "@angular-devkit/build-angular:tslint", - "options": { - "tsConfig": "e2e/tsconfig.e2e.json", - "exclude": [ - "**/node_modules/**" - ] - } - } - } } } } diff --git a/packages/angular_devkit/schematics/src/engine/schematic_spec.ts b/packages/angular_devkit/schematics/src/engine/schematic_spec.ts index b5f6fa8a18b9..8beb6ad81e9f 100644 --- a/packages/angular_devkit/schematics/src/engine/schematic_spec.ts +++ b/packages/angular_devkit/schematics/src/engine/schematic_spec.ts @@ -48,7 +48,7 @@ function files(tree: Tree) { } describe('Schematic', () => { - it('works with a rule', (done) => { + it('works with a rule', async () => { let inner: Tree | null = null; const desc: SchematicDescription = { collection, @@ -64,15 +64,12 @@ describe('Schematic', () => { }; const schematic = new SchematicImpl(desc, desc.factory, null!, engine); - lastValueFrom(schematic.call({}, observableOf(empty()))) - .then((x) => { - expect(files(inner!)).toEqual([]); - expect(files(x)).toEqual(['/a/b/c']); - }) - .then(done, done.fail); + const x = await lastValueFrom(schematic.call({}, observableOf(empty()))); + expect(files(inner!)).toEqual([]); + expect(files(x)).toEqual(['/a/b/c']); }); - it('works with a rule that returns an observable', (done) => { + it('works with a rule that returns an observable', async () => { let inner: Tree | null = null; const desc: SchematicDescription = { collection, @@ -87,16 +84,13 @@ describe('Schematic', () => { }; const schematic = new SchematicImpl(desc, desc.factory, null!, engine); - lastValueFrom(schematic.call({}, observableOf(empty()))) - .then((x) => { - expect(files(inner!)).toEqual([]); - expect(files(x)).toEqual([]); - expect(inner).not.toBe(x); - }) - .then(done, done.fail); + const x = await lastValueFrom(schematic.call({}, observableOf(empty()))); + expect(files(inner!)).toEqual([]); + expect(files(x)).toEqual([]); + expect(inner!).not.toBe(x); }); - it('works with nested chained function rules', (done) => { + it('works with nested chained function rules', async () => { let chainCount = 0; let oneCount = 0; let twoCount = 0; @@ -137,17 +131,14 @@ describe('Schematic', () => { }; const schematic = new SchematicImpl(desc, desc.factory, null!, engine); - lastValueFrom(schematic.call({}, observableOf(empty()))) - .then((_x) => { - expect(chainCount).toBe(1); - expect(oneCount).toBe(1); - expect(twoCount).toBe(1); - expect(threeCount).toBe(1); - }) - .then(done, done.fail); + await lastValueFrom(schematic.call({}, observableOf(empty()))); + expect(chainCount).toBe(1); + expect(oneCount).toBe(1); + expect(twoCount).toBe(1); + expect(threeCount).toBe(1); }); - it('can be called with a scope', (done) => { + it('can be called with a scope', async () => { const desc: SchematicDescription = { collection, name: 'test', @@ -159,10 +150,7 @@ describe('Schematic', () => { }; const schematic = new SchematicImpl(desc, desc.factory, null!, engine); - lastValueFrom(schematic.call({}, observableOf(empty()), {}, { scope: 'base' })) - .then((x) => { - expect(files(x)).toEqual(['/base/a/b/c']); - }) - .then(done, done.fail); + const x = await lastValueFrom(schematic.call({}, observableOf(empty()), {}, { scope: 'base' })); + expect(files(x)).toEqual(['/base/a/b/c']); }); }); diff --git a/packages/angular_devkit/schematics/src/rules/base_spec.ts b/packages/angular_devkit/schematics/src/rules/base_spec.ts index 9470a55fcdb1..b3578ca8c00a 100644 --- a/packages/angular_devkit/schematics/src/rules/base_spec.ts +++ b/packages/angular_devkit/schematics/src/rules/base_spec.ts @@ -23,7 +23,7 @@ const context: SchematicContext = { } as {} as SchematicContext; describe('chain', () => { - it('works with simple rules', (done) => { + it('works with simple rules', async () => { const rulesCalled: Tree[] = []; const tree0 = empty(); @@ -35,18 +35,17 @@ describe('chain', () => { const rule1: Rule = (tree: Tree) => ((rulesCalled[1] = tree), tree2); const rule2: Rule = (tree: Tree) => ((rulesCalled[2] = tree), tree3); - lastValueFrom(callRule(chain([rule0, rule1, rule2]), observableOf(tree0), context)) - .then((result) => { - expect(result).not.toBe(tree0); - expect(rulesCalled[0]).toBe(tree0); - expect(rulesCalled[1]).toBe(tree1); - expect(rulesCalled[2]).toBe(tree2); - expect(result).toBe(tree3); - }) - .then(done, done.fail); + const result = await lastValueFrom( + callRule(chain([rule0, rule1, rule2]), observableOf(tree0), context), + ); + expect(result).not.toBe(tree0); + expect(rulesCalled[0]).toBe(tree0); + expect(rulesCalled[1]).toBe(tree1); + expect(rulesCalled[2]).toBe(tree2); + expect(result).toBe(tree3); }); - it('works with async rules', (done) => { + it('works with async rules', async () => { const rulesCalled: Tree[] = []; const tree0 = empty(); @@ -58,15 +57,12 @@ describe('chain', () => { const rule1: Rule = async (tree: Tree) => ((rulesCalled[1] = tree), tree2); const rule2: Rule = async (tree: Tree) => ((rulesCalled[2] = tree), tree3); - lastValueFrom(callRule(chain([rule0, rule1, rule2]), tree0, context)) - .then((result) => { - expect(result).not.toBe(tree0); - expect(rulesCalled[0]).toBe(tree0); - expect(rulesCalled[1]).toBe(tree1); - expect(rulesCalled[2]).toBe(tree2); - expect(result).toBe(tree3); - }) - .then(done, done.fail); + const result = await lastValueFrom(callRule(chain([rule0, rule1, rule2]), tree0, context)); + expect(result).not.toBe(tree0); + expect(rulesCalled[0]).toBe(tree0); + expect(rulesCalled[1]).toBe(tree1); + expect(rulesCalled[2]).toBe(tree2); + expect(result).toBe(tree3); }); it('works with a sync generator of rules', async () => { @@ -123,7 +119,7 @@ describe('chain', () => { expect(result).toBe(tree3); }); - it('works with observable rules', (done) => { + it('works with observable rules', async () => { const rulesCalled: Tree[] = []; const tree0 = empty(); @@ -135,20 +131,19 @@ describe('chain', () => { const rule1: Rule = (tree: Tree) => ((rulesCalled[1] = tree), observableOf(tree2)); const rule2: Rule = (tree: Tree) => ((rulesCalled[2] = tree), tree3); - lastValueFrom(callRule(chain([rule0, rule1, rule2]), observableOf(tree0), context)) - .then((result) => { - expect(result).not.toBe(tree0); - expect(rulesCalled[0]).toBe(tree0); - expect(rulesCalled[1]).toBe(tree1); - expect(rulesCalled[2]).toBe(tree2); - expect(result).toBe(tree3); - }) - .then(done, done.fail); + const result = await lastValueFrom( + callRule(chain([rule0, rule1, rule2]), observableOf(tree0), context), + ); + expect(result).not.toBe(tree0); + expect(rulesCalled[0]).toBe(tree0); + expect(rulesCalled[1]).toBe(tree1); + expect(rulesCalled[2]).toBe(tree2); + expect(result).toBe(tree3); }); }); describe('apply', () => { - it('works with simple rules', (done) => { + it('works with simple rules', async () => { const rulesCalled: Tree[] = []; const tree0 = empty(); const tree1 = empty(); @@ -160,18 +155,15 @@ describe('apply', () => { const rule1: Rule = (tree: Tree) => ((rulesCalled[1] = tree), tree2); const rule2: Rule = (tree: Tree) => ((rulesCalled[2] = tree), tree3); - lastValueFrom(callSource(apply(source, [rule0, rule1, rule2]), context)) - .then((result) => { - expect(result).not.toBe(tree0); - expect(rulesCalled[0]).toBe(tree0); - expect(rulesCalled[1]).toBe(tree1); - expect(rulesCalled[2]).toBe(tree2); - expect(result).toBe(tree3); - }) - .then(done, done.fail); + const result = await lastValueFrom(callSource(apply(source, [rule0, rule1, rule2]), context)); + expect(result).not.toBe(tree0); + expect(rulesCalled[0]).toBe(tree0); + expect(rulesCalled[1]).toBe(tree1); + expect(rulesCalled[2]).toBe(tree2); + expect(result).toBe(tree3); }); - it('works with observable rules', (done) => { + it('works with observable rules', async () => { const rulesCalled: Tree[] = []; const tree0 = empty(); const tree1 = empty(); @@ -183,20 +175,17 @@ describe('apply', () => { const rule1: Rule = (tree: Tree) => ((rulesCalled[1] = tree), observableOf(tree2)); const rule2: Rule = (tree: Tree) => ((rulesCalled[2] = tree), tree3); - lastValueFrom(callSource(apply(source, [rule0, rule1, rule2]), context)) - .then((result) => { - expect(result).not.toBe(tree0); - expect(rulesCalled[0]).toBe(tree0); - expect(rulesCalled[1]).toBe(tree1); - expect(rulesCalled[2]).toBe(tree2); - expect(result).toBe(tree3); - }) - .then(done, done.fail); + const result = await lastValueFrom(callSource(apply(source, [rule0, rule1, rule2]), context)); + expect(result).not.toBe(tree0); + expect(rulesCalled[0]).toBe(tree0); + expect(rulesCalled[1]).toBe(tree1); + expect(rulesCalled[2]).toBe(tree2); + expect(result).toBe(tree3); }); }); describe('partitionApplyMerge', () => { - it('works with simple rules', (done) => { + it('works with simple rules', async () => { const host = new virtualFs.test.TestHost({ '/test1': '', '/test2': '', @@ -217,30 +206,26 @@ describe('partitionApplyMerge', () => { return empty(); }; - lastValueFrom( + const result = await lastValueFrom( callRule(partitionApplyMerge(predicate, ruleYes, ruleNo), observableOf(tree), context), - ) - .then((result) => { - expect(result.exists('/test1')).toBe(false); - expect(result.exists('/test2')).toBe(false); - }) - .then(done, done.fail); + ); + expect(result.exists('/test1')).toBe(false); + expect(result.exists('/test2')).toBe(false); }); }); describe('applyToSubtree', () => { - it('works', (done) => { + it('works', async () => { const tree = new HostTree(); tree.create('a/b/file1', 'hello world'); tree.create('a/b/file2', 'hello world'); tree.create('a/c/file3', 'hello world'); - lastValueFrom(callRule(applyToSubtree('a/b', [move('x')]), observableOf(tree), context)) - .then((result) => { - expect(result.exists('a/b/x/file1')).toBe(true); - expect(result.exists('a/b/x/file2')).toBe(true); - expect(result.exists('a/c/file3')).toBe(true); - }) - .then(done, done.fail); + const result = await lastValueFrom( + callRule(applyToSubtree('a/b', [move('x')]), observableOf(tree), context), + ); + expect(result.exists('a/b/x/file1')).toBe(true); + expect(result.exists('a/b/x/file2')).toBe(true); + expect(result.exists('a/c/file3')).toBe(true); }); }); diff --git a/packages/angular_devkit/schematics/src/rules/call_spec.ts b/packages/angular_devkit/schematics/src/rules/call_spec.ts index f088f03a60b1..3d9a7c8ce2ea 100644 --- a/packages/angular_devkit/schematics/src/rules/call_spec.ts +++ b/packages/angular_devkit/schematics/src/rules/call_spec.ts @@ -25,70 +25,42 @@ const context: SchematicContext = { } as {} as SchematicContext; describe('callSource', () => { - it('errors if undefined source', (done) => { + it('errors if undefined source', async () => { const source0: any = () => undefined; - callSource(source0, context) - .toPromise() - .then( - () => done.fail(), - (err) => { - expect(err).toEqual(new InvalidSourceResultException()); - }, - ) - .then(done, done.fail); + await expectAsync(callSource(source0, context).toPromise()).toBeRejectedWithError( + InvalidSourceResultException, + ); }); - it('errors if invalid source object', (done) => { + it('errors if invalid source object', async () => { const source0: Source = () => ({}) as Tree; - callSource(source0, context) - .toPromise() - .then( - () => done.fail(), - (err) => { - expect(err).toEqual(new InvalidSourceResultException({})); - }, - ) - .then(done, done.fail); + await expectAsync(callSource(source0, context).toPromise()).toBeRejectedWithError( + InvalidSourceResultException, + ); }); - it('errors if Observable of invalid source object', (done) => { + it('errors if Observable of invalid source object', async () => { const source0: Source = () => observableOf({} as Tree); - callSource(source0, context) - .toPromise() - .then( - () => done.fail(), - (err) => { - expect(err).toEqual(new InvalidSourceResultException({})); - }, - ) - .then(done, done.fail); + await expectAsync(callSource(source0, context).toPromise()).toBeRejectedWithError( + InvalidSourceResultException, + ); }); - it('works with a Tree', (done) => { + it('works with a Tree', async () => { const tree0 = empty(); const source0: Source = () => tree0; - - callSource(source0, context) - .toPromise() - .then((tree) => { - expect(tree).toBe(tree0); - }) - .then(done, done.fail); + const tree = await callSource(source0, context).toPromise(); + expect(tree).toBe(tree0); }); - it('works with an Observable', (done) => { + it('works with an Observable', async () => { const tree0 = empty(); const source0: Source = () => observableOf(tree0); - - callSource(source0, context) - .toPromise() - .then((tree) => { - expect(tree).toBe(tree0); - }) - .then(done, done.fail); + const tree = await callSource(source0, context).toPromise(); + expect(tree).toBe(tree0); }); }); @@ -109,39 +81,24 @@ describe('callRule', () => { ); }); - it('works with undefined result', (done) => { + it('works with undefined result', async () => { const tree0 = empty(); const rule0: Rule = () => undefined; - - callRule(rule0, observableOf(tree0), context) - .toPromise() - .then((tree) => { - expect(tree).toBe(tree0); - }) - .then(done, done.fail); + const tree = await callRule(rule0, observableOf(tree0), context).toPromise(); + expect(tree).toBe(tree0); }); - it('works with a Tree', (done) => { + it('works with a Tree', async () => { const tree0 = empty(); const rule0: Rule = () => tree0; - - callRule(rule0, observableOf(tree0), context) - .toPromise() - .then((tree) => { - expect(tree).toBe(tree0); - }) - .then(done, done.fail); + const tree = await callRule(rule0, observableOf(tree0), context).toPromise(); + expect(tree).toBe(tree0); }); - it('works with an Observable', (done) => { + it('works with an Observable', async () => { const tree0 = empty(); const rule0: Rule = () => observableOf(tree0); - - callRule(rule0, observableOf(tree0), context) - .toPromise() - .then((tree) => { - expect(tree).toBe(tree0); - }) - .then(done, done.fail); + const tree = await callRule(rule0, observableOf(tree0), context).toPromise(); + expect(tree).toBe(tree0); }); }); diff --git a/packages/angular_devkit/schematics/src/rules/move_spec.ts b/packages/angular_devkit/schematics/src/rules/move_spec.ts index 3e0d20591375..10a33c693d43 100644 --- a/packages/angular_devkit/schematics/src/rules/move_spec.ts +++ b/packages/angular_devkit/schematics/src/rules/move_spec.ts @@ -16,80 +16,65 @@ import { move } from './move'; const context: SchematicContext = null!; describe('move', () => { - it('works on moving the whole structure', (done) => { + it('works on moving the whole structure', async () => { const tree = new HostTree(); tree.create('a/b/file1', 'hello world'); tree.create('a/b/file2', 'hello world'); tree.create('a/c/file3', 'hello world'); - lastValueFrom(callRule(move('sub'), observableOf(tree), context)) - .then((result) => { - expect(result.exists('sub/a/b/file1')).toBe(true); - expect(result.exists('sub/a/b/file2')).toBe(true); - expect(result.exists('sub/a/c/file3')).toBe(true); - }) - .then(done, done.fail); + const result = await lastValueFrom(callRule(move('sub'), observableOf(tree), context)); + expect(result.exists('sub/a/b/file1')).toBe(true); + expect(result.exists('sub/a/b/file2')).toBe(true); + expect(result.exists('sub/a/c/file3')).toBe(true); }); - it('works on moving a subdirectory structure', (done) => { + it('works on moving a subdirectory structure', async () => { const tree = new HostTree(); tree.create('a/b/file1', 'hello world'); tree.create('a/b/file2', 'hello world'); tree.create('a/c/file3', 'hello world'); - lastValueFrom(callRule(move('a/b', 'sub'), observableOf(tree), context)) - .then((result) => { - expect(result.exists('sub/file1')).toBe(true); - expect(result.exists('sub/file2')).toBe(true); - expect(result.exists('a/c/file3')).toBe(true); - }) - .then(done, done.fail); + const result = await lastValueFrom(callRule(move('a/b', 'sub'), observableOf(tree), context)); + expect(result.exists('sub/file1')).toBe(true); + expect(result.exists('sub/file2')).toBe(true); + expect(result.exists('a/c/file3')).toBe(true); }); - it('works on moving a directory into a subdirectory of itself', (done) => { + it('works on moving a directory into a subdirectory of itself', async () => { const tree = new HostTree(); tree.create('a/b/file1', 'hello world'); tree.create('a/b/file2', 'hello world'); tree.create('a/c/file3', 'hello world'); - lastValueFrom(callRule(move('a/b', 'a/b/c'), observableOf(tree), context)) - .then((result) => { - expect(result.exists('a/b/c/file1')).toBe(true); - expect(result.exists('a/b/c/file2')).toBe(true); - expect(result.exists('a/c/file3')).toBe(true); - }) - .then(done, done.fail); + const result = await lastValueFrom(callRule(move('a/b', 'a/b/c'), observableOf(tree), context)); + expect(result.exists('a/b/c/file1')).toBe(true); + expect(result.exists('a/b/c/file2')).toBe(true); + expect(result.exists('a/c/file3')).toBe(true); }); - it('works on moving a directory into a parent of itself', (done) => { + it('works on moving a directory into a parent of itself', async () => { const tree = new HostTree(); tree.create('a/b/file1', 'hello world'); tree.create('a/b/file2', 'hello world'); tree.create('a/c/file3', 'hello world'); - lastValueFrom(callRule(move('a/b', 'a'), observableOf(tree), context)) - .then((result) => { - expect(result.exists('file1')).toBe(false); - expect(result.exists('file2')).toBe(false); - expect(result.exists('a/file1')).toBe(true); - expect(result.exists('a/file2')).toBe(true); - expect(result.exists('a/c/file3')).toBe(true); - }) - .then(done, done.fail); + const result = await lastValueFrom(callRule(move('a/b', 'a'), observableOf(tree), context)); + expect(result.exists('file1')).toBe(false); + expect(result.exists('file2')).toBe(false); + expect(result.exists('a/file1')).toBe(true); + expect(result.exists('a/file2')).toBe(true); + expect(result.exists('a/c/file3')).toBe(true); }); - it('becomes a noop with identical from and to', (done) => { + it('becomes a noop with identical from and to', async () => { const tree = new HostTree(); tree.create('a/b/file1', 'hello world'); tree.create('a/b/file2', 'hello world'); tree.create('a/c/file3', 'hello world'); - lastValueFrom(callRule(move(''), observableOf(tree), context)) - .then((result) => { - expect(result.exists('a/b/file1')).toBe(true); - expect(result.exists('a/b/file2')).toBe(true); - expect(result.exists('a/c/file3')).toBe(true); - }) - .then(done, done.fail); + const result = await lastValueFrom(callRule(move(''), observableOf(tree), context)); + expect(result.exists('a/b/file1')).toBe(true); + expect(result.exists('a/b/file2')).toBe(true); + expect(result.exists('a/c/file3')).toBe(true); }); }); diff --git a/packages/angular_devkit/schematics/src/rules/template_spec.ts b/packages/angular_devkit/schematics/src/rules/template_spec.ts index 076550e6f043..1833d8e7f37c 100644 --- a/packages/angular_devkit/schematics/src/rules/template_spec.ts +++ b/packages/angular_devkit/schematics/src/rules/template_spec.ts @@ -174,7 +174,7 @@ describe('contentTemplate', () => { }); describe('applyTemplateFiles', () => { - it('works with template files exclusively', (done) => { + it('works with template files exclusively', async () => { const tree = new UnitTestTree(new HostTree()); tree.create('a/b/file1', 'hello world'); tree.create('a/b/file2', 'hello world'); @@ -188,20 +188,16 @@ describe('applyTemplateFiles', () => { } as SchematicContext; // Rename all files that contain 'b' to 'hello'. - callRule(applyTemplates({ a: 'foo' }), observableOf(tree), context) - .toPromise() - .then(() => { - expect([...tree.files].sort()).toEqual([ - '/a/b/file1', - '/a/b/file2', - '/a/b/file3', - '/a/b/file__norename__', - '/a/b/filefoo', - '/a/c/file4', - ]); - - expect(tree.readContent('/a/b/file3')).toBe('hello 1 world'); - }) - .then(done, done.fail); + await callRule(applyTemplates({ a: 'foo' }), observableOf(tree), context).toPromise(); + + expect([...tree.files].sort()).toEqual([ + '/a/b/file1', + '/a/b/file2', + '/a/b/file3', + '/a/b/file__norename__', + '/a/b/filefoo', + '/a/c/file4', + ]); + expect(tree.readContent('/a/b/file3')).toBe('hello 1 world'); }); }); diff --git a/packages/angular_devkit/schematics/src/sink/host_spec.ts b/packages/angular_devkit/schematics/src/sink/host_spec.ts index 9a89b82af91d..55d92bea7e7f 100644 --- a/packages/angular_devkit/schematics/src/sink/host_spec.ts +++ b/packages/angular_devkit/schematics/src/sink/host_spec.ts @@ -11,7 +11,7 @@ import { HostCreateTree, HostTree } from '../tree/host-tree'; import { HostSink } from './host'; describe('FileSystemSink', () => { - it('works', (done) => { + it('works', async () => { const host = new virtualFs.test.TestHost({ '/hello': 'world', '/sub/directory/file2': '', @@ -32,19 +32,14 @@ describe('FileSystemSink', () => { const outputHost = new virtualFs.test.TestHost(); const sink = new HostSink(outputHost); - sink - .commit(tree) - .toPromise() - .then(() => { - const tmpFiles = outputHost.files.sort(); - expect(tmpFiles as string[]).toEqual(files); - expect(outputHost.sync.read(normalize('/test')).toString()).toBe('testing testing 1 2'); - }) - .then(done, done.fail); + await sink.commit(tree).toPromise(); + const tmpFiles = outputHost.files.sort(); + expect(tmpFiles as string[]).toEqual(files); + expect(outputHost.sync.read(normalize('/test')).toString()).toBe('testing testing 1 2'); }); describe('complex tests', () => { - beforeEach((done) => { + beforeEach(async () => { // Commit a version of the tree. const host = new virtualFs.test.TestHost({ '/file0': '/file0', @@ -55,10 +50,10 @@ describe('FileSystemSink', () => { const outputHost = new virtualFs.test.TestHost(); const sink = new HostSink(outputHost); - sink.commit(tree).toPromise().then(done, done.fail); + await sink.commit(tree).toPromise(); }); - it('can rename files', (done) => { + it('can rename files', async () => { const host = new virtualFs.test.TestHost({ '/file0': '/file0', }); @@ -66,17 +61,12 @@ describe('FileSystemSink', () => { tree.rename('/file0', '/file1'); const sink = new HostSink(host); - sink - .commit(tree) - .toPromise() - .then(() => { - expect(host.sync.exists(normalize('/file0'))).toBe(false); - expect(host.sync.exists(normalize('/file1'))).toBe(true); - }) - .then(done, done.fail); + await sink.commit(tree).toPromise(); + expect(host.sync.exists(normalize('/file0'))).toBe(false); + expect(host.sync.exists(normalize('/file1'))).toBe(true); }); - it('can rename nested files', (done) => { + it('can rename nested files', async () => { const host = new virtualFs.test.TestHost({ '/sub/directory/file2': '', }); @@ -84,17 +74,12 @@ describe('FileSystemSink', () => { tree.rename('/sub/directory/file2', '/another-directory/file2'); const sink = new HostSink(host); - sink - .commit(tree) - .toPromise() - .then(() => { - expect(host.sync.exists(normalize('/sub/directory/file2'))).toBe(false); - expect(host.sync.exists(normalize('/another-directory/file2'))).toBe(true); - }) - .then(done, done.fail); + await sink.commit(tree).toPromise(); + expect(host.sync.exists(normalize('/sub/directory/file2'))).toBe(false); + expect(host.sync.exists(normalize('/another-directory/file2'))).toBe(true); }); - it('can delete and create the same file', (done) => { + it('can delete and create the same file', async () => { const host = new virtualFs.test.TestHost({ '/file0': 'world', }); @@ -103,16 +88,11 @@ describe('FileSystemSink', () => { tree.create('/file0', 'hello'); const sink = new HostSink(host); - sink - .commit(tree) - .toPromise() - .then(() => { - expect(host.sync.read(normalize('/file0')).toString()).toBe('hello'); - }) - .then(done, done.fail); + await sink.commit(tree).toPromise(); + expect(host.sync.read(normalize('/file0')).toString()).toBe('hello'); }); - it('can rename then create the same file', (done) => { + it('can rename then create the same file', async () => { const host = new virtualFs.test.TestHost({ '/file0': 'world', }); @@ -126,14 +106,9 @@ describe('FileSystemSink', () => { expect(tree.exists('/file0')).toBeTruthy(); const sink = new HostSink(host); - sink - .commit(tree) - .toPromise() - .then(() => { - expect(host.sync.read(normalize('/file0')).toString()).toBe('hello'); - expect(virtualFs.fileBufferToString(host.sync.read(normalize('/file1')))).toBe('world'); - }) - .then(done, done.fail); + await sink.commit(tree).toPromise(); + expect(host.sync.read(normalize('/file0')).toString()).toBe('hello'); + expect(virtualFs.fileBufferToString(host.sync.read(normalize('/file1')))).toBe('world'); }); it('can rename then modify the same file', async () => { diff --git a/packages/angular_devkit/schematics/src/tree/host-tree.ts b/packages/angular_devkit/schematics/src/tree/host-tree.ts index 9e275052391f..8f9d793a31a9 100644 --- a/packages/angular_devkit/schematics/src/tree/host-tree.ts +++ b/packages/angular_devkit/schematics/src/tree/host-tree.ts @@ -313,7 +313,7 @@ export class HostTree implements Tree { e instanceof TypeError || (e as NodeJS.ErrnoException).code === 'ERR_ENCODING_INVALID_ENCODED_DATA' ) { - throw new Error(`Failed to decode "${path}" as UTF-8 text.`); + throw new Error(`Failed to decode "${path}" as UTF-8 text.`, { cause: e }); } throw e; } diff --git a/packages/angular_devkit/schematics/src/tree/recorder.ts b/packages/angular_devkit/schematics/src/tree/recorder.ts index d7853b5d136f..7ed047c9aa11 100644 --- a/packages/angular_devkit/schematics/src/tree/recorder.ts +++ b/packages/angular_devkit/schematics/src/tree/recorder.ts @@ -32,7 +32,7 @@ export class UpdateRecorderBase implements UpdateRecorder { text = new TextDecoder(encoding, { fatal: true, ignoreBOM: false }).decode(data); } catch (e) { if (e instanceof TypeError) { - throw new Error(`Failed to decode "${path}" as ${encoding} text.`); + throw new Error(`Failed to decode "${path}" as ${encoding} text.`, { cause: e }); } throw e; diff --git a/packages/angular_devkit/schematics/tasks/repo-init/executor.ts b/packages/angular_devkit/schematics/tasks/repo-init/executor.ts index 97b2b12a3619..607e1bfc5cba 100644 --- a/packages/angular_devkit/schematics/tasks/repo-init/executor.ts +++ b/packages/angular_devkit/schematics/tasks/repo-init/executor.ts @@ -29,7 +29,6 @@ export default function ( const errorStream = ignoreErrorStream ? 'ignore' : process.stderr; const spawnOptions: SpawnOptions = { stdio: [process.stdin, outputStream, errorStream], - shell: true, cwd: path.join(rootDirectory, options.workingDirectory || ''), env: { ...process.env, @@ -41,7 +40,7 @@ export default function ( }; return new Promise((resolve, reject) => { - spawn(`git ${args.join(' ')}`, spawnOptions).on('close', (code: number) => { + spawn('git', args, spawnOptions).on('close', (code: number) => { if (code === 0) { resolve(); } else { @@ -82,7 +81,7 @@ export default function ( if (options.commit) { const message = options.message || 'initial commit'; - await execute(['commit', `-m "${message}"`]); + await execute(['commit', '-m', message]); } context.logger.info('Successfully initialized git.'); diff --git a/packages/angular_devkit/schematics/tools/file-system-engine-host_spec.ts b/packages/angular_devkit/schematics/tools/file-system-engine-host_spec.ts index 3d785563e663..c3ad3af40c5b 100644 --- a/packages/angular_devkit/schematics/tools/file-system-engine-host_spec.ts +++ b/packages/angular_devkit/schematics/tools/file-system-engine-host_spec.ts @@ -297,7 +297,7 @@ describe('FileSystemEngineHost', () => { expect(() => collection.createSchematic('private-schematic')).toThrow(); }); - it('allows extra properties on schema', (done) => { + it('allows extra properties on schema', async () => { const engineHost = new FileSystemEngineHost(root); const engine = new SchematicEngine(engineHost); const host = new virtualFs.test.TestHost(); @@ -305,17 +305,12 @@ describe('FileSystemEngineHost', () => { const collection = engine.createCollection('extra-properties'); const schematic = collection.createSchematic('schematic1'); - lastValueFrom(schematic.call({}, observableOf(new HostTree(host)))) - .then((tree) => { - return lastValueFrom(new HostSink(host).commit(tree)); - }) - .then(() => { - expect(host.files as string[]).toEqual(['/extra-schematic']); - expect(host.sync.read(normalize('/extra-schematic')).toString()).toEqual( - 'extra-collection', - ); - }) - .then(done, done.fail); + await lastValueFrom(schematic.call({}, observableOf(new HostTree(host)))).then((tree) => { + return lastValueFrom(new HostSink(host).commit(tree)); + }); + + expect(host.files as string[]).toEqual(['/extra-schematic']); + expect(host.sync.read(normalize('/extra-schematic')).toString()).toEqual('extra-collection'); }); it('discovers a file-based task', () => { diff --git a/packages/angular_devkit/schematics/tools/workflow/node-workflow_spec.ts b/packages/angular_devkit/schematics/tools/workflow/node-workflow_spec.ts index 3d19f401c82b..d5ad2ff6bb25 100644 --- a/packages/angular_devkit/schematics/tools/workflow/node-workflow_spec.ts +++ b/packages/angular_devkit/schematics/tools/workflow/node-workflow_spec.ts @@ -13,17 +13,16 @@ import { NodeWorkflow } from './node-workflow'; describe('NodeWorkflow', () => { // TODO: this test seems to either not work on windows or on linux. - xit('works', (done) => { + xit('works', async () => { const workflow = new NodeWorkflow(new NodeJsSyncHost(), { dryRun: true }); const collection = path.join(__dirname, '../../../../schematics/angular/package.json'); - workflow + await workflow .execute({ collection, schematic: 'ng-new', options: { name: 'workflow-test', version: '6.0.0-rc.4' }, }) - .toPromise() - .then(done, done.fail); + .toPromise(); }); }); diff --git a/packages/angular_devkit/schematics_cli/blank/project-files/package.json b/packages/angular_devkit/schematics_cli/blank/project-files/package.json index 1a912351a9b9..88693af94a7c 100644 --- a/packages/angular_devkit/schematics_cli/blank/project-files/package.json +++ b/packages/angular_devkit/schematics_cli/blank/project-files/package.json @@ -15,7 +15,7 @@ "dependencies": { "@angular-devkit/core": "^<%= coreVersion %>", "@angular-devkit/schematics": "^<%= schematicsVersion %>", - "typescript": "~5.9.2" + "typescript": "~6.0.2" }, "devDependencies": { "@types/node": "^20.17.19", diff --git a/packages/angular_devkit/schematics_cli/blank/project-files/tsconfig.json b/packages/angular_devkit/schematics_cli/blank/project-files/tsconfig.json index 75cf15fa8e3c..99391a4f8038 100644 --- a/packages/angular_devkit/schematics_cli/blank/project-files/tsconfig.json +++ b/packages/angular_devkit/schematics_cli/blank/project-files/tsconfig.json @@ -1,10 +1,9 @@ { "compilerOptions": { - "baseUrl": "tsconfig", "lib": ["es2018", "dom"], "declaration": true, - "module": "commonjs", - "moduleResolution": "node", + "module": "node16", + "moduleResolution": "node16", "noEmitOnError": true, "noFallthroughCasesInSwitch": true, "noImplicitAny": true, diff --git a/packages/angular_devkit/schematics_cli/package.json b/packages/angular_devkit/schematics_cli/package.json index 0b49edc35c55..dbdeeab43501 100644 --- a/packages/angular_devkit/schematics_cli/package.json +++ b/packages/angular_devkit/schematics_cli/package.json @@ -4,7 +4,7 @@ "description": "Angular Schematics - CLI", "homepage": "https://github.com/angular/angular-cli", "bin": { - "schematics": "./bin/schematics.js" + "schematics": "bin/schematics.js" }, "keywords": [ "blueprints", @@ -18,6 +18,6 @@ "dependencies": { "@angular-devkit/core": "workspace:0.0.0-PLACEHOLDER", "@angular-devkit/schematics": "workspace:0.0.0-PLACEHOLDER", - "@inquirer/prompts": "7.10.1" + "@inquirer/prompts": "8.3.2" } } diff --git a/packages/angular_devkit/schematics_cli/schematic/files/package.json b/packages/angular_devkit/schematics_cli/schematic/files/package.json index c990dcb47ad4..c2aff5195638 100644 --- a/packages/angular_devkit/schematics_cli/schematic/files/package.json +++ b/packages/angular_devkit/schematics_cli/schematic/files/package.json @@ -19,7 +19,7 @@ "devDependencies": { "@types/node": "^20.17.19", "@types/jasmine": "~6.0.0", - "jasmine": "~6.0.0", - "typescript": "~5.9.2" + "jasmine": "~6.1.0", + "typescript": "~6.0.2" } } diff --git a/packages/angular_devkit/schematics_cli/schematic/files/tsconfig.json b/packages/angular_devkit/schematics_cli/schematic/files/tsconfig.json index ae3b3e55e6a3..db277e5fa543 100644 --- a/packages/angular_devkit/schematics_cli/schematic/files/tsconfig.json +++ b/packages/angular_devkit/schematics_cli/schematic/files/tsconfig.json @@ -1,9 +1,8 @@ { "compilerOptions": { - "baseUrl": "tsconfig", "lib": ["es2018", "dom"], "module": "commonjs", - "moduleResolution": "node", + "moduleResolution": "bundler", "noEmitOnError": true, "noFallthroughCasesInSwitch": true, "noImplicitAny": true, diff --git a/packages/angular_devkit/schematics_cli/test/BUILD.bazel b/packages/angular_devkit/schematics_cli/test/BUILD.bazel index 29eb34e8b7ea..b2ab6ee89d12 100644 --- a/packages/angular_devkit/schematics_cli/test/BUILD.bazel +++ b/packages/angular_devkit/schematics_cli/test/BUILD.bazel @@ -17,7 +17,6 @@ npm_link_package( name = "node_modules/@angular-devkit/schematics-cli", src = "//packages/angular_devkit/schematics_cli:pkg", package = "@angular-devkit/schematics-cli", - root_package = package_name(), ) jasmine_test( diff --git a/packages/ngtools/webpack/package.json b/packages/ngtools/webpack/package.json index ef531d078cea..4bb8e257421d 100644 --- a/packages/ngtools/webpack/package.json +++ b/packages/ngtools/webpack/package.json @@ -13,7 +13,7 @@ ], "repository": { "type": "git", - "url": "https://github.com/angular/angular-cli.git" + "url": "git+https://github.com/angular/angular-cli.git" }, "author": "angular", "bugs": { @@ -22,14 +22,14 @@ "homepage": "https://github.com/angular/angular-cli/tree/main/packages/ngtools/webpack", "peerDependencies": { "@angular/compiler-cli": "0.0.0-ANGULAR-FW-PEER-DEP", - "typescript": ">=5.9 <6.0", + "typescript": ">=5.9 <6.1", "webpack": "^5.54.0" }, "devDependencies": { "@angular-devkit/core": "workspace:0.0.0-PLACEHOLDER", - "@angular/compiler": "21.2.0-next.3", - "@angular/compiler-cli": "21.2.0-next.3", - "typescript": "5.9.3", - "webpack": "5.105.2" + "@angular/compiler": "22.0.0-next.6", + "@angular/compiler-cli": "22.0.0-next.6", + "typescript": "6.0.2", + "webpack": "5.105.4" } } diff --git a/packages/ngtools/webpack/src/paths-plugin.ts b/packages/ngtools/webpack/src/paths-plugin.ts index 612d70d4ad6e..063c96120d18 100644 --- a/packages/ngtools/webpack/src/paths-plugin.ts +++ b/packages/ngtools/webpack/src/paths-plugin.ts @@ -45,7 +45,7 @@ export class TypeScriptPathsPlugin { * @param options The `paths` and `baseUrl` options from TypeScript's `CompilerOptions`. */ update(options: TypeScriptPathsPluginOptions): void { - this.baseUrl = options.baseUrl; + this.baseUrl = options.baseUrl ?? (options as Record)['pathsBasePath']; this.patterns = undefined; if (options.paths) { diff --git a/packages/ngtools/webpack/src/transformers/elide_imports_spec.ts b/packages/ngtools/webpack/src/transformers/elide_imports_spec.ts index 9bbcb4a78207..92d28e46d8cd 100644 --- a/packages/ngtools/webpack/src/transformers/elide_imports_spec.ts +++ b/packages/ngtools/webpack/src/transformers/elide_imports_spec.ts @@ -12,63 +12,62 @@ import * as ts from 'typescript'; import { elideImports } from './elide_imports'; import { createTypescriptContext, transformTypescript } from './spec_helpers'; -describe('@ngtools/webpack transformers', () => { - describe('elide_imports', () => { - const dummyNode = `const remove = ''`; - - // Transformer that removes the last node and then elides unused imports - const transformer = (program: ts.Program) => { - return (context: ts.TransformationContext) => { - return (sourceFile: ts.SourceFile) => { - const lastNode = sourceFile.statements[sourceFile.statements.length - 1]; - const updatedSourceFile = context.factory.updateSourceFile( - sourceFile, - ts.setTextRange( - context.factory.createNodeArray(sourceFile.statements.slice(0, -1)), - sourceFile.statements, - ), - ); +describe('elide_imports', () => { + const dummyNode = `const remove = ''`; + + // Transformer that removes the last node and then elides unused imports + const transformer = (program: ts.Program) => { + return (context: ts.TransformationContext) => { + return (sourceFile: ts.SourceFile) => { + const lastNode = sourceFile.statements[sourceFile.statements.length - 1]; + const updatedSourceFile = context.factory.updateSourceFile( + sourceFile, + ts.setTextRange( + context.factory.createNodeArray(sourceFile.statements.slice(0, -1)), + sourceFile.statements, + ), + ); - const importRemovals = elideImports( + const importRemovals = elideImports( + updatedSourceFile, + [lastNode], + () => program.getTypeChecker(), + context.getCompilerOptions(), + ); + if (importRemovals.size > 0) { + return ts.visitEachChild( updatedSourceFile, - [lastNode], - () => program.getTypeChecker(), - context.getCompilerOptions(), + function visitForRemoval(node): ts.Node | undefined { + return importRemovals.has(node) + ? undefined + : ts.visitEachChild(node, visitForRemoval, context); + }, + context, ); - if (importRemovals.size > 0) { - return ts.visitEachChild( - updatedSourceFile, - function visitForRemoval(node): ts.Node | undefined { - return importRemovals.has(node) - ? undefined - : ts.visitEachChild(node, visitForRemoval, context); - }, - context, - ); - } + } - return updatedSourceFile; - }; + return updatedSourceFile; }; }; + }; - const additionalFiles: Record = { - 'const.ts': ` + const additionalFiles: Record = { + 'const.ts': ` export const animations = []; export const promise = () => null; export const take = () => null; export default promise; `, - 'decorator.ts': ` + 'decorator.ts': ` export function Decorator(value?: any): any { return function (): any { }; } `, - 'service.ts': ` + 'service.ts': ` export class Service { } export class Service2 { } `, - 'type.ts': ` + 'type.ts': ` export interface OnChanges { ngOnChanges(changes: SimpleChanges): void; } @@ -77,252 +76,252 @@ describe('@ngtools/webpack transformers', () => { [propName: string]: unknown; } `, - 'jsx.ts': ` + 'jsx.ts': ` export function createElement() {} `, - }; + }; - it('should remove unused imports', () => { - const input = tags.stripIndent` + it('should remove unused imports', () => { + const input = tags.stripIndent` import { promise } from './const'; import { take } from './const'; const unused = promise; `; - const { program, compilerHost } = createTypescriptContext(input, additionalFiles); - const result = transformTypescript(undefined, [transformer(program)], program, compilerHost); + const { program, compilerHost } = createTypescriptContext(input, additionalFiles); + const result = transformTypescript(undefined, [transformer(program)], program, compilerHost); - expect(tags.oneLine`${result}`).toEqual('export {};'); - }); + expect(tags.oneLine`${result}`).toEqual('export {};'); + }); - it('should remove unused aliased imports', () => { - const input = tags.stripIndent` + it('should remove unused aliased imports', () => { + const input = tags.stripIndent` import { promise as fromPromise } from './const'; const unused = fromPromise; `; - const { program, compilerHost } = createTypescriptContext(input, additionalFiles); - const result = transformTypescript(undefined, [transformer(program)], program, compilerHost); + const { program, compilerHost } = createTypescriptContext(input, additionalFiles); + const result = transformTypescript(undefined, [transformer(program)], program, compilerHost); - expect(tags.oneLine`${result}`).toEqual('export {};'); - }); + expect(tags.oneLine`${result}`).toEqual('export {};'); + }); - it('should retain used aliased imports', () => { - const input = tags.stripIndent` + it('should retain used aliased imports', () => { + const input = tags.stripIndent` import { promise as fromPromise } from './const'; const used = fromPromise; ${dummyNode} `; - const output = tags.stripIndent` + const output = tags.stripIndent` import { promise as fromPromise } from './const'; const used = fromPromise; `; - const { program, compilerHost } = createTypescriptContext(input, additionalFiles); - const result = transformTypescript(undefined, [transformer(program)], program, compilerHost); + const { program, compilerHost } = createTypescriptContext(input, additionalFiles); + const result = transformTypescript(undefined, [transformer(program)], program, compilerHost); - expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); - }); + expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); + }); - it('should retain used namespaced imports', () => { - const input = tags.stripIndent` + it('should retain used namespaced imports', () => { + const input = tags.stripIndent` import * as namespaced from './const'; const used = namespaced; ${dummyNode} `; - const output = tags.stripIndent` + const output = tags.stripIndent` import * as namespaced from './const'; const used = namespaced; `; - const { program, compilerHost } = createTypescriptContext(input, additionalFiles); - const result = transformTypescript(undefined, [transformer(program)], program, compilerHost); + const { program, compilerHost } = createTypescriptContext(input, additionalFiles); + const result = transformTypescript(undefined, [transformer(program)], program, compilerHost); - expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); - }); + expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); + }); - it('should drop unused namespaced imports', () => { - const input = tags.stripIndent` + it('should drop unused namespaced imports', () => { + const input = tags.stripIndent` import * as namespaced from './const'; const used = namespaced; `; - const { program, compilerHost } = createTypescriptContext(input, additionalFiles); - const result = transformTypescript(undefined, [transformer(program)], program, compilerHost); + const { program, compilerHost } = createTypescriptContext(input, additionalFiles); + const result = transformTypescript(undefined, [transformer(program)], program, compilerHost); - expect(tags.oneLine`${result}`).toEqual('export {};'); - }); + expect(tags.oneLine`${result}`).toEqual('export {};'); + }); - it('should drop unused imports in export specifier', () => { - const input = tags.stripIndent` + it('should drop unused imports in export specifier', () => { + const input = tags.stripIndent` import { promise as fromPromise } from './const'; export { fromPromise }; `; - const { program, compilerHost } = createTypescriptContext(input, additionalFiles); - const result = transformTypescript(undefined, [transformer(program)], program, compilerHost); + const { program, compilerHost } = createTypescriptContext(input, additionalFiles); + const result = transformTypescript(undefined, [transformer(program)], program, compilerHost); - expect(tags.oneLine`${result}`).toEqual('export {};'); - }); + expect(tags.oneLine`${result}`).toEqual('export {};'); + }); - it('should retain used imports in export specifier', () => { - const input = tags.stripIndent` + it('should retain used imports in export specifier', () => { + const input = tags.stripIndent` import { promise as fromPromise } from './const'; export { fromPromise }; ${dummyNode} `; - const output = tags.stripIndent` + const output = tags.stripIndent` import { promise as fromPromise } from './const'; export { fromPromise }; `; - const { program, compilerHost } = createTypescriptContext(input, additionalFiles); - const result = transformTypescript(undefined, [transformer(program)], program, compilerHost); + const { program, compilerHost } = createTypescriptContext(input, additionalFiles); + const result = transformTypescript(undefined, [transformer(program)], program, compilerHost); - expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); - }); + expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); + }); - it('should drop unused in shorthand property assignment', () => { - const input = tags.stripIndent` + it('should drop unused in shorthand property assignment', () => { + const input = tags.stripIndent` import { promise as fromPromise } from './const'; const unused = { fromPromise }; `; - const { program, compilerHost } = createTypescriptContext(input, additionalFiles); - const result = transformTypescript(undefined, [transformer(program)], program, compilerHost); + const { program, compilerHost } = createTypescriptContext(input, additionalFiles); + const result = transformTypescript(undefined, [transformer(program)], program, compilerHost); - expect(tags.oneLine`${result}`).toEqual('export {};'); - }); + expect(tags.oneLine`${result}`).toEqual('export {};'); + }); - it('should retain used imports in shorthand property assignment', () => { - const input = tags.stripIndent` + it('should retain used imports in shorthand property assignment', () => { + const input = tags.stripIndent` import { promise as fromPromise } from './const'; const used = { fromPromise }; ${dummyNode} `; - const output = tags.stripIndent` + const output = tags.stripIndent` import { promise as fromPromise } from './const'; const used = { fromPromise }; `; - const { program, compilerHost } = createTypescriptContext(input, additionalFiles); - const result = transformTypescript(undefined, [transformer(program)], program, compilerHost); + const { program, compilerHost } = createTypescriptContext(input, additionalFiles); + const result = transformTypescript(undefined, [transformer(program)], program, compilerHost); - expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); - }); + expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); + }); - it('should drop unused default import', () => { - const input = tags.stripIndent` + it('should drop unused default import', () => { + const input = tags.stripIndent` import defaultPromise from './const'; const unused = defaultPromise; `; - const { program, compilerHost } = createTypescriptContext(input, additionalFiles); - const result = transformTypescript(undefined, [transformer(program)], program, compilerHost); + const { program, compilerHost } = createTypescriptContext(input, additionalFiles); + const result = transformTypescript(undefined, [transformer(program)], program, compilerHost); - expect(tags.oneLine`${result}`).toEqual('export {};'); - }); + expect(tags.oneLine`${result}`).toEqual('export {};'); + }); - it('should retain used default import', () => { - const input = tags.stripIndent` + it('should retain used default import', () => { + const input = tags.stripIndent` import defaultPromise from './const'; const used = defaultPromise; ${dummyNode} `; - const output = tags.stripIndent` + const output = tags.stripIndent` import defaultPromise from './const'; const used = defaultPromise; `; - const { program, compilerHost } = createTypescriptContext(input, additionalFiles); - const result = transformTypescript(undefined, [transformer(program)], program, compilerHost); + const { program, compilerHost } = createTypescriptContext(input, additionalFiles); + const result = transformTypescript(undefined, [transformer(program)], program, compilerHost); - expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); - }); + expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); + }); - it('should only drop unused default imports when named and default (1)', () => { - const input = tags.stripIndent` + it('should only drop unused default imports when named and default (1)', () => { + const input = tags.stripIndent` import promise, { promise as fromPromise } from './const'; const used = fromPromise; const unused = promise; `; - const output = tags.stripIndent` + const output = tags.stripIndent` import { promise as fromPromise } from './const'; const used = fromPromise; `; - const { program, compilerHost } = createTypescriptContext(input, additionalFiles); - const result = transformTypescript(undefined, [transformer(program)], program, compilerHost); + const { program, compilerHost } = createTypescriptContext(input, additionalFiles); + const result = transformTypescript(undefined, [transformer(program)], program, compilerHost); - expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); - }); + expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); + }); - it('should only drop unused named imports when named and default (2)', () => { - const input = tags.stripIndent` + it('should only drop unused named imports when named and default (2)', () => { + const input = tags.stripIndent` import promise, { promise as fromPromise, take } from './const'; const used = fromPromise; const unused = promise; `; - const output = tags.stripIndent` + const output = tags.stripIndent` import { promise as fromPromise } from './const'; const used = fromPromise; `; - const { program, compilerHost } = createTypescriptContext(input, additionalFiles); - const result = transformTypescript(undefined, [transformer(program)], program, compilerHost); + const { program, compilerHost } = createTypescriptContext(input, additionalFiles); + const result = transformTypescript(undefined, [transformer(program)], program, compilerHost); - expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); - }); + expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); + }); - it('should only drop default imports when having named and default (3)', () => { - const input = tags.stripIndent` + it('should only drop default imports when having named and default (3)', () => { + const input = tags.stripIndent` import promise, { promise as fromPromise } from './const'; const used = promise; const unused = fromPromise; `; - const output = tags.stripIndent` + const output = tags.stripIndent` import promise from './const'; const used = promise; `; - const { program, compilerHost } = createTypescriptContext(input, additionalFiles); - const result = transformTypescript(undefined, [transformer(program)], program, compilerHost); + const { program, compilerHost } = createTypescriptContext(input, additionalFiles); + const result = transformTypescript(undefined, [transformer(program)], program, compilerHost); - expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); - }); + expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); + }); - it('should retain import clause', () => { - const input = tags.stripIndent` + it('should retain import clause', () => { + const input = tags.stripIndent` import './const'; ${dummyNode} `; - const output = tags.stripIndent` + const output = tags.stripIndent` import './const'; `; - const { program, compilerHost } = createTypescriptContext(input, additionalFiles); - const result = transformTypescript(undefined, [transformer(program)], program, compilerHost); + const { program, compilerHost } = createTypescriptContext(input, additionalFiles); + const result = transformTypescript(undefined, [transformer(program)], program, compilerHost); - expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); - }); + expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); + }); - it(`should remove import for 'ExpressionWithTypeArguments' implements token`, () => { - const input = tags.stripIndent` + it(`should remove import for 'ExpressionWithTypeArguments' implements token`, () => { + const input = tags.stripIndent` import { Bar, Buz, Unused } from './bar'; export class Foo extends Bar implements Buz { } @@ -330,26 +329,26 @@ describe('@ngtools/webpack transformers', () => { ${dummyNode} `; - const output = tags.stripIndent` + const output = tags.stripIndent` import { Bar } from './bar'; export class Foo extends Bar { } `; - const { program, compilerHost } = createTypescriptContext(input); - const result = transformTypescript(undefined, [transformer(program)], program, compilerHost); + const { program, compilerHost } = createTypescriptContext(input); + const result = transformTypescript(undefined, [transformer(program)], program, compilerHost); - expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); - }); + expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); + }); - describe('should elide imports decorator type references when emitDecoratorMetadata is false', () => { - const extraCompilerOptions: ts.CompilerOptions = { - emitDecoratorMetadata: false, - experimentalDecorators: true, - }; + describe('should elide imports decorator type references when emitDecoratorMetadata is false', () => { + const extraCompilerOptions: ts.CompilerOptions = { + emitDecoratorMetadata: false, + experimentalDecorators: true, + }; - it('should remove ctor parameter type reference', () => { - const input = tags.stripIndent` + it('should remove ctor parameter type reference', () => { + const input = tags.stripIndent` import { Decorator } from './decorator'; import { Service } from './service'; @@ -362,7 +361,7 @@ describe('@ngtools/webpack transformers', () => { ${dummyNode} `; - const output = tags.stripIndent` + const output = tags.stripIndent` import { __decorate } from "tslib"; import { Decorator } from './decorator'; @@ -371,24 +370,19 @@ describe('@ngtools/webpack transformers', () => { export { Foo }; `; - const { program, compilerHost } = createTypescriptContext( - input, - additionalFiles, - true, - extraCompilerOptions, - ); - const result = transformTypescript( - undefined, - [transformer(program)], - program, - compilerHost, - ); + const { program, compilerHost } = createTypescriptContext( + input, + additionalFiles, + true, + extraCompilerOptions, + ); + const result = transformTypescript(undefined, [transformer(program)], program, compilerHost); - expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); - }); + expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); + }); - it('should remove ctor parameter type reference and unused named import from same declaration', () => { - const input = tags.stripIndent` + it('should remove ctor parameter type reference and unused named import from same declaration', () => { + const input = tags.stripIndent` import { Decorator } from './decorator'; import { Service, Service2 as ServiceUnused } from './service'; @@ -401,7 +395,7 @@ describe('@ngtools/webpack transformers', () => { ${dummyNode} `; - const output = tags.stripIndent` + const output = tags.stripIndent` import { __decorate } from "tslib"; import { Decorator } from './decorator'; @@ -410,31 +404,28 @@ describe('@ngtools/webpack transformers', () => { export { Foo }; `; - const { program, compilerHost } = createTypescriptContext( - input, - additionalFiles, - true, - extraCompilerOptions, - ); - const result = transformTypescript( - undefined, - [transformer(program)], - program, - compilerHost, - ); + const { program, compilerHost } = createTypescriptContext( + input, + additionalFiles, + true, + extraCompilerOptions, + ); + const result = transformTypescript(undefined, [transformer(program)], program, compilerHost); - expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); - }); + expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); }); + }); - it('keeps jsxFactory imports when configured', () => { - const extraCompilerOptions: ts.CompilerOptions = { - jsxFactory: 'createElement', - experimentalDecorators: true, - jsx: ts.JsxEmit.React, - }; + it('keeps jsxFactory imports when configured', () => { + const extraCompilerOptions: ts.CompilerOptions = { + jsxFactory: 'createElement', + experimentalDecorators: true, + jsx: ts.JsxEmit.React, + // The TS elements are implicitly `any`, because we don't include the React types. + noImplicitAny: false, + }; - const input = tags.stripIndent` + const input = tags.stripIndent` import { Decorator } from './decorator'; import { Service } from './service'; import { createElement } from './jsx'; @@ -450,7 +441,7 @@ describe('@ngtools/webpack transformers', () => { ${dummyNode} `; - const output = tags.stripIndent` + const output = tags.stripIndent` import { __decorate } from "tslib"; import { Decorator } from './decorator'; import { createElement } from './jsx'; @@ -462,26 +453,26 @@ describe('@ngtools/webpack transformers', () => { export { Foo }; `; - const { program, compilerHost } = createTypescriptContext( - input, - additionalFiles, - true, - extraCompilerOptions, - true, - ); - const result = transformTypescript(undefined, [transformer(program)], program, compilerHost); + const { program, compilerHost } = createTypescriptContext( + input, + additionalFiles, + true, + extraCompilerOptions, + true, + ); + const result = transformTypescript(undefined, [transformer(program)], program, compilerHost); - expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); - }); + expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); + }); - describe('should not elide imports decorator type references when emitDecoratorMetadata is true', () => { - const extraCompilerOptions: ts.CompilerOptions = { - emitDecoratorMetadata: true, - experimentalDecorators: true, - }; + describe('should not elide imports decorator type references when emitDecoratorMetadata is true', () => { + const extraCompilerOptions: ts.CompilerOptions = { + emitDecoratorMetadata: true, + experimentalDecorators: true, + }; - it('should elide type only named imports', () => { - const input = tags.stripIndent` + it('should elide type only named imports', () => { + const input = tags.stripIndent` import { Decorator } from './decorator'; import { type OnChanges, type SimpleChanges } from './type'; @@ -493,7 +484,7 @@ describe('@ngtools/webpack transformers', () => { ${dummyNode} `; - const output = tags.stripIndent` + const output = tags.stripIndent` import { __decorate } from "tslib"; import { Decorator } from './decorator'; @@ -502,24 +493,19 @@ describe('@ngtools/webpack transformers', () => { export { Foo }; `; - const { program, compilerHost } = createTypescriptContext( - input, - additionalFiles, - true, - extraCompilerOptions, - ); - const result = transformTypescript( - undefined, - [transformer(program)], - program, - compilerHost, - ); + const { program, compilerHost } = createTypescriptContext( + input, + additionalFiles, + true, + extraCompilerOptions, + ); + const result = transformTypescript(undefined, [transformer(program)], program, compilerHost); - expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); - }); + expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); + }); - it('should not remove ctor parameter type reference', () => { - const input = tags.stripIndent` + it('should not remove ctor parameter type reference', () => { + const input = tags.stripIndent` import { Decorator } from './decorator'; import { Service } from './service'; @@ -532,7 +518,7 @@ describe('@ngtools/webpack transformers', () => { ${dummyNode} `; - const output = tags.stripIndent` + const output = tags.stripIndent` import { __decorate, __metadata } from "tslib"; import { Decorator } from './decorator'; import { Service } from './service'; @@ -542,35 +528,30 @@ describe('@ngtools/webpack transformers', () => { export { Foo }; `; - const { program, compilerHost } = createTypescriptContext( - input, - additionalFiles, - true, - extraCompilerOptions, - ); - const result = transformTypescript( - undefined, - [transformer(program)], - program, - compilerHost, - ); + const { program, compilerHost } = createTypescriptContext( + input, + additionalFiles, + true, + extraCompilerOptions, + ); + const result = transformTypescript(undefined, [transformer(program)], program, compilerHost); - expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); - }); + expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); + }); - it('should not remove property declaration parameter type reference', () => { - const input = tags.stripIndent` + it('should not remove property declaration parameter type reference', () => { + const input = tags.stripIndent` import { Decorator } from './decorator'; import { Service } from './service'; export class Foo { - @Decorator() foo: Service; + @Decorator() foo!: Service; } ${dummyNode} `; - const output = tags.stripIndent` + const output = tags.stripIndent` import { __decorate, __metadata } from "tslib"; import { Decorator } from './decorator'; @@ -580,29 +561,24 @@ describe('@ngtools/webpack transformers', () => { __decorate([ Decorator(), __metadata("design:type", Service) ], Foo.prototype, "foo", void 0); `; - const { program, compilerHost } = createTypescriptContext( - input, - additionalFiles, - true, - extraCompilerOptions, - ); - const result = transformTypescript( - undefined, - [transformer(program)], - program, - compilerHost, - ); + const { program, compilerHost } = createTypescriptContext( + input, + additionalFiles, + true, + extraCompilerOptions, + ); + const result = transformTypescript(undefined, [transformer(program)], program, compilerHost); - expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); - }); + expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); + }); - it('should not remove set accessor parameter type reference', () => { - const input = tags.stripIndent` + it('should not remove set accessor parameter type reference', () => { + const input = tags.stripIndent` import { Decorator } from './decorator'; import { Service } from './service'; export class Foo { - _foo: Service; + _foo!: Service; @Decorator() set name(f: Service) { @@ -613,7 +589,7 @@ describe('@ngtools/webpack transformers', () => { ${dummyNode} `; - const output = tags.stripIndent` + const output = tags.stripIndent` import { __decorate, __metadata } from "tslib"; import { Decorator } from './decorator'; import { Service } from './service'; @@ -622,29 +598,24 @@ describe('@ngtools/webpack transformers', () => { __decorate([ Decorator(), __metadata("design:type", Service), __metadata("design:paramtypes", [Service]) ], Foo.prototype, "name", null); `; - const { program, compilerHost } = createTypescriptContext( - input, - additionalFiles, - true, - extraCompilerOptions, - ); - const result = transformTypescript( - undefined, - [transformer(program)], - program, - compilerHost, - ); + const { program, compilerHost } = createTypescriptContext( + input, + additionalFiles, + true, + extraCompilerOptions, + ); + const result = transformTypescript(undefined, [transformer(program)], program, compilerHost); - expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); - }); + expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); + }); - it('should not remove get accessor parameter type reference', () => { - const input = tags.stripIndent` + it('should not remove get accessor parameter type reference', () => { + const input = tags.stripIndent` import { Decorator } from './decorator'; import { Service } from './service'; export class Foo { - _foo: Service; + _foo!: Service; @Decorator() get name(): Service { @@ -655,7 +626,7 @@ describe('@ngtools/webpack transformers', () => { ${dummyNode} `; - const output = tags.stripIndent` + const output = tags.stripIndent` import { __decorate, __metadata } from "tslib"; import { Decorator } from './decorator'; import { Service } from './service'; @@ -664,38 +635,33 @@ describe('@ngtools/webpack transformers', () => { __decorate([ Decorator(), __metadata("design:type", Service), __metadata("design:paramtypes", []) ], Foo.prototype, "name", null); `; - const { program, compilerHost } = createTypescriptContext( - input, - additionalFiles, - true, - extraCompilerOptions, - ); - const result = transformTypescript( - undefined, - [transformer(program)], - program, - compilerHost, - ); + const { program, compilerHost } = createTypescriptContext( + input, + additionalFiles, + true, + extraCompilerOptions, + ); + const result = transformTypescript(undefined, [transformer(program)], program, compilerHost); - expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); - }); + expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); + }); - it('should not remove decorated method return type reference', () => { - const input = tags.stripIndent` + it('should not remove decorated method return type reference', () => { + const input = tags.stripIndent` import { Decorator } from './decorator'; import { Service } from './service'; export class Foo { @Decorator() name(): Service { - return undefined; + return undefined!; } } ${dummyNode} `; - const output = tags.stripIndent` + const output = tags.stripIndent` import { __decorate, __metadata } from "tslib"; import { Decorator } from './decorator'; import { Service } from './service'; @@ -705,24 +671,19 @@ describe('@ngtools/webpack transformers', () => { __metadata("design:paramtypes", []), __metadata("design:returntype", Service) ], Foo.prototype, "name", null); `; - const { program, compilerHost } = createTypescriptContext( - input, - additionalFiles, - true, - extraCompilerOptions, - ); - const result = transformTypescript( - undefined, - [transformer(program)], - program, - compilerHost, - ); + const { program, compilerHost } = createTypescriptContext( + input, + additionalFiles, + true, + extraCompilerOptions, + ); + const result = transformTypescript(undefined, [transformer(program)], program, compilerHost); - expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); - }); + expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); + }); - it('should not remove decorated method parameter type reference', () => { - const input = tags.stripIndent` + it('should not remove decorated method parameter type reference', () => { + const input = tags.stripIndent` import { Decorator } from './decorator'; import { Service } from './service'; @@ -735,7 +696,7 @@ describe('@ngtools/webpack transformers', () => { ${dummyNode} `; - const output = tags.stripIndent` + const output = tags.stripIndent` import { __decorate, __metadata } from "tslib"; import { Decorator } from './decorator'; @@ -747,24 +708,19 @@ describe('@ngtools/webpack transformers', () => { __metadata("design:returntype", void 0) ], Foo.prototype, "name", null); `; - const { program, compilerHost } = createTypescriptContext( - input, - additionalFiles, - true, - extraCompilerOptions, - ); - const result = transformTypescript( - undefined, - [transformer(program)], - program, - compilerHost, - ); + const { program, compilerHost } = createTypescriptContext( + input, + additionalFiles, + true, + extraCompilerOptions, + ); + const result = transformTypescript(undefined, [transformer(program)], program, compilerHost); - expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); - }); + expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); + }); - it('should remove type-only imports', () => { - const input = tags.stripIndent` + it('should remove type-only imports', () => { + const input = tags.stripIndent` import { Decorator } from './decorator'; import { Service } from './service'; import type { OnChanges, SimpleChanges } from './type'; @@ -778,7 +734,7 @@ describe('@ngtools/webpack transformers', () => { ${dummyNode} `; - const output = tags.stripIndent` + const output = tags.stripIndent` import { __decorate, __metadata } from "tslib"; import { Decorator } from './decorator'; import { Service } from './service'; @@ -791,39 +747,34 @@ describe('@ngtools/webpack transformers', () => { Foo = __decorate([ Decorator(), __metadata("design:paramtypes", [Service]) ], Foo); `; - const { program, compilerHost } = createTypescriptContext( - input, - additionalFiles, - true, - extraCompilerOptions, - ); - const result = transformTypescript( - undefined, - [transformer(program)], - program, - compilerHost, - ); - - expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); - }); + const { program, compilerHost } = createTypescriptContext( + input, + additionalFiles, + true, + extraCompilerOptions, + ); + const result = transformTypescript(undefined, [transformer(program)], program, compilerHost); - describe('NGTSC - ShorthandPropertyAssignment to PropertyAssignment', () => { - const transformShorthandPropertyAssignment = ( - context: ts.TransformationContext, - ): ts.Transformer => { - const visit: ts.Visitor = (node) => { - if (ts.isShorthandPropertyAssignment(node)) { - return ts.factory.createPropertyAssignment(node.name, node.name); - } + expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); + }); - return ts.visitEachChild(node, (child) => visit(child), context); - }; + describe('NGTSC - ShorthandPropertyAssignment to PropertyAssignment', () => { + const transformShorthandPropertyAssignment = ( + context: ts.TransformationContext, + ): ts.Transformer => { + const visit: ts.Visitor = (node) => { + if (ts.isShorthandPropertyAssignment(node)) { + return ts.factory.createPropertyAssignment(node.name, node.name); + } - return (node) => ts.visitNode(node, visit) as ts.SourceFile; + return ts.visitEachChild(node, (child) => visit(child), context); }; - it('should not elide import when ShorthandPropertyAssignment is transformed to PropertyAssignment', () => { - const input = tags.stripIndent` + return (node) => ts.visitNode(node, visit) as ts.SourceFile; + }; + + it('should not elide import when ShorthandPropertyAssignment is transformed to PropertyAssignment', () => { + const input = tags.stripIndent` import { animations } from './const'; const used = { animations @@ -832,21 +783,20 @@ describe('@ngtools/webpack transformers', () => { ${dummyNode} `; - const output = tags.stripIndent` + const output = tags.stripIndent` import { animations } from './const'; const used = { animations: animations }; `; - const { program, compilerHost } = createTypescriptContext(input, additionalFiles); - const result = transformTypescript( - undefined, - [transformShorthandPropertyAssignment, transformer(program)], - program, - compilerHost, - ); + const { program, compilerHost } = createTypescriptContext(input, additionalFiles); + const result = transformTypescript( + undefined, + [transformShorthandPropertyAssignment, transformer(program)], + program, + compilerHost, + ); - expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); - }); + expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); }); }); }); diff --git a/packages/ngtools/webpack/src/transformers/find_image_domains_spec.ts b/packages/ngtools/webpack/src/transformers/find_image_domains_spec.ts index ddb329412518..70bebf4ec15f 100644 --- a/packages/ngtools/webpack/src/transformers/find_image_domains_spec.ts +++ b/packages/ngtools/webpack/src/transformers/find_image_domains_spec.ts @@ -82,42 +82,43 @@ function inputTemplateComponent(provider: string) { `; } -function runSharedTests(template: (povider: string) => string) { - it('should find a domain when a built-in loader is used with a string-literal-like argument', () => { - // Intentionally inconsistent use of quote styles in this data structure: - const builtInLoaders: Array<[string, string]> = [ - ['provideCloudflareLoader("www.cloudflaredomain.com")', 'www.cloudflaredomain.com'], - [ - "provideCloudinaryLoader('https://www.cloudinarydomain.net')", - 'https://www.cloudinarydomain.net', - ], - ['provideImageKitLoader("www.imageKitdomain.com")', 'www.imageKitdomain.com'], - ['provideImgixLoader(`www.imgixdomain.com/images/`)', 'www.imgixdomain.com/images/'], - ]; - for (const loader of builtInLoaders) { - const input = template(loader[0]); - const result = Array.from(findDomains(input)); - expect(result.length).toBe(1); - expect(result[0]).toBe(loader[1]); - } - }); +function runSharedTests(name: string, template: (povider: string) => string) { + describe(name, () => { + it(`should find a domain when a built-in loader is used with a string-literal-like argument`, () => { + // Intentionally inconsistent use of quote styles in this data structure: + const builtInLoaders: Array<[string, string]> = [ + ['provideCloudflareLoader("www.cloudflaredomain.com")', 'www.cloudflaredomain.com'], + [ + "provideCloudinaryLoader('https://www.cloudinarydomain.net')", + 'https://www.cloudinarydomain.net', + ], + ['provideImageKitLoader("www.imageKitdomain.com")', 'www.imageKitdomain.com'], + ['provideImgixLoader(`www.imgixdomain.com/images/`)', 'www.imgixdomain.com/images/'], + ]; + for (const loader of builtInLoaders) { + const input = template(loader[0]); + const result = Array.from(findDomains(input)); + expect(result.length).toBe(1); + expect(result[0]).toBe(loader[1]); + } + }); - it('should find a domain in a custom loader function with a template literal', () => { - const customLoader = tags.stripIndent` + it(`should find a domain in a custom loader function with a template literal`, () => { + const customLoader = tags.stripIndent` { provide: IMAGE_LOADER, useValue: (config: ImageLoaderConfig) => { return ${'`https://customLoaderTemplate.com/images?src=${config.src}&width=${config.width}`'}; }, },`; - const input = template(customLoader); - const result = Array.from(findDomains(input)); - expect(result.length).toBe(1); - expect(result[0]).toBe('https://customLoaderTemplate.com/'); - }); + const input = template(customLoader); + const result = Array.from(findDomains(input)); + expect(result.length).toBe(1); + expect(result[0]).toBe('https://customLoaderTemplate.com/'); + }); - it('should find a domain when provider is alongside other providers', () => { - const customLoader = tags.stripIndent` + it('should find a domain when provider is alongside other providers', () => { + const customLoader = tags.stripIndent` { provide: SOME_OTHER_PROVIDER, useValue: (config: ImageLoaderConfig) => { @@ -137,71 +138,70 @@ function runSharedTests(template: (povider: string) => string) { return ${'`https://notacustomloadertemplate.com/images?src=${config.src}&width=${config.width}`'}; }, },`; - const input = template(customLoader); - const result = Array.from(findDomains(input)); - expect(result.length).toBe(1); - expect(result[0]).toBe('https://customloadertemplate.com/'); + const input = template(customLoader); + const result = Array.from(findDomains(input)); + expect(result.length).toBe(1); + expect(result[0]).toBe('https://customloadertemplate.com/'); + }); }); } -describe('@ngtools/webpack transformers', () => { - describe('find_image_domains (app module)', () => { - runSharedTests(inputTemplateAppModule); - runSharedTests(inputTemplateComponent); +describe('find_image_domains (app module)', () => { + runSharedTests('inputTemplateAppModule', inputTemplateAppModule); + runSharedTests('inputTemplateComponent', inputTemplateComponent); - it('should not find a domain when a built-in loader is used with a variable', () => { - const input = inputTemplateAppModule(`provideCloudflareLoader(myImageCDN)`); - const result = Array.from(findDomains(input)); - expect(result.length).toBe(0); - }); + it('should not find a domain when a built-in loader is used with a variable', () => { + const input = inputTemplateAppModule(`provideCloudflareLoader(myImageCDN)`); + const result = Array.from(findDomains(input)); + expect(result.length).toBe(0); + }); - it('should not find a domain when a built-in loader is used with an expression', () => { - const input = inputTemplateAppModule( - `provideCloudflareLoader("https://www." + (dev ? "dev." : "") + "cloudinarydomain.net")`, - ); - const result = Array.from(findDomains(input)); - expect(result.length).toBe(0); - }); + it('should not find a domain when a built-in loader is used with an expression', () => { + const input = inputTemplateAppModule( + `provideCloudflareLoader("https://www." + (dev ? "dev." : "") + "cloudinarydomain.net")`, + ); + const result = Array.from(findDomains(input)); + expect(result.length).toBe(0); + }); - it('should not find a domain when a built-in loader is used with a template literal', () => { - const input = inputTemplateAppModule( - 'provideCloudflareLoader(`https://www.${dev ? "dev." : ""}cloudinarydomain.net`)', - ); - const result = Array.from(findDomains(input)); - expect(result.length).toBe(0); - }); + it('should not find a domain when a built-in loader is used with a template literal', () => { + const input = inputTemplateAppModule( + 'provideCloudflareLoader(`https://www.${dev ? "dev." : ""}cloudinarydomain.net`)', + ); + const result = Array.from(findDomains(input)); + expect(result.length).toBe(0); + }); - it('should not find a domain in a function that is not a built-in loader', () => { - const input = inputTemplateAppModule('provideNotARealLoader("https://www.foo.com")'); - const result = Array.from(findDomains(input)); - expect(result.length).toBe(0); - }); + it('should not find a domain in a function that is not a built-in loader', () => { + const input = inputTemplateAppModule('provideNotARealLoader("https://www.foo.com")'); + const result = Array.from(findDomains(input)); + expect(result.length).toBe(0); + }); - it('should find a domain in a custom loader function with string concatenation', () => { - const customLoader = tags.stripIndent` + it('should find a domain in a custom loader function with string concatenation', () => { + const customLoader = tags.stripIndent` { provide: IMAGE_LOADER, useValue: (config: ImageLoaderConfig) => { return "https://customLoaderString.com/images?src=" + config.src + "&width=" + config.width; }, },`; - const input = inputTemplateAppModule(customLoader); - const result = Array.from(findDomains(input)); - expect(result.length).toBe(1); - expect(result[0]).toBe('https://customLoaderString.com/'); - }); + const input = inputTemplateAppModule(customLoader); + const result = Array.from(findDomains(input)); + expect(result.length).toBe(1); + expect(result[0]).toBe('https://customLoaderString.com/'); + }); - it('should not find a domain if not an IMAGE_LOADER provider', () => { - const customLoader = tags.stripIndent` + it('should not find a domain if not an IMAGE_LOADER provider', () => { + const customLoader = tags.stripIndent` { provide: SOME_OTHER_PROVIDER, useValue: (config: ImageLoaderConfig) => { return "https://customLoaderString.com/images?src=" + config.src + "&width=" + config.width; }, },`; - const input = inputTemplateAppModule(customLoader); - const result = Array.from(findDomains(input)); - expect(result.length).toBe(0); - }); + const input = inputTemplateAppModule(customLoader); + const result = Array.from(findDomains(input)); + expect(result.length).toBe(0); }); }); diff --git a/packages/ngtools/webpack/src/transformers/remove-ivy-jit-support-calls_spec.ts b/packages/ngtools/webpack/src/transformers/remove-ivy-jit-support-calls_spec.ts index d0ea21aa3054..2c2a2d73f9e7 100644 --- a/packages/ngtools/webpack/src/transformers/remove-ivy-jit-support-calls_spec.ts +++ b/packages/ngtools/webpack/src/transformers/remove-ivy-jit-support-calls_spec.ts @@ -187,10 +187,9 @@ const inputDebugInfo = tags.stripIndent` (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(TestCmp, { className: "TestCmp" }); })(); `; -describe('@ngtools/webpack transformers', () => { - describe('remove-ivy-dev-calls', () => { - it('should allow removing only set class metadata with pure annotation', () => { - const output = tags.stripIndent` +describe('remove-ivy-dev-calls', () => { + it('should allow removing only set class metadata with pure annotation', () => { + const output = tags.stripIndent` export class AppModule { } AppModule.ɵmod = i0.ɵɵdefineNgModule({ type: AppModule, bootstrap: [AppComponent] }); @@ -203,15 +202,15 @@ describe('@ngtools/webpack transformers', () => { AppRoutingModule] }); })(); `; - const result = transform(input, (getTypeChecker) => - removeIvyJitSupportCalls(true, false, false, getTypeChecker), - ); + const result = transform(input, (getTypeChecker) => + removeIvyJitSupportCalls(true, false, false, getTypeChecker), + ); - expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); - }); + expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); + }); - it('should allow removing only set class metadata', () => { - const output = tags.stripIndent` + it('should allow removing only set class metadata', () => { + const output = tags.stripIndent` export class AppModule { } AppModule.ɵmod = i0.ɵɵdefineNgModule({ type: AppModule, bootstrap: [AppComponent] }); @@ -224,15 +223,15 @@ describe('@ngtools/webpack transformers', () => { AppRoutingModule] }); })(); `; - const result = transform(inputNoPure, (getTypeChecker) => - removeIvyJitSupportCalls(true, false, false, getTypeChecker), - ); + const result = transform(inputNoPure, (getTypeChecker) => + removeIvyJitSupportCalls(true, false, false, getTypeChecker), + ); - expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); - }); + expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); + }); - it('should allow removing only ng module scope with pure annotation', () => { - const output = tags.stripIndent` + it('should allow removing only ng module scope with pure annotation', () => { + const output = tags.stripIndent` export class AppModule { } AppModule.ɵmod = i0.ɵɵdefineNgModule({ type: AppModule, bootstrap: [AppComponent] }); @@ -257,15 +256,15 @@ describe('@ngtools/webpack transformers', () => { }], null, null); })(); `; - const result = transform(input, (getTypeChecker) => - removeIvyJitSupportCalls(false, true, false, getTypeChecker), - ); + const result = transform(input, (getTypeChecker) => + removeIvyJitSupportCalls(false, true, false, getTypeChecker), + ); - expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); - }); + expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); + }); - it('should allow removing only ng module scope', () => { - const output = tags.stripIndent` + it('should allow removing only ng module scope', () => { + const output = tags.stripIndent` export class AppModule { } AppModule.ɵmod = i0.ɵɵdefineNgModule({ type: AppModule, bootstrap: [AppComponent] }); @@ -290,15 +289,15 @@ describe('@ngtools/webpack transformers', () => { }], null, null); })(); `; - const result = transform(inputNoPure, (getTypeChecker) => - removeIvyJitSupportCalls(false, true, false, getTypeChecker), - ); + const result = transform(inputNoPure, (getTypeChecker) => + removeIvyJitSupportCalls(false, true, false, getTypeChecker), + ); - expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); - }); + expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); + }); - it('should allow removing both set class metadata and ng module scope with pure annotation', () => { - const output = tags.stripIndent` + it('should allow removing both set class metadata and ng module scope with pure annotation', () => { + const output = tags.stripIndent` export class AppModule { } AppModule.ɵmod = i0.ɵɵdefineNgModule({ type: AppModule, bootstrap: [AppComponent] }); @@ -308,15 +307,15 @@ describe('@ngtools/webpack transformers', () => { ]] }); `; - const result = transform(input, (getTypeChecker) => - removeIvyJitSupportCalls(true, true, false, getTypeChecker), - ); + const result = transform(input, (getTypeChecker) => + removeIvyJitSupportCalls(true, true, false, getTypeChecker), + ); - expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); - }); + expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); + }); - it('should allow removing both set class metadata and ng module scope', () => { - const output = tags.stripIndent` + it('should allow removing both set class metadata and ng module scope', () => { + const output = tags.stripIndent` export class AppModule { } AppModule.ɵmod = i0.ɵɵdefineNgModule({ type: AppModule, bootstrap: [AppComponent] }); @@ -326,31 +325,31 @@ describe('@ngtools/webpack transformers', () => { ]] }); `; - const result = transform(inputNoPure, (getTypeChecker) => - removeIvyJitSupportCalls(true, true, false, getTypeChecker), - ); + const result = transform(inputNoPure, (getTypeChecker) => + removeIvyJitSupportCalls(true, true, false, getTypeChecker), + ); - expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); - }); + expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); + }); - it('should allow removing neither set class metadata nor ng module scope with pure annotation', () => { - const result = transform(input, (getTypeChecker) => - removeIvyJitSupportCalls(false, false, false, getTypeChecker), - ); + it('should allow removing neither set class metadata nor ng module scope with pure annotation', () => { + const result = transform(input, (getTypeChecker) => + removeIvyJitSupportCalls(false, false, false, getTypeChecker), + ); - expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${input}`); - }); + expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${input}`); + }); - it('should allow removing neither set class metadata nor ng module scope', () => { - const result = transform(inputNoPure, (getTypeChecker) => - removeIvyJitSupportCalls(false, false, false, getTypeChecker), - ); + it('should allow removing neither set class metadata nor ng module scope', () => { + const result = transform(inputNoPure, (getTypeChecker) => + removeIvyJitSupportCalls(false, false, false, getTypeChecker), + ); - expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${inputNoPure}`); - }); + expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${inputNoPure}`); + }); - it('should strip unused imports when removing set class metadata and ng module scope with pure annotation', () => { - const imports = tags.stripIndent` + it('should strip unused imports when removing set class metadata and ng module scope with pure annotation', () => { + const imports = tags.stripIndent` import { BrowserModule } from '@angular/platform-browser'; import { NgModule } from '@angular/core'; import { AppRoutingModule } from './app-routing.module'; @@ -359,7 +358,7 @@ describe('@ngtools/webpack transformers', () => { import * as i0 from "@angular/core"; `; - const output = tags.stripIndent` + const output = tags.stripIndent` import { BrowserModule } from '@angular/platform-browser'; import { AppRoutingModule } from './app-routing.module'; import { AppComponent } from './app.component'; @@ -373,15 +372,15 @@ describe('@ngtools/webpack transformers', () => { ]] }); `; - const result = transform(imports + input, (getTypeChecker) => - removeIvyJitSupportCalls(true, true, false, getTypeChecker), - ); + const result = transform(imports + input, (getTypeChecker) => + removeIvyJitSupportCalls(true, true, false, getTypeChecker), + ); - expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); - }); + expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); + }); - it('should strip unused imports when removing set class metadata and ng module scope', () => { - const imports = tags.stripIndent` + it('should strip unused imports when removing set class metadata and ng module scope', () => { + const imports = tags.stripIndent` import { BrowserModule } from '@angular/platform-browser'; import { NgModule } from '@angular/core'; import { AppRoutingModule } from './app-routing.module'; @@ -390,7 +389,7 @@ describe('@ngtools/webpack transformers', () => { import * as i0 from "@angular/core"; `; - const output = tags.stripIndent` + const output = tags.stripIndent` import { BrowserModule } from '@angular/platform-browser'; import { AppRoutingModule } from './app-routing.module'; import { AppComponent } from './app.component'; @@ -404,15 +403,15 @@ describe('@ngtools/webpack transformers', () => { ]] }); `; - const result = transform(imports + inputNoPure, (getTypeChecker) => - removeIvyJitSupportCalls(true, true, false, getTypeChecker), - ); + const result = transform(imports + inputNoPure, (getTypeChecker) => + removeIvyJitSupportCalls(true, true, false, getTypeChecker), + ); - expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); - }); + expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); + }); - it('should remove setClassMetadata and setNgModuleScope calls inside arrow-function-based IIFEs that have bodies', () => { - const output = tags.stripIndent` + it('should remove setClassMetadata and setNgModuleScope calls inside arrow-function-based IIFEs that have bodies', () => { + const output = tags.stripIndent` export class AppModule { } AppModule.ɵmod = i0.ɵɵdefineNgModule({ type: AppModule, bootstrap: [AppComponent] }); @@ -422,15 +421,15 @@ describe('@ngtools/webpack transformers', () => { ]] }); `; - const result = transform(inputArrowFnWithBody, (getTypeChecker) => - removeIvyJitSupportCalls(true, true, false, getTypeChecker), - ); + const result = transform(inputArrowFnWithBody, (getTypeChecker) => + removeIvyJitSupportCalls(true, true, false, getTypeChecker), + ); - expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); - }); + expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); + }); - it('should remove setClassMetadata and setNgModuleScope calls inside arrow-function-based IIFEs that have an implicit return', () => { - const output = tags.stripIndent` + it('should remove setClassMetadata and setNgModuleScope calls inside arrow-function-based IIFEs that have an implicit return', () => { + const output = tags.stripIndent` export class AppModule { } AppModule.ɵmod = i0.ɵɵdefineNgModule({ type: AppModule, bootstrap: [AppComponent] }); @@ -440,56 +439,55 @@ describe('@ngtools/webpack transformers', () => { ]] }); `; - const result = transform(inputArrowFnWithImplicitReturn, (getTypeChecker) => - removeIvyJitSupportCalls(true, true, false, getTypeChecker), - ); + const result = transform(inputArrowFnWithImplicitReturn, (getTypeChecker) => + removeIvyJitSupportCalls(true, true, false, getTypeChecker), + ); - expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); - }); + expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); + }); - it('should remove setClassMetadataAsync calls', () => { - const output = tags.stripIndent` + it('should remove setClassMetadataAsync calls', () => { + const output = tags.stripIndent` export class TestCmp { } TestCmp.ɵfac = function TestCmp_Factory(t) { return new (t || TestCmp)(); }; TestCmp.ɵcmp = i0.ɵɵdefineComponent({ type: TestCmp, selectors: [["test-cmp"]], standalone: true, features: [i0.ɵɵStandaloneFeature], decls: 3, vars: 0, template: function TestCmp_Template(rf, ctx) { }, encapsulation: 2 }); `; - const result = transform(inputAsync, (getTypeChecker) => - removeIvyJitSupportCalls(true, false, false, getTypeChecker), - ); + const result = transform(inputAsync, (getTypeChecker) => + removeIvyJitSupportCalls(true, false, false, getTypeChecker), + ); - expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); - }); + expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); + }); - it('should remove arrow-function-based setClassMetadataAsync calls', () => { - const output = tags.stripIndent` + it('should remove arrow-function-based setClassMetadataAsync calls', () => { + const output = tags.stripIndent` export class TestCmp { } TestCmp.ɵfac = function TestCmp_Factory(t) { return new (t || TestCmp)(); }; TestCmp.ɵcmp = i0.ɵɵdefineComponent({ type: TestCmp, selectors: [["test-cmp"]], standalone: true, features: [i0.ɵɵStandaloneFeature], decls: 3, vars: 0, template: function TestCmp_Template(rf, ctx) { }, encapsulation: 2 }); `; - const result = transform(inputAsyncArrowFn, (getTypeChecker) => - removeIvyJitSupportCalls(true, false, false, getTypeChecker), - ); + const result = transform(inputAsyncArrowFn, (getTypeChecker) => + removeIvyJitSupportCalls(true, false, false, getTypeChecker), + ); - expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); - }); + expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); + }); - it('should remove setClassDebugInfo calls', () => { - const output = tags.stripIndent` + it('should remove setClassDebugInfo calls', () => { + const output = tags.stripIndent` import * as i0 from "@angular/core"; export class TestCmp { } TestCmp.ɵfac = function TestCmp_Factory(t) { return new (t || TestCmp)(); }; TestCmp.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TestCmp, selectors: [["test-cmp"]], decls: 0, vars: 0, template: function TestCmp_Template(rf, ctx) { }, encapsulation: 2 }); `; - const result = transform(inputDebugInfo, (getTypeChecker) => - removeIvyJitSupportCalls(true, false, true, getTypeChecker), - ); + const result = transform(inputDebugInfo, (getTypeChecker) => + removeIvyJitSupportCalls(true, false, true, getTypeChecker), + ); - expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); - }); + expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); }); }); diff --git a/packages/ngtools/webpack/src/transformers/replace_resources_spec.ts b/packages/ngtools/webpack/src/transformers/replace_resources_spec.ts index 8b15f5d55b09..e0be8e4ebb03 100644 --- a/packages/ngtools/webpack/src/transformers/replace_resources_spec.ts +++ b/packages/ngtools/webpack/src/transformers/replace_resources_spec.ts @@ -27,10 +27,9 @@ function transform( return transformTypescript(input, [transformer], program, compilerHost); } -describe('@ngtools/webpack transformers', () => { - describe('find_resources', () => { - it('should replace resources', () => { - const input = tags.stripIndent` +describe('find_resources', () => { + it('should replace resources', () => { + const input = tags.stripIndent` import { Component } from '@angular/core'; @Component({ @@ -42,7 +41,7 @@ describe('@ngtools/webpack transformers', () => { title = 'app'; } `; - const output = tags.stripIndent` + const output = tags.stripIndent` import { __decorate } from "tslib"; import __NG_CLI_RESOURCE__0 from "./app.component.html?ngResource"; import __NG_CLI_RESOURCE__1 from "./app.component.css?ngResource"; @@ -64,12 +63,12 @@ describe('@ngtools/webpack transformers', () => { export { AppComponent }; `; - const result = transform(input); - expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); - }); + const result = transform(input); + expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); + }); - it('should replace resources with `require()` when module is CommonJs', () => { - const input = tags.stripIndent` + it('should replace resources with `require()` when module is CommonJs', () => { + const input = tags.stripIndent` import { Component } from '@angular/core'; @Component({ @@ -82,7 +81,7 @@ describe('@ngtools/webpack transformers', () => { } `; - const output = tags.stripIndent` + const output = tags.stripIndent` "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.AppComponent = void 0; @@ -100,12 +99,12 @@ describe('@ngtools/webpack transformers', () => { styles: [require("./app.component.css?ngResource"), require("./app.component.2.css?ngResource")] }) ], AppComponent); `; - const result = transform(input, true, true, ts.ModuleKind.CommonJS); - expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); - }); + const result = transform(input, true, true, ts.ModuleKind.CommonJS); + expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); + }); - it('should support svg as templates', () => { - const input = tags.stripIndent` + it('should support svg as templates', () => { + const input = tags.stripIndent` import { Component } from '@angular/core'; @Component({ @@ -116,7 +115,7 @@ describe('@ngtools/webpack transformers', () => { title = 'app'; } `; - const output = tags.stripIndent` + const output = tags.stripIndent` import { __decorate } from "tslib"; import __NG_CLI_RESOURCE__0 from "./app.component.svg?ngResource"; import { Component } from '@angular/core'; @@ -134,12 +133,12 @@ describe('@ngtools/webpack transformers', () => { export { AppComponent }; `; - const result = transform(input); - expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); - }); + const result = transform(input); + expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); + }); - it('should merge styleUrls with styles', () => { - const input = tags.stripIndent` + it('should merge styleUrls with styles', () => { + const input = tags.stripIndent` import { Component } from '@angular/core'; @Component({ @@ -152,7 +151,7 @@ describe('@ngtools/webpack transformers', () => { title = 'app'; } `; - const output = tags.stripIndent` + const output = tags.stripIndent` import { __decorate } from "tslib"; import __NG_CLI_RESOURCE__0 from "./app.component.html?ngResource"; import __NG_CLI_RESOURCE__1 from "./app.component.css?ngResource"; @@ -173,12 +172,12 @@ describe('@ngtools/webpack transformers', () => { export { AppComponent }; `; - const result = transform(input); - expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); - }); + const result = transform(input); + expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); + }); - it('should replace resources with backticks', () => { - const input = ` + it('should replace resources with backticks', () => { + const input = ` import { Component } from '@angular/core'; @Component({ @@ -190,7 +189,7 @@ describe('@ngtools/webpack transformers', () => { title = 'app'; } `; - const output = ` + const output = ` import { __decorate } from "tslib"; import __NG_CLI_RESOURCE__0 from "./app.component.html?ngResource"; import __NG_CLI_RESOURCE__1 from "./app.component.css?ngResource"; @@ -212,12 +211,12 @@ describe('@ngtools/webpack transformers', () => { export { AppComponent }; `; - const result = transform(input); - expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); - }); + const result = transform(input); + expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); + }); - it('should replace resources if Component decorator is aliased', () => { - const input = tags.stripIndent` + it('should replace resources if Component decorator is aliased', () => { + const input = tags.stripIndent` import { Component as NgComponent } from '@angular/core'; @NgComponent({ @@ -229,7 +228,7 @@ describe('@ngtools/webpack transformers', () => { title = 'app'; } `; - const output = tags.stripIndent` + const output = tags.stripIndent` import { __decorate } from "tslib"; import __NG_CLI_RESOURCE__0 from "./app.component.html?ngResource"; import __NG_CLI_RESOURCE__1 from "./app.component.css?ngResource"; @@ -251,16 +250,16 @@ describe('@ngtools/webpack transformers', () => { export { AppComponent }; `; - const { program } = createTypescriptContext(input); - const getTypeChecker = () => program.getTypeChecker(); - const transformer = replaceResources(() => true, getTypeChecker); - const result = transformTypescript(input, [transformer]); + const { program } = createTypescriptContext(input); + const getTypeChecker = () => program.getTypeChecker(); + const transformer = replaceResources(() => true, getTypeChecker); + const result = transformTypescript(input, [transformer]); - expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); - }); + expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); + }); - it('should replace resources if Angular Core import is namespaced', () => { - const input = tags.stripIndent` + it('should replace resources if Angular Core import is namespaced', () => { + const input = tags.stripIndent` import * as ng from '@angular/core'; @ng.Component({ @@ -272,7 +271,7 @@ describe('@ngtools/webpack transformers', () => { title = 'app'; } `; - const output = tags.stripIndent` + const output = tags.stripIndent` import { __decorate } from "tslib"; import __NG_CLI_RESOURCE__0 from "./app.component.html?ngResource"; import __NG_CLI_RESOURCE__1 from "./app.component.css?ngResource"; @@ -294,12 +293,12 @@ describe('@ngtools/webpack transformers', () => { export { AppComponent }; `; - const result = transform(input); - expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); - }); + const result = transform(input); + expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); + }); - it('should replace resources specified as string literals', () => { - const input = tags.stripIndent` + it('should replace resources specified as string literals', () => { + const input = tags.stripIndent` import { Component } from '@angular/core'; @Component({ @@ -312,7 +311,7 @@ describe('@ngtools/webpack transformers', () => { title = 'app'; } `; - const output = tags.stripIndent` + const output = tags.stripIndent` import { __decorate } from "tslib"; import __NG_CLI_RESOURCE__0 from "./app.component.html?ngResource"; import __NG_CLI_RESOURCE__1 from "./app.component.css?ngResource"; @@ -333,12 +332,12 @@ describe('@ngtools/webpack transformers', () => { export { AppComponent }; `; - const result = transform(input); - expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); - }); + const result = transform(input); + expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); + }); - it('should not replace resources if not in Component decorator', () => { - const input = tags.stripIndent` + it('should not replace resources if not in Component decorator', () => { + const input = tags.stripIndent` import { Component } from '@angular/core'; @Component({ @@ -356,7 +355,7 @@ describe('@ngtools/webpack transformers', () => { } `; - const output = tags.stripIndent` + const output = tags.stripIndent` import { __decorate } from "tslib"; import __NG_CLI_RESOURCE__0 from "./app.component.html?ngResource"; import __NG_CLI_RESOURCE__1 from "./app.component.css?ngResource"; @@ -384,12 +383,12 @@ describe('@ngtools/webpack transformers', () => { export { AppComponent }; `; - const result = transform(input); - expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); - }); + const result = transform(input); + expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); + }); - it('should not replace resources if not in an NG Component decorator', () => { - const input = tags.stripIndent` + it('should not replace resources if not in an NG Component decorator', () => { + const input = tags.stripIndent` import { Component } from 'foo'; @Component({ @@ -407,7 +406,7 @@ describe('@ngtools/webpack transformers', () => { } `; - const output = tags.stripIndent` + const output = tags.stripIndent` import { __decorate } from "tslib"; import { Component } from 'foo'; @@ -432,12 +431,12 @@ describe('@ngtools/webpack transformers', () => { export { AppComponent }; `; - const result = transform(input); - expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); - }); + const result = transform(input); + expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); + }); - it('should not replace resources if shouldTransform returns false', () => { - const input = tags.stripIndent` + it('should not replace resources if shouldTransform returns false', () => { + const input = tags.stripIndent` import { Component } from '@angular/core'; @Component({ @@ -449,7 +448,7 @@ describe('@ngtools/webpack transformers', () => { title = 'app'; } `; - const output = ` + const output = ` import { __decorate } from "tslib"; import { Component } from '@angular/core'; let AppComponent = class AppComponent { @@ -467,8 +466,7 @@ describe('@ngtools/webpack transformers', () => { export { AppComponent }; `; - const result = transform(input, false); - expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); - }); + const result = transform(input, false); + expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); }); }); diff --git a/packages/ngtools/webpack/src/transformers/spec_helpers.ts b/packages/ngtools/webpack/src/transformers/spec_helpers.ts index 2b059d02f4e3..bc6e199cb8dd 100644 --- a/packages/ngtools/webpack/src/transformers/spec_helpers.ts +++ b/packages/ngtools/webpack/src/transformers/spec_helpers.ts @@ -28,7 +28,7 @@ export function createTypescriptContext( noEmitOnError: useLibs, allowJs: true, newLine: ts.NewLineKind.LineFeed, - moduleResolution: ts.ModuleResolutionKind.Node10, + moduleResolution: ts.ModuleResolutionKind.Bundler, module: ts.ModuleKind.ES2020, target: ts.ScriptTarget.ES2020, skipLibCheck: true, diff --git a/packages/schematics/angular/app-shell/index.ts b/packages/schematics/angular/app-shell/index.ts index 2bae5e4bef14..c9b30cdcc8b6 100644 --- a/packages/schematics/angular/app-shell/index.ts +++ b/packages/schematics/angular/app-shell/index.ts @@ -168,7 +168,6 @@ function addServerRoutingConfig(options: AppShellOptions, isStandalone: boolean) throw new SchematicsException(`Cannot find "${configFilePath}".`); } - let recorder = host.beginUpdate(configFilePath); const configSourceFile = getSourceFile(host, configFilePath); const functionCall = findNodes( configSourceFile, @@ -185,7 +184,7 @@ function addServerRoutingConfig(options: AppShellOptions, isStandalone: boolean) ); } - recorder = host.beginUpdate(configFilePath); + const recorder = host.beginUpdate(configFilePath); recorder.insertLeft(functionCall.end - 1, `, withAppShell(AppShell)`); applyToUpdateRecorder(recorder, [ diff --git a/packages/schematics/angular/application/files/common-files/src/app/app__suffix__.html.template b/packages/schematics/angular/application/files/common-files/src/app/app__suffix__.html.template index 7d9cf8841c9d..37512bbc01e5 100644 --- a/packages/schematics/angular/application/files/common-files/src/app/app__suffix__.html.template +++ b/packages/schematics/angular/application/files/common-files/src/app/app__suffix__.html.template @@ -42,6 +42,8 @@ box-sizing: border-box; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; + display: block; + height: 100dvh; } h1 { diff --git a/packages/schematics/angular/application/index.ts b/packages/schematics/angular/application/index.ts index e84a40530032..2820634b1ba8 100644 --- a/packages/schematics/angular/application/index.ts +++ b/packages/schematics/angular/application/index.ts @@ -187,7 +187,7 @@ function addDependenciesToPackageJson(options: ApplicationOptions): Rule { ); } - if (!options.skipTests) { + if (!options.skipTests && !options.minimal) { rules.push(...addTestRunnerDependencies(options.testRunner, !!options.skipInstall)); } @@ -261,7 +261,7 @@ function addAppToWorkspaceFile(options: ApplicationOptions, appDir: string): Rul } const sourceRoot = join(normalize(projectRoot), 'src'); - let budgets: { type: string; maximumWarning: string; maximumError: string }[] = []; + let budgets: { type: string; maximumWarning: string; maximumError: string }[]; if (options.strict) { budgets = [ { diff --git a/packages/schematics/angular/application/index_spec.ts b/packages/schematics/angular/application/index_spec.ts index 215664398b8e..0fe4d142dc4a 100644 --- a/packages/schematics/angular/application/index_spec.ts +++ b/packages/schematics/angular/application/index_spec.ts @@ -167,6 +167,18 @@ describe('Application Schematic', () => { ); }); + it(`should not add test dependencies with "minimal" enabled`, async () => { + const tree = await schematicRunner.runSchematic( + 'application', + { ...defaultOptions, minimal: true }, + workspaceTree, + ); + + const packageJson = JSON.parse(tree.readContent('package.json')); + expect(packageJson.devDependencies['vitest']).toBeUndefined(); + expect(packageJson.devDependencies['jsdom']).toBeUndefined(); + }); + it('should install npm dependencies when `skipInstall` is false', async () => { await schematicRunner.runSchematic( 'application', diff --git a/packages/schematics/angular/application/schema.json b/packages/schematics/angular/application/schema.json index f047232c23cc..83df1b163873 100644 --- a/packages/schematics/angular/application/schema.json +++ b/packages/schematics/angular/application/schema.json @@ -21,13 +21,13 @@ "x-prompt": "What name would you like to use for the application?" }, "inlineStyle": { - "description": "Include the styles for the root component directly within the `app.component.ts` file. Only CSS styles can be included inline. By default, a separate stylesheet file (e.g., `app.component.css`) is created.", + "description": "Include the styles for the root component directly within the `app.ts` file. Only CSS styles can be included inline. By default, a separate stylesheet file (e.g., `app.css`) is created.", "type": "boolean", "alias": "s", "x-user-analytics": "ep.ng_inline_style" }, "inlineTemplate": { - "description": "Include the HTML template for the root component directly within the `app.component.ts` file. By default, a separate template file (e.g., `app.component.html`) is created.", + "description": "Include the HTML template for the root component directly within the `app.ts` file. By default, a separate template file (e.g., `app.html`) is created.", "type": "boolean", "alias": "t", "x-user-analytics": "ep.ng_inline_template" diff --git a/packages/schematics/angular/collection.json b/packages/schematics/angular/collection.json index c275bc40144f..29b361ccafbb 100755 --- a/packages/schematics/angular/collection.json +++ b/packages/schematics/angular/collection.json @@ -23,12 +23,6 @@ "schema": "./application/schema.json", "description": "Create an Angular application." }, - "private-e2e": { - "factory": "./e2e", - "schema": "./e2e/schema.json", - "description": "PRIVATE API - Do not use.", - "hidden": true - }, "class": { "aliases": ["cl"], "factory": "./class", diff --git a/packages/schematics/angular/component/files/__name@dasherize@if-flat__/__name@dasherize__.__type@dasherize__.ts.template b/packages/schematics/angular/component/files/__name@dasherize@if-flat__/__name@dasherize__.__type@dasherize__.ts.template index dcea9394edb8..d46cd8233862 100644 --- a/packages/schematics/angular/component/files/__name@dasherize@if-flat__/__name@dasherize__.__type@dasherize__.ts.template +++ b/packages/schematics/angular/component/files/__name@dasherize@if-flat__/__name@dasherize__.__type@dasherize__.ts.template @@ -1,4 +1,4 @@ -import { <% if(changeDetection !== 'Default') { %>ChangeDetectionStrategy, <% }%>Component<% if(!!viewEncapsulation) { %>, ViewEncapsulation<% }%> } from '@angular/core'; +import { <% if(changeDetection !== 'OnPush') { %>ChangeDetectionStrategy, <% }%>Component<% if(!!viewEncapsulation) { %>, ViewEncapsulation<% }%> } from '@angular/core'; @Component({<% if(!skipSelector) {%> selector: '<%= selector %>',<%}%><% if(standalone) {%> @@ -16,7 +16,7 @@ import { <% if(changeDetection !== 'Default') { %>ChangeDetectionStrategy, <% }% } <% } %>`,<% } else if (style !== 'none') { %> styleUrl: './<%= dasherize(name) %><%= type ? '.' + dasherize(type): '' %>.<%= style %>',<% } %><% if(!!viewEncapsulation) { %> - encapsulation: ViewEncapsulation.<%= viewEncapsulation %>,<% } if (changeDetection !== 'Default') { %> + encapsulation: ViewEncapsulation.<%= viewEncapsulation %>,<% } if (changeDetection !== 'OnPush') { %> changeDetection: ChangeDetectionStrategy.<%= changeDetection %>,<% } %> }) export <% if(exportDefault) {%>default <%}%>class <%= classifiedName %> { diff --git a/packages/schematics/angular/component/index_spec.ts b/packages/schematics/angular/component/index_spec.ts index 3aea03309e12..1f03be864db9 100644 --- a/packages/schematics/angular/component/index_spec.ts +++ b/packages/schematics/angular/component/index_spec.ts @@ -23,7 +23,7 @@ describe('Component Schematic', () => { inlineStyle: false, inlineTemplate: false, displayBlock: false, - changeDetection: ChangeDetection.Default, + changeDetection: ChangeDetection.OnPush, style: Style.Css, type: 'Component', skipTests: false, @@ -64,12 +64,23 @@ describe('Component Schematic', () => { expect(tsContent).toContain('compileComponents()'); }); - it('should set change detection to OnPush', async () => { - const options = { ...defaultOptions, changeDetection: 'OnPush' }; + it('should not set change detection when default is OnPush', async () => { + const options = { ...defaultOptions }; + + const tree = await schematicRunner.runSchematic('component', options, appTree); + const tsContent = tree.readContent('/projects/bar/src/app/foo/foo.component.ts'); + expect(tsContent).not.toMatch(/import.*ChangeDetectionStrategy/); + expect(tsContent).not.toMatch(/changeDetection:/); + expect(tsContent).not.toMatch(/ChangeDetectionStrategy/); + }); + + it('should set changeDetection to Eager when requested', async () => { + const options = { ...defaultOptions, changeDetection: 'Eager' }; const tree = await schematicRunner.runSchematic('component', options, appTree); const tsContent = tree.readContent('/projects/bar/src/app/foo/foo.component.ts'); - expect(tsContent).toMatch(/changeDetection: ChangeDetectionStrategy.OnPush/); + expect(tsContent).toMatch(/import .*ChangeDetectionStrategy/); + expect(tsContent).toContain('changeDetection: ChangeDetectionStrategy.Eager,'); }); it('should not set view encapsulation', async () => { @@ -348,27 +359,27 @@ describe('Component Schematic', () => { expect(tree.files).not.toContain('/projects/bar/src/app/foo/foo.component.spec.ts'); }); - it('should respect templateUrl when style=none and changeDetection=OnPush', async () => { - const options = { ...defaultOptions, style: Style.None, changeDetection: 'OnPush' }; + it('should respect templateUrl when style=none and changeDetection=Eager', async () => { + const options = { ...defaultOptions, style: Style.None, changeDetection: 'Eager' }; const tree = await schematicRunner.runSchematic('component', options, appTree); const content = tree.readContent('/projects/bar/src/app/foo/foo.component.ts'); expect(content).not.toMatch(/styleUrls: /); expect(content).toMatch(/templateUrl: '.\/foo.component.html',\n/); - expect(content).toMatch(/changeDetection: ChangeDetectionStrategy.OnPush/); + expect(content).toMatch(/changeDetection: ChangeDetectionStrategy.Eager/); }); - it('should respect inlineTemplate when style=none and changeDetection=OnPush', async () => { + it('should respect inlineTemplate when style=none and changeDetection=Eager', async () => { const options = { ...defaultOptions, style: Style.None, - changeDetection: 'OnPush', + changeDetection: 'Eager', inlineTemplate: true, }; const tree = await schematicRunner.runSchematic('component', options, appTree); const content = tree.readContent('/projects/bar/src/app/foo/foo.component.ts'); expect(content).not.toMatch(/styleUrls: /); expect(content).toMatch(/template: `(\n(.|)*){3}\n\s*`,\n/); - expect(content).toMatch(/changeDetection: ChangeDetectionStrategy.OnPush/); + expect(content).toMatch(/changeDetection: ChangeDetectionStrategy.Eager,/); }); it('should create a standalone component', async () => { diff --git a/packages/schematics/angular/component/schema.json b/packages/schematics/angular/component/schema.json index eaa2c95f197b..3d6f24590bd4 100644 --- a/packages/schematics/angular/component/schema.json +++ b/packages/schematics/angular/component/schema.json @@ -65,9 +65,9 @@ }, "changeDetection": { "description": "Configures the change detection strategy for the component.", - "enum": ["Default", "OnPush"], + "enum": ["Eager", "OnPush"], "type": "string", - "default": "Default", + "default": "OnPush", "alias": "c" }, "prefix": { diff --git a/packages/schematics/angular/directive/files/__name@dasherize__.__type@dasherize__.ts.template b/packages/schematics/angular/directive/files/__name@dasherize__.__type@dasherize__.ts.template index 624b3cafbec1..eff23c7e350a 100644 --- a/packages/schematics/angular/directive/files/__name@dasherize__.__type@dasherize__.ts.template +++ b/packages/schematics/angular/directive/files/__name@dasherize__.__type@dasherize__.ts.template @@ -5,7 +5,4 @@ import { Directive } from '@angular/core'; standalone: false,<%}%> }) export class <%= classifiedName %> { - - constructor() { } - } diff --git a/packages/schematics/angular/e2e/files/protractor.conf.js.template b/packages/schematics/angular/e2e/files/protractor.conf.js.template deleted file mode 100644 index 361e7f0cdfa1..000000000000 --- a/packages/schematics/angular/e2e/files/protractor.conf.js.template +++ /dev/null @@ -1,37 +0,0 @@ -// @ts-check -// Protractor configuration file, see link for more information -// https://github.com/angular/protractor/blob/master/lib/config.ts - -const { SpecReporter, StacktraceOption } = require('jasmine-spec-reporter'); - -/** - * @type { import("protractor").Config } - */ -exports.config = { - allScriptsTimeout: 11000, - specs: [ - './src/**/*.e2e-spec.ts' - ], - capabilities: { - browserName: 'chrome' - }, - directConnect: true, - SELENIUM_PROMISE_MANAGER: false, - baseUrl: 'http://localhost:4200/', - framework: 'jasmine', - jasmineNodeOpts: { - showColors: true, - defaultTimeoutInterval: 30000, - print: function() {} - }, - onPrepare() { - require('ts-node').register({ - project: require('path').join(__dirname, './tsconfig.json') - }); - jasmine.getEnv().addReporter(new SpecReporter({ - spec: { - displayStacktrace: StacktraceOption.PRETTY - } - })); - } -}; \ No newline at end of file diff --git a/packages/schematics/angular/e2e/files/src/app.e2e-spec.ts.template b/packages/schematics/angular/e2e/files/src/app.e2e-spec.ts.template deleted file mode 100644 index fdbe66b2ab46..000000000000 --- a/packages/schematics/angular/e2e/files/src/app.e2e-spec.ts.template +++ /dev/null @@ -1,23 +0,0 @@ -import { browser, logging } from 'protractor'; -import { AppPage } from './app.po'; - -describe('workspace-project App', () => { - let page: AppPage; - - beforeEach(() => { - page = new AppPage(); - }); - - it('should display welcome message', async () => { - await page.navigateTo(); - expect(await page.getTitleText()).toEqual('Hello, <%= relatedAppName %>'); - }); - - afterEach(async () => { - // Assert that there are no errors emitted from the browser - const logs = await browser.manage().logs().get(logging.Type.BROWSER); - expect(logs).not.toContain(jasmine.objectContaining({ - level: logging.Level.SEVERE, - } as logging.Entry)); - }); -}); diff --git a/packages/schematics/angular/e2e/files/src/app.po.ts.template b/packages/schematics/angular/e2e/files/src/app.po.ts.template deleted file mode 100644 index 602087cca38f..000000000000 --- a/packages/schematics/angular/e2e/files/src/app.po.ts.template +++ /dev/null @@ -1,11 +0,0 @@ -import { browser, by, element } from 'protractor'; - -export class AppPage { - async navigateTo(): Promise { - return browser.get(browser.baseUrl); - } - - async getTitleText(): Promise { - return element(by.css('h1')).getText(); - } -} diff --git a/packages/schematics/angular/e2e/files/tsconfig.json.template b/packages/schematics/angular/e2e/files/tsconfig.json.template deleted file mode 100644 index 1bc14be7a84c..000000000000 --- a/packages/schematics/angular/e2e/files/tsconfig.json.template +++ /dev/null @@ -1,14 +0,0 @@ -/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ -/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ -{ - "extends": "<%= relativePathToWorkspaceRoot %>/tsconfig.json", - "compilerOptions": { - "outDir": "<%= relativePathToWorkspaceRoot %>/out-tsc/e2e", - "module": "commonjs", - "target": "es2019", - "types": [ - "jasmine", - "node" - ] - } -} diff --git a/packages/schematics/angular/e2e/index.ts b/packages/schematics/angular/e2e/index.ts deleted file mode 100644 index 0fba1363028e..000000000000 --- a/packages/schematics/angular/e2e/index.ts +++ /dev/null @@ -1,106 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import { - Rule, - SchematicsException, - apply, - applyTemplates, - chain, - mergeWith, - move, - strings, - url, -} from '@angular-devkit/schematics'; -import { posix as path } from 'node:path'; -import { DependencyType, ExistingBehavior, addDependency } from '../utility/dependency'; -import { JSONFile } from '../utility/json-file'; -import { latestVersions } from '../utility/latest-versions'; -import { addRootProvider } from '../utility/standalone'; -import { updateWorkspace } from '../utility/workspace'; -import { Builders as AngularBuilder } from '../utility/workspace-models'; -import { Schema as E2eOptions } from './schema'; - -/** - * The list of development dependencies used by the E2E protractor-based builder. - * The versions are sourced from the latest versions `../utility/latest-versions/package.json` - * file which is automatically updated via renovate. - */ -const E2E_DEV_DEPENDENCIES = Object.freeze([ - 'protractor', - 'jasmine-spec-reporter', - 'ts-node', - '@types/node', -]); - -function addScriptsToPackageJson(): Rule { - return (host) => { - const pkgJson = new JSONFile(host, 'package.json'); - const e2eScriptPath = ['scripts', 'e2e']; - - if (!pkgJson.get(e2eScriptPath)) { - pkgJson.modify(e2eScriptPath, 'ng e2e', false); - } - }; -} - -export default function (options: E2eOptions): Rule { - const { relatedAppName } = options; - - return updateWorkspace((workspace) => { - const project = workspace.projects.get(relatedAppName); - - if (!project) { - throw new SchematicsException(`Project name "${relatedAppName}" doesn't not exist.`); - } - - const e2eRootPath = path.join(project.root, 'e2e'); - - project.targets.add({ - name: 'e2e', - builder: AngularBuilder.Protractor, - defaultConfiguration: 'development', - options: { - protractorConfig: path.join(e2eRootPath, 'protractor.conf.js'), - }, - configurations: { - production: { - devServerTarget: `${relatedAppName}:serve:production`, - }, - development: { - devServerTarget: `${relatedAppName}:serve:development`, - }, - }, - }); - - return chain([ - mergeWith( - apply(url('./files'), [ - applyTemplates({ - utils: strings, - ...options, - relativePathToWorkspaceRoot: path.relative(path.join('/', e2eRootPath), '/'), - }), - move(e2eRootPath), - ]), - ), - addRootProvider( - relatedAppName, - ({ code, external }) => - code`${external('provideProtractorTestingSupport', '@angular/platform-browser')}()`, - ), - ...E2E_DEV_DEPENDENCIES.map((name) => - addDependency(name, latestVersions[name], { - type: DependencyType.Dev, - existing: ExistingBehavior.Skip, - }), - ), - addScriptsToPackageJson(), - ]); - }); -} diff --git a/packages/schematics/angular/e2e/index_spec.ts b/packages/schematics/angular/e2e/index_spec.ts deleted file mode 100644 index e04e4ca177b5..000000000000 --- a/packages/schematics/angular/e2e/index_spec.ts +++ /dev/null @@ -1,98 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import { SchematicTestRunner, UnitTestTree } from '@angular-devkit/schematics/testing'; -import { Schema as ApplicationOptions } from '../application/schema'; -import { Schema as WorkspaceOptions } from '../workspace/schema'; -import { Schema as E2eOptions } from './schema'; - -describe('Application Schematic', () => { - const schematicRunner = new SchematicTestRunner( - '@schematics/angular', - require.resolve('../collection.json'), - ); - - const workspaceOptions: WorkspaceOptions = { - name: 'workspace', - newProjectRoot: 'projects', - version: '6.0.0', - }; - - const defaultOptions: E2eOptions = { - relatedAppName: 'foo', - }; - - const defaultAppOptions: ApplicationOptions = { - name: 'foo', - inlineStyle: true, - inlineTemplate: true, - routing: false, - skipPackageJson: false, - minimal: true, - }; - - let applicationTree: UnitTestTree; - - beforeEach(async () => { - const workspaceTree = await schematicRunner.runSchematic('workspace', workspaceOptions); - - applicationTree = await schematicRunner.runSchematic( - 'application', - defaultAppOptions, - workspaceTree, - ); - }); - - it('should create all files of e2e in an application', async () => { - const tree = await schematicRunner.runSchematic('private-e2e', defaultOptions, applicationTree); - - const files = tree.files; - expect(files).toEqual( - jasmine.arrayContaining([ - '/projects/foo/e2e/protractor.conf.js', - '/projects/foo/e2e/tsconfig.json', - '/projects/foo/e2e/src/app.e2e-spec.ts', - '/projects/foo/e2e/src/app.po.ts', - ]), - ); - }); - - describe('workspace config', () => { - it('should add e2e targets for the app', async () => { - const tree = await schematicRunner.runSchematic( - 'private-e2e', - defaultOptions, - applicationTree, - ); - - const workspace = JSON.parse(tree.readContent('/angular.json')); - const targets = workspace.projects.foo.architect; - expect(targets.e2e).toBeDefined(); - }); - - it('should set the e2e options', async () => { - const tree = await schematicRunner.runSchematic( - 'private-e2e', - defaultOptions, - applicationTree, - ); - - const workspace = JSON.parse(tree.readContent('/angular.json')); - const { options, configurations } = workspace.projects.foo.architect.e2e; - expect(options.protractorConfig).toEqual('projects/foo/e2e/protractor.conf.js'); - expect(configurations.development.devServerTarget).toEqual('foo:serve:development'); - }); - }); - - it('should add an e2e script in package.json', async () => { - const tree = await schematicRunner.runSchematic('private-e2e', defaultOptions, applicationTree); - - const pkg = JSON.parse(tree.readContent('/package.json')); - expect(pkg.scripts['e2e']).toBe('ng e2e'); - }); -}); diff --git a/packages/schematics/angular/e2e/schema.json b/packages/schematics/angular/e2e/schema.json deleted file mode 100644 index e4805dd04c5a..000000000000 --- a/packages/schematics/angular/e2e/schema.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema", - "$id": "SchematicsAngularE2eApp", - "title": "Angular e2e Application Options Schema", - "type": "object", - "additionalProperties": false, - "description": "Generates a new, generic end-to-end test definition in the given project.", - "properties": { - "rootSelector": { - "description": "The HTML selector for the root component of the test app.", - "type": "string", - "default": "app-root" - }, - "relatedAppName": { - "description": "The name of the application being tested.", - "type": "string" - } - }, - "required": ["relatedAppName"] -} diff --git a/packages/schematics/angular/enum/index_spec.ts b/packages/schematics/angular/enum/index_spec.ts index f6bee88e7243..1b0e8edcad0d 100644 --- a/packages/schematics/angular/enum/index_spec.ts +++ b/packages/schematics/angular/enum/index_spec.ts @@ -41,13 +41,6 @@ describe('Enum Schematic', () => { appTree = await schematicRunner.runSchematic('application', appOptions, appTree); }); - it('should create an enumeration', async () => { - const tree = await schematicRunner.runSchematic('enum', defaultOptions, appTree); - - const files = tree.files; - expect(files).toContain('/projects/bar/src/app/foo.ts'); - }); - it('should create an enumeration', async () => { const tree = await schematicRunner.runSchematic('enum', defaultOptions, appTree); diff --git a/packages/schematics/angular/library/index_spec.ts b/packages/schematics/angular/library/index_spec.ts index bf4f8714294e..9d76bb913d17 100644 --- a/packages/schematics/angular/library/index_spec.ts +++ b/packages/schematics/angular/library/index_spec.ts @@ -414,7 +414,7 @@ describe('Library Schematic', () => { expect(workspace.projects.foo.architect.test.builder).toBe('@angular/build:unit-test'); }); - it(`should add 'unit-test' test builder`, async () => { + it(`should add 'unit-test' test builder when vitest is available`, async () => { const packageJson = getJsonFileContent(workspaceTree, 'package.json'); packageJson['devDependencies']['vitest'] = '^4.0.0'; workspaceTree.overwrite('package.json', JSON.stringify(packageJson)); diff --git a/packages/schematics/angular/migrations/add-istanbul-instrumenter/migration.ts b/packages/schematics/angular/migrations/add-istanbul-instrumenter/migration.ts new file mode 100644 index 000000000000..d3ccb16facd3 --- /dev/null +++ b/packages/schematics/angular/migrations/add-istanbul-instrumenter/migration.ts @@ -0,0 +1,52 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { Rule } from '@angular-devkit/schematics'; +import { DependencyType, ExistingBehavior, addDependency } from '../../utility/dependency'; +import { latestVersions } from '../../utility/latest-versions'; +import { allTargetOptions, getWorkspace } from '../../utility/workspace'; +import { Builders } from '../../utility/workspace-models'; + +export default function (): Rule { + return async (tree) => { + const workspace = await getWorkspace(tree); + let needInstrumenter = false; + + for (const [, project] of workspace.projects) { + for (const [, target] of project.targets) { + if (target.builder === Builders.Karma || target.builder === Builders.BuildKarma) { + needInstrumenter = true; + break; + } + + if (target.builder === Builders.BuildUnitTest) { + for (const [, options] of allTargetOptions(target)) { + if (options['runner'] === 'karma') { + needInstrumenter = true; + break; + } + } + } + + if (needInstrumenter) { + break; + } + } + if (needInstrumenter) { + break; + } + } + + if (needInstrumenter) { + return addDependency('istanbul-lib-instrument', latestVersions['istanbul-lib-instrument'], { + type: DependencyType.Dev, + existing: ExistingBehavior.Skip, + }); + } + }; +} diff --git a/packages/schematics/angular/migrations/add-istanbul-instrumenter/migration_spec.ts b/packages/schematics/angular/migrations/add-istanbul-instrumenter/migration_spec.ts new file mode 100644 index 000000000000..e9d855b29b9f --- /dev/null +++ b/packages/schematics/angular/migrations/add-istanbul-instrumenter/migration_spec.ts @@ -0,0 +1,103 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +/* eslint-disable @typescript-eslint/no-explicit-any */ + +import { EmptyTree } from '@angular-devkit/schematics'; +import { SchematicTestRunner, UnitTestTree } from '@angular-devkit/schematics/testing'; + +describe('Migration to add istanbul-lib-instrument', () => { + const schematicRunner = new SchematicTestRunner( + 'migrations', + require.resolve('../migration-collection.json'), + ); + + let tree: UnitTestTree; + beforeEach(() => { + tree = new UnitTestTree(new EmptyTree()); + tree.create( + '/package.json', + JSON.stringify({ + devDependencies: {}, + }), + ); + }); + + function createWorkspace(builder: string, options?: any, configurations?: any) { + tree.create( + '/angular.json', + JSON.stringify({ + version: 1, + projects: { + app: { + root: '', + targets: { + test: { + builder, + options, + configurations, + }, + }, + }, + }, + }), + ); + } + + async function expectDependency(defined: boolean) { + const newTree = await schematicRunner.runSchematic('add-istanbul-instrumenter', {}, tree); + const { devDependencies } = newTree.readJson('/package.json') as any; + if (defined) { + expect(devDependencies['istanbul-lib-instrument']).toBeDefined(); + } else { + expect(devDependencies['istanbul-lib-instrument']).toBeUndefined(); + } + } + + it('should add istanbul-lib-instrument for @angular-devkit/build-angular:karma', async () => { + createWorkspace('@angular-devkit/build-angular:karma'); + + await expectDependency(true); + }); + + it('should add istanbul-lib-instrument for @angular/build:karma', async () => { + createWorkspace('@angular/build:karma'); + + await expectDependency(true); + }); + + it('should add istanbul-lib-instrument for @angular/build:unit-test with runner: karma', async () => { + createWorkspace('@angular/build:unit-test', { runner: 'karma' }); + + await expectDependency(true); + }); + + it('should add istanbul-lib-instrument if runner: karma is in configuration', async () => { + createWorkspace('@angular/build:unit-test', undefined, { ci: { runner: 'karma' } }); + + await expectDependency(true); + }); + + it('should NOT add istanbul-lib-instrument for @angular/build:unit-test with runner: vitest', async () => { + createWorkspace('@angular/build:unit-test', { runner: 'vitest' }); + + await expectDependency(false); + }); + + it('should NOT add istanbul-lib-instrument for @angular/build:unit-test with no runner specified (default vitest)', async () => { + createWorkspace('@angular/build:unit-test', {}); + + await expectDependency(false); + }); + + it('should NOT add istanbul-lib-instrument if no karma builder is used', async () => { + createWorkspace('@angular-devkit/build-angular:browser'); + + await expectDependency(false); + }); +}); diff --git a/packages/schematics/angular/migrations/migrate-karma-to-vitest/constants.ts b/packages/schematics/angular/migrations/migrate-karma-to-vitest/constants.ts new file mode 100644 index 000000000000..dbf38fcbba7c --- /dev/null +++ b/packages/schematics/angular/migrations/migrate-karma-to-vitest/constants.ts @@ -0,0 +1,44 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +export const SUPPORTED_REPORTERS = new Set([ + 'default', + 'verbose', + 'dots', + 'json', + 'junit', + 'tap', + 'tap-flat', + 'html', +]); + +export const SUPPORTED_COVERAGE_REPORTERS = new Set([ + 'html', + 'lcov', + 'lcovonly', + 'text', + 'text-summary', + 'cobertura', + 'json', + 'json-summary', +]); + +export const BUILD_OPTIONS_KEYS = [ + 'assets', + 'styles', + 'scripts', + 'polyfills', + 'inlineStyleLanguage', + 'stylePreprocessorOptions', + 'externalDependencies', + 'loader', + 'define', + 'fileReplacements', + 'webWorkerTsConfig', + 'aot', +]; diff --git a/packages/schematics/angular/migrations/migrate-karma-to-vitest/karma-processor.ts b/packages/schematics/angular/migrations/migrate-karma-to-vitest/karma-processor.ts new file mode 100644 index 000000000000..9fc773470c52 --- /dev/null +++ b/packages/schematics/angular/migrations/migrate-karma-to-vitest/karma-processor.ts @@ -0,0 +1,167 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import type { json } from '@angular-devkit/core'; +import { SchematicContext, Tree } from '@angular-devkit/schematics'; +import { KarmaConfigAnalysis, analyzeKarmaConfig } from '../karma/karma-config-analyzer'; +import { compareKarmaConfigToDefault, hasDifferences } from '../karma/karma-config-comparer'; +import { SUPPORTED_COVERAGE_REPORTERS, SUPPORTED_REPORTERS } from './constants'; + +function extractReporters( + analysis: KarmaConfigAnalysis, + options: Record, + projectName: string, + context: SchematicContext, +): void { + const reporters = analysis.settings.get('reporters'); + if (Array.isArray(reporters)) { + const mappedReporters: string[] = []; + for (const r of reporters) { + if (typeof r === 'string') { + if (r === 'progress') { + mappedReporters.push('default'); + } else if (r === 'kjhtml') { + context.logger.warn( + `Project "${projectName}" uses the "kjhtml" reporter. ` + + `This has not been automatically mapped. ` + + `For an interactive test UI in Vitest, consider setting the "ui" option to true in your test target options ` + + `and installing "@vitest/ui".`, + ); + } else if (SUPPORTED_REPORTERS.has(r)) { + mappedReporters.push(r); + } else { + context.logger.warn( + `Project "${projectName}" uses a custom Karma reporter "${r}". ` + + `This reporter cannot be automatically mapped to Vitest. ` + + `Please check the Vitest documentation for equivalent reporters.`, + ); + } + } else { + context.logger.warn( + `Project "${projectName}" has a non-string reporter in Karma config. ` + + `This cannot be automatically mapped to Vitest.`, + ); + } + } + if (mappedReporters.length > 0) { + options['reporters'] = [...new Set(mappedReporters)]; + } + } +} + +function extractCoverageSettings( + analysis: KarmaConfigAnalysis, + options: Record, + projectName: string, + context: SchematicContext, +): void { + const coverageReporter = analysis.settings.get('coverageReporter'); + if (typeof coverageReporter !== 'object' || coverageReporter === null) { + return; + } + + // Extract coverage reporters + const covReporters = (coverageReporter as Record)['reporters']; + if (Array.isArray(covReporters)) { + const mappedCovReporters: string[] = []; + for (const r of covReporters) { + let type: string | undefined; + if (typeof r === 'object' && r !== null && 'type' in r) { + if (typeof r['type'] === 'string') { + type = r['type']; + } + } else if (typeof r === 'string') { + type = r; + } + + if (type) { + if (SUPPORTED_COVERAGE_REPORTERS.has(type)) { + mappedCovReporters.push(type); + } else { + context.logger.warn( + `Project "${projectName}" uses a custom coverage reporter "${type}". ` + + `This reporter cannot be automatically mapped to Vitest. ` + + `Please check the Vitest documentation for equivalent coverage reporters.`, + ); + } + } + } + if (mappedCovReporters.length > 0) { + options['coverageReporters'] = [...new Set(mappedCovReporters)]; + } + } + + // Extract coverage thresholds + const check = (coverageReporter as Record)['check']; + if (typeof check === 'object' && check !== null) { + const global = (check as Record)['global']; + if (typeof global === 'object' && global !== null) { + const thresholds: Record = {}; + const keys = ['statements', 'branches', 'functions', 'lines']; + for (const key of keys) { + const value = (global as Record)[key]; + if (typeof value === 'number') { + thresholds[key] = value; + } + } + if (Object.keys(thresholds).length > 0) { + options['coverageThresholds'] = { + ...thresholds, + perFile: false, + }; + } + } + } +} + +export async function processKarmaConfig( + karmaConfig: string, + options: Record, + projectName: string, + context: SchematicContext, + tree: Tree, + removableKarmaConfigs: Map, + needDevkitPlugin: boolean, + manualMigrationFiles: string[], +): Promise { + if (tree.exists(karmaConfig)) { + const content = tree.readText(karmaConfig); + const analysis = analyzeKarmaConfig(content); + + extractReporters(analysis, options, projectName, context); + extractCoverageSettings(analysis, options, projectName, context); + + let isRemovable = removableKarmaConfigs.get(karmaConfig); + if (isRemovable === undefined) { + if (analysis.hasUnsupportedValues) { + isRemovable = false; + } else { + const diff = await compareKarmaConfigToDefault( + analysis, + projectName, + karmaConfig, + needDevkitPlugin, + ); + isRemovable = !hasDifferences(diff) && diff.isReliable; + } + removableKarmaConfigs.set(karmaConfig, isRemovable); + } + + if (isRemovable) { + tree.delete(karmaConfig); + } else { + context.logger.warn( + `Project "${projectName}" uses a custom Karma configuration file "${karmaConfig}". ` + + `Tests have been migrated to use Vitest, but you may need to manually migrate custom settings ` + + `from this Karma config to a Vitest config (e.g. vitest.config.ts).`, + ); + manualMigrationFiles.push(karmaConfig); + } + } + delete options['karmaConfig']; +} diff --git a/packages/schematics/angular/migrations/migrate-karma-to-vitest/migration.ts b/packages/schematics/angular/migrations/migrate-karma-to-vitest/migration.ts new file mode 100644 index 000000000000..dbf169ec22e5 --- /dev/null +++ b/packages/schematics/angular/migrations/migrate-karma-to-vitest/migration.ts @@ -0,0 +1,294 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import type { json } from '@angular-devkit/core'; +import { Rule, SchematicContext, Tree, chain } from '@angular-devkit/schematics'; +import { isDeepStrictEqual } from 'util'; +import { DependencyType, ExistingBehavior, addDependency } from '../../utility/dependency'; +import { latestVersions } from '../../utility/latest-versions'; +import { TargetDefinition, allTargetOptions, updateWorkspace } from '../../utility/workspace'; +import { Builders } from '../../utility/workspace-models'; +import { BUILD_OPTIONS_KEYS } from './constants'; +import { processKarmaConfig } from './karma-processor'; + +async function processTestTargetOptions( + testTarget: TargetDefinition, + projectName: string, + context: SchematicContext, + tree: Tree, + removableKarmaConfigs: Map, + customBuildOptions: Record>, + needDevkitPlugin: boolean, + manualMigrationFiles: string[], +): Promise { + let needsCoverage = false; + for (const [configName, options] of allTargetOptions(testTarget, false)) { + const configKey = configName || ''; + if (!customBuildOptions[configKey]) { + // Match Karma behavior where AOT was disabled by default + customBuildOptions[configKey] = { + aot: false, + optimization: false, + extractLicenses: false, + }; + } + + // Collect custom build options + for (const key of BUILD_OPTIONS_KEYS) { + if (options[key] !== undefined) { + customBuildOptions[configKey][key] = options[key]; + delete options[key]; + } + } + + // Map Karma options to Unit-Test options + if (options['codeCoverage'] !== undefined) { + options['coverage'] = options['codeCoverage']; + delete options['codeCoverage']; + } + + if (options['codeCoverageExclude'] !== undefined) { + options['coverageExclude'] = options['codeCoverageExclude']; + delete options['codeCoverageExclude']; + } + + if (options['coverage'] === true || options['coverageExclude'] !== undefined) { + needsCoverage = true; + } + + if (options['sourceMap'] !== undefined) { + context.logger.info( + `Project "${projectName}" has "sourceMap" set for tests. ` + + `In unit-test builder with Vitest, source maps are always enabled. The option has been removed.`, + ); + delete options['sourceMap']; + } + + // Convert browser list to array format if it is a comma-separated string + const browsers = options['browsers']; + if (typeof browsers === 'string') { + options['browsers'] = browsers.split(',').map((b) => b.trim()); + } else if (browsers === false) { + options['browsers'] = []; + } + + const updatedBrowsers = options['browsers']; + if (Array.isArray(updatedBrowsers) && updatedBrowsers.length > 0) { + context.logger.info( + `Project "${projectName}" has browsers configured for tests. ` + + `To run tests in a browser with Vitest, you will need to install either ` + + `"@vitest/browser-playwright" or "@vitest/browser-webdriverio" depending on your preference.`, + ); + } + + // Check if the karma configuration file can be safely removed and extract settings + const karmaConfig = options['karmaConfig']; + if (typeof karmaConfig === 'string') { + await processKarmaConfig( + karmaConfig, + options, + projectName, + context, + tree, + removableKarmaConfigs, + needDevkitPlugin, + manualMigrationFiles, + ); + } + + // Map the main entry file to the setupFiles of the unit-test builder + const mainFile = options['main']; + if (typeof mainFile === 'string') { + options['setupFiles'] = [mainFile]; + + context.logger.info( + `Project "${projectName}" uses a "main" entry file for tests: "${mainFile}". ` + + `This has been mapped to the unit-test builder "setupFiles" array. ` + + `Please ensure you remove any TestBed.initTestEnvironment calls from this file ` + + `as the builder now handles test environment initialization automatically.`, + ); + } + delete options['main']; + } + + return needsCoverage; +} + +function updateProjects(tree: Tree, context: SchematicContext): Rule { + return updateWorkspace(async (workspace) => { + let needsCoverage = false; + const removableKarmaConfigs = new Map(); + const migratedProjects: string[] = []; + const skippedNonApplications: string[] = []; + const skippedMissingAppBuilder: string[] = []; + const manualMigrationFiles: string[] = []; + + for (const [projectName, project] of workspace.projects) { + // Restrict to application types for now + if (project.extensions.projectType !== 'application') { + skippedNonApplications.push(projectName); + continue; + } + + // Check if build target uses the new application builder + const buildTarget = project.targets.get('build'); + if (!buildTarget || buildTarget.builder !== '@angular/build:application') { + context.logger.info( + `Project "${projectName}" cannot be migrated to Vitest yet. ` + + `The project must first be migrated to use the "@angular/build:application" builder.`, + ); + skippedMissingAppBuilder.push(projectName); + continue; + } + + // Find the test target to migrate + const testTarget = project.targets.get('test'); + if (!testTarget) { + continue; + } + + let isKarma = false; + let needDevkitPlugin = false; + // Check if target uses Karma builders + switch (testTarget.builder) { + case Builders.Karma: + isKarma = true; + needDevkitPlugin = true; + break; + case Builders.BuildKarma: + isKarma = true; + break; + } + + if (!isKarma) { + continue; + } + + // Store custom build options to move to a new build configuration if needed + const customBuildOptions: Record> = {}; + + const projectNeedsCoverage = await processTestTargetOptions( + testTarget, + projectName, + context, + tree, + removableKarmaConfigs, + customBuildOptions, + needDevkitPlugin, + manualMigrationFiles, + ); + + if (projectNeedsCoverage) { + needsCoverage = true; + } + + // If we have custom build options, create testing configurations + const baseOptions = buildTarget.options || {}; + + for (const [configKey, configOptions] of Object.entries(customBuildOptions)) { + const finalConfig: Record = {}; + + // Omit options that already have the same value in the base build options. + // Using isDeepStrictEqual for a deep comparison of arrays and objects. + for (const [key, value] of Object.entries(configOptions)) { + if (!isDeepStrictEqual(value, baseOptions[key])) { + finalConfig[key] = value; + } + } + + if (Object.keys(finalConfig).length > 0) { + buildTarget.configurations ??= {}; + const configurations = buildTarget.configurations; + + let configName = configKey ? `testing-${configKey}` : 'testing'; + if (configurations[configName]) { + let counter = 1; + while (configurations[`${configName}-${counter}`]) { + counter++; + } + configName = `${configName}-${counter}`; + } + + configurations[configName] = finalConfig; + + if (configKey === '') { + testTarget.options ??= {}; + testTarget.options['buildTarget'] = `:build:${configName}`; + } else { + testTarget.configurations ??= {}; + testTarget.configurations[configKey] ??= {}; + testTarget.configurations[configKey]['buildTarget'] = `:build:${configName}`; + } + } + } + + // Update builder + testTarget.builder = '@angular/build:unit-test'; + testTarget.options ??= {}; + testTarget.options['runner'] = 'vitest'; + + migratedProjects.push(projectName); + } + + // Log summary + context.logger.info('\n--- Karma to Vitest Migration Summary ---'); + context.logger.info(`Projects migrated: ${migratedProjects.length}`); + if (migratedProjects.length > 0) { + context.logger.info(` - ${migratedProjects.join(', ')}`); + } + context.logger.info(`Projects skipped (non-applications): ${skippedNonApplications.length}`); + if (skippedNonApplications.length > 0) { + context.logger.info(` - ${skippedNonApplications.join(', ')}`); + } + context.logger.info( + `Projects skipped (missing application builder): ${skippedMissingAppBuilder.length}`, + ); + if (skippedMissingAppBuilder.length > 0) { + context.logger.info(` - ${skippedMissingAppBuilder.join(', ')}`); + } + + const uniqueManualFiles = [...new Set(manualMigrationFiles)]; + if (uniqueManualFiles.length > 0) { + context.logger.warn(`\nThe following Karma configuration files require manual migration:`); + for (const file of uniqueManualFiles) { + context.logger.warn(` - ${file}`); + } + } + if (migratedProjects.length > 0) { + context.logger.info( + `\nNote: To refactor your test files from Jasmine to Vitest, consider running the following command:` + + `\n ng g @schematics/angular:refactor-jasmine-vitest `, + ); + } + context.logger.info('-----------------------------------------\n'); + + if (migratedProjects.length > 0) { + const rules = [ + addDependency('vitest', latestVersions['vitest'], { + type: DependencyType.Dev, + existing: ExistingBehavior.Skip, + }), + ]; + + if (needsCoverage) { + rules.push( + addDependency('@vitest/coverage-v8', latestVersions['@vitest/coverage-v8'], { + type: DependencyType.Dev, + existing: ExistingBehavior.Skip, + }), + ); + } + + return chain(rules); + } + }); +} + +export default function (): Rule { + return updateProjects; +} diff --git a/packages/schematics/angular/migrations/migrate-karma-to-vitest/migration_spec.ts b/packages/schematics/angular/migrations/migrate-karma-to-vitest/migration_spec.ts new file mode 100644 index 000000000000..e206002ab665 --- /dev/null +++ b/packages/schematics/angular/migrations/migrate-karma-to-vitest/migration_spec.ts @@ -0,0 +1,363 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +/* eslint-disable @typescript-eslint/no-explicit-any */ + +import { EmptyTree } from '@angular-devkit/schematics'; +import { SchematicTestRunner, UnitTestTree } from '@angular-devkit/schematics/testing'; +import { latestVersions } from '../../utility/latest-versions'; + +describe('Migration from Karma to Vitest unit-test builder', () => { + const schematicRunner = new SchematicTestRunner( + 'migrations', + require.resolve('../migration-collection.json'), + ); + + let tree: UnitTestTree; + beforeEach(() => { + tree = new UnitTestTree(new EmptyTree()); + tree.create( + '/package.json', + JSON.stringify({ + devDependencies: { + '@angular/build': latestVersions.AngularBuild, + }, + }), + ); + tree.create( + '/angular.json', + JSON.stringify({ + version: 1, + projects: { + app: { + root: '', + sourceRoot: 'src', + projectType: 'application', + targets: { + build: { + builder: '@angular/build:application', + options: { + tsConfig: 'tsconfig.app.json', + }, + }, + test: { + builder: '@angular/build:karma', + options: { + tsConfig: 'tsconfig.spec.json', + karmaConfig: 'karma.conf.js', + }, + }, + }, + }, + }, + }), + ); + }); + + it('should migrate standard karma builder to unit-test builder', async () => { + const newTree = await schematicRunner.runSchematic('migrate-karma-to-vitest', {}, tree); + const { projects } = newTree.readJson('/angular.json') as any; + + expect(projects.app.targets.test.builder).toBe('@angular/build:unit-test'); + expect(projects.app.targets.test.options.runner).toBe('vitest'); + expect(projects.app.targets.test.options.karmaConfig).toBeUndefined(); + }); + + it('should map codeCoverage to coverage', async () => { + const { projects } = tree.readJson('/angular.json') as any; + projects.app.targets.test.options.codeCoverage = true; + tree.overwrite('/angular.json', JSON.stringify({ version: 1, projects })); + + const newTree = await schematicRunner.runSchematic('migrate-karma-to-vitest', {}, tree); + const { projects: newProjects } = newTree.readJson('/angular.json') as any; + + expect(newProjects.app.targets.test.options.coverage).toBeTrue(); + expect(newProjects.app.targets.test.options.codeCoverage).toBeUndefined(); + }); + + it('should map browsers string to array', async () => { + const { projects } = tree.readJson('/angular.json') as any; + projects.app.targets.test.options.browsers = 'Chrome,Firefox'; + tree.overwrite('/angular.json', JSON.stringify({ version: 1, projects })); + + const newTree = await schematicRunner.runSchematic('migrate-karma-to-vitest', {}, tree); + const { projects: newProjects } = newTree.readJson('/angular.json') as any; + + expect(newProjects.app.targets.test.options.browsers).toEqual(['Chrome', 'Firefox']); + }); + + it('should move custom build options to testing configuration', async () => { + const { projects } = tree.readJson('/angular.json') as any; + projects.app.targets.test.options.assets = ['src/test.assets']; + tree.overwrite('/angular.json', JSON.stringify({ version: 1, projects })); + + const newTree = await schematicRunner.runSchematic('migrate-karma-to-vitest', {}, tree); + const { projects: newProjects } = newTree.readJson('/angular.json') as any; + + expect(newProjects.app.targets.build.configurations.testing.assets).toEqual([ + 'src/test.assets', + ]); + expect(newProjects.app.targets.build.configurations.testing.aot).toBeFalse(); + expect(newProjects.app.targets.build.configurations.testing.optimization).toBeFalse(); + expect(newProjects.app.targets.build.configurations.testing.extractLicenses).toBeFalse(); + expect(newProjects.app.targets.test.options.assets).toBeUndefined(); + expect(newProjects.app.targets.test.options.buildTarget).toBe(':build:testing'); + }); + + it('should move custom build options per configuration to testing configurations', async () => { + const { projects } = tree.readJson('/angular.json') as any; + projects.app.targets.test.configurations = { + ci: { + assets: ['src/ci.assets'], + }, + }; + tree.overwrite('/angular.json', JSON.stringify({ version: 1, projects })); + + const newTree = await schematicRunner.runSchematic('migrate-karma-to-vitest', {}, tree); + const { projects: newProjects } = newTree.readJson('/angular.json') as any; + + expect(newProjects.app.targets.build.configurations['testing-ci'].assets).toEqual([ + 'src/ci.assets', + ]); + expect(newProjects.app.targets.test.configurations.ci.buildTarget).toBe(':build:testing-ci'); + expect(newProjects.app.targets.test.configurations.ci.assets).toBeUndefined(); + }); + + it('should omit testing configuration if options match base build options', async () => { + const { projects } = tree.readJson('/angular.json') as any; + projects.app.targets.build.options.aot = false; + projects.app.targets.build.options.optimization = false; + projects.app.targets.build.options.extractLicenses = false; + tree.overwrite('/angular.json', JSON.stringify({ version: 1, projects })); + + const newTree = await schematicRunner.runSchematic('migrate-karma-to-vitest', {}, tree); + const { projects: newProjects } = newTree.readJson('/angular.json') as any; + + expect(newProjects.app.targets.build.configurations?.testing).toBeUndefined(); + expect(newProjects.app.targets.test.options.buildTarget).toBeUndefined(); + }); + + it('should skip migration for library projects', async () => { + const { projects } = tree.readJson('/angular.json') as any; + projects.app.projectType = 'library'; + tree.overwrite('/angular.json', JSON.stringify({ version: 1, projects })); + + const newTree = await schematicRunner.runSchematic('migrate-karma-to-vitest', {}, tree); + const { projects: newProjects } = newTree.readJson('/angular.json') as any; + + expect(newProjects.app.targets.test.builder).toBe('@angular/build:karma'); + }); + + it('should skip migration if build target is not @angular/build:application', async () => { + const { projects } = tree.readJson('/angular.json') as any; + projects.app.targets.build.builder = '@angular-devkit/build-angular:browser'; + tree.overwrite('/angular.json', JSON.stringify({ version: 1, projects })); + + const newTree = await schematicRunner.runSchematic('migrate-karma-to-vitest', {}, tree); + const { projects: newProjects } = newTree.readJson('/angular.json') as any; + + expect(newProjects.app.targets.test.builder).toBe('@angular/build:karma'); + }); + + it('should map reporters from karma config', async () => { + tree.create( + 'karma.conf.js', + ` +module.exports = function (config) { + config.set({ + reporters: ['progress', 'dots', 'kjhtml', 'custom'], + }); +}; +`, + ); + + const newTree = await schematicRunner.runSchematic('migrate-karma-to-vitest', {}, tree); + const { projects } = newTree.readJson('/angular.json') as any; + + expect(projects.app.targets.test.options.reporters).toEqual(['default', 'dots']); + }); + + it('should map coverage reporters from karma config', async () => { + tree.create( + 'karma.conf.js', + ` +module.exports = function (config) { + config.set({ + coverageReporter: { + reporters: [ + { type: 'html' }, + { type: 'text-summary' }, + 'lcov' + ] + }, + }); +}; +`, + ); + + const newTree = await schematicRunner.runSchematic('migrate-karma-to-vitest', {}, tree); + const { projects } = newTree.readJson('/angular.json') as any; + + expect(projects.app.targets.test.options.coverageReporters).toEqual([ + 'html', + 'text-summary', + 'lcov', + ]); + }); + + it('should map coverage thresholds from karma config', async () => { + tree.create( + 'karma.conf.js', + ` +module.exports = function (config) { + config.set({ + coverageReporter: { + check: { + global: { + statements: 80, + branches: 70, + functions: 60, + lines: 50 + } + } + }, + }); +}; +`, + ); + + const newTree = await schematicRunner.runSchematic('migrate-karma-to-vitest', {}, tree); + const { projects } = newTree.readJson('/angular.json') as any; + + expect(projects.app.targets.test.options.coverageThresholds).toEqual({ + statements: 80, + branches: 70, + functions: 60, + lines: 50, + perFile: false, + }); + }); + + it('should restrict and deduplicate coverage reporters from karma config', async () => { + tree.create( + 'karma.conf.js', + ` +module.exports = function (config) { + config.set({ + coverageReporter: { + reporters: [ + { type: 'html' }, + { type: 'text-summary' }, + { type: 'custom' }, + 'html', + 'lcov' + ] + }, + }); +}; +`, + ); + + const newTree = await schematicRunner.runSchematic('migrate-karma-to-vitest', {}, tree); + const { projects } = newTree.readJson('/angular.json') as any; + + expect(projects.app.targets.test.options.coverageReporters).toEqual([ + 'html', + 'text-summary', + 'lcov', + ]); + }); + + it('should add vitest dependency', async () => { + const newTree = await schematicRunner.runSchematic('migrate-karma-to-vitest', {}, tree); + const { devDependencies } = newTree.readJson('/package.json') as any; + + expect(devDependencies.vitest).toBe(latestVersions['vitest']); + }); + + it('should delete default karma.conf.js', async () => { + const { projects } = tree.readJson('/angular.json') as any; + projects.app.targets.test.builder = '@angular-devkit/build-angular:karma'; + tree.overwrite('/angular.json', JSON.stringify({ version: 1, projects })); + + const DEFAULT_KARMA_CONFIG = ` +module.exports = function (config) { + config.set({ + basePath: '', + frameworks: ['jasmine', '@angular-devkit/build-angular'], + plugins: [ + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-jasmine-html-reporter'), + require('karma-coverage'), + require('@angular-devkit/build-angular/plugins/karma') + ], + client: { + jasmine: {}, + }, + jasmineHtmlReporter: { + suppressAll: true + }, + coverageReporter: { + dir: require('path').join(__dirname, './coverage/app'), + subdir: '.', + reporters: [ + { type: 'html' }, + { type: 'text-summary' } + ] + }, + reporters: ['progress', 'kjhtml'], + browsers: ['Chrome'], + restartOnFileChange: true + }); +}; +`; + tree.create('karma.conf.js', DEFAULT_KARMA_CONFIG); + + const newTree = await schematicRunner.runSchematic('migrate-karma-to-vitest', {}, tree); + expect(newTree.exists('karma.conf.js')).toBeFalse(); + }); + it('should shift main compilation entry file directly into setupFiles array', async () => { + const { projects } = tree.readJson('/angular.json') as any; + projects.app.targets.test.options.main = 'src/test.ts'; + tree.overwrite('/angular.json', JSON.stringify({ version: 1, projects })); + + const newTree = await schematicRunner.runSchematic('migrate-karma-to-vitest', {}, tree); + const { projects: newProjects } = newTree.readJson('/angular.json') as any; + + expect(newProjects.app.targets.test.options.setupFiles).toEqual(['src/test.ts']); + expect(newProjects.app.targets.test.options.main).toBeUndefined(); + }); + it('should generate unique testing configuration name preventing collision overwrites', async () => { + const { projects } = tree.readJson('/angular.json') as any; + projects.app.targets.build.configurations = { + testing: { assets: [] }, + 'testing-1': { assets: [] }, + }; + projects.app.targets.test.options.assets = ['src/test.assets']; + tree.overwrite('/angular.json', JSON.stringify({ version: 1, projects })); + + const newTree = await schematicRunner.runSchematic('migrate-karma-to-vitest', {}, tree); + const { projects: newProjects } = newTree.readJson('/angular.json') as any; + + expect(newProjects.app.targets.build.configurations['testing-2'].assets).toEqual([ + 'src/test.assets', + ]); + expect(newProjects.app.targets.test.options.buildTarget).toBe(':build:testing-2'); + }); + it('should inject @vitest/coverage-v8 whenever coverage presence is detected', async () => { + const { projects } = tree.readJson('/angular.json') as any; + projects.app.targets.test.options.codeCoverage = true; + tree.overwrite('/angular.json', JSON.stringify({ version: 1, projects })); + + const newTree = await schematicRunner.runSchematic('migrate-karma-to-vitest', {}, tree); + const { devDependencies } = newTree.readJson('/package.json') as any; + + expect(devDependencies['@vitest/coverage-v8']).toBe(latestVersions['@vitest/coverage-v8']); + }); +}); diff --git a/packages/schematics/angular/migrations/migration-collection.json b/packages/schematics/angular/migrations/migration-collection.json index 502d121784fd..fd5dc71aea15 100644 --- a/packages/schematics/angular/migrations/migration-collection.json +++ b/packages/schematics/angular/migrations/migration-collection.json @@ -1,8 +1,13 @@ { "encapsulation": false, "schematics": { + "add-istanbul-instrumenter": { + "version": "22.0.0", + "factory": "./add-istanbul-instrumenter/migration", + "description": "Add istanbul-lib-instrument to devDependencies if Karma unit testing is used." + }, "use-application-builder": { - "version": "21.0.0", + "version": "22.0.0", "factory": "./use-application-builder/migration", "description": "Migrate application projects to the new build system. Application projects that are using the '@angular-devkit/build-angular' package's 'browser' and/or 'browser-esbuild' builders will be migrated to use the new 'application' builder. You can read more about this, including known issues and limitations, here: https://angular.dev/tools/cli/build-system-migration", "optional": true, @@ -14,15 +19,16 @@ "factory": "./karma/migration", "description": "Remove any karma configuration files that only contain the default content. The default configuration is automatically available without a specific project file." }, - "update-typescript-lib": { - "version": "21.0.0", - "factory": "./update-typescript-lib/migration", - "description": "Updates the 'lib' property in tsconfig files to use 'es2022' or a more modern version." + "migrate-karma-to-vitest": { + "version": "22.0.0", + "factory": "./migrate-karma-to-vitest/migration", + "description": "Migrate projects using legacy Karma unit-test builder to the new unit-test builder with Vitest.", + "optional": true }, - "update-module-resolution": { - "version": "21.0.0", - "factory": "./update-module-resolution/migration", - "description": "Update 'moduleResolution' to 'bundler' in TypeScript configurations. You can read more about this, here: https://www.typescriptlang.org/tsconfig/#moduleResolution" + "update-workspace-config": { + "version": "22.0.0", + "factory": "./update-workspace-config/migration", + "description": "Update the angular workspace configuration." } } } diff --git a/packages/schematics/angular/migrations/update-module-resolution/migration.ts b/packages/schematics/angular/migrations/update-module-resolution/migration.ts deleted file mode 100644 index ca0419a4eeab..000000000000 --- a/packages/schematics/angular/migrations/update-module-resolution/migration.ts +++ /dev/null @@ -1,60 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import { JsonObject } from '@angular-devkit/core'; -import { Rule, Tree } from '@angular-devkit/schematics'; -import { JSONFile } from '../../utility/json-file'; -import { allTargetOptions, allWorkspaceTargets, getWorkspace } from '../../utility/workspace'; - -export default function (): Rule { - return async (host) => { - const uniqueTsConfigs = new Set(); - - if (host.exists('tsconfig.json')) { - // Workspace level tsconfig - uniqueTsConfigs.add('tsconfig.json'); - } - - const workspace = await getWorkspace(host); - for (const [, target] of allWorkspaceTargets(workspace)) { - for (const [, opt] of allTargetOptions(target)) { - if (typeof opt?.tsConfig === 'string') { - uniqueTsConfigs.add(opt.tsConfig); - } - } - } - - for (const tsConfig of uniqueTsConfigs) { - if (host.exists(tsConfig)) { - updateModuleResolution(host, tsConfig); - } - } - }; -} - -function updateModuleResolution(host: Tree, tsConfigPath: string): void { - const json = new JSONFile(host, tsConfigPath); - const jsonPath = ['compilerOptions']; - const compilerOptions = json.get(jsonPath); - - if (compilerOptions && typeof compilerOptions === 'object') { - const { moduleResolution, module } = compilerOptions as JsonObject; - if (typeof moduleResolution !== 'string' || moduleResolution.toLowerCase() === 'bundler') { - return; - } - - if (typeof module === 'string' && module.toLowerCase() === 'preserve') { - return; - } - - json.modify(jsonPath, { - ...compilerOptions, - 'moduleResolution': 'bundler', - }); - } -} diff --git a/packages/schematics/angular/migrations/update-module-resolution/migration_spec.ts b/packages/schematics/angular/migrations/update-module-resolution/migration_spec.ts deleted file mode 100644 index 53448e80b66a..000000000000 --- a/packages/schematics/angular/migrations/update-module-resolution/migration_spec.ts +++ /dev/null @@ -1,118 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import { isJsonObject } from '@angular-devkit/core'; -import { EmptyTree } from '@angular-devkit/schematics'; -import { SchematicTestRunner, UnitTestTree } from '@angular-devkit/schematics/testing'; -import { Builders, ProjectType, WorkspaceSchema } from '../../utility/workspace-models'; - -describe('Migration to update moduleResolution', () => { - const schematicName = 'update-module-resolution'; - const schematicRunner = new SchematicTestRunner( - 'migrations', - require.resolve('../migration-collection.json'), - ); - - function createJsonFile(tree: UnitTestTree, filePath: string, content: {}): void { - const stringifiedContent = JSON.stringify(content, undefined, 2); - if (tree.exists(filePath)) { - tree.overwrite(filePath, stringifiedContent); - } else { - tree.create(filePath, stringifiedContent); - } - } - - function getCompilerOptionsValue(tree: UnitTestTree, filePath: string): Record { - const json = tree.readJson(filePath); - if (isJsonObject(json) && isJsonObject(json.compilerOptions)) { - return json.compilerOptions; - } - - throw new Error(`Cannot retrieve 'compilerOptions'.`); - } - - const angularConfig: WorkspaceSchema = { - version: 1, - projects: { - app: { - root: '', - sourceRoot: 'src', - projectType: ProjectType.Application, - prefix: 'app', - architect: { - build: { - builder: Builders.Browser, - options: { - tsConfig: 'src/tsconfig.app.json', - main: '', - polyfills: '', - }, - configurations: { - production: { - tsConfig: 'src/tsconfig.app.prod.json', - }, - }, - }, - test: { - builder: Builders.Karma, - options: { - karmaConfig: '', - tsConfig: 'src/tsconfig.spec.json', - }, - }, - }, - }, - }, - }; - - let tree: UnitTestTree; - beforeEach(() => { - tree = new UnitTestTree(new EmptyTree()); - const compilerOptions = { module: 'es2020', moduleResolution: 'node' }; - const configWithExtends = { extends: './tsconfig.json', compilerOptions }; - - // Workspace - createJsonFile(tree, 'angular.json', angularConfig); - createJsonFile(tree, 'tsconfig.json', { compilerOptions }); - - // Application - createJsonFile(tree, 'src/tsconfig.app.json', configWithExtends); - createJsonFile(tree, 'src/tsconfig.app.prod.json', configWithExtends); - createJsonFile(tree, 'src/tsconfig.spec.json', { compilerOptions }); - }); - - it(`should update moduleResolution to 'bundler' in workspace 'tsconfig.json'`, async () => { - const newTree = await schematicRunner.runSchematic(schematicName, {}, tree); - const compilerOptions = getCompilerOptionsValue(newTree, 'tsconfig.json'); - expect(compilerOptions).toEqual( - jasmine.objectContaining({ - moduleResolution: 'bundler', - }), - ); - }); - - it(`should update moduleResolution to 'bundler' in builder tsconfig`, async () => { - const newTree = await schematicRunner.runSchematic(schematicName, {}, tree); - const compilerOptions = getCompilerOptionsValue(newTree, 'src/tsconfig.spec.json'); - expect(compilerOptions).toEqual( - jasmine.objectContaining({ - moduleResolution: 'bundler', - }), - ); - }); - - it('should not update moduleResolution when module is preserve', async () => { - createJsonFile(tree, 'tsconfig.json', { - compilerOptions: { module: 'preserve', moduleResolution: 'node' }, - }); - - const newTree = await schematicRunner.runSchematic(schematicName, {}, tree); - const compilerOptions = getCompilerOptionsValue(newTree, 'tsconfig.json'); - expect(compilerOptions).toEqual({ module: 'preserve', moduleResolution: 'node' }); - }); -}); diff --git a/packages/schematics/angular/migrations/update-typescript-lib/migration.ts b/packages/schematics/angular/migrations/update-typescript-lib/migration.ts deleted file mode 100644 index 9022bcedf578..000000000000 --- a/packages/schematics/angular/migrations/update-typescript-lib/migration.ts +++ /dev/null @@ -1,94 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import { Rule, Tree } from '@angular-devkit/schematics'; -import { JSONFile } from '../../utility/json-file'; -import { getWorkspace } from '../../utility/workspace'; - -export default function (): Rule { - return async (host, context) => { - // Workspace level tsconfig - if (host.exists('tsconfig.json')) { - updateLib(host, 'tsconfig.json'); - } - - const workspace = await getWorkspace(host); - - // Find all tsconfig which are references used by builders - for (const [, project] of workspace.projects) { - for (const [targetName, target] of project.targets) { - if (!target.options) { - continue; - } - - // Update all other known CLI builders that use a tsconfig - const tsConfigs = [target.options, ...Object.values(target.configurations || {})] - .filter((opt) => typeof opt?.tsConfig === 'string') - .map((opt) => (opt as { tsConfig: string }).tsConfig); - - const uniqueTsConfigs = new Set(tsConfigs); - for (const tsConfig of uniqueTsConfigs) { - if (host.exists(tsConfig)) { - updateLib(host, tsConfig); - } else { - context.logger.warn( - `'${tsConfig}' referenced in the '${targetName}' target does not exist.`, - ); - } - } - } - } - }; -} - -function updateLib(host: Tree, tsConfigPath: string): void { - const json = new JSONFile(host, tsConfigPath); - const jsonPath = ['compilerOptions', 'lib']; - const lib = json.get(jsonPath) as string[] | undefined; - - if (!lib || !Array.isArray(lib)) { - return; - } - - const esLibs = lib.filter((l) => typeof l === 'string' && l.toLowerCase().startsWith('es')); - const hasDom = lib.some((l) => typeof l === 'string' && l.toLowerCase() === 'dom'); - - if (esLibs.length === 0) { - return; - } - - const esLibToVersion = new Map(); - for (const l of esLibs) { - const version = l.toLowerCase().match(/^es(next|(\d+))$/)?.[1]; - if (version) { - esLibToVersion.set(l, version === 'next' ? Infinity : Number(version)); - } - } - - if (esLibToVersion.size === 0) { - return; - } - - const latestEsLib = [...esLibToVersion.entries()].sort(([, v1], [, v2]) => v2 - v1)[0]; - const latestVersion = latestEsLib[1]; - - if (hasDom) { - if (latestVersion <= 2022) { - json.remove(jsonPath); - } - - return; - } - - // No 'dom' with 'es' libs, so update 'es' lib. - if (latestVersion < 2022) { - const newLibs = lib.filter((l) => !esLibToVersion.has(l)); - newLibs.push('es2022'); - json.modify(jsonPath, newLibs); - } -} diff --git a/packages/schematics/angular/migrations/update-typescript-lib/migration_spec.ts b/packages/schematics/angular/migrations/update-typescript-lib/migration_spec.ts deleted file mode 100644 index 6cbfe6ebb00a..000000000000 --- a/packages/schematics/angular/migrations/update-typescript-lib/migration_spec.ts +++ /dev/null @@ -1,159 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import { isJsonObject } from '@angular-devkit/core'; -import { EmptyTree } from '@angular-devkit/schematics'; -import { SchematicTestRunner, UnitTestTree } from '@angular-devkit/schematics/testing'; -import { Builders, ProjectType, WorkspaceSchema } from '../../utility/workspace-models'; - -describe('Migration to update TypeScript lib', () => { - const schematicName = 'update-typescript-lib'; - - const schematicRunner = new SchematicTestRunner( - 'migrations', - require.resolve('../migration-collection.json'), - ); - - function createJsonFile(tree: UnitTestTree, filePath: string, content: {}): void { - const stringifiedContent = JSON.stringify(content, undefined, 2); - if (tree.exists(filePath)) { - tree.overwrite(filePath, stringifiedContent); - } else { - tree.create(filePath, stringifiedContent); - } - } - - function getCompilerOptions(tree: UnitTestTree, filePath: string): Record { - const json = tree.readJson(filePath); - if (isJsonObject(json) && isJsonObject(json.compilerOptions)) { - return json.compilerOptions; - } - - throw new Error(`Cannot retrieve 'compilerOptions'.`); - } - - function createWorkSpaceConfig(tree: UnitTestTree) { - const angularConfig: WorkspaceSchema = { - version: 1, - projects: { - app: { - root: '', - sourceRoot: 'src', - projectType: ProjectType.Application, - prefix: 'app', - architect: { - build: { - builder: Builders.Browser, - options: { - tsConfig: 'src/tsconfig.app.json', - main: '', - polyfills: '', - }, - configurations: { - production: { - tsConfig: 'src/tsconfig.app.prod.json', - }, - }, - }, - test: { - builder: Builders.Karma, - options: { - karmaConfig: '', - tsConfig: 'src/tsconfig.spec.json', - }, - }, - }, - }, - }, - }; - - createJsonFile(tree, 'angular.json', angularConfig); - } - - let tree: UnitTestTree; - beforeEach(() => { - tree = new UnitTestTree(new EmptyTree()); - createWorkSpaceConfig(tree); - - // Create tsconfigs - const compilerOptions = { lib: ['es2020', 'dom'] }; - const configWithExtends = { extends: './tsconfig.json', compilerOptions }; - - // Workspace - createJsonFile(tree, 'tsconfig.json', { compilerOptions }); - - // Application - createJsonFile(tree, 'src/tsconfig.app.json', configWithExtends); - createJsonFile(tree, 'src/tsconfig.app.prod.json', configWithExtends); - createJsonFile(tree, 'src/tsconfig.spec.json', { compilerOptions }); - }); - - it(`should remove 'lib' when 'dom' is present and ES version is less than 2022`, async () => { - const newTree = await schematicRunner.runSchematic(schematicName, {}, tree); - const compilerOptions = getCompilerOptions(newTree, 'tsconfig.json'); - expect(compilerOptions.lib).toBeUndefined(); - }); - - it(`should remove 'lib' when 'dom' is present and ES version is 2022`, async () => { - createJsonFile(tree, 'tsconfig.json', { compilerOptions: { lib: ['es2022', 'dom'] } }); - const newTree = await schematicRunner.runSchematic(schematicName, {}, tree); - const compilerOptions = getCompilerOptions(newTree, 'tsconfig.json'); - expect(compilerOptions.lib).toBeUndefined(); - }); - - it(`should not remove 'lib' when 'dom' is present and ES version is 'esnext'`, async () => { - createJsonFile(tree, 'tsconfig.json', { compilerOptions: { lib: ['esnext', 'dom'] } }); - const newTree = await schematicRunner.runSchematic(schematicName, {}, tree); - const compilerOptions = getCompilerOptions(newTree, 'tsconfig.json'); - expect(compilerOptions.lib).toEqual(['esnext', 'dom']); - }); - - it(`should update 'lib' to 'es2022' when 'dom' is not present and ES version is less than 2022`, async () => { - createJsonFile(tree, 'tsconfig.json', { compilerOptions: { lib: ['es2020'] } }); - const newTree = await schematicRunner.runSchematic(schematicName, {}, tree); - const compilerOptions = getCompilerOptions(newTree, 'tsconfig.json'); - expect(compilerOptions.lib).toEqual(['es2022']); - }); - - it(`should not update 'lib' when 'dom' is not present and ES version is 2022`, async () => { - createJsonFile(tree, 'tsconfig.json', { compilerOptions: { lib: ['es2022'] } }); - const newTree = await schematicRunner.runSchematic(schematicName, {}, tree); - const compilerOptions = getCompilerOptions(newTree, 'tsconfig.json'); - expect(compilerOptions.lib).toEqual(['es2022']); - }); - - it(`should not update 'lib' when 'dom' is not present and ES version is 'esnext'`, async () => { - createJsonFile(tree, 'tsconfig.json', { compilerOptions: { lib: ['esnext'] } }); - const newTree = await schematicRunner.runSchematic(schematicName, {}, tree); - const compilerOptions = getCompilerOptions(newTree, 'tsconfig.json'); - expect(compilerOptions.lib).toEqual(['esnext']); - }); - - it('should not error when a tsconfig is not found', async () => { - tree.delete('src/tsconfig.spec.json'); - await schematicRunner.runSchematic(schematicName, {}, tree); - }); - - it('should not error when compilerOptions is not defined', async () => { - createJsonFile(tree, 'tsconfig.json', {}); - await schematicRunner.runSchematic(schematicName, {}, tree); - }); - - it(`should not error when 'lib' is not defined`, async () => { - createJsonFile(tree, 'tsconfig.json', { compilerOptions: {} }); - await schematicRunner.runSchematic(schematicName, {}, tree); - }); - - it(`should remove 'lib' from all tsconfigs`, async () => { - const newTree = await schematicRunner.runSchematic(schematicName, {}, tree); - expect(getCompilerOptions(newTree, 'tsconfig.json').lib).toBeUndefined(); - expect(getCompilerOptions(newTree, 'src/tsconfig.app.json').lib).toBeUndefined(); - expect(getCompilerOptions(newTree, 'src/tsconfig.app.prod.json').lib).toBeUndefined(); - expect(getCompilerOptions(newTree, 'src/tsconfig.spec.json').lib).toBeUndefined(); - }); -}); diff --git a/packages/schematics/angular/migrations/update-workspace-config/migration.ts b/packages/schematics/angular/migrations/update-workspace-config/migration.ts new file mode 100644 index 000000000000..3abd89d35a80 --- /dev/null +++ b/packages/schematics/angular/migrations/update-workspace-config/migration.ts @@ -0,0 +1,47 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { isJsonObject } from '@angular-devkit/core'; +import { Rule } from '@angular-devkit/schematics'; +import { allTargetOptions, updateWorkspace } from '../../utility/workspace'; +import { Builders, ProjectType } from '../../utility/workspace-models'; + +/** + * Migration to update the angular workspace configuration. + */ +export default function (): Rule { + return updateWorkspace((workspace) => { + for (const project of workspace.projects.values()) { + if (project.extensions['projectType'] !== ProjectType.Application) { + continue; + } + + for (const target of project.targets.values()) { + if ( + target.builder !== Builders.Application && + target.builder !== Builders.BuildApplication + ) { + continue; + } + + for (const [, options] of allTargetOptions(target)) { + const ssr = options['ssr']; + if (!ssr || !isJsonObject(ssr)) { + continue; + } + + const platform = ssr['experimentalPlatform']; + if (platform) { + ssr['platform'] = platform; + delete ssr['experimentalPlatform']; + } + } + } + } + }); +} diff --git a/packages/schematics/angular/migrations/update-workspace-config/migration_spec.ts b/packages/schematics/angular/migrations/update-workspace-config/migration_spec.ts new file mode 100644 index 000000000000..a56247cf3a1a --- /dev/null +++ b/packages/schematics/angular/migrations/update-workspace-config/migration_spec.ts @@ -0,0 +1,103 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { EmptyTree } from '@angular-devkit/schematics'; +import { SchematicTestRunner, UnitTestTree } from '@angular-devkit/schematics/testing'; +import { Builders, ProjectType } from '../../utility/workspace-models'; + +describe('Migration to update the angular workspace configuration', () => { + const schematicName = 'update-workspace-config'; + const schematicRunner = new SchematicTestRunner( + 'migrations', + require.resolve('../migration-collection.json'), + ); + + let tree: UnitTestTree; + beforeEach(() => { + tree = new UnitTestTree(new EmptyTree()); + }); + + it('should rename experimentalPlatform to platform in application builder', async () => { + const angularConfig = { + version: 1, + projects: { + app: { + root: '', + sourceRoot: 'src', + projectType: ProjectType.Application, + prefix: 'app', + architect: { + build: { + builder: Builders.Application, + options: { + ssr: { + entry: 'src/server.ts', + experimentalPlatform: 'neutral', + }, + }, + configurations: { + production: { + ssr: { + experimentalPlatform: 'node', + }, + }, + }, + }, + }, + }, + }, + }; + + tree.create('/angular.json', JSON.stringify(angularConfig, undefined, 2)); + + const newTree = await schematicRunner.runSchematic(schematicName, {}, tree); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const config = newTree.readJson('/angular.json') as any; + const options = config.projects.app.architect.build.options; + const prodOptions = config.projects.app.architect.build.configurations.production; + + expect(options.ssr.platform).toBe('neutral'); + expect(options.ssr.experimentalPlatform).toBeUndefined(); + expect(prodOptions.ssr.platform).toBe('node'); + expect(prodOptions.ssr.experimentalPlatform).toBeUndefined(); + }); + + it('should not change other builders', async () => { + const angularConfig = { + version: 1, + projects: { + app: { + root: '', + sourceRoot: 'src', + projectType: ProjectType.Application, + prefix: 'app', + architect: { + build: { + builder: Builders.Browser, + options: { + ssr: { + experimentalPlatform: 'neutral', + }, + }, + }, + }, + }, + }, + }; + + tree.create('/angular.json', JSON.stringify(angularConfig, undefined, 2)); + + const newTree = await schematicRunner.runSchematic(schematicName, {}, tree); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const config = newTree.readJson('/angular.json') as any; + const options = config.projects.app.architect.build.options; + + expect(options.ssr.experimentalPlatform).toBe('neutral'); + expect(options.ssr.platform).toBeUndefined(); + }); +}); diff --git a/packages/schematics/angular/module/index_spec.ts b/packages/schematics/angular/module/index_spec.ts index 661142b66fc7..8224f3642111 100644 --- a/packages/schematics/angular/module/index_spec.ts +++ b/packages/schematics/angular/module/index_spec.ts @@ -70,15 +70,6 @@ describe('Module Schematic', () => { expect(content).toMatch(/imports: \[[^\]]*FooModule[^\]]*\]/m); }); - it('should import into another module when using flat', async () => { - const options = { ...defaultOptions, flat: true, module: 'app-module.ts' }; - - const tree = await schematicRunner.runSchematic('module', options, appTree); - const content = tree.readContent('/projects/bar/src/app/app-module.ts'); - expect(content).toMatch(/import { FooModule } from '.\/foo-module'/); - expect(content).toMatch(/imports: \[[^\]]*FooModule[^\]]*\]/m); - }); - it('should import into another module (deep)', async () => { let tree = appTree; diff --git a/packages/schematics/angular/ng-new/schema.json b/packages/schematics/angular/ng-new/schema.json index 3bbb0eb3dee4..30957b9342c1 100644 --- a/packages/schematics/angular/ng-new/schema.json +++ b/packages/schematics/angular/ng-new/schema.json @@ -59,13 +59,13 @@ "default": "projects" }, "inlineStyle": { - "description": "Include the styles for the initial application's root component directly within the `app.component.ts` file. By default, a separate stylesheet file (e.g., `app.component.css`) is created.", + "description": "Include the styles for the initial application's root component directly within the `app.ts` file. By default, a separate stylesheet file (e.g., `app.css`) is created.", "type": "boolean", "alias": "s", "x-user-analytics": "ep.ng_inline_style" }, "inlineTemplate": { - "description": "Include the HTML template for the initial application's root component directly within the `app.component.ts` file. By default, a separate template file (e.g., `app.component.html`) is created.", + "description": "Include the HTML template for the initial application's root component directly within the `app.ts` file. By default, a separate template file (e.g., `app.html`) is created.", "type": "boolean", "alias": "t", "x-user-analytics": "ep.ng_inline_template" diff --git a/packages/schematics/angular/refactor/jasmine-vitest/test-file-transformer_add-imports_spec.ts b/packages/schematics/angular/refactor/jasmine-vitest/test-file-transformer_add-imports_spec.ts index 1fd4beb6546e..6cef7fc3d5ca 100644 --- a/packages/schematics/angular/refactor/jasmine-vitest/test-file-transformer_add-imports_spec.ts +++ b/packages/schematics/angular/refactor/jasmine-vitest/test-file-transformer_add-imports_spec.ts @@ -8,60 +8,59 @@ import { expectTransformation } from './test-helpers'; -describe('Jasmine to Vitest Transformer', () => { - describe('addImports option', () => { - it('should add value imports when addImports is true', async () => { - const input = `spyOn(foo, 'bar');`; - const expected = ` +describe('Jasmine to Vitest Transformer - addImports option', () => { + it('should add value imports when addImports is true', async () => { + const input = `spyOn(foo, 'bar');`; + const expected = ` import { vi } from 'vitest'; vi.spyOn(foo, 'bar'); `; - await expectTransformation(input, expected, true); - }); + await expectTransformation(input, expected, true); + }); - it('should generate a single, combined import for value and type imports when addImports is true', async () => { - const input = ` + it('should generate a single, combined import for value and type imports when addImports is true', async () => { + const input = ` let mySpy: jasmine.Spy; spyOn(foo, 'bar'); `; - const expected = ` + const expected = ` import { type Mock, vi } from 'vitest'; let mySpy: Mock; vi.spyOn(foo, 'bar'); `; - await expectTransformation(input, expected, true); - }); + await expectTransformation(input, expected, true); + }); - it('should only add type imports when addImports is false', async () => { - const input = ` + it('should only add type imports when addImports is false', async () => { + const input = ` let mySpy: jasmine.Spy; spyOn(foo, 'bar'); `; - const expected = ` + const expected = ` import type { Mock } from 'vitest'; let mySpy: Mock; vi.spyOn(foo, 'bar'); `; - await expectTransformation(input, expected, false); - }); + await expectTransformation(input, expected, false); + }); - it('should not add an import if no Vitest APIs are used, even when addImports is true', async () => { - const input = `const a = 1;`; - const expected = `const a = 1;`; - await expectTransformation(input, expected, true); - }); + it('should not add an import if no Vitest APIs are used, even when addImports is true', async () => { + const input = `const a = 1;`; + const expected = `const a = 1;`; + await expectTransformation(input, expected, true); + }); - it('should add imports for top-level describe and it when addImports is true', async () => { - const input = ` + it('should add imports for top-level describe and it when addImports is true', async () => { + const input = ` describe('My Suite', () => { it('should do something', () => { // test content }); }); `; - const expected = ` + const expected = ` import { describe, it } from 'vitest'; describe('My Suite', () => { @@ -70,26 +69,26 @@ describe('Jasmine to Vitest Transformer', () => { }); }); `; - await expectTransformation(input, expected, true); - }); + await expectTransformation(input, expected, true); + }); - it('should add imports for top-level expect when addImports is true', async () => { - const input = `expect(true).toBe(true);`; - const expected = ` + it('should add imports for top-level expect when addImports is true', async () => { + const input = `expect(true).toBe(true);`; + const expected = ` import { expect } from 'vitest'; expect(true).toBe(true); `; - await expectTransformation(input, expected, true); - }); + await expectTransformation(input, expected, true); + }); - it('should add imports for beforeEach and afterEach when addImports is true', async () => { - const input = ` + it('should add imports for beforeEach and afterEach when addImports is true', async () => { + const input = ` describe('My Suite', () => { beforeEach(() => {}); afterEach(() => {}); }); `; - const expected = ` + const expected = ` import { afterEach, beforeEach, describe } from 'vitest'; describe('My Suite', () => { @@ -97,17 +96,17 @@ describe('Jasmine to Vitest Transformer', () => { afterEach(() => {}); }); `; - await expectTransformation(input, expected, true); - }); + await expectTransformation(input, expected, true); + }); - it('should add imports for beforeAll and afterAll when addImports is true', async () => { - const input = ` + it('should add imports for beforeAll and afterAll when addImports is true', async () => { + const input = ` describe('My Suite', () => { beforeAll(() => {}); afterAll(() => {}); }); `; - const expected = ` + const expected = ` import { afterAll, beforeAll, describe } from 'vitest'; describe('My Suite', () => { @@ -115,7 +114,6 @@ describe('Jasmine to Vitest Transformer', () => { afterAll(() => {}); }); `; - await expectTransformation(input, expected, true); - }); + await expectTransformation(input, expected, true); }); }); diff --git a/packages/schematics/angular/refactor/jasmine-vitest/test-file-transformer_spec.ts b/packages/schematics/angular/refactor/jasmine-vitest/test-file-transformer_spec.ts index abe1f3655cdd..d9f78c471e18 100644 --- a/packages/schematics/angular/refactor/jasmine-vitest/test-file-transformer_spec.ts +++ b/packages/schematics/angular/refactor/jasmine-vitest/test-file-transformer_spec.ts @@ -8,34 +8,33 @@ import { expectTransformation } from './test-helpers'; -describe('Jasmine to Vitest Transformer', () => { - describe('Nested Transformations', () => { - const testCases = [ - { - description: 'should handle nested transforms like a spy returning an asymmetric matcher', - input: `spyOn(service, 'getValue').and.returnValue(jasmine.any(Number));`, - expected: `vi.spyOn(service, 'getValue').mockReturnValue(expect.any(Number));`, - }, - { - description: 'should handle expectAsync resolving to an asymmetric matcher', - input: `await expectAsync(myPromise).toBeResolvedTo(jasmine.any(Number));`, - expected: `await expect(myPromise).resolves.toEqual(expect.any(Number));`, - }, - { - description: - 'should handle spying on a property that returns a promise and using expectAsync', - input: ` +describe('Jasmine to Vitest Transformer - Nested Transformations', () => { + const testCases = [ + { + description: 'should handle nested transforms like a spy returning an asymmetric matcher', + input: `spyOn(service, 'getValue').and.returnValue(jasmine.any(Number));`, + expected: `vi.spyOn(service, 'getValue').mockReturnValue(expect.any(Number));`, + }, + { + description: 'should handle expectAsync resolving to an asymmetric matcher', + input: `await expectAsync(myPromise).toBeResolvedTo(jasmine.any(Number));`, + expected: `await expect(myPromise).resolves.toEqual(expect.any(Number));`, + }, + { + description: + 'should handle spying on a property that returns a promise and using expectAsync', + input: ` spyOnProperty(service, 'myProp', 'get').and.returnValue(Promise.resolve(42)); await expectAsync(service.myProp).toBeResolvedTo(42); `, - expected: ` + expected: ` vi.spyOn(service, 'myProp', 'get').mockReturnValue(Promise.resolve(42)); await expect(service.myProp).resolves.toEqual(42); `, - }, - { - description: 'should handle a done callback that also uses timer mocks', - input: ` + }, + { + description: 'should handle a done callback that also uses timer mocks', + input: ` it('should handle timers and async', (done) => { jasmine.clock().install(); setTimeout(() => { @@ -46,7 +45,7 @@ describe('Jasmine to Vitest Transformer', () => { jasmine.clock().tick(100); }); `, - expected: ` + expected: ` it('should handle timers and async', async () => { vi.useFakeTimers(); setTimeout(() => { @@ -56,57 +55,57 @@ describe('Jasmine to Vitest Transformer', () => { vi.advanceTimersByTime(100); }); `, - }, - { - description: 'should handle toHaveBeenCalledOnceWith using an asymmetric matcher', - input: `expect(mySpy).toHaveBeenCalledOnceWith(jasmine.objectContaining({ id: 1 }));`, - expected: ` + }, + { + description: 'should handle toHaveBeenCalledOnceWith using an asymmetric matcher', + input: `expect(mySpy).toHaveBeenCalledOnceWith(jasmine.objectContaining({ id: 1 }));`, + expected: ` expect(mySpy).toHaveBeenCalledTimes(1); expect(mySpy).toHaveBeenCalledWith(expect.objectContaining({ id: 1 })); `, - }, - { - description: 'should handle withContext combined with a multi-statement matcher', - input: `expect(mySpy).withContext('custom message').toHaveBeenCalledOnceWith('foo');`, - expected: ` + }, + { + description: 'should handle withContext combined with a multi-statement matcher', + input: `expect(mySpy).withContext('custom message').toHaveBeenCalledOnceWith('foo');`, + expected: ` expect(mySpy, 'custom message').toHaveBeenCalledTimes(1); expect(mySpy, 'custom message').toHaveBeenCalledWith('foo'); `, - }, - { - description: 'should handle createSpyObj with complex return values', - input: `const spy = jasmine.createSpyObj('MyService', { getPromise: Promise.resolve(jasmine.any(String)) });`, - expected: ` + }, + { + description: 'should handle createSpyObj with complex return values', + input: `const spy = jasmine.createSpyObj('MyService', { getPromise: Promise.resolve(jasmine.any(String)) });`, + expected: ` const spy = { getPromise: vi.fn().mockName("MyService.getPromise").mockReturnValue(Promise.resolve(expect.any(String))), }; `, - }, - { - description: 'should handle arrayWithExactContents containing nested asymmetric matchers', - input: `expect(myArray).toEqual(jasmine.arrayWithExactContents([jasmine.objectContaining({ id: 1 })]));`, - /* eslint-disable max-len */ - expected: ` + }, + { + description: 'should handle arrayWithExactContents containing nested asymmetric matchers', + input: `expect(myArray).toEqual(jasmine.arrayWithExactContents([jasmine.objectContaining({ id: 1 })]));`, + /* eslint-disable max-len */ + expected: ` // TODO: vitest-migration: Verify this matches strict array content (multiset equality). Vitest's arrayContaining is a subset check. expect(myArray).toHaveLength(1); expect(myArray).toEqual(expect.arrayContaining([expect.objectContaining({ id: 1 })])); `, - /* eslint-enable max-len */ - }, - { - description: 'should handle a spy rejecting with an asymmetric matcher', - input: `spyOn(service, 'myMethod').and.rejectWith(jasmine.objectContaining({ code: 'ERROR' }));`, - expected: `vi.spyOn(service, 'myMethod').mockRejectedValue(expect.objectContaining({ code: 'ERROR' }));`, - }, - { - description: 'should handle a complex spy object with a property map and subsequent spyOn', - input: ` + /* eslint-enable max-len */ + }, + { + description: 'should handle a spy rejecting with an asymmetric matcher', + input: `spyOn(service, 'myMethod').and.rejectWith(jasmine.objectContaining({ code: 'ERROR' }));`, + expected: `vi.spyOn(service, 'myMethod').mockRejectedValue(expect.objectContaining({ code: 'ERROR' }));`, + }, + { + description: 'should handle a complex spy object with a property map and subsequent spyOn', + input: ` const myService = jasmine.createSpyObj('MyService', ['methodA'], { propA: 'valueA' }); spyOn(myService, 'methodA').and.returnValue('mocked value'); myService.methodA('test'); expect(myService.methodA).toHaveBeenCalledWith('test'); `, - expected: ` + expected: ` const myService = { methodA: vi.fn().mockName("MyService.methodA"), propA: 'valueA', @@ -115,58 +114,58 @@ describe('Jasmine to Vitest Transformer', () => { myService.methodA('test'); expect(myService.methodA).toHaveBeenCalledWith('test'); `, - }, - ]; + }, + ]; - testCases.forEach(({ description, input, expected }) => { - it(description, async () => { - await expectTransformation(input, expected); - }); + testCases.forEach(({ description, input, expected }) => { + it(description, async () => { + await expectTransformation(input, expected); }); }); +}); - describe('Comment Preservation', () => { - const testCases = [ - { - description: 'should preserve a comment before a spy', - input: ` +describe('Comment Preservation', () => { + const testCases = [ + { + description: 'should preserve a comment before a spy', + input: ` // This is an important spy spyOn(service, 'myMethod').and.returnValue(true); `, - expected: ` + expected: ` // This is an important spy vi.spyOn(service, 'myMethod').mockReturnValue(true); `, - }, - { - description: 'should preserve a multi-line comment between chained calls', - input: ` + }, + { + description: 'should preserve a multi-line comment between chained calls', + input: ` spyOn(service, 'myMethod') /* * This spy needs to return a specific value. */ .and.returnValue(true); `, - expected: ` + expected: ` vi.spyOn(service, 'myMethod') /* * This spy needs to return a specific value. */ .mockReturnValue(true); `, - }, - { - description: 'should preserve a trailing comment on a matcher line', - input: ` + }, + { + description: 'should preserve a trailing comment on a matcher line', + input: ` expect(mySpy).toHaveBeenCalledWith('foo'); // Trailing comment `, - expected: ` + expected: ` expect(mySpy).toHaveBeenCalledWith('foo'); // Trailing comment `, - }, - { - description: 'should preserve comments inside a done callback function', - input: ` + }, + { + description: 'should preserve comments inside a done callback function', + input: ` it('should do something async', (done) => { // Start the async operation setTimeout(() => { @@ -175,7 +174,7 @@ describe('Jasmine to Vitest Transformer', () => { }, 100); }); `, - expected: ` + expected: ` it('should do something async', async () => { // Start the async operation setTimeout(() => { @@ -183,26 +182,25 @@ describe('Jasmine to Vitest Transformer', () => { }, 100); }); `, - }, - { - description: 'should preserve comments around a multi-statement transformation', - input: ` + }, + { + description: 'should preserve comments around a multi-statement transformation', + input: ` // Check if the spy was called correctly expect(mySpy).toHaveBeenCalledOnceWith('foo'); `, - expected: ` + expected: ` // Check if the spy was called correctly expect(mySpy).toHaveBeenCalledTimes(1); expect(mySpy).toHaveBeenCalledWith('foo'); `, - skipped: true, - }, - ]; + skipped: true, + }, + ]; - testCases.forEach(({ description, input, expected, skipped }) => { - (skipped ? xit : it)(description, async () => { - await expectTransformation(input, expected); - }); + testCases.forEach(({ description, input, expected, skipped }) => { + (skipped ? xit : it)(description, async () => { + await expectTransformation(input, expected); }); }); }); diff --git a/packages/schematics/angular/refactor/jasmine-vitest/transformers/jasmine-lifecycle_spec.ts b/packages/schematics/angular/refactor/jasmine-vitest/transformers/jasmine-lifecycle_spec.ts index f41f5fa7ae32..611bb2330cd3 100644 --- a/packages/schematics/angular/refactor/jasmine-vitest/transformers/jasmine-lifecycle_spec.ts +++ b/packages/schematics/angular/refactor/jasmine-vitest/transformers/jasmine-lifecycle_spec.ts @@ -8,12 +8,11 @@ import { expectTransformation } from '../test-helpers'; -describe('Jasmine to Vitest Transformer', () => { - describe('transformDoneCallback', () => { - const testCases = [ - { - description: 'should transform an `it` block with a done callback to an async function', - input: ` +describe('Jasmine to Vitest Transformer - transformDoneCallback', () => { + const testCases = [ + { + description: 'should transform an `it` block with a done callback to an async function', + input: ` it('should do something async', (done) => { setTimeout(() => { expect(true).toBe(true); @@ -21,93 +20,93 @@ describe('Jasmine to Vitest Transformer', () => { }, 100); }); `, - expected: ` + expected: ` it('should do something async', async () => { setTimeout(() => { expect(true).toBe(true); }, 100); }); `, - }, - { - description: 'should transform a promise chain with a done callback to await', - input: ` + }, + { + description: 'should transform a promise chain with a done callback to await', + input: ` beforeEach((done) => { service.init().then(() => done()); }); `, - expected: ` + expected: ` beforeEach(async () => { await service.init().then(() => {}); }); `, - }, - { - description: 'should transform done.fail() to throw new Error()', - input: ` + }, + { + description: 'should transform done.fail() to throw new Error()', + input: ` it('should fail', (done) => { done.fail('it failed'); }); `, - expected: ` + expected: ` it('should fail', async () => { throw new Error('it failed'); }); `, - }, - { - description: 'should transform an `afterEach` block with a done callback', - input: 'afterEach((done) => { promise.then(done); });', - expected: 'afterEach(async () => { await promise; });', - }, - { - description: 'should transform a test with a function(done) signature', - input: ` + }, + { + description: 'should transform an `afterEach` block with a done callback', + input: 'afterEach((done) => { promise.then(done); });', + expected: 'afterEach(async () => { await promise; });', + }, + { + description: 'should transform a test with a function(done) signature', + input: ` it('should work with a function expression', function(done) { done(); }); `, - expected: ` + expected: ` it('should work with a function expression', async function() {}); `, - }, - { - description: 'should transform done.fail() without a message', - input: `it('fails', (done) => { done.fail(); });`, - expected: `it('fails', async () => { throw new Error(); });`, - }, - { - description: 'should handle promise rejections via catch', - input: ` + }, + { + description: 'should transform done.fail() without a message', + input: `it('fails', (done) => { done.fail(); });`, + expected: `it('fails', async () => { throw new Error(); });`, + }, + { + description: 'should handle promise rejections via catch', + input: ` it('should handle promise rejections via catch', (done) => { myPromise.catch(done.fail); }); `, - expected: ` + expected: ` it('should handle promise rejections via catch', async () => { await myPromise; }); `, - }, - { - description: 'should work with a custom done name', - input: ` + }, + { + description: 'should work with a custom done name', + input: ` it('should work with a custom done name', (finish) => { setTimeout(() => { finish(); }, 100); }); `, - expected: ` + expected: ` it('should work with a custom done name', async () => { setTimeout(() => { }, 100); }); `, - }, - { - description: 'should handle done in a finally block', - input: ` + }, + { + description: 'should handle done in a finally block', + input: ` it('should handle done in a finally block', (done) => { try { // some logic @@ -116,31 +115,31 @@ describe('Jasmine to Vitest Transformer', () => { } }); `, - expected: ` + expected: ` it('should handle done in a finally block', async () => { try { // some logic } finally {} }); `, - }, - { - description: 'should not transform a function with a parameter that is not a done callback', - input: ` + }, + { + description: 'should not transform a function with a parameter that is not a done callback', + input: ` it('should not transform a function with a parameter that is not a done callback', (value) => { expect(value).toBe(true); }); `, - expected: ` + expected: ` // TODO: vitest-migration: The 'done' callback was used in an unhandled way. Please migrate manually. it('should not transform a function with a parameter that is not a done callback', (value) => { expect(value).toBe(true); }); `, - }, - { - description: 'should handle a .then() call with a multi-statement body', - input: ` + }, + { + description: 'should handle a .then() call with a multi-statement body', + input: ` it('should handle a complex then', (done) => { let myValue = false; myPromise.then(() => { @@ -149,7 +148,7 @@ describe('Jasmine to Vitest Transformer', () => { }); }); `, - expected: ` + expected: ` it('should handle a complex then', async () => { let myValue = false; await myPromise.then(() => { @@ -157,97 +156,96 @@ describe('Jasmine to Vitest Transformer', () => { }); }); `, - }, - { - description: 'should add a TODO for unhandled done usage', - input: ` + }, + { + description: 'should add a TODO for unhandled done usage', + input: ` it('should do something with helper', (done) => { someHelper(done); }); `, - expected: ` + expected: ` // TODO: vitest-migration: The 'done' callback was used in an unhandled way. Please migrate manually. it('should do something with helper', (done) => { someHelper(done); }); `, - }, - ]; + }, + ]; - testCases.forEach(({ description, input, expected }) => { - it(description, async () => { - await expectTransformation(input, expected); - }); + testCases.forEach(({ description, input, expected }) => { + it(description, async () => { + await expectTransformation(input, expected); }); }); +}); - describe('transformPending', () => { - const testCases = [ - { - description: 'should transform a test with pending() to it.skip()', - input: ` +describe('transformPending', () => { + const testCases = [ + { + description: 'should transform a test with pending() to it.skip()', + input: ` it('is a work in progress', () => { pending('Not yet implemented'); }); `, - expected: ` + expected: ` it.skip('is a work in progress', () => { // TODO: vitest-migration: The pending() function was converted to a skipped test (\`it.skip\`). See: https://vitest.dev/api/vi.html#it-skip // pending('Not yet implemented'); }); `, - }, - { - description: 'should transform a test with pending() using function keyword', - input: ` + }, + { + description: 'should transform a test with pending() using function keyword', + input: ` it('is a work in progress', function() { pending('Not yet implemented'); }); `, - expected: ` + expected: ` it.skip('is a work in progress', function() { // TODO: vitest-migration: The pending() function was converted to a skipped test (\`it.skip\`). See: https://vitest.dev/api/vi.html#it-skip // pending('Not yet implemented'); }); `, - }, - ]; + }, + ]; - testCases.forEach(({ description, input, expected }) => { - it(description, async () => { - await expectTransformation(input, expected); - }); + testCases.forEach(({ description, input, expected }) => { + it(description, async () => { + await expectTransformation(input, expected); }); }); +}); - describe('transformFocusedAndSkippedTests', () => { - const testCases = [ - { - description: 'should transform fdescribe to describe.only', - input: `fdescribe('My Suite', () => {});`, - expected: `describe.only('My Suite', () => {});`, - }, - { - description: 'should transform fit to it.only', - input: `fit('My Test', () => {});`, - expected: `it.only('My Test', () => {});`, - }, - { - description: 'should transform xdescribe to describe.skip', - input: `xdescribe('My Suite', () => {});`, - expected: `describe.skip('My Suite', () => {});`, - }, - { - description: 'should transform xit to it.skip', - input: `xit('My Test', () => {});`, - expected: `it.skip('My Test', () => {});`, - }, - ]; +describe('transformFocusedAndSkippedTests', () => { + const testCases = [ + { + description: 'should transform fdescribe to describe.only', + input: `fdescribe('My Suite', () => {});`, + expected: `describe.only('My Suite', () => {});`, + }, + { + description: 'should transform fit to it.only', + input: `fit('My Test', () => {});`, + expected: `it.only('My Test', () => {});`, + }, + { + description: 'should transform xdescribe to describe.skip', + input: `xdescribe('My Suite', () => {});`, + expected: `describe.skip('My Suite', () => {});`, + }, + { + description: 'should transform xit to it.skip', + input: `xit('My Test', () => {});`, + expected: `it.skip('My Test', () => {});`, + }, + ]; - testCases.forEach(({ description, input, expected }) => { - it(description, async () => { - await expectTransformation(input, expected); - }); + testCases.forEach(({ description, input, expected }) => { + it(description, async () => { + await expectTransformation(input, expected); }); }); }); diff --git a/packages/schematics/angular/refactor/jasmine-vitest/transformers/jasmine-matcher_spec.ts b/packages/schematics/angular/refactor/jasmine-vitest/transformers/jasmine-matcher_spec.ts index a46fc63d2a01..c5e9f8d25a65 100644 --- a/packages/schematics/angular/refactor/jasmine-vitest/transformers/jasmine-matcher_spec.ts +++ b/packages/schematics/angular/refactor/jasmine-vitest/transformers/jasmine-matcher_spec.ts @@ -8,355 +8,351 @@ import { expectTransformation } from '../test-helpers'; -describe('Jasmine to Vitest Transformer', () => { - describe('transformAsymmetricMatchers', () => { - const testCases = [ - { - description: 'should transform jasmine.any(String) to expect.any(String)', - input: `expect(foo).toEqual(jasmine.any(String));`, - expected: `expect(foo).toEqual(expect.any(String));`, - }, - { - description: - 'should transform jasmine.objectContaining(...) to expect.objectContaining(...)', - input: `expect(foo).toEqual(jasmine.objectContaining({ bar: 'baz' }));`, - expected: `expect(foo).toEqual(expect.objectContaining({ bar: 'baz' }));`, - }, - { - description: 'should transform jasmine.anything() to expect.anything()', - input: `expect(foo).toEqual(jasmine.anything());`, - expected: `expect(foo).toEqual(expect.anything());`, - }, - { - description: 'should transform jasmine.stringMatching(...) to expect.stringMatching(...)', - input: `expect(foo).toEqual(jasmine.stringMatching(/some-pattern/));`, - expected: `expect(foo).toEqual(expect.stringMatching(/some-pattern/));`, - }, - { - description: 'should transform jasmine.arrayContaining(...) to expect.arrayContaining(...)', - input: `expect(foo).toEqual(jasmine.arrayContaining(['a']));`, - expected: `expect(foo).toEqual(expect.arrayContaining(['a']));`, - }, - { - description: - 'should transform jasmine.stringContaining(...) to expect.stringContaining(...)', - input: `expect(foo).toEqual(jasmine.stringContaining('substring'));`, - expected: `expect(foo).toEqual(expect.stringContaining('substring'));`, - }, - ]; +describe('Jasmine to Vitest Transformer - transformAsymmetricMatchers', () => { + const testCases = [ + { + description: 'should transform jasmine.any(String) to expect.any(String)', + input: `expect(foo).toEqual(jasmine.any(String));`, + expected: `expect(foo).toEqual(expect.any(String));`, + }, + { + description: 'should transform jasmine.objectContaining(...) to expect.objectContaining(...)', + input: `expect(foo).toEqual(jasmine.objectContaining({ bar: 'baz' }));`, + expected: `expect(foo).toEqual(expect.objectContaining({ bar: 'baz' }));`, + }, + { + description: 'should transform jasmine.anything() to expect.anything()', + input: `expect(foo).toEqual(jasmine.anything());`, + expected: `expect(foo).toEqual(expect.anything());`, + }, + { + description: 'should transform jasmine.stringMatching(...) to expect.stringMatching(...)', + input: `expect(foo).toEqual(jasmine.stringMatching(/some-pattern/));`, + expected: `expect(foo).toEqual(expect.stringMatching(/some-pattern/));`, + }, + { + description: 'should transform jasmine.arrayContaining(...) to expect.arrayContaining(...)', + input: `expect(foo).toEqual(jasmine.arrayContaining(['a']));`, + expected: `expect(foo).toEqual(expect.arrayContaining(['a']));`, + }, + { + description: 'should transform jasmine.stringContaining(...) to expect.stringContaining(...)', + input: `expect(foo).toEqual(jasmine.stringContaining('substring'));`, + expected: `expect(foo).toEqual(expect.stringContaining('substring'));`, + }, + ]; - testCases.forEach(({ description, input, expected }) => { - it(description, async () => { - await expectTransformation(input, expected); - }); + testCases.forEach(({ description, input, expected }) => { + it(description, async () => { + await expectTransformation(input, expected); }); }); +}); - describe('transformExpectAsync', () => { - const testCases = [ - { - description: 'should transform expectAsync(...).toBeResolved()', - input: `await expectAsync(myPromise).toBeResolved();`, - expected: `await expect(myPromise).resolves.not.toThrow();`, - }, - { - description: 'should transform expectAsync(...).toBeResolvedTo(value)', - input: `await expectAsync(myPromise).toBeResolvedTo(42);`, - expected: `await expect(myPromise).resolves.toEqual(42);`, - }, - { - description: 'should transform expectAsync(...).toBeRejected()', - input: `await expectAsync(myPromise).toBeRejected();`, - expected: `await expect(myPromise).rejects.toThrow();`, - }, - { - description: 'should transform expectAsync(...).toBeRejectedWith(error)', - input: `await expectAsync(myPromise).toBeRejectedWith('Error');`, - expected: `await expect(myPromise).rejects.toEqual('Error');`, - }, - { - description: 'should transform expectAsync(...).toBeRejectedWithError(ErrorClass, message)', - input: `await expectAsync(myPromise).toBeRejectedWithError(TypeError, 'Failed');`, - expected: `await expect(myPromise).rejects.toThrowError(TypeError, 'Failed');`, - }, - { - description: 'should add a TODO for an unknown expectAsync matcher', - input: `await expectAsync(myPromise).toBeSomethingElse();`, - expected: ` +describe('transformExpectAsync', () => { + const testCases = [ + { + description: 'should transform expectAsync(...).toBeResolved()', + input: `await expectAsync(myPromise).toBeResolved();`, + expected: `await expect(myPromise).resolves.not.toThrow();`, + }, + { + description: 'should transform expectAsync(...).toBeResolvedTo(value)', + input: `await expectAsync(myPromise).toBeResolvedTo(42);`, + expected: `await expect(myPromise).resolves.toEqual(42);`, + }, + { + description: 'should transform expectAsync(...).toBeRejected()', + input: `await expectAsync(myPromise).toBeRejected();`, + expected: `await expect(myPromise).rejects.toThrow();`, + }, + { + description: 'should transform expectAsync(...).toBeRejectedWith(error)', + input: `await expectAsync(myPromise).toBeRejectedWith('Error');`, + expected: `await expect(myPromise).rejects.toEqual('Error');`, + }, + { + description: 'should transform expectAsync(...).toBeRejectedWithError(ErrorClass, message)', + input: `await expectAsync(myPromise).toBeRejectedWithError(TypeError, 'Failed');`, + expected: `await expect(myPromise).rejects.toThrowError(TypeError, 'Failed');`, + }, + { + description: 'should add a TODO for an unknown expectAsync matcher', + input: `await expectAsync(myPromise).toBeSomethingElse();`, + expected: ` // TODO: vitest-migration: Unsupported expectAsync matcher ".toBeSomethingElse()" found. Please migrate this manually. await expectAsync(myPromise).toBeSomethingElse(); `, - }, - { - description: 'should add a specific TODO for toBePending', - input: `await expectAsync(myPromise).toBePending();`, - /* eslint-disable max-len */ - expected: ` + }, + { + description: 'should add a specific TODO for toBePending', + input: `await expectAsync(myPromise).toBePending();`, + /* eslint-disable max-len */ + expected: ` // TODO: vitest-migration: Unsupported matcher ".toBePending()" found. Vitest does not have a direct equivalent. Please migrate this manually, for example by using \`Promise.race\` to check if the promise settles within a short timeout. await expectAsync(myPromise).toBePending(); `, - /* eslint-enable max-len */ - }, - ]; + /* eslint-enable max-len */ + }, + ]; - testCases.forEach(({ description, input, expected }) => { - it(description, async () => { - await expectTransformation(input, expected); - }); + testCases.forEach(({ description, input, expected }) => { + it(description, async () => { + await expectTransformation(input, expected); }); }); +}); - describe('transformCalledOnceWith', () => { - const testCases = [ - { - description: 'should transform toHaveBeenCalledOnceWith(...) into two separate calls', - input: `expect(mySpy).toHaveBeenCalledOnceWith('foo', 'bar');`, - expected: ` +describe('transformCalledOnceWith', () => { + const testCases = [ + { + description: 'should transform toHaveBeenCalledOnceWith(...) into two separate calls', + input: `expect(mySpy).toHaveBeenCalledOnceWith('foo', 'bar');`, + expected: ` expect(mySpy).toHaveBeenCalledTimes(1); expect(mySpy).toHaveBeenCalledWith('foo', 'bar'); `, - }, - ]; + }, + ]; - testCases.forEach(({ description, input, expected }) => { - it(description, async () => { - await expectTransformation(input, expected); - }); + testCases.forEach(({ description, input, expected }) => { + it(description, async () => { + await expectTransformation(input, expected); }); }); +}); - describe('transformSyntacticSugarMatchers', () => { - const testCases = [ - { - description: 'should transform toBeTrue() to toBe(true)', - input: `expect(value).toBeTrue();`, - expected: `expect(value).toBe(true);`, - }, - { - description: 'should transform toBeFalse() to toBe(false)', - input: `expect(value).toBeFalse();`, - expected: `expect(value).toBe(false);`, - }, - { - description: 'should transform toBePositiveInfinity() to toBe(Infinity)', - input: `expect(value).toBePositiveInfinity();`, - expected: `expect(value).toBe(Infinity);`, - }, - { - description: 'should transform toBeNegativeInfinity() to toBe(-Infinity)', - input: `expect(value).toBeNegativeInfinity();`, - expected: `expect(value).toBe(-Infinity);`, - }, - { - description: 'should transform toHaveSize(number) to toHaveLength(number)', - input: `expect(myArray).toHaveSize(3);`, - expected: `expect(myArray).toHaveLength(3);`, - }, - { - description: 'should add a TODO for toThrowMatching', - input: `expect(() => {}).toThrowMatching((e) => e.message === 'foo');`, - expected: `// TODO: vitest-migration: Unsupported matcher ".toThrowMatching()" found. Please migrate this manually. See: https://vitest.dev/api/expect.html#tothrowerror +describe('transformSyntacticSugarMatchers', () => { + const testCases = [ + { + description: 'should transform toBeTrue() to toBe(true)', + input: `expect(value).toBeTrue();`, + expected: `expect(value).toBe(true);`, + }, + { + description: 'should transform toBeFalse() to toBe(false)', + input: `expect(value).toBeFalse();`, + expected: `expect(value).toBe(false);`, + }, + { + description: 'should transform toBePositiveInfinity() to toBe(Infinity)', + input: `expect(value).toBePositiveInfinity();`, + expected: `expect(value).toBe(Infinity);`, + }, + { + description: 'should transform toBeNegativeInfinity() to toBe(-Infinity)', + input: `expect(value).toBeNegativeInfinity();`, + expected: `expect(value).toBe(-Infinity);`, + }, + { + description: 'should transform toHaveSize(number) to toHaveLength(number)', + input: `expect(myArray).toHaveSize(3);`, + expected: `expect(myArray).toHaveLength(3);`, + }, + { + description: 'should add a TODO for toThrowMatching', + input: `expect(() => {}).toThrowMatching((e) => e.message === 'foo');`, + expected: `// TODO: vitest-migration: Unsupported matcher ".toThrowMatching()" found. Please migrate this manually. See: https://vitest.dev/api/expect.html#tothrowerror expect(() => {}).toThrowMatching((e) => e.message === 'foo');`, - }, - { - description: 'should add a TODO for toHaveSpyInteractions', - input: `expect(mySpyObj).toHaveSpyInteractions();`, - // eslint-disable-next-line max-len - expected: `// TODO: vitest-migration: Unsupported matcher ".toHaveSpyInteractions()" found. Please migrate this manually by checking the \`mock.calls.length\` of the individual spies. + }, + { + description: 'should add a TODO for toHaveSpyInteractions', + input: `expect(mySpyObj).toHaveSpyInteractions();`, + // eslint-disable-next-line max-len + expected: `// TODO: vitest-migration: Unsupported matcher ".toHaveSpyInteractions()" found. Please migrate this manually by checking the \`mock.calls.length\` of the individual spies. expect(mySpyObj).toHaveSpyInteractions();`, - }, - ]; + }, + ]; - testCases.forEach(({ description, input, expected }) => { - it(description, async () => { - await expectTransformation(input, expected); - }); + testCases.forEach(({ description, input, expected }) => { + it(description, async () => { + await expectTransformation(input, expected); }); }); +}); - describe('transformComplexMatchers', () => { - const testCases = [ - { - description: 'should transform toEqual(jasmine.truthy()) to toBeTruthy()', - input: `expect(value).toEqual(jasmine.truthy());`, - expected: `expect(value).toBeTruthy();`, - }, - { - description: 'should transform toEqual(jasmine.falsy()) to toBeFalsy()', - input: `expect(value).toEqual(jasmine.falsy());`, - expected: `expect(value).toBeFalsy();`, - }, - { - description: 'should transform toEqual(jasmine.empty()) to toHaveLength(0)', - input: `expect([]).toEqual(jasmine.empty());`, - expected: `expect([]).toHaveLength(0);`, - }, - { - description: 'should transform not.toEqual(jasmine.empty()) to not.toHaveLength(0)', - input: `expect([1]).not.toEqual(jasmine.empty());`, - expected: `expect([1]).not.toHaveLength(0);`, - }, - { - description: 'should transform toEqual(jasmine.notEmpty()) to not.toHaveLength(0)', - input: `expect([1]).toEqual(jasmine.notEmpty());`, - expected: `expect([1]).not.toHaveLength(0);`, - }, - { - description: 'should transform not.toEqual(jasmine.notEmpty()) to toHaveLength(0)', - input: `expect([]).not.toEqual(jasmine.notEmpty());`, - expected: `expect([]).toHaveLength(0);`, - }, - { - description: 'should transform toEqual(jasmine.is()) to toBe()', - input: `expect(value).toEqual(jasmine.is(otherValue));`, - expected: `expect(value).toBe(otherValue);`, - }, - ]; +describe('transformComplexMatchers', () => { + const testCases = [ + { + description: 'should transform toEqual(jasmine.truthy()) to toBeTruthy()', + input: `expect(value).toEqual(jasmine.truthy());`, + expected: `expect(value).toBeTruthy();`, + }, + { + description: 'should transform toEqual(jasmine.falsy()) to toBeFalsy()', + input: `expect(value).toEqual(jasmine.falsy());`, + expected: `expect(value).toBeFalsy();`, + }, + { + description: 'should transform toEqual(jasmine.empty()) to toHaveLength(0)', + input: `expect([]).toEqual(jasmine.empty());`, + expected: `expect([]).toHaveLength(0);`, + }, + { + description: 'should transform not.toEqual(jasmine.empty()) to not.toHaveLength(0)', + input: `expect([1]).not.toEqual(jasmine.empty());`, + expected: `expect([1]).not.toHaveLength(0);`, + }, + { + description: 'should transform toEqual(jasmine.notEmpty()) to not.toHaveLength(0)', + input: `expect([1]).toEqual(jasmine.notEmpty());`, + expected: `expect([1]).not.toHaveLength(0);`, + }, + { + description: 'should transform not.toEqual(jasmine.notEmpty()) to toHaveLength(0)', + input: `expect([]).not.toEqual(jasmine.notEmpty());`, + expected: `expect([]).toHaveLength(0);`, + }, + { + description: 'should transform toEqual(jasmine.is()) to toBe()', + input: `expect(value).toEqual(jasmine.is(otherValue));`, + expected: `expect(value).toBe(otherValue);`, + }, + ]; - testCases.forEach(({ description, input, expected }) => { - it(description, async () => { - await expectTransformation(input, expected); - }); + testCases.forEach(({ description, input, expected }) => { + it(description, async () => { + await expectTransformation(input, expected); }); }); +}); - describe('transformArrayWithExactContents', () => { - const testCases = [ - { - description: 'should transform toEqual(jasmine.arrayWithExactContents()) into two calls', - input: `expect(myArray).toEqual(jasmine.arrayWithExactContents(['a', 'b']));`, - /* eslint-disable max-len */ - expected: ` +describe('transformArrayWithExactContents', () => { + const testCases = [ + { + description: 'should transform toEqual(jasmine.arrayWithExactContents()) into two calls', + input: `expect(myArray).toEqual(jasmine.arrayWithExactContents(['a', 'b']));`, + /* eslint-disable max-len */ + expected: ` // TODO: vitest-migration: Verify this matches strict array content (multiset equality). Vitest's arrayContaining is a subset check. expect(myArray).toHaveLength(2); expect(myArray).toEqual(expect.arrayContaining(['a', 'b'])); `, - /* eslint-enable max-len */ - }, - { - description: - 'should transform toEqual(jasmine.arrayWithExactContents()) with asymmetric matchers', - input: `expect(myArray).toEqual(jasmine.arrayWithExactContents([jasmine.any(Number), 'a']));`, - /* eslint-disable max-len */ - expected: ` + /* eslint-enable max-len */ + }, + { + description: + 'should transform toEqual(jasmine.arrayWithExactContents()) with asymmetric matchers', + input: `expect(myArray).toEqual(jasmine.arrayWithExactContents([jasmine.any(Number), 'a']));`, + /* eslint-disable max-len */ + expected: ` // TODO: vitest-migration: Verify this matches strict array content (multiset equality). Vitest's arrayContaining is a subset check. expect(myArray).toHaveLength(2); expect(myArray).toEqual(expect.arrayContaining([expect.any(Number), 'a'])); `, - /* eslint-enable max-len */ - }, - { - description: - 'should add a TODO for toEqual(jasmine.arrayWithExactContents()) with a variable', - input: `expect(myArray).toEqual(jasmine.arrayWithExactContents(someOtherArray));`, - expected: ` + /* eslint-enable max-len */ + }, + { + description: + 'should add a TODO for toEqual(jasmine.arrayWithExactContents()) with a variable', + input: `expect(myArray).toEqual(jasmine.arrayWithExactContents(someOtherArray));`, + expected: ` // TODO: vitest-migration: Cannot transform jasmine.arrayWithExactContents with a dynamic variable. Please migrate this manually. expect(myArray).toEqual(jasmine.arrayWithExactContents(someOtherArray)); `, - }, - ]; + }, + ]; - testCases.forEach(({ description, input, expected }) => { - it(description, async () => { - await expectTransformation(input, expected); - }); + testCases.forEach(({ description, input, expected }) => { + it(description, async () => { + await expectTransformation(input, expected); }); }); +}); - describe('transformExpectNothing', () => { - const testCases = [ - { - description: 'should remove expect().nothing() and add a comment', - input: ` +describe('transformExpectNothing', () => { + const testCases = [ + { + description: 'should remove expect().nothing() and add a comment', + input: ` it('should be a passing test', () => { expect().nothing(); }); `, - /* eslint-disable max-len */ - expected: ` + /* eslint-disable max-len */ + expected: ` it('should be a passing test', () => { // TODO: vitest-migration: expect().nothing() has been removed because it is redundant in Vitest. Tests without assertions pass by default. // expect().nothing(); }); `, - /* eslint-enable max-len */ - }, - ]; + /* eslint-enable max-len */ + }, + ]; - testCases.forEach(({ description, input, expected }) => { - it(description, async () => { - await expectTransformation(input, expected); - }); + testCases.forEach(({ description, input, expected }) => { + it(description, async () => { + await expectTransformation(input, expected); }); }); +}); - describe('transformWithContext', () => { - const testCases = [ - { - description: 'should transform .withContext() to an expect message', - input: `expect(value).withContext('It should be true').toBe(true);`, - expected: `expect(value, 'It should be true').toBe(true);`, - }, - { - description: 'should handle chained matchers', - input: `expect(value).withContext('It should not be false').not.toBe(false);`, - expected: `expect(value, 'It should not be false').not.toBe(false);`, - }, - { - description: 'should handle .withContext() with no arguments by removing it', - input: `expect(value).withContext().toBe(true);`, - expected: `expect(value).toBe(true);`, - }, - ]; +describe('transformWithContext', () => { + const testCases = [ + { + description: 'should transform .withContext() to an expect message', + input: `expect(value).withContext('It should be true').toBe(true);`, + expected: `expect(value, 'It should be true').toBe(true);`, + }, + { + description: 'should handle chained matchers', + input: `expect(value).withContext('It should not be false').not.toBe(false);`, + expected: `expect(value, 'It should not be false').not.toBe(false);`, + }, + { + description: 'should handle .withContext() with no arguments by removing it', + input: `expect(value).withContext().toBe(true);`, + expected: `expect(value).toBe(true);`, + }, + ]; - testCases.forEach(({ description, input, expected }) => { - it(description, async () => { - await expectTransformation(input, expected); - }); + testCases.forEach(({ description, input, expected }) => { + it(description, async () => { + await expectTransformation(input, expected); }); }); +}); - describe('transformtoHaveBeenCalledBefore', () => { - const testCases = [ - { - description: 'should transform toHaveBeenCalledBefore', - input: `expect(spyA).toHaveBeenCalledBefore(spyB);`, - // eslint-disable-next-line max-len - expected: `expect(Math.min(...vi.mocked(spyA).mock.invocationCallOrder)).toBeLessThan(Math.min(...vi.mocked(spyB).mock.invocationCallOrder));`, - }, - { - description: 'should transform not.toHaveBeenCalledBefore', - input: `expect(spyA).not.toHaveBeenCalledBefore(spyB);`, - // eslint-disable-next-line max-len - expected: `expect(Math.min(...vi.mocked(spyA).mock.invocationCallOrder)).toBeGreaterThanOrEqual(Math.min(...vi.mocked(spyB).mock.invocationCallOrder));`, - }, - ]; +describe('transformtoHaveBeenCalledBefore', () => { + const testCases = [ + { + description: 'should transform toHaveBeenCalledBefore', + input: `expect(spyA).toHaveBeenCalledBefore(spyB);`, + // eslint-disable-next-line max-len + expected: `expect(Math.min(...vi.mocked(spyA).mock.invocationCallOrder)).toBeLessThan(Math.min(...vi.mocked(spyB).mock.invocationCallOrder));`, + }, + { + description: 'should transform not.toHaveBeenCalledBefore', + input: `expect(spyA).not.toHaveBeenCalledBefore(spyB);`, + // eslint-disable-next-line max-len + expected: `expect(Math.min(...vi.mocked(spyA).mock.invocationCallOrder)).toBeGreaterThanOrEqual(Math.min(...vi.mocked(spyB).mock.invocationCallOrder));`, + }, + ]; - testCases.forEach(({ description, input, expected }) => { - it(description, async () => { - await expectTransformation(input, expected); - }); + testCases.forEach(({ description, input, expected }) => { + it(description, async () => { + await expectTransformation(input, expected); }); }); +}); - describe('transformToHaveClass', () => { - const testCases = [ - { - description: 'should transform toHaveClass', - input: `expect(element).toHaveClass('my-class');`, - expected: `expect(element.classList.contains('my-class')).toBe(true);`, - }, - { - description: 'should transform not.toHaveClass', - input: `expect(element).not.toHaveClass('my-class');`, - expected: `expect(element.classList.contains('my-class')).toBe(false);`, - }, - ]; +describe('transformToHaveClass', () => { + const testCases = [ + { + description: 'should transform toHaveClass', + input: `expect(element).toHaveClass('my-class');`, + expected: `expect(element.classList.contains('my-class')).toBe(true);`, + }, + { + description: 'should transform not.toHaveClass', + input: `expect(element).not.toHaveClass('my-class');`, + expected: `expect(element.classList.contains('my-class')).toBe(false);`, + }, + ]; - testCases.forEach(({ description, input, expected }) => { - it(description, async () => { - await expectTransformation(input, expected); - }); + testCases.forEach(({ description, input, expected }) => { + it(description, async () => { + await expectTransformation(input, expected); }); }); }); diff --git a/packages/schematics/angular/refactor/jasmine-vitest/transformers/jasmine-misc_spec.ts b/packages/schematics/angular/refactor/jasmine-vitest/transformers/jasmine-misc_spec.ts index 0ce25ccacfd5..c4e76f51c9fb 100644 --- a/packages/schematics/angular/refactor/jasmine-vitest/transformers/jasmine-misc_spec.ts +++ b/packages/schematics/angular/refactor/jasmine-vitest/transformers/jasmine-misc_spec.ts @@ -8,85 +8,84 @@ import { expectTransformation } from '../test-helpers'; -describe('Jasmine to Vitest Transformer', () => { - describe('transformTimerMocks', () => { - const testCases = [ - { - description: 'should transform jasmine.clock().install() to vi.useFakeTimers()', - input: `jasmine.clock().install();`, - expected: `vi.useFakeTimers();`, - }, - { - description: 'should transform jasmine.clock().tick(100) to vi.advanceTimersByTime(100)', - input: `jasmine.clock().tick(100);`, - expected: `vi.advanceTimersByTime(100);`, - }, - { - description: 'should transform jasmine.clock().uninstall() to vi.useRealTimers()', - input: `jasmine.clock().uninstall();`, - expected: `vi.useRealTimers();`, - }, - { - description: 'should transform jasmine.clock().mockDate(date) to vi.setSystemTime(date)', - input: `jasmine.clock().mockDate(new Date('2025-01-01'));`, - expected: `vi.setSystemTime(new Date('2025-01-01'));`, - }, - { - description: 'should transform jasmine.clock().mockDate() to vi.setSystemTime(new Date())', - input: `jasmine.clock().mockDate();`, - expected: `vi.setSystemTime(new Date());`, - }, - ]; - - testCases.forEach(({ description, input, expected }) => { - it(description, async () => { - await expectTransformation(input, expected); - }); +describe('Jasmine to Vitest Transformer - transformTimerMocks', () => { + const testCases = [ + { + description: 'should transform jasmine.clock().install() to vi.useFakeTimers()', + input: `jasmine.clock().install();`, + expected: `vi.useFakeTimers();`, + }, + { + description: 'should transform jasmine.clock().tick(100) to vi.advanceTimersByTime(100)', + input: `jasmine.clock().tick(100);`, + expected: `vi.advanceTimersByTime(100);`, + }, + { + description: 'should transform jasmine.clock().uninstall() to vi.useRealTimers()', + input: `jasmine.clock().uninstall();`, + expected: `vi.useRealTimers();`, + }, + { + description: 'should transform jasmine.clock().mockDate(date) to vi.setSystemTime(date)', + input: `jasmine.clock().mockDate(new Date('2025-01-01'));`, + expected: `vi.setSystemTime(new Date('2025-01-01'));`, + }, + { + description: 'should transform jasmine.clock().mockDate() to vi.setSystemTime(new Date())', + input: `jasmine.clock().mockDate();`, + expected: `vi.setSystemTime(new Date());`, + }, + ]; + + testCases.forEach(({ description, input, expected }) => { + it(description, async () => { + await expectTransformation(input, expected); }); }); +}); - describe('transformFail', () => { - const testCases = [ - { - description: 'should transform fail() to throw new Error()', - input: `fail('This should not happen');`, - expected: `throw new Error('This should not happen');`, - }, - { - description: 'should transform fail() without a message to throw new Error()', - input: `fail();`, - expected: `throw new Error();`, - }, - ]; - - testCases.forEach(({ description, input, expected }) => { - it(description, async () => { - await expectTransformation(input, expected); - }); +describe('transformFail', () => { + const testCases = [ + { + description: 'should transform fail() to throw new Error()', + input: `fail('This should not happen');`, + expected: `throw new Error('This should not happen');`, + }, + { + description: 'should transform fail() without a message to throw new Error()', + input: `fail();`, + expected: `throw new Error();`, + }, + ]; + + testCases.forEach(({ description, input, expected }) => { + it(description, async () => { + await expectTransformation(input, expected); }); }); +}); - describe('transformDefaultTimeoutInterval', () => { - const testCases = [ - { - description: 'should transform jasmine.DEFAULT_TIMEOUT_INTERVAL', - input: `jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;`, - expected: `vi.setConfig({ testTimeout: 10000 });`, - }, - ]; - - testCases.forEach(({ description, input, expected }) => { - it(description, async () => { - await expectTransformation(input, expected); - }); +describe('transformDefaultTimeoutInterval', () => { + const testCases = [ + { + description: 'should transform jasmine.DEFAULT_TIMEOUT_INTERVAL', + input: `jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;`, + expected: `vi.setConfig({ testTimeout: 10000 });`, + }, + ]; + + testCases.forEach(({ description, input, expected }) => { + it(description, async () => { + await expectTransformation(input, expected); }); }); +}); - describe('transformAddMatchers', () => { - const testCases = [ - { - description: 'should add a TODO for jasmine.addMatchers', - input: ` +describe('transformAddMatchers', () => { + const testCases = [ + { + description: 'should add a TODO for jasmine.addMatchers', + input: ` jasmine.addMatchers({ toBeDivisibleByTwo: function() { return { @@ -99,7 +98,7 @@ describe('Jasmine to Vitest Transformer', () => { } }); `, - expected: ` + expected: ` // TODO: vitest-migration: jasmine.addMatchers is not supported. Please manually migrate to expect.extend(). See: https://vitest.dev/api/expect.html#expect-extend jasmine.addMatchers({ toBeDivisibleByTwo: function () { @@ -113,109 +112,108 @@ describe('Jasmine to Vitest Transformer', () => { }, }); `, - }, - ]; + }, + ]; - testCases.forEach(({ description, input, expected }) => { - it(description, async () => { - await expectTransformation(input, expected); - }); + testCases.forEach(({ description, input, expected }) => { + it(description, async () => { + await expectTransformation(input, expected); }); }); +}); - describe('transformAddCustomEqualityTester', () => { - const testCases = [ - { - description: 'should add a TODO for jasmine.addCustomEqualityTester', - input: ` +describe('transformAddCustomEqualityTester', () => { + const testCases = [ + { + description: 'should add a TODO for jasmine.addCustomEqualityTester', + input: ` jasmine.addCustomEqualityTester((a, b) => { return a.toString() === b.toString(); }); `, - expected: `// TODO: vitest-migration: jasmine.addCustomEqualityTester is not supported. Please manually migrate to expect.addEqualityTesters(). See: https://vitest.dev/api/expect.html#expect-addequalitytesters + expected: `// TODO: vitest-migration: jasmine.addCustomEqualityTester is not supported. Please manually migrate to expect.addEqualityTesters(). See: https://vitest.dev/api/expect.html#expect-addequalitytesters jasmine.addCustomEqualityTester((a, b) => { return a.toString() === b.toString(); }); `, - }, - ]; + }, + ]; - testCases.forEach(({ description, input, expected }) => { - it(description, async () => { - await expectTransformation(input, expected); - }); + testCases.forEach(({ description, input, expected }) => { + it(description, async () => { + await expectTransformation(input, expected); }); }); +}); - describe('transformUnknownJasmineProperties', () => { - const testCases = [ - { - description: 'should add a TODO for an unknown jasmine property', - input: `const env = jasmine.getEnv();`, - expected: `// TODO: vitest-migration: Unsupported jasmine property "getEnv" found. Please migrate this manually. +describe('transformUnknownJasmineProperties', () => { + const testCases = [ + { + description: 'should add a TODO for an unknown jasmine property', + input: `const env = jasmine.getEnv();`, + expected: `// TODO: vitest-migration: Unsupported jasmine property "getEnv" found. Please migrate this manually. const env = jasmine.getEnv();`, - }, - { - description: 'should not add a TODO for a known jasmine property', - input: `const spy = jasmine.createSpy();`, - expected: `const spy = vi.fn();`, - }, - ]; - - testCases.forEach(({ description, input, expected }) => { - it(description, async () => { - await expectTransformation(input, expected); - }); + }, + { + description: 'should not add a TODO for a known jasmine property', + input: `const spy = jasmine.createSpy();`, + expected: `const spy = vi.fn();`, + }, + ]; + + testCases.forEach(({ description, input, expected }) => { + it(description, async () => { + await expectTransformation(input, expected); }); }); +}); - describe('transformGlobalFunctions', () => { - const testCases = [ - { - description: 'should add a TODO for setSpecProperty', - input: `setSpecProperty('myKey', 'myValue');`, - // eslint-disable-next-line max-len - expected: `// TODO: vitest-migration: Unsupported global function \`setSpecProperty\` found. This function is used for custom reporters in Jasmine and has no direct equivalent in Vitest. +describe('transformGlobalFunctions', () => { + const testCases = [ + { + description: 'should add a TODO for setSpecProperty', + input: `setSpecProperty('myKey', 'myValue');`, + // eslint-disable-next-line max-len + expected: `// TODO: vitest-migration: Unsupported global function \`setSpecProperty\` found. This function is used for custom reporters in Jasmine and has no direct equivalent in Vitest. setSpecProperty('myKey', 'myValue');`, - }, - { - description: 'should add a TODO for setSuiteProperty', - input: `setSuiteProperty('myKey', 'myValue');`, - // eslint-disable-next-line max-len - expected: `// TODO: vitest-migration: Unsupported global function \`setSuiteProperty\` found. This function is used for custom reporters in Jasmine and has no direct equivalent in Vitest. + }, + { + description: 'should add a TODO for setSuiteProperty', + input: `setSuiteProperty('myKey', 'myValue');`, + // eslint-disable-next-line max-len + expected: `// TODO: vitest-migration: Unsupported global function \`setSuiteProperty\` found. This function is used for custom reporters in Jasmine and has no direct equivalent in Vitest. setSuiteProperty('myKey', 'myValue');`, - }, - ]; + }, + ]; - testCases.forEach(({ description, input, expected }) => { - it(description, async () => { - await expectTransformation(input, expected); - }); + testCases.forEach(({ description, input, expected }) => { + it(description, async () => { + await expectTransformation(input, expected); }); }); +}); - describe('transformUnsupportedJasmineCalls', () => { - const testCases = [ - { - description: 'should add a TODO for jasmine.mapContaining', - input: `expect(myMap).toEqual(jasmine.mapContaining(new Map()));`, - // eslint-disable-next-line max-len - expected: `// TODO: vitest-migration: jasmine.mapContaining is not supported. Vitest does not have a built-in matcher for Maps. Please manually assert the contents of the Map. +describe('transformUnsupportedJasmineCalls', () => { + const testCases = [ + { + description: 'should add a TODO for jasmine.mapContaining', + input: `expect(myMap).toEqual(jasmine.mapContaining(new Map()));`, + // eslint-disable-next-line max-len + expected: `// TODO: vitest-migration: jasmine.mapContaining is not supported. Vitest does not have a built-in matcher for Maps. Please manually assert the contents of the Map. expect(myMap).toEqual(jasmine.mapContaining(new Map()));`, - }, - { - description: 'should add a TODO for jasmine.setContaining', - input: `expect(mySet).toEqual(jasmine.setContaining(new Set()));`, - // eslint-disable-next-line max-len - expected: `// TODO: vitest-migration: jasmine.setContaining is not supported. Vitest does not have a built-in matcher for Sets. Please manually assert the contents of the Set. + }, + { + description: 'should add a TODO for jasmine.setContaining', + input: `expect(mySet).toEqual(jasmine.setContaining(new Set()));`, + // eslint-disable-next-line max-len + expected: `// TODO: vitest-migration: jasmine.setContaining is not supported. Vitest does not have a built-in matcher for Sets. Please manually assert the contents of the Set. expect(mySet).toEqual(jasmine.setContaining(new Set()));`, - }, - ]; + }, + ]; - testCases.forEach(({ description, input, expected }) => { - it(description, async () => { - await expectTransformation(input, expected); - }); + testCases.forEach(({ description, input, expected }) => { + it(description, async () => { + await expectTransformation(input, expected); }); }); }); diff --git a/packages/schematics/angular/refactor/jasmine-vitest/transformers/jasmine-spy.ts b/packages/schematics/angular/refactor/jasmine-vitest/transformers/jasmine-spy.ts index f019dbb53099..1139aedc8aed 100644 --- a/packages/schematics/angular/refactor/jasmine-vitest/transformers/jasmine-spy.ts +++ b/packages/schematics/angular/refactor/jasmine-vitest/transformers/jasmine-spy.ts @@ -232,7 +232,7 @@ export function transformCreateSpyObj( const baseName = hasBaseName ? firstArg.text : undefined; const methods = hasBaseName ? node.arguments[1] : firstArg; const propertiesArg = hasBaseName ? node.arguments[2] : node.arguments[1]; - let properties: ts.PropertyAssignment[] = []; + let properties: ts.PropertyAssignment[]; if (node.arguments.length < 2 && hasBaseName) { const category = 'createSpyObj-single-argument'; diff --git a/packages/schematics/angular/refactor/jasmine-vitest/transformers/jasmine-spy_spec.ts b/packages/schematics/angular/refactor/jasmine-vitest/transformers/jasmine-spy_spec.ts index 6c11f776bd3b..44113c3938c2 100644 --- a/packages/schematics/angular/refactor/jasmine-vitest/transformers/jasmine-spy_spec.ts +++ b/packages/schematics/angular/refactor/jasmine-vitest/transformers/jasmine-spy_spec.ts @@ -8,274 +8,272 @@ import { expectTransformation } from '../test-helpers'; -describe('Jasmine to Vitest Transformer', () => { - describe('transformSpies', () => { - const testCases = [ - { - description: 'should transform spyOn(object, "method") to vi.spyOn(object, "method")', - input: `spyOn(service, 'myMethod');`, - expected: `vi.spyOn(service, 'myMethod');`, - }, - { - description: 'should transform .and.returnValue(...) to .mockReturnValue(...)', - input: `spyOn(service, 'myMethod').and.returnValue(42);`, - expected: `vi.spyOn(service, 'myMethod').mockReturnValue(42);`, - }, - { - description: 'should transform .and.returnValues() to chained .mockReturnValueOnce() calls', - input: `spyOn(service, 'myMethod').and.returnValues('a', 'b', 'c');`, - expected: `vi.spyOn(service, 'myMethod').mockReturnValueOnce('a').mockReturnValueOnce('b').mockReturnValueOnce('c');`, - }, - { - description: 'should transform .and.callFake(...) to .mockImplementation(...)', - input: `spyOn(service, 'myMethod').and.callFake(() => 'fake');`, - expected: `vi.spyOn(service, 'myMethod').mockImplementation(() => 'fake');`, - }, - { - description: 'should remove .and.callThrough()', - input: `spyOn(service, 'myMethod').and.callThrough();`, - expected: `vi.spyOn(service, 'myMethod');`, - }, - { - description: 'should transform jasmine.createSpy("name") to vi.fn()', - input: `const mySpy = jasmine.createSpy('mySpy');`, - expected: `const mySpy = vi.fn();`, - }, - { - description: 'should transform jasmine.createSpy("name", fn) to vi.fn(fn)', - input: `const mySpy = jasmine.createSpy('mySpy', () => 'foo');`, - expected: `const mySpy = vi.fn(() => 'foo');`, - }, - { - description: 'should transform spyOnProperty(object, "prop") to vi.spyOn(object, "prop")', - input: `spyOnProperty(service, 'myProp');`, - expected: `vi.spyOn(service, 'myProp');`, - }, - { - description: 'should transform .and.stub() to .mockImplementation(() => {})', - input: `spyOn(service, 'myMethod').and.stub();`, - expected: `vi.spyOn(service, 'myMethod').mockImplementation(() => {});`, - }, - { - description: 'should add a TODO for jasmine.spyOnAllFunctions(object)', - input: `jasmine.spyOnAllFunctions(myObject);`, - expected: `// TODO: vitest-migration: Vitest does not have a direct equivalent for jasmine.spyOnAllFunctions(). Please spy on individual methods manually using vi.spyOn(). See: https://vitest.dev/api/vi.html#vi-spyon +describe('Jasmine to Vitest Transformer - transformSpies', () => { + const testCases = [ + { + description: 'should transform spyOn(object, "method") to vi.spyOn(object, "method")', + input: `spyOn(service, 'myMethod');`, + expected: `vi.spyOn(service, 'myMethod');`, + }, + { + description: 'should transform .and.returnValue(...) to .mockReturnValue(...)', + input: `spyOn(service, 'myMethod').and.returnValue(42);`, + expected: `vi.spyOn(service, 'myMethod').mockReturnValue(42);`, + }, + { + description: 'should transform .and.returnValues() to chained .mockReturnValueOnce() calls', + input: `spyOn(service, 'myMethod').and.returnValues('a', 'b', 'c');`, + expected: `vi.spyOn(service, 'myMethod').mockReturnValueOnce('a').mockReturnValueOnce('b').mockReturnValueOnce('c');`, + }, + { + description: 'should transform .and.callFake(...) to .mockImplementation(...)', + input: `spyOn(service, 'myMethod').and.callFake(() => 'fake');`, + expected: `vi.spyOn(service, 'myMethod').mockImplementation(() => 'fake');`, + }, + { + description: 'should remove .and.callThrough()', + input: `spyOn(service, 'myMethod').and.callThrough();`, + expected: `vi.spyOn(service, 'myMethod');`, + }, + { + description: 'should transform jasmine.createSpy("name") to vi.fn()', + input: `const mySpy = jasmine.createSpy('mySpy');`, + expected: `const mySpy = vi.fn();`, + }, + { + description: 'should transform jasmine.createSpy("name", fn) to vi.fn(fn)', + input: `const mySpy = jasmine.createSpy('mySpy', () => 'foo');`, + expected: `const mySpy = vi.fn(() => 'foo');`, + }, + { + description: 'should transform spyOnProperty(object, "prop") to vi.spyOn(object, "prop")', + input: `spyOnProperty(service, 'myProp');`, + expected: `vi.spyOn(service, 'myProp');`, + }, + { + description: 'should transform .and.stub() to .mockImplementation(() => {})', + input: `spyOn(service, 'myMethod').and.stub();`, + expected: `vi.spyOn(service, 'myMethod').mockImplementation(() => {});`, + }, + { + description: 'should add a TODO for jasmine.spyOnAllFunctions(object)', + input: `jasmine.spyOnAllFunctions(myObject);`, + expected: `// TODO: vitest-migration: Vitest does not have a direct equivalent for jasmine.spyOnAllFunctions(). Please spy on individual methods manually using vi.spyOn(). See: https://vitest.dev/api/vi.html#vi-spyon jasmine.spyOnAllFunctions(myObject); `, - }, - { - description: 'should handle chained calls on jasmine.createSpy()', - input: `const mySpy = jasmine.createSpy('mySpy').and.returnValue(true);`, - expected: `const mySpy = vi.fn().mockReturnValue(true);`, - }, - { - description: 'should handle .and.returnValues() with no arguments', - input: `spyOn(service, 'myMethod').and.returnValues();`, - expected: `vi.spyOn(service, 'myMethod');`, - }, - { - description: - 'should transform .and.throwError("message") to .mockImplementation(() => { throw new Error("message") })', - input: `spyOn(service, 'myMethod').and.throwError('Something went wrong');`, - expected: `vi.spyOn(service, 'myMethod').mockImplementation(() => { throw new Error('Something went wrong') });`, - }, - { - description: - 'should transform .and.throwError(new Error("message")) to .mockImplementation(() => { throw new Error("message") })', - input: `spyOn(service, 'myMethod').and.throwError(new Error('Custom Error'));`, - expected: `vi.spyOn(service, 'myMethod').mockImplementation(() => { throw new Error('Custom Error') });`, - }, - { - description: 'should transform .and.resolveTo(value) to .mockResolvedValue(value)', - input: `spyOn(service, 'myMethod').and.resolveTo('some value');`, - expected: `vi.spyOn(service, 'myMethod').mockResolvedValue('some value');`, - }, - { - description: 'should transform .and.rejectWith(error) to .mockRejectedValue(error)', - input: `spyOn(service, 'myMethod').and.rejectWith('some error');`, - expected: `vi.spyOn(service, 'myMethod').mockRejectedValue('some error');`, - }, - { - description: 'should add a TODO for an unsupported spy strategy', - input: `spyOn(service, 'myMethod').and.unknownStrategy();`, - expected: `// TODO: vitest-migration: Unsupported spy strategy ".and.unknownStrategy()" found. Please migrate this manually. See: https://vitest.dev/api/mocked.html#mock + }, + { + description: 'should handle chained calls on jasmine.createSpy()', + input: `const mySpy = jasmine.createSpy('mySpy').and.returnValue(true);`, + expected: `const mySpy = vi.fn().mockReturnValue(true);`, + }, + { + description: 'should handle .and.returnValues() with no arguments', + input: `spyOn(service, 'myMethod').and.returnValues();`, + expected: `vi.spyOn(service, 'myMethod');`, + }, + { + description: + 'should transform .and.throwError("message") to .mockImplementation(() => { throw new Error("message") })', + input: `spyOn(service, 'myMethod').and.throwError('Something went wrong');`, + expected: `vi.spyOn(service, 'myMethod').mockImplementation(() => { throw new Error('Something went wrong') });`, + }, + { + description: + 'should transform .and.throwError(new Error("message")) to .mockImplementation(() => { throw new Error("message") })', + input: `spyOn(service, 'myMethod').and.throwError(new Error('Custom Error'));`, + expected: `vi.spyOn(service, 'myMethod').mockImplementation(() => { throw new Error('Custom Error') });`, + }, + { + description: 'should transform .and.resolveTo(value) to .mockResolvedValue(value)', + input: `spyOn(service, 'myMethod').and.resolveTo('some value');`, + expected: `vi.spyOn(service, 'myMethod').mockResolvedValue('some value');`, + }, + { + description: 'should transform .and.rejectWith(error) to .mockRejectedValue(error)', + input: `spyOn(service, 'myMethod').and.rejectWith('some error');`, + expected: `vi.spyOn(service, 'myMethod').mockRejectedValue('some error');`, + }, + { + description: 'should add a TODO for an unsupported spy strategy', + input: `spyOn(service, 'myMethod').and.unknownStrategy();`, + expected: `// TODO: vitest-migration: Unsupported spy strategy ".and.unknownStrategy()" found. Please migrate this manually. See: https://vitest.dev/api/mocked.html#mock vi.spyOn(service, 'myMethod').and.unknownStrategy();`, - }, - ]; + }, + ]; - testCases.forEach(({ description, input, expected }) => { - it(description, async () => { - await expectTransformation(input, expected); - }); + testCases.forEach(({ description, input, expected }) => { + it(description, async () => { + await expectTransformation(input, expected); }); }); +}); - describe('transformCreateSpyObj', () => { - const testCases = [ - { - description: 'should transform jasmine.createSpyObj with an array of methods', - input: `const myService = jasmine.createSpyObj('MyService', ['methodA', 'methodB']);`, - expected: `const myService = { +describe('transformCreateSpyObj', () => { + const testCases = [ + { + description: 'should transform jasmine.createSpyObj with an array of methods', + input: `const myService = jasmine.createSpyObj('MyService', ['methodA', 'methodB']);`, + expected: `const myService = { methodA: vi.fn().mockName("MyService.methodA"), methodB: vi.fn().mockName("MyService.methodB"), };`, - }, - { - description: - 'should transform jasmine.createSpyObj with an array of methods without base name', - input: `const myService = jasmine.createSpyObj(['methodA', 'methodB']);`, - expected: `const myService = { + }, + { + description: + 'should transform jasmine.createSpyObj with an array of methods without base name', + input: `const myService = jasmine.createSpyObj(['methodA', 'methodB']);`, + expected: `const myService = { methodA: vi.fn(), methodB: vi.fn(), };`, - }, - { - description: 'should add a TODO if the second argument is not a literal', - input: `const myService = jasmine.createSpyObj('MyService', methodNames);`, - expected: ` + }, + { + description: 'should add a TODO if the second argument is not a literal', + input: `const myService = jasmine.createSpyObj('MyService', methodNames);`, + expected: ` // TODO: vitest-migration: Cannot transform jasmine.createSpyObj with a dynamic variable. Please migrate this manually. See: https://vitest.dev/api/vi.html#vi-fn const myService = jasmine.createSpyObj('MyService', methodNames); `, - }, - { - description: 'should transform jasmine.createSpyObj with an object of return values', - input: `const myService = jasmine.createSpyObj('MyService', { methodA: 'foo', methodB: 42 });`, - expected: `const myService = { + }, + { + description: 'should transform jasmine.createSpyObj with an object of return values', + input: `const myService = jasmine.createSpyObj('MyService', { methodA: 'foo', methodB: 42 });`, + expected: `const myService = { methodA: vi.fn().mockName("MyService.methodA").mockReturnValue('foo'), methodB: vi.fn().mockName("MyService.methodB").mockReturnValue(42), };`, - }, - { - description: - 'should transform jasmine.createSpyObj with an object of return values without base name', - input: `const myService = jasmine.createSpyObj({ methodA: 'foo', methodB: 42 });`, - expected: `const myService = { + }, + { + description: + 'should transform jasmine.createSpyObj with an object of return values without base name', + input: `const myService = jasmine.createSpyObj({ methodA: 'foo', methodB: 42 });`, + expected: `const myService = { methodA: vi.fn().mockReturnValue('foo'), methodB: vi.fn().mockReturnValue(42), };`, - }, - { - description: - 'should transform jasmine.createSpyObj with an object of return values containing an asymmetric matcher', - input: `const myService = jasmine.createSpyObj('MyService', { methodA: jasmine.any(String) });`, - expected: `const myService = { + }, + { + description: + 'should transform jasmine.createSpyObj with an object of return values containing an asymmetric matcher', + input: `const myService = jasmine.createSpyObj('MyService', { methodA: jasmine.any(String) });`, + expected: `const myService = { methodA: vi.fn().mockName("MyService.methodA").mockReturnValue(expect.any(String)), };`, - }, - { - description: 'should add a TODO for jasmine.createSpyObj with only base name argument', - input: `const myService = jasmine.createSpyObj('MyService');`, - expected: ` + }, + { + description: 'should add a TODO for jasmine.createSpyObj with only base name argument', + input: `const myService = jasmine.createSpyObj('MyService');`, + expected: ` // TODO: vitest-migration: jasmine.createSpyObj called with a single argument is not supported for transformation. See: https://vitest.dev/api/vi.html#vi-fn const myService = jasmine.createSpyObj('MyService'); `, - }, - { - description: 'should transform jasmine.createSpyObj with a property map', - input: `const myService = jasmine.createSpyObj('MyService', ['methodA'], { propA: 'valueA' });`, - expected: `const myService = { + }, + { + description: 'should transform jasmine.createSpyObj with a property map', + input: `const myService = jasmine.createSpyObj('MyService', ['methodA'], { propA: 'valueA' });`, + expected: `const myService = { methodA: vi.fn().mockName("MyService.methodA"), propA: 'valueA', };`, - }, - { - description: 'should transform jasmine.createSpyObj with a method map and a property map', - input: `const myService = jasmine.createSpyObj('MyService', { methodA: 'foo' }, { propA: 'valueA' });`, - expected: `const myService = { + }, + { + description: 'should transform jasmine.createSpyObj with a method map and a property map', + input: `const myService = jasmine.createSpyObj('MyService', { methodA: 'foo' }, { propA: 'valueA' });`, + expected: `const myService = { methodA: vi.fn().mockName("MyService.methodA").mockReturnValue('foo'), propA: 'valueA', };`, - }, - { - description: - 'should transform jasmine.createSpyObj with a method map and a property map without base name', - input: `const myService = jasmine.createSpyObj({ methodA: 'foo' }, { propA: 'valueA' });`, - expected: `const myService = { + }, + { + description: + 'should transform jasmine.createSpyObj with a method map and a property map without base name', + input: `const myService = jasmine.createSpyObj({ methodA: 'foo' }, { propA: 'valueA' });`, + expected: `const myService = { methodA: vi.fn().mockReturnValue('foo'), propA: 'valueA', };`, - }, - { - description: 'should ignore non-string literals in the method array', - input: `const myService = jasmine.createSpyObj('MyService', ['methodA', 123, someVar]);`, - expected: `const myService = { + }, + { + description: 'should ignore non-string literals in the method array', + input: `const myService = jasmine.createSpyObj('MyService', ['methodA', 123, someVar]);`, + expected: `const myService = { methodA: vi.fn().mockName("MyService.methodA"), };`, - }, - ]; + }, + ]; - testCases.forEach(({ description, input, expected }) => { - it(description, async () => { - await expectTransformation(input, expected); - }); + testCases.forEach(({ description, input, expected }) => { + it(description, async () => { + await expectTransformation(input, expected); }); }); +}); - describe('transformSpyReset', () => { - const testCases = [ - { - description: 'should transform spy.calls.reset() to spy.mockClear()', - input: `mySpy.calls.reset();`, - expected: `mySpy.mockClear();`, - }, - ]; +describe('transformSpyReset', () => { + const testCases = [ + { + description: 'should transform spy.calls.reset() to spy.mockClear()', + input: `mySpy.calls.reset();`, + expected: `mySpy.mockClear();`, + }, + ]; - testCases.forEach(({ description, input, expected }) => { - it(description, async () => { - await expectTransformation(input, expected); - }); + testCases.forEach(({ description, input, expected }) => { + it(description, async () => { + await expectTransformation(input, expected); }); }); +}); - describe('transformSpyCallInspection', () => { - const testCases = [ - { - description: 'should transform spy.calls.any()', - input: `expect(mySpy.calls.any()).toBe(true);`, - expected: `expect(vi.mocked(mySpy).mock.calls.length > 0).toBe(true);`, - }, - { - description: 'should transform spy.calls.count()', - input: `expect(mySpy.calls.count()).toBe(1);`, - expected: `expect(vi.mocked(mySpy).mock.calls.length).toBe(1);`, - }, - { - description: 'should transform spy.calls.argsFor(0)', - input: `const args = mySpy.calls.argsFor(0);`, - expected: `const args = vi.mocked(mySpy).mock.calls[0];`, - }, - { - description: 'should transform spy.calls.allArgs()', - input: `const allArgs = mySpy.calls.allArgs();`, - expected: `const allArgs = vi.mocked(mySpy).mock.calls;`, - }, - { - description: 'should transform spy.calls.all()', - input: `const allCalls = mySpy.calls.all();`, - expected: `const allCalls = vi.mocked(mySpy).mock.calls;`, - }, - { - description: 'should transform spy.calls.mostRecent().args', - input: `const recentArgs = mySpy.calls.mostRecent().args;`, - expected: `const recentArgs = vi.mocked(mySpy).mock.lastCall;`, - }, - { - description: 'should transform spy.calls.first()', - input: `const firstCall = mySpy.calls.first();`, - expected: `const firstCall = vi.mocked(mySpy).mock.calls[0];`, - }, - { - description: 'should add a TODO for spy.calls.mostRecent() without .args', - input: `const mostRecent = mySpy.calls.mostRecent();`, - expected: `// TODO: vitest-migration: Direct usage of mostRecent() is not supported. Please refactor to access .args directly or use vi.mocked(spy).mock.lastCall. See: https://vitest.dev/api/mocked.html#mock-lastcall +describe('transformSpyCallInspection', () => { + const testCases = [ + { + description: 'should transform spy.calls.any()', + input: `expect(mySpy.calls.any()).toBe(true);`, + expected: `expect(vi.mocked(mySpy).mock.calls.length > 0).toBe(true);`, + }, + { + description: 'should transform spy.calls.count()', + input: `expect(mySpy.calls.count()).toBe(1);`, + expected: `expect(vi.mocked(mySpy).mock.calls.length).toBe(1);`, + }, + { + description: 'should transform spy.calls.argsFor(0)', + input: `const args = mySpy.calls.argsFor(0);`, + expected: `const args = vi.mocked(mySpy).mock.calls[0];`, + }, + { + description: 'should transform spy.calls.allArgs()', + input: `const allArgs = mySpy.calls.allArgs();`, + expected: `const allArgs = vi.mocked(mySpy).mock.calls;`, + }, + { + description: 'should transform spy.calls.all()', + input: `const allCalls = mySpy.calls.all();`, + expected: `const allCalls = vi.mocked(mySpy).mock.calls;`, + }, + { + description: 'should transform spy.calls.mostRecent().args', + input: `const recentArgs = mySpy.calls.mostRecent().args;`, + expected: `const recentArgs = vi.mocked(mySpy).mock.lastCall;`, + }, + { + description: 'should transform spy.calls.first()', + input: `const firstCall = mySpy.calls.first();`, + expected: `const firstCall = vi.mocked(mySpy).mock.calls[0];`, + }, + { + description: 'should add a TODO for spy.calls.mostRecent() without .args', + input: `const mostRecent = mySpy.calls.mostRecent();`, + expected: `// TODO: vitest-migration: Direct usage of mostRecent() is not supported. Please refactor to access .args directly or use vi.mocked(spy).mock.lastCall. See: https://vitest.dev/api/mocked.html#mock-lastcall const mostRecent = mySpy.calls.mostRecent();`, - }, - ]; + }, + ]; - testCases.forEach(({ description, input, expected }) => { - it(description, async () => { - await expectTransformation(input, expected); - }); + testCases.forEach(({ description, input, expected }) => { + it(description, async () => { + await expectTransformation(input, expected); }); }); }); diff --git a/packages/schematics/angular/refactor/jasmine-vitest/transformers/jasmine-type_spec.ts b/packages/schematics/angular/refactor/jasmine-vitest/transformers/jasmine-type_spec.ts index d38891730f99..d43bd5b8e157 100644 --- a/packages/schematics/angular/refactor/jasmine-vitest/transformers/jasmine-type_spec.ts +++ b/packages/schematics/angular/refactor/jasmine-vitest/transformers/jasmine-type_spec.ts @@ -8,69 +8,67 @@ import { expectTransformation } from '../test-helpers'; -describe('Jasmine to Vitest Transformer', () => { - describe('transformJasmineTypes', () => { - const testCases = [ - { - description: 'should transform a variable with a jasmine.Spy type', - input: `let mySpy: jasmine.Spy;`, - expected: ` +describe('Jasmine to Vitest Transformer - transformJasmineTypes', () => { + const testCases = [ + { + description: 'should transform a variable with a jasmine.Spy type', + input: `let mySpy: jasmine.Spy;`, + expected: ` import type { Mock } from 'vitest'; let mySpy: Mock; `, - }, - { - description: 'should transform a variable with a jasmine.SpyObj type', - input: `let mySpy: jasmine.SpyObj;`, - expected: ` + }, + { + description: 'should transform a variable with a jasmine.SpyObj type', + input: `let mySpy: jasmine.SpyObj;`, + expected: ` import type { MockedObject } from 'vitest'; let mySpy: MockedObject; `, - }, - { - description: 'should handle multiple jasmine types and create a single import', - input: ` + }, + { + description: 'should handle multiple jasmine types and create a single import', + input: ` let mySpy: jasmine.Spy; let mySpyObj: jasmine.SpyObj; `, - expected: ` + expected: ` import type { Mock, MockedObject } from 'vitest'; let mySpy: Mock; let mySpyObj: MockedObject; `, - }, - { - description: 'should not add an import if no jasmine types are used', - input: `let mySpy: any;`, - expected: `let mySpy: any;`, - }, - { - description: 'should transform jasmine.Any to any', - input: `let myMatcher: jasmine.Any;`, - expected: `let myMatcher: any;`, - }, - { - description: 'should transform jasmine.ObjectContaining to Partial', - input: `let myMatcher: jasmine.ObjectContaining;`, - expected: `let myMatcher: Partial;`, - }, - { - description: 'should transform jasmine.ObjectContaining to object', - input: `let myMatcher: jasmine.ObjectContaining;`, - expected: `let myMatcher: object;`, - }, - { - description: 'should transform jasmine.DoneFn to () => void', - input: `let myDoneFn: jasmine.DoneFn;`, - expected: `let myDoneFn: () => void;`, - }, - ]; + }, + { + description: 'should not add an import if no jasmine types are used', + input: `let mySpy: any;`, + expected: `let mySpy: any;`, + }, + { + description: 'should transform jasmine.Any to any', + input: `let myMatcher: jasmine.Any;`, + expected: `let myMatcher: any;`, + }, + { + description: 'should transform jasmine.ObjectContaining to Partial', + input: `let myMatcher: jasmine.ObjectContaining;`, + expected: `let myMatcher: Partial;`, + }, + { + description: 'should transform jasmine.ObjectContaining to object', + input: `let myMatcher: jasmine.ObjectContaining;`, + expected: `let myMatcher: object;`, + }, + { + description: 'should transform jasmine.DoneFn to () => void', + input: `let myDoneFn: jasmine.DoneFn;`, + expected: `let myDoneFn: () => void;`, + }, + ]; - testCases.forEach(({ description, input, expected }) => { - it(description, async () => { - await expectTransformation(input, expected); - }); + testCases.forEach(({ description, input, expected }) => { + it(description, async () => { + await expectTransformation(input, expected); }); }); }); diff --git a/packages/schematics/angular/ssr/files/server-builder/server.ts.template b/packages/schematics/angular/ssr/files/server-builder/server.ts.template index 7327c26532ea..8d6a9660dfae 100644 --- a/packages/schematics/angular/ssr/files/server-builder/server.ts.template +++ b/packages/schematics/angular/ssr/files/server-builder/server.ts.template @@ -13,7 +13,9 @@ export function app(): express.Express { ? join(distFolder, 'index.original.html') : join(distFolder, 'index.html'); - const commonEngine = new CommonEngine(); + const commonEngine = new CommonEngine({ + allowedHosts: [/* Configure your hosts here */] + }); server.set('view engine', 'html'); server.set('views', distFolder); diff --git a/packages/schematics/angular/ssr/index.ts b/packages/schematics/angular/ssr/index.ts index 6e27eab47cd5..49e57d523268 100644 --- a/packages/schematics/angular/ssr/index.ts +++ b/packages/schematics/angular/ssr/index.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.dev/license */ -import { isJsonObject } from '@angular-devkit/core'; +import { JsonObject, isJsonObject } from '@angular-devkit/core'; import { Rule, RuleFactory, @@ -206,6 +206,10 @@ function updateApplicationBuilderWorkspaceConfigRule( buildTarget.options = { ...buildTarget.options, + security: { + ...((buildTarget.options?.security as JsonObject | undefined) ?? {}), + allowedHosts: [], + }, outputPath, outputMode: 'server', ssr: { diff --git a/packages/schematics/angular/third_party/github.com/Microsoft/TypeScript/BUILD.bazel b/packages/schematics/angular/third_party/github.com/Microsoft/TypeScript/BUILD.bazel index b4ac5f975b5a..b04b3e0fa7cd 100644 --- a/packages/schematics/angular/third_party/github.com/Microsoft/TypeScript/BUILD.bazel +++ b/packages/schematics/angular/third_party/github.com/Microsoft/TypeScript/BUILD.bazel @@ -1,6 +1,6 @@ load("@aspect_rules_js//js:defs.bzl", "js_library") -# files fetched on 2025-08-01 +# files fetched on 2026-03-25 # Commands to update from node_modules: # cp node_modules/typescript/lib/typescript.d.ts packages/schematics/angular/third_party/github.com/Microsoft/TypeScript/lib/typescript.d.ts diff --git a/packages/schematics/angular/third_party/github.com/Microsoft/TypeScript/lib/typescript.d.ts b/packages/schematics/angular/third_party/github.com/Microsoft/TypeScript/lib/typescript.d.ts index 87942520f2ab..0f39eae746a0 100644 --- a/packages/schematics/angular/third_party/github.com/Microsoft/TypeScript/lib/typescript.d.ts +++ b/packages/schematics/angular/third_party/github.com/Microsoft/TypeScript/lib/typescript.d.ts @@ -7,7 +7,7 @@ License at http://www.apache.org/licenses/LICENSE-2.0 THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, -MERCHANTABLITY OR NON-INFRINGEMENT. +MERCHANTABILITY OR NON-INFRINGEMENT. See the Apache Version 2.0 License for specific language governing permissions and limitations under the License. @@ -2530,6 +2530,7 @@ declare namespace ts { Node = "node", /** @deprecated Renamed to `Node10` */ NodeJs = "node", + /** @deprecated */ Node10 = "node10", Node16 = "node16", NodeNext = "nodenext", @@ -2542,6 +2543,7 @@ declare namespace ts { export enum ScriptTarget { /** @deprecated */ ES3 = "es3", + /** @deprecated */ ES5 = "es5", ES6 = "es6", ES2015 = "es2015", @@ -2554,9 +2556,11 @@ declare namespace ts { ES2022 = "es2022", ES2023 = "es2023", ES2024 = "es2024", + ES2025 = "es2025", ESNext = "esnext", JSON = "json", Latest = "esnext", + LatestStandard = "es2025", } } namespace typingsInstaller { @@ -3646,7 +3650,7 @@ declare namespace ts { readDirectory(rootDir: string, extensions: readonly string[], excludes: readonly string[] | undefined, includes: readonly string[] | undefined, depth?: number): string[]; } } - const versionMajorMinor = "5.9"; + const versionMajorMinor = "6.0"; /** The version of the TypeScript compiler release */ const version: string; /** @@ -5907,7 +5911,6 @@ declare namespace ts { */ interface SourceFileLike { readonly text: string; - languageVariant?: LanguageVariant; } interface SourceFileLike { getLineAndCharacterOfPosition(pos: number): LineAndCharacter; @@ -5926,14 +5929,7 @@ declare namespace ts { libReferenceDirectives: readonly FileReference[]; languageVariant: LanguageVariant; isDeclarationFile: boolean; - /** - * lib.d.ts should have a reference comment like - * - * /// - * - * If any other file has this comment, it signals not to include lib.d.ts - * because this containing file is intended to act as a default library. - */ + /** @deprecated Always false. Use a Program to determine if a file is a lib file. */ hasNoDefaultLib: boolean; languageVersion: ScriptTarget; /** @@ -6598,53 +6594,53 @@ declare namespace ts { enum TypeFlags { Any = 1, Unknown = 2, - String = 4, - Number = 8, - Boolean = 16, - Enum = 32, - BigInt = 64, - StringLiteral = 128, - NumberLiteral = 256, - BooleanLiteral = 512, - EnumLiteral = 1024, - BigIntLiteral = 2048, - ESSymbol = 4096, - UniqueESSymbol = 8192, - Void = 16384, - Undefined = 32768, - Null = 65536, - Never = 131072, - TypeParameter = 262144, - Object = 524288, - Union = 1048576, - Intersection = 2097152, - Index = 4194304, - IndexedAccess = 8388608, - Conditional = 16777216, - Substitution = 33554432, - NonPrimitive = 67108864, - TemplateLiteral = 134217728, - StringMapping = 268435456, - Literal = 2944, - Unit = 109472, - Freshable = 2976, - StringOrNumberLiteral = 384, - PossiblyFalsy = 117724, - StringLike = 402653316, - NumberLike = 296, - BigIntLike = 2112, - BooleanLike = 528, - EnumLike = 1056, - ESSymbolLike = 12288, - VoidLike = 49152, - UnionOrIntersection = 3145728, - StructuredType = 3670016, - TypeVariable = 8650752, - InstantiableNonPrimitive = 58982400, - InstantiablePrimitive = 406847488, - Instantiable = 465829888, - StructuredOrInstantiable = 469499904, - Narrowable = 536624127, + Undefined = 4, + Null = 8, + Void = 16, + String = 32, + Number = 64, + BigInt = 128, + Boolean = 256, + ESSymbol = 512, + StringLiteral = 1024, + NumberLiteral = 2048, + BigIntLiteral = 4096, + BooleanLiteral = 8192, + UniqueESSymbol = 16384, + EnumLiteral = 32768, + Enum = 65536, + NonPrimitive = 131072, + Never = 262144, + TypeParameter = 524288, + Object = 1048576, + Index = 2097152, + TemplateLiteral = 4194304, + StringMapping = 8388608, + Substitution = 16777216, + IndexedAccess = 33554432, + Conditional = 67108864, + Union = 134217728, + Intersection = 268435456, + Literal = 15360, + Unit = 97292, + Freshable = 80896, + StringOrNumberLiteral = 3072, + PossiblyFalsy = 15868, + StringLike = 12583968, + NumberLike = 67648, + BigIntLike = 4224, + BooleanLike = 8448, + EnumLike = 98304, + ESSymbolLike = 16896, + VoidLike = 20, + UnionOrIntersection = 402653184, + StructuredType = 403701760, + TypeVariable = 34078720, + InstantiableNonPrimitive = 117964800, + InstantiablePrimitive = 14680064, + Instantiable = 132644864, + StructuredOrInstantiable = 536346624, + Narrowable = 536575971, } type DestructuringPattern = BindingPattern | ObjectLiteralExpression | ArrayLiteralExpression; interface Type { @@ -6951,6 +6947,7 @@ declare namespace ts { Message = 3, } enum ModuleResolutionKind { + /** @deprecated */ Classic = 1, /** * @deprecated @@ -6958,6 +6955,9 @@ declare namespace ts { * Use the new name or consider switching to a modern module resolution target. */ NodeJs = 2, + /** + * @deprecated + */ Node10 = 2, Node16 = 3, NodeNext = 99, @@ -7020,6 +7020,7 @@ declare namespace ts { allowUnreachableCode?: boolean; allowUnusedLabels?: boolean; alwaysStrict?: boolean; + /** @deprecated */ baseUrl?: string; /** @deprecated */ charset?: string; @@ -7033,6 +7034,7 @@ declare namespace ts { disableSourceOfProjectReferenceRedirect?: boolean; disableSolutionSearching?: boolean; disableReferencedProjectLoad?: boolean; + /** @deprecated */ downlevelIteration?: boolean; emitBOM?: boolean; emitDecoratorMetadata?: boolean; @@ -7150,10 +7152,14 @@ declare namespace ts { [option: string]: CompilerOptionsValue | undefined; } enum ModuleKind { + /** @deprecated */ None = 0, CommonJS = 1, + /** @deprecated */ AMD = 2, + /** @deprecated */ UMD = 3, + /** @deprecated */ System = 4, ES2015 = 5, ES2020 = 6, @@ -7205,6 +7211,7 @@ declare namespace ts { enum ScriptTarget { /** @deprecated */ ES3 = 0, + /** @deprecated */ ES5 = 1, ES2015 = 2, ES2016 = 3, @@ -7216,9 +7223,11 @@ declare namespace ts { ES2022 = 9, ES2023 = 10, ES2024 = 11, + ES2025 = 12, ESNext = 99, JSON = 100, Latest = 99, + LatestStandard = 12, } enum LanguageVariant { Standard = 0, @@ -9320,7 +9329,7 @@ declare namespace ts { * Given a set of options, returns the set of type directive names * that should be included for this program automatically. * This list could either come from the config file, - * or from enumerating the types root + initial secondary types lookup location. + * and/or from enumerating the types root + initial secondary types lookup location given "*" compat wildcard. * More type directives might appear in the program later as a result of loading actual source files; * this list is only the set of defaults that are implicitly included. */ @@ -10039,6 +10048,7 @@ declare namespace ts { libReferenceDirectives: FileReference[]; importedFiles: FileReference[]; ambientExternalModules?: string[]; + /** @deprecated Always false. Use a Program to determine if a file is a lib file. */ isLibFile: boolean; } interface HostCancellationToken { diff --git a/packages/schematics/angular/third_party/github.com/Microsoft/TypeScript/lib/typescript.js b/packages/schematics/angular/third_party/github.com/Microsoft/TypeScript/lib/typescript.js index 2643aa12aa64..d322bce73085 100644 --- a/packages/schematics/angular/third_party/github.com/Microsoft/TypeScript/lib/typescript.js +++ b/packages/schematics/angular/third_party/github.com/Microsoft/TypeScript/lib/typescript.js @@ -7,7 +7,7 @@ License at http://www.apache.org/licenses/LICENSE-2.0 THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, -MERCHANTABLITY OR NON-INFRINGEMENT. +MERCHANTABILITY OR NON-INFRINGEMENT. See the Apache Version 2.0 License for specific language governing permissions and limitations under the License. @@ -251,6 +251,7 @@ __export(typescript_exports, { canHaveLocals: () => canHaveLocals, canHaveModifiers: () => canHaveModifiers, canHaveModuleSpecifier: () => canHaveModuleSpecifier, + canHaveStatements: () => canHaveStatements, canHaveSymbol: () => canHaveSymbol, canIncludeBindAndCheckDiagnostics: () => canIncludeBindAndCheckDiagnostics, canJsonReportNoInputFiles: () => canJsonReportNoInputFiles, @@ -298,6 +299,7 @@ __export(typescript_exports, { commonOptionsWithBuild: () => commonOptionsWithBuild, compact: () => compact, compareBooleans: () => compareBooleans, + compareComparableValues: () => compareComparableValues, compareDataObjects: () => compareDataObjects, compareDiagnostics: () => compareDiagnostics, compareEmitHelpers: () => compareEmitHelpers, @@ -643,6 +645,7 @@ __export(typescript_exports, { getAllowImportingTsExtensions: () => getAllowImportingTsExtensions, getAllowJSCompilerOption: () => getAllowJSCompilerOption, getAllowSyntheticDefaultImports: () => getAllowSyntheticDefaultImports, + getAlwaysStrict: () => getAlwaysStrict, getAncestor: () => getAncestor, getAnyExtensionFromPath: () => getAnyExtensionFromPath, getAreDeclarationMapsEnabled: () => getAreDeclarationMapsEnabled, @@ -672,6 +675,7 @@ __export(typescript_exports, { getCommonSourceDirectory: () => getCommonSourceDirectory, getCommonSourceDirectoryOfConfig: () => getCommonSourceDirectoryOfConfig, getCompilerOptionValue: () => getCompilerOptionValue, + getComputedCommonSourceDirectory: () => getComputedCommonSourceDirectory, getConditions: () => getConditions, getConfigFileParsingDiagnostics: () => getConfigFileParsingDiagnostics, getConstantValue: () => getConstantValue, @@ -881,6 +885,7 @@ __export(typescript_exports, { getModuleInstanceState: () => getModuleInstanceState, getModuleNameStringLiteralAt: () => getModuleNameStringLiteralAt, getModuleSpecifierEndingPreference: () => getModuleSpecifierEndingPreference, + getModuleSpecifierOfBareOrAccessedRequire: () => getModuleSpecifierOfBareOrAccessedRequire, getModuleSpecifierResolverHost: () => getModuleSpecifierResolverHost, getNameForExportedSymbol: () => getNameForExportedSymbol, getNameFromImportAttribute: () => getNameFromImportAttribute, @@ -911,7 +916,6 @@ __export(typescript_exports, { getNonAugmentationDeclaration: () => getNonAugmentationDeclaration, getNonDecoratorTokenPosOfNode: () => getNonDecoratorTokenPosOfNode, getNonIncrementalBuildInfoRoots: () => getNonIncrementalBuildInfoRoots, - getNonModifierTokenPosOfNode: () => getNonModifierTokenPosOfNode, getNormalizedAbsolutePath: () => getNormalizedAbsolutePath, getNormalizedAbsolutePathWithoutRoot: () => getNormalizedAbsolutePathWithoutRoot, getNormalizedPathComponents: () => getNormalizedPathComponents, @@ -1642,6 +1646,7 @@ __export(typescript_exports, { isPlusToken: () => isPlusToken, isPossiblyTypeArgumentPosition: () => isPossiblyTypeArgumentPosition, isPostfixUnaryExpression: () => isPostfixUnaryExpression, + isPotentiallyExecutableNode: () => isPotentiallyExecutableNode, isPrefixUnaryExpression: () => isPrefixUnaryExpression, isPrimitiveLiteralValue: () => isPrimitiveLiteralValue, isPrivateIdentifier: () => isPrivateIdentifier, @@ -2244,9 +2249,7 @@ __export(typescript_exports, { unmangleScopedPackageName: () => unmangleScopedPackageName, unorderedRemoveItem: () => unorderedRemoveItem, unprefixedNodeCoreModules: () => unprefixedNodeCoreModules, - unreachableCodeIsError: () => unreachableCodeIsError, unsetNodeChildren: () => unsetNodeChildren, - unusedLabelIsError: () => unusedLabelIsError, unwrapInnermostStatementOfLabel: () => unwrapInnermostStatementOfLabel, unwrapParenthesizedExpression: () => unwrapParenthesizedExpression, updateErrorForNoInputFiles: () => updateErrorForNoInputFiles, @@ -2256,6 +2259,7 @@ __export(typescript_exports, { updateSharedExtendedConfigFileWatcher: () => updateSharedExtendedConfigFileWatcher, updateSourceFile: () => updateSourceFile, updateWatchingWildcardDirectories: () => updateWatchingWildcardDirectories, + usesWildcardTypes: () => usesWildcardTypes, usingSingleLineStringWriter: () => usingSingleLineStringWriter, utf16EncodeAsString: () => utf16EncodeAsString, validateLocaleAndSetLanguage: () => validateLocaleAndSetLanguage, @@ -2284,8 +2288,8 @@ __export(typescript_exports, { module.exports = __toCommonJS(typescript_exports); // src/compiler/corePublic.ts -var versionMajorMinor = "5.9"; -var version = "5.9.2"; +var versionMajorMinor = "6.0"; +var version = "6.0.2"; var Comparison = /* @__PURE__ */ ((Comparison3) => { Comparison3[Comparison3["LessThan"] = -1] = "LessThan"; Comparison3[Comparison3["EqualTo"] = 0] = "EqualTo"; @@ -2980,7 +2984,7 @@ function binarySearchKey(array, key, keySelector, keyComparer, offset) { while (low <= high) { const middle = low + (high - low >> 1); const midKey = keySelector(array[middle], middle); - switch (keyComparer(midKey, key)) { + switch (Math.sign(keyComparer(midKey, key))) { case -1 /* LessThan */: low = middle + 1; break; @@ -4305,8 +4309,8 @@ Node ${formatSyntaxKind(node.kind)} was unexpected.`, // for use with vscode-js-debug's new customDescriptionGenerator in launch.json __tsDebuggerDisplay: { value() { - const typeHeader = this.flags & 67359327 /* Intrinsic */ ? `IntrinsicType ${this.intrinsicName}${this.debugIntrinsicName ? ` (${this.debugIntrinsicName})` : ""}` : this.flags & 98304 /* Nullable */ ? "NullableType" : this.flags & 384 /* StringOrNumberLiteral */ ? `LiteralType ${JSON.stringify(this.value)}` : this.flags & 2048 /* BigIntLiteral */ ? `LiteralType ${this.value.negative ? "-" : ""}${this.value.base10Value}n` : this.flags & 8192 /* UniqueESSymbol */ ? "UniqueESSymbolType" : this.flags & 32 /* Enum */ ? "EnumType" : this.flags & 1048576 /* Union */ ? "UnionType" : this.flags & 2097152 /* Intersection */ ? "IntersectionType" : this.flags & 4194304 /* Index */ ? "IndexType" : this.flags & 8388608 /* IndexedAccess */ ? "IndexedAccessType" : this.flags & 16777216 /* Conditional */ ? "ConditionalType" : this.flags & 33554432 /* Substitution */ ? "SubstitutionType" : this.flags & 262144 /* TypeParameter */ ? "TypeParameter" : this.flags & 524288 /* Object */ ? this.objectFlags & 3 /* ClassOrInterface */ ? "InterfaceType" : this.objectFlags & 4 /* Reference */ ? "TypeReference" : this.objectFlags & 8 /* Tuple */ ? "TupleType" : this.objectFlags & 16 /* Anonymous */ ? "AnonymousType" : this.objectFlags & 32 /* Mapped */ ? "MappedType" : this.objectFlags & 1024 /* ReverseMapped */ ? "ReverseMappedType" : this.objectFlags & 256 /* EvolvingArray */ ? "EvolvingArrayType" : "ObjectType" : "Type"; - const remainingObjectFlags = this.flags & 524288 /* Object */ ? this.objectFlags & ~1343 /* ObjectTypeKindMask */ : 0; + const typeHeader = this.flags & 402431 /* Intrinsic */ ? `IntrinsicType ${this.intrinsicName}${this.debugIntrinsicName ? ` (${this.debugIntrinsicName})` : ""}` : this.flags & 12 /* Nullable */ ? "NullableType" : this.flags & 3072 /* StringOrNumberLiteral */ ? `LiteralType ${JSON.stringify(this.value)}` : this.flags & 4096 /* BigIntLiteral */ ? `LiteralType ${this.value.negative ? "-" : ""}${this.value.base10Value}n` : this.flags & 16384 /* UniqueESSymbol */ ? "UniqueESSymbolType" : this.flags & 65536 /* Enum */ ? "EnumType" : this.flags & 134217728 /* Union */ ? "UnionType" : this.flags & 268435456 /* Intersection */ ? "IntersectionType" : this.flags & 2097152 /* Index */ ? "IndexType" : this.flags & 33554432 /* IndexedAccess */ ? "IndexedAccessType" : this.flags & 67108864 /* Conditional */ ? "ConditionalType" : this.flags & 16777216 /* Substitution */ ? "SubstitutionType" : this.flags & 524288 /* TypeParameter */ ? "TypeParameter" : this.flags & 1048576 /* Object */ ? this.objectFlags & 3 /* ClassOrInterface */ ? "InterfaceType" : this.objectFlags & 4 /* Reference */ ? "TypeReference" : this.objectFlags & 8 /* Tuple */ ? "TupleType" : this.objectFlags & 16 /* Anonymous */ ? "AnonymousType" : this.objectFlags & 32 /* Mapped */ ? "MappedType" : this.objectFlags & 1024 /* ReverseMapped */ ? "ReverseMappedType" : this.objectFlags & 256 /* EvolvingArray */ ? "EvolvingArrayType" : "ObjectType" : "Type"; + const remainingObjectFlags = this.flags & 1048576 /* Object */ ? this.objectFlags & ~142607679 /* ObjectTypeKindMask */ : 0; return `${typeHeader}${this.symbol ? ` '${symbolName(this.symbol)}'` : ""}${remainingObjectFlags ? ` (${formatObjectFlags(remainingObjectFlags)})` : ""}`; } }, @@ -4317,7 +4321,7 @@ Node ${formatSyntaxKind(node.kind)} was unexpected.`, }, __debugObjectFlags: { get() { - return this.flags & 524288 /* Object */ ? formatObjectFlags(this.objectFlags) : ""; + return this.flags & 1048576 /* Object */ ? formatObjectFlags(this.objectFlags) : ""; } }, __debugTypeToString: { @@ -5408,7 +5412,7 @@ var tracingEnabled; const objectFlags = type.objectFlags; const symbol = type.aliasSymbol ?? type.symbol; let display; - if (objectFlags & 16 /* Anonymous */ | type.flags & 2944 /* Literal */) { + if (objectFlags & 16 /* Anonymous */ | type.flags & 15360 /* Literal */) { try { display = (_a = type.checker) == null ? void 0 : _a.typeToString(type); } catch { @@ -5416,7 +5420,7 @@ var tracingEnabled; } } let indexedAccessProperties = {}; - if (type.flags & 8388608 /* IndexedAccess */) { + if (type.flags & 33554432 /* IndexedAccess */) { const indexedAccessType = type; indexedAccessProperties = { indexedAccessObjectType: (_b = indexedAccessType.objectType) == null ? void 0 : _b.id, @@ -5433,7 +5437,7 @@ var tracingEnabled; }; } let conditionalProperties = {}; - if (type.flags & 16777216 /* Conditional */) { + if (type.flags & 67108864 /* Conditional */) { const conditionalType = type; conditionalProperties = { conditionalCheckType: (_f = conditionalType.checkType) == null ? void 0 : _f.id, @@ -5443,7 +5447,7 @@ var tracingEnabled; }; } let substitutionProperties = {}; - if (type.flags & 33554432 /* Substitution */) { + if (type.flags & 16777216 /* Substitution */) { const substitutionType = type; substitutionProperties = { substitutionBaseType: (_j = substitutionType.baseType) == null ? void 0 : _j.id, @@ -5482,10 +5486,10 @@ var tracingEnabled; symbolName: (symbol == null ? void 0 : symbol.escapedName) && unescapeLeadingUnderscores(symbol.escapedName), recursionId: recursionToken, isTuple: objectFlags & 8 /* Tuple */ ? true : void 0, - unionTypes: type.flags & 1048576 /* Union */ ? (_p = type.types) == null ? void 0 : _p.map((t) => t.id) : void 0, - intersectionTypes: type.flags & 2097152 /* Intersection */ ? type.types.map((t) => t.id) : void 0, + unionTypes: type.flags & 134217728 /* Union */ ? (_p = type.types) == null ? void 0 : _p.map((t) => t.id) : void 0, + intersectionTypes: type.flags & 268435456 /* Intersection */ ? type.types.map((t) => t.id) : void 0, aliasTypeArguments: (_q = type.aliasTypeArguments) == null ? void 0 : _q.map((t) => t.id), - keyofType: type.flags & 4194304 /* Index */ ? (_r = type.type) == null ? void 0 : _r.id : void 0, + keyofType: type.flags & 2097152 /* Index */ ? (_r = type.type) == null ? void 0 : _r.id : void 0, ...indexedAccessProperties, ...referenceProperties, ...conditionalProperties, @@ -5951,6 +5955,7 @@ var NodeFlags = /* @__PURE__ */ ((NodeFlags3) => { NodeFlags3[NodeFlags3["JsonFile"] = 134217728] = "JsonFile"; NodeFlags3[NodeFlags3["TypeCached"] = 268435456] = "TypeCached"; NodeFlags3[NodeFlags3["Deprecated"] = 536870912] = "Deprecated"; + NodeFlags3[NodeFlags3["Unreachable"] = 1073741824] = "Unreachable"; NodeFlags3[NodeFlags3["BlockScoped"] = 7] = "BlockScoped"; NodeFlags3[NodeFlags3["Constant"] = 6] = "Constant"; NodeFlags3[NodeFlags3["ReachabilityCheckFlags"] = 1536] = "ReachabilityCheckFlags"; @@ -6167,7 +6172,7 @@ var ContextFlags = /* @__PURE__ */ ((ContextFlags3) => { ContextFlags3[ContextFlags3["None"] = 0] = "None"; ContextFlags3[ContextFlags3["Signature"] = 1] = "Signature"; ContextFlags3[ContextFlags3["NoConstraints"] = 2] = "NoConstraints"; - ContextFlags3[ContextFlags3["Completions"] = 4] = "Completions"; + ContextFlags3[ContextFlags3["IgnoreNodeInferences"] = 4] = "IgnoreNodeInferences"; ContextFlags3[ContextFlags3["SkipBindingPatterns"] = 8] = "SkipBindingPatterns"; return ContextFlags3; })(ContextFlags || {}); @@ -6429,75 +6434,76 @@ var NodeCheckFlags = /* @__PURE__ */ ((NodeCheckFlags3) => { var TypeFlags = /* @__PURE__ */ ((TypeFlags2) => { TypeFlags2[TypeFlags2["Any"] = 1] = "Any"; TypeFlags2[TypeFlags2["Unknown"] = 2] = "Unknown"; - TypeFlags2[TypeFlags2["String"] = 4] = "String"; - TypeFlags2[TypeFlags2["Number"] = 8] = "Number"; - TypeFlags2[TypeFlags2["Boolean"] = 16] = "Boolean"; - TypeFlags2[TypeFlags2["Enum"] = 32] = "Enum"; - TypeFlags2[TypeFlags2["BigInt"] = 64] = "BigInt"; - TypeFlags2[TypeFlags2["StringLiteral"] = 128] = "StringLiteral"; - TypeFlags2[TypeFlags2["NumberLiteral"] = 256] = "NumberLiteral"; - TypeFlags2[TypeFlags2["BooleanLiteral"] = 512] = "BooleanLiteral"; - TypeFlags2[TypeFlags2["EnumLiteral"] = 1024] = "EnumLiteral"; - TypeFlags2[TypeFlags2["BigIntLiteral"] = 2048] = "BigIntLiteral"; - TypeFlags2[TypeFlags2["ESSymbol"] = 4096] = "ESSymbol"; - TypeFlags2[TypeFlags2["UniqueESSymbol"] = 8192] = "UniqueESSymbol"; - TypeFlags2[TypeFlags2["Void"] = 16384] = "Void"; - TypeFlags2[TypeFlags2["Undefined"] = 32768] = "Undefined"; - TypeFlags2[TypeFlags2["Null"] = 65536] = "Null"; - TypeFlags2[TypeFlags2["Never"] = 131072] = "Never"; - TypeFlags2[TypeFlags2["TypeParameter"] = 262144] = "TypeParameter"; - TypeFlags2[TypeFlags2["Object"] = 524288] = "Object"; - TypeFlags2[TypeFlags2["Union"] = 1048576] = "Union"; - TypeFlags2[TypeFlags2["Intersection"] = 2097152] = "Intersection"; - TypeFlags2[TypeFlags2["Index"] = 4194304] = "Index"; - TypeFlags2[TypeFlags2["IndexedAccess"] = 8388608] = "IndexedAccess"; - TypeFlags2[TypeFlags2["Conditional"] = 16777216] = "Conditional"; - TypeFlags2[TypeFlags2["Substitution"] = 33554432] = "Substitution"; - TypeFlags2[TypeFlags2["NonPrimitive"] = 67108864] = "NonPrimitive"; - TypeFlags2[TypeFlags2["TemplateLiteral"] = 134217728] = "TemplateLiteral"; - TypeFlags2[TypeFlags2["StringMapping"] = 268435456] = "StringMapping"; + TypeFlags2[TypeFlags2["Undefined"] = 4] = "Undefined"; + TypeFlags2[TypeFlags2["Null"] = 8] = "Null"; + TypeFlags2[TypeFlags2["Void"] = 16] = "Void"; + TypeFlags2[TypeFlags2["String"] = 32] = "String"; + TypeFlags2[TypeFlags2["Number"] = 64] = "Number"; + TypeFlags2[TypeFlags2["BigInt"] = 128] = "BigInt"; + TypeFlags2[TypeFlags2["Boolean"] = 256] = "Boolean"; + TypeFlags2[TypeFlags2["ESSymbol"] = 512] = "ESSymbol"; + TypeFlags2[TypeFlags2["StringLiteral"] = 1024] = "StringLiteral"; + TypeFlags2[TypeFlags2["NumberLiteral"] = 2048] = "NumberLiteral"; + TypeFlags2[TypeFlags2["BigIntLiteral"] = 4096] = "BigIntLiteral"; + TypeFlags2[TypeFlags2["BooleanLiteral"] = 8192] = "BooleanLiteral"; + TypeFlags2[TypeFlags2["UniqueESSymbol"] = 16384] = "UniqueESSymbol"; + TypeFlags2[TypeFlags2["EnumLiteral"] = 32768] = "EnumLiteral"; + TypeFlags2[TypeFlags2["Enum"] = 65536] = "Enum"; + TypeFlags2[TypeFlags2["NonPrimitive"] = 131072] = "NonPrimitive"; + TypeFlags2[TypeFlags2["Never"] = 262144] = "Never"; + TypeFlags2[TypeFlags2["TypeParameter"] = 524288] = "TypeParameter"; + TypeFlags2[TypeFlags2["Object"] = 1048576] = "Object"; + TypeFlags2[TypeFlags2["Index"] = 2097152] = "Index"; + TypeFlags2[TypeFlags2["TemplateLiteral"] = 4194304] = "TemplateLiteral"; + TypeFlags2[TypeFlags2["StringMapping"] = 8388608] = "StringMapping"; + TypeFlags2[TypeFlags2["Substitution"] = 16777216] = "Substitution"; + TypeFlags2[TypeFlags2["IndexedAccess"] = 33554432] = "IndexedAccess"; + TypeFlags2[TypeFlags2["Conditional"] = 67108864] = "Conditional"; + TypeFlags2[TypeFlags2["Union"] = 134217728] = "Union"; + TypeFlags2[TypeFlags2["Intersection"] = 268435456] = "Intersection"; TypeFlags2[TypeFlags2["Reserved1"] = 536870912] = "Reserved1"; TypeFlags2[TypeFlags2["Reserved2"] = 1073741824] = "Reserved2"; + TypeFlags2[TypeFlags2["Reserved3"] = -2147483648] = "Reserved3"; TypeFlags2[TypeFlags2["AnyOrUnknown"] = 3] = "AnyOrUnknown"; - TypeFlags2[TypeFlags2["Nullable"] = 98304] = "Nullable"; - TypeFlags2[TypeFlags2["Literal"] = 2944] = "Literal"; - TypeFlags2[TypeFlags2["Unit"] = 109472] = "Unit"; - TypeFlags2[TypeFlags2["Freshable"] = 2976] = "Freshable"; - TypeFlags2[TypeFlags2["StringOrNumberLiteral"] = 384] = "StringOrNumberLiteral"; - TypeFlags2[TypeFlags2["StringOrNumberLiteralOrUnique"] = 8576] = "StringOrNumberLiteralOrUnique"; - TypeFlags2[TypeFlags2["DefinitelyFalsy"] = 117632] = "DefinitelyFalsy"; - TypeFlags2[TypeFlags2["PossiblyFalsy"] = 117724] = "PossiblyFalsy"; - TypeFlags2[TypeFlags2["Intrinsic"] = 67359327] = "Intrinsic"; - TypeFlags2[TypeFlags2["StringLike"] = 402653316] = "StringLike"; - TypeFlags2[TypeFlags2["NumberLike"] = 296] = "NumberLike"; - TypeFlags2[TypeFlags2["BigIntLike"] = 2112] = "BigIntLike"; - TypeFlags2[TypeFlags2["BooleanLike"] = 528] = "BooleanLike"; - TypeFlags2[TypeFlags2["EnumLike"] = 1056] = "EnumLike"; - TypeFlags2[TypeFlags2["ESSymbolLike"] = 12288] = "ESSymbolLike"; - TypeFlags2[TypeFlags2["VoidLike"] = 49152] = "VoidLike"; - TypeFlags2[TypeFlags2["Primitive"] = 402784252] = "Primitive"; - TypeFlags2[TypeFlags2["DefinitelyNonNullable"] = 470302716] = "DefinitelyNonNullable"; - TypeFlags2[TypeFlags2["DisjointDomains"] = 469892092] = "DisjointDomains"; - TypeFlags2[TypeFlags2["UnionOrIntersection"] = 3145728] = "UnionOrIntersection"; - TypeFlags2[TypeFlags2["StructuredType"] = 3670016] = "StructuredType"; - TypeFlags2[TypeFlags2["TypeVariable"] = 8650752] = "TypeVariable"; - TypeFlags2[TypeFlags2["InstantiableNonPrimitive"] = 58982400] = "InstantiableNonPrimitive"; - TypeFlags2[TypeFlags2["InstantiablePrimitive"] = 406847488] = "InstantiablePrimitive"; - TypeFlags2[TypeFlags2["Instantiable"] = 465829888] = "Instantiable"; - TypeFlags2[TypeFlags2["StructuredOrInstantiable"] = 469499904] = "StructuredOrInstantiable"; - TypeFlags2[TypeFlags2["ObjectFlagsType"] = 3899393] = "ObjectFlagsType"; - TypeFlags2[TypeFlags2["Simplifiable"] = 25165824] = "Simplifiable"; - TypeFlags2[TypeFlags2["Singleton"] = 67358815] = "Singleton"; - TypeFlags2[TypeFlags2["Narrowable"] = 536624127] = "Narrowable"; - TypeFlags2[TypeFlags2["IncludesMask"] = 473694207] = "IncludesMask"; - TypeFlags2[TypeFlags2["IncludesMissingType"] = 262144 /* TypeParameter */] = "IncludesMissingType"; - TypeFlags2[TypeFlags2["IncludesNonWideningType"] = 4194304 /* Index */] = "IncludesNonWideningType"; - TypeFlags2[TypeFlags2["IncludesWildcard"] = 8388608 /* IndexedAccess */] = "IncludesWildcard"; - TypeFlags2[TypeFlags2["IncludesEmptyObject"] = 16777216 /* Conditional */] = "IncludesEmptyObject"; - TypeFlags2[TypeFlags2["IncludesInstantiable"] = 33554432 /* Substitution */] = "IncludesInstantiable"; + TypeFlags2[TypeFlags2["Nullable"] = 12] = "Nullable"; + TypeFlags2[TypeFlags2["Literal"] = 15360] = "Literal"; + TypeFlags2[TypeFlags2["Unit"] = 97292] = "Unit"; + TypeFlags2[TypeFlags2["Freshable"] = 80896] = "Freshable"; + TypeFlags2[TypeFlags2["StringOrNumberLiteral"] = 3072] = "StringOrNumberLiteral"; + TypeFlags2[TypeFlags2["StringOrNumberLiteralOrUnique"] = 19456] = "StringOrNumberLiteralOrUnique"; + TypeFlags2[TypeFlags2["DefinitelyFalsy"] = 15388] = "DefinitelyFalsy"; + TypeFlags2[TypeFlags2["PossiblyFalsy"] = 15868] = "PossiblyFalsy"; + TypeFlags2[TypeFlags2["Intrinsic"] = 402431] = "Intrinsic"; + TypeFlags2[TypeFlags2["StringLike"] = 12583968] = "StringLike"; + TypeFlags2[TypeFlags2["NumberLike"] = 67648] = "NumberLike"; + TypeFlags2[TypeFlags2["BigIntLike"] = 4224] = "BigIntLike"; + TypeFlags2[TypeFlags2["BooleanLike"] = 8448] = "BooleanLike"; + TypeFlags2[TypeFlags2["EnumLike"] = 98304] = "EnumLike"; + TypeFlags2[TypeFlags2["ESSymbolLike"] = 16896] = "ESSymbolLike"; + TypeFlags2[TypeFlags2["VoidLike"] = 20] = "VoidLike"; + TypeFlags2[TypeFlags2["Primitive"] = 12713980] = "Primitive"; + TypeFlags2[TypeFlags2["DefinitelyNonNullable"] = 13893600] = "DefinitelyNonNullable"; + TypeFlags2[TypeFlags2["DisjointDomains"] = 12812284] = "DisjointDomains"; + TypeFlags2[TypeFlags2["UnionOrIntersection"] = 402653184] = "UnionOrIntersection"; + TypeFlags2[TypeFlags2["StructuredType"] = 403701760] = "StructuredType"; + TypeFlags2[TypeFlags2["TypeVariable"] = 34078720] = "TypeVariable"; + TypeFlags2[TypeFlags2["InstantiableNonPrimitive"] = 117964800] = "InstantiableNonPrimitive"; + TypeFlags2[TypeFlags2["InstantiablePrimitive"] = 14680064] = "InstantiablePrimitive"; + TypeFlags2[TypeFlags2["Instantiable"] = 132644864] = "Instantiable"; + TypeFlags2[TypeFlags2["StructuredOrInstantiable"] = 536346624] = "StructuredOrInstantiable"; + TypeFlags2[TypeFlags2["ObjectFlagsType"] = 403963917] = "ObjectFlagsType"; + TypeFlags2[TypeFlags2["Simplifiable"] = 102760448] = "Simplifiable"; + TypeFlags2[TypeFlags2["Singleton"] = 394239] = "Singleton"; + TypeFlags2[TypeFlags2["Narrowable"] = 536575971] = "Narrowable"; + TypeFlags2[TypeFlags2["IncludesMask"] = 416808959] = "IncludesMask"; + TypeFlags2[TypeFlags2["IncludesMissingType"] = 524288 /* TypeParameter */] = "IncludesMissingType"; + TypeFlags2[TypeFlags2["IncludesNonWideningType"] = 2097152 /* Index */] = "IncludesNonWideningType"; + TypeFlags2[TypeFlags2["IncludesWildcard"] = 33554432 /* IndexedAccess */] = "IncludesWildcard"; + TypeFlags2[TypeFlags2["IncludesEmptyObject"] = 67108864 /* Conditional */] = "IncludesEmptyObject"; + TypeFlags2[TypeFlags2["IncludesInstantiable"] = 16777216 /* Substitution */] = "IncludesInstantiable"; TypeFlags2[TypeFlags2["IncludesConstrainedTypeVariable"] = 536870912 /* Reserved1 */] = "IncludesConstrainedTypeVariable"; TypeFlags2[TypeFlags2["IncludesError"] = 1073741824 /* Reserved2 */] = "IncludesError"; - TypeFlags2[TypeFlags2["NotPrimitiveUnion"] = 36323331] = "NotPrimitiveUnion"; + TypeFlags2[TypeFlags2["NotPrimitiveUnion"] = 286523411] = "NotPrimitiveUnion"; return TypeFlags2; })(TypeFlags || {}); var ObjectFlags = /* @__PURE__ */ ((ObjectFlags3) => { @@ -6528,10 +6534,10 @@ var ObjectFlags = /* @__PURE__ */ ((ObjectFlags3) => { ObjectFlags3[ObjectFlags3["RequiresWidening"] = 196608] = "RequiresWidening"; ObjectFlags3[ObjectFlags3["PropagatingFlags"] = 458752] = "PropagatingFlags"; ObjectFlags3[ObjectFlags3["InstantiatedMapped"] = 96] = "InstantiatedMapped"; - ObjectFlags3[ObjectFlags3["ObjectTypeKindMask"] = 1343] = "ObjectTypeKindMask"; ObjectFlags3[ObjectFlags3["ContainsSpread"] = 2097152] = "ContainsSpread"; ObjectFlags3[ObjectFlags3["ObjectRestType"] = 4194304] = "ObjectRestType"; ObjectFlags3[ObjectFlags3["InstantiationExpressionType"] = 8388608] = "InstantiationExpressionType"; + ObjectFlags3[ObjectFlags3["ObjectTypeKindMask"] = 142607679] = "ObjectTypeKindMask"; ObjectFlags3[ObjectFlags3["IsClassInstanceClone"] = 16777216] = "IsClassInstanceClone"; ObjectFlags3[ObjectFlags3["IdenticalBaseTypeCalculated"] = 33554432] = "IdenticalBaseTypeCalculated"; ObjectFlags3[ObjectFlags3["IdenticalBaseTypeExists"] = 67108864] = "IdenticalBaseTypeExists"; @@ -6785,15 +6791,17 @@ var ScriptTarget = /* @__PURE__ */ ((ScriptTarget12) => { ScriptTarget12[ScriptTarget12["ES2022"] = 9] = "ES2022"; ScriptTarget12[ScriptTarget12["ES2023"] = 10] = "ES2023"; ScriptTarget12[ScriptTarget12["ES2024"] = 11] = "ES2024"; + ScriptTarget12[ScriptTarget12["ES2025"] = 12] = "ES2025"; ScriptTarget12[ScriptTarget12["ESNext"] = 99] = "ESNext"; ScriptTarget12[ScriptTarget12["JSON"] = 100] = "JSON"; ScriptTarget12[ScriptTarget12["Latest"] = 99 /* ESNext */] = "Latest"; + ScriptTarget12[ScriptTarget12["LatestStandard"] = 12 /* ES2025 */] = "LatestStandard"; return ScriptTarget12; })(ScriptTarget || {}); -var LanguageVariant = /* @__PURE__ */ ((LanguageVariant3) => { - LanguageVariant3[LanguageVariant3["Standard"] = 0] = "Standard"; - LanguageVariant3[LanguageVariant3["JSX"] = 1] = "JSX"; - return LanguageVariant3; +var LanguageVariant = /* @__PURE__ */ ((LanguageVariant4) => { + LanguageVariant4[LanguageVariant4["Standard"] = 0] = "Standard"; + LanguageVariant4[LanguageVariant4["JSX"] = 1] = "JSX"; + return LanguageVariant4; })(LanguageVariant || {}); var WatchDirectoryFlags = /* @__PURE__ */ ((WatchDirectoryFlags3) => { WatchDirectoryFlags3[WatchDirectoryFlags3["None"] = 0] = "None"; @@ -7623,10 +7631,10 @@ function createSingleWatcherPerName(cache, useCaseSensitiveFileNames2, name, cal cache.set(path, { watcher: createWatcher( // Cant infer types correctly so lets satisfy checker - (param1, param2, param3) => { + ((param1, param2, param3) => { var _a; return (_a = cache.get(path)) == null ? void 0 : _a.callbacks.slice().forEach((cb) => cb(param1, param2, param3)); - } + }) ), callbacks: [callback] }); @@ -9454,7 +9462,7 @@ var Diagnostics = { A_bigint_literal_cannot_use_exponential_notation: diag(1352, 1 /* Error */, "A_bigint_literal_cannot_use_exponential_notation_1352", "A bigint literal cannot use exponential notation."), A_bigint_literal_must_be_an_integer: diag(1353, 1 /* Error */, "A_bigint_literal_must_be_an_integer_1353", "A bigint literal must be an integer."), readonly_type_modifier_is_only_permitted_on_array_and_tuple_literal_types: diag(1354, 1 /* Error */, "readonly_type_modifier_is_only_permitted_on_array_and_tuple_literal_types_1354", "'readonly' type modifier is only permitted on array and tuple literal types."), - A_const_assertions_can_only_be_applied_to_references_to_enum_members_or_string_number_boolean_array_or_object_literals: diag(1355, 1 /* Error */, "A_const_assertions_can_only_be_applied_to_references_to_enum_members_or_string_number_boolean_array__1355", "A 'const' assertions can only be applied to references to enum members, or string, number, boolean, array, or object literals."), + A_const_assertion_can_only_be_applied_to_references_to_enum_members_or_string_number_boolean_array_or_object_literals: diag(1355, 1 /* Error */, "A_const_assertion_can_only_be_applied_to_references_to_enum_members_or_string_number_boolean_array_o_1355", "A 'const' assertion can only be applied to references to enum members, or string, number, boolean, array, or object literals."), Did_you_mean_to_mark_this_function_as_async: diag(1356, 1 /* Error */, "Did_you_mean_to_mark_this_function_as_async_1356", "Did you mean to mark this function as 'async'?"), An_enum_member_name_must_be_followed_by_a_or: diag(1357, 1 /* Error */, "An_enum_member_name_must_be_followed_by_a_or_1357", "An enum member name must be followed by a ',', '=', or '}'."), Tagged_template_expressions_are_not_permitted_in_an_optional_chain: diag(1358, 1 /* Error */, "Tagged_template_expressions_are_not_permitted_in_an_optional_chain_1358", "Tagged template expressions are not permitted in an optional chain."), @@ -9620,24 +9628,16 @@ var Diagnostics = { Decimal_escape_sequences_and_backreferences_are_not_allowed_in_a_character_class: diag(1537, 1 /* Error */, "Decimal_escape_sequences_and_backreferences_are_not_allowed_in_a_character_class_1537", "Decimal escape sequences and backreferences are not allowed in a character class."), Unicode_escape_sequences_are_only_available_when_the_Unicode_u_flag_or_the_Unicode_Sets_v_flag_is_set: diag(1538, 1 /* Error */, "Unicode_escape_sequences_are_only_available_when_the_Unicode_u_flag_or_the_Unicode_Sets_v_flag_is_se_1538", "Unicode escape sequences are only available when the Unicode (u) flag or the Unicode Sets (v) flag is set."), A_bigint_literal_cannot_be_used_as_a_property_name: diag(1539, 1 /* Error */, "A_bigint_literal_cannot_be_used_as_a_property_name_1539", "A 'bigint' literal cannot be used as a property name."), - A_namespace_declaration_should_not_be_declared_using_the_module_keyword_Please_use_the_namespace_keyword_instead: diag( - 1540, - 2 /* Suggestion */, - "A_namespace_declaration_should_not_be_declared_using_the_module_keyword_Please_use_the_namespace_key_1540", - "A 'namespace' declaration should not be declared using the 'module' keyword. Please use the 'namespace' keyword instead.", - /*reportsUnnecessary*/ - void 0, - /*elidedInCompatabilityPyramid*/ - void 0, - /*reportsDeprecated*/ - true - ), + A_namespace_declaration_should_not_be_declared_using_the_module_keyword_Please_use_the_namespace_keyword_instead: diag(1540, 1 /* Error */, "A_namespace_declaration_should_not_be_declared_using_the_module_keyword_Please_use_the_namespace_key_1540", "A 'namespace' declaration should not be declared using the 'module' keyword. Please use the 'namespace' keyword instead."), Type_only_import_of_an_ECMAScript_module_from_a_CommonJS_module_must_have_a_resolution_mode_attribute: diag(1541, 1 /* Error */, "Type_only_import_of_an_ECMAScript_module_from_a_CommonJS_module_must_have_a_resolution_mode_attribut_1541", "Type-only import of an ECMAScript module from a CommonJS module must have a 'resolution-mode' attribute."), Type_import_of_an_ECMAScript_module_from_a_CommonJS_module_must_have_a_resolution_mode_attribute: diag(1542, 1 /* Error */, "Type_import_of_an_ECMAScript_module_from_a_CommonJS_module_must_have_a_resolution_mode_attribute_1542", "Type import of an ECMAScript module from a CommonJS module must have a 'resolution-mode' attribute."), Importing_a_JSON_file_into_an_ECMAScript_module_requires_a_type_Colon_json_import_attribute_when_module_is_set_to_0: diag(1543, 1 /* Error */, "Importing_a_JSON_file_into_an_ECMAScript_module_requires_a_type_Colon_json_import_attribute_when_mod_1543", `Importing a JSON file into an ECMAScript module requires a 'type: "json"' import attribute when 'module' is set to '{0}'.`), Named_imports_from_a_JSON_file_into_an_ECMAScript_module_are_not_allowed_when_module_is_set_to_0: diag(1544, 1 /* Error */, "Named_imports_from_a_JSON_file_into_an_ECMAScript_module_are_not_allowed_when_module_is_set_to_0_1544", "Named imports from a JSON file into an ECMAScript module are not allowed when 'module' is set to '{0}'."), using_declarations_are_not_allowed_in_ambient_contexts: diag(1545, 1 /* Error */, "using_declarations_are_not_allowed_in_ambient_contexts_1545", "'using' declarations are not allowed in ambient contexts."), await_using_declarations_are_not_allowed_in_ambient_contexts: diag(1546, 1 /* Error */, "await_using_declarations_are_not_allowed_in_ambient_contexts_1546", "'await using' declarations are not allowed in ambient contexts."), + using_declarations_are_not_allowed_in_case_or_default_clauses_unless_contained_within_a_block: diag(1547, 1 /* Error */, "using_declarations_are_not_allowed_in_case_or_default_clauses_unless_contained_within_a_block_1547", "'using' declarations are not allowed in 'case' or 'default' clauses unless contained within a block."), + await_using_declarations_are_not_allowed_in_case_or_default_clauses_unless_contained_within_a_block: diag(1548, 1 /* Error */, "await_using_declarations_are_not_allowed_in_case_or_default_clauses_unless_contained_within_a_block_1548", "'await using' declarations are not allowed in 'case' or 'default' clauses unless contained within a block."), + Ignore_the_tsconfig_found_and_build_with_commandline_options_and_files: diag(1549, 3 /* Message */, "Ignore_the_tsconfig_found_and_build_with_commandline_options_and_files_1549", "Ignore the tsconfig found and build with commandline options and files."), The_types_of_0_are_incompatible_between_these_types: diag(2200, 1 /* Error */, "The_types_of_0_are_incompatible_between_these_types_2200", "The types of '{0}' are incompatible between these types."), The_types_returned_by_0_are_incompatible_between_these_types: diag(2201, 1 /* Error */, "The_types_returned_by_0_are_incompatible_between_these_types_2201", "The types returned by '{0}' are incompatible between these types."), Call_signature_return_types_0_and_1_are_incompatible: diag( @@ -10218,6 +10218,8 @@ var Diagnostics = { Using_JSX_fragments_requires_fragment_factory_0_to_be_in_scope_but_it_could_not_be_found: diag(2879, 1 /* Error */, "Using_JSX_fragments_requires_fragment_factory_0_to_be_in_scope_but_it_could_not_be_found_2879", "Using JSX fragments requires fragment factory '{0}' to be in scope, but it could not be found."), Import_assertions_have_been_replaced_by_import_attributes_Use_with_instead_of_assert: diag(2880, 1 /* Error */, "Import_assertions_have_been_replaced_by_import_attributes_Use_with_instead_of_assert_2880", "Import assertions have been replaced by import attributes. Use 'with' instead of 'assert'."), This_expression_is_never_nullish: diag(2881, 1 /* Error */, "This_expression_is_never_nullish_2881", "This expression is never nullish."), + Cannot_find_module_or_type_declarations_for_side_effect_import_of_0: diag(2882, 1 /* Error */, "Cannot_find_module_or_type_declarations_for_side_effect_import_of_0_2882", "Cannot find module or type declarations for side-effect import of '{0}'."), + The_inferred_type_of_0_cannot_be_named_without_a_reference_to_2_from_1_This_is_likely_not_portable_A_type_annotation_is_necessary: diag(2883, 1 /* Error */, "The_inferred_type_of_0_cannot_be_named_without_a_reference_to_2_from_1_This_is_likely_not_portable_A_2883", "The inferred type of '{0}' cannot be named without a reference to '{2}' from '{1}'. This is likely not portable. A type annotation is necessary."), Import_declaration_0_is_using_private_name_1: diag(4e3, 1 /* Error */, "Import_declaration_0_is_using_private_name_1_4000", "Import declaration '{0}' is using private name '{1}'."), Type_parameter_0_of_exported_class_has_or_is_using_private_name_1: diag(4002, 1 /* Error */, "Type_parameter_0_of_exported_class_has_or_is_using_private_name_1_4002", "Type parameter '{0}' of exported class has or is using private name '{1}'."), Type_parameter_0_of_exported_interface_has_or_is_using_private_name_1: diag(4004, 1 /* Error */, "Type_parameter_0_of_exported_interface_has_or_is_using_private_name_1_4004", "Type parameter '{0}' of exported interface has or is using private name '{1}'."), @@ -10332,6 +10334,7 @@ var Diagnostics = { The_current_host_does_not_support_the_0_option: diag(5001, 1 /* Error */, "The_current_host_does_not_support_the_0_option_5001", "The current host does not support the '{0}' option."), Cannot_find_the_common_subdirectory_path_for_the_input_files: diag(5009, 1 /* Error */, "Cannot_find_the_common_subdirectory_path_for_the_input_files_5009", "Cannot find the common subdirectory path for the input files."), File_specification_cannot_end_in_a_recursive_directory_wildcard_Asterisk_Asterisk_Colon_0: diag(5010, 1 /* Error */, "File_specification_cannot_end_in_a_recursive_directory_wildcard_Asterisk_Asterisk_Colon_0_5010", "File specification cannot end in a recursive directory wildcard ('**'): '{0}'."), + The_common_source_directory_of_0_is_1_The_rootDir_setting_must_be_explicitly_set_to_this_or_another_path_to_adjust_your_output_s_file_layout: diag(5011, 1 /* Error */, "The_common_source_directory_of_0_is_1_The_rootDir_setting_must_be_explicitly_set_to_this_or_another__5011", "The common source directory of '{0}' is '{1}'. The 'rootDir' setting must be explicitly set to this or another path to adjust your output's file layout."), Cannot_read_file_0_Colon_1: diag(5012, 1 /* Error */, "Cannot_read_file_0_Colon_1_5012", "Cannot read file '{0}': {1}."), Unknown_compiler_option_0: diag(5023, 1 /* Error */, "Unknown_compiler_option_0_5023", "Unknown compiler option '{0}'."), Compiler_option_0_requires_a_value_of_type_1: diag(5024, 1 /* Error */, "Compiler_option_0_requires_a_value_of_type_1_5024", "Compiler option '{0}' requires a value of type {1}."), @@ -10381,8 +10384,8 @@ var Diagnostics = { The_root_value_of_a_0_file_must_be_an_object: diag(5092, 1 /* Error */, "The_root_value_of_a_0_file_must_be_an_object_5092", "The root value of a '{0}' file must be an object."), Compiler_option_0_may_only_be_used_with_build: diag(5093, 1 /* Error */, "Compiler_option_0_may_only_be_used_with_build_5093", "Compiler option '--{0}' may only be used with '--build'."), Compiler_option_0_may_not_be_used_with_build: diag(5094, 1 /* Error */, "Compiler_option_0_may_not_be_used_with_build_5094", "Compiler option '--{0}' may not be used with '--build'."), - Option_0_can_only_be_used_when_module_is_set_to_preserve_or_to_es2015_or_later: diag(5095, 1 /* Error */, "Option_0_can_only_be_used_when_module_is_set_to_preserve_or_to_es2015_or_later_5095", "Option '{0}' can only be used when 'module' is set to 'preserve' or to 'es2015' or later."), - Option_allowImportingTsExtensions_can_only_be_used_when_either_noEmit_or_emitDeclarationOnly_is_set: diag(5096, 1 /* Error */, "Option_allowImportingTsExtensions_can_only_be_used_when_either_noEmit_or_emitDeclarationOnly_is_set_5096", "Option 'allowImportingTsExtensions' can only be used when either 'noEmit' or 'emitDeclarationOnly' is set."), + Option_0_can_only_be_used_when_module_is_set_to_preserve_commonjs_or_es2015_or_later: diag(5095, 1 /* Error */, "Option_0_can_only_be_used_when_module_is_set_to_preserve_commonjs_or_es2015_or_later_5095", "Option '{0}' can only be used when 'module' is set to 'preserve', 'commonjs', or 'es2015' or later."), + Option_allowImportingTsExtensions_can_only_be_used_when_one_of_noEmit_emitDeclarationOnly_or_rewriteRelativeImportExtensions_is_set: diag(5096, 1 /* Error */, "Option_allowImportingTsExtensions_can_only_be_used_when_one_of_noEmit_emitDeclarationOnly_or_rewrite_5096", "Option 'allowImportingTsExtensions' can only be used when one of 'noEmit', 'emitDeclarationOnly', or 'rewriteRelativeImportExtensions' is set."), An_import_path_can_only_end_with_a_0_extension_when_allowImportingTsExtensions_is_enabled: diag(5097, 1 /* Error */, "An_import_path_can_only_end_with_a_0_extension_when_allowImportingTsExtensions_is_enabled_5097", "An import path can only end with a '{0}' extension when 'allowImportingTsExtensions' is enabled."), Option_0_can_only_be_used_when_moduleResolution_is_set_to_node16_nodenext_or_bundler: diag(5098, 1 /* Error */, "Option_0_can_only_be_used_when_moduleResolution_is_set_to_node16_nodenext_or_bundler_5098", "Option '{0}' can only be used when 'moduleResolution' is set to 'node16', 'nodenext', or 'bundler'."), Option_0_is_deprecated_and_will_stop_functioning_in_TypeScript_1_Specify_compilerOption_ignoreDeprecations_Colon_2_to_silence_this_error: diag(5101, 1 /* Error */, "Option_0_is_deprecated_and_will_stop_functioning_in_TypeScript_1_Specify_compilerOption_ignoreDeprec_5101", `Option '{0}' is deprecated and will stop functioning in TypeScript {1}. Specify compilerOption '"ignoreDeprecations": "{2}"' to silence this error.`), @@ -10395,6 +10398,8 @@ var Diagnostics = { Option_0_1_has_been_removed_Please_remove_it_from_your_configuration: diag(5108, 1 /* Error */, "Option_0_1_has_been_removed_Please_remove_it_from_your_configuration_5108", "Option '{0}={1}' has been removed. Please remove it from your configuration."), Option_moduleResolution_must_be_set_to_0_or_left_unspecified_when_option_module_is_set_to_1: diag(5109, 1 /* Error */, "Option_moduleResolution_must_be_set_to_0_or_left_unspecified_when_option_module_is_set_to_1_5109", "Option 'moduleResolution' must be set to '{0}' (or left unspecified) when option 'module' is set to '{1}'."), Option_module_must_be_set_to_0_when_option_moduleResolution_is_set_to_1: diag(5110, 1 /* Error */, "Option_module_must_be_set_to_0_when_option_moduleResolution_is_set_to_1_5110", "Option 'module' must be set to '{0}' when option 'moduleResolution' is set to '{1}'."), + Visit_https_Colon_Slash_Slashaka_ms_Slashts6_for_migration_information: diag(5111, 3 /* Message */, "Visit_https_Colon_Slash_Slashaka_ms_Slashts6_for_migration_information_5111", "Visit https://aka.ms/ts6 for migration information."), + tsconfig_json_is_present_but_will_not_be_loaded_if_files_are_specified_on_commandline_Use_ignoreConfig_to_skip_this_error: diag(5112, 1 /* Error */, "tsconfig_json_is_present_but_will_not_be_loaded_if_files_are_specified_on_commandline_Use_ignoreConf_5112", "tsconfig.json is present but will not be loaded if files are specified on commandline. Use '--ignoreConfig' to skip this error."), Generates_a_sourcemap_for_each_corresponding_d_ts_file: diag(6e3, 3 /* Message */, "Generates_a_sourcemap_for_each_corresponding_d_ts_file_6000", "Generates a sourcemap for each corresponding '.d.ts' file."), Concatenate_and_emit_output_to_single_file: diag(6001, 3 /* Message */, "Concatenate_and_emit_output_to_single_file_6001", "Concatenate and emit output to single file."), Generates_corresponding_d_ts_file: diag(6002, 3 /* Message */, "Generates_corresponding_d_ts_file_6002", "Generates corresponding '.d.ts' file."), @@ -10917,17 +10922,17 @@ var Diagnostics = { Check_side_effect_imports: diag(6806, 3 /* Message */, "Check_side_effect_imports_6806", "Check side effect imports."), This_operation_can_be_simplified_This_shift_is_identical_to_0_1_2: diag(6807, 1 /* Error */, "This_operation_can_be_simplified_This_shift_is_identical_to_0_1_2_6807", "This operation can be simplified. This shift is identical to `{0} {1} {2}`."), Enable_lib_replacement: diag(6808, 3 /* Message */, "Enable_lib_replacement_6808", "Enable lib replacement."), + Ensure_types_are_ordered_stably_and_deterministically_across_compilations: diag(6809, 3 /* Message */, "Ensure_types_are_ordered_stably_and_deterministically_across_compilations_6809", "Ensure types are ordered stably and deterministically across compilations."), one_of_Colon: diag(6900, 3 /* Message */, "one_of_Colon_6900", "one of:"), one_or_more_Colon: diag(6901, 3 /* Message */, "one_or_more_Colon_6901", "one or more:"), type_Colon: diag(6902, 3 /* Message */, "type_Colon_6902", "type:"), default_Colon: diag(6903, 3 /* Message */, "default_Colon_6903", "default:"), - module_system_or_esModuleInterop: diag(6904, 3 /* Message */, "module_system_or_esModuleInterop_6904", 'module === "system" or esModuleInterop'), - false_unless_strict_is_set: diag(6905, 3 /* Message */, "false_unless_strict_is_set_6905", "`false`, unless `strict` is set"), + true_unless_strict_is_false: diag(6905, 3 /* Message */, "true_unless_strict_is_false_6905", "`true`, unless `strict` is `false`"), false_unless_composite_is_set: diag(6906, 3 /* Message */, "false_unless_composite_is_set_6906", "`false`, unless `composite` is set"), node_modules_bower_components_jspm_packages_plus_the_value_of_outDir_if_one_is_specified: diag(6907, 3 /* Message */, "node_modules_bower_components_jspm_packages_plus_the_value_of_outDir_if_one_is_specified_6907", '`["node_modules", "bower_components", "jspm_packages"]`, plus the value of `outDir` if one is specified.'), if_files_is_specified_otherwise_Asterisk_Asterisk_Slash_Asterisk: diag(6908, 3 /* Message */, "if_files_is_specified_otherwise_Asterisk_Asterisk_Slash_Asterisk_6908", '`[]` if `files` is specified, otherwise `["**/*"]`'), true_if_composite_false_otherwise: diag(6909, 3 /* Message */, "true_if_composite_false_otherwise_6909", "`true` if `composite`, `false` otherwise"), - module_AMD_or_UMD_or_System_or_ES6_then_Classic_Otherwise_Node: diag(69010, 3 /* Message */, "module_AMD_or_UMD_or_System_or_ES6_then_Classic_Otherwise_Node_69010", "module === `AMD` or `UMD` or `System` or `ES6`, then `Classic`, Otherwise `Node`"), + nodenext_if_module_is_nodenext_node16_if_module_is_node16_or_node18_otherwise_bundler: diag(69010, 3 /* Message */, "nodenext_if_module_is_nodenext_node16_if_module_is_node16_or_node18_otherwise_bundler_69010", "`nodenext` if `module` is `nodenext`; `node16` if `module` is `node16` or `node18`; otherwise, `bundler`."), Computed_from_the_list_of_input_files: diag(6911, 3 /* Message */, "Computed_from_the_list_of_input_files_6911", "Computed from the list of input files"), Platform_specific: diag(6912, 3 /* Message */, "Platform_specific_6912", "Platform specific"), You_can_learn_about_all_of_the_compiler_options_at_0: diag(6913, 3 /* Message */, "You_can_learn_about_all_of_the_compiler_options_at_0_6913", "You can learn about all of the compiler options at {0}"), @@ -10949,6 +10954,7 @@ var Diagnostics = { Compiles_the_current_project_with_additional_settings: diag(6929, 3 /* Message */, "Compiles_the_current_project_with_additional_settings_6929", "Compiles the current project, with additional settings."), true_for_ES2022_and_above_including_ESNext: diag(6930, 3 /* Message */, "true_for_ES2022_and_above_including_ESNext_6930", "`true` for ES2022 and above, including ESNext."), List_of_file_name_suffixes_to_search_when_resolving_a_module: diag(6931, 1 /* Error */, "List_of_file_name_suffixes_to_search_when_resolving_a_module_6931", "List of file name suffixes to search when resolving a module."), + false_unless_checkJs_is_set: diag(6932, 3 /* Message */, "false_unless_checkJs_is_set_6932", "`false`, unless `checkJs` is set"), Variable_0_implicitly_has_an_1_type: diag(7005, 1 /* Error */, "Variable_0_implicitly_has_an_1_type_7005", "Variable '{0}' implicitly has an '{1}' type."), Parameter_0_implicitly_has_an_1_type: diag(7006, 1 /* Error */, "Parameter_0_implicitly_has_an_1_type_7006", "Parameter '{0}' implicitly has an '{1}' type."), Member_0_implicitly_has_an_1_type: diag(7008, 1 /* Error */, "Member_0_implicitly_has_an_1_type_7008", "Member '{0}' implicitly has an '{1}' type."), @@ -14665,6 +14671,7 @@ function sortAndDeduplicateDiagnostics(diagnostics) { } var targetToLibMap = /* @__PURE__ */ new Map([ [99 /* ESNext */, "lib.esnext.full.d.ts"], + [12 /* ES2025 */, "lib.es2025.full.d.ts"], [11 /* ES2024 */, "lib.es2024.full.d.ts"], [10 /* ES2023 */, "lib.es2023.full.d.ts"], [9 /* ES2022 */, "lib.es2022.full.d.ts"], @@ -14681,6 +14688,7 @@ function getDefaultLibFileName(options) { const target = getEmitScriptTarget(options); switch (target) { case 99 /* ESNext */: + case 12 /* ES2025 */: case 11 /* ES2024 */: case 10 /* ES2023 */: case 9 /* ES2022 */: @@ -16659,13 +16667,6 @@ function getNonDecoratorTokenPosOfNode(node, sourceFile) { } return skipTrivia((sourceFile || getSourceFileOfNode(node)).text, lastDecorator.end); } -function getNonModifierTokenPosOfNode(node, sourceFile) { - const lastModifier = !nodeIsMissing(node) && canHaveModifiers(node) && node.modifiers ? last(node.modifiers) : void 0; - if (!lastModifier) { - return getTokenPosOfNode(node, sourceFile); - } - return skipTrivia((sourceFile || getSourceFileOfNode(node)).text, lastModifier.end); -} function getSourceTextOfNodeFromSourceFile(sourceFile, node, includeTrivia = false) { return getTextOfNodeFromSourceText(sourceFile.text, node, includeTrivia); } @@ -16816,6 +16817,11 @@ var getScriptTargetFeatures = /* @__PURE__ */ memoize( "unicodeSets" ] })), + RegExpConstructor: new Map(Object.entries({ + es2025: [ + "escape" + ] + })), Reflect: new Map(Object.entries({ es2015: [ "apply", @@ -16895,7 +16901,7 @@ var getScriptTargetFeatures = /* @__PURE__ */ memoize( "fround", "cbrt" ], - esnext: [ + es2025: [ "f16round" ] })), @@ -16904,6 +16910,10 @@ var getScriptTargetFeatures = /* @__PURE__ */ memoize( "entries", "keys", "values" + ], + esnext: [ + "getOrInsert", + "getOrInsertComputed" ] })), MapConstructor: new Map(Object.entries({ @@ -16917,7 +16927,7 @@ var getScriptTargetFeatures = /* @__PURE__ */ memoize( "keys", "values" ], - esnext: [ + es2025: [ "union", "intersection", "difference", @@ -16942,6 +16952,9 @@ var getScriptTargetFeatures = /* @__PURE__ */ memoize( ], es2024: [ "withResolvers" + ], + es2025: [ + "try" ] })), Symbol: new Map(Object.entries({ @@ -16958,6 +16971,10 @@ var getScriptTargetFeatures = /* @__PURE__ */ memoize( "entries", "keys", "values" + ], + esnext: [ + "getOrInsert", + "getOrInsertComputed" ] })), WeakSet: new Map(Object.entries({ @@ -17043,6 +17060,21 @@ var getScriptTargetFeatures = /* @__PURE__ */ memoize( Intl: new Map(Object.entries({ es2018: [ "PluralRules" + ], + es2020: [ + "RelativeTimeFormat", + "Locale", + "DisplayNames" + ], + es2021: [ + "ListFormat", + "DateTimeFormat" + ], + es2022: [ + "Segmenter" + ], + es2025: [ + "DurationFormat" ] })), NumberFormat: new Map(Object.entries({ @@ -17067,7 +17099,7 @@ var getScriptTargetFeatures = /* @__PURE__ */ memoize( "getBigInt64", "getBigUint64" ], - esnext: [ + es2025: [ "setFloat16", "getFloat16" ] @@ -17106,6 +17138,12 @@ var getScriptTargetFeatures = /* @__PURE__ */ memoize( "toSorted", "toSpliced", "with" + ], + esnext: [ + "toBase64", + "setFromBase64", + "toHex", + "setFromHex" ] })), Uint8ClampedArray: new Map(Object.entries({ @@ -17174,7 +17212,7 @@ var getScriptTargetFeatures = /* @__PURE__ */ memoize( ] })), Float16Array: new Map(Object.entries({ - esnext: emptyArray + es2025: emptyArray })), Float32Array: new Map(Object.entries({ es2022: [ @@ -17234,6 +17272,28 @@ var getScriptTargetFeatures = /* @__PURE__ */ memoize( es2022: [ "cause" ] + })), + ErrorConstructor: new Map(Object.entries({ + esnext: [ + "isError" + ] + })), + Uint8ArrayConstructor: new Map(Object.entries({ + esnext: [ + "fromBase64", + "fromHex" + ] + })), + Date: new Map(Object.entries({ + esnext: [ + "toTemporalInstant" + ] + })), + DisposableStack: new Map(Object.entries({ + esnext: emptyArray + })), + AsyncDisposableStack: new Map(Object.entries({ + esnext: emptyArray })) })) ); @@ -17373,7 +17433,7 @@ function isEffectiveStrictModeSourceFile(node, compilerOptions) { if (node.isDeclarationFile) { return false; } - if (getStrictOptionValue(compilerOptions, "alwaysStrict")) { + if (getAlwaysStrict(compilerOptions)) { return true; } if (startsWithUseStrict(node.statements)) { @@ -17952,12 +18012,15 @@ function forEachYieldExpression(body, visitor) { function traverse(node) { switch (node.kind) { case 230 /* YieldExpression */: - visitor(node); + const value = visitor(node); + if (value) { + return value; + } const operand = node.expression; - if (operand) { - traverse(operand); + if (!operand) { + return; } - return; + return traverse(operand); case 267 /* EnumDeclaration */: case 265 /* InterfaceDeclaration */: case 268 /* ModuleDeclaration */: @@ -17966,11 +18029,10 @@ function forEachYieldExpression(body, visitor) { default: if (isFunctionLike(node)) { if (node.name && node.name.kind === 168 /* ComputedPropertyName */) { - traverse(node.name.expression); - return; + return traverse(node.name.expression); } } else if (!isPartOfTypeNode(node)) { - forEachChild(node, traverse); + return forEachChild(node, traverse); } } } @@ -18580,6 +18642,22 @@ function isVariableDeclarationInitializedToBareOrAccessedRequire(node) { function isBindingElementOfBareOrAccessedRequire(node) { return isBindingElement(node) && isVariableDeclarationInitializedToBareOrAccessedRequire(node.parent.parent); } +function getModuleSpecifierOfBareOrAccessedRequire(node) { + if (isVariableDeclarationInitializedToRequire(node)) { + return node.initializer.arguments[0]; + } + if (isVariableDeclarationInitializedToBareOrAccessedRequire(node)) { + const leftmost = getLeftmostAccessExpression(node.initializer); + if (isRequireCall( + leftmost, + /*requireStringLiteralLikeArgument*/ + true + )) { + return leftmost.arguments[0]; + } + } + return void 0; +} function isVariableDeclarationInitializedWithRequireHelper(node, allowAccessedRequire) { return isVariableDeclaration(node) && !!node.initializer && isRequireCall( allowAccessedRequire ? getLeftmostAccessExpression(node.initializer) : node.initializer, @@ -20379,7 +20457,7 @@ function sourceFileMayBeEmitted(sourceFile, host, forceDtsEmit) { if (host.getRedirectFromSourceFile(sourceFile.fileName)) return false; if (options.outFile) return true; if (!options.outDir) return false; - if (options.rootDir || options.composite && options.configFilePath) { + if (options.rootDir || options.configFilePath) { const commonDir = getNormalizedAbsolutePath(getCommonSourceDirectory(options, () => [], host.getCurrentDirectory(), host.getCanonicalFileName), host.getCurrentDirectory()); const outputPath = getSourceFilePathInNewDirWorker(sourceFile.fileName, options.outDir, host.getCurrentDirectory(), commonDir, host.getCanonicalFileName); if (comparePaths(sourceFile.fileName, outputPath, host.getCurrentDirectory(), !host.useCaseSensitiveFileNames()) === 0 /* EqualTo */) return false; @@ -21388,7 +21466,7 @@ function getClassLikeDeclarationOfSymbol(symbol) { return (_a = symbol.declarations) == null ? void 0 : _a.find(isClassLike); } function getObjectFlags(type) { - return type.flags & 3899393 /* ObjectFlagsType */ ? type.objectFlags : 0; + return type.flags & 403963917 /* ObjectFlagsType */ ? type.objectFlags : 0; } function isUMDExportSymbol(symbol) { return !!symbol && !!symbol.declarations && !!symbol.declarations[0] && isNamespaceExportDeclaration(symbol.declarations[0]); @@ -21892,6 +21970,9 @@ function importSyntaxAffectsModuleResolution(options) { const moduleResolution = getEmitModuleResolutionKind(options); return 3 /* Node16 */ <= moduleResolution && moduleResolution <= 99 /* NodeNext */ || getResolvePackageJsonExports(options) || getResolvePackageJsonImports(options); } +function usesWildcardTypes(options) { + return some(options.types, (t) => t === "*"); +} function createComputedCompilerOptions(options) { return options; } @@ -21903,44 +21984,54 @@ var _computedOptions = createComputedCompilerOptions({ } }, target: { - dependencies: ["module"], + dependencies: [], computeValue: (compilerOptions) => { const target = compilerOptions.target === 0 /* ES3 */ ? void 0 : compilerOptions.target; - return target ?? (compilerOptions.module === 100 /* Node16 */ && 9 /* ES2022 */ || compilerOptions.module === 101 /* Node18 */ && 9 /* ES2022 */ || compilerOptions.module === 102 /* Node20 */ && 10 /* ES2023 */ || compilerOptions.module === 199 /* NodeNext */ && 99 /* ESNext */ || 1 /* ES5 */); + return target ?? 12 /* LatestStandard */; } }, module: { dependencies: ["target"], computeValue: (compilerOptions) => { - return typeof compilerOptions.module === "number" ? compilerOptions.module : _computedOptions.target.computeValue(compilerOptions) >= 2 /* ES2015 */ ? 5 /* ES2015 */ : 1 /* CommonJS */; + if (typeof compilerOptions.module === "number") { + return compilerOptions.module; + } + const target = _computedOptions.target.computeValue(compilerOptions); + if (target === 99 /* ESNext */) { + return 99 /* ESNext */; + } + if (target >= 9 /* ES2022 */) { + return 7 /* ES2022 */; + } + if (target >= 7 /* ES2020 */) { + return 6 /* ES2020 */; + } + if (target >= 2 /* ES2015 */) { + return 5 /* ES2015 */; + } + return 1 /* CommonJS */; } }, moduleResolution: { dependencies: ["module", "target"], computeValue: (compilerOptions) => { - let moduleResolution = compilerOptions.moduleResolution; - if (moduleResolution === void 0) { - switch (_computedOptions.module.computeValue(compilerOptions)) { - case 1 /* CommonJS */: - moduleResolution = 2 /* Node10 */; - break; - case 100 /* Node16 */: - case 101 /* Node18 */: - case 102 /* Node20 */: - moduleResolution = 3 /* Node16 */; - break; - case 199 /* NodeNext */: - moduleResolution = 99 /* NodeNext */; - break; - case 200 /* Preserve */: - moduleResolution = 100 /* Bundler */; - break; - default: - moduleResolution = 1 /* Classic */; - break; - } + if (compilerOptions.moduleResolution !== void 0) { + return compilerOptions.moduleResolution; + } + const moduleKind = _computedOptions.module.computeValue(compilerOptions); + switch (moduleKind) { + case 0 /* None */: + case 2 /* AMD */: + case 3 /* UMD */: + case 4 /* System */: + return 1 /* Classic */; + case 199 /* NodeNext */: + return 99 /* NodeNext */; + } + if (100 /* Node16 */ <= moduleKind && moduleKind < 199 /* NodeNext */) { + return 3 /* Node16 */; } - return moduleResolution; + return 100 /* Bundler */; } }, moduleDetection: { @@ -21960,33 +22051,25 @@ var _computedOptions = createComputedCompilerOptions({ } }, esModuleInterop: { - dependencies: ["module", "target"], + dependencies: [], computeValue: (compilerOptions) => { if (compilerOptions.esModuleInterop !== void 0) { return compilerOptions.esModuleInterop; } - switch (_computedOptions.module.computeValue(compilerOptions)) { - case 100 /* Node16 */: - case 101 /* Node18 */: - case 102 /* Node20 */: - case 199 /* NodeNext */: - case 200 /* Preserve */: - return true; - } - return false; + return true; } }, allowSyntheticDefaultImports: { - dependencies: ["module", "target", "moduleResolution"], + dependencies: [], computeValue: (compilerOptions) => { if (compilerOptions.allowSyntheticDefaultImports !== void 0) { return compilerOptions.allowSyntheticDefaultImports; } - return _computedOptions.esModuleInterop.computeValue(compilerOptions) || _computedOptions.module.computeValue(compilerOptions) === 4 /* System */ || _computedOptions.moduleResolution.computeValue(compilerOptions) === 100 /* Bundler */; + return true; } }, resolvePackageJsonExports: { - dependencies: ["moduleResolution"], + dependencies: ["moduleResolution", "module", "target"], computeValue: (compilerOptions) => { const moduleResolution = _computedOptions.moduleResolution.computeValue(compilerOptions); if (!moduleResolutionSupportsPackageJsonExportsAndImports(moduleResolution)) { @@ -22005,7 +22088,7 @@ var _computedOptions = createComputedCompilerOptions({ } }, resolvePackageJsonImports: { - dependencies: ["moduleResolution", "resolvePackageJsonExports"], + dependencies: ["moduleResolution", "resolvePackageJsonExports", "module", "target"], computeValue: (compilerOptions) => { const moduleResolution = _computedOptions.moduleResolution.computeValue(compilerOptions); if (!moduleResolutionSupportsPackageJsonExportsAndImports(moduleResolution)) { @@ -22118,10 +22201,11 @@ var _computedOptions = createComputedCompilerOptions({ return getStrictOptionValue(compilerOptions, "strictBuiltinIteratorReturn"); } }, + // Previously a strict-mode flag, but no longer. alwaysStrict: { - dependencies: ["strict"], + dependencies: [], computeValue: (compilerOptions) => { - return getStrictOptionValue(compilerOptions, "alwaysStrict"); + return compilerOptions.alwaysStrict !== false; } }, useUnknownInCatchVariables: { @@ -22149,6 +22233,7 @@ var isIncrementalCompilation = _computedOptions.incremental.computeValue; var getAreDeclarationMapsEnabled = _computedOptions.declarationMap.computeValue; var getAllowJSCompilerOption = _computedOptions.allowJs.computeValue; var getUseDefineForClassFields = _computedOptions.useDefineForClassFields.computeValue; +var getAlwaysStrict = _computedOptions.alwaysStrict.computeValue; function emitModuleKindIsNonNodeESM(moduleKind) { return moduleKind >= 5 /* ES2015 */ && moduleKind <= 99 /* ESNext */; } @@ -22161,12 +22246,6 @@ function hasJsonModuleEmitEnabled(options) { } return true; } -function unreachableCodeIsError(options) { - return options.allowUnreachableCode === false; -} -function unusedLabelIsError(options) { - return options.allowUnusedLabels === false; -} function moduleResolutionSupportsPackageJsonExportsAndImports(moduleResolution) { return moduleResolution >= 3 /* Node16 */ && moduleResolution <= 99 /* NodeNext */ || moduleResolution === 100 /* Bundler */; } @@ -22174,7 +22253,7 @@ function moduleSupportsImportAttributes(moduleKind) { return 101 /* Node18 */ <= moduleKind && moduleKind <= 199 /* NodeNext */ || moduleKind === 200 /* Preserve */ || moduleKind === 99 /* ESNext */; } function getStrictOptionValue(compilerOptions, flag) { - return compilerOptions[flag] === void 0 ? !!compilerOptions.strict : !!compilerOptions[flag]; + return compilerOptions[flag] === void 0 ? compilerOptions.strict !== false : !!compilerOptions[flag]; } function getNameOfScriptTarget(scriptTarget) { return forEachEntry(targetOptionDeclaration.type, (value, key) => value === scriptTarget ? key : void 0); @@ -22817,7 +22896,7 @@ function skipTypeCheckingIgnoringNoCheck(sourceFile, options, host) { ); } function skipTypeCheckingWorker(sourceFile, options, host, ignoreNoCheck) { - return options.skipLibCheck && sourceFile.isDeclarationFile || options.skipDefaultLibCheck && sourceFile.hasNoDefaultLib || !ignoreNoCheck && options.noCheck || host.isSourceOfProjectReferenceRedirect(sourceFile.fileName) || !canIncludeBindAndCheckDiagnostics(sourceFile, options); + return options.skipLibCheck && sourceFile.isDeclarationFile || options.skipDefaultLibCheck && host.isSourceFileDefaultLibrary(sourceFile) || !ignoreNoCheck && options.noCheck || host.isSourceOfProjectReferenceRedirect(sourceFile.fileName) || !canIncludeBindAndCheckDiagnostics(sourceFile, options); } function canIncludeBindAndCheckDiagnostics(sourceFile, options) { if (!!sourceFile.checkJsDirective && sourceFile.checkJsDirective.enabled === false) return false; @@ -23121,7 +23200,7 @@ function hasContextSensitiveParameters(node) { if (node.kind !== 220 /* ArrowFunction */) { const parameter = firstOrUndefined(node.parameters); if (!(parameter && parameterIsThisKeyword(parameter))) { - return true; + return !!(node.flags & 256 /* ContainsThis */); } } } @@ -23147,7 +23226,7 @@ function createPropertyNameNodeForIdentifierOrLiteral(name, target, singleQuote, return !isMethodNamedNew && isIdentifierText(name, target) ? factory.createIdentifier(name) : !stringNamed && !isMethodNamedNew && isNumericLiteralName(name) && +name >= 0 ? factory.createNumericLiteral(+name) : factory.createStringLiteral(name, !!singleQuote); } function isThisTypeParameter(type) { - return !!(type.flags & 262144 /* TypeParameter */ && type.isThisType); + return !!(type.flags & 524288 /* TypeParameter */ && type.isThisType); } function getNodeModulePathParts(fullPath) { let topLevelNodeModulesIndex = 0; @@ -23290,13 +23369,13 @@ function intrinsicTagNameToString(node) { return isIdentifier(node) ? idText(node) : getTextOfJsxNamespacedName(node); } function isTypeUsableAsPropertyName(type) { - return !!(type.flags & 8576 /* StringOrNumberLiteralOrUnique */); + return !!(type.flags & 19456 /* StringOrNumberLiteralOrUnique */); } function getPropertyNameFromType(type) { - if (type.flags & 8192 /* UniqueESSymbol */) { + if (type.flags & 16384 /* UniqueESSymbol */) { return type.escapedName; } - if (type.flags & (128 /* StringLiteral */ | 256 /* NumberLiteral */)) { + if (type.flags & (1024 /* StringLiteral */ | 2048 /* NumberLiteral */)) { return escapeLeadingUnderscores("" + type.value); } return Debug.fail(); @@ -24026,7 +24105,6 @@ var unprefixedNodeCoreModulesList = [ "stream/web", "string_decoder", "sys", - "test/mock_loader", "timers", "timers/promises", "tls", @@ -24043,6 +24121,7 @@ var unprefixedNodeCoreModulesList = [ ]; var unprefixedNodeCoreModules = new Set(unprefixedNodeCoreModulesList); var exclusivelyPrefixedNodeCoreModules = /* @__PURE__ */ new Set([ + "node:quic", "node:sea", "node:sqlite", "node:test", @@ -24230,6 +24309,21 @@ function addEmitFlagsRecursively(node, flag, getChild) { function getFirstChild(node) { return forEachChild(node, (child) => child); } +function canHaveStatements(node) { + return isBlock(node) || isModuleBlock(node) || isSourceFile(node) || isCaseClause(node) || isDefaultClause(node); +} +function isPotentiallyExecutableNode(node) { + if (244 /* FirstStatement */ <= node.kind && node.kind <= 260 /* LastStatement */) { + if (isVariableStatement(node)) { + if (getCombinedNodeFlags(node.declarationList) & 7 /* BlockScoped */) { + return true; + } + return some(node.declarationList.declarations, (d) => d.initializer !== void 0); + } + return true; + } + return isClassDeclaration(node) || isEnumDeclaration(node) || isModuleDeclaration(node); +} // src/compiler/factory/baseNodeFactory.ts function createBaseNodeFactory() { @@ -24351,10 +24445,22 @@ function createParenthesizerRules(factory2) { } return parenthesizerRule; } + function mixingBinaryOperatorsRequiresParentheses(a, b) { + if (a === 61 /* QuestionQuestionToken */) { + return b === 56 /* AmpersandAmpersandToken */ || b === 57 /* BarBarToken */; + } + if (b === 61 /* QuestionQuestionToken */) { + return a === 56 /* AmpersandAmpersandToken */ || a === 57 /* BarBarToken */; + } + return false; + } function binaryOperandNeedsParentheses(binaryOperator, operand, isLeftSideOfBinary, leftOperand) { + const emittedOperand = skipPartiallyEmittedExpressions(operand); + if (isBinaryExpression(emittedOperand) && mixingBinaryOperatorsRequiresParentheses(binaryOperator, emittedOperand.operatorToken.kind)) { + return true; + } const binaryOperatorPrecedence = getOperatorPrecedence(227 /* BinaryExpression */, binaryOperator); const binaryOperatorAssociativity = getOperatorAssociativity(227 /* BinaryExpression */, binaryOperator); - const emittedOperand = skipPartiallyEmittedExpressions(operand); if (!isLeftSideOfBinary && operand.kind === 220 /* ArrowFunction */ && binaryOperatorPrecedence > 3 /* Assignment */) { return true; } @@ -28236,7 +28342,7 @@ function createNodeFactory(flags, baseFactory2) { node.path = ""; node.resolvedPath = ""; node.originalFileName = ""; - node.languageVersion = 1 /* ES5 */; + node.languageVersion = 12 /* LatestStandard */; node.languageVariant = 0; node.scriptKind = 0; node.isDeclarationFile = false; @@ -28337,8 +28443,17 @@ function createNodeFactory(flags, baseFactory2) { node.transformFlags = propagateChildrenFlags(node.statements) | propagateChildFlags(node.endOfFileToken); return node; } - function updateSourceFile2(node, statements, isDeclarationFile = node.isDeclarationFile, referencedFiles = node.referencedFiles, typeReferenceDirectives = node.typeReferenceDirectives, hasNoDefaultLib = node.hasNoDefaultLib, libReferenceDirectives = node.libReferenceDirectives) { - return node.statements !== statements || node.isDeclarationFile !== isDeclarationFile || node.referencedFiles !== referencedFiles || node.typeReferenceDirectives !== typeReferenceDirectives || node.hasNoDefaultLib !== hasNoDefaultLib || node.libReferenceDirectives !== libReferenceDirectives ? update(cloneSourceFileWithChanges(node, statements, isDeclarationFile, referencedFiles, typeReferenceDirectives, hasNoDefaultLib, libReferenceDirectives), node) : node; + function updateSourceFile2(node, statements, isDeclarationFile = node.isDeclarationFile, referencedFiles = node.referencedFiles, typeReferenceDirectives = node.typeReferenceDirectives, _hasNoDefaultLib = false, libReferenceDirectives = node.libReferenceDirectives) { + return node.statements !== statements || node.isDeclarationFile !== isDeclarationFile || node.referencedFiles !== referencedFiles || node.typeReferenceDirectives !== typeReferenceDirectives || node.libReferenceDirectives !== libReferenceDirectives ? update(cloneSourceFileWithChanges( + node, + statements, + isDeclarationFile, + referencedFiles, + typeReferenceDirectives, + /*hasNoDefaultLib*/ + false, + libReferenceDirectives + ), node) : node; } function createBundle(sourceFiles) { const node = createBaseNode(309 /* Bundle */); @@ -28346,7 +28461,6 @@ function createNodeFactory(flags, baseFactory2) { node.syntheticFileReferences = void 0; node.syntheticTypeReferences = void 0; node.syntheticLibReferences = void 0; - node.hasNoDefaultLib = void 0; return node; } function updateBundle(node, sourceFiles) { @@ -37847,7 +37961,11 @@ var Parser; case 121 /* LetKeyword */: case 87 /* ConstKeyword */: case 160 /* UsingKeyword */: + return parseVariableStatement(pos, hasJSDoc, modifiersIn); case 135 /* AwaitKeyword */: + if (!isAwaitUsingDeclaration()) { + break; + } return parseVariableStatement(pos, hasJSDoc, modifiersIn); case 100 /* FunctionKeyword */: return parseFunctionDeclaration(pos, hasJSDoc, modifiersIn); @@ -37876,20 +37994,19 @@ var Parser; default: return parseExportDeclaration(pos, hasJSDoc, modifiersIn); } - default: - if (modifiersIn) { - const missing = createMissingNode( - 283 /* MissingDeclaration */, - /*reportAtCurrentPosition*/ - true, - Diagnostics.Declaration_expected - ); - setTextRangePos(missing, pos); - missing.modifiers = modifiersIn; - return missing; - } - return void 0; } + if (modifiersIn) { + const missing = createMissingNode( + 283 /* MissingDeclaration */, + /*reportAtCurrentPosition*/ + true, + Diagnostics.Declaration_expected + ); + setTextRangePos(missing, pos); + missing.modifiers = modifiersIn; + return missing; + } + return void 0; } function nextTokenIsStringLiteral() { return nextToken() === 11 /* StringLiteral */; @@ -38008,7 +38125,9 @@ var Parser; flags |= 4 /* Using */; break; case 135 /* AwaitKeyword */: - Debug.assert(isAwaitUsingDeclaration()); + if (!isAwaitUsingDeclaration()) { + break; + } flags |= 6 /* AwaitUsing */; nextToken(); break; @@ -38628,7 +38747,7 @@ var Parser; } function tryParseImportAttributes() { const currentToken2 = token(); - if ((currentToken2 === 118 /* WithKeyword */ || currentToken2 === 132 /* AssertKeyword */) && !scanner2.hasPrecedingLineBreak()) { + if (currentToken2 === 118 /* WithKeyword */ || currentToken2 === 132 /* AssertKeyword */ && !scanner2.hasPrecedingLineBreak()) { return parseImportAttributes(currentToken2); } } @@ -40402,7 +40521,6 @@ function processPragmasIntoFields(context, reportDiagnostic) { context.typeReferenceDirectives = []; context.libReferenceDirectives = []; context.amdDependencies = []; - context.hasNoDefaultLib = false; context.pragmas.forEach((entryOrList, key) => { switch (key) { case "reference": { @@ -40413,7 +40531,6 @@ function processPragmasIntoFields(context, reportDiagnostic) { const { types, lib, path, ["resolution-mode"]: res, preserve: _preserve } = arg.arguments; const preserve = _preserve === "true" ? true : void 0; if (arg.arguments["no-default-lib"] === "true") { - context.hasNoDefaultLib = true; } else if (types) { const parsed = parseResolutionMode(res, types.pos, types.end, reportDiagnostic); typeReferenceDirectives.push({ pos: types.pos, end: types.end, fileName: types.value, ...parsed ? { resolutionMode: parsed } : {}, ...preserve ? { preserve } : {} }); @@ -40604,6 +40721,7 @@ var libEntries = [ ["es2022", "lib.es2022.d.ts"], ["es2023", "lib.es2023.d.ts"], ["es2024", "lib.es2024.d.ts"], + ["es2025", "lib.es2025.d.ts"], ["esnext", "lib.esnext.d.ts"], // Host only ["dom", "lib.dom.d.ts"], @@ -40614,7 +40732,7 @@ var libEntries = [ ["webworker.iterable", "lib.webworker.iterable.d.ts"], ["webworker.asynciterable", "lib.webworker.asynciterable.d.ts"], ["scripthost", "lib.scripthost.d.ts"], - // ES2015 Or ESNext By-feature options + // ES2015 and later By-feature options ["es2015.core", "lib.es2015.core.d.ts"], ["es2015.collection", "lib.es2015.collection.d.ts"], ["es2015.generator", "lib.es2015.generator.d.ts"], @@ -40671,26 +40789,35 @@ var libEntries = [ ["es2024.regexp", "lib.es2024.regexp.d.ts"], ["es2024.sharedmemory", "lib.es2024.sharedmemory.d.ts"], ["es2024.string", "lib.es2024.string.d.ts"], - ["esnext.array", "lib.es2023.array.d.ts"], - ["esnext.collection", "lib.esnext.collection.d.ts"], - ["esnext.symbol", "lib.es2019.symbol.d.ts"], + ["es2025.collection", "lib.es2025.collection.d.ts"], + ["es2025.float16", "lib.es2025.float16.d.ts"], + ["es2025.intl", "lib.es2025.intl.d.ts"], + ["es2025.iterator", "lib.es2025.iterator.d.ts"], + ["es2025.promise", "lib.es2025.promise.d.ts"], + ["es2025.regexp", "lib.es2025.regexp.d.ts"], + // Fallback for backward compatibility ["esnext.asynciterable", "lib.es2018.asynciterable.d.ts"], - ["esnext.intl", "lib.esnext.intl.d.ts"], - ["esnext.disposable", "lib.esnext.disposable.d.ts"], + ["esnext.symbol", "lib.es2019.symbol.d.ts"], ["esnext.bigint", "lib.es2020.bigint.d.ts"], - ["esnext.string", "lib.es2022.string.d.ts"], - ["esnext.promise", "lib.es2024.promise.d.ts"], ["esnext.weakref", "lib.es2021.weakref.d.ts"], - ["esnext.decorators", "lib.esnext.decorators.d.ts"], ["esnext.object", "lib.es2024.object.d.ts"], - ["esnext.array", "lib.esnext.array.d.ts"], ["esnext.regexp", "lib.es2024.regexp.d.ts"], ["esnext.string", "lib.es2024.string.d.ts"], - ["esnext.iterator", "lib.esnext.iterator.d.ts"], - ["esnext.promise", "lib.esnext.promise.d.ts"], - ["esnext.float16", "lib.esnext.float16.d.ts"], + ["esnext.float16", "lib.es2025.float16.d.ts"], + ["esnext.iterator", "lib.es2025.iterator.d.ts"], + ["esnext.promise", "lib.es2025.promise.d.ts"], + // ESNext By-feature options + ["esnext.array", "lib.esnext.array.d.ts"], + ["esnext.collection", "lib.esnext.collection.d.ts"], + ["esnext.date", "lib.esnext.date.d.ts"], + ["esnext.decorators", "lib.esnext.decorators.d.ts"], + ["esnext.disposable", "lib.esnext.disposable.d.ts"], ["esnext.error", "lib.esnext.error.d.ts"], + ["esnext.intl", "lib.esnext.intl.d.ts"], ["esnext.sharedmemory", "lib.esnext.sharedmemory.d.ts"], + ["esnext.temporal", "lib.esnext.temporal.d.ts"], + ["esnext.typedarrays", "lib.esnext.typedarrays.d.ts"], + // Decorators ["decorators", "lib.decorators.d.ts"], ["decorators.legacy", "lib.decorators.legacy.d.ts"] ]; @@ -40989,18 +41116,19 @@ var targetOptionDeclaration = { es2022: 9 /* ES2022 */, es2023: 10 /* ES2023 */, es2024: 11 /* ES2024 */, + es2025: 12 /* ES2025 */, esnext: 99 /* ESNext */ })), affectsSourceFile: true, affectsModuleResolution: true, affectsEmit: true, affectsBuildInfo: true, - deprecatedKeys: /* @__PURE__ */ new Set(["es3"]), + deprecatedKeys: /* @__PURE__ */ new Set(["es3", "es5"]), paramType: Diagnostics.VERSION, showInSimplifiedHelpView: true, category: Diagnostics.Language_and_Environment, description: Diagnostics.Set_the_JavaScript_language_version_for_emitted_JavaScript_and_include_compatible_library_declarations, - defaultValueDescription: 1 /* ES5 */ + defaultValueDescription: 12 /* LatestStandard */ }; var moduleOptionDeclaration = { name: "module", @@ -41022,6 +41150,7 @@ var moduleOptionDeclaration = { nodenext: 199 /* NodeNext */, preserve: 200 /* Preserve */ })), + deprecatedKeys: /* @__PURE__ */ new Set(["none", "amd", "system", "umd"]), affectsSourceFile: true, affectsModuleResolution: true, affectsEmit: true, @@ -41086,6 +41215,15 @@ var commandOptionsWithoutBuild = [ description: Diagnostics.Print_names_of_files_that_are_part_of_the_compilation_and_then_stop_processing, defaultValueDescription: false }, + { + name: "ignoreConfig", + type: "boolean", + showInSimplifiedHelpView: true, + category: Diagnostics.Command_line_Options, + isCommandLineOnly: true, + description: Diagnostics.Ignore_the_tsconfig_found_and_build_with_commandline_options_and_files, + defaultValueDescription: false + }, // Basic targetOptionDeclaration, moduleOptionDeclaration, @@ -41111,7 +41249,7 @@ var commandOptionsWithoutBuild = [ showInSimplifiedHelpView: true, category: Diagnostics.JavaScript_Support, description: Diagnostics.Allow_JavaScript_files_to_be_a_part_of_your_program_Use_the_checkJs_option_to_get_errors_from_these_files, - defaultValueDescription: false + defaultValueDescription: Diagnostics.false_unless_checkJs_is_set }, { name: "checkJs", @@ -41286,7 +41424,7 @@ var commandOptionsWithoutBuild = [ affectsProgramStructure: true, category: Diagnostics.Language_and_Environment, description: Diagnostics.Enable_lib_replacement, - defaultValueDescription: true + defaultValueDescription: false }, // Strict Type Checks { @@ -41300,7 +41438,7 @@ var commandOptionsWithoutBuild = [ showInSimplifiedHelpView: true, category: Diagnostics.Type_Checking, description: Diagnostics.Enable_all_strict_type_checking_options, - defaultValueDescription: false + defaultValueDescription: true }, { name: "noImplicitAny", @@ -41310,7 +41448,7 @@ var commandOptionsWithoutBuild = [ strictFlag: true, category: Diagnostics.Type_Checking, description: Diagnostics.Enable_error_reporting_for_expressions_and_declarations_with_an_implied_any_type, - defaultValueDescription: Diagnostics.false_unless_strict_is_set + defaultValueDescription: Diagnostics.true_unless_strict_is_false }, { name: "strictNullChecks", @@ -41320,7 +41458,7 @@ var commandOptionsWithoutBuild = [ strictFlag: true, category: Diagnostics.Type_Checking, description: Diagnostics.When_type_checking_take_into_account_null_and_undefined, - defaultValueDescription: Diagnostics.false_unless_strict_is_set + defaultValueDescription: Diagnostics.true_unless_strict_is_false }, { name: "strictFunctionTypes", @@ -41330,7 +41468,7 @@ var commandOptionsWithoutBuild = [ strictFlag: true, category: Diagnostics.Type_Checking, description: Diagnostics.When_assigning_functions_check_to_ensure_parameters_and_the_return_values_are_subtype_compatible, - defaultValueDescription: Diagnostics.false_unless_strict_is_set + defaultValueDescription: Diagnostics.true_unless_strict_is_false }, { name: "strictBindCallApply", @@ -41340,7 +41478,7 @@ var commandOptionsWithoutBuild = [ strictFlag: true, category: Diagnostics.Type_Checking, description: Diagnostics.Check_that_the_arguments_for_bind_call_and_apply_methods_match_the_original_function, - defaultValueDescription: Diagnostics.false_unless_strict_is_set + defaultValueDescription: Diagnostics.true_unless_strict_is_false }, { name: "strictPropertyInitialization", @@ -41350,7 +41488,7 @@ var commandOptionsWithoutBuild = [ strictFlag: true, category: Diagnostics.Type_Checking, description: Diagnostics.Check_for_class_properties_that_are_declared_but_not_set_in_the_constructor, - defaultValueDescription: Diagnostics.false_unless_strict_is_set + defaultValueDescription: Diagnostics.true_unless_strict_is_false }, { name: "strictBuiltinIteratorReturn", @@ -41360,7 +41498,17 @@ var commandOptionsWithoutBuild = [ strictFlag: true, category: Diagnostics.Type_Checking, description: Diagnostics.Built_in_iterators_are_instantiated_with_a_TReturn_type_of_undefined_instead_of_any, - defaultValueDescription: Diagnostics.false_unless_strict_is_set + defaultValueDescription: Diagnostics.true_unless_strict_is_false + }, + { + name: "stableTypeOrdering", + type: "boolean", + affectsSemanticDiagnostics: true, + affectsBuildInfo: true, + showInHelp: false, + category: Diagnostics.Type_Checking, + description: Diagnostics.Ensure_types_are_ordered_stably_and_deterministically_across_compilations, + defaultValueDescription: false }, { name: "noImplicitThis", @@ -41370,7 +41518,7 @@ var commandOptionsWithoutBuild = [ strictFlag: true, category: Diagnostics.Type_Checking, description: Diagnostics.Enable_error_reporting_when_this_is_given_the_type_any, - defaultValueDescription: Diagnostics.false_unless_strict_is_set + defaultValueDescription: Diagnostics.true_unless_strict_is_false }, { name: "useUnknownInCatchVariables", @@ -41380,7 +41528,7 @@ var commandOptionsWithoutBuild = [ strictFlag: true, category: Diagnostics.Type_Checking, description: Diagnostics.Default_catch_clause_variables_as_unknown_instead_of_any, - defaultValueDescription: Diagnostics.false_unless_strict_is_set + defaultValueDescription: Diagnostics.true_unless_strict_is_false }, { name: "alwaysStrict", @@ -41388,10 +41536,9 @@ var commandOptionsWithoutBuild = [ affectsSourceFile: true, affectsEmit: true, affectsBuildInfo: true, - strictFlag: true, category: Diagnostics.Type_Checking, description: Diagnostics.Ensure_use_strict_is_always_emitted, - defaultValueDescription: Diagnostics.false_unless_strict_is_set + defaultValueDescription: true }, // Additional Checks { @@ -41480,13 +41627,13 @@ var commandOptionsWithoutBuild = [ nodenext: 99 /* NodeNext */, bundler: 100 /* Bundler */ })), - deprecatedKeys: /* @__PURE__ */ new Set(["node"]), + deprecatedKeys: /* @__PURE__ */ new Set(["node", "node10", "classic"]), affectsSourceFile: true, affectsModuleResolution: true, paramType: Diagnostics.STRATEGY, category: Diagnostics.Modules, description: Diagnostics.Specify_how_TypeScript_looks_up_a_file_from_a_given_module_specifier, - defaultValueDescription: Diagnostics.module_AMD_or_UMD_or_System_or_ES6_then_Classic_Otherwise_Node + defaultValueDescription: Diagnostics.nodenext_if_module_is_nodenext_node16_if_module_is_node16_or_node18_otherwise_bundler }, { name: "baseUrl", @@ -41559,7 +41706,7 @@ var commandOptionsWithoutBuild = [ affectsBuildInfo: true, category: Diagnostics.Interop_Constraints, description: Diagnostics.Allow_import_x_from_y_when_a_module_doesn_t_have_a_default_export, - defaultValueDescription: Diagnostics.module_system_or_esModuleInterop + defaultValueDescription: true }, { name: "esModuleInterop", @@ -41570,7 +41717,7 @@ var commandOptionsWithoutBuild = [ showInSimplifiedHelpView: true, category: Diagnostics.Interop_Constraints, description: Diagnostics.Emit_additional_JavaScript_to_ease_support_for_importing_CommonJS_modules_This_enables_allowSyntheticDefaultImports_for_type_compatibility, - defaultValueDescription: false + defaultValueDescription: true }, { name: "preserveSymlinks", @@ -41653,7 +41800,7 @@ var commandOptionsWithoutBuild = [ affectsBuildInfo: true, category: Diagnostics.Modules, description: Diagnostics.Check_side_effect_imports, - defaultValueDescription: false + defaultValueDescription: true }, // Source Maps { @@ -44316,7 +44463,7 @@ function resolveTypeReferenceDirective(typeReferenceDirectiveName, containingFil const affectingLocations = []; let features = getNodeResolutionFeatures(options); if (resolutionMode !== void 0) { - features |= 30 /* AllFeatures */; + features |= 94 /* AllFeatures */; } const moduleResolution = getEmitModuleResolutionKind(options); if (resolutionMode === 99 /* ESNext */ && (3 /* Node16 */ <= moduleResolution && moduleResolution <= 99 /* NodeNext */)) { @@ -44471,10 +44618,10 @@ function getNodeResolutionFeatures(options) { features = 30 /* Node16Default */; break; case 99 /* NodeNext */: - features = 30 /* NodeNextDefault */; + features = 94 /* NodeNextDefault */; break; case 100 /* Bundler */: - features = 30 /* BundlerDefault */; + features = 94 /* BundlerDefault */; break; } if (options.resolvePackageJsonExports) { @@ -44523,10 +44670,10 @@ function resolvePackageNameToPackageJson(packageName, containingDirectory, optio }); } function getAutomaticTypeDirectiveNames(options, host) { - if (options.types) { - return options.types; + if (!usesWildcardTypes(options)) { + return options.types ?? []; } - const result = []; + const wildcardMatches = []; if (host.directoryExists && host.getDirectories) { const typeRoots = getEffectiveTypeRoots(options, host); if (typeRoots) { @@ -44539,7 +44686,7 @@ function getAutomaticTypeDirectiveNames(options, host) { if (!isNotNeededPackage) { const baseFileName = getBaseFileName(normalized); if (baseFileName.charCodeAt(0) !== 46 /* dot */) { - result.push(baseFileName); + wildcardMatches.push(baseFileName); } } } @@ -44547,7 +44694,7 @@ function getAutomaticTypeDirectiveNames(options, host) { } } } - return result; + return deduplicate(flatten(options.types.map((t) => t === "*" ? wildcardMatches : t)), equateValues); } function isPackageJsonInfo(entry) { return !!(entry == null ? void 0 : entry.contents); @@ -45074,10 +45221,11 @@ var NodeResolutionFeatures = /* @__PURE__ */ ((NodeResolutionFeatures2) => { NodeResolutionFeatures2[NodeResolutionFeatures2["SelfName"] = 4] = "SelfName"; NodeResolutionFeatures2[NodeResolutionFeatures2["Exports"] = 8] = "Exports"; NodeResolutionFeatures2[NodeResolutionFeatures2["ExportsPatternTrailers"] = 16] = "ExportsPatternTrailers"; - NodeResolutionFeatures2[NodeResolutionFeatures2["AllFeatures"] = 30] = "AllFeatures"; + NodeResolutionFeatures2[NodeResolutionFeatures2["ImportsPatternRoot"] = 64] = "ImportsPatternRoot"; + NodeResolutionFeatures2[NodeResolutionFeatures2["AllFeatures"] = 94] = "AllFeatures"; NodeResolutionFeatures2[NodeResolutionFeatures2["Node16Default"] = 30] = "Node16Default"; - NodeResolutionFeatures2[NodeResolutionFeatures2["NodeNextDefault"] = 30 /* AllFeatures */] = "NodeNextDefault"; - NodeResolutionFeatures2[NodeResolutionFeatures2["BundlerDefault"] = 30] = "BundlerDefault"; + NodeResolutionFeatures2[NodeResolutionFeatures2["NodeNextDefault"] = 94 /* AllFeatures */] = "NodeNextDefault"; + NodeResolutionFeatures2[NodeResolutionFeatures2["BundlerDefault"] = 94] = "BundlerDefault"; NodeResolutionFeatures2[NodeResolutionFeatures2["EsmMode"] = 32] = "EsmMode"; return NodeResolutionFeatures2; })(NodeResolutionFeatures || {}); @@ -45095,7 +45243,7 @@ function node16ModuleNameResolver(moduleName, containingFile, compilerOptions, h } function nodeNextModuleNameResolver(moduleName, containingFile, compilerOptions, host, cache, redirectedReference, resolutionMode) { return nodeNextModuleNameResolverWorker( - 30 /* NodeNextDefault */, + 94 /* NodeNextDefault */, moduleName, containingFile, compilerOptions, @@ -45174,11 +45322,11 @@ function nodeModuleNameResolver(moduleName, containingFile, compilerOptions, hos } else { extensions = getResolveJsonModule(compilerOptions) ? 1 /* TypeScript */ | 2 /* JavaScript */ | 4 /* Declaration */ | 8 /* Json */ : 1 /* TypeScript */ | 2 /* JavaScript */ | 4 /* Declaration */; } - return nodeModuleNameResolverWorker(conditions ? 30 /* AllFeatures */ : 0 /* None */, moduleName, getDirectoryPath(containingFile), compilerOptions, host, cache, extensions, !!isConfigLookup, redirectedReference, conditions); + return nodeModuleNameResolverWorker(conditions ? 94 /* AllFeatures */ : 0 /* None */, moduleName, getDirectoryPath(containingFile), compilerOptions, host, cache, extensions, !!isConfigLookup, redirectedReference, conditions); } function nodeNextJsonConfigResolver(moduleName, containingFile, host) { return nodeModuleNameResolverWorker( - 30 /* NodeNextDefault */, + 94 /* NodeNextDefault */, moduleName, getDirectoryPath(containingFile), { moduleResolution: 99 /* NodeNext */ }, @@ -45251,7 +45399,7 @@ function nodeModuleNameResolverWorker(features, moduleName, containingDirectory, const diagnosticState = { ...state, compilerOptions: diagnosticsCompilerOptions, - features: 30 /* BundlerDefault */, + features: 94 /* BundlerDefault */, conditions: getConditions(diagnosticsCompilerOptions), reportDiagnostic: noop }; @@ -45901,7 +46049,7 @@ function loadModuleFromExports(scope, extensions, subpath, state, cache, redirec } function loadModuleFromImports(extensions, moduleName, directory, state, cache, redirectedReference) { var _a, _b; - if (moduleName === "#" || startsWith(moduleName, "#/")) { + if (moduleName === "#" || startsWith(moduleName, "#/") && !(state.features & 64 /* ImportsPatternRoot */)) { if (state.traceEnabled) { trace(state.host, Diagnostics.Invalid_import_specifier_0_has_no_possible_resolutions, moduleName); } @@ -46121,7 +46269,9 @@ function getLoadModuleFromTargetExportOrImport(extensions, state, cache, redirec const subTarget = target[condition]; const result = loadModuleFromTargetExportOrImport(subTarget, subpath, pattern, key); if (result) { - traceIfEnabled(state, Diagnostics.Resolved_under_condition_0, condition); + if (result.value) { + traceIfEnabled(state, Diagnostics.Resolved_under_condition_0, condition); + } traceIfEnabled(state, Diagnostics.Exiting_conditional_exports); return result; } else { @@ -46154,10 +46304,7 @@ function getLoadModuleFromTargetExportOrImport(extensions, state, cache, redirec if (state.traceEnabled) { trace(state.host, Diagnostics.package_json_scope_0_explicitly_maps_specifier_1_to_null, scope.packageDirectory, moduleName); } - return toSearchResult( - /*value*/ - void 0 - ); + return { value: void 0 }; } if (state.traceEnabled) { trace(state.host, Diagnostics.package_json_scope_0_has_invalid_type_for_target_of_specifier_1, scope.packageDirectory, moduleName); @@ -46179,7 +46326,7 @@ function getLoadModuleFromTargetExportOrImport(extensions, state, cache, redirec if (!state.isConfigLookup && (state.compilerOptions.declarationDir || state.compilerOptions.outDir) && !finalPath.includes("/node_modules/") && (state.compilerOptions.configFile ? containsPath(scope.packageDirectory, toAbsolutePath(state.compilerOptions.configFile.fileName), !useCaseSensitiveFileNames(state)) : true)) { const getCanonicalFileName = hostGetCanonicalFileName({ useCaseSensitiveFileNames: () => useCaseSensitiveFileNames(state) }); const commonSourceDirGuesses = []; - if (state.compilerOptions.rootDir || state.compilerOptions.composite && state.compilerOptions.configFilePath) { + if (state.compilerOptions.rootDir || state.compilerOptions.configFilePath) { const commonDir = toAbsolutePath(getCommonSourceDirectory(state.compilerOptions, () => [], ((_b2 = (_a2 = state.host).getCurrentDirectory) == null ? void 0 : _b2.call(_a2)) || "", getCanonicalFileName)); commonSourceDirGuesses.push(commonDir); } else if (state.requestContainingDirectory) { @@ -46786,6 +46933,7 @@ var ContainerFlags = /* @__PURE__ */ ((ContainerFlags2) => { ContainerFlags2[ContainerFlags2["HasLocals"] = 32] = "HasLocals"; ContainerFlags2[ContainerFlags2["IsInterface"] = 64] = "IsInterface"; ContainerFlags2[ContainerFlags2["IsObjectLiteralOrClassExpressionMethodOrAccessor"] = 128] = "IsObjectLiteralOrClassExpressionMethodOrAccessor"; + ContainerFlags2[ContainerFlags2["PropagatesThisKeyword"] = 256] = "PropagatesThisKeyword"; return ContainerFlags2; })(ContainerFlags || {}); function createFlowNode(flags, node, antecedent) { @@ -46835,13 +46983,6 @@ function createBinder() { /*antecedent*/ void 0 ); - var reportedUnreachableFlow = createFlowNode( - 1 /* Unreachable */, - /*node*/ - void 0, - /*antecedent*/ - void 0 - ); var bindBinaryExpressionFlow = createBindBinaryExpressionFlow(); return bindSourceFile2; function createDiagnosticForNode2(node, message, ...args) { @@ -46857,7 +46998,6 @@ function createBinder() { symbolCount = 0; Symbol48 = objectAllocator.getSymbolConstructor(); Debug.attachFlowNodeDebugInfo(unreachableFlow); - Debug.attachFlowNodeDebugInfo(reportedUnreachableFlow); if (!file.locals) { (_a = tracing) == null ? void 0 : _a.push( tracing.Phase.Bind, @@ -46899,7 +47039,7 @@ function createBinder() { emitFlags = 0 /* None */; } function bindInStrictMode(file2, opts) { - if (getStrictOptionValue(opts, "alwaysStrict") && !file2.isDeclarationFile) { + if (getAlwaysStrict(opts) && !file2.isDeclarationFile) { return true; } else { return !!file2.externalModuleIndicator; @@ -47155,6 +47295,7 @@ function createBinder() { const saveExceptionTarget = currentExceptionTarget; const saveActiveLabelList = activeLabelList; const saveHasExplicitReturn = hasExplicitReturn; + const saveSeenThisKeyword = seenThisKeyword; const isImmediatelyInvoked = containerFlags & 16 /* IsFunctionExpression */ && !hasSyntacticModifier(node, 1024 /* Async */) && !node.asteriskToken && !!getImmediatelyInvokedFunctionExpression(node) || node.kind === 176 /* ClassStaticBlockDeclaration */; if (!isImmediatelyInvoked) { currentFlow = createFlowNode( @@ -47174,13 +47315,17 @@ function createBinder() { currentContinueTarget = void 0; activeLabelList = void 0; hasExplicitReturn = false; + seenThisKeyword = false; bindChildren(node); - node.flags &= ~5632 /* ReachabilityAndEmitFlags */; + node.flags &= ~(5632 /* ReachabilityAndEmitFlags */ | 256 /* ContainsThis */); if (!(currentFlow.flags & 1 /* Unreachable */) && containerFlags & 8 /* IsFunctionLike */ && nodeIsPresent(node.body)) { node.flags |= 512 /* HasImplicitReturn */; if (hasExplicitReturn) node.flags |= 1024 /* HasExplicitReturn */; node.endFlowNode = currentFlow; } + if (seenThisKeyword) { + node.flags |= 256 /* ContainsThis */; + } if (node.kind === 308 /* SourceFile */) { node.flags |= emitFlags; node.endFlowNode = currentFlow; @@ -47201,11 +47346,14 @@ function createBinder() { currentExceptionTarget = saveExceptionTarget; activeLabelList = saveActiveLabelList; hasExplicitReturn = saveHasExplicitReturn; + seenThisKeyword = containerFlags & 256 /* PropagatesThisKeyword */ ? saveSeenThisKeyword || seenThisKeyword : saveSeenThisKeyword; } else if (containerFlags & 64 /* IsInterface */) { + const saveSeenThisKeyword = seenThisKeyword; seenThisKeyword = false; bindChildren(node); Debug.assertNotNode(node, isIdentifier); node.flags = seenThisKeyword ? node.flags | 256 /* ContainsThis */ : node.flags & ~256 /* ContainsThis */; + seenThisKeyword = saveSeenThisKeyword; } else { bindChildren(node); } @@ -47230,16 +47378,22 @@ function createBinder() { function bindChildren(node) { const saveInAssignmentPattern = inAssignmentPattern; inAssignmentPattern = false; - if (checkUnreachable(node)) { - if (canHaveFlowNode(node) && node.flowNode) { + if (isPotentiallyExecutableNode(node)) { + node.flags &= ~1073741824 /* Unreachable */; + } + if (currentFlow === unreachableFlow) { + if (canHaveFlowNode(node)) { node.flowNode = void 0; } + if (isPotentiallyExecutableNode(node)) { + node.flags |= 1073741824 /* Unreachable */; + } bindEachChild(node); bindJSDoc(node); inAssignmentPattern = saveInAssignmentPattern; return; } - if (node.kind >= 244 /* FirstStatement */ && node.kind <= 260 /* LastStatement */ && (!options.allowUnreachableCode || node.kind === 254 /* ReturnStatement */)) { + if (244 /* FirstStatement */ <= node.kind && node.kind <= 260 /* LastStatement */ && canHaveFlowNode(node)) { node.flowNode = currentFlow; } switch (node.kind) { @@ -47826,8 +47980,8 @@ function createBinder() { }; bind(node.label); bind(node.statement); - if (!activeLabelList.referenced && !options.allowUnusedLabels) { - errorOrSuggestionOnNode(unusedLabelIsError(options), node.label, Diagnostics.Unused_label); + if (!activeLabelList.referenced) { + node.label.flags |= 1073741824 /* Unreachable */; } activeLabelList = activeLabelList.next; addAntecedent(postStatementLabel, currentFlow); @@ -48604,20 +48758,6 @@ function createBinder() { const span = getSpanOfTokenAtPosition(file, node.pos); file.bindDiagnostics.push(createFileDiagnostic(file, span.start, span.length, message, ...args)); } - function errorOrSuggestionOnNode(isError, node, message) { - errorOrSuggestionOnRange(isError, node, node, message); - } - function errorOrSuggestionOnRange(isError, startNode2, endNode2, message) { - addErrorOrSuggestionDiagnostic(isError, { pos: getTokenPosOfNode(startNode2, file), end: endNode2.end }, message); - } - function addErrorOrSuggestionDiagnostic(isError, range, message) { - const diag2 = createFileDiagnostic(file, range.pos, range.end - range.pos, message); - if (isError) { - file.bindDiagnostics.push(diag2); - } else { - file.bindSuggestionDiagnostics = append(file.bindSuggestionDiagnostics, { ...diag2, category: 2 /* Suggestion */ }); - } - } function bind(node) { if (!node) { return; @@ -48693,6 +48833,9 @@ function createBinder() { } // falls through case 110 /* ThisKeyword */: + if (node.kind === 110 /* ThisKeyword */) { + seenThisKeyword = true; + } if (currentFlow && (isExpression(node) || parent2.kind === 305 /* ShorthandPropertyAssignment */)) { node.flowNode = currentFlow; } @@ -49504,61 +49647,6 @@ function createBinder() { declareSymbolAndAddToSymbolTable(node, 262144 /* TypeParameter */, 526824 /* TypeParameterExcludes */); } } - function shouldReportErrorOnModuleDeclaration(node) { - const instanceState = getModuleInstanceState(node); - return instanceState === 1 /* Instantiated */ || instanceState === 2 /* ConstEnumOnly */ && shouldPreserveConstEnums(options); - } - function checkUnreachable(node) { - if (!(currentFlow.flags & 1 /* Unreachable */)) { - return false; - } - if (currentFlow === unreachableFlow) { - const reportError = ( - // report error on all statements except empty ones - isStatementButNotDeclaration(node) && node.kind !== 243 /* EmptyStatement */ || // report error on class declarations - node.kind === 264 /* ClassDeclaration */ || // report errors on enums with preserved emit - isEnumDeclarationWithPreservedEmit(node, options) || // report error on instantiated modules - node.kind === 268 /* ModuleDeclaration */ && shouldReportErrorOnModuleDeclaration(node) - ); - if (reportError) { - currentFlow = reportedUnreachableFlow; - if (!options.allowUnreachableCode) { - const isError = unreachableCodeIsError(options) && !(node.flags & 33554432 /* Ambient */) && (!isVariableStatement(node) || !!(getCombinedNodeFlags(node.declarationList) & 7 /* BlockScoped */) || node.declarationList.declarations.some((d) => !!d.initializer)); - eachUnreachableRange(node, options, (start, end) => errorOrSuggestionOnRange(isError, start, end, Diagnostics.Unreachable_code_detected)); - } - } - } - return true; - } -} -function isEnumDeclarationWithPreservedEmit(node, options) { - return node.kind === 267 /* EnumDeclaration */ && (!isEnumConst(node) || shouldPreserveConstEnums(options)); -} -function eachUnreachableRange(node, options, cb) { - if (isStatement(node) && isExecutableStatement(node) && isBlock(node.parent)) { - const { statements } = node.parent; - const slice = sliceAfter(statements, node); - getRangesWhere(slice, isExecutableStatement, (start, afterEnd) => cb(slice[start], slice[afterEnd - 1])); - } else { - cb(node, node); - } - function isExecutableStatement(s) { - return !isFunctionDeclaration(s) && !isPurelyTypeDeclaration(s) && // `var x;` may declare a variable used above - !(isVariableStatement(s) && !(getCombinedNodeFlags(s) & 7 /* BlockScoped */) && s.declarationList.declarations.some((d) => !d.initializer)); - } - function isPurelyTypeDeclaration(s) { - switch (s.kind) { - case 265 /* InterfaceDeclaration */: - case 266 /* TypeAliasDeclaration */: - return true; - case 268 /* ModuleDeclaration */: - return getModuleInstanceState(s) !== 1 /* Instantiated */; - case 267 /* EnumDeclaration */: - return !isEnumDeclarationWithPreservedEmit(s, options); - default: - return false; - } - } } function isExportsOrModuleExportsOrAlias(sourceFile, node) { let i = 0; @@ -49615,6 +49703,8 @@ function getContainerFlags(node) { // falls through case 177 /* Constructor */: case 263 /* FunctionDeclaration */: + case 176 /* ClassStaticBlockDeclaration */: + return 1 /* IsContainer */ | 4 /* IsControlFlowContainer */ | 32 /* HasLocals */ | 8 /* IsFunctionLike */; case 174 /* MethodSignature */: case 180 /* CallSignature */: case 324 /* JSDocSignature */: @@ -49622,17 +49712,15 @@ function getContainerFlags(node) { case 185 /* FunctionType */: case 181 /* ConstructSignature */: case 186 /* ConstructorType */: - case 176 /* ClassStaticBlockDeclaration */: - return 1 /* IsContainer */ | 4 /* IsControlFlowContainer */ | 32 /* HasLocals */ | 8 /* IsFunctionLike */; + return 1 /* IsContainer */ | 4 /* IsControlFlowContainer */ | 32 /* HasLocals */ | 8 /* IsFunctionLike */ | 256 /* PropagatesThisKeyword */; case 352 /* JSDocImportTag */: - return 1 /* IsContainer */ | 4 /* IsControlFlowContainer */ | 32 /* HasLocals */; + return 1 /* IsContainer */ | 4 /* IsControlFlowContainer */ | 32 /* HasLocals */ | 256 /* PropagatesThisKeyword */; case 219 /* FunctionExpression */: - case 220 /* ArrowFunction */: return 1 /* IsContainer */ | 4 /* IsControlFlowContainer */ | 32 /* HasLocals */ | 8 /* IsFunctionLike */ | 16 /* IsFunctionExpression */; + case 220 /* ArrowFunction */: + return 1 /* IsContainer */ | 4 /* IsControlFlowContainer */ | 32 /* HasLocals */ | 8 /* IsFunctionLike */ | 16 /* IsFunctionExpression */ | 256 /* PropagatesThisKeyword */; case 269 /* ModuleBlock */: return 4 /* IsControlFlowContainer */; - case 173 /* PropertyDeclaration */: - return node.initializer ? 4 /* IsControlFlowContainer */ : 0; case 300 /* CatchClause */: case 249 /* ForStatement */: case 250 /* ForInStatement */: @@ -49694,7 +49782,7 @@ function createGetSymbolWalker(getRestTypeOfSignature, getTypePredicateOfSignatu visitedTypes[type.id] = type; const shouldBail = visitSymbol(type.symbol); if (shouldBail) return; - if (type.flags & 524288 /* Object */) { + if (type.flags & 1048576 /* Object */) { const objectType = type; const objectFlags = objectType.objectFlags; if (objectFlags & 4 /* Reference */) { @@ -49710,16 +49798,16 @@ function createGetSymbolWalker(getRestTypeOfSignature, getTypePredicateOfSignatu visitObjectType(objectType); } } - if (type.flags & 262144 /* TypeParameter */) { + if (type.flags & 524288 /* TypeParameter */) { visitTypeParameter(type); } - if (type.flags & 3145728 /* UnionOrIntersection */) { + if (type.flags & 402653184 /* UnionOrIntersection */) { visitUnionOrIntersectionType(type); } - if (type.flags & 4194304 /* Index */) { + if (type.flags & 2097152 /* Index */) { visitIndexType(type); } - if (type.flags & 8388608 /* IndexedAccess */) { + if (type.flags & 33554432 /* IndexedAccess */) { visitIndexedAccessType(type); } } @@ -50999,6 +51087,8 @@ function createTypeChecker(host) { var currentNode; var varianceTypeParameter; var isInferencePartiallyBlocked = false; + var withinUnreachableCode = false; + var reportedUnreachableNodes; var emptySymbols = createSymbolTable(); var arrayVariances = [1 /* Covariant */]; var compilerOptions = host.getCompilerOptions(); @@ -51017,7 +51107,9 @@ function createTypeChecker(host) { var noImplicitThis = getStrictOptionValue(compilerOptions, "noImplicitThis"); var useUnknownInCatchVariables = getStrictOptionValue(compilerOptions, "useUnknownInCatchVariables"); var exactOptionalPropertyTypes = compilerOptions.exactOptionalPropertyTypes; - var noUncheckedSideEffectImports = !!compilerOptions.noUncheckedSideEffectImports; + var noUncheckedSideEffectImports = compilerOptions.noUncheckedSideEffectImports !== false; + var stableTypeOrdering = !!compilerOptions.stableTypeOrdering; + var fileIndexMap = stableTypeOrdering ? new Map(host.getSourceFiles().map((file, i) => [file, i])) : void 0; var checkBinaryExpression = createCheckBinaryExpression(); var emitResolver = createResolver(); var nodeBuilder = createNodeBuilder(); @@ -51218,7 +51310,7 @@ function createTypeChecker(host) { if (!node) { return void 0; } - if (contextFlags & 4 /* Completions */) { + if (contextFlags & 4 /* IgnoreNodeInferences */) { return runWithInferenceBlockedFromSourceNode(node, () => getContextualType2(node, contextFlags)); } return getContextualType2(node, contextFlags); @@ -51362,7 +51454,7 @@ function createTypeChecker(host) { getSuggestedSymbolForNonexistentModule, getSuggestedSymbolForNonexistentClassMember, getBaseConstraintOfType, - getDefaultFromTypeParameter: (type) => type && type.flags & 262144 /* TypeParameter */ ? getDefaultFromTypeParameter(type) : void 0, + getDefaultFromTypeParameter: (type) => type && type.flags & 524288 /* TypeParameter */ ? getDefaultFromTypeParameter(type) : void 0, resolveName(name, location, meaning, excludeGlobals) { return resolveName( location, @@ -51570,10 +51662,10 @@ function createTypeChecker(host) { var nonInferrableAnyType = createIntrinsicType(1 /* Any */, "any", 65536 /* ContainsWideningType */, "non-inferrable"); var intrinsicMarkerType = createIntrinsicType(1 /* Any */, "intrinsic"); var unknownType = createIntrinsicType(2 /* Unknown */, "unknown"); - var undefinedType = createIntrinsicType(32768 /* Undefined */, "undefined"); - var undefinedWideningType = strictNullChecks ? undefinedType : createIntrinsicType(32768 /* Undefined */, "undefined", 65536 /* ContainsWideningType */, "widening"); + var undefinedType = createIntrinsicType(4 /* Undefined */, "undefined"); + var undefinedWideningType = strictNullChecks ? undefinedType : createIntrinsicType(4 /* Undefined */, "undefined", 65536 /* ContainsWideningType */, "widening"); var missingType = createIntrinsicType( - 32768 /* Undefined */, + 4 /* Undefined */, "undefined", /*objectFlags*/ void 0, @@ -51581,33 +51673,33 @@ function createTypeChecker(host) { ); var undefinedOrMissingType = exactOptionalPropertyTypes ? missingType : undefinedType; var optionalType = createIntrinsicType( - 32768 /* Undefined */, + 4 /* Undefined */, "undefined", /*objectFlags*/ void 0, "optional" ); - var nullType = createIntrinsicType(65536 /* Null */, "null"); - var nullWideningType = strictNullChecks ? nullType : createIntrinsicType(65536 /* Null */, "null", 65536 /* ContainsWideningType */, "widening"); - var stringType = createIntrinsicType(4 /* String */, "string"); - var numberType = createIntrinsicType(8 /* Number */, "number"); - var bigintType = createIntrinsicType(64 /* BigInt */, "bigint"); + var nullType = createIntrinsicType(8 /* Null */, "null"); + var nullWideningType = strictNullChecks ? nullType : createIntrinsicType(8 /* Null */, "null", 65536 /* ContainsWideningType */, "widening"); + var stringType = createIntrinsicType(32 /* String */, "string"); + var numberType = createIntrinsicType(64 /* Number */, "number"); + var bigintType = createIntrinsicType(128 /* BigInt */, "bigint"); var falseType = createIntrinsicType( - 512 /* BooleanLiteral */, + 8192 /* BooleanLiteral */, "false", /*objectFlags*/ void 0, "fresh" ); - var regularFalseType = createIntrinsicType(512 /* BooleanLiteral */, "false"); + var regularFalseType = createIntrinsicType(8192 /* BooleanLiteral */, "false"); var trueType = createIntrinsicType( - 512 /* BooleanLiteral */, + 8192 /* BooleanLiteral */, "true", /*objectFlags*/ void 0, "fresh" ); - var regularTrueType = createIntrinsicType(512 /* BooleanLiteral */, "true"); + var regularTrueType = createIntrinsicType(8192 /* BooleanLiteral */, "true"); trueType.regularType = regularTrueType; trueType.freshType = trueType; regularTrueType.regularType = regularTrueType; @@ -51617,40 +51709,40 @@ function createTypeChecker(host) { regularFalseType.regularType = regularFalseType; regularFalseType.freshType = falseType; var booleanType = getUnionType([regularFalseType, regularTrueType]); - var esSymbolType = createIntrinsicType(4096 /* ESSymbol */, "symbol"); - var voidType = createIntrinsicType(16384 /* Void */, "void"); - var neverType = createIntrinsicType(131072 /* Never */, "never"); - var silentNeverType = createIntrinsicType(131072 /* Never */, "never", 262144 /* NonInferrableType */, "silent"); + var esSymbolType = createIntrinsicType(512 /* ESSymbol */, "symbol"); + var voidType = createIntrinsicType(16 /* Void */, "void"); + var neverType = createIntrinsicType(262144 /* Never */, "never"); + var silentNeverType = createIntrinsicType(262144 /* Never */, "never", 262144 /* NonInferrableType */, "silent"); var implicitNeverType = createIntrinsicType( - 131072 /* Never */, + 262144 /* Never */, "never", /*objectFlags*/ void 0, "implicit" ); var unreachableNeverType = createIntrinsicType( - 131072 /* Never */, + 262144 /* Never */, "never", /*objectFlags*/ void 0, "unreachable" ); - var nonPrimitiveType = createIntrinsicType(67108864 /* NonPrimitive */, "object"); + var nonPrimitiveType = createIntrinsicType(131072 /* NonPrimitive */, "object"); var stringOrNumberType = getUnionType([stringType, numberType]); var stringNumberSymbolType = getUnionType([stringType, numberType, esSymbolType]); var numberOrBigIntType = getUnionType([numberType, bigintType]); var templateConstraintType = getUnionType([stringType, numberType, booleanType, bigintType, nullType, undefinedType]); var numericStringType = getTemplateLiteralType(["", ""], [numberType]); - var restrictiveMapper = makeFunctionTypeMapper((t) => t.flags & 262144 /* TypeParameter */ ? getRestrictiveTypeParameter(t) : t, () => "(restrictive mapper)"); - var permissiveMapper = makeFunctionTypeMapper((t) => t.flags & 262144 /* TypeParameter */ ? wildcardType : t, () => "(permissive mapper)"); + var restrictiveMapper = makeFunctionTypeMapper((t) => t.flags & 524288 /* TypeParameter */ ? getRestrictiveTypeParameter(t) : t, () => "(restrictive mapper)"); + var permissiveMapper = makeFunctionTypeMapper((t) => t.flags & 524288 /* TypeParameter */ ? wildcardType : t, () => "(permissive mapper)"); var uniqueLiteralType = createIntrinsicType( - 131072 /* Never */, + 262144 /* Never */, "never", /*objectFlags*/ void 0, "unique literal" ); - var uniqueLiteralMapper = makeFunctionTypeMapper((t) => t.flags & 262144 /* TypeParameter */ ? uniqueLiteralType : t, () => "(unique literal mapper)"); + var uniqueLiteralMapper = makeFunctionTypeMapper((t) => t.flags & 524288 /* TypeParameter */ ? uniqueLiteralType : t, () => "(unique literal mapper)"); var outofbandVarianceMarkerHandler; var reportUnreliableMapper = makeFunctionTypeMapper((t) => { if (outofbandVarianceMarkerHandler && (t === markerSuperType || t === markerSubType || t === markerOtherType)) { @@ -51839,7 +51931,6 @@ function createTypeChecker(host) { } }; var anyIterationTypes = createIterationTypes(anyType, anyType, anyType); - var silentNeverIterationTypes = createIterationTypes(silentNeverType, silentNeverType, silentNeverType); var asyncIterationTypesResolver = { iterableCacheKey: "iterationTypesOfAsyncIterable", iteratorCacheKey: "iterationTypesOfAsyncIterator", @@ -52362,7 +52453,9 @@ function createTypeChecker(host) { const targetSymbol = target.get(id); const merged = targetSymbol ? mergeSymbol(targetSymbol, sourceSymbol, unidirectional) : getMergedSymbol(sourceSymbol); if (mergedParent && targetSymbol) { - merged.parent = mergedParent; + if (merged.flags & 33554432 /* Transient */) { + merged.parent = mergedParent; + } } target.set(id, merged); }); @@ -52928,9 +53021,9 @@ function createTypeChecker(host) { const container = findAncestor(node.parent, (n) => isComputedPropertyName(n) || isPropertySignature(n) ? false : isTypeLiteralNode(n) || "quit"); if (container && container.members.length === 1) { const type = getDeclaredTypeOfSymbol(symbol); - return !!(type.flags & 1048576 /* Union */) && allTypesAssignableToKind( + return !!(type.flags & 134217728 /* Union */) && allTypesAssignableToKind( type, - 384 /* StringOrNumberLiteral */, + 3072 /* StringOrNumberLiteral */, /*strict*/ true ); @@ -53142,6 +53235,15 @@ function createTypeChecker(host) { if (usageMode === 99 /* ESNext */ && targetMode === 99 /* ESNext */) { return false; } + if (!targetMode && file.isDeclarationFile) { + const redirect = host.getRedirectFromSourceFile(file.path) || host.getRedirectFromOutput(file.path); + if (redirect) { + const targetModuleKind = host.getEmitModuleFormatOfFile(file); + if (usageMode === 99 /* ESNext */ && 5 /* ES2015 */ <= targetModuleKind && targetModuleKind <= 99 /* ESNext */) { + return false; + } + } + } } if (!allowSyntheticDefaultImports) { return false; @@ -53993,9 +54095,9 @@ function createTypeChecker(host) { } } } - function resolveExternalModuleName(location, moduleReferenceExpression, ignoreErrors) { + function resolveExternalModuleName(location, moduleReferenceExpression, ignoreErrors, errorMessage) { const isClassic = getEmitModuleResolutionKind(compilerOptions) === 1 /* Classic */; - const errorMessage = isClassic ? Diagnostics.Cannot_find_module_0_Did_you_mean_to_set_the_moduleResolution_option_to_nodenext_or_to_add_aliases_to_the_paths_option : Diagnostics.Cannot_find_module_0_or_its_corresponding_type_declarations; + errorMessage ?? (errorMessage = getCannotResolveModuleNameErrorForSpecificModule(moduleReferenceExpression) ?? (isClassic ? Diagnostics.Cannot_find_module_0_Did_you_mean_to_set_the_moduleResolution_option_to_nodenext_or_to_add_aliases_to_the_paths_option : Diagnostics.Cannot_find_module_0_or_its_corresponding_type_declarations)); return resolveExternalModuleNameWorker(location, moduleReferenceExpression, ignoreErrors ? void 0 : errorMessage, ignoreErrors); } function resolveExternalModuleNameWorker(location, moduleReferenceExpression, moduleNotFoundError, ignoreErrors = false, isForAugmentation = false) { @@ -54017,11 +54119,7 @@ function createTypeChecker(host) { return ambientModule; } const currentSourceFile = getSourceFileOfNode(location); - const contextSpecifier = isStringLiteralLike(location) ? location : ((_a = isModuleDeclaration(location) ? location : location.parent && isModuleDeclaration(location.parent) && location.parent.name === location ? location.parent : void 0) == null ? void 0 : _a.name) || ((_b = isLiteralImportTypeNode(location) ? location : void 0) == null ? void 0 : _b.argument.literal) || (isVariableDeclaration(location) && location.initializer && isRequireCall( - location.initializer, - /*requireStringLiteralLikeArgument*/ - true - ) ? location.initializer.arguments[0] : void 0) || ((_c = findAncestor(location, isImportCall)) == null ? void 0 : _c.arguments[0]) || ((_d = findAncestor(location, or(isImportDeclaration, isJSDocImportTag, isExportDeclaration))) == null ? void 0 : _d.moduleSpecifier) || ((_e = findAncestor(location, isExternalModuleImportEqualsDeclaration)) == null ? void 0 : _e.moduleReference.expression); + const contextSpecifier = isStringLiteralLike(location) ? location : ((_a = isModuleDeclaration(location) ? location : location.parent && isModuleDeclaration(location.parent) && location.parent.name === location ? location.parent : void 0) == null ? void 0 : _a.name) || ((_b = isLiteralImportTypeNode(location) ? location : void 0) == null ? void 0 : _b.argument.literal) || isVariableDeclarationInitializedToBareOrAccessedRequire(location) && getModuleSpecifierOfBareOrAccessedRequire(location) || ((_c = findAncestor(location, isImportCall)) == null ? void 0 : _c.arguments[0]) || ((_d = findAncestor(location, or(isImportDeclaration, isJSDocImportTag, isExportDeclaration))) == null ? void 0 : _d.moduleSpecifier) || ((_e = findAncestor(location, isExternalModuleImportEqualsDeclaration)) == null ? void 0 : _e.moduleReference.expression); const mode = contextSpecifier && isStringLiteralLike(contextSpecifier) ? host.getModeForUsageLocation(currentSourceFile, contextSpecifier) : host.getDefaultResolutionModeForFile(currentSourceFile); const moduleResolutionKind = getEmitModuleResolutionKind(compilerOptions); const resolvedModule = (_f = host.getResolvedModule(currentSourceFile, moduleReference, mode)) == null ? void 0 : _f.resolvedModule; @@ -54285,7 +54383,7 @@ function createTypeChecker(host) { /*skipObjectFunctionPropertyAugment*/ true ) || isEsmCjsRef) { - const moduleType = type.flags & 3670016 /* StructuredType */ ? getTypeWithSyntheticDefaultImportType(type, symbol, moduleSymbol, reference) : createDefaultPropertyWrapperForModule(symbol, symbol.parent); + const moduleType = type.flags & 403701760 /* StructuredType */ ? getTypeWithSyntheticDefaultImportType(type, symbol, moduleSymbol, reference) : createDefaultPropertyWrapperForModule(symbol, symbol.parent); return cloneTypeAsModuleType(symbol, moduleType, referenceParent); } } @@ -54363,7 +54461,7 @@ function createTypeChecker(host) { return shouldTreatPropertiesOfExternalModuleAsExports(type) ? getPropertyOfType(type, memberName) : void 0; } function shouldTreatPropertiesOfExternalModuleAsExports(resolvedExternalModuleType) { - return !(resolvedExternalModuleType.flags & 402784252 /* Primitive */ || getObjectFlags(resolvedExternalModuleType) & 1 /* Class */ || // `isArrayOrTupleLikeType` is too expensive to use in this auto-imports hot path + return !(resolvedExternalModuleType.flags & 12713980 /* Primitive */ || getObjectFlags(resolvedExternalModuleType) & 1 /* Class */ || // `isArrayOrTupleLikeType` is too expensive to use in this auto-imports hot path isArrayType(resolvedExternalModuleType) || isTupleType(resolvedExternalModuleType)); } function getExportsOfSymbol(symbol) { @@ -54568,7 +54666,7 @@ function createTypeChecker(host) { )) { return append(concatenate(concatenate([container2], additionalContainers), reexportContainers), objectLiteralContainer); } - const firstVariableMatch = !(container2.flags & getQualifiedLeftMeaning(meaning)) && container2.flags & 788968 /* Type */ && getDeclaredTypeOfSymbol(container2).flags & 524288 /* Object */ && meaning === 111551 /* Value */ ? forEachSymbolTableInScope(enclosingDeclaration, (t) => { + const firstVariableMatch = !(container2.flags & getQualifiedLeftMeaning(meaning)) && container2.flags & 788968 /* Type */ && getDeclaredTypeOfSymbol(container2).flags & 1048576 /* Object */ && meaning === 111551 /* Value */ ? forEachSymbolTableInScope(enclosingDeclaration, (t) => { return forEachEntry(t, (s) => { if (s.flags & getQualifiedLeftMeaning(meaning) && getTypeOfSymbol(s) === getDeclaredTypeOfSymbol(container2)) { return s; @@ -54659,7 +54757,7 @@ function createTypeChecker(host) { seenIntrinsicNames.add(key); } function createObjectType(objectFlags, symbol) { - const type = createTypeWithSymbol(524288 /* Object */, symbol); + const type = createTypeWithSymbol(1048576 /* Object */, symbol); type.objectFlags = objectFlags; type.members = void 0; type.properties = void 0; @@ -54669,28 +54767,64 @@ function createTypeChecker(host) { return type; } function createTypeofType() { - return getUnionType(arrayFrom(typeofNEFacts.keys(), getStringLiteralType)); + return getUnionType(map(stableTypeOrdering ? [...typeofNEFacts.keys()].sort() : arrayFrom(typeofNEFacts.keys()), getStringLiteralType)); } function createTypeParameter(symbol) { - return createTypeWithSymbol(262144 /* TypeParameter */, symbol); + return createTypeWithSymbol(524288 /* TypeParameter */, symbol); } function isReservedMemberName(name) { return name.charCodeAt(0) === 95 /* _ */ && name.charCodeAt(1) === 95 /* _ */ && name.charCodeAt(2) !== 95 /* _ */ && name.charCodeAt(2) !== 64 /* at */ && name.charCodeAt(2) !== 35 /* hash */; } - function getNamedMembers(members) { - let result; + function getNamedMembers(members, container) { + if (!stableTypeOrdering) { + let result; + members.forEach((symbol, id) => { + if (isNamedMember(symbol, id)) { + (result ?? (result = [])).push(symbol); + } + }); + return result ?? emptyArray; + } + if (members.size === 0) { + return emptyArray; + } + let contained; + if (container && container.flags & (32 /* Class */ | 64 /* Interface */)) { + members.forEach((symbol, id) => { + if (isNamedMember(symbol, id) && isDeclarationContainedBy(symbol, container)) { + contained = append(contained, symbol); + } + }); + } + let nonContained; members.forEach((symbol, id) => { - if (isNamedMember(symbol, id)) { - (result || (result = [])).push(symbol); + if (isNamedMember(symbol, id) && (!container || !(container.flags & (32 /* Class */ | 64 /* Interface */)) || !isDeclarationContainedBy(symbol, container))) { + nonContained = append(nonContained, symbol); } }); - return result || emptyArray; + contained == null ? void 0 : contained.sort(compareSymbols); + nonContained == null ? void 0 : nonContained.sort(compareSymbols); + return concatenate(contained, nonContained) ?? emptyArray; + function isDeclarationContainedBy(symbol, container2) { + const declaration = symbol.valueDeclaration; + if (declaration && container2.declarations) { + for (const d of container2.declarations) { + if (containedBy(declaration, d)) { + return true; + } + } + } + return false; + function containedBy(a, b) { + return b.pos <= a.pos && b.end >= a.end; + } + } } function isNamedMember(member, escapedName) { return !isReservedMemberName(escapedName) && symbolIsValue(member); } - function getNamedOrIndexSignatureMembers(members) { - const result = getNamedMembers(members); + function getNamedOrIndexSignatureMembers(members, symbol) { + const result = getNamedMembers(members, symbol); const index = getIndexSymbolFromSymbolTable(members); return index ? concatenate(result, [index]) : result; } @@ -54701,7 +54835,7 @@ function createTypeChecker(host) { resolved.callSignatures = callSignatures; resolved.constructSignatures = constructSignatures; resolved.indexInfos = indexInfos; - if (members !== emptySymbols) resolved.properties = getNamedMembers(members); + if (members !== emptySymbols) resolved.properties = getNamedMembers(members, type.symbol); return resolved; } function createAnonymousType(symbol, members, callSignatures, constructSignatures, indexInfos) { @@ -55268,7 +55402,7 @@ function createTypeChecker(host) { return flags & 848330095 /* NodeBuilderFlagsMask */; } function isClassInstanceSide(type) { - return !!type.symbol && !!(type.symbol.flags & 32 /* Class */) && (type === getDeclaredTypeOfClassOrInterface(type.symbol) || !!(type.flags & 524288 /* Object */) && !!(getObjectFlags(type) & 16777216 /* IsClassInstanceClone */)); + return !!type.symbol && !!(type.symbol.flags & 32 /* Class */) && (type === getDeclaredTypeOfClassOrInterface(type.symbol) || !!(type.flags & 1048576 /* Object */) && !!(getObjectFlags(type) & 16777216 /* IsClassInstanceClone */)); } function getTypeFromTypeNodeWithoutContext(node) { return getTypeFromTypeNode(node); @@ -55417,7 +55551,7 @@ function createTypeChecker(host) { if (name.includes("/node_modules/")) { context.encounteredError = true; if (context.tracker.reportLikelyUnsafeImportRequiredError) { - context.tracker.reportLikelyUnsafeImportRequiredError(name); + context.tracker.reportLikelyUnsafeImportRequiredError(name, nodeSymbol ? unescapeLeadingUnderscores(nodeSymbol.escapedName) : void 0); } } if (name !== originalName) { @@ -55625,7 +55759,7 @@ function createTypeChecker(host) { if (name && isComputedPropertyName(name)) return name; } const nameType = getSymbolLinks(symbol).nameType; - if (nameType && nameType.flags & (1024 /* EnumLiteral */ | 8192 /* UniqueESSymbol */)) { + if (nameType && nameType.flags & (32768 /* EnumLiteral */ | 16384 /* UniqueESSymbol */)) { context.enclosingDeclaration = nameType.symbol.valueDeclaration; return factory.createComputedPropertyName(symbolToExpression(nameType.symbol, context, meaning)); } @@ -55702,7 +55836,7 @@ function createTypeChecker(host) { return statements; } function withContext2(enclosingDeclaration, flags, internalFlags, tracker, maximumLength, verbosityLevel, cb, out) { - const moduleResolverHost = (tracker == null ? void 0 : tracker.trackSymbol) ? tracker.moduleResolverHost : (internalFlags || 0 /* None */) & 4 /* DoNotIncludeSymbolChain */ ? createBasicNodeBuilderModuleSpecifierResolutionHost(host) : void 0; + const moduleResolverHost = (tracker == null ? void 0 : tracker.moduleResolverHost) ?? createBasicNodeBuilderModuleSpecifierResolutionHost(host); flags = flags || 0 /* None */; const maxTruncationLength = maximumLength || (flags & 1 /* NoTruncation */ ? noTruncationMaximumTruncationLength : defaultMaximumTruncationLength); const context = { @@ -55847,23 +55981,23 @@ function createTypeChecker(host) { if (type.flags & 2 /* Unknown */) { return factory.createKeywordTypeNode(159 /* UnknownKeyword */); } - if (type.flags & 4 /* String */) { + if (type.flags & 32 /* String */) { context.approximateLength += 6; return factory.createKeywordTypeNode(154 /* StringKeyword */); } - if (type.flags & 8 /* Number */) { + if (type.flags & 64 /* Number */) { context.approximateLength += 6; return factory.createKeywordTypeNode(150 /* NumberKeyword */); } - if (type.flags & 64 /* BigInt */) { + if (type.flags & 128 /* BigInt */) { context.approximateLength += 6; return factory.createKeywordTypeNode(163 /* BigIntKeyword */); } - if (type.flags & 16 /* Boolean */ && !type.aliasSymbol) { + if (type.flags & 256 /* Boolean */ && !type.aliasSymbol) { context.approximateLength += 7; return factory.createKeywordTypeNode(136 /* BooleanKeyword */); } - if (type.flags & 1056 /* EnumLike */) { + if (type.flags & 98304 /* EnumLike */) { if (type.symbol.flags & 8 /* EnumMember */) { const parentSymbol = getParentOfSymbol(type.symbol); const parentName = symbolToTypeNode(parentSymbol, context, 788968 /* Type */); @@ -55871,7 +56005,7 @@ function createTypeChecker(host) { return parentName; } const memberName = symbolName(type.symbol); - if (isIdentifierText(memberName, 1 /* ES5 */)) { + if (isIdentifierText(memberName, 99 /* ESNext */)) { return appendReferenceToType( parentName, factory.createTypeReferenceNode( @@ -55896,24 +56030,24 @@ function createTypeChecker(host) { expandingEnum = true; } } - if (type.flags & 128 /* StringLiteral */) { + if (type.flags & 1024 /* StringLiteral */) { context.approximateLength += type.value.length + 2; return factory.createLiteralTypeNode(setEmitFlags(factory.createStringLiteral(type.value, !!(context.flags & 268435456 /* UseSingleQuotesForStringLiteralType */)), 16777216 /* NoAsciiEscaping */)); } - if (type.flags & 256 /* NumberLiteral */) { + if (type.flags & 2048 /* NumberLiteral */) { const value = type.value; context.approximateLength += ("" + value).length; return factory.createLiteralTypeNode(value < 0 ? factory.createPrefixUnaryExpression(41 /* MinusToken */, factory.createNumericLiteral(-value)) : factory.createNumericLiteral(value)); } - if (type.flags & 2048 /* BigIntLiteral */) { + if (type.flags & 4096 /* BigIntLiteral */) { context.approximateLength += pseudoBigIntToString(type.value).length + 1; return factory.createLiteralTypeNode(factory.createBigIntLiteral(type.value)); } - if (type.flags & 512 /* BooleanLiteral */) { + if (type.flags & 8192 /* BooleanLiteral */) { context.approximateLength += type.intrinsicName.length; return factory.createLiteralTypeNode(type.intrinsicName === "true" ? factory.createTrue() : factory.createFalse()); } - if (type.flags & 8192 /* UniqueESSymbol */) { + if (type.flags & 16384 /* UniqueESSymbol */) { if (!(context.flags & 1048576 /* AllowUniqueESSymbolType */)) { if (isValueSymbolAccessible(type.symbol, context.enclosingDeclaration)) { context.approximateLength += 6; @@ -55926,27 +56060,27 @@ function createTypeChecker(host) { context.approximateLength += 13; return factory.createTypeOperatorNode(158 /* UniqueKeyword */, factory.createKeywordTypeNode(155 /* SymbolKeyword */)); } - if (type.flags & 16384 /* Void */) { + if (type.flags & 16 /* Void */) { context.approximateLength += 4; return factory.createKeywordTypeNode(116 /* VoidKeyword */); } - if (type.flags & 32768 /* Undefined */) { + if (type.flags & 4 /* Undefined */) { context.approximateLength += 9; return factory.createKeywordTypeNode(157 /* UndefinedKeyword */); } - if (type.flags & 65536 /* Null */) { + if (type.flags & 8 /* Null */) { context.approximateLength += 4; return factory.createLiteralTypeNode(factory.createNull()); } - if (type.flags & 131072 /* Never */) { + if (type.flags & 262144 /* Never */) { context.approximateLength += 5; return factory.createKeywordTypeNode(146 /* NeverKeyword */); } - if (type.flags & 4096 /* ESSymbol */) { + if (type.flags & 512 /* ESSymbol */) { context.approximateLength += 6; return factory.createKeywordTypeNode(155 /* SymbolKeyword */); } - if (type.flags & 67108864 /* NonPrimitive */) { + if (type.flags & 131072 /* NonPrimitive */) { context.approximateLength += 6; return factory.createKeywordTypeNode(151 /* ObjectKeyword */); } @@ -55978,7 +56112,7 @@ function createTypeChecker(host) { } const objectFlags = getObjectFlags(type); if (objectFlags & 4 /* Reference */) { - Debug.assert(!!(type.flags & 524288 /* Object */)); + Debug.assert(!!(type.flags & 1048576 /* Object */)); if (shouldExpandType(type, context)) { context.depth += 1; return createAnonymousTypeNode( @@ -55991,8 +56125,8 @@ function createTypeChecker(host) { } return type.node ? visitAndTransformType(type, typeReferenceToTypeNode) : typeReferenceToTypeNode(type); } - if (type.flags & 262144 /* TypeParameter */ || objectFlags & 3 /* ClassOrInterface */) { - if (type.flags & 262144 /* TypeParameter */ && contains(context.inferTypeParameters, type)) { + if (type.flags & 524288 /* TypeParameter */ || objectFlags & 3 /* ClassOrInterface */) { + if (type.flags & 524288 /* TypeParameter */ && contains(context.inferTypeParameters, type)) { context.approximateLength += symbolName(type.symbol).length + 6; let constraintNode; const constraint = getConstraintOfTypeParameter(type); @@ -56009,7 +56143,7 @@ function createTypeChecker(host) { } return factory.createInferTypeNode(typeParameterToDeclarationWithConstraint(type, context, constraintNode)); } - if (context.flags & 4 /* GenerateNamesForShadowedTypeParams */ && type.flags & 262144 /* TypeParameter */) { + if (context.flags & 4 /* GenerateNamesForShadowedTypeParams */ && type.flags & 524288 /* TypeParameter */) { const name2 = typeParameterToName(type, context); context.approximateLength += idText(name2).length; return factory.createTypeReferenceNode( @@ -56038,11 +56172,11 @@ function createTypeChecker(host) { void 0 ); } - if (type.flags & 1048576 /* Union */ && type.origin) { + if (type.flags & 134217728 /* Union */ && type.origin) { type = type.origin; } - if (type.flags & (1048576 /* Union */ | 2097152 /* Intersection */)) { - const types = type.flags & 1048576 /* Union */ ? formatUnionTypes(type.types, expandingEnum) : type.types; + if (type.flags & (134217728 /* Union */ | 268435456 /* Intersection */)) { + const types = type.flags & 134217728 /* Union */ ? formatUnionTypes(type.types, expandingEnum) : type.types; if (length(types) === 1) { return typeToTypeNodeHelper(types[0], context); } @@ -56053,7 +56187,7 @@ function createTypeChecker(host) { true ); if (typeNodes && typeNodes.length > 0) { - return type.flags & 1048576 /* Union */ ? factory.createUnionTypeNode(typeNodes) : factory.createIntersectionTypeNode(typeNodes); + return type.flags & 134217728 /* Union */ ? factory.createUnionTypeNode(typeNodes) : factory.createIntersectionTypeNode(typeNodes); } else { if (!context.encounteredError && !(context.flags & 262144 /* AllowEmptyUnionOrIntersection */)) { context.encounteredError = true; @@ -56062,16 +56196,16 @@ function createTypeChecker(host) { } } if (objectFlags & (16 /* Anonymous */ | 32 /* Mapped */)) { - Debug.assert(!!(type.flags & 524288 /* Object */)); + Debug.assert(!!(type.flags & 1048576 /* Object */)); return createAnonymousTypeNode(type); } - if (type.flags & 4194304 /* Index */) { + if (type.flags & 2097152 /* Index */) { const indexedType = type.type; context.approximateLength += 6; const indexTypeNode = typeToTypeNodeHelper(indexedType, context); return factory.createTypeOperatorNode(143 /* KeyOfKeyword */, indexTypeNode); } - if (type.flags & 134217728 /* TemplateLiteral */) { + if (type.flags & 4194304 /* TemplateLiteral */) { const texts = type.texts; const types = type.types; const templateHead = factory.createTemplateHead(texts[0]); @@ -56084,20 +56218,20 @@ function createTypeChecker(host) { context.approximateLength += 2; return factory.createTemplateLiteralType(templateHead, templateSpans); } - if (type.flags & 268435456 /* StringMapping */) { + if (type.flags & 8388608 /* StringMapping */) { const typeNode = typeToTypeNodeHelper(type.type, context); return symbolToTypeNode(type.symbol, context, 788968 /* Type */, [typeNode]); } - if (type.flags & 8388608 /* IndexedAccess */) { + if (type.flags & 33554432 /* IndexedAccess */) { const objectTypeNode = typeToTypeNodeHelper(type.objectType, context); const indexTypeNode = typeToTypeNodeHelper(type.indexType, context); context.approximateLength += 2; return factory.createIndexedAccessTypeNode(objectTypeNode, indexTypeNode); } - if (type.flags & 16777216 /* Conditional */) { + if (type.flags & 67108864 /* Conditional */) { return visitAndTransformType(type, (type2) => conditionalTypeToTypeNode(type2)); } - if (type.flags & 33554432 /* Substitution */) { + if (type.flags & 16777216 /* Substitution */) { const typeNode = typeToTypeNodeHelper(type.baseType, context); const noInferSymbol = isNoInferType(type) && getGlobalTypeSymbol( "NoInfer", @@ -56110,7 +56244,7 @@ function createTypeChecker(host) { function conditionalTypeToTypeNode(type2) { const checkTypeNode = typeToTypeNodeHelper(type2.checkType, context); context.approximateLength += 15; - if (context.flags & 4 /* GenerateNamesForShadowedTypeParams */ && type2.root.isDistributive && !(type2.checkType.flags & 262144 /* TypeParameter */)) { + if (context.flags & 4 /* GenerateNamesForShadowedTypeParams */ && type2.root.isDistributive && !(type2.checkType.flags & 524288 /* TypeParameter */)) { const newParam = createTypeParameter(createSymbol(262144 /* TypeParameter */, "T")); const name = typeParameterToName(newParam, context); const newTypeVariable = factory.createTypeReferenceNode(name); @@ -56148,7 +56282,7 @@ function createTypeChecker(host) { } function typeToTypeNodeOrCircularityElision(type2) { var _a2, _b2, _c; - if (type2.flags & 1048576 /* Union */) { + if (type2.flags & 134217728 /* Union */) { if ((_a2 = context.visitedTypes) == null ? void 0 : _a2.has(getTypeId(type2))) { if (!(context.flags & 131072 /* AllowAnonymousIdentifier */)) { context.encounteredError = true; @@ -56168,14 +56302,14 @@ function createTypeChecker(host) { } function createMappedTypeNodeFromType(type2) { var _a2; - Debug.assert(!!(type2.flags & 524288 /* Object */)); + Debug.assert(!!(type2.flags & 1048576 /* Object */)); const readonlyToken = type2.declaration.readonlyToken ? factory.createToken(type2.declaration.readonlyToken.kind) : void 0; const questionToken = type2.declaration.questionToken ? factory.createToken(type2.declaration.questionToken.kind) : void 0; let appropriateConstraintTypeNode; let newTypeVariable; let templateType = getTemplateTypeFromMappedType(type2); const typeParameter = getTypeParameterFromMappedType(type2); - const needsModifierPreservingWrapper = !isMappedTypeWithKeyofConstraintDeclaration(type2) && !(getModifiersTypeFromMappedType(type2).flags & 2 /* Unknown */) && context.flags & 4 /* GenerateNamesForShadowedTypeParams */ && !(getConstraintTypeFromMappedType(type2).flags & 262144 /* TypeParameter */ && ((_a2 = getConstraintOfTypeParameter(getConstraintTypeFromMappedType(type2))) == null ? void 0 : _a2.flags) & 4194304 /* Index */); + const needsModifierPreservingWrapper = !isMappedTypeWithKeyofConstraintDeclaration(type2) && !(getModifiersTypeFromMappedType(type2).flags & 2 /* Unknown */) && context.flags & 4 /* GenerateNamesForShadowedTypeParams */ && !(getConstraintTypeFromMappedType(type2).flags & 524288 /* TypeParameter */ && ((_a2 = getConstraintOfTypeParameter(getConstraintTypeFromMappedType(type2))) == null ? void 0 : _a2.flags) & 2097152 /* Index */); if (isMappedTypeWithKeyofConstraintDeclaration(type2)) { if (isHomomorphicMappedTypeWithNonHomomorphicInstantiation(type2) && context.flags & 4 /* GenerateNamesForShadowedTypeParams */) { const newConstraintParam = createTypeParameter(createSymbol(262144 /* TypeParameter */, "T")); @@ -56311,7 +56445,7 @@ function createTypeChecker(host) { var _a2, _b2, _c; const typeId = type2.id; const isConstructorObject = getObjectFlags(type2) & 16 /* Anonymous */ && type2.symbol && type2.symbol.flags & 32 /* Class */; - const id = getObjectFlags(type2) & 4 /* Reference */ && type2.node ? "N" + getNodeId(type2.node) : type2.flags & 16777216 /* Conditional */ ? "N" + getNodeId(type2.root.node) : type2.symbol ? (isConstructorObject ? "+" : "") + getSymbolId(type2.symbol) : void 0; + const id = getObjectFlags(type2) & 4 /* Reference */ && type2.node ? "N" + getNodeId(type2.node) : type2.flags & 67108864 /* Conditional */ ? "N" + getNodeId(type2.root.node) : type2.symbol ? (isConstructorObject ? "+" : "") + getSymbolId(type2.symbol) : void 0; if (!context.visitedTypes) { context.visitedTypes = /* @__PURE__ */ new Set(); } @@ -56679,6 +56813,9 @@ function createTypeChecker(host) { if (getDeclarationModifierFlagsFromSymbol(propertySymbol) & (2 /* Private */ | 4 /* Protected */) && context.tracker.reportPrivateInBaseOfClassExpression) { context.tracker.reportPrivateInBaseOfClassExpression(unescapeLeadingUnderscores(propertySymbol.escapedName)); } + if (isPrivateIdentifierSymbol(propertySymbol) && context.tracker.reportPrivateInBaseOfClassExpression) { + context.tracker.reportPrivateInBaseOfClassExpression(idText(propertySymbol.valueDeclaration.name)); + } } if (checkTruncationLength(context) && i + 2 < properties.length - 1) { context.out.truncated = true; @@ -56838,7 +56975,7 @@ function createTypeChecker(host) { } const optionalToken = propertySymbol.flags & 16777216 /* Optional */ ? factory.createToken(58 /* QuestionToken */) : void 0; if (propertySymbol.flags & (16 /* Function */ | 8192 /* Method */) && !getPropertiesOfObjectType(propertyType).length && !isReadonlySymbol(propertySymbol)) { - const signatures = getSignaturesOfType(filterType(propertyType, (t) => !(t.flags & 32768 /* Undefined */)), 0 /* Call */); + const signatures = getSignaturesOfType(filterType(propertyType, (t) => !(t.flags & 4 /* Undefined */)), 0 /* Call */); for (const signature of signatures) { const methodDeclaration = signatureToSignatureDeclarationHelper(signature, 174 /* MethodSignature */, context, { name: propertyName, questionToken: optionalToken }); typeElements.push(preserveCommentsOn(methodDeclaration, signature.declaration || propertySymbol.valueDeclaration)); @@ -57127,8 +57264,8 @@ function createTypeChecker(host) { reportInaccessibleUniqueSymbolError() { markError(() => oldTracker.reportInaccessibleUniqueSymbolError()); }, - reportLikelyUnsafeImportRequiredError(specifier) { - markError(() => oldTracker.reportLikelyUnsafeImportRequiredError(specifier)); + reportLikelyUnsafeImportRequiredError(specifier, symbolName2) { + markError(() => oldTracker.reportLikelyUnsafeImportRequiredError(specifier, symbolName2)); }, reportNonSerializableProperty(name) { markError(() => oldTracker.reportNonSerializableProperty(name)); @@ -57654,7 +57791,7 @@ function createTypeChecker(host) { if (!attributes) { context.encounteredError = true; if (context.tracker.reportLikelyUnsafeImportRequiredError) { - context.tracker.reportLikelyUnsafeImportRequiredError(oldSpecifier); + context.tracker.reportLikelyUnsafeImportRequiredError(oldSpecifier, unescapeLeadingUnderscores(symbol.escapedName)); } } } @@ -57888,11 +58025,11 @@ function createTypeChecker(host) { } if (isComputedPropertyName(name)) { const type = checkExpression(name.expression); - return !!(type.flags & 402653316 /* StringLike */); + return !!(type.flags & 12583968 /* StringLike */); } if (isElementAccessExpression(name)) { const type = checkExpression(name.argumentExpression); - return !!(type.flags & 402653316 /* StringLike */); + return !!(type.flags & 12583968 /* StringLike */); } return isStringLiteral(name); } @@ -57922,7 +58059,7 @@ function createTypeChecker(host) { function getPropertyNameNodeForSymbolFromNameType(symbol, context, singleQuote, stringNamed, isMethod) { const nameType = getSymbolLinks(symbol).nameType; if (nameType) { - if (nameType.flags & 384 /* StringOrNumberLiteral */) { + if (nameType.flags & 3072 /* StringOrNumberLiteral */) { const name = "" + nameType.value; if (!isIdentifierText(name, getEmitScriptTarget(compilerOptions)) && (stringNamed || !isNumericLiteralName(name))) { return factory.createStringLiteral(name, !!singleQuote); @@ -57932,7 +58069,7 @@ function createTypeChecker(host) { } return createPropertyNameNodeForIdentifierOrLiteral(name, getEmitScriptTarget(compilerOptions), singleQuote, stringNamed, isMethod); } - if (nameType.flags & 8192 /* UniqueESSymbol */) { + if (nameType.flags & 16384 /* UniqueESSymbol */) { return factory.createComputedPropertyName(symbolToExpression(nameType.symbol, context, 111551 /* Value */)); } } @@ -57974,7 +58111,7 @@ function createTypeChecker(host) { return enclosingDeclaration; } function serializeInferredTypeForDeclaration(symbol, context, type) { - if (type.flags & 8192 /* UniqueESSymbol */ && type.symbol === symbol && (!context.enclosingDeclaration || some(symbol.declarations, (d) => getSourceFileOfNode(d) === context.enclosingFile))) { + if (type.flags & 16384 /* UniqueESSymbol */ && type.symbol === symbol && (!context.enclosingDeclaration || some(symbol.declarations, (d) => getSourceFileOfNode(d) === context.enclosingFile))) { context.flags |= 1048576 /* AllowUniqueESSymbolType */; } const result = typeToTypeNodeHelper(type, context); @@ -58207,7 +58344,7 @@ function createTypeChecker(host) { } function serializeExistingTypeNode(context, typeNode, addUndefined) { const type = getTypeFromTypeNode2(context, typeNode); - if (addUndefined && !someType(type, (t) => !!(t.flags & 32768 /* Undefined */)) && canReuseTypeNode(context, typeNode)) { + if (addUndefined && !someType(type, (t) => !!(t.flags & 4 /* Undefined */)) && canReuseTypeNode(context, typeNode)) { const clone2 = syntacticNodeBuilder.tryReuseExistingTypeNode(context, typeNode); if (clone2) { return factory.createUnionTypeNode([clone2, factory.createKeywordTypeNode(157 /* UndefinedKeyword */)]); @@ -59973,10 +60110,10 @@ function createTypeChecker(host) { for (let i = 0; i < types.length; i++) { const t = types[i]; flags |= t.flags; - if (!(t.flags & 98304 /* Nullable */)) { - if (t.flags & 512 /* BooleanLiteral */ || !expandingEnum && t.flags | 1056 /* EnumLike */) { - const baseType = t.flags & 512 /* BooleanLiteral */ ? booleanType : getBaseTypeOfEnumLikeType(t); - if (baseType.flags & 1048576 /* Union */) { + if (!(t.flags & 12 /* Nullable */)) { + if (t.flags & 8192 /* BooleanLiteral */ || !expandingEnum && t.flags | 98304 /* EnumLike */) { + const baseType = t.flags & 8192 /* BooleanLiteral */ ? booleanType : getBaseTypeOfEnumLikeType(t); + if (baseType.flags & 134217728 /* Union */) { const count = baseType.types.length; if (i + count <= types.length && getRegularTypeOfLiteralType(types[i + count - 1]) === getRegularTypeOfLiteralType(baseType.types[count - 1])) { result.push(baseType); @@ -59988,8 +60125,8 @@ function createTypeChecker(host) { result.push(t); } } - if (flags & 65536 /* Null */) result.push(nullType); - if (flags & 32768 /* Undefined */) result.push(undefinedType); + if (flags & 8 /* Null */) result.push(nullType); + if (flags & 4 /* Undefined */) result.push(undefinedType); return result || types; } function visibilityToString(flags) { @@ -60019,7 +60156,7 @@ function createTypeChecker(host) { function getNameOfSymbolFromNameType(symbol, context) { const nameType = getSymbolLinks(symbol).nameType; if (nameType) { - if (nameType.flags & 384 /* StringOrNumberLiteral */) { + if (nameType.flags & 3072 /* StringOrNumberLiteral */) { const name = "" + nameType.value; if (!isIdentifierText(name, getEmitScriptTarget(compilerOptions)) && !isNumericLiteralName(name)) { return `"${escapeString(name, 34 /* doubleQuote */)}"`; @@ -60029,7 +60166,7 @@ function createTypeChecker(host) { } return name; } - if (nameType.flags & 8192 /* UniqueESSymbol */) { + if (nameType.flags & 16384 /* UniqueESSymbol */) { return `[${getNameOfSymbolAsWritten(nameType.symbol, context)}]`; } } @@ -60054,7 +60191,7 @@ function createTypeChecker(host) { } if (isComputedPropertyName(name2) && !(getCheckFlags(symbol) & 4096 /* Late */)) { const nameType = getSymbolLinks(symbol).nameType; - if (nameType && nameType.flags & 384 /* StringOrNumberLiteral */) { + if (nameType && nameType.flags & 3072 /* StringOrNumberLiteral */) { const result = getNameOfSymbolFromNameType(symbol, context); if (result !== void 0) { return result; @@ -60335,18 +60472,18 @@ function createTypeChecker(host) { ); } function getRestType(source, properties, symbol) { - source = filterType(source, (t) => !(t.flags & 98304 /* Nullable */)); - if (source.flags & 131072 /* Never */) { + source = filterType(source, (t) => !(t.flags & 12 /* Nullable */)); + if (source.flags & 262144 /* Never */) { return emptyObjectType; } - if (source.flags & 1048576 /* Union */) { + if (source.flags & 134217728 /* Union */) { return mapType(source, (t) => getRestType(t, properties, symbol)); } let omitKeyType = getUnionType(map(properties, getLiteralTypeFromPropertyName)); const spreadableProperties = []; const unspreadableToRestKeys = []; for (const prop of getPropertiesOfType(source)) { - const literalTypeFromProperty = getLiteralTypeFromProperty(prop, 8576 /* StringOrNumberLiteralOrUnique */); + const literalTypeFromProperty = getLiteralTypeFromProperty(prop, 19456 /* StringOrNumberLiteralOrUnique */); if (!isTypeAssignableTo(literalTypeFromProperty, omitKeyType) && !(getDeclarationModifierFlagsFromSymbol(prop) & (2 /* Private */ | 4 /* Protected */)) && isSpreadableProperty(prop)) { spreadableProperties.push(prop); } else { @@ -60357,7 +60494,7 @@ function createTypeChecker(host) { if (unspreadableToRestKeys.length) { omitKeyType = getUnionType([omitKeyType, ...unspreadableToRestKeys]); } - if (omitKeyType.flags & 131072 /* Never */) { + if (omitKeyType.flags & 262144 /* Never */) { return source; } const omitTypeAlias = getGlobalOmitSymbol(); @@ -60379,10 +60516,10 @@ function createTypeChecker(host) { return result; } function isGenericTypeWithUndefinedConstraint(type) { - return !!(type.flags & 465829888 /* Instantiable */) && maybeTypeOfKind(getBaseConstraintOfType(type) || unknownType, 32768 /* Undefined */); + return !!(type.flags & 132644864 /* Instantiable */) && maybeTypeOfKind(getBaseConstraintOfType(type) || unknownType, 4 /* Undefined */); } function getNonUndefinedType(type) { - const typeOrConstraint = someType(type, isGenericTypeWithUndefinedConstraint) ? mapType(type, (t) => t.flags & 465829888 /* Instantiable */ ? getBaseConstraintOrType(t) : t) : type; + const typeOrConstraint = someType(type, isGenericTypeWithUndefinedConstraint) ? mapType(type, (t) => t.flags & 132644864 /* Instantiable */ ? getBaseConstraintOrType(t) : t) : type; return getTypeWithFacts(typeOrConstraint, 524288 /* NEUndefined */); } function getFlowTypeOfDestructuring(node, declaredType) { @@ -60433,7 +60570,7 @@ function createTypeChecker(host) { } function getLiteralPropertyNameText(name) { const type = getLiteralTypeFromPropertyName(name); - return type.flags & (128 /* StringLiteral */ | 256 /* NumberLiteral */) ? "" + type.value : void 0; + return type.flags & (1024 /* StringLiteral */ | 2048 /* NumberLiteral */) ? "" + type.value : void 0; } function getTypeForBindingElement(declaration) { const checkMode = declaration.dotDotDotToken ? 32 /* RestBindingElement */ : 0 /* Normal */; @@ -60481,7 +60618,7 @@ function createTypeChecker(host) { const elementType = checkIteratedTypeOrElementType(65 /* Destructuring */ | (declaration.dotDotDotToken ? 0 : 128 /* PossiblyOutOfBounds */), parentType, undefinedType, pattern); const index = pattern.elements.indexOf(declaration); if (declaration.dotDotDotToken) { - const baseConstraint = mapType(parentType, (t) => t.flags & 58982400 /* InstantiableNonPrimitive */ ? getBaseConstraintOrType(t) : t); + const baseConstraint = mapType(parentType, (t) => t.flags & 117964800 /* InstantiableNonPrimitive */ ? getBaseConstraintOrType(t) : t); type = everyType(baseConstraint, isTupleType) ? mapType(baseConstraint, (t) => sliceTupleType(t, index)) : createArrayType(elementType); } else if (isArrayLikeType(parentType)) { const indexType = getNumberLiteralType(index); @@ -60532,7 +60669,7 @@ function createTypeChecker(host) { /*checkMode*/ checkMode ))); - return indexType.flags & (262144 /* TypeParameter */ | 4194304 /* Index */) ? getExtractStringType(indexType) : stringType; + return indexType.flags & (524288 /* TypeParameter */ | 2097152 /* Index */) ? getExtractStringType(indexType) : stringType; } if (isVariableDeclaration(declaration) && declaration.parent.parent.kind === 251 /* ForOfStatement */) { const forOfStatement = declaration.parent.parent; @@ -60773,7 +60910,7 @@ function createTypeChecker(host) { definedInConstructor = true; } } - const sourceTypes = some(constructorTypes, (t) => !!(t.flags & ~98304 /* Nullable */)) ? constructorTypes : types; + const sourceTypes = some(constructorTypes, (t) => !!(t.flags & ~12 /* Nullable */)) ? constructorTypes : types; type = getUnionType(sourceTypes); } } @@ -60783,7 +60920,7 @@ function createTypeChecker(host) { false, definedInMethod && !definedInConstructor )); - if (symbol.valueDeclaration && isInJSFile(symbol.valueDeclaration) && filterType(widened, (t) => !!(t.flags & ~98304 /* Nullable */)) === neverType) { + if (symbol.valueDeclaration && isInJSFile(symbol.valueDeclaration) && filterType(widened, (t) => !!(t.flags & ~12 /* Nullable */)) === neverType) { reportImplicitAny(symbol.valueDeclaration, anyType); return anyType; } @@ -60872,7 +61009,7 @@ function createTypeChecker(host) { } const isDirectExport = kind === 1 /* ExportsProperty */ && (isPropertyAccessExpression(expression.left) || isElementAccessExpression(expression.left)) && (isModuleExportsAccessExpression(expression.left.expression) || isIdentifier(expression.left.expression) && isExportsIdentifier(expression.left.expression)); const type = resolvedSymbol ? getTypeOfSymbol(resolvedSymbol) : isDirectExport ? getRegularTypeOfLiteralType(checkExpressionCached(expression.right)) : getWidenedLiteralType(checkExpressionCached(expression.right)); - if (type.flags & 524288 /* Object */ && kind === 2 /* ModuleExports */ && symbol.escapedName === "export=" /* ExportEquals */) { + if (type.flags & 1048576 /* Object */ && kind === 2 /* ModuleExports */ && symbol.escapedName === "export=" /* ExportEquals */) { const exportedType = resolveStructuredTypeMembers(type); const members = createSymbolTable(); copyEntries(exportedType.members, members); @@ -61081,13 +61218,13 @@ function createTypeChecker(host) { } function widenTypeForVariableLikeDeclaration(type, declaration, reportErrors2) { if (type) { - if (type.flags & 4096 /* ESSymbol */ && isGlobalSymbolConstructor(declaration.parent)) { + if (type.flags & 512 /* ESSymbol */ && isGlobalSymbolConstructor(declaration.parent)) { type = getESSymbolLikeTypeForNode(declaration); } if (reportErrors2) { reportErrorsFromWidening(declaration, type); } - if (type.flags & 8192 /* UniqueESSymbol */ && (isBindingElement(declaration) || !tryGetTypeFromEffectiveTypeNode(declaration)) && type.symbol !== getSymbolOfDeclaration(declaration)) { + if (type.flags & 16384 /* UniqueESSymbol */ && (isBindingElement(declaration) || !tryGetTypeFromEffectiveTypeNode(declaration)) && type.symbol !== getSymbolOfDeclaration(declaration)) { type = esSymbolType; } return getWidenedType(type); @@ -61299,7 +61436,7 @@ function createTypeChecker(host) { } function getBaseTypeVariableOfClass(symbol) { const baseConstructorType = getBaseConstructorTypeOfClass(getDeclaredTypeOfClassOrInterface(symbol)); - return baseConstructorType.flags & 8650752 /* TypeVariable */ ? baseConstructorType : baseConstructorType.flags & 2097152 /* Intersection */ ? find(baseConstructorType.types, (t) => !!(t.flags & 8650752 /* TypeVariable */)) : void 0; + return baseConstructorType.flags & 34078720 /* TypeVariable */ ? baseConstructorType : baseConstructorType.flags & 268435456 /* Intersection */ ? find(baseConstructorType.types, (t) => !!(t.flags & 34078720 /* TypeVariable */)) : void 0; } function getTypeOfFuncClassEnumModule(symbol) { let links = getSymbolLinks(symbol); @@ -61409,7 +61546,7 @@ function createTypeChecker(host) { if (!links.type) { Debug.assertIsDefined(links.deferralParent); Debug.assertIsDefined(links.deferralConstituents); - links.type = links.deferralParent.flags & 1048576 /* Union */ ? getUnionType(links.deferralConstituents) : getIntersectionType(links.deferralConstituents); + links.type = links.deferralParent.flags & 134217728 /* Union */ ? getUnionType(links.deferralConstituents) : getIntersectionType(links.deferralConstituents); } return links.type; } @@ -61418,7 +61555,7 @@ function createTypeChecker(host) { if (!links.writeType && links.deferralWriteConstituents) { Debug.assertIsDefined(links.deferralParent); Debug.assertIsDefined(links.deferralConstituents); - links.writeType = links.deferralParent.flags & 1048576 /* Union */ ? getUnionType(links.deferralWriteConstituents) : getIntersectionType(links.deferralWriteConstituents); + links.writeType = links.deferralParent.flags & 134217728 /* Union */ ? getUnionType(links.deferralWriteConstituents) : getIntersectionType(links.deferralWriteConstituents); } return links.writeType; } @@ -61495,7 +61632,7 @@ function createTypeChecker(host) { if (getObjectFlags(type2) & (3 /* ClassOrInterface */ | 4 /* Reference */)) { const target = getTargetType(type2); return target === checkBase || some(getBaseTypes(target), check); - } else if (type2.flags & 2097152 /* Intersection */) { + } else if (type2.flags & 268435456 /* Intersection */) { return some(type2.types, check); } return false; @@ -61619,7 +61756,7 @@ function createTypeChecker(host) { if (getSignaturesOfType(type, 1 /* Construct */).length > 0) { return true; } - if (type.flags & 8650752 /* TypeVariable */) { + if (type.flags & 34078720 /* TypeVariable */) { const constraint = getBaseConstraintOfType(type); return !!constraint && isMixinConstructorType(constraint); } @@ -61655,7 +61792,7 @@ function createTypeChecker(host) { Debug.assert(!extended.typeArguments); checkExpression(extended.expression); } - if (baseConstructorType.flags & (524288 /* Object */ | 2097152 /* Intersection */)) { + if (baseConstructorType.flags & (1048576 /* Object */ | 268435456 /* Intersection */)) { resolveStructuredTypeMembers(baseConstructorType); } if (!popTypeResolution()) { @@ -61664,7 +61801,7 @@ function createTypeChecker(host) { } if (!(baseConstructorType.flags & 1 /* Any */) && baseConstructorType !== nullWideningType && !isConstructorType(baseConstructorType)) { const err = error2(baseTypeNode.expression, Diagnostics.Type_0_is_not_a_constructor_function_type, typeToString(baseConstructorType)); - if (baseConstructorType.flags & 262144 /* TypeParameter */) { + if (baseConstructorType.flags & 524288 /* TypeParameter */) { const constraint = getConstraintFromTypeParameter(baseConstructorType); let ctorReturn = unknownType; if (constraint) { @@ -61712,6 +61849,9 @@ function createTypeChecker(host) { )); } function getBaseTypes(type) { + if (!(getObjectFlags(type) & (3 /* ClassOrInterface */ | 4 /* Reference */))) { + return emptyArray; + } if (!type.baseTypesResolved) { if (pushTypeResolution(type, 6 /* ResolvedBaseTypes */)) { if (type.objectFlags & 8 /* Tuple */) { @@ -61745,7 +61885,7 @@ function createTypeChecker(host) { function resolveBaseTypesOfClass(type) { type.resolvedBaseTypes = resolvingEmptyArray; const baseConstructorType = getApparentType(getBaseConstructorTypeOfClass(type)); - if (!(baseConstructorType.flags & (524288 /* Object */ | 2097152 /* Intersection */ | 1 /* Any */))) { + if (!(baseConstructorType.flags & (1048576 /* Object */ | 268435456 /* Intersection */ | 1 /* Any */))) { return type.resolvedBaseTypes = emptyArray; } const baseTypeNode = getBaseTypeNodeOfClass(type); @@ -61801,13 +61941,13 @@ function createTypeChecker(host) { return true; } function isValidBaseType(type) { - if (type.flags & 262144 /* TypeParameter */) { + if (type.flags & 524288 /* TypeParameter */) { const constraint = getBaseConstraintOfType(type); if (constraint) { return isValidBaseType(constraint); } } - return !!(type.flags & (524288 /* Object */ | 67108864 /* NonPrimitive */ | 1 /* Any */) && !isGenericMappedType(type) || type.flags & 2097152 /* Intersection */ && every(type.types, isValidBaseType)); + return !!(type.flags & (1048576 /* Object */ | 131072 /* NonPrimitive */ | 1 /* Any */) && !isGenericMappedType(type) || type.flags & 268435456 /* Intersection */ && every(type.types, isValidBaseType)); } function resolveBaseTypesOfInterface(type) { type.resolvedBaseTypes = type.resolvedBaseTypes || emptyArray; @@ -61927,7 +62067,7 @@ function createTypeChecker(host) { return links.declaredType; } function getBaseTypeOfEnumLikeType(type) { - return type.flags & 1056 /* EnumLike */ && type.symbol.flags & 8 /* EnumMember */ ? getDeclaredTypeOfSymbol(getParentOfSymbol(type.symbol)) : type; + return type.flags & 98304 /* EnumLike */ && type.symbol.flags & 8 /* EnumMember */ ? getDeclaredTypeOfSymbol(getParentOfSymbol(type.symbol)) : type; } function getDeclaredTypeOfEnum(symbol) { const links = getSymbolLinks(symbol); @@ -61957,8 +62097,8 @@ function createTypeChecker(host) { /*aliasTypeArguments*/ void 0 ) : createComputedEnumType(symbol); - if (enumType.flags & 1048576 /* Union */) { - enumType.flags |= 1024 /* EnumLiteral */; + if (enumType.flags & 134217728 /* Union */) { + enumType.flags |= 32768 /* EnumLiteral */; enumType.symbol = symbol; } links.declaredType = enumType; @@ -61966,8 +62106,8 @@ function createTypeChecker(host) { return links.declaredType; } function createComputedEnumType(symbol) { - const regularType = createTypeWithSymbol(32 /* Enum */, symbol); - const freshType = createTypeWithSymbol(32 /* Enum */, symbol); + const regularType = createTypeWithSymbol(65536 /* Enum */, symbol); + const freshType = createTypeWithSymbol(65536 /* Enum */, symbol); regularType.regularType = regularType; regularType.freshType = freshType; freshType.regularType = regularType; @@ -62096,7 +62236,7 @@ function createTypeChecker(host) { if (!type.declaredProperties) { const symbol = type.symbol; const members = getMembersOfSymbol(symbol); - type.declaredProperties = getNamedMembers(members); + type.declaredProperties = getNamedMembers(members, symbol); type.declaredCallSignatures = emptyArray; type.declaredConstructSignatures = emptyArray; type.declaredIndexInfos = emptyArray; @@ -62167,7 +62307,7 @@ function createTypeChecker(host) { const earlySymbol = earlySymbols && earlySymbols.get(memberName); if (!(parent2.flags & 32 /* Class */) && lateSymbol.flags & getExcludedSymbolFlags(symbolFlags)) { const declarations = earlySymbol ? concatenate(earlySymbol.declarations, lateSymbol.declarations) : lateSymbol.declarations; - const name = !(type.flags & 8192 /* UniqueESSymbol */) && unescapeLeadingUnderscores(memberName) || declarationNameToString(declName); + const name = !(type.flags & 16384 /* UniqueESSymbol */) && unescapeLeadingUnderscores(memberName) || declarationNameToString(declName); forEach(declarations, (declaration) => error2(getNameOfDeclaration(declaration) || declaration, Diagnostics.Property_0_was_also_declared_here, name)); error2(declName || decl, Diagnostics.Duplicate_property_0, name); lateSymbol = createSymbol(0 /* None */, memberName, 4096 /* Late */); @@ -62280,7 +62420,7 @@ function createTypeChecker(host) { const target = type.target; const typeArguments = getTypeArguments(type); return length(target.typeParameters) === length(typeArguments) ? createTypeReference(target, concatenate(typeArguments, [thisArgument || target.thisType])) : type; - } else if (type.flags & 2097152 /* Intersection */) { + } else if (type.flags & 268435456 /* Intersection */) { const types = sameMap(type.types, (t) => getTypeWithThisArgument(t, thisArgument, needApparentType)); return types !== type.types ? getIntersectionType(types) : type; } @@ -62380,7 +62520,7 @@ function createTypeChecker(host) { function createUnionSignature(signature, unionSignatures) { const result = cloneSignature(signature); result.compositeSignatures = unionSignatures; - result.compositeKind = 1048576 /* Union */; + result.compositeKind = 134217728 /* Union */; result.target = void 0; result.mapper = void 0; return result; @@ -62408,7 +62548,7 @@ function createTypeChecker(host) { const restType = getTypeOfSymbol(restSymbol); if (isTupleType(restType)) { return [expandSignatureParametersWithTupleMembers(restType, restIndex, restSymbol)]; - } else if (!skipUnionExpanding && restType.flags & 1048576 /* Union */ && every(restType.types, isTupleType)) { + } else if (!skipUnionExpanding && restType.flags & 134217728 /* Union */ && every(restType.types, isTupleType)) { return map(restType.types, (t) => expandSignatureParametersWithTupleMembers(t, restIndex, restSymbol)); } } @@ -62691,11 +62831,11 @@ function createTypeChecker(host) { minArgCount, flags ); - result.compositeKind = 1048576 /* Union */; - result.compositeSignatures = concatenate(left.compositeKind !== 2097152 /* Intersection */ && left.compositeSignatures || [left], [right]); + result.compositeKind = 134217728 /* Union */; + result.compositeSignatures = concatenate(left.compositeKind !== 268435456 /* Intersection */ && left.compositeSignatures || [left], [right]); if (paramMapper) { - result.mapper = left.compositeKind !== 2097152 /* Intersection */ && left.mapper && left.compositeSignatures ? combineTypeMappers(left.mapper, paramMapper) : paramMapper; - } else if (left.compositeKind !== 2097152 /* Intersection */ && left.mapper && left.compositeSignatures) { + result.mapper = left.compositeKind !== 268435456 /* Intersection */ && left.mapper && left.compositeSignatures ? combineTypeMappers(left.mapper, paramMapper) : paramMapper; + } else if (left.compositeKind !== 268435456 /* Intersection */ && left.mapper && left.compositeSignatures) { result.mapper = left.mapper; } return result; @@ -62848,8 +62988,8 @@ function createTypeChecker(host) { if (symbol.flags & 32 /* Class */) { const classType = getDeclaredTypeOfClassOrInterface(symbol); const baseConstructorType = getBaseConstructorTypeOfClass(classType); - if (baseConstructorType.flags & (524288 /* Object */ | 2097152 /* Intersection */ | 8650752 /* TypeVariable */)) { - members = createSymbolTable(getNamedOrIndexSignatureMembers(members)); + if (baseConstructorType.flags & (1048576 /* Object */ | 268435456 /* Intersection */ | 34078720 /* TypeVariable */)) { + members = createSymbolTable(getNamedOrIndexSignatureMembers(members, symbol)); addInheritedMembers(members, getPropertiesOfType(baseConstructorType)); } else if (baseConstructorType === anyType) { baseConstructorIndexInfo = anyBaseTypeIndexInfo; @@ -62862,7 +63002,7 @@ function createTypeChecker(host) { if (baseConstructorIndexInfo) { indexInfos = append(indexInfos, baseConstructorIndexInfo); } - if (symbol.flags & 384 /* Enum */ && (getDeclaredTypeOfSymbol(symbol).flags & 32 /* Enum */ || some(type.properties, (prop) => !!(getTypeOfSymbol(prop).flags & 296 /* NumberLike */)))) { + if (symbol.flags & 384 /* Enum */ && (getDeclaredTypeOfSymbol(symbol).flags & 65536 /* Enum */ || some(type.properties, (prop) => !!(getTypeOfSymbol(prop).flags & 67648 /* NumberLike */)))) { indexInfos = append(indexInfos, enumNumberIndexInfo); } } @@ -62903,11 +63043,11 @@ function createTypeChecker(host) { } function getLimitedConstraint(type) { const constraint = getConstraintTypeFromMappedType(type.mappedType); - if (!(constraint.flags & 1048576 /* Union */ || constraint.flags & 2097152 /* Intersection */)) { + if (!(constraint.flags & 134217728 /* Union */ || constraint.flags & 268435456 /* Intersection */)) { return; } - const origin = constraint.flags & 1048576 /* Union */ ? constraint.origin : constraint; - if (!origin || !(origin.flags & 2097152 /* Intersection */)) { + const origin = constraint.flags & 134217728 /* Union */ ? constraint.origin : constraint; + if (!origin || !(origin.flags & 268435456 /* Intersection */)) { return; } const limitedConstraint = getIntersectionType(origin.types.filter((t) => t !== type.constraintType)); @@ -62923,7 +63063,7 @@ function createTypeChecker(host) { const limitedConstraint = getLimitedConstraint(type); for (const prop of getPropertiesOfType(type.source)) { if (limitedConstraint) { - const propertyNameType = getLiteralTypeFromProperty(prop, 8576 /* StringOrNumberLiteralOrUnique */); + const propertyNameType = getLiteralTypeFromProperty(prop, 19456 /* StringOrNumberLiteralOrUnique */); if (!isTypeAssignableTo(propertyNameType, limitedConstraint)) { continue; } @@ -62933,7 +63073,7 @@ function createTypeChecker(host) { inferredProp.declarations = prop.declarations; inferredProp.links.nameType = getSymbolLinks(prop).nameType; inferredProp.links.propertyType = getTypeOfSymbol(prop); - if (type.constraintType.type.flags & 8388608 /* IndexedAccess */ && type.constraintType.type.objectType.flags & 262144 /* TypeParameter */ && type.constraintType.type.indexType.flags & 262144 /* TypeParameter */) { + if (type.constraintType.type.flags & 33554432 /* IndexedAccess */ && type.constraintType.type.objectType.flags & 524288 /* TypeParameter */ && type.constraintType.type.indexType.flags & 524288 /* TypeParameter */) { const newTypeParam = type.constraintType.type.objectType; const newMappedType = replaceIndexedAccess(type.mappedType, type.constraintType.type, newTypeParam); inferredProp.links.mappedType = newMappedType; @@ -62947,11 +63087,11 @@ function createTypeChecker(host) { setStructuredTypeMembers(type, members, emptyArray, emptyArray, indexInfos); } function getLowerBoundOfKeyType(type) { - if (type.flags & 4194304 /* Index */) { + if (type.flags & 2097152 /* Index */) { const t = getApparentType(type.type); return isGenericTupleType(t) ? getKnownKeysOfTupleType(t) : getIndexType(t); } - if (type.flags & 16777216 /* Conditional */) { + if (type.flags & 67108864 /* Conditional */) { if (type.root.isDistributive) { const checkType = type.checkType; const constraint = getLowerBoundOfKeyType(checkType); @@ -62966,7 +63106,7 @@ function createTypeChecker(host) { } return type; } - if (type.flags & 1048576 /* Union */) { + if (type.flags & 134217728 /* Union */) { return mapType( type, getLowerBoundOfKeyType, @@ -62974,9 +63114,9 @@ function createTypeChecker(host) { true ); } - if (type.flags & 2097152 /* Intersection */) { + if (type.flags & 268435456 /* Intersection */) { const types = type.types; - if (types.length === 2 && !!(types[0].flags & (4 /* String */ | 8 /* Number */ | 64 /* BigInt */)) && types[1] === emptyTypeLiteralType) { + if (types.length === 2 && !!(types[0].flags & (32 /* String */ | 64 /* Number */ | 128 /* BigInt */)) && types[1] === emptyTypeLiteralType) { return type; } return getIntersectionType(sameMap(type.types, getLowerBoundOfKeyType)); @@ -62994,7 +63134,7 @@ function createTypeChecker(host) { cb(stringType); } else { for (const info of getIndexInfosOfType(type)) { - if (!stringsOnly || info.keyType.flags & (4 /* String */ | 134217728 /* TemplateLiteral */)) { + if (!stringsOnly || info.keyType.flags & (32 /* String */ | 4194304 /* TemplateLiteral */)) { cb(info.keyType); } } @@ -63012,7 +63152,7 @@ function createTypeChecker(host) { const templateType = getTemplateTypeFromMappedType(mappedType); const modifiersType = getApparentType(getModifiersTypeFromMappedType(type)); const templateModifiers = getMappedTypeModifiers(type); - const include = 8576 /* StringOrNumberLiteralOrUnique */; + const include = 19456 /* StringOrNumberLiteralOrUnique */; if (isMappedTypeWithKeyofConstraintDeclaration(type)) { forEachMappedTypePropertyKeyTypeAndIndexSignatureKeyType( modifiersType, @@ -63052,8 +63192,8 @@ function createTypeChecker(host) { } members.set(propName, prop); } - } else if (isValidIndexKeyType(propNameType) || propNameType.flags & (1 /* Any */ | 32 /* Enum */)) { - const indexKeyType = propNameType.flags & (1 /* Any */ | 4 /* String */) ? stringType : propNameType.flags & (8 /* Number */ | 32 /* Enum */) ? numberType : propNameType; + } else if (isValidIndexKeyType(propNameType) || propNameType.flags & (1 /* Any */ | 65536 /* Enum */)) { + const indexKeyType = propNameType.flags & (1 /* Any */ | 32 /* String */) ? stringType : propNameType.flags & (64 /* Number */ | 65536 /* Enum */) ? numberType : propNameType; const propType = instantiateType(templateType, appendTypeMapping(type.mapper, typeParameter, keyType)); const modifiersIndexInfo = getApplicableIndexInfo(modifiersType, propNameType); const isReadonly = !!(templateModifiers & 1 /* IncludeReadonly */ || !(templateModifiers & 2 /* ExcludeReadonly */) && (modifiersIndexInfo == null ? void 0 : modifiersIndexInfo.isReadonly)); @@ -63078,7 +63218,7 @@ function createTypeChecker(host) { const templateType = getTemplateTypeFromMappedType(mappedType.target || mappedType); const mapper = appendTypeMapping(mappedType.mapper, getTypeParameterFromMappedType(mappedType), symbol.links.keyType); const propType = instantiateType(templateType, mapper); - let type = strictNullChecks && symbol.flags & 16777216 /* Optional */ && !maybeTypeOfKind(propType, 32768 /* Undefined */ | 16384 /* Void */) ? getOptionalType( + let type = strictNullChecks && symbol.flags & 16777216 /* Optional */ && !maybeTypeOfKind(propType, 4 /* Undefined */ | 16 /* Void */) ? getOptionalType( propType, /*isProperty*/ true @@ -63122,8 +63262,8 @@ function createTypeChecker(host) { } else { const declaredType = getTypeFromMappedTypeNode(type.declaration); const constraint = getConstraintTypeFromMappedType(declaredType); - const extendedConstraint = constraint && constraint.flags & 262144 /* TypeParameter */ ? getConstraintOfTypeParameter(constraint) : constraint; - type.modifiersType = extendedConstraint && extendedConstraint.flags & 4194304 /* Index */ ? instantiateType(extendedConstraint.type, type.mapper) : unknownType; + const extendedConstraint = constraint && constraint.flags & 524288 /* TypeParameter */ ? getConstraintOfTypeParameter(constraint) : constraint; + type.modifiersType = extendedConstraint && extendedConstraint.flags & 2097152 /* Index */ ? instantiateType(extendedConstraint.type, type.mapper) : unknownType; } } return type.modifiersType; @@ -63140,7 +63280,7 @@ function createTypeChecker(host) { if (getObjectFlags(type) & 32 /* Mapped */) { return getMappedTypeOptionality(type) || getCombinedMappedTypeOptionality(getModifiersTypeFromMappedType(type)); } - if (type.flags & 2097152 /* Intersection */) { + if (type.flags & 268435456 /* Intersection */) { const optionality = getCombinedMappedTypeOptionality(type.types[0]); return every(type.types, (t, i) => i === 0 || getCombinedMappedTypeOptionality(t) === optionality) ? optionality : 0; } @@ -63171,7 +63311,7 @@ function createTypeChecker(host) { } function resolveStructuredTypeMembers(type) { if (!type.members) { - if (type.flags & 524288 /* Object */) { + if (type.flags & 1048576 /* Object */) { if (type.objectFlags & 4 /* Reference */) { resolveTypeReferenceMembers(type); } else if (type.objectFlags & 3 /* ClassOrInterface */) { @@ -63185,9 +63325,9 @@ function createTypeChecker(host) { } else { Debug.fail("Unhandled object type " + Debug.formatObjectFlags(type.objectFlags)); } - } else if (type.flags & 1048576 /* Union */) { + } else if (type.flags & 134217728 /* Union */) { resolveUnionTypeMembers(type); - } else if (type.flags & 2097152 /* Intersection */) { + } else if (type.flags & 268435456 /* Intersection */) { resolveIntersectionTypeMembers(type); } else { Debug.fail("Unhandled type " + Debug.formatTypeFlags(type.flags)); @@ -63196,13 +63336,13 @@ function createTypeChecker(host) { return type; } function getPropertiesOfObjectType(type) { - if (type.flags & 524288 /* Object */) { + if (type.flags & 1048576 /* Object */) { return resolveStructuredTypeMembers(type).properties; } return emptyArray; } function getPropertyOfObjectType(type, name) { - if (type.flags & 524288 /* Object */) { + if (type.flags & 1048576 /* Object */) { const resolved = resolveStructuredTypeMembers(type); const symbol = resolved.members.get(name); if (symbol && symbolIsValue(symbol)) { @@ -63220,28 +63360,28 @@ function createTypeChecker(host) { type, prop.escapedName, /*skipObjectFunctionPropertyAugment*/ - !!(type.flags & 2097152 /* Intersection */) + !!(type.flags & 268435456 /* Intersection */) ); if (combinedProp) { members.set(prop.escapedName, combinedProp); } } } - if (type.flags & 1048576 /* Union */ && getIndexInfosOfType(current).length === 0) { + if (type.flags & 134217728 /* Union */ && getIndexInfosOfType(current).length === 0) { break; } } - type.resolvedProperties = getNamedMembers(members); + type.resolvedProperties = getNamedMembers(members, type.symbol); } return type.resolvedProperties; } function getPropertiesOfType(type) { type = getReducedApparentType(type); - return type.flags & 3145728 /* UnionOrIntersection */ ? getPropertiesOfUnionOrIntersectionType(type) : getPropertiesOfObjectType(type); + return type.flags & 402653184 /* UnionOrIntersection */ ? getPropertiesOfUnionOrIntersectionType(type) : getPropertiesOfObjectType(type); } function forEachPropertyOfType(type, action) { type = getReducedApparentType(type); - if (type.flags & 3670016 /* StructuredType */) { + if (type.flags & 403701760 /* StructuredType */) { resolveStructuredTypeMembers(type).members.forEach((symbol, escapedName) => { if (isNamedMember(symbol, escapedName)) { action(symbol, escapedName); @@ -63260,7 +63400,7 @@ function createTypeChecker(host) { } function getAllPossiblePropertiesOfTypes(types) { const unionType = getUnionType(types); - if (!(unionType.flags & 1048576 /* Union */)) { + if (!(unionType.flags & 134217728 /* Union */)) { return getAugmentedPropertiesOfType(unionType); } const props = createSymbolTable(); @@ -63275,7 +63415,7 @@ function createTypeChecker(host) { return arrayFrom(props.values()); } function getConstraintOfType(type) { - return type.flags & 262144 /* TypeParameter */ ? getConstraintOfTypeParameter(type) : type.flags & 8388608 /* IndexedAccess */ ? getConstraintOfIndexedAccess(type) : type.flags & 16777216 /* Conditional */ ? getConstraintOfConditionalType(type) : getBaseConstraintOfType(type); + return type.flags & 524288 /* TypeParameter */ ? getConstraintOfTypeParameter(type) : type.flags & 33554432 /* IndexedAccess */ ? getConstraintOfIndexedAccess(type) : type.flags & 67108864 /* Conditional */ ? getConstraintOfConditionalType(type) : getBaseConstraintOfType(type); } function getConstraintOfTypeParameter(typeParameter) { return hasNonCircularBaseConstraint(typeParameter) ? getConstraintFromTypeParameter(typeParameter) : void 0; @@ -63286,7 +63426,7 @@ function createTypeChecker(host) { } function isConstTypeVariable(type, depth = 0) { var _a; - return depth < 5 && !!(type && (type.flags & 262144 /* TypeParameter */ && some((_a = type.symbol) == null ? void 0 : _a.declarations, (d) => hasSyntacticModifier(d, 4096 /* Const */)) || type.flags & 3145728 /* UnionOrIntersection */ && some(type.types, (t) => isConstTypeVariable(t, depth)) || type.flags & 8388608 /* IndexedAccess */ && isConstTypeVariable(type.objectType, depth + 1) || type.flags & 16777216 /* Conditional */ && isConstTypeVariable(getConstraintOfConditionalType(type), depth + 1) || type.flags & 33554432 /* Substitution */ && isConstTypeVariable(type.baseType, depth) || getObjectFlags(type) & 32 /* Mapped */ && isConstMappedType(type, depth) || isGenericTupleType(type) && findIndex(getElementTypes(type), (t, i) => !!(type.target.elementFlags[i] & 8 /* Variadic */) && isConstTypeVariable(t, depth)) >= 0)); + return depth < 5 && !!(type && (type.flags & 524288 /* TypeParameter */ && some((_a = type.symbol) == null ? void 0 : _a.declarations, (d) => hasSyntacticModifier(d, 4096 /* Const */)) || type.flags & 402653184 /* UnionOrIntersection */ && some(type.types, (t) => isConstTypeVariable(t, depth)) || type.flags & 33554432 /* IndexedAccess */ && isConstTypeVariable(type.objectType, depth + 1) || type.flags & 67108864 /* Conditional */ && isConstTypeVariable(getConstraintOfConditionalType(type), depth + 1) || type.flags & 16777216 /* Substitution */ && isConstTypeVariable(type.baseType, depth) || getObjectFlags(type) & 32 /* Mapped */ && isConstMappedType(type, depth) || isGenericTupleType(type) && findIndex(getElementTypes(type), (t, i) => !!(type.target.elementFlags[i] & 8 /* Variadic */) && isConstTypeVariable(t, depth)) >= 0)); } function getConstraintOfIndexedAccess(type) { return hasNonCircularBaseConstraint(type) ? getConstraintFromIndexedAccess(type) : void 0; @@ -63342,7 +63482,7 @@ function createTypeChecker(host) { /*forConstraint*/ true ); - if (!(instantiated.flags & 131072 /* Never */)) { + if (!(instantiated.flags & 262144 /* Never */)) { type.resolvedConstraintOfDistributive = instantiated; return instantiated; } @@ -63361,9 +63501,9 @@ function createTypeChecker(host) { let constraints; let hasDisjointDomainType = false; for (const t of types) { - if (t.flags & 465829888 /* Instantiable */) { + if (t.flags & 132644864 /* Instantiable */) { let constraint = getConstraintOfType(t); - while (constraint && constraint.flags & (262144 /* TypeParameter */ | 4194304 /* Index */ | 16777216 /* Conditional */)) { + while (constraint && constraint.flags & (524288 /* TypeParameter */ | 2097152 /* Index */ | 67108864 /* Conditional */)) { constraint = getConstraintOfType(constraint); } if (constraint) { @@ -63372,14 +63512,14 @@ function createTypeChecker(host) { constraints = append(constraints, t); } } - } else if (t.flags & 469892092 /* DisjointDomains */ || isEmptyAnonymousObjectType(t)) { + } else if (t.flags & 12812284 /* DisjointDomains */ || isEmptyAnonymousObjectType(t)) { hasDisjointDomainType = true; } } if (constraints && (targetIsUnion || hasDisjointDomainType)) { if (hasDisjointDomainType) { for (const t of types) { - if (t.flags & 469892092 /* DisjointDomains */ || isEmptyAnonymousObjectType(t)) { + if (t.flags & 12812284 /* DisjointDomains */ || isEmptyAnonymousObjectType(t)) { constraints = append(constraints, t); } } @@ -63393,11 +63533,11 @@ function createTypeChecker(host) { return void 0; } function getBaseConstraintOfType(type) { - if (type.flags & (58982400 /* InstantiableNonPrimitive */ | 3145728 /* UnionOrIntersection */ | 134217728 /* TemplateLiteral */ | 268435456 /* StringMapping */) || isGenericTupleType(type)) { + if (type.flags & (117964800 /* InstantiableNonPrimitive */ | 402653184 /* UnionOrIntersection */ | 4194304 /* TemplateLiteral */ | 8388608 /* StringMapping */) || isGenericTupleType(type)) { const constraint = getResolvedBaseConstraint(type); return constraint !== noConstraintType && constraint !== circularConstraintType ? constraint : void 0; } - return type.flags & 4194304 /* Index */ ? stringNumberSymbolType : void 0; + return type.flags & 2097152 /* Index */ ? stringNumberSymbolType : void 0; } function getBaseConstraintOrType(type) { return getBaseConstraintOfType(type) || type; @@ -63428,7 +63568,7 @@ function createTypeChecker(host) { stack.pop(); } if (!popTypeResolution()) { - if (t.flags & 262144 /* TypeParameter */) { + if (t.flags & 524288 /* TypeParameter */) { const errorNode = getConstraintDeclaration(t); if (errorNode) { const diagnostic = error2(errorNode, Diagnostics.Type_parameter_0_has_a_circular_constraint, typeToString(t)); @@ -63448,11 +63588,11 @@ function createTypeChecker(host) { return c !== noConstraintType && c !== circularConstraintType ? c : void 0; } function computeBaseConstraint(t) { - if (t.flags & 262144 /* TypeParameter */) { + if (t.flags & 524288 /* TypeParameter */) { const constraint = getConstraintFromTypeParameter(t); return t.isThisType || !constraint ? constraint : getBaseConstraint(constraint); } - if (t.flags & 3145728 /* UnionOrIntersection */) { + if (t.flags & 402653184 /* UnionOrIntersection */) { const types = t.types; const baseTypes = []; let different = false; @@ -63470,21 +63610,27 @@ function createTypeChecker(host) { if (!different) { return t; } - return t.flags & 1048576 /* Union */ && baseTypes.length === types.length ? getUnionType(baseTypes) : t.flags & 2097152 /* Intersection */ && baseTypes.length ? getIntersectionType(baseTypes) : void 0; + return t.flags & 134217728 /* Union */ && baseTypes.length === types.length ? getUnionType(baseTypes) : t.flags & 268435456 /* Intersection */ && baseTypes.length ? getIntersectionType(baseTypes) : void 0; } - if (t.flags & 4194304 /* Index */) { + if (t.flags & 2097152 /* Index */) { + if (isGenericMappedType(t.type)) { + const mappedType = t.type; + if (getNameTypeFromMappedType(mappedType) && !isMappedTypeWithKeyofConstraintDeclaration(mappedType)) { + return getBaseConstraint(getIndexTypeForMappedType(mappedType, 0 /* None */)); + } + } return stringNumberSymbolType; } - if (t.flags & 134217728 /* TemplateLiteral */) { + if (t.flags & 4194304 /* TemplateLiteral */) { const types = t.types; const constraints = mapDefined(types, getBaseConstraint); return constraints.length === types.length ? getTemplateLiteralType(t.texts, constraints) : stringType; } - if (t.flags & 268435456 /* StringMapping */) { + if (t.flags & 8388608 /* StringMapping */) { const constraint = getBaseConstraint(t.type); return constraint && constraint !== t.type ? getStringMappingType(t.symbol, constraint) : stringType; } - if (t.flags & 8388608 /* IndexedAccess */) { + if (t.flags & 33554432 /* IndexedAccess */) { if (isMappedTypeGenericIndexedAccess(t)) { return getBaseConstraint(substituteIndexedMappedType(t.objectType, t.indexType)); } @@ -63493,16 +63639,16 @@ function createTypeChecker(host) { const baseIndexedAccess = baseObjectType && baseIndexType && getIndexedAccessTypeOrUndefined(baseObjectType, baseIndexType, t.accessFlags); return baseIndexedAccess && getBaseConstraint(baseIndexedAccess); } - if (t.flags & 16777216 /* Conditional */) { + if (t.flags & 67108864 /* Conditional */) { const constraint = getConstraintFromConditionalType(t); return constraint && getBaseConstraint(constraint); } - if (t.flags & 33554432 /* Substitution */) { + if (t.flags & 16777216 /* Substitution */) { return getBaseConstraint(getSubstitutionIntersection(t)); } if (isGenericTupleType(t)) { const newElements = map(getElementTypes(t), (v, i) => { - const constraint = v.flags & 262144 /* TypeParameter */ && t.target.elementFlags[i] & 8 /* Variadic */ && getBaseConstraint(v) || v; + const constraint = v.flags & 524288 /* TypeParameter */ && t.target.elementFlags[i] & 8 /* Variadic */ && getBaseConstraint(v) || v; return constraint !== v && everyType(constraint, (c) => isArrayOrTupleType(c) && !isGenericTupleType(c)) ? constraint : v; }); return createTupleType(newElements, t.target.elementFlags, t.target.readonly, t.target.labeledElementDeclarations); @@ -63571,16 +63717,16 @@ function createTypeChecker(host) { return type; } function isArrayOrTupleOrIntersection(type) { - return !!(type.flags & 2097152 /* Intersection */) && every(type.types, isArrayOrTupleType); + return !!(type.flags & 268435456 /* Intersection */) && every(type.types, isArrayOrTupleType); } function isMappedTypeGenericIndexedAccess(type) { let objectType; - return !!(type.flags & 8388608 /* IndexedAccess */ && getObjectFlags(objectType = type.objectType) & 32 /* Mapped */ && !isGenericMappedType(objectType) && isGenericIndexType(type.indexType) && !(getMappedTypeModifiers(objectType) & 8 /* ExcludeOptional */) && !objectType.declaration.nameType); + return !!(type.flags & 33554432 /* IndexedAccess */ && getObjectFlags(objectType = type.objectType) & 32 /* Mapped */ && !isGenericMappedType(objectType) && isGenericIndexType(type.indexType) && !(getMappedTypeModifiers(objectType) & 8 /* ExcludeOptional */) && !objectType.declaration.nameType); } function getApparentType(type) { - const t = type.flags & 465829888 /* Instantiable */ ? getBaseConstraintOfType(type) || unknownType : type; + const t = type.flags & 132644864 /* Instantiable */ ? getBaseConstraintOfType(type) || unknownType : type; const objectFlags = getObjectFlags(t); - return objectFlags & 32 /* Mapped */ ? getApparentTypeOfMappedType(t) : objectFlags & 4 /* Reference */ && t !== type ? getTypeWithThisArgument(t, type) : t.flags & 2097152 /* Intersection */ ? getApparentTypeOfIntersectionType(t, type) : t.flags & 402653316 /* StringLike */ ? globalStringType : t.flags & 296 /* NumberLike */ ? globalNumberType : t.flags & 2112 /* BigIntLike */ ? getGlobalBigIntType() : t.flags & 528 /* BooleanLike */ ? globalBooleanType : t.flags & 12288 /* ESSymbolLike */ ? getGlobalESSymbolType() : t.flags & 67108864 /* NonPrimitive */ ? emptyObjectType : t.flags & 4194304 /* Index */ ? stringNumberSymbolType : t.flags & 2 /* Unknown */ && !strictNullChecks ? emptyObjectType : t; + return objectFlags & 32 /* Mapped */ ? getApparentTypeOfMappedType(t) : objectFlags & 4 /* Reference */ && t !== type ? getTypeWithThisArgument(t, type) : t.flags & 268435456 /* Intersection */ ? getApparentTypeOfIntersectionType(t, type) : t.flags & 12583968 /* StringLike */ ? globalStringType : t.flags & 67648 /* NumberLike */ ? globalNumberType : t.flags & 4224 /* BigIntLike */ ? getGlobalBigIntType() : t.flags & 8448 /* BooleanLike */ ? globalBooleanType : t.flags & 16896 /* ESSymbolLike */ ? getGlobalESSymbolType() : t.flags & 131072 /* NonPrimitive */ ? emptyObjectType : t.flags & 2097152 /* Index */ ? stringNumberSymbolType : t.flags & 2 /* Unknown */ && !strictNullChecks ? emptyObjectType : t; } function getReducedApparentType(type) { return getReducedType(getApparentType(getReducedType(type))); @@ -63591,14 +63737,14 @@ function createTypeChecker(host) { let singleProp; let propSet; let indexTypes; - const isUnion = containingType.flags & 1048576 /* Union */; + const isUnion = containingType.flags & 134217728 /* Union */; let optionalFlag; let syntheticFlag = 4 /* SyntheticMethod */; let checkFlags = isUnion ? 0 : 8 /* Readonly */; let mergedInstantiations = false; for (const current of containingType.types) { const type = getApparentType(current); - if (!(isErrorType(type) || type.flags & 131072 /* Never */)) { + if (!(isErrorType(type) || type.flags & 262144 /* Never */)) { const prop = getPropertyOfType(type, name, skipObjectFunctionPropertyAugment); const modifiers = prop ? getDeclarationModifierFlagsFromSymbol(prop) : 0; if (prop) { @@ -63701,7 +63847,7 @@ function createTypeChecker(host) { if (isLiteralType(type) || isPatternLiteralType(type)) { checkFlags |= 128 /* HasLiteralType */; } - if (type.flags & 131072 /* Never */ && type !== uniqueLiteralType) { + if (type.flags & 262144 /* Never */ && type !== uniqueLiteralType) { checkFlags |= 131072 /* HasNeverType */; } propTypes.push(type); @@ -63772,9 +63918,9 @@ function createTypeChecker(host) { return property && !(getCheckFlags(property) & 16 /* ReadPartial */) ? property : void 0; } function getReducedType(type) { - if (type.flags & 1048576 /* Union */ && type.objectFlags & 16777216 /* ContainsIntersections */) { + if (type.flags & 134217728 /* Union */ && type.objectFlags & 16777216 /* ContainsIntersections */) { return type.resolvedReducedType || (type.resolvedReducedType = getReducedUnionType(type)); - } else if (type.flags & 2097152 /* Intersection */) { + } else if (type.flags & 268435456 /* Intersection */) { if (!(type.objectFlags & 16777216 /* IsNeverIntersectionComputed */)) { type.objectFlags |= 16777216 /* IsNeverIntersectionComputed */ | (some(getPropertiesOfUnionOrIntersectionType(type), isNeverReducedProperty) ? 33554432 /* IsNeverIntersection */ : 0); } @@ -63788,7 +63934,7 @@ function createTypeChecker(host) { return unionType; } const reduced = getUnionType(reducedTypes); - if (reduced.flags & 1048576 /* Union */) { + if (reduced.flags & 134217728 /* Union */) { reduced.resolvedReducedType = reduced; } return reduced; @@ -63797,20 +63943,20 @@ function createTypeChecker(host) { return isDiscriminantWithNeverType(prop) || isConflictingPrivateProperty(prop); } function isDiscriminantWithNeverType(prop) { - return !(prop.flags & 16777216 /* Optional */) && (getCheckFlags(prop) & (192 /* Discriminant */ | 131072 /* HasNeverType */)) === 192 /* Discriminant */ && !!(getTypeOfSymbol(prop).flags & 131072 /* Never */); + return !(prop.flags & 16777216 /* Optional */) && (getCheckFlags(prop) & (192 /* Discriminant */ | 131072 /* HasNeverType */)) === 192 /* Discriminant */ && !!(getTypeOfSymbol(prop).flags & 262144 /* Never */); } function isConflictingPrivateProperty(prop) { return !prop.valueDeclaration && !!(getCheckFlags(prop) & 1024 /* ContainsPrivate */); } function isGenericReducibleType(type) { - return !!(type.flags & 1048576 /* Union */ && type.objectFlags & 16777216 /* ContainsIntersections */ && some(type.types, isGenericReducibleType) || type.flags & 2097152 /* Intersection */ && isReducibleIntersection(type)); + return !!(type.flags & 134217728 /* Union */ && type.objectFlags & 16777216 /* ContainsIntersections */ && some(type.types, isGenericReducibleType) || type.flags & 268435456 /* Intersection */ && isReducibleIntersection(type)); } function isReducibleIntersection(type) { const uniqueFilled = type.uniqueLiteralFilledInstantiation || (type.uniqueLiteralFilledInstantiation = instantiateType(type, uniqueLiteralMapper)); return getReducedType(uniqueFilled) !== uniqueFilled; } function elaborateNeverIntersection(errorInfo, type) { - if (type.flags & 2097152 /* Intersection */ && getObjectFlags(type) & 33554432 /* IsNeverIntersection */) { + if (type.flags & 268435456 /* Intersection */ && getObjectFlags(type) & 33554432 /* IsNeverIntersection */) { const neverProp = find(getPropertiesOfUnionOrIntersectionType(type), isDiscriminantWithNeverType); if (neverProp) { return chainDiagnosticMessages(errorInfo, Diagnostics.The_intersection_0_was_reduced_to_never_because_property_1_has_conflicting_types_in_some_constituents, typeToString( @@ -63835,7 +63981,7 @@ function createTypeChecker(host) { function getPropertyOfType(type, name, skipObjectFunctionPropertyAugment, includeTypeOnlyMembers) { var _a, _b; type = getReducedApparentType(type); - if (type.flags & 524288 /* Object */) { + if (type.flags & 1048576 /* Object */) { const resolved = resolveStructuredTypeMembers(type); const symbol = resolved.members.get(name); if (symbol && !includeTypeOnlyMembers && ((_a = type.symbol) == null ? void 0 : _a.flags) & 512 /* ValueModule */ && ((_b = getSymbolLinks(type.symbol).typeOnlyExportStarMap) == null ? void 0 : _b.has(name))) { @@ -63854,7 +64000,7 @@ function createTypeChecker(host) { } return getPropertyOfObjectType(globalObjectType, name); } - if (type.flags & 2097152 /* Intersection */) { + if (type.flags & 268435456 /* Intersection */) { const prop = getPropertyOfUnionOrIntersectionType( type, name, @@ -63869,13 +64015,13 @@ function createTypeChecker(host) { } return void 0; } - if (type.flags & 1048576 /* Union */) { + if (type.flags & 134217728 /* Union */) { return getPropertyOfUnionOrIntersectionType(type, name, skipObjectFunctionPropertyAugment); } return void 0; } function getSignaturesOfStructuredType(type, kind) { - if (type.flags & 3670016 /* StructuredType */) { + if (type.flags & 403701760 /* StructuredType */) { const resolved = resolveStructuredTypeMembers(type); return kind === 0 /* Call */ ? resolved.callSignatures : resolved.constructSignatures; } @@ -63883,7 +64029,7 @@ function createTypeChecker(host) { } function getSignaturesOfType(type, kind) { const result = getSignaturesOfStructuredType(getReducedApparentType(type), kind); - if (kind === 0 /* Call */ && !length(result) && type.flags & 1048576 /* Union */) { + if (kind === 0 /* Call */ && !length(result) && type.flags & 134217728 /* Union */) { if (type.arrayFallbackSignatures) { return type.arrayFallbackSignatures; } @@ -63938,10 +64084,10 @@ function createTypeChecker(host) { )) : applicableInfo ? applicableInfo : stringIndexInfo && isApplicableIndexType(keyType, stringType) ? stringIndexInfo : void 0; } function isApplicableIndexType(source, target) { - return isTypeAssignableTo(source, target) || target === stringType && isTypeAssignableTo(source, numberType) || target === numberType && (source === numericStringType || !!(source.flags & 128 /* StringLiteral */) && isNumericLiteralName(source.value)); + return isTypeAssignableTo(source, target) || target === stringType && isTypeAssignableTo(source, numberType) || target === numberType && (source === numericStringType || !!(source.flags & 1024 /* StringLiteral */) && isNumericLiteralName(source.value)); } function getIndexInfosOfStructuredType(type) { - if (type.flags & 3670016 /* StructuredType */) { + if (type.flags & 403701760 /* StructuredType */) { const resolved = resolveStructuredTypeMembers(type); return resolved.indexInfos; } @@ -64267,7 +64413,7 @@ function createTypeChecker(host) { } if (type || jsdocPredicate) { signature.resolvedTypePredicate = type && isTypePredicateNode(type) ? createTypePredicateFromTypePredicateNode(type, signature) : jsdocPredicate || noTypePredicate; - } else if (signature.declaration && isFunctionLikeDeclaration(signature.declaration) && (!signature.resolvedReturnType || signature.resolvedReturnType.flags & 16 /* Boolean */) && getParameterCount(signature) > 0) { + } else if (signature.declaration && isFunctionLikeDeclaration(signature.declaration) && (!signature.resolvedReturnType || signature.resolvedReturnType.flags & 256 /* Boolean */) && getParameterCount(signature) > 0) { const { declaration } = signature; signature.resolvedTypePredicate = noTypePredicate; signature.resolvedTypePredicate = getTypePredicateFromBody(declaration) || noTypePredicate; @@ -64292,7 +64438,7 @@ function createTypeChecker(host) { ) : createTypePredicate(node.assertsModifier ? 3 /* AssertsIdentifier */ : 1 /* Identifier */, parameterName.escapedText, findIndex(signature.parameters, (p) => p.escapedName === parameterName.escapedText), type); } function getUnionOrIntersectionType(types, kind, unionReduction) { - return kind !== 2097152 /* Intersection */ ? getUnionType(types, unionReduction) : getIntersectionType(types); + return kind !== 268435456 /* Intersection */ ? getUnionType(types, unionReduction) : getIntersectionType(types); } function getReturnTypeOfSignature(signature) { if (!signature.resolvedReturnType) { @@ -64538,7 +64684,7 @@ function createTypeChecker(host) { return emptyArray; } function isValidIndexKeyType(type) { - return !!(type.flags & (4 /* String */ | 8 /* Number */ | 4096 /* ESSymbol */)) || isPatternLiteralType(type) || !!(type.flags & 2097152 /* Intersection */) && !isGenericType(type) && some(type.types, isValidIndexKeyType); + return !!(type.flags & (32 /* String */ | 64 /* Number */ | 512 /* ESSymbol */)) || isPatternLiteralType(type) || !!(type.flags & 268435456 /* Intersection */) && !isGenericType(type) && some(type.types, isValidIndexKeyType); } function getConstraintDeclaration(type) { return mapDefined(filter(type.symbol && type.symbol.declarations, isTypeParameterDeclaration), getEffectiveConstraintOfTypeParameter)[0]; @@ -64909,10 +65055,10 @@ function createTypeChecker(host) { return isNoInferTargetType(type) ? getOrCreateSubstitutionType(type, unknownType) : type; } function isNoInferTargetType(type) { - return !!(type.flags & 3145728 /* UnionOrIntersection */ && some(type.types, isNoInferTargetType) || type.flags & 33554432 /* Substitution */ && !isNoInferType(type) && isNoInferTargetType(type.baseType) || type.flags & 524288 /* Object */ && !isEmptyAnonymousObjectType(type) || type.flags & (465829888 /* Instantiable */ & ~33554432 /* Substitution */) && !isPatternLiteralType(type)); + return !!(type.flags & 402653184 /* UnionOrIntersection */ && some(type.types, isNoInferTargetType) || type.flags & 16777216 /* Substitution */ && !isNoInferType(type) && isNoInferTargetType(type.baseType) || type.flags & 1048576 /* Object */ && !isEmptyAnonymousObjectType(type) || type.flags & (132644864 /* Instantiable */ & ~16777216 /* Substitution */) && !isPatternLiteralType(type)); } function isNoInferType(type) { - return !!(type.flags & 33554432 /* Substitution */ && type.constraint.flags & 2 /* Unknown */); + return !!(type.flags & 16777216 /* Substitution */ && type.constraint.flags & 2 /* Unknown */); } function getSubstitutionType(baseType, constraint) { return constraint.flags & 3 /* AnyOrUnknown */ || constraint === baseType || baseType.flags & 1 /* Any */ ? baseType : getOrCreateSubstitutionType(baseType, constraint); @@ -64923,7 +65069,7 @@ function createTypeChecker(host) { if (cached) { return cached; } - const result = createType(33554432 /* Substitution */); + const result = createType(16777216 /* Substitution */); result.baseType = baseType; result.constraint = constraint; substitutionTypes.set(id, result); @@ -64946,12 +65092,12 @@ function createTypeChecker(host) { if (parent2.kind === 170 /* Parameter */) { covariant = !covariant; } - if ((covariant || type.flags & 8650752 /* TypeVariable */) && parent2.kind === 195 /* ConditionalType */ && node === parent2.trueType) { + if ((covariant || type.flags & 34078720 /* TypeVariable */) && parent2.kind === 195 /* ConditionalType */ && node === parent2.trueType) { const constraint = getImpliedConstraint(type, parent2.checkType, parent2.extendsType); if (constraint) { constraints = append(constraints, constraint); } - } else if (type.flags & 262144 /* TypeParameter */ && parent2.kind === 201 /* MappedType */ && !parent2.nameType && node === parent2.type) { + } else if (type.flags & 524288 /* TypeParameter */ && parent2.kind === 201 /* MappedType */ && !parent2.nameType && node === parent2.type) { const mappedType = getTypeFromTypeNode(parent2); if (getTypeParameterFromMappedType(mappedType) === getActualTypeVariable(type)) { const typeParameter = getHomomorphicTypeVariable(mappedType); @@ -65039,7 +65185,7 @@ function createTypeChecker(host) { } function getTypeFromJSDocNullableTypeNode(node) { const type = getTypeFromTypeNode(node.type); - return strictNullChecks ? getNullableType(type, 65536 /* Null */) : type; + return strictNullChecks ? getNullableType(type, 8 /* Null */) : type; } function getTypeFromTypeReference(node) { const links = getNodeLinks(node); @@ -65106,7 +65252,7 @@ function createTypeChecker(host) { return arity ? emptyGenericType : emptyObjectType; } const type = getDeclaredTypeOfSymbol(symbol); - if (!(type.flags & 524288 /* Object */)) { + if (!(type.flags & 1048576 /* Object */)) { error2(getTypeDeclaration(symbol), Diagnostics.Global_type_0_must_be_a_class_or_interface_type, symbolName(symbol)); return arity ? emptyGenericType : emptyObjectType; } @@ -65703,7 +65849,7 @@ function createTypeChecker(host) { return createTypeReference(target, elementTypes); } if (target.combinedFlags & 8 /* Variadic */) { - const unionIndex = findIndex(elementTypes, (t, i) => !!(target.elementFlags[i] & 8 /* Variadic */ && t.flags & (131072 /* Never */ | 1048576 /* Union */))); + const unionIndex = findIndex(elementTypes, (t, i) => !!(target.elementFlags[i] & 8 /* Variadic */ && t.flags & (262144 /* Never */ | 134217728 /* Union */))); if (unionIndex >= 0) { return checkCrossProductUnion(map(elementTypes, (t, i) => target.elementFlags[i] & 8 /* Variadic */ ? t : unknownType)) ? mapType(elementTypes[unionIndex], (t) => createNormalizedTupleType(target, replaceElement(elementTypes, unionIndex, t))) : errorType; } @@ -65720,7 +65866,7 @@ function createTypeChecker(host) { if (flags & 8 /* Variadic */) { if (type.flags & 1 /* Any */) { addElement(type, 4 /* Rest */, (_a = target.labeledElementDeclarations) == null ? void 0 : _a[i]); - } else if (type.flags & 58982400 /* InstantiableNonPrimitive */ || isGenericMappedType(type)) { + } else if (type.flags & 117964800 /* InstantiableNonPrimitive */ || isGenericMappedType(type)) { addElement(type, 8 /* Variadic */, (_b = target.labeledElementDeclarations) == null ? void 0 : _b[i]); } else if (isTupleType(type)) { const elements = getElementTypes(type); @@ -65812,10 +65958,10 @@ function createTypeChecker(host) { return type.id; } function containsType(types, type) { - return binarySearch(types, type, getTypeId, compareValues) >= 0; + return stableTypeOrdering ? binarySearch(types, type, identity, compareTypes) >= 0 : binarySearch(types, type, getTypeId, compareValues) >= 0; } function insertType(types, type) { - const index = binarySearch(types, type, getTypeId, compareValues); + const index = stableTypeOrdering ? binarySearch(types, type, identity, compareTypes) : binarySearch(types, type, getTypeId, compareValues); if (index < 0) { types.splice(~index, 0, type); return true; @@ -65824,17 +65970,17 @@ function createTypeChecker(host) { } function addTypeToUnion(typeSet, includes, type) { const flags = type.flags; - if (!(flags & 131072 /* Never */)) { - includes |= flags & 473694207 /* IncludesMask */; - if (flags & 465829888 /* Instantiable */) includes |= 33554432 /* IncludesInstantiable */; - if (flags & 2097152 /* Intersection */ && getObjectFlags(type) & 67108864 /* IsConstrainedTypeVariable */) includes |= 536870912 /* IncludesConstrainedTypeVariable */; - if (type === wildcardType) includes |= 8388608 /* IncludesWildcard */; + if (!(flags & 262144 /* Never */)) { + includes |= flags & 416808959 /* IncludesMask */; + if (flags & 132644864 /* Instantiable */) includes |= 16777216 /* IncludesInstantiable */; + if (flags & 268435456 /* Intersection */ && getObjectFlags(type) & 67108864 /* IsConstrainedTypeVariable */) includes |= 536870912 /* IncludesConstrainedTypeVariable */; + if (type === wildcardType) includes |= 33554432 /* IncludesWildcard */; if (isErrorType(type)) includes |= 1073741824 /* IncludesError */; - if (!strictNullChecks && flags & 98304 /* Nullable */) { - if (!(getObjectFlags(type) & 65536 /* ContainsWideningType */)) includes |= 4194304 /* IncludesNonWideningType */; + if (!strictNullChecks && flags & 12 /* Nullable */) { + if (!(getObjectFlags(type) & 65536 /* ContainsWideningType */)) includes |= 2097152 /* IncludesNonWideningType */; } else { const len = typeSet.length; - const index = len && type.id > typeSet[len - 1].id ? ~len : binarySearch(typeSet, type, getTypeId, compareValues); + const index = stableTypeOrdering ? binarySearch(typeSet, type, identity, compareTypes) : len && type.id > typeSet[len - 1].id ? ~len : binarySearch(typeSet, type, getTypeId, compareValues); if (index < 0) { typeSet.splice(~index, 0, type); } @@ -65846,7 +65992,7 @@ function createTypeChecker(host) { let lastType; for (const type of types) { if (type !== lastType) { - includes = type.flags & 1048576 /* Union */ ? addTypesToUnion(typeSet, includes | (isNamedUnionType(type) ? 1048576 /* Union */ : 0), type.types) : addTypeToUnion(typeSet, includes, type); + includes = type.flags & 134217728 /* Union */ ? addTypesToUnion(typeSet, includes | (isNamedUnionType(type) ? 134217728 /* Union */ : 0), type.types) : addTypeToUnion(typeSet, includes, type); lastType = type; } } @@ -65862,21 +66008,21 @@ function createTypeChecker(host) { if (match) { return match; } - const hasEmptyObject = hasObjectTypes && some(types, (t) => !!(t.flags & 524288 /* Object */) && !isGenericMappedType(t) && isEmptyResolvedType(resolveStructuredTypeMembers(t))); + const hasEmptyObject = hasObjectTypes && some(types, (t) => !!(t.flags & 1048576 /* Object */) && !isGenericMappedType(t) && isEmptyResolvedType(resolveStructuredTypeMembers(t))); const len = types.length; let i = len; let count = 0; while (i > 0) { i--; const source = types[i]; - if (hasEmptyObject || source.flags & 469499904 /* StructuredOrInstantiable */) { - if (source.flags & 262144 /* TypeParameter */ && getBaseConstraintOrType(source).flags & 1048576 /* Union */) { + if (hasEmptyObject || source.flags & 536346624 /* StructuredOrInstantiable */) { + if (source.flags & 524288 /* TypeParameter */ && getBaseConstraintOrType(source).flags & 134217728 /* Union */) { if (isTypeRelatedTo(source, getUnionType(map(types, (t) => t === source ? neverType : t)), strictSubtypeRelation)) { orderedRemoveItemAt(types, i); } continue; } - const keyProperty = source.flags & (524288 /* Object */ | 2097152 /* Intersection */ | 58982400 /* InstantiableNonPrimitive */) ? find(getPropertiesOfType(source), (p) => isUnitType(getTypeOfSymbol(p))) : void 0; + const keyProperty = source.flags & (1048576 /* Object */ | 268435456 /* Intersection */ | 117964800 /* InstantiableNonPrimitive */) ? find(getPropertiesOfType(source), (p) => isUnitType(getTypeOfSymbol(p))) : void 0; const keyPropertyType = keyProperty && getRegularTypeOfLiteralType(getTypeOfSymbol(keyProperty)); for (const target of types) { if (source !== target) { @@ -65889,7 +66035,7 @@ function createTypeChecker(host) { } } count++; - if (keyProperty && target.flags & (524288 /* Object */ | 2097152 /* Intersection */ | 58982400 /* InstantiableNonPrimitive */)) { + if (keyProperty && target.flags & (1048576 /* Object */ | 268435456 /* Intersection */ | 117964800 /* InstantiableNonPrimitive */)) { const t = getTypeOfPropertyOfType(target, keyProperty.escapedName); if (t && isUnitType(t) && getRegularTypeOfLiteralType(t) !== keyPropertyType) { continue; @@ -65912,7 +66058,7 @@ function createTypeChecker(host) { i--; const t = types[i]; const flags = t.flags; - const remove = flags & (128 /* StringLiteral */ | 134217728 /* TemplateLiteral */ | 268435456 /* StringMapping */) && includes & 4 /* String */ || flags & 256 /* NumberLiteral */ && includes & 8 /* Number */ || flags & 2048 /* BigIntLiteral */ && includes & 64 /* BigInt */ || flags & 8192 /* UniqueESSymbol */ && includes & 4096 /* ESSymbol */ || reduceVoidUndefined && flags & 32768 /* Undefined */ && includes & 16384 /* Void */ || isFreshLiteralType(t) && containsType(types, t.regularType); + const remove = flags & (1024 /* StringLiteral */ | 4194304 /* TemplateLiteral */ | 8388608 /* StringMapping */) && includes & 32 /* String */ || flags & 2048 /* NumberLiteral */ && includes & 64 /* Number */ || flags & 4096 /* BigIntLiteral */ && includes & 128 /* BigInt */ || flags & 16384 /* UniqueESSymbol */ && includes & 512 /* ESSymbol */ || reduceVoidUndefined && flags & 4 /* Undefined */ && includes & 16 /* Void */ || isFreshLiteralType(t) && containsType(types, t.regularType); if (remove) { orderedRemoveItemAt(types, i); } @@ -65925,28 +66071,28 @@ function createTypeChecker(host) { while (i > 0) { i--; const t = types[i]; - if (t.flags & 128 /* StringLiteral */ && some(templates, (template) => isTypeMatchedByTemplateLiteralOrStringMapping(t, template))) { + if (t.flags & 1024 /* StringLiteral */ && some(templates, (template) => isTypeMatchedByTemplateLiteralOrStringMapping(t, template))) { orderedRemoveItemAt(types, i); } } } } function isTypeMatchedByTemplateLiteralOrStringMapping(type, template) { - return template.flags & 134217728 /* TemplateLiteral */ ? isTypeMatchedByTemplateLiteralType(type, template) : isMemberOfStringMapping(type, template); + return template.flags & 4194304 /* TemplateLiteral */ ? isTypeMatchedByTemplateLiteralType(type, template) : isMemberOfStringMapping(type, template); } function removeConstrainedTypeVariables(types) { const typeVariables = []; for (const type of types) { - if (type.flags & 2097152 /* Intersection */ && getObjectFlags(type) & 67108864 /* IsConstrainedTypeVariable */) { - const index = type.types[0].flags & 8650752 /* TypeVariable */ ? 0 : 1; + if (type.flags & 268435456 /* Intersection */ && getObjectFlags(type) & 67108864 /* IsConstrainedTypeVariable */) { + const index = type.types[0].flags & 34078720 /* TypeVariable */ ? 0 : 1; pushIfUnique(typeVariables, type.types[index]); } } for (const typeVariable of typeVariables) { const primitives = []; for (const type of types) { - if (type.flags & 2097152 /* Intersection */ && getObjectFlags(type) & 67108864 /* IsConstrainedTypeVariable */) { - const index = type.types[0].flags & 8650752 /* TypeVariable */ ? 0 : 1; + if (type.flags & 268435456 /* Intersection */ && getObjectFlags(type) & 67108864 /* IsConstrainedTypeVariable */) { + const index = type.types[0].flags & 34078720 /* TypeVariable */ ? 0 : 1; if (type.types[index] === typeVariable) { insertType(primitives, type.types[1 - index]); } @@ -65958,8 +66104,8 @@ function createTypeChecker(host) { while (i > 0) { i--; const type = types[i]; - if (type.flags & 2097152 /* Intersection */ && getObjectFlags(type) & 67108864 /* IsConstrainedTypeVariable */) { - const index = type.types[0].flags & 8650752 /* TypeVariable */ ? 0 : 1; + if (type.flags & 268435456 /* Intersection */ && getObjectFlags(type) & 67108864 /* IsConstrainedTypeVariable */) { + const index = type.types[0].flags & 34078720 /* TypeVariable */ ? 0 : 1; if (type.types[index] === typeVariable && containsType(primitives, type.types[1 - index])) { orderedRemoveItemAt(types, i); } @@ -65970,15 +66116,15 @@ function createTypeChecker(host) { } } function isNamedUnionType(type) { - return !!(type.flags & 1048576 /* Union */ && (type.aliasSymbol || type.origin)); + return !!(type.flags & 134217728 /* Union */ && (type.aliasSymbol || type.origin)); } function addNamedUnions(namedUnions, types) { for (const t of types) { - if (t.flags & 1048576 /* Union */) { + if (t.flags & 134217728 /* Union */) { const origin = t.origin; - if (t.aliasSymbol || origin && !(origin.flags & 1048576 /* Union */)) { + if (t.aliasSymbol || origin && !(origin.flags & 134217728 /* Union */)) { pushIfUnique(namedUnions, t); - } else if (origin && origin.flags & 1048576 /* Union */) { + } else if (origin && origin.flags & 134217728 /* Union */) { addNamedUnions(namedUnions, origin.types); } } @@ -65996,7 +66142,7 @@ function createTypeChecker(host) { if (types.length === 1) { return types[0]; } - if (types.length === 2 && !origin && (types[0].flags & 1048576 /* Union */ || types[1].flags & 1048576 /* Union */)) { + if (types.length === 2 && !origin && (types[0].flags & 134217728 /* Union */ || types[1].flags & 134217728 /* Union */)) { const infix = unionReduction === 0 /* None */ ? "N" : unionReduction === 2 /* Subtype */ ? "S" : "L"; const index = types[0].id < types[1].id ? 0 : 1; const id = types[index].id + infix + types[1 - index].id + getAliasId(aliasSymbol, aliasTypeArguments); @@ -66021,33 +66167,33 @@ function createTypeChecker(host) { const includes = addTypesToUnion(typeSet, 0, types); if (unionReduction !== 0 /* None */) { if (includes & 3 /* AnyOrUnknown */) { - return includes & 1 /* Any */ ? includes & 8388608 /* IncludesWildcard */ ? wildcardType : includes & 1073741824 /* IncludesError */ ? errorType : anyType : unknownType; + return includes & 1 /* Any */ ? includes & 33554432 /* IncludesWildcard */ ? wildcardType : includes & 1073741824 /* IncludesError */ ? errorType : anyType : unknownType; } - if (includes & 32768 /* Undefined */) { + if (includes & 4 /* Undefined */) { if (typeSet.length >= 2 && typeSet[0] === undefinedType && typeSet[1] === missingType) { orderedRemoveItemAt(typeSet, 1); } } - if (includes & (32 /* Enum */ | 2944 /* Literal */ | 8192 /* UniqueESSymbol */ | 134217728 /* TemplateLiteral */ | 268435456 /* StringMapping */) || includes & 16384 /* Void */ && includes & 32768 /* Undefined */) { + if (includes & (65536 /* Enum */ | 15360 /* Literal */ | 16384 /* UniqueESSymbol */ | 4194304 /* TemplateLiteral */ | 8388608 /* StringMapping */) || includes & 16 /* Void */ && includes & 4 /* Undefined */) { removeRedundantLiteralTypes(typeSet, includes, !!(unionReduction & 2 /* Subtype */)); } - if (includes & 128 /* StringLiteral */ && includes & (134217728 /* TemplateLiteral */ | 268435456 /* StringMapping */)) { + if (includes & 1024 /* StringLiteral */ && includes & (4194304 /* TemplateLiteral */ | 8388608 /* StringMapping */)) { removeStringLiteralsMatchedByTemplateLiterals(typeSet); } if (includes & 536870912 /* IncludesConstrainedTypeVariable */) { removeConstrainedTypeVariables(typeSet); } if (unionReduction === 2 /* Subtype */) { - typeSet = removeSubtypes(typeSet, !!(includes & 524288 /* Object */)); + typeSet = removeSubtypes(typeSet, !!(includes & 1048576 /* Object */)); if (!typeSet) { return errorType; } } if (typeSet.length === 0) { - return includes & 65536 /* Null */ ? includes & 4194304 /* IncludesNonWideningType */ ? nullType : nullWideningType : includes & 32768 /* Undefined */ ? includes & 4194304 /* IncludesNonWideningType */ ? undefinedType : undefinedWideningType : neverType; + return includes & 8 /* Null */ ? includes & 2097152 /* IncludesNonWideningType */ ? nullType : nullWideningType : includes & 4 /* Undefined */ ? includes & 2097152 /* IncludesNonWideningType */ ? undefinedType : undefinedWideningType : neverType; } } - if (!origin && includes & 1048576 /* Union */) { + if (!origin && includes & 134217728 /* Union */) { const namedUnions = []; addNamedUnions(namedUnions, types); const reducedTypes = []; @@ -66064,10 +66210,10 @@ function createTypeChecker(host) { for (const t of namedUnions) { insertType(reducedTypes, t); } - origin = createOriginUnionOrIntersectionType(1048576 /* Union */, reducedTypes); + origin = createOriginUnionOrIntersectionType(134217728 /* Union */, reducedTypes); } } - const objectFlags = (includes & 36323331 /* NotPrimitiveUnion */ ? 0 : 32768 /* PrimitiveUnion */) | (includes & 2097152 /* Intersection */ ? 16777216 /* ContainsIntersections */ : 0); + const objectFlags = (includes & 286523411 /* NotPrimitiveUnion */ ? 0 : 32768 /* PrimitiveUnion */) | (includes & 268435456 /* Intersection */ ? 16777216 /* ContainsIntersections */ : 0); return getUnionTypeFromSortedList(typeSet, objectFlags, aliasSymbol, aliasTypeArguments, origin); } function getUnionOrIntersectionTypePredicate(signatures, kind) { @@ -66082,7 +66228,7 @@ function createTypeChecker(host) { last2 = pred; types.push(pred.type); } else { - const returnType = kind !== 2097152 /* Intersection */ ? getReturnTypeOfSignature(sig) : void 0; + const returnType = kind !== 268435456 /* Intersection */ ? getReturnTypeOfSignature(sig) : void 0; if (returnType !== falseType && returnType !== regularFalseType) { return void 0; } @@ -66104,22 +66250,22 @@ function createTypeChecker(host) { if (types.length === 1) { return types[0]; } - const typeKey = !origin ? getTypeListId(types) : origin.flags & 1048576 /* Union */ ? `|${getTypeListId(origin.types)}` : origin.flags & 2097152 /* Intersection */ ? `&${getTypeListId(origin.types)}` : `#${origin.type.id}|${getTypeListId(types)}`; + const typeKey = !origin ? getTypeListId(types) : origin.flags & 134217728 /* Union */ ? `|${getTypeListId(origin.types)}` : origin.flags & 268435456 /* Intersection */ ? `&${getTypeListId(origin.types)}` : `#${origin.type.id}|${getTypeListId(types)}`; const id = typeKey + getAliasId(aliasSymbol, aliasTypeArguments); let type = unionTypes.get(id); if (!type) { - type = createType(1048576 /* Union */); + type = createType(134217728 /* Union */); type.objectFlags = precomputedObjectFlags | getPropagatingFlagsOfTypes( types, /*excludeKinds*/ - 98304 /* Nullable */ + 12 /* Nullable */ ); type.types = types; type.origin = origin; type.aliasSymbol = aliasSymbol; type.aliasTypeArguments = aliasTypeArguments; - if (types.length === 2 && types[0].flags & 512 /* BooleanLiteral */ && types[1].flags & 512 /* BooleanLiteral */) { - type.flags |= 16 /* Boolean */; + if (types.length === 2 && types[0].flags & 8192 /* BooleanLiteral */ && types[1].flags & 8192 /* BooleanLiteral */) { + type.flags |= 256 /* Boolean */; type.intrinsicName = "boolean"; } unionTypes.set(id, type); @@ -66136,31 +66282,31 @@ function createTypeChecker(host) { } function addTypeToIntersection(typeSet, includes, type) { const flags = type.flags; - if (flags & 2097152 /* Intersection */) { + if (flags & 268435456 /* Intersection */) { return addTypesToIntersection(typeSet, includes, type.types); } if (isEmptyAnonymousObjectType(type)) { - if (!(includes & 16777216 /* IncludesEmptyObject */)) { - includes |= 16777216 /* IncludesEmptyObject */; + if (!(includes & 67108864 /* IncludesEmptyObject */)) { + includes |= 67108864 /* IncludesEmptyObject */; typeSet.set(type.id.toString(), type); } } else { if (flags & 3 /* AnyOrUnknown */) { - if (type === wildcardType) includes |= 8388608 /* IncludesWildcard */; + if (type === wildcardType) includes |= 33554432 /* IncludesWildcard */; if (isErrorType(type)) includes |= 1073741824 /* IncludesError */; - } else if (strictNullChecks || !(flags & 98304 /* Nullable */)) { + } else if (strictNullChecks || !(flags & 12 /* Nullable */)) { if (type === missingType) { - includes |= 262144 /* IncludesMissingType */; + includes |= 524288 /* IncludesMissingType */; type = undefinedType; } if (!typeSet.has(type.id.toString())) { - if (type.flags & 109472 /* Unit */ && includes & 109472 /* Unit */) { - includes |= 67108864 /* NonPrimitive */; + if (type.flags & 97292 /* Unit */ && includes & 97292 /* Unit */) { + includes |= 131072 /* NonPrimitive */; } typeSet.set(type.id.toString(), type); } } - includes |= flags & 473694207 /* IncludesMask */; + includes |= flags & 416808959 /* IncludesMask */; } return includes; } @@ -66175,7 +66321,7 @@ function createTypeChecker(host) { while (i > 0) { i--; const t = types[i]; - const remove = t.flags & 4 /* String */ && includes & (128 /* StringLiteral */ | 134217728 /* TemplateLiteral */ | 268435456 /* StringMapping */) || t.flags & 8 /* Number */ && includes & 256 /* NumberLiteral */ || t.flags & 64 /* BigInt */ && includes & 2048 /* BigIntLiteral */ || t.flags & 4096 /* ESSymbol */ && includes & 8192 /* UniqueESSymbol */ || t.flags & 16384 /* Void */ && includes & 32768 /* Undefined */ || isEmptyAnonymousObjectType(t) && includes & 470302716 /* DefinitelyNonNullable */; + const remove = t.flags & 32 /* String */ && includes & (1024 /* StringLiteral */ | 4194304 /* TemplateLiteral */ | 8388608 /* StringMapping */) || t.flags & 64 /* Number */ && includes & 2048 /* NumberLiteral */ || t.flags & 128 /* BigInt */ && includes & 4096 /* BigIntLiteral */ || t.flags & 512 /* ESSymbol */ && includes & 16384 /* UniqueESSymbol */ || t.flags & 16 /* Void */ && includes & 4 /* Undefined */ || isEmptyAnonymousObjectType(t) && includes & 13893600 /* DefinitelyNonNullable */; if (remove) { orderedRemoveItemAt(types, i); } @@ -66190,7 +66336,7 @@ function createTypeChecker(host) { if (type === undefinedType) { return containsType(u.types, missingType); } - const primitive = type.flags & 128 /* StringLiteral */ ? stringType : type.flags & (32 /* Enum */ | 256 /* NumberLiteral */) ? numberType : type.flags & 2048 /* BigIntLiteral */ ? bigintType : type.flags & 8192 /* UniqueESSymbol */ ? esSymbolType : void 0; + const primitive = type.flags & 1024 /* StringLiteral */ ? stringType : type.flags & (65536 /* Enum */ | 2048 /* NumberLiteral */) ? numberType : type.flags & 4096 /* BigIntLiteral */ ? bigintType : type.flags & 16384 /* UniqueESSymbol */ ? esSymbolType : void 0; if (!primitive || !containsType(u.types, primitive)) { return false; } @@ -66200,11 +66346,11 @@ function createTypeChecker(host) { } function extractRedundantTemplateLiterals(types) { let i = types.length; - const literals = filter(types, (t) => !!(t.flags & 128 /* StringLiteral */)); + const literals = filter(types, (t) => !!(t.flags & 1024 /* StringLiteral */)); while (i > 0) { i--; const t = types[i]; - if (!(t.flags & (134217728 /* TemplateLiteral */ | 268435456 /* StringMapping */))) continue; + if (!(t.flags & (4194304 /* TemplateLiteral */ | 8388608 /* StringMapping */))) continue; for (const t2 of literals) { if (isTypeSubtypeOf(t2, t)) { orderedRemoveItemAt(types, i); @@ -66262,11 +66408,11 @@ function createTypeChecker(host) { return true; } function createIntersectionType(types, objectFlags, aliasSymbol, aliasTypeArguments) { - const result = createType(2097152 /* Intersection */); + const result = createType(268435456 /* Intersection */); result.objectFlags = objectFlags | getPropagatingFlagsOfTypes( types, /*excludeKinds*/ - 98304 /* Nullable */ + 12 /* Nullable */ ); result.types = types; result.aliasSymbol = aliasSymbol; @@ -66278,25 +66424,25 @@ function createTypeChecker(host) { const includes = addTypesToIntersection(typeMembershipMap, 0, types); const typeSet = arrayFrom(typeMembershipMap.values()); let objectFlags = 0 /* None */; - if (includes & 131072 /* Never */) { + if (includes & 262144 /* Never */) { return contains(typeSet, silentNeverType) ? silentNeverType : neverType; } - if (strictNullChecks && includes & 98304 /* Nullable */ && includes & (524288 /* Object */ | 67108864 /* NonPrimitive */ | 16777216 /* IncludesEmptyObject */) || includes & 67108864 /* NonPrimitive */ && includes & (469892092 /* DisjointDomains */ & ~67108864 /* NonPrimitive */) || includes & 402653316 /* StringLike */ && includes & (469892092 /* DisjointDomains */ & ~402653316 /* StringLike */) || includes & 296 /* NumberLike */ && includes & (469892092 /* DisjointDomains */ & ~296 /* NumberLike */) || includes & 2112 /* BigIntLike */ && includes & (469892092 /* DisjointDomains */ & ~2112 /* BigIntLike */) || includes & 12288 /* ESSymbolLike */ && includes & (469892092 /* DisjointDomains */ & ~12288 /* ESSymbolLike */) || includes & 49152 /* VoidLike */ && includes & (469892092 /* DisjointDomains */ & ~49152 /* VoidLike */)) { + if (strictNullChecks && includes & 12 /* Nullable */ && includes & (1048576 /* Object */ | 131072 /* NonPrimitive */ | 67108864 /* IncludesEmptyObject */) || includes & 131072 /* NonPrimitive */ && includes & (12812284 /* DisjointDomains */ & ~131072 /* NonPrimitive */) || includes & 12583968 /* StringLike */ && includes & (12812284 /* DisjointDomains */ & ~12583968 /* StringLike */) || includes & 67648 /* NumberLike */ && includes & (12812284 /* DisjointDomains */ & ~67648 /* NumberLike */) || includes & 4224 /* BigIntLike */ && includes & (12812284 /* DisjointDomains */ & ~4224 /* BigIntLike */) || includes & 16896 /* ESSymbolLike */ && includes & (12812284 /* DisjointDomains */ & ~16896 /* ESSymbolLike */) || includes & 20 /* VoidLike */ && includes & (12812284 /* DisjointDomains */ & ~20 /* VoidLike */)) { return neverType; } - if (includes & (134217728 /* TemplateLiteral */ | 268435456 /* StringMapping */) && includes & 128 /* StringLiteral */ && extractRedundantTemplateLiterals(typeSet)) { + if (includes & (4194304 /* TemplateLiteral */ | 8388608 /* StringMapping */) && includes & 1024 /* StringLiteral */ && extractRedundantTemplateLiterals(typeSet)) { return neverType; } if (includes & 1 /* Any */) { - return includes & 8388608 /* IncludesWildcard */ ? wildcardType : includes & 1073741824 /* IncludesError */ ? errorType : anyType; + return includes & 33554432 /* IncludesWildcard */ ? wildcardType : includes & 1073741824 /* IncludesError */ ? errorType : anyType; } - if (!strictNullChecks && includes & 98304 /* Nullable */) { - return includes & 16777216 /* IncludesEmptyObject */ ? neverType : includes & 32768 /* Undefined */ ? undefinedType : nullType; + if (!strictNullChecks && includes & 12 /* Nullable */) { + return includes & 67108864 /* IncludesEmptyObject */ ? neverType : includes & 4 /* Undefined */ ? undefinedType : nullType; } - if (includes & 4 /* String */ && includes & (128 /* StringLiteral */ | 134217728 /* TemplateLiteral */ | 268435456 /* StringMapping */) || includes & 8 /* Number */ && includes & 256 /* NumberLiteral */ || includes & 64 /* BigInt */ && includes & 2048 /* BigIntLiteral */ || includes & 4096 /* ESSymbol */ && includes & 8192 /* UniqueESSymbol */ || includes & 16384 /* Void */ && includes & 32768 /* Undefined */ || includes & 16777216 /* IncludesEmptyObject */ && includes & 470302716 /* DefinitelyNonNullable */) { + if (includes & 32 /* String */ && includes & (1024 /* StringLiteral */ | 4194304 /* TemplateLiteral */ | 8388608 /* StringMapping */) || includes & 64 /* Number */ && includes & 2048 /* NumberLiteral */ || includes & 128 /* BigInt */ && includes & 4096 /* BigIntLiteral */ || includes & 512 /* ESSymbol */ && includes & 16384 /* UniqueESSymbol */ || includes & 16 /* Void */ && includes & 4 /* Undefined */ || includes & 67108864 /* IncludesEmptyObject */ && includes & 13893600 /* DefinitelyNonNullable */) { if (!(flags & 1 /* NoSupertypeReduction */)) removeRedundantSupertypes(typeSet, includes); } - if (includes & 262144 /* IncludesMissingType */) { + if (includes & 524288 /* IncludesMissingType */) { typeSet[typeSet.indexOf(undefinedType)] = missingType; } if (typeSet.length === 0) { @@ -66306,16 +66452,16 @@ function createTypeChecker(host) { return typeSet[0]; } if (typeSet.length === 2 && !(flags & 2 /* NoConstraintReduction */)) { - const typeVarIndex = typeSet[0].flags & 8650752 /* TypeVariable */ ? 0 : 1; + const typeVarIndex = typeSet[0].flags & 34078720 /* TypeVariable */ ? 0 : 1; const typeVariable = typeSet[typeVarIndex]; const primitiveType = typeSet[1 - typeVarIndex]; - if (typeVariable.flags & 8650752 /* TypeVariable */ && (primitiveType.flags & (402784252 /* Primitive */ | 67108864 /* NonPrimitive */) && !isGenericStringLikeType(primitiveType) || includes & 16777216 /* IncludesEmptyObject */)) { + if (typeVariable.flags & 34078720 /* TypeVariable */ && (primitiveType.flags & (12713980 /* Primitive */ | 131072 /* NonPrimitive */) && !isGenericStringLikeType(primitiveType) || includes & 67108864 /* IncludesEmptyObject */)) { const constraint = getBaseConstraintOfType(typeVariable); - if (constraint && everyType(constraint, (t) => !!(t.flags & (402784252 /* Primitive */ | 67108864 /* NonPrimitive */)) || isEmptyAnonymousObjectType(t))) { + if (constraint && everyType(constraint, (t) => !!(t.flags & (12713980 /* Primitive */ | 131072 /* NonPrimitive */)) || isEmptyAnonymousObjectType(t))) { if (isTypeStrictSubtypeOf(constraint, primitiveType)) { return typeVariable; } - if (!(constraint.flags & 1048576 /* Union */ && someType(constraint, (c) => isTypeStrictSubtypeOf(c, primitiveType)))) { + if (!(constraint.flags & 134217728 /* Union */ && someType(constraint, (c) => isTypeStrictSubtypeOf(c, primitiveType)))) { if (!isTypeStrictSubtypeOf(primitiveType, constraint)) { return neverType; } @@ -66327,15 +66473,15 @@ function createTypeChecker(host) { const id = getTypeListId(typeSet) + (flags & 2 /* NoConstraintReduction */ ? "*" : getAliasId(aliasSymbol, aliasTypeArguments)); let result = intersectionTypes.get(id); if (!result) { - if (includes & 1048576 /* Union */) { + if (includes & 134217728 /* Union */) { if (intersectUnionsOfPrimitiveTypes(typeSet)) { result = getIntersectionType(typeSet, flags, aliasSymbol, aliasTypeArguments); - } else if (every(typeSet, (t) => !!(t.flags & 1048576 /* Union */ && t.types[0].flags & 32768 /* Undefined */))) { + } else if (every(typeSet, (t) => !!(t.flags & 134217728 /* Union */ && t.types[0].flags & 4 /* Undefined */))) { const containedUndefinedType = some(typeSet, containsMissingType) ? missingType : undefinedType; - removeFromEach(typeSet, 32768 /* Undefined */); + removeFromEach(typeSet, 4 /* Undefined */); result = getUnionType([getIntersectionType(typeSet, flags), containedUndefinedType], 1 /* Literal */, aliasSymbol, aliasTypeArguments); - } else if (every(typeSet, (t) => !!(t.flags & 1048576 /* Union */ && (t.types[0].flags & 65536 /* Null */ || t.types[1].flags & 65536 /* Null */)))) { - removeFromEach(typeSet, 65536 /* Null */); + } else if (every(typeSet, (t) => !!(t.flags & 134217728 /* Union */ && (t.types[0].flags & 8 /* Null */ || t.types[1].flags & 8 /* Null */)))) { + removeFromEach(typeSet, 8 /* Null */); result = getUnionType([getIntersectionType(typeSet, flags), nullType], 1 /* Literal */, aliasSymbol, aliasTypeArguments); } else if (typeSet.length >= 3 && types.length > 2) { const middle = Math.floor(typeSet.length / 2); @@ -66345,7 +66491,7 @@ function createTypeChecker(host) { return errorType; } const constituents = getCrossProductIntersections(typeSet, flags); - const origin = some(constituents, (t) => !!(t.flags & 2097152 /* Intersection */)) && getConstituentCountOfTypes(constituents) > getConstituentCountOfTypes(typeSet) ? createOriginUnionOrIntersectionType(2097152 /* Intersection */, typeSet) : void 0; + const origin = some(constituents, (t) => !!(t.flags & 268435456 /* Intersection */)) && getConstituentCountOfTypes(constituents) > getConstituentCountOfTypes(typeSet) ? createOriginUnionOrIntersectionType(268435456 /* Intersection */, typeSet) : void 0; result = getUnionType(constituents, 1 /* Literal */, aliasSymbol, aliasTypeArguments, origin); } } else { @@ -66356,7 +66502,7 @@ function createTypeChecker(host) { return result; } function getCrossProductUnionSize(types) { - return reduceLeft(types, (n, t) => t.flags & 1048576 /* Union */ ? n * t.types.length : t.flags & 131072 /* Never */ ? 0 : n, 1); + return reduceLeft(types, (n, t) => t.flags & 134217728 /* Union */ ? n * t.types.length : t.flags & 262144 /* Never */ ? 0 : n, 1); } function checkCrossProductUnion(types) { var _a; @@ -66375,7 +66521,7 @@ function createTypeChecker(host) { const constituents = types.slice(); let n = i; for (let j = types.length - 1; j >= 0; j--) { - if (types[j].flags & 1048576 /* Union */) { + if (types[j].flags & 134217728 /* Union */) { const sourceTypes = types[j].types; const length2 = sourceTypes.length; constituents[j] = sourceTypes[n % length2]; @@ -66383,12 +66529,12 @@ function createTypeChecker(host) { } } const t = getIntersectionType(constituents, flags); - if (!(t.flags & 131072 /* Never */)) intersections.push(t); + if (!(t.flags & 262144 /* Never */)) intersections.push(t); } return intersections; } function getConstituentCount(type) { - return !(type.flags & 3145728 /* UnionOrIntersection */) || type.aliasSymbol ? 1 : type.flags & 1048576 /* Union */ && type.origin ? getConstituentCount(type.origin) : getConstituentCountOfTypes(type.types); + return !(type.flags & 402653184 /* UnionOrIntersection */) || type.aliasSymbol ? 1 : type.flags & 134217728 /* Union */ && type.origin ? getConstituentCount(type.origin) : getConstituentCountOfTypes(type.types); } function getConstituentCountOfTypes(types) { return reduceLeft(types, (n, t) => n + getConstituentCount(t), 0); @@ -66400,19 +66546,19 @@ function createTypeChecker(host) { const types = map(node.types, getTypeFromTypeNode); const emptyIndex = types.length === 2 ? types.indexOf(emptyTypeLiteralType) : -1; const t = emptyIndex >= 0 ? types[1 - emptyIndex] : unknownType; - const noSupertypeReduction = !!(t.flags & (4 /* String */ | 8 /* Number */ | 64 /* BigInt */) || t.flags & 134217728 /* TemplateLiteral */ && isPatternLiteralType(t)); + const noSupertypeReduction = !!(t.flags & (32 /* String */ | 64 /* Number */ | 128 /* BigInt */) || t.flags & 4194304 /* TemplateLiteral */ && isPatternLiteralType(t)); links.resolvedType = getIntersectionType(types, noSupertypeReduction ? 1 /* NoSupertypeReduction */ : 0, aliasSymbol, getTypeArgumentsForAliasSymbol(aliasSymbol)); } return links.resolvedType; } function createIndexType(type, indexFlags) { - const result = createType(4194304 /* Index */); + const result = createType(2097152 /* Index */); result.type = type; result.indexFlags = indexFlags; return result; } function createOriginIndexType(type) { - const result = createOriginType(4194304 /* Index */); + const result = createOriginType(2097152 /* Index */); result.type = type; return result; } @@ -66434,12 +66580,12 @@ function createTypeChecker(host) { forEachType(constraintType, addMemberForKeyType); } else if (isMappedTypeWithKeyofConstraintDeclaration(type)) { const modifiersType = getApparentType(getModifiersTypeFromMappedType(type)); - forEachMappedTypePropertyKeyTypeAndIndexSignatureKeyType(modifiersType, 8576 /* StringOrNumberLiteralOrUnique */, !!(indexFlags & 1 /* StringsOnly */), addMemberForKeyType); + forEachMappedTypePropertyKeyTypeAndIndexSignatureKeyType(modifiersType, 19456 /* StringOrNumberLiteralOrUnique */, !!(indexFlags & 1 /* StringsOnly */), addMemberForKeyType); } else { forEachType(getLowerBoundOfKeyType(constraintType), addMemberForKeyType); } - const result = indexFlags & 2 /* NoIndexSignatures */ ? filterType(getUnionType(keyTypes), (t) => !(t.flags & (1 /* Any */ | 4 /* String */))) : getUnionType(keyTypes); - if (result.flags & 1048576 /* Union */ && constraintType.flags & 1048576 /* Union */ && getTypeListId(result.types) === getTypeListId(constraintType.types)) { + const result = indexFlags & 2 /* NoIndexSignatures */ ? filterType(getUnionType(keyTypes), (t) => !(t.flags & (1 /* Any */ | 32 /* String */))) : getUnionType(keyTypes); + if (result.flags & 134217728 /* Union */ && constraintType.flags & 134217728 /* Union */ && getTypeListId(result.types) === getTypeListId(constraintType.types)) { return constraintType; } return result; @@ -66448,13 +66594,6 @@ function createTypeChecker(host) { keyTypes.push(propNameType === stringType ? stringOrNumberType : propNameType); } } - function hasDistributiveNameType(mappedType) { - const typeVariable = getTypeParameterFromMappedType(mappedType); - return isDistributive(getNameTypeFromMappedType(mappedType) || typeVariable); - function isDistributive(type) { - return type.flags & (3 /* AnyOrUnknown */ | 402784252 /* Primitive */ | 131072 /* Never */ | 262144 /* TypeParameter */ | 524288 /* Object */ | 67108864 /* NonPrimitive */) ? true : type.flags & 16777216 /* Conditional */ ? type.root.isDistributive && type.checkType === typeVariable : type.flags & (3145728 /* UnionOrIntersection */ | 134217728 /* TemplateLiteral */) ? every(type.types, isDistributive) : type.flags & 8388608 /* IndexedAccess */ ? isDistributive(type.objectType) && isDistributive(type.indexType) : type.flags & 33554432 /* Substitution */ ? isDistributive(type.baseType) && isDistributive(type.constraint) : type.flags & 268435456 /* StringMapping */ ? isDistributive(type.type) : false; - } - } function getLiteralTypeFromPropertyName(name) { if (isPrivateIdentifier(name)) { return neverType; @@ -66488,12 +66627,12 @@ function createTypeChecker(host) { return neverType; } function isKeyTypeIncluded(keyType, include) { - return !!(keyType.flags & include || keyType.flags & 2097152 /* Intersection */ && some(keyType.types, (t) => isKeyTypeIncluded(t, include))); + return !!(keyType.flags & include || keyType.flags & 268435456 /* Intersection */ && some(keyType.types, (t) => isKeyTypeIncluded(t, include))); } function getLiteralTypeFromProperties(type, include, includeOrigin) { const origin = includeOrigin && (getObjectFlags(type) & (3 /* ClassOrInterface */ | 4 /* Reference */) || type.aliasSymbol) ? createOriginIndexType(type) : void 0; const propertyTypes = map(getPropertiesOfType(type), (prop) => getLiteralTypeFromProperty(prop, include)); - const indexKeyTypes = map(getIndexInfosOfType(type), (info) => info !== enumNumberIndexInfo && isKeyTypeIncluded(info.keyType, include) ? info.keyType === stringType && include & 8 /* Number */ ? stringOrNumberType : info.keyType : neverType); + const indexKeyTypes = map(getIndexInfosOfType(type), (info) => info !== enumNumberIndexInfo && isKeyTypeIncluded(info.keyType, include) ? info.keyType === stringType && include & 64 /* Number */ ? stringOrNumberType : info.keyType : neverType); return getUnionType( concatenate(propertyTypes, indexKeyTypes), 1 /* Literal */, @@ -66505,11 +66644,11 @@ function createTypeChecker(host) { ); } function shouldDeferIndexType(type, indexFlags = 0 /* None */) { - return !!(type.flags & 58982400 /* InstantiableNonPrimitive */ || isGenericTupleType(type) || isGenericMappedType(type) && (!hasDistributiveNameType(type) || getMappedTypeNameTypeKind(type) === 2 /* Remapping */) || type.flags & 1048576 /* Union */ && !(indexFlags & 4 /* NoReducibleCheck */) && isGenericReducibleType(type) || type.flags & 2097152 /* Intersection */ && maybeTypeOfKind(type, 465829888 /* Instantiable */) && some(type.types, isEmptyAnonymousObjectType)); + return !!(type.flags & 117964800 /* InstantiableNonPrimitive */ || isGenericTupleType(type) || isGenericMappedType(type) && getNameTypeFromMappedType(type) || type.flags & 134217728 /* Union */ && !(indexFlags & 4 /* NoReducibleCheck */) && isGenericReducibleType(type) || type.flags & 268435456 /* Intersection */ && maybeTypeOfKind(type, 132644864 /* Instantiable */) && some(type.types, isEmptyAnonymousObjectType)); } function getIndexType(type, indexFlags = 0 /* None */) { type = getReducedType(type); - return isNoInferType(type) ? getNoInferType(getIndexType(type.baseType, indexFlags)) : shouldDeferIndexType(type, indexFlags) ? getIndexTypeForGenericType(type, indexFlags) : type.flags & 1048576 /* Union */ ? getIntersectionType(map(type.types, (t) => getIndexType(t, indexFlags))) : type.flags & 2097152 /* Intersection */ ? getUnionType(map(type.types, (t) => getIndexType(t, indexFlags))) : getObjectFlags(type) & 32 /* Mapped */ ? getIndexTypeForMappedType(type, indexFlags) : type === wildcardType ? wildcardType : type.flags & 2 /* Unknown */ ? neverType : type.flags & (1 /* Any */ | 131072 /* Never */) ? stringNumberSymbolType : getLiteralTypeFromProperties(type, (indexFlags & 2 /* NoIndexSignatures */ ? 128 /* StringLiteral */ : 402653316 /* StringLike */) | (indexFlags & 1 /* StringsOnly */ ? 0 : 296 /* NumberLike */ | 12288 /* ESSymbolLike */), indexFlags === 0 /* None */); + return isNoInferType(type) ? getNoInferType(getIndexType(type.baseType, indexFlags)) : shouldDeferIndexType(type, indexFlags) ? getIndexTypeForGenericType(type, indexFlags) : type.flags & 134217728 /* Union */ ? getIntersectionType(map(type.types, (t) => getIndexType(t, indexFlags))) : type.flags & 268435456 /* Intersection */ ? getUnionType(map(type.types, (t) => getIndexType(t, indexFlags))) : getObjectFlags(type) & 32 /* Mapped */ ? getIndexTypeForMappedType(type, indexFlags) : type === wildcardType ? wildcardType : type.flags & 2 /* Unknown */ ? neverType : type.flags & (1 /* Any */ | 262144 /* Never */) ? stringNumberSymbolType : getLiteralTypeFromProperties(type, (indexFlags & 2 /* NoIndexSignatures */ ? 1024 /* StringLiteral */ : 12583968 /* StringLike */) | (indexFlags & 1 /* StringsOnly */ ? 0 : 67648 /* NumberLike */ | 16896 /* ESSymbolLike */), indexFlags === 0 /* None */); } function getExtractStringType(type) { const extractTypeAlias = getGlobalExtractSymbol(); @@ -66517,7 +66656,7 @@ function createTypeChecker(host) { } function getIndexTypeOrString(type) { const indexType = getExtractStringType(getIndexType(type)); - return indexType.flags & 131072 /* Never */ ? stringType : indexType; + return indexType.flags & 262144 /* Never */ ? stringType : indexType; } function getTypeFromTypeOperatorNode(node) { const links = getNodeLinks(node); @@ -66549,7 +66688,7 @@ function createTypeChecker(host) { return links.resolvedType; } function getTemplateLiteralType(texts, types) { - const unionIndex = findIndex(types, (t) => !!(t.flags & (131072 /* Never */ | 1048576 /* Union */))); + const unionIndex = findIndex(types, (t) => !!(t.flags & (262144 /* Never */ | 134217728 /* Union */))); if (unionIndex >= 0) { return checkCrossProductUnion(types) ? mapType(types[unionIndex], (t) => getTemplateLiteralType(texts, replaceElement(types, unionIndex, t))) : errorType; } @@ -66567,7 +66706,7 @@ function createTypeChecker(host) { } newTexts.push(text); if (every(newTexts, (t) => t === "")) { - if (every(newTypes, (t) => !!(t.flags & 4 /* String */))) { + if (every(newTypes, (t) => !!(t.flags & 32 /* String */))) { return stringType; } if (newTypes.length === 1 && isPatternLiteralType(newTypes[0])) { @@ -66583,10 +66722,10 @@ function createTypeChecker(host) { function addSpans(texts2, types2) { for (let i = 0; i < types2.length; i++) { const t = types2[i]; - if (t.flags & (2944 /* Literal */ | 65536 /* Null */ | 32768 /* Undefined */)) { + if (t.flags & (15360 /* Literal */ | 8 /* Null */ | 4 /* Undefined */)) { text += getTemplateStringForType(t) || ""; text += texts2[i + 1]; - } else if (t.flags & 134217728 /* TemplateLiteral */) { + } else if (t.flags & 4194304 /* TemplateLiteral */) { text += t.texts[0]; if (!addSpans(t.texts, t.types)) return false; text += texts2[i + 1]; @@ -66602,18 +66741,18 @@ function createTypeChecker(host) { } } function getTemplateStringForType(type) { - return type.flags & 128 /* StringLiteral */ ? type.value : type.flags & 256 /* NumberLiteral */ ? "" + type.value : type.flags & 2048 /* BigIntLiteral */ ? pseudoBigIntToString(type.value) : type.flags & (512 /* BooleanLiteral */ | 98304 /* Nullable */) ? type.intrinsicName : void 0; + return type.flags & 1024 /* StringLiteral */ ? type.value : type.flags & 2048 /* NumberLiteral */ ? "" + type.value : type.flags & 4096 /* BigIntLiteral */ ? pseudoBigIntToString(type.value) : type.flags & (8192 /* BooleanLiteral */ | 12 /* Nullable */) ? type.intrinsicName : void 0; } function createTemplateLiteralType(texts, types) { - const type = createType(134217728 /* TemplateLiteral */); + const type = createType(4194304 /* TemplateLiteral */); type.texts = texts; type.types = types; return type; } function getStringMappingType(symbol, type) { - return type.flags & (1048576 /* Union */ | 131072 /* Never */) ? mapType(type, (t) => getStringMappingType(symbol, t)) : type.flags & 128 /* StringLiteral */ ? getStringLiteralType(applyStringMapping(symbol, type.value)) : type.flags & 134217728 /* TemplateLiteral */ ? getTemplateLiteralType(...applyTemplateStringMapping(symbol, type.texts, type.types)) : ( + return type.flags & (134217728 /* Union */ | 262144 /* Never */) ? mapType(type, (t) => getStringMappingType(symbol, t)) : type.flags & 1024 /* StringLiteral */ ? getStringLiteralType(applyStringMapping(symbol, type.value)) : type.flags & 4194304 /* TemplateLiteral */ ? getTemplateLiteralType(...applyTemplateStringMapping(symbol, type.texts, type.types)) : ( // Mapping> === Mapping - type.flags & 268435456 /* StringMapping */ && symbol === type.symbol ? type : type.flags & (1 /* Any */ | 4 /* String */ | 268435456 /* StringMapping */) || isGenericIndexType(type) ? getStringMappingTypeForGenericType(symbol, type) : ( + type.flags & 8388608 /* StringMapping */ && symbol === type.symbol ? type : type.flags & (1 /* Any */ | 32 /* String */ | 8388608 /* StringMapping */) || isGenericIndexType(type) ? getStringMappingTypeForGenericType(symbol, type) : ( // This handles Mapping<`${number}`> and Mapping<`${bigint}`> isPatternLiteralPlaceholderType(type) ? getStringMappingTypeForGenericType(symbol, getTemplateLiteralType(["", ""], [type])) : type ) @@ -66654,12 +66793,12 @@ function createTypeChecker(host) { return result; } function createStringMappingType(symbol, type) { - const result = createTypeWithSymbol(268435456 /* StringMapping */, symbol); + const result = createTypeWithSymbol(8388608 /* StringMapping */, symbol); result.type = type; return result; } function createIndexedAccessType(objectType, indexType, accessFlags, aliasSymbol, aliasTypeArguments) { - const type = createType(8388608 /* IndexedAccess */); + const type = createType(33554432 /* IndexedAccess */); type.objectType = objectType; type.indexType = indexType; type.accessFlags = accessFlags; @@ -66674,13 +66813,13 @@ function createTypeChecker(host) { if (getObjectFlags(type) & 4096 /* JSLiteral */) { return true; } - if (type.flags & 1048576 /* Union */) { + if (type.flags & 134217728 /* Union */) { return every(type.types, isJSLiteralType); } - if (type.flags & 2097152 /* Intersection */) { + if (type.flags & 268435456 /* Intersection */) { return some(type.types, isJSLiteralType); } - if (type.flags & 465829888 /* Instantiable */) { + if (type.flags & 132644864 /* Instantiable */) { const constraint = getResolvedBaseConstraint(type); return constraint !== type && isJSLiteralType(constraint); } @@ -66751,8 +66890,8 @@ function createTypeChecker(host) { } } } - if (!(indexType.flags & 98304 /* Nullable */) && isTypeAssignableToKind(indexType, 402653316 /* StringLike */ | 296 /* NumberLike */ | 12288 /* ESSymbolLike */)) { - if (objectType.flags & (1 /* Any */ | 131072 /* Never */)) { + if (!(indexType.flags & 12 /* Nullable */) && isTypeAssignableToKind(indexType, 12583968 /* StringLike */ | 67648 /* NumberLike */ | 16896 /* ESSymbolLike */)) { + if (objectType.flags & (1 /* Any */ | 262144 /* Never */)) { return objectType; } const indexInfo = getApplicableIndexInfo(objectType, indexType) || getIndexInfoOfType(objectType, stringType); @@ -66767,18 +66906,18 @@ function createTypeChecker(host) { } return void 0; } - if (accessNode && indexInfo.keyType === stringType && !isTypeAssignableToKind(indexType, 4 /* String */ | 8 /* Number */)) { + if (accessNode && indexInfo.keyType === stringType && !isTypeAssignableToKind(indexType, 32 /* String */ | 64 /* Number */)) { const indexNode = getIndexNodeForAccessExpression(accessNode); error2(indexNode, Diagnostics.Type_0_cannot_be_used_as_an_index_type, typeToString(indexType)); return accessFlags & 1 /* IncludeUndefined */ ? getUnionType([indexInfo.type, missingType]) : indexInfo.type; } errorIfWritingToReadonlyIndex(indexInfo); - if (accessFlags & 1 /* IncludeUndefined */ && !(objectType.symbol && objectType.symbol.flags & (256 /* RegularEnum */ | 128 /* ConstEnum */) && (indexType.symbol && indexType.flags & 1024 /* EnumLiteral */ && getParentOfSymbol(indexType.symbol) === objectType.symbol))) { + if (accessFlags & 1 /* IncludeUndefined */ && !(objectType.symbol && objectType.symbol.flags & (256 /* RegularEnum */ | 128 /* ConstEnum */) && (indexType.symbol && indexType.flags & 32768 /* EnumLiteral */ && getParentOfSymbol(indexType.symbol) === objectType.symbol))) { return getUnionType([indexInfo.type, missingType]); } return indexInfo.type; } - if (indexType.flags & 131072 /* Never */) { + if (indexType.flags & 262144 /* Never */) { return neverType; } if (isJSLiteralType(objectType)) { @@ -66786,10 +66925,10 @@ function createTypeChecker(host) { } if (accessExpression && !isConstEnumObjectType(objectType)) { if (isObjectLiteralType2(objectType)) { - if (noImplicitAny && indexType.flags & (128 /* StringLiteral */ | 256 /* NumberLiteral */)) { + if (noImplicitAny && indexType.flags & (1024 /* StringLiteral */ | 2048 /* NumberLiteral */)) { diagnostics.add(createDiagnosticForNode(accessExpression, Diagnostics.Property_0_does_not_exist_on_type_1, indexType.value, typeToString(objectType))); return undefinedType; - } else if (indexType.flags & (8 /* Number */ | 4 /* String */)) { + } else if (indexType.flags & (64 /* Number */ | 32 /* String */)) { const types = map(objectType.properties, (property) => { return getTypeOfSymbol(property); }); @@ -66816,7 +66955,7 @@ function createTypeChecker(host) { error2(accessExpression, Diagnostics.Element_implicitly_has_an_any_type_because_type_0_has_no_index_signature_Did_you_mean_to_call_1, typeToString(objectType), suggestion2); } else { let errorInfo; - if (indexType.flags & 1024 /* EnumLiteral */) { + if (indexType.flags & 32768 /* EnumLiteral */) { errorInfo = chainDiagnosticMessages( /*details*/ void 0, @@ -66824,7 +66963,7 @@ function createTypeChecker(host) { "[" + typeToString(indexType) + "]", typeToString(objectType) ); - } else if (indexType.flags & 8192 /* UniqueESSymbol */) { + } else if (indexType.flags & 16384 /* UniqueESSymbol */) { const symbolName2 = getFullyQualifiedName(indexType.symbol, accessExpression); errorInfo = chainDiagnosticMessages( /*details*/ @@ -66833,7 +66972,7 @@ function createTypeChecker(host) { "[" + symbolName2 + "]", typeToString(objectType) ); - } else if (indexType.flags & 128 /* StringLiteral */) { + } else if (indexType.flags & 1024 /* StringLiteral */) { errorInfo = chainDiagnosticMessages( /*details*/ void 0, @@ -66841,7 +66980,7 @@ function createTypeChecker(host) { indexType.value, typeToString(objectType) ); - } else if (indexType.flags & 256 /* NumberLiteral */) { + } else if (indexType.flags & 2048 /* NumberLiteral */) { errorInfo = chainDiagnosticMessages( /*details*/ void 0, @@ -66849,7 +66988,7 @@ function createTypeChecker(host) { indexType.value, typeToString(objectType) ); - } else if (indexType.flags & (8 /* Number */ | 4 /* String */)) { + } else if (indexType.flags & (64 /* Number */ | 32 /* String */)) { errorInfo = chainDiagnosticMessages( /*details*/ void 0, @@ -66880,9 +67019,9 @@ function createTypeChecker(host) { } if (accessNode) { const indexNode = getIndexNodeForAccessExpression(accessNode); - if (indexNode.kind !== 10 /* BigIntLiteral */ && indexType.flags & (128 /* StringLiteral */ | 256 /* NumberLiteral */)) { + if (indexNode.kind !== 10 /* BigIntLiteral */ && indexType.flags & (1024 /* StringLiteral */ | 2048 /* NumberLiteral */)) { error2(indexNode, Diagnostics.Property_0_does_not_exist_on_type_1, "" + indexType.value, typeToString(objectType)); - } else if (indexType.flags & (4 /* String */ | 8 /* Number */)) { + } else if (indexType.flags & (32 /* String */ | 64 /* Number */)) { error2(indexNode, Diagnostics.Type_0_has_no_matching_index_signature_for_type_1, typeToString(objectType), typeToString(indexType)); } else { const typeString = indexNode.kind === 10 /* BigIntLiteral */ ? "bigint" : typeToString(indexType); @@ -66903,24 +67042,24 @@ function createTypeChecker(host) { return accessNode.kind === 213 /* ElementAccessExpression */ ? accessNode.argumentExpression : accessNode.kind === 200 /* IndexedAccessType */ ? accessNode.indexType : accessNode.kind === 168 /* ComputedPropertyName */ ? accessNode.expression : accessNode; } function isPatternLiteralPlaceholderType(type) { - if (type.flags & 2097152 /* Intersection */) { + if (type.flags & 268435456 /* Intersection */) { let seenPlaceholder = false; for (const t of type.types) { - if (t.flags & (2944 /* Literal */ | 98304 /* Nullable */) || isPatternLiteralPlaceholderType(t)) { + if (t.flags & (15360 /* Literal */ | 12 /* Nullable */) || isPatternLiteralPlaceholderType(t)) { seenPlaceholder = true; - } else if (!(t.flags & 524288 /* Object */)) { + } else if (!(t.flags & 1048576 /* Object */)) { return false; } } return seenPlaceholder; } - return !!(type.flags & (1 /* Any */ | 4 /* String */ | 8 /* Number */ | 64 /* BigInt */)) || isPatternLiteralType(type); + return !!(type.flags & (1 /* Any */ | 32 /* String */ | 64 /* Number */ | 128 /* BigInt */)) || isPatternLiteralType(type); } function isPatternLiteralType(type) { - return !!(type.flags & 134217728 /* TemplateLiteral */) && every(type.types, isPatternLiteralPlaceholderType) || !!(type.flags & 268435456 /* StringMapping */) && isPatternLiteralPlaceholderType(type.type); + return !!(type.flags & 4194304 /* TemplateLiteral */) && every(type.types, isPatternLiteralPlaceholderType) || !!(type.flags & 8388608 /* StringMapping */) && isPatternLiteralPlaceholderType(type.type); } function isGenericStringLikeType(type) { - return !!(type.flags & (134217728 /* TemplateLiteral */ | 268435456 /* StringMapping */)) && !isPatternLiteralType(type); + return !!(type.flags & (4194304 /* TemplateLiteral */ | 8388608 /* StringMapping */)) && !isPatternLiteralType(type); } function isGenericType(type) { return !!getGenericObjectFlags(type); @@ -66932,31 +67071,31 @@ function createTypeChecker(host) { return !!(getGenericObjectFlags(type) & 8388608 /* IsGenericIndexType */); } function getGenericObjectFlags(type) { - if (type.flags & 3145728 /* UnionOrIntersection */) { + if (type.flags & 402653184 /* UnionOrIntersection */) { if (!(type.objectFlags & 2097152 /* IsGenericTypeComputed */)) { type.objectFlags |= 2097152 /* IsGenericTypeComputed */ | reduceLeft(type.types, (flags, t) => flags | getGenericObjectFlags(t), 0); } return type.objectFlags & 12582912 /* IsGenericType */; } - if (type.flags & 33554432 /* Substitution */) { + if (type.flags & 16777216 /* Substitution */) { if (!(type.objectFlags & 2097152 /* IsGenericTypeComputed */)) { type.objectFlags |= 2097152 /* IsGenericTypeComputed */ | getGenericObjectFlags(type.baseType) | getGenericObjectFlags(type.constraint); } return type.objectFlags & 12582912 /* IsGenericType */; } - return (type.flags & 58982400 /* InstantiableNonPrimitive */ || isGenericMappedType(type) || isGenericTupleType(type) ? 4194304 /* IsGenericObjectType */ : 0) | (type.flags & (58982400 /* InstantiableNonPrimitive */ | 4194304 /* Index */) || isGenericStringLikeType(type) ? 8388608 /* IsGenericIndexType */ : 0); + return (type.flags & 117964800 /* InstantiableNonPrimitive */ || isGenericMappedType(type) || isGenericTupleType(type) ? 4194304 /* IsGenericObjectType */ : 0) | (type.flags & (117964800 /* InstantiableNonPrimitive */ | 2097152 /* Index */) || isGenericStringLikeType(type) ? 8388608 /* IsGenericIndexType */ : 0); } function getSimplifiedType(type, writing) { - return type.flags & 8388608 /* IndexedAccess */ ? getSimplifiedIndexedAccessType(type, writing) : type.flags & 16777216 /* Conditional */ ? getSimplifiedConditionalType(type, writing) : type; + return type.flags & 33554432 /* IndexedAccess */ ? getSimplifiedIndexedAccessType(type, writing) : type.flags & 67108864 /* Conditional */ ? getSimplifiedConditionalType(type, writing) : type.flags & 2097152 /* Index */ ? getSimplifiedIndexType(type) : type; } function distributeIndexOverObjectType(objectType, indexType, writing) { - if (objectType.flags & 1048576 /* Union */ || objectType.flags & 2097152 /* Intersection */ && !shouldDeferIndexType(objectType)) { + if (objectType.flags & 134217728 /* Union */ || objectType.flags & 268435456 /* Intersection */ && !shouldDeferIndexType(objectType)) { const types = map(objectType.types, (t) => getSimplifiedType(getIndexedAccessType(t, indexType), writing)); - return objectType.flags & 2097152 /* Intersection */ || writing ? getIntersectionType(types) : getUnionType(types); + return objectType.flags & 268435456 /* Intersection */ || writing ? getIntersectionType(types) : getUnionType(types); } } function distributeObjectOverIndexType(objectType, indexType, writing) { - if (indexType.flags & 1048576 /* Union */) { + if (indexType.flags & 134217728 /* Union */) { const types = map(indexType.types, (t) => getSimplifiedType(getIndexedAccessType(objectType, t), writing)); return writing ? getIntersectionType(types) : getUnionType(types); } @@ -66973,16 +67112,16 @@ function createTypeChecker(host) { if (distributedOverIndex) { return type[cache] = distributedOverIndex; } - if (!(indexType.flags & 465829888 /* Instantiable */)) { + if (!(indexType.flags & 132644864 /* Instantiable */)) { const distributedOverObject = distributeIndexOverObjectType(objectType, indexType, writing); if (distributedOverObject) { return type[cache] = distributedOverObject; } } - if (isGenericTupleType(objectType) && indexType.flags & 296 /* NumberLike */) { + if (isGenericTupleType(objectType) && indexType.flags & 67648 /* NumberLike */) { const elementType = getElementTypeOfSliceOfTupleType( objectType, - indexType.flags & 8 /* Number */ ? 0 : objectType.target.fixedLength, + indexType.flags & 64 /* Number */ ? 0 : objectType.target.fixedLength, /*endSkipCount*/ 0, writing @@ -67003,13 +67142,13 @@ function createTypeChecker(host) { const extendsType = type.extendsType; const trueType2 = getTrueTypeFromConditionalType(type); const falseType2 = getFalseTypeFromConditionalType(type); - if (falseType2.flags & 131072 /* Never */ && getActualTypeVariable(trueType2) === getActualTypeVariable(checkType)) { + if (falseType2.flags & 262144 /* Never */ && getActualTypeVariable(trueType2) === getActualTypeVariable(checkType)) { if (checkType.flags & 1 /* Any */ || isTypeAssignableTo(getRestrictiveInstantiation(checkType), getRestrictiveInstantiation(extendsType))) { return getSimplifiedType(trueType2, writing); } else if (isIntersectionEmpty(checkType, extendsType)) { return neverType; } - } else if (trueType2.flags & 131072 /* Never */ && getActualTypeVariable(falseType2) === getActualTypeVariable(checkType)) { + } else if (trueType2.flags & 262144 /* Never */ && getActualTypeVariable(falseType2) === getActualTypeVariable(checkType)) { if (!(checkType.flags & 1 /* Any */) && isTypeAssignableTo(getRestrictiveInstantiation(checkType), getRestrictiveInstantiation(extendsType))) { return neverType; } else if (checkType.flags & 1 /* Any */ || isIntersectionEmpty(checkType, extendsType)) { @@ -67018,8 +67157,14 @@ function createTypeChecker(host) { } return type; } + function getSimplifiedIndexType(type) { + if (isGenericMappedType(type.type) && getNameTypeFromMappedType(type.type) && !isMappedTypeWithKeyofConstraintDeclaration(type.type)) { + return getIndexTypeForMappedType(type.type, 0 /* None */); + } + return type; + } function isIntersectionEmpty(type1, type2) { - return !!(getUnionType([intersectTypes(type1, type2), neverType]).flags & 131072 /* Never */); + return !!(getUnionType([intersectTypes(type1, type2), neverType]).flags & 262144 /* Never */); } function substituteIndexedMappedType(objectType, index) { const mapper = createTypeMapper([getTypeParameterFromMappedType(objectType)], [index]); @@ -67035,14 +67180,14 @@ function createTypeChecker(host) { } function couldAccessOptionalProperty(objectType, indexType) { const indexConstraint = getBaseConstraintOfType(indexType); - return !!indexConstraint && some(getPropertiesOfType(objectType), (p) => !!(p.flags & 16777216 /* Optional */) && isTypeAssignableTo(getLiteralTypeFromProperty(p, 8576 /* StringOrNumberLiteralOrUnique */), indexConstraint)); + return !!indexConstraint && some(getPropertiesOfType(objectType), (p) => !!(p.flags & 16777216 /* Optional */) && isTypeAssignableTo(getLiteralTypeFromProperty(p, 19456 /* StringOrNumberLiteralOrUnique */), indexConstraint)); } function getIndexedAccessType(objectType, indexType, accessFlags = 0 /* None */, accessNode, aliasSymbol, aliasTypeArguments) { return getIndexedAccessTypeOrUndefined(objectType, indexType, accessFlags, accessNode, aliasSymbol, aliasTypeArguments) || (accessNode ? errorType : unknownType); } function indexTypeLessThan(indexType, limit) { return everyType(indexType, (t) => { - if (t.flags & 384 /* StringOrNumberLiteral */) { + if (t.flags & 3072 /* StringOrNumberLiteral */) { const propName = getPropertyNameFromType(t); if (isNumericLiteralName(propName)) { const index = +propName; @@ -67057,7 +67202,7 @@ function createTypeChecker(host) { return wildcardType; } objectType = getReducedType(objectType); - if (isStringIndexSignatureOnlyType(objectType) && !(indexType.flags & 98304 /* Nullable */) && isTypeAssignableToKind(indexType, 4 /* String */ | 8 /* Number */)) { + if (isStringIndexSignatureOnlyType(objectType) && !(indexType.flags & 12 /* Nullable */) && isTypeAssignableToKind(indexType, 32 /* String */ | 64 /* Number */)) { indexType = stringType; } if (compilerOptions.noUncheckedIndexedAccess && accessFlags & 32 /* ExpressionPosition */) accessFlags |= 1 /* IncludeUndefined */; @@ -67074,7 +67219,7 @@ function createTypeChecker(host) { return type; } const apparentObjectType = getReducedApparentType(objectType); - if (indexType.flags & 1048576 /* Union */ && !(indexType.flags & 16 /* Boolean */)) { + if (indexType.flags & 134217728 /* Union */ && !(indexType.flags & 256 /* Boolean */)) { const propTypes = []; let wasMissingProp = false; for (const t of indexType.types) { @@ -67117,10 +67262,10 @@ function createTypeChecker(host) { return links.resolvedType; } function getActualTypeVariable(type) { - if (type.flags & 33554432 /* Substitution */) { + if (type.flags & 16777216 /* Substitution */) { return getActualTypeVariable(type.baseType); } - if (type.flags & 8388608 /* IndexedAccess */ && (type.objectType.flags & 33554432 /* Substitution */ || type.indexType.flags & 33554432 /* Substitution */)) { + if (type.flags & 33554432 /* IndexedAccess */ && (type.objectType.flags & 16777216 /* Substitution */ || type.indexType.flags & 16777216 /* Substitution */)) { return getIndexedAccessType(getActualTypeVariable(type.objectType), getActualTypeVariable(type.indexType)); } return type; @@ -67171,11 +67316,11 @@ function createTypeChecker(host) { const inferredExtendsType = combinedMapper ? instantiateType(root.extendsType, combinedMapper) : extendsType; if (!checkTypeDeferred && !isDeferredType(inferredExtendsType, checkTuples)) { if (!(inferredExtendsType.flags & 3 /* AnyOrUnknown */) && (checkType.flags & 1 /* Any */ || !isTypeAssignableTo(getPermissiveInstantiation(checkType), getPermissiveInstantiation(inferredExtendsType)))) { - if (checkType.flags & 1 /* Any */ || forConstraint && !(inferredExtendsType.flags & 131072 /* Never */) && someType(getPermissiveInstantiation(inferredExtendsType), (t) => isTypeAssignableTo(t, getPermissiveInstantiation(checkType)))) { + if (checkType.flags & 1 /* Any */ || forConstraint && !(inferredExtendsType.flags & 262144 /* Never */) && someType(getPermissiveInstantiation(inferredExtendsType), (t) => isTypeAssignableTo(t, getPermissiveInstantiation(checkType)))) { (extraTypes || (extraTypes = [])).push(instantiateType(getTypeFromTypeNode(root.node.trueType), combinedMapper || mapper)); } const falseType2 = getTypeFromTypeNode(root.node.falseType); - if (falseType2.flags & 16777216 /* Conditional */) { + if (falseType2.flags & 67108864 /* Conditional */) { const newRoot = falseType2.root; if (newRoot.node.parent === root.node && (!newRoot.isDistributive || newRoot.checkType === root.checkType)) { root = newRoot; @@ -67198,7 +67343,7 @@ function createTypeChecker(host) { break; } } - result = createType(16777216 /* Conditional */); + result = createType(67108864 /* Conditional */); result.root = root; result.checkType = instantiateType(root.checkType, mapper); result.extendsType = instantiateType(root.extendsType, mapper); @@ -67210,14 +67355,14 @@ function createTypeChecker(host) { } return extraTypes ? getUnionType(append(extraTypes, result)) : result; function canTailRecurse(newType, newMapper) { - if (newType.flags & 16777216 /* Conditional */ && newMapper) { + if (newType.flags & 67108864 /* Conditional */ && newMapper) { const newRoot = newType.root; if (newRoot.outerTypeParameters) { const typeParamMapper = combineTypeMappers(newType.mapper, newMapper); const typeArguments = map(newRoot.outerTypeParameters, (t) => getMappedType(t, typeParamMapper)); const newRootMapper = createTypeMapper(newRoot.outerTypeParameters, typeArguments); const newCheckType = newRoot.isDistributive ? getMappedType(newRoot.checkType, newRootMapper) : void 0; - if (!newCheckType || newCheckType === newRoot.checkType || !(newCheckType.flags & (1048576 /* Union */ | 131072 /* Never */))) { + if (!newCheckType || newCheckType === newRoot.checkType || !(newCheckType.flags & (134217728 /* Union */ | 262144 /* Never */))) { root = newRoot; mapper = newRootMapper; aliasSymbol = void 0; @@ -67271,7 +67416,7 @@ function createTypeChecker(host) { node, checkType, extendsType: getTypeFromTypeNode(node.extendsType), - isDistributive: !!(checkType.flags & 262144 /* TypeParameter */), + isDistributive: !!(checkType.flags & 524288 /* TypeParameter */), inferTypeParameters: getInferTypeParameters(node), outerTypeParameters, instantiations: void 0, @@ -67404,13 +67549,13 @@ function createTypeChecker(host) { return symbol ? getLocalTypeParametersOfClassOrInterfaceOrTypeAlias(symbol) : void 0; } function isNonGenericObjectType(type) { - return !!(type.flags & 524288 /* Object */) && !isGenericMappedType(type); + return !!(type.flags & 1048576 /* Object */) && !isGenericMappedType(type); } function isEmptyObjectTypeOrSpreadsIntoEmptyObject(type) { - return isEmptyObjectType(type) || !!(type.flags & (65536 /* Null */ | 32768 /* Undefined */ | 528 /* BooleanLike */ | 296 /* NumberLike */ | 2112 /* BigIntLike */ | 402653316 /* StringLike */ | 1056 /* EnumLike */ | 67108864 /* NonPrimitive */ | 4194304 /* Index */)); + return isEmptyObjectType(type) || !!(type.flags & (8 /* Null */ | 4 /* Undefined */ | 8448 /* BooleanLike */ | 67648 /* NumberLike */ | 4224 /* BigIntLike */ | 12583968 /* StringLike */ | 98304 /* EnumLike */ | 131072 /* NonPrimitive */ | 2097152 /* Index */)); } function tryMergeUnionOfObjectTypeAndEmptyObject(type, readonly) { - if (!(type.flags & 1048576 /* Union */)) { + if (!(type.flags & 134217728 /* Union */)) { return type; } if (every(type.types, isEmptyObjectTypeOrSpreadsIntoEmptyObject)) { @@ -67456,28 +67601,28 @@ function createTypeChecker(host) { if (left.flags & 2 /* Unknown */ || right.flags & 2 /* Unknown */) { return unknownType; } - if (left.flags & 131072 /* Never */) { + if (left.flags & 262144 /* Never */) { return right; } - if (right.flags & 131072 /* Never */) { + if (right.flags & 262144 /* Never */) { return left; } left = tryMergeUnionOfObjectTypeAndEmptyObject(left, readonly); - if (left.flags & 1048576 /* Union */) { + if (left.flags & 134217728 /* Union */) { return checkCrossProductUnion([left, right]) ? mapType(left, (t) => getSpreadType(t, right, symbol, objectFlags, readonly)) : errorType; } right = tryMergeUnionOfObjectTypeAndEmptyObject(right, readonly); - if (right.flags & 1048576 /* Union */) { + if (right.flags & 134217728 /* Union */) { return checkCrossProductUnion([left, right]) ? mapType(right, (t) => getSpreadType(left, t, symbol, objectFlags, readonly)) : errorType; } - if (right.flags & (528 /* BooleanLike */ | 296 /* NumberLike */ | 2112 /* BigIntLike */ | 402653316 /* StringLike */ | 1056 /* EnumLike */ | 67108864 /* NonPrimitive */ | 4194304 /* Index */)) { + if (right.flags & (8448 /* BooleanLike */ | 67648 /* NumberLike */ | 4224 /* BigIntLike */ | 12583968 /* StringLike */ | 98304 /* EnumLike */ | 131072 /* NonPrimitive */ | 2097152 /* Index */)) { return left; } if (isGenericObjectType(left) || isGenericObjectType(right)) { if (isEmptyObjectType(left)) { return right; } - if (left.flags & 2097152 /* Intersection */) { + if (left.flags & 268435456 /* Intersection */) { const types = left.types; const lastLeft = types[types.length - 1]; if (isNonGenericObjectType(lastLeft) && isNonGenericObjectType(right)) { @@ -67552,7 +67697,7 @@ function createTypeChecker(host) { return type; } function getFreshTypeOfLiteralType(type) { - if (type.flags & 2976 /* Freshable */) { + if (type.flags & 80896 /* Freshable */) { if (!type.freshType) { const freshType = createLiteralType(type.flags, type.value, type.symbol, type); freshType.freshType = freshType; @@ -67563,28 +67708,28 @@ function createTypeChecker(host) { return type; } function getRegularTypeOfLiteralType(type) { - return type.flags & 2976 /* Freshable */ ? type.regularType : type.flags & 1048576 /* Union */ ? type.regularType || (type.regularType = mapType(type, getRegularTypeOfLiteralType)) : type; + return type.flags & 80896 /* Freshable */ ? type.regularType : type.flags & 134217728 /* Union */ ? type.regularType || (type.regularType = mapType(type, getRegularTypeOfLiteralType)) : type; } function isFreshLiteralType(type) { - return !!(type.flags & 2976 /* Freshable */) && type.freshType === type; + return !!(type.flags & 80896 /* Freshable */) && type.freshType === type; } function getStringLiteralType(value) { let type; - return stringLiteralTypes.get(value) || (stringLiteralTypes.set(value, type = createLiteralType(128 /* StringLiteral */, value)), type); + return stringLiteralTypes.get(value) || (stringLiteralTypes.set(value, type = createLiteralType(1024 /* StringLiteral */, value)), type); } function getNumberLiteralType(value) { let type; - return numberLiteralTypes.get(value) || (numberLiteralTypes.set(value, type = createLiteralType(256 /* NumberLiteral */, value)), type); + return numberLiteralTypes.get(value) || (numberLiteralTypes.set(value, type = createLiteralType(2048 /* NumberLiteral */, value)), type); } function getBigIntLiteralType(value) { let type; const key = pseudoBigIntToString(value); - return bigIntLiteralTypes.get(key) || (bigIntLiteralTypes.set(key, type = createLiteralType(2048 /* BigIntLiteral */, value)), type); + return bigIntLiteralTypes.get(key) || (bigIntLiteralTypes.set(key, type = createLiteralType(4096 /* BigIntLiteral */, value)), type); } function getEnumLiteralType(value, enumId, symbol) { let type; const key = `${enumId}${typeof value === "string" ? "@" : "#"}${value}`; - const flags = 1024 /* EnumLiteral */ | (typeof value === "string" ? 128 /* StringLiteral */ : 256 /* NumberLiteral */); + const flags = 32768 /* EnumLiteral */ | (typeof value === "string" ? 1024 /* StringLiteral */ : 2048 /* NumberLiteral */); return enumLiteralTypes.get(key) || (enumLiteralTypes.set(key, type = createLiteralType(flags, value, symbol)), type); } function getTypeFromLiteralTypeNode(node) { @@ -67598,7 +67743,7 @@ function createTypeChecker(host) { return links.resolvedType; } function createUniqueESSymbolType(symbol) { - const type = createTypeWithSymbol(8192 /* UniqueESSymbol */, symbol); + const type = createTypeWithSymbol(16384 /* UniqueESSymbol */, symbol); type.escapedName = `__@${type.symbol.escapedName}@${getSymbolId(type.symbol)}`; return type; } @@ -67987,7 +68132,7 @@ function createTypeChecker(host) { result = target.objectFlags & 4 /* Reference */ ? createDeferredTypeReference(type.target, type.node, newMapper, newAliasSymbol, newAliasTypeArguments) : target.objectFlags & 32 /* Mapped */ ? instantiateMappedType(target, newMapper, newAliasSymbol, newAliasTypeArguments) : instantiateAnonymousType(target, newMapper, newAliasSymbol, newAliasTypeArguments); target.instantiations.set(id, result); const resultObjectFlags = getObjectFlags(result); - if (result.flags & 3899393 /* ObjectFlagsType */ && !(resultObjectFlags & 524288 /* CouldContainTypeVariablesComputed */)) { + if (result.flags & 403963917 /* ObjectFlagsType */ && !(resultObjectFlags & 524288 /* CouldContainTypeVariablesComputed */)) { const resultCouldContainTypeVariables = some(typeArguments, couldContainTypeVariables); if (!(getObjectFlags(result) & 524288 /* CouldContainTypeVariablesComputed */)) { if (resultObjectFlags & (32 /* Mapped */ | 16 /* Anonymous */ | 4 /* Reference */)) { @@ -68050,9 +68195,9 @@ function createTypeChecker(host) { } function getHomomorphicTypeVariable(type) { const constraintType = getConstraintTypeFromMappedType(type); - if (constraintType.flags & 4194304 /* Index */) { + if (constraintType.flags & 2097152 /* Index */) { const typeVariable = getActualTypeVariable(constraintType.type); - if (typeVariable.flags & 262144 /* TypeParameter */) { + if (typeVariable.flags & 524288 /* TypeParameter */) { return typeVariable; } } @@ -68068,7 +68213,7 @@ function createTypeChecker(host) { } return instantiateType(getConstraintTypeFromMappedType(type), mapper) === wildcardType ? wildcardType : instantiateAnonymousType(type, mapper, aliasSymbol, aliasTypeArguments); function instantiateConstituent(t) { - if (t.flags & (3 /* AnyOrUnknown */ | 58982400 /* InstantiableNonPrimitive */ | 524288 /* Object */ | 2097152 /* Intersection */) && t !== wildcardType && !isErrorType(t)) { + if (t.flags & (3 /* AnyOrUnknown */ | 117964800 /* InstantiableNonPrimitive */ | 1048576 /* Object */ | 268435456 /* Intersection */) && t !== wildcardType && !isErrorType(t)) { if (!type.declaration.nameType) { let constraint; if (isArrayType(t) || t.flags & 1 /* Any */ && findResolutionCycleStartIndex(typeVariable, 4 /* ImmediateBaseConstraint */) < 0 && (constraint = getConstraintOfTypeParameter(typeVariable)) && everyType(constraint, isArrayOrTupleType)) { @@ -68116,7 +68261,7 @@ function createTypeChecker(host) { const templateMapper = appendTypeMapping(mapper, getTypeParameterFromMappedType(type), key); const propType = instantiateType(getTemplateTypeFromMappedType(type.target || type), templateMapper); const modifiers = getMappedTypeModifiers(type); - return strictNullChecks && modifiers & 4 /* IncludeOptional */ && !maybeTypeOfKind(propType, 32768 /* Undefined */ | 16384 /* Void */) ? getOptionalType( + return strictNullChecks && modifiers & 4 /* IncludeOptional */ && !maybeTypeOfKind(propType, 4 /* Undefined */ | 16 /* Void */) ? getOptionalType( propType, /*isProperty*/ true @@ -68153,7 +68298,7 @@ function createTypeChecker(host) { const newMapper = createTypeMapper(root.outerTypeParameters, typeArguments); const checkType = root.checkType; const distributionType = root.isDistributive ? getReducedType(getMappedType(checkType, newMapper)) : void 0; - result = distributionType && checkType !== distributionType && distributionType.flags & (1048576 /* Union */ | 131072 /* Never */) ? mapTypeWithAlias(distributionType, (t) => getConditionalType(root, prependTypeMapping(checkType, t, newMapper), forConstraint), aliasSymbol, aliasTypeArguments) : getConditionalType(root, newMapper, forConstraint, aliasSymbol, aliasTypeArguments); + result = distributionType && checkType !== distributionType && distributionType.flags & (134217728 /* Union */ | 262144 /* Never */) ? mapTypeWithAlias(distributionType, (t) => getConditionalType(root, prependTypeMapping(checkType, t, newMapper), forConstraint), aliasSymbol, aliasTypeArguments) : getConditionalType(root, newMapper, forConstraint, aliasSymbol, aliasTypeArguments); root.instantiations.set(id, result); } return result; @@ -68204,10 +68349,10 @@ function createTypeChecker(host) { } function instantiateTypeWorker(type, mapper, aliasSymbol, aliasTypeArguments) { const flags = type.flags; - if (flags & 262144 /* TypeParameter */) { + if (flags & 524288 /* TypeParameter */) { return getMappedType(type, mapper); } - if (flags & 524288 /* Object */) { + if (flags & 1048576 /* Object */) { const objectFlags = type.objectFlags; if (objectFlags & (4 /* Reference */ | 16 /* Anonymous */ | 32 /* Mapped */)) { if (objectFlags & 4 /* Reference */ && !type.node) { @@ -68222,27 +68367,27 @@ function createTypeChecker(host) { } return type; } - if (flags & 3145728 /* UnionOrIntersection */) { - const origin = type.flags & 1048576 /* Union */ ? type.origin : void 0; - const types = origin && origin.flags & 3145728 /* UnionOrIntersection */ ? origin.types : type.types; + if (flags & 402653184 /* UnionOrIntersection */) { + const origin = type.flags & 134217728 /* Union */ ? type.origin : void 0; + const types = origin && origin.flags & 402653184 /* UnionOrIntersection */ ? origin.types : type.types; const newTypes = instantiateTypes(types, mapper); if (newTypes === types && aliasSymbol === type.aliasSymbol) { return type; } const newAliasSymbol = aliasSymbol || type.aliasSymbol; const newAliasTypeArguments = aliasSymbol ? aliasTypeArguments : instantiateTypes(type.aliasTypeArguments, mapper); - return flags & 2097152 /* Intersection */ || origin && origin.flags & 2097152 /* Intersection */ ? getIntersectionType(newTypes, 0 /* None */, newAliasSymbol, newAliasTypeArguments) : getUnionType(newTypes, 1 /* Literal */, newAliasSymbol, newAliasTypeArguments); + return flags & 268435456 /* Intersection */ || origin && origin.flags & 268435456 /* Intersection */ ? getIntersectionType(newTypes, 0 /* None */, newAliasSymbol, newAliasTypeArguments) : getUnionType(newTypes, 1 /* Literal */, newAliasSymbol, newAliasTypeArguments); } - if (flags & 4194304 /* Index */) { + if (flags & 2097152 /* Index */) { return getIndexType(instantiateType(type.type, mapper)); } - if (flags & 134217728 /* TemplateLiteral */) { + if (flags & 4194304 /* TemplateLiteral */) { return getTemplateLiteralType(type.texts, instantiateTypes(type.types, mapper)); } - if (flags & 268435456 /* StringMapping */) { + if (flags & 8388608 /* StringMapping */) { return getStringMappingType(type.symbol, instantiateType(type.type, mapper)); } - if (flags & 8388608 /* IndexedAccess */) { + if (flags & 33554432 /* IndexedAccess */) { const newAliasSymbol = aliasSymbol || type.aliasSymbol; const newAliasTypeArguments = aliasSymbol ? aliasTypeArguments : instantiateTypes(type.aliasTypeArguments, mapper); return getIndexedAccessType( @@ -68255,7 +68400,7 @@ function createTypeChecker(host) { newAliasTypeArguments ); } - if (flags & 16777216 /* Conditional */) { + if (flags & 67108864 /* Conditional */) { return getConditionalTypeInstantiation( type, combineTypeMappers(type.mapper, mapper), @@ -68265,19 +68410,19 @@ function createTypeChecker(host) { aliasTypeArguments ); } - if (flags & 33554432 /* Substitution */) { + if (flags & 16777216 /* Substitution */) { const newBaseType = instantiateType(type.baseType, mapper); if (isNoInferType(type)) { return getNoInferType(newBaseType); } const newConstraint = instantiateType(type.constraint, mapper); - if (newBaseType.flags & 8650752 /* TypeVariable */ && isGenericType(newConstraint)) { + if (newBaseType.flags & 34078720 /* TypeVariable */ && isGenericType(newConstraint)) { return getSubstitutionType(newBaseType, newConstraint); } if (newConstraint.flags & 3 /* AnyOrUnknown */ || isTypeAssignableTo(getRestrictiveInstantiation(newBaseType), getRestrictiveInstantiation(newConstraint))) { return newBaseType; } - return newBaseType.flags & 8650752 /* TypeVariable */ ? getSubstitutionType(newBaseType, newConstraint) : getIntersectionType([newConstraint, newBaseType]); + return newBaseType.flags & 34078720 /* TypeVariable */ ? getSubstitutionType(newBaseType, newConstraint) : getIntersectionType([newConstraint, newBaseType]); } return type; } @@ -68287,7 +68432,7 @@ function createTypeChecker(host) { return type; } const innerIndexType = instantiateType(type.constraintType, mapper); - if (!(innerIndexType.flags & 4194304 /* Index */)) { + if (!(innerIndexType.flags & 2097152 /* Index */)) { return type; } const instantiated = inferTypeForHomomorphicMappedType( @@ -68301,10 +68446,10 @@ function createTypeChecker(host) { return type; } function getPermissiveInstantiation(type) { - return type.flags & (402784252 /* Primitive */ | 3 /* AnyOrUnknown */ | 131072 /* Never */) ? type : type.permissiveInstantiation || (type.permissiveInstantiation = instantiateType(type, permissiveMapper)); + return type.flags & (12713980 /* Primitive */ | 3 /* AnyOrUnknown */ | 262144 /* Never */) ? type : type.permissiveInstantiation || (type.permissiveInstantiation = instantiateType(type, permissiveMapper)); } function getRestrictiveInstantiation(type) { - if (type.flags & (402784252 /* Primitive */ | 3 /* AnyOrUnknown */ | 131072 /* Never */)) { + if (type.flags & (12713980 /* Primitive */ | 3 /* AnyOrUnknown */ | 262144 /* Never */)) { return type; } if (type.restrictiveInstantiation) { @@ -68343,7 +68488,8 @@ function createTypeChecker(host) { const { initializer } = node; return !!initializer && isContextSensitive(initializer); } - case 295 /* JsxExpression */: { + case 295 /* JsxExpression */: + case 230 /* YieldExpression */: { const { expression } = node; return !!expression && isContextSensitive(expression); } @@ -68351,7 +68497,7 @@ function createTypeChecker(host) { return false; } function isContextSensitiveFunctionLikeDeclaration(node) { - return hasContextSensitiveParameters(node) || hasContextSensitiveReturnExpression(node); + return hasContextSensitiveParameters(node) || hasContextSensitiveReturnExpression(node) || hasContextSensitiveYieldExpression(node); } function hasContextSensitiveReturnExpression(node) { if (node.typeParameters || getEffectiveReturnTypeNode(node) || !node.body) { @@ -68362,11 +68508,14 @@ function createTypeChecker(host) { } return !!forEachReturnStatement(node.body, (statement) => !!statement.expression && isContextSensitive(statement.expression)); } + function hasContextSensitiveYieldExpression(node) { + return !!(getFunctionFlags(node) & 1 /* Generator */ && node.body && forEachYieldExpression(node.body, isContextSensitive)); + } function isContextSensitiveFunctionOrObjectLiteralMethod(func) { return (isFunctionExpressionOrArrowFunction(func) || isObjectLiteralMethod(func)) && isContextSensitiveFunctionLikeDeclaration(func); } function getTypeWithoutSignatures(type) { - if (type.flags & 524288 /* Object */) { + if (type.flags & 1048576 /* Object */) { const resolved = resolveStructuredTypeMembers(type); if (resolved.constructSignatures.length || resolved.callSignatures.length) { const result = createObjectType(16 /* Anonymous */, type.symbol); @@ -68377,7 +68526,7 @@ function createTypeChecker(host) { result.indexInfos = emptyArray; return result; } - } else if (type.flags & 2097152 /* Intersection */) { + } else if (type.flags & 268435456 /* Intersection */) { return getIntersectionType(map(type.types, getTypeWithoutSignatures)); } return type; @@ -68404,7 +68553,7 @@ function createTypeChecker(host) { return isTypeRelatedTo(source, target, assignableRelation); } function isTypeDerivedFrom(source, target) { - return source.flags & 1048576 /* Union */ ? every(source.types, (t) => isTypeDerivedFrom(t, target)) : target.flags & 1048576 /* Union */ ? some(target.types, (t) => isTypeDerivedFrom(source, t)) : source.flags & 2097152 /* Intersection */ ? some(source.types, (t) => isTypeDerivedFrom(t, target)) : source.flags & 58982400 /* InstantiableNonPrimitive */ ? isTypeDerivedFrom(getBaseConstraintOfType(source) || unknownType, target) : isEmptyAnonymousObjectType(target) ? !!(source.flags & (524288 /* Object */ | 67108864 /* NonPrimitive */)) : target === globalObjectType ? !!(source.flags & (524288 /* Object */ | 67108864 /* NonPrimitive */)) && !isEmptyAnonymousObjectType(source) : target === globalFunctionType ? !!(source.flags & 524288 /* Object */) && isFunctionObjectType(source) : hasBaseType(source, getTargetType(target)) || isArrayType(target) && !isReadonlyArrayType(target) && isTypeDerivedFrom(source, globalReadonlyArrayType); + return source.flags & 134217728 /* Union */ ? every(source.types, (t) => isTypeDerivedFrom(t, target)) : target.flags & 134217728 /* Union */ ? some(target.types, (t) => isTypeDerivedFrom(source, t)) : source.flags & 268435456 /* Intersection */ ? some(source.types, (t) => isTypeDerivedFrom(t, target)) : source.flags & 117964800 /* InstantiableNonPrimitive */ ? isTypeDerivedFrom(getBaseConstraintOfType(source) || unknownType, target) : isEmptyAnonymousObjectType(target) ? !!(source.flags & (1048576 /* Object */ | 131072 /* NonPrimitive */)) : target === globalObjectType ? !!(source.flags & (1048576 /* Object */ | 131072 /* NonPrimitive */)) && !isEmptyAnonymousObjectType(source) : target === globalFunctionType ? !!(source.flags & 1048576 /* Object */) && isFunctionObjectType(source) : hasBaseType(source, getTargetType(target)) || isArrayType(target) && !isReadonlyArrayType(target) && isTypeDerivedFrom(source, globalReadonlyArrayType); } function isTypeComparableTo(source, target) { return isTypeRelatedTo(source, target, comparableRelation); @@ -68436,7 +68585,7 @@ function createTypeChecker(host) { return false; } function isOrHasGenericConditional(type) { - return !!(type.flags & 16777216 /* Conditional */ || type.flags & 2097152 /* Intersection */ && some(type.types, isOrHasGenericConditional)); + return !!(type.flags & 67108864 /* Conditional */ || type.flags & 268435456 /* Intersection */ && some(type.types, isOrHasGenericConditional)); } function elaborateError(node, source, target, relation, headMessage, containingMessageChain, errorOutputContainer) { if (!node || isOrHasGenericConditional(target)) return false; @@ -68482,7 +68631,7 @@ function createTypeChecker(host) { for (const signatures of [constructSignatures, callSignatures]) { if (some(signatures, (s) => { const returnType = getReturnTypeOfSignature(s); - return !(returnType.flags & (1 /* Any */ | 131072 /* Never */)) && checkTypeRelatedTo( + return !(returnType.flags & (1 /* Any */ | 262144 /* Never */)) && checkTypeRelatedTo( returnType, target, relation, @@ -68589,7 +68738,7 @@ function createTypeChecker(host) { if (idx) { return idx; } - if (target.flags & 1048576 /* Union */) { + if (target.flags & 134217728 /* Union */) { const best = getBestMatchingType(source, target); if (best) { return getIndexedAccessTypeOrUndefined(best, nameType); @@ -68612,7 +68761,7 @@ function createTypeChecker(host) { for (const value of iterator) { const { errorNode: prop, innerExpression: next, nameType, errorMessage } = value; let targetPropType = getBestMatchIndexedAccessTypeOrUndefined(source, target, nameType); - if (!targetPropType || targetPropType.flags & 8388608 /* IndexedAccess */) continue; + if (!targetPropType || targetPropType.flags & 33554432 /* IndexedAccess */) continue; let sourcePropType = getIndexedAccessTypeOrUndefined(source, nameType); if (!sourcePropType) continue; const propName = getPropertyNameFromIndex( @@ -68662,20 +68811,20 @@ function createTypeChecker(host) { let issuedElaboration = false; if (!targetProp) { const indexInfo = getApplicableIndexInfo(target, nameType); - if (indexInfo && indexInfo.declaration && !getSourceFileOfNode(indexInfo.declaration).hasNoDefaultLib) { + if (indexInfo && indexInfo.declaration && !host.isSourceFileDefaultLibrary(getSourceFileOfNode(indexInfo.declaration))) { issuedElaboration = true; addRelatedInfo(reportedDiag, createDiagnosticForNode(indexInfo.declaration, Diagnostics.The_expected_type_comes_from_this_index_signature)); } } if (!issuedElaboration && (targetProp && length(targetProp.declarations) || target.symbol && length(target.symbol.declarations))) { const targetNode = targetProp && length(targetProp.declarations) ? targetProp.declarations[0] : target.symbol.declarations[0]; - if (!getSourceFileOfNode(targetNode).hasNoDefaultLib) { + if (!host.isSourceFileDefaultLibrary(getSourceFileOfNode(targetNode))) { addRelatedInfo( reportedDiag, createDiagnosticForNode( targetNode, Diagnostics.The_expected_type_comes_from_property_0_which_is_declared_here_on_type_1, - propertyName && !(nameType.flags & 8192 /* UniqueESSymbol */) ? unescapeLeadingUnderscores(propertyName) : typeToString(nameType), + propertyName && !(nameType.flags & 16384 /* UniqueESSymbol */) ? unescapeLeadingUnderscores(propertyName) : typeToString(nameType), typeToString(target) ) ); @@ -68702,7 +68851,7 @@ function createTypeChecker(host) { const { errorNode: prop, innerExpression: next, nameType, errorMessage } = status.value; let targetPropType = iterationType; const targetIndexedPropType = tupleOrArrayLikeTargetParts !== neverType ? getBestMatchIndexedAccessTypeOrUndefined(source, tupleOrArrayLikeTargetParts, nameType) : void 0; - if (targetIndexedPropType && !(targetIndexedPropType.flags & 8388608 /* IndexedAccess */)) { + if (targetIndexedPropType && !(targetIndexedPropType.flags & 33554432 /* IndexedAccess */)) { targetPropType = iterationType ? getUnionType([iterationType, targetIndexedPropType]) : targetIndexedPropType; } if (!targetPropType) continue; @@ -68842,9 +68991,9 @@ function createTypeChecker(host) { const elem = getElaborationElementForJsxChild(child, childrenNameType, getInvalidTextualChildDiagnostic); if (elem) { result = elaborateElementwise( - function* () { + (function* () { yield elem; - }(), + })(), source, target, relation, @@ -68892,7 +69041,7 @@ function createTypeChecker(host) { } } function elaborateArrayLiteral(node, source, target, relation, containingMessageChain, errorOutputContainer) { - if (target.flags & (402784252 /* Primitive */ | 131072 /* Never */)) return false; + if (target.flags & (12713980 /* Primitive */ | 262144 /* Never */)) return false; if (isTupleLikeType(source)) { return elaborateElementwise(generateLimitedTupleElements(node, target), source, target, relation, containingMessageChain, errorOutputContainer); } @@ -68918,8 +69067,8 @@ function createTypeChecker(host) { if (!length(node.properties)) return; for (const prop of node.properties) { if (isSpreadAssignment(prop)) continue; - const type = getLiteralTypeFromProperty(getSymbolOfDeclaration(prop), 8576 /* StringOrNumberLiteralOrUnique */); - if (!type || type.flags & 131072 /* Never */) { + const type = getLiteralTypeFromProperty(getSymbolOfDeclaration(prop), 19456 /* StringOrNumberLiteralOrUnique */); + if (!type || type.flags & 262144 /* Never */) { continue; } switch (prop.kind) { @@ -68938,7 +69087,7 @@ function createTypeChecker(host) { } } function elaborateObjectLiteral(node, source, target, relation, containingMessageChain, errorOutputContainer) { - if (target.flags & (402784252 /* Primitive */ | 131072 /* Never */)) return false; + if (target.flags & (12713980 /* Primitive */ | 262144 /* Never */)) return false; return elaborateElementwise(generateObjectLiteralElements(node), source, target, relation, containingMessageChain, errorOutputContainer); } function checkTypeComparableTo(source, target, errorNode, headMessage, containingMessageChain) { @@ -68964,11 +69113,11 @@ function createTypeChecker(host) { if (!s.typeParameters && (!s.thisParameter || isTypeAny(getTypeOfParameter(s.thisParameter))) && s.parameters.length === 1 && signatureHasRestParameter(s)) { const paramType = getTypeOfParameter(s.parameters[0]); const restType = isArrayType(paramType) ? getTypeArguments(paramType)[0] : paramType; - return !!(restType.flags & (1 /* Any */ | 131072 /* Never */) && getReturnTypeOfSignature(s).flags & 3 /* AnyOrUnknown */); + return !!(restType.flags & (1 /* Any */ | 262144 /* Never */) && getReturnTypeOfSignature(s).flags & 3 /* AnyOrUnknown */); } return false; } - function compareSignaturesRelated(source, target, checkMode, reportErrors2, errorReporter, incompatibleErrorReporter, compareTypes, reportUnreliableMarkers) { + function compareSignaturesRelated(source, target, checkMode, reportErrors2, errorReporter, incompatibleErrorReporter, compareTypes2, reportUnreliableMarkers) { if (source === target) { return -1 /* True */; } @@ -68993,7 +69142,7 @@ function createTypeChecker(host) { target, /*inferenceContext*/ void 0, - compareTypes + compareTypes2 ); } const sourceCount = getParameterCount(source); @@ -69009,12 +69158,12 @@ function createTypeChecker(host) { if (sourceThisType && sourceThisType !== voidType) { const targetThisType = getThisTypeOfSignature(target); if (targetThisType) { - const related = !strictVariance && compareTypes( + const related = !strictVariance && compareTypes2( sourceThisType, targetThisType, /*reportErrors*/ false - ) || compareTypes(targetThisType, sourceThisType, reportErrors2); + ) || compareTypes2(targetThisType, sourceThisType, reportErrors2); if (!related) { if (reportErrors2) { errorReporter(Diagnostics.The_this_types_of_each_signature_are_incompatible); @@ -69033,13 +69182,13 @@ function createTypeChecker(host) { const sourceSig = checkMode & 3 /* Callback */ || isInstantiatedGenericParameter(source, i) ? void 0 : getSingleCallSignature(getNonNullableType(sourceType)); const targetSig = checkMode & 3 /* Callback */ || isInstantiatedGenericParameter(target, i) ? void 0 : getSingleCallSignature(getNonNullableType(targetType)); const callbacks = sourceSig && targetSig && !getTypePredicateOfSignature(sourceSig) && !getTypePredicateOfSignature(targetSig) && getTypeFacts(sourceType, 50331648 /* IsUndefinedOrNull */) === getTypeFacts(targetType, 50331648 /* IsUndefinedOrNull */); - let related = callbacks ? compareSignaturesRelated(targetSig, sourceSig, checkMode & 8 /* StrictArity */ | (strictVariance ? 2 /* StrictCallback */ : 1 /* BivariantCallback */), reportErrors2, errorReporter, incompatibleErrorReporter, compareTypes, reportUnreliableMarkers) : !(checkMode & 3 /* Callback */) && !strictVariance && compareTypes( + let related = callbacks ? compareSignaturesRelated(targetSig, sourceSig, checkMode & 8 /* StrictArity */ | (strictVariance ? 2 /* StrictCallback */ : 1 /* BivariantCallback */), reportErrors2, errorReporter, incompatibleErrorReporter, compareTypes2, reportUnreliableMarkers) : !(checkMode & 3 /* Callback */) && !strictVariance && compareTypes2( sourceType, targetType, /*reportErrors*/ false - ) || compareTypes(targetType, sourceType, reportErrors2); - if (related && checkMode & 8 /* StrictArity */ && i >= getMinArgumentCount(source) && i < getMinArgumentCount(target) && compareTypes( + ) || compareTypes2(targetType, sourceType, reportErrors2); + if (related && checkMode & 8 /* StrictArity */ && i >= getMinArgumentCount(source) && i < getMinArgumentCount(target) && compareTypes2( sourceType, targetType, /*reportErrors*/ @@ -69066,7 +69215,7 @@ function createTypeChecker(host) { if (targetTypePredicate) { const sourceTypePredicate = getTypePredicateOfSignature(source); if (sourceTypePredicate) { - result &= compareTypePredicateRelatedTo(sourceTypePredicate, targetTypePredicate, reportErrors2, errorReporter, compareTypes); + result &= compareTypePredicateRelatedTo(sourceTypePredicate, targetTypePredicate, reportErrors2, errorReporter, compareTypes2); } else if (isIdentifierTypePredicate(targetTypePredicate) || isThisTypePredicate(targetTypePredicate)) { if (reportErrors2) { errorReporter(Diagnostics.Signature_0_must_be_a_type_predicate, signatureToString(source)); @@ -69074,12 +69223,12 @@ function createTypeChecker(host) { return 0 /* False */; } } else { - result &= checkMode & 1 /* BivariantCallback */ && compareTypes( + result &= checkMode & 1 /* BivariantCallback */ && compareTypes2( targetReturnType, sourceReturnType, /*reportErrors*/ false - ) || compareTypes(sourceReturnType, targetReturnType, reportErrors2); + ) || compareTypes2(sourceReturnType, targetReturnType, reportErrors2); if (!result && reportErrors2 && incompatibleErrorReporter) { incompatibleErrorReporter(sourceReturnType, targetReturnType); } @@ -69087,7 +69236,7 @@ function createTypeChecker(host) { } return result; } - function compareTypePredicateRelatedTo(source, target, reportErrors2, errorReporter, compareTypes) { + function compareTypePredicateRelatedTo(source, target, reportErrors2, errorReporter, compareTypes2) { if (source.kind !== target.kind) { if (reportErrors2) { errorReporter(Diagnostics.A_this_based_type_guard_is_not_compatible_with_a_parameter_based_type_guard); @@ -69104,7 +69253,7 @@ function createTypeChecker(host) { return 0 /* False */; } } - const related = source.type === target.type ? -1 /* True */ : source.type && target.type ? compareTypes(source.type, target.type, reportErrors2) : 0 /* False */; + const related = source.type === target.type ? -1 /* True */ : source.type && target.type ? compareTypes2(source.type, target.type, reportErrors2) : 0 /* False */; if (related === 0 /* False */ && reportErrors2) { errorReporter(Diagnostics.Type_predicate_0_is_not_assignable_to_1, typePredicateToString(source), typePredicateToString(target)); } @@ -69129,30 +69278,30 @@ function createTypeChecker(host) { return t !== anyFunctionType && t.properties.length === 0 && t.callSignatures.length === 0 && t.constructSignatures.length === 0 && t.indexInfos.length === 0; } function isEmptyObjectType(type) { - return type.flags & 524288 /* Object */ ? !isGenericMappedType(type) && isEmptyResolvedType(resolveStructuredTypeMembers(type)) : type.flags & 67108864 /* NonPrimitive */ ? true : type.flags & 1048576 /* Union */ ? some(type.types, isEmptyObjectType) : type.flags & 2097152 /* Intersection */ ? every(type.types, isEmptyObjectType) : false; + return type.flags & 1048576 /* Object */ ? !isGenericMappedType(type) && isEmptyResolvedType(resolveStructuredTypeMembers(type)) : type.flags & 131072 /* NonPrimitive */ ? true : type.flags & 134217728 /* Union */ ? some(type.types, isEmptyObjectType) : type.flags & 268435456 /* Intersection */ ? every(type.types, isEmptyObjectType) : false; } function isEmptyAnonymousObjectType(type) { return !!(getObjectFlags(type) & 16 /* Anonymous */ && (type.members && isEmptyResolvedType(type) || type.symbol && type.symbol.flags & 2048 /* TypeLiteral */ && getMembersOfSymbol(type.symbol).size === 0)); } function isUnknownLikeUnionType(type) { - if (strictNullChecks && type.flags & 1048576 /* Union */) { + if (strictNullChecks && type.flags & 134217728 /* Union */) { if (!(type.objectFlags & 33554432 /* IsUnknownLikeUnionComputed */)) { const types = type.types; - type.objectFlags |= 33554432 /* IsUnknownLikeUnionComputed */ | (types.length >= 3 && types[0].flags & 32768 /* Undefined */ && types[1].flags & 65536 /* Null */ && some(types, isEmptyAnonymousObjectType) ? 67108864 /* IsUnknownLikeUnion */ : 0); + type.objectFlags |= 33554432 /* IsUnknownLikeUnionComputed */ | (types.length >= 3 && types[0].flags & 4 /* Undefined */ && types[1].flags & 8 /* Null */ && some(types, isEmptyAnonymousObjectType) ? 67108864 /* IsUnknownLikeUnion */ : 0); } return !!(type.objectFlags & 67108864 /* IsUnknownLikeUnion */); } return false; } function containsUndefinedType(type) { - return !!((type.flags & 1048576 /* Union */ ? type.types[0] : type).flags & 32768 /* Undefined */); + return !!((type.flags & 134217728 /* Union */ ? type.types[0] : type).flags & 4 /* Undefined */); } function containsNonMissingUndefinedType(type) { - const candidate = type.flags & 1048576 /* Union */ ? type.types[0] : type; - return !!(candidate.flags & 32768 /* Undefined */) && candidate !== missingType; + const candidate = type.flags & 134217728 /* Union */ ? type.types[0] : type; + return !!(candidate.flags & 4 /* Undefined */) && candidate !== missingType; } function isStringIndexSignatureOnlyType(type) { - return type.flags & 524288 /* Object */ && !isGenericMappedType(type) && getPropertiesOfType(type).length === 0 && getIndexInfosOfType(type).length === 1 && !!getIndexInfoOfType(type, stringType) || type.flags & 3145728 /* UnionOrIntersection */ && every(type.types, isStringIndexSignatureOnlyType) || false; + return type.flags & 1048576 /* Object */ && !isGenericMappedType(type) && getPropertiesOfType(type).length === 0 && getIndexInfosOfType(type).length === 1 && !!getIndexInfoOfType(type, stringType) || type.flags & 402653184 /* UnionOrIntersection */ && every(type.types, isStringIndexSignatureOnlyType) || false; } function isEnumTypeRelatedTo(source, target, errorReporter) { const sourceSymbol = source.flags & 8 /* EnumMember */ ? getParentOfSymbol(source) : source; @@ -69217,28 +69366,28 @@ function createTypeChecker(host) { function isSimpleTypeRelatedTo(source, target, relation, errorReporter) { const s = source.flags; const t = target.flags; - if (t & 1 /* Any */ || s & 131072 /* Never */ || source === wildcardType) return true; + if (t & 1 /* Any */ || s & 262144 /* Never */ || source === wildcardType) return true; if (t & 2 /* Unknown */ && !(relation === strictSubtypeRelation && s & 1 /* Any */)) return true; - if (t & 131072 /* Never */) return false; - if (s & 402653316 /* StringLike */ && t & 4 /* String */) return true; - if (s & 128 /* StringLiteral */ && s & 1024 /* EnumLiteral */ && t & 128 /* StringLiteral */ && !(t & 1024 /* EnumLiteral */) && source.value === target.value) return true; - if (s & 296 /* NumberLike */ && t & 8 /* Number */) return true; - if (s & 256 /* NumberLiteral */ && s & 1024 /* EnumLiteral */ && t & 256 /* NumberLiteral */ && !(t & 1024 /* EnumLiteral */) && source.value === target.value) return true; - if (s & 2112 /* BigIntLike */ && t & 64 /* BigInt */) return true; - if (s & 528 /* BooleanLike */ && t & 16 /* Boolean */) return true; - if (s & 12288 /* ESSymbolLike */ && t & 4096 /* ESSymbol */) return true; - if (s & 32 /* Enum */ && t & 32 /* Enum */ && source.symbol.escapedName === target.symbol.escapedName && isEnumTypeRelatedTo(source.symbol, target.symbol, errorReporter)) return true; - if (s & 1024 /* EnumLiteral */ && t & 1024 /* EnumLiteral */) { - if (s & 1048576 /* Union */ && t & 1048576 /* Union */ && isEnumTypeRelatedTo(source.symbol, target.symbol, errorReporter)) return true; - if (s & 2944 /* Literal */ && t & 2944 /* Literal */ && source.value === target.value && isEnumTypeRelatedTo(source.symbol, target.symbol, errorReporter)) return true; - } - if (s & 32768 /* Undefined */ && (!strictNullChecks && !(t & 3145728 /* UnionOrIntersection */) || t & (32768 /* Undefined */ | 16384 /* Void */))) return true; - if (s & 65536 /* Null */ && (!strictNullChecks && !(t & 3145728 /* UnionOrIntersection */) || t & 65536 /* Null */)) return true; - if (s & 524288 /* Object */ && t & 67108864 /* NonPrimitive */ && !(relation === strictSubtypeRelation && isEmptyAnonymousObjectType(source) && !(getObjectFlags(source) & 8192 /* FreshLiteral */))) return true; + if (t & 262144 /* Never */) return false; + if (s & 12583968 /* StringLike */ && t & 32 /* String */) return true; + if (s & 1024 /* StringLiteral */ && s & 32768 /* EnumLiteral */ && t & 1024 /* StringLiteral */ && !(t & 32768 /* EnumLiteral */) && source.value === target.value) return true; + if (s & 67648 /* NumberLike */ && t & 64 /* Number */) return true; + if (s & 2048 /* NumberLiteral */ && s & 32768 /* EnumLiteral */ && t & 2048 /* NumberLiteral */ && !(t & 32768 /* EnumLiteral */) && source.value === target.value) return true; + if (s & 4224 /* BigIntLike */ && t & 128 /* BigInt */) return true; + if (s & 8448 /* BooleanLike */ && t & 256 /* Boolean */) return true; + if (s & 16896 /* ESSymbolLike */ && t & 512 /* ESSymbol */) return true; + if (s & 65536 /* Enum */ && t & 65536 /* Enum */ && source.symbol.escapedName === target.symbol.escapedName && isEnumTypeRelatedTo(source.symbol, target.symbol, errorReporter)) return true; + if (s & 32768 /* EnumLiteral */ && t & 32768 /* EnumLiteral */) { + if (s & 134217728 /* Union */ && t & 134217728 /* Union */ && isEnumTypeRelatedTo(source.symbol, target.symbol, errorReporter)) return true; + if (s & 15360 /* Literal */ && t & 15360 /* Literal */ && source.value === target.value && isEnumTypeRelatedTo(source.symbol, target.symbol, errorReporter)) return true; + } + if (s & 4 /* Undefined */ && (!strictNullChecks && !(t & 402653184 /* UnionOrIntersection */) || t & (4 /* Undefined */ | 16 /* Void */))) return true; + if (s & 8 /* Null */ && (!strictNullChecks && !(t & 402653184 /* UnionOrIntersection */) || t & 8 /* Null */)) return true; + if (s & 1048576 /* Object */ && t & 131072 /* NonPrimitive */ && !(relation === strictSubtypeRelation && isEmptyAnonymousObjectType(source) && !(getObjectFlags(source) & 8192 /* FreshLiteral */))) return true; if (relation === assignableRelation || relation === comparableRelation) { if (s & 1 /* Any */) return true; - if (s & 8 /* Number */ && (t & 32 /* Enum */ || t & 256 /* NumberLiteral */ && t & 1024 /* EnumLiteral */)) return true; - if (s & 256 /* NumberLiteral */ && !(s & 1024 /* EnumLiteral */) && (t & 32 /* Enum */ || t & 256 /* NumberLiteral */ && t & 1024 /* EnumLiteral */ && source.value === target.value)) return true; + if (s & 64 /* Number */ && (t & 65536 /* Enum */ || t & 2048 /* NumberLiteral */ && t & 32768 /* EnumLiteral */)) return true; + if (s & 2048 /* NumberLiteral */ && !(s & 32768 /* EnumLiteral */) && (t & 65536 /* Enum */ || t & 2048 /* NumberLiteral */ && t & 32768 /* EnumLiteral */ && source.value === target.value)) return true; if (isUnknownLikeUnionType(target)) return true; } return false; @@ -69254,14 +69403,14 @@ function createTypeChecker(host) { return true; } if (relation !== identityRelation) { - if (relation === comparableRelation && !(target.flags & 131072 /* Never */) && isSimpleTypeRelatedTo(target, source, relation) || isSimpleTypeRelatedTo(source, target, relation)) { + if (relation === comparableRelation && !(target.flags & 262144 /* Never */) && isSimpleTypeRelatedTo(target, source, relation) || isSimpleTypeRelatedTo(source, target, relation)) { return true; } - } else if (!((source.flags | target.flags) & (3145728 /* UnionOrIntersection */ | 8388608 /* IndexedAccess */ | 16777216 /* Conditional */ | 33554432 /* Substitution */))) { + } else if (!((source.flags | target.flags) & (402653184 /* UnionOrIntersection */ | 33554432 /* IndexedAccess */ | 67108864 /* Conditional */ | 16777216 /* Substitution */))) { if (source.flags !== target.flags) return false; - if (source.flags & 67358815 /* Singleton */) return true; + if (source.flags & 394239 /* Singleton */) return true; } - if (source.flags & 524288 /* Object */ && target.flags & 524288 /* Object */) { + if (source.flags & 1048576 /* Object */ && target.flags & 1048576 /* Object */) { const related = relation.get(getRelationKey( source, target, @@ -69274,7 +69423,7 @@ function createTypeChecker(host) { return !!(related & 1 /* Succeeded */); } } - if (source.flags & 469499904 /* StructuredOrInstantiable */ || target.flags & 469499904 /* StructuredOrInstantiable */) { + if (source.flags & 536346624 /* StructuredOrInstantiable */ || target.flags & 536346624 /* StructuredOrInstantiable */) { return checkTypeRelatedTo( source, target, @@ -69290,7 +69439,7 @@ function createTypeChecker(host) { } function getNormalizedType(type, writing) { while (true) { - const t = isFreshLiteralType(type) ? type.regularType : isGenericTupleType(type) ? getNormalizedTupleType(type, writing) : getObjectFlags(type) & 4 /* Reference */ ? type.node ? createTypeReference(type.target, getTypeArguments(type)) : getSingleBaseForNonAugmentingSubtype(type) || type : type.flags & 3145728 /* UnionOrIntersection */ ? getNormalizedUnionOrIntersectionType(type, writing) : type.flags & 33554432 /* Substitution */ ? writing ? type.baseType : getSubstitutionIntersection(type) : type.flags & 25165824 /* Simplifiable */ ? getSimplifiedType(type, writing) : type; + const t = isFreshLiteralType(type) ? type.regularType : isGenericTupleType(type) ? getNormalizedTupleType(type, writing) : getObjectFlags(type) & 4 /* Reference */ ? type.node ? createTypeReference(type.target, getTypeArguments(type)) : getSingleBaseForNonAugmentingSubtype(type) || type : type.flags & 402653184 /* UnionOrIntersection */ ? getNormalizedUnionOrIntersectionType(type, writing) : type.flags & 16777216 /* Substitution */ ? writing ? type.baseType : getSubstitutionIntersection(type) : type.flags & 102760448 /* Simplifiable */ ? getSimplifiedType(type, writing) : type; if (t === type) return t; type = t; } @@ -69300,7 +69449,7 @@ function createTypeChecker(host) { if (reduced !== type) { return reduced; } - if (type.flags & 2097152 /* Intersection */ && shouldNormalizeIntersection(type)) { + if (type.flags & 268435456 /* Intersection */ && shouldNormalizeIntersection(type)) { const normalizedTypes = sameMap(type.types, (t) => getNormalizedType(t, writing)); if (normalizedTypes !== type.types) { return getIntersectionType(normalizedTypes); @@ -69312,15 +69461,15 @@ function createTypeChecker(host) { let hasInstantiable = false; let hasNullableOrEmpty = false; for (const t of type.types) { - hasInstantiable || (hasInstantiable = !!(t.flags & 465829888 /* Instantiable */)); - hasNullableOrEmpty || (hasNullableOrEmpty = !!(t.flags & 98304 /* Nullable */) || isEmptyAnonymousObjectType(t)); + hasInstantiable || (hasInstantiable = !!(t.flags & 132644864 /* Instantiable */)); + hasNullableOrEmpty || (hasNullableOrEmpty = !!(t.flags & 12 /* Nullable */) || isEmptyAnonymousObjectType(t)); if (hasInstantiable && hasNullableOrEmpty) return true; } return false; } function getNormalizedTupleType(type, writing) { const elements = getElementTypes(type); - const normalizedElements = sameMap(elements, (t) => t.flags & 25165824 /* Simplifiable */ ? getSimplifiedType(t, writing) : t); + const normalizedElements = sameMap(elements, (t) => t.flags & 102760448 /* Simplifiable */ ? getSimplifiedType(t, writing) : t); return elements !== normalizedElements ? createNormalizedTupleType(type.target, normalizedElements) : type; } function checkTypeRelatedTo(source, target, relation, errorNode, headMessage, containingMessageChain, errorOutputContainer) { @@ -69550,13 +69699,13 @@ function createTypeChecker(host) { const [sourceType, targetType] = getTypeNamesForErrorDisplay(source2, target2); let generalizedSource = source2; let generalizedSourceType = sourceType; - if (!(target2.flags & 131072 /* Never */) && isLiteralType(source2) && !typeCouldHaveTopLevelSingletonTypes(target2)) { + if (!(target2.flags & 262144 /* Never */) && isLiteralType(source2) && !typeCouldHaveTopLevelSingletonTypes(target2)) { generalizedSource = getBaseTypeOfLiteralType(source2); Debug.assert(!isTypeAssignableTo(generalizedSource, target2), "generalized source shouldn't be assignable"); generalizedSourceType = getTypeNameForErrorDisplay(generalizedSource); } - const targetFlags = target2.flags & 8388608 /* IndexedAccess */ && !(source2.flags & 8388608 /* IndexedAccess */) ? target2.objectType.flags : target2.flags; - if (targetFlags & 262144 /* TypeParameter */ && target2 !== markerSuperTypeForCheck && target2 !== markerSubTypeForCheck) { + const targetFlags = target2.flags & 33554432 /* IndexedAccess */ && !(source2.flags & 33554432 /* IndexedAccess */) ? target2.objectType.flags : target2.flags; + if (targetFlags & 524288 /* TypeParameter */ && target2 !== markerSuperTypeForCheck && target2 !== markerSubTypeForCheck) { const constraint = getBaseConstraintOfType(target2); let needsOriginalSource; if (constraint && (isTypeAssignableTo(generalizedSource, constraint) || (needsOriginalSource = isTypeAssignableTo(source2, constraint)))) { @@ -69583,7 +69732,7 @@ function createTypeChecker(host) { } else if (exactOptionalPropertyTypes && getExactOptionalUnassignableProperties(source2, target2).length) { message = Diagnostics.Type_0_is_not_assignable_to_type_1_with_exactOptionalPropertyTypes_Colon_true_Consider_adding_undefined_to_the_types_of_the_target_s_properties; } else { - if (source2.flags & 128 /* StringLiteral */ && target2.flags & 1048576 /* Union */) { + if (source2.flags & 1024 /* StringLiteral */ && target2.flags & 134217728 /* Union */) { const suggestedType = getSuggestedTypeForNonexistentStringLiteralType(source2, target2); if (suggestedType) { reportError(Diagnostics.Type_0_is_not_assignable_to_type_1_Did_you_mean_2, generalizedSourceType, targetType, typeToString(suggestedType)); @@ -69630,8 +69779,8 @@ function createTypeChecker(host) { } function isRelatedTo(originalSource, originalTarget, recursionFlags = 3 /* Both */, reportErrors2 = false, headMessage2, intersectionState = 0 /* None */) { if (originalSource === originalTarget) return -1 /* True */; - if (originalSource.flags & 524288 /* Object */ && originalTarget.flags & 402784252 /* Primitive */) { - if (relation === comparableRelation && !(originalTarget.flags & 131072 /* Never */) && isSimpleTypeRelatedTo(originalTarget, originalSource, relation) || isSimpleTypeRelatedTo(originalSource, originalTarget, relation, reportErrors2 ? reportError : void 0)) { + if (originalSource.flags & 1048576 /* Object */ && originalTarget.flags & 12713980 /* Primitive */) { + if (relation === comparableRelation && !(originalTarget.flags & 262144 /* Never */) && isSimpleTypeRelatedTo(originalTarget, originalSource, relation) || isSimpleTypeRelatedTo(originalSource, originalTarget, relation, reportErrors2 ? reportError : void 0)) { return -1 /* True */; } if (reportErrors2) { @@ -69652,7 +69801,7 @@ function createTypeChecker(host) { if (source2 === target2) return -1 /* True */; if (relation === identityRelation) { if (source2.flags !== target2.flags) return 0 /* False */; - if (source2.flags & 67358815 /* Singleton */) return -1 /* True */; + if (source2.flags & 394239 /* Singleton */) return -1 /* True */; traceUnionsOrIntersectionsTooLarge(source2, target2); return recursiveTypeRelatedTo( source2, @@ -69663,13 +69812,13 @@ function createTypeChecker(host) { recursionFlags ); } - if (source2.flags & 262144 /* TypeParameter */ && getConstraintOfType(source2) === target2) { + if (source2.flags & 524288 /* TypeParameter */ && getConstraintOfType(source2) === target2) { return -1 /* True */; } - if (source2.flags & 470302716 /* DefinitelyNonNullable */ && target2.flags & 1048576 /* Union */) { + if (source2.flags & 13893600 /* DefinitelyNonNullable */ && target2.flags & 134217728 /* Union */) { const types = target2.types; - const candidate = types.length === 2 && types[0].flags & 98304 /* Nullable */ ? types[1] : types.length === 3 && types[0].flags & 98304 /* Nullable */ && types[1].flags & 98304 /* Nullable */ ? types[2] : void 0; - if (candidate && !(candidate.flags & 98304 /* Nullable */)) { + const candidate = types.length === 2 && types[0].flags & 12 /* Nullable */ ? types[1] : types.length === 3 && types[0].flags & 12 /* Nullable */ && types[1].flags & 12 /* Nullable */ ? types[2] : void 0; + if (candidate && !(candidate.flags & 12 /* Nullable */)) { target2 = getNormalizedType( candidate, /*writing*/ @@ -69678,8 +69827,8 @@ function createTypeChecker(host) { if (source2 === target2) return -1 /* True */; } } - if (relation === comparableRelation && !(target2.flags & 131072 /* Never */) && isSimpleTypeRelatedTo(target2, source2, relation) || isSimpleTypeRelatedTo(source2, target2, relation, reportErrors2 ? reportError : void 0)) return -1 /* True */; - if (source2.flags & 469499904 /* StructuredOrInstantiable */ || target2.flags & 469499904 /* StructuredOrInstantiable */) { + if (relation === comparableRelation && !(target2.flags & 262144 /* Never */) && isSimpleTypeRelatedTo(target2, source2, relation) || isSimpleTypeRelatedTo(source2, target2, relation, reportErrors2 ? reportError : void 0)) return -1 /* True */; + if (source2.flags & 536346624 /* StructuredOrInstantiable */ || target2.flags & 536346624 /* StructuredOrInstantiable */) { const isPerformingExcessPropertyChecks = !(intersectionState & 2 /* Target */) && (isObjectLiteralType2(source2) && getObjectFlags(source2) & 8192 /* FreshLiteral */); if (isPerformingExcessPropertyChecks) { if (hasExcessProperties(source2, target2, reportErrors2)) { @@ -69689,7 +69838,7 @@ function createTypeChecker(host) { return 0 /* False */; } } - const isPerformingCommonPropertyChecks = (relation !== comparableRelation || isUnitType(source2)) && !(intersectionState & 2 /* Target */) && source2.flags & (402784252 /* Primitive */ | 524288 /* Object */ | 2097152 /* Intersection */) && source2 !== globalObjectType && target2.flags & (524288 /* Object */ | 2097152 /* Intersection */) && isWeakType(target2) && (getPropertiesOfType(source2).length > 0 || typeHasCallOrConstructSignatures(source2)); + const isPerformingCommonPropertyChecks = (relation !== comparableRelation || isUnitType(source2)) && !(intersectionState & 2 /* Target */) && source2.flags & (12713980 /* Primitive */ | 1048576 /* Object */ | 268435456 /* Intersection */) && source2 !== globalObjectType && target2.flags & (1048576 /* Object */ | 268435456 /* Intersection */) && isWeakType(target2) && (getPropertiesOfType(source2).length > 0 || typeHasCallOrConstructSignatures(source2)); const isComparingJsxAttributes = !!(getObjectFlags(source2) & 2048 /* JsxAttributes */); if (isPerformingCommonPropertyChecks && !hasCommonProperties(source2, target2, isComparingJsxAttributes)) { if (reportErrors2) { @@ -69718,7 +69867,7 @@ function createTypeChecker(host) { return 0 /* False */; } traceUnionsOrIntersectionsTooLarge(source2, target2); - const skipCaching = source2.flags & 1048576 /* Union */ && source2.types.length < 4 && !(target2.flags & 1048576 /* Union */) || target2.flags & 1048576 /* Union */ && target2.types.length < 4 && !(source2.flags & 469499904 /* StructuredOrInstantiable */); + const skipCaching = source2.flags & 134217728 /* Union */ && source2.types.length < 4 && !(target2.flags & 134217728 /* Union */) || target2.flags & 134217728 /* Union */ && target2.types.length < 4 && !(source2.flags & 536346624 /* StructuredOrInstantiable */); const result2 = skipCaching ? unionOrIntersectionRelatedTo(source2, target2, reportErrors2, intersectionState) : recursiveTypeRelatedTo(source2, target2, reportErrors2, intersectionState, recursionFlags); if (result2) { return result2; @@ -69739,7 +69888,7 @@ function createTypeChecker(host) { if (maybeSuppress) { overrideNextErrorInfo--; } - if (source2.flags & 524288 /* Object */ && target2.flags & 524288 /* Object */) { + if (source2.flags & 1048576 /* Object */ && target2.flags & 1048576 /* Object */) { const currentError = errorInfo; tryElaborateArrayLikeErrors( source2, @@ -69751,11 +69900,11 @@ function createTypeChecker(host) { maybeSuppress = !!errorInfo; } } - if (source2.flags & 524288 /* Object */ && target2.flags & 402784252 /* Primitive */) { + if (source2.flags & 1048576 /* Object */ && target2.flags & 12713980 /* Primitive */) { tryElaborateErrorsForPrimitivesAndObjects(source2, target2); - } else if (source2.symbol && source2.flags & 524288 /* Object */ && globalObjectType === source2) { + } else if (source2.symbol && source2.flags & 1048576 /* Object */ && globalObjectType === source2) { reportError(Diagnostics.The_Object_type_is_assignable_to_very_few_other_types_Did_you_mean_to_use_the_any_type_instead); - } else if (getObjectFlags(source2) & 2048 /* JsxAttributes */ && target2.flags & 2097152 /* Intersection */) { + } else if (getObjectFlags(source2) & 2048 /* JsxAttributes */ && target2.flags & 268435456 /* Intersection */) { const targetTypes = target2.types; const intrinsicAttributes = getJsxType(JsxNames.IntrinsicAttributes, errorNode); const intrinsicClassAttributes = getJsxType(JsxNames.IntrinsicClassAttributes, errorNode); @@ -69780,7 +69929,7 @@ function createTypeChecker(host) { return; } reportRelationError(headMessage2, source2, target2); - if (source2.flags & 262144 /* TypeParameter */ && ((_b = (_a2 = source2.symbol) == null ? void 0 : _a2.declarations) == null ? void 0 : _b[0]) && !getConstraintOfType(source2)) { + if (source2.flags & 524288 /* TypeParameter */ && ((_b = (_a2 = source2.symbol) == null ? void 0 : _a2.declarations) == null ? void 0 : _b[0]) && !getConstraintOfType(source2)) { const syntheticParam = cloneTypeParameter(source2); syntheticParam.constraint = instantiateType(target2, makeUnaryTypeMapper(source2, syntheticParam)); if (hasNonCircularBaseConstraint(syntheticParam)) { @@ -69793,7 +69942,7 @@ function createTypeChecker(host) { if (!tracing) { return; } - if (source2.flags & 3145728 /* UnionOrIntersection */ && target2.flags & 3145728 /* UnionOrIntersection */) { + if (source2.flags & 402653184 /* UnionOrIntersection */ && target2.flags & 402653184 /* UnionOrIntersection */) { const sourceUnionOrIntersection = source2; const targetUnionOrIntersection = target2; if (sourceUnionOrIntersection.objectFlags & targetUnionOrIntersection.objectFlags & 32768 /* PrimitiveUnion */) { @@ -69817,7 +69966,7 @@ function createTypeChecker(host) { const appendPropType = (propTypes, type) => { var _a2; type = getApparentType(type); - const prop = type.flags & 3145728 /* UnionOrIntersection */ ? getPropertyOfUnionOrIntersectionType(type, name) : getPropertyOfObjectType(type, name); + const prop = type.flags & 402653184 /* UnionOrIntersection */ ? getPropertyOfUnionOrIntersectionType(type, name) : getPropertyOfObjectType(type, name); const propType = prop && getTypeOfSymbol(prop) || ((_a2 = getApplicableIndexInfoForName(type, name)) == null ? void 0 : _a2.type) || undefinedType; return append(propTypes, propType); }; @@ -69839,9 +69988,9 @@ function createTypeChecker(host) { } let reducedTarget = target2; let checkTypes; - if (target2.flags & 1048576 /* Union */) { + if (target2.flags & 134217728 /* Union */) { reducedTarget = findMatchingDiscriminantType(source2, target2, isRelatedTo) || filterPrimitivesIfContainsNonPrimitive(target2); - checkTypes = reducedTarget.flags & 1048576 /* Union */ ? reducedTarget.types : [reducedTarget]; + checkTypes = reducedTarget.flags & 134217728 /* Union */ ? reducedTarget.types : [reducedTarget]; } for (const prop of getPropertiesOfType(source2)) { if (shouldCheckAsExcessProperty(prop, source2.symbol) && !isIgnoredJsxProperty(source2, prop)) { @@ -69896,33 +70045,33 @@ function createTypeChecker(host) { return prop.valueDeclaration && container.valueDeclaration && prop.valueDeclaration.parent === container.valueDeclaration; } function unionOrIntersectionRelatedTo(source2, target2, reportErrors2, intersectionState) { - if (source2.flags & 1048576 /* Union */) { - if (target2.flags & 1048576 /* Union */) { + if (source2.flags & 134217728 /* Union */) { + if (target2.flags & 134217728 /* Union */) { const sourceOrigin = source2.origin; - if (sourceOrigin && sourceOrigin.flags & 2097152 /* Intersection */ && target2.aliasSymbol && contains(sourceOrigin.types, target2)) { + if (sourceOrigin && sourceOrigin.flags & 268435456 /* Intersection */ && target2.aliasSymbol && contains(sourceOrigin.types, target2)) { return -1 /* True */; } const targetOrigin = target2.origin; - if (targetOrigin && targetOrigin.flags & 1048576 /* Union */ && source2.aliasSymbol && contains(targetOrigin.types, source2)) { + if (targetOrigin && targetOrigin.flags & 134217728 /* Union */ && source2.aliasSymbol && contains(targetOrigin.types, source2)) { return -1 /* True */; } } - return relation === comparableRelation ? someTypeRelatedToType(source2, target2, reportErrors2 && !(source2.flags & 402784252 /* Primitive */), intersectionState) : eachTypeRelatedToType(source2, target2, reportErrors2 && !(source2.flags & 402784252 /* Primitive */), intersectionState); + return relation === comparableRelation ? someTypeRelatedToType(source2, target2, reportErrors2 && !(source2.flags & 12713980 /* Primitive */), intersectionState) : eachTypeRelatedToType(source2, target2, reportErrors2 && !(source2.flags & 12713980 /* Primitive */), intersectionState); } - if (target2.flags & 1048576 /* Union */) { - return typeRelatedToSomeType(getRegularTypeOfObjectLiteral(source2), target2, reportErrors2 && !(source2.flags & 402784252 /* Primitive */) && !(target2.flags & 402784252 /* Primitive */), intersectionState); + if (target2.flags & 134217728 /* Union */) { + return typeRelatedToSomeType(getRegularTypeOfObjectLiteral(source2), target2, reportErrors2 && !(source2.flags & 12713980 /* Primitive */) && !(target2.flags & 12713980 /* Primitive */), intersectionState); } - if (target2.flags & 2097152 /* Intersection */) { + if (target2.flags & 268435456 /* Intersection */) { return typeRelatedToEachType(source2, target2, reportErrors2, 2 /* Target */); } - if (relation === comparableRelation && target2.flags & 402784252 /* Primitive */) { - const constraints = sameMap(source2.types, (t) => t.flags & 465829888 /* Instantiable */ ? getBaseConstraintOfType(t) || unknownType : t); + if (relation === comparableRelation && target2.flags & 12713980 /* Primitive */) { + const constraints = sameMap(source2.types, (t) => t.flags & 132644864 /* Instantiable */ ? getBaseConstraintOfType(t) || unknownType : t); if (constraints !== source2.types) { source2 = getIntersectionType(constraints); - if (source2.flags & 131072 /* Never */) { + if (source2.flags & 262144 /* Never */) { return 0 /* False */; } - if (!(source2.flags & 2097152 /* Intersection */)) { + if (!(source2.flags & 268435456 /* Intersection */)) { return isRelatedTo( source2, target2, @@ -69967,13 +70116,13 @@ function createTypeChecker(host) { } function typeRelatedToSomeType(source2, target2, reportErrors2, intersectionState) { const targetTypes = target2.types; - if (target2.flags & 1048576 /* Union */) { + if (target2.flags & 134217728 /* Union */) { if (containsType(targetTypes, source2)) { return -1 /* True */; } - if (relation !== comparableRelation && getObjectFlags(target2) & 32768 /* PrimitiveUnion */ && !(source2.flags & 1024 /* EnumLiteral */) && (source2.flags & (128 /* StringLiteral */ | 512 /* BooleanLiteral */ | 2048 /* BigIntLiteral */) || (relation === subtypeRelation || relation === strictSubtypeRelation) && source2.flags & 256 /* NumberLiteral */)) { + if (relation !== comparableRelation && getObjectFlags(target2) & 32768 /* PrimitiveUnion */ && !(source2.flags & 32768 /* EnumLiteral */) && (source2.flags & (1024 /* StringLiteral */ | 8192 /* BooleanLiteral */ | 4096 /* BigIntLiteral */) || (relation === subtypeRelation || relation === strictSubtypeRelation) && source2.flags & 2048 /* NumberLiteral */)) { const alternateForm = source2 === source2.regularType ? source2.freshType : source2.regularType; - const primitive = source2.flags & 128 /* StringLiteral */ ? stringType : source2.flags & 256 /* NumberLiteral */ ? numberType : source2.flags & 2048 /* BigIntLiteral */ ? bigintType : void 0; + const primitive = source2.flags & 1024 /* StringLiteral */ ? stringType : source2.flags & 2048 /* NumberLiteral */ ? numberType : source2.flags & 4096 /* BigIntLiteral */ ? bigintType : void 0; return primitive && containsType(targetTypes, primitive) || alternateForm && containsType(targetTypes, alternateForm) ? -1 /* True */ : 0 /* False */; } const match = getMatchingUnionConstituentForType(target2, source2); @@ -70047,7 +70196,7 @@ function createTypeChecker(host) { } function someTypeRelatedToType(source2, target2, reportErrors2, intersectionState) { const sourceTypes = source2.types; - if (source2.flags & 1048576 /* Union */ && containsType(sourceTypes, target2)) { + if (source2.flags & 134217728 /* Union */ && containsType(sourceTypes, target2)) { return -1 /* True */; } const len = sourceTypes.length; @@ -70068,8 +70217,8 @@ function createTypeChecker(host) { return 0 /* False */; } function getUndefinedStrippedTargetIfNeeded(source2, target2) { - if (source2.flags & 1048576 /* Union */ && target2.flags & 1048576 /* Union */ && !(source2.types[0].flags & 32768 /* Undefined */) && target2.types[0].flags & 32768 /* Undefined */) { - return extractTypesOfKind(target2, ~32768 /* Undefined */); + if (source2.flags & 134217728 /* Union */ && target2.flags & 134217728 /* Union */ && !(source2.types[0].flags & 4 /* Undefined */) && target2.types[0].flags & 4 /* Undefined */) { + return extractTypesOfKind(target2, ~4 /* Undefined */); } return target2; } @@ -70079,7 +70228,7 @@ function createTypeChecker(host) { const undefinedStrippedTarget = getUndefinedStrippedTargetIfNeeded(source2, target2); for (let i = 0; i < sourceTypes.length; i++) { const sourceType = sourceTypes[i]; - if (undefinedStrippedTarget.flags & 1048576 /* Union */ && sourceTypes.length >= undefinedStrippedTarget.types.length && sourceTypes.length % undefinedStrippedTarget.types.length === 0) { + if (undefinedStrippedTarget.flags & 134217728 /* Union */ && sourceTypes.length >= undefinedStrippedTarget.types.length && sourceTypes.length % undefinedStrippedTarget.types.length === 0) { const related2 = isRelatedTo( sourceType, undefinedStrippedTarget.types[i % undefinedStrippedTarget.types.length], @@ -70132,35 +70281,11 @@ function createTypeChecker(host) { /*reportErrors*/ false ) : compareTypesIdentical(s, t); - } else if (variance === 1 /* Covariant */) { - related = isRelatedTo( - s, - t, - 3 /* Both */, - reportErrors2, - /*headMessage*/ - void 0, - intersectionState - ); - } else if (variance === 2 /* Contravariant */) { - related = isRelatedTo( - t, - s, - 3 /* Both */, - reportErrors2, - /*headMessage*/ - void 0, - intersectionState - ); - } else if (variance === 3 /* Bivariant */) { - related = isRelatedTo( - t, - s, - 3 /* Both */, - /*reportErrors*/ - false - ); - if (!related) { + } else { + if (inVarianceComputation && varianceFlags & 16 /* Unreliable */) { + instantiateType(s, reportUnreliableMapper); + } + if (variance === 1 /* Covariant */) { related = isRelatedTo( s, t, @@ -70170,19 +70295,8 @@ function createTypeChecker(host) { void 0, intersectionState ); - } - } else { - related = isRelatedTo( - s, - t, - 3 /* Both */, - reportErrors2, - /*headMessage*/ - void 0, - intersectionState - ); - if (related) { - related &= isRelatedTo( + } else if (variance === 2 /* Contravariant */) { + related = isRelatedTo( t, s, 3 /* Both */, @@ -70191,6 +70305,46 @@ function createTypeChecker(host) { void 0, intersectionState ); + } else if (variance === 3 /* Bivariant */) { + related = isRelatedTo( + t, + s, + 3 /* Both */, + /*reportErrors*/ + false + ); + if (!related) { + related = isRelatedTo( + s, + t, + 3 /* Both */, + reportErrors2, + /*headMessage*/ + void 0, + intersectionState + ); + } + } else { + related = isRelatedTo( + s, + t, + 3 /* Both */, + reportErrors2, + /*headMessage*/ + void 0, + intersectionState + ); + if (related) { + related &= isRelatedTo( + t, + s, + 3 /* Both */, + reportErrors2, + /*headMessage*/ + void 0, + intersectionState + ); + } } } if (!related) { @@ -70352,8 +70506,8 @@ function createTypeChecker(host) { const saveErrorInfo = captureErrorCalculationState(); let result2 = structuredTypeRelatedToWorker(source2, target2, reportErrors2, intersectionState, saveErrorInfo); if (relation !== identityRelation) { - if (!result2 && (source2.flags & 2097152 /* Intersection */ || source2.flags & 262144 /* TypeParameter */ && target2.flags & 1048576 /* Union */)) { - const constraint = getEffectiveConstraintOfIntersection(source2.flags & 2097152 /* Intersection */ ? source2.types : [source2], !!(target2.flags & 1048576 /* Union */)); + if (!result2 && (source2.flags & 268435456 /* Intersection */ || source2.flags & 524288 /* TypeParameter */ && target2.flags & 134217728 /* Union */)) { + const constraint = getEffectiveConstraintOfIntersection(source2.flags & 268435456 /* Intersection */ ? source2.types : [source2], !!(target2.flags & 134217728 /* Union */)); if (constraint && everyType(constraint, (c) => c !== source2)) { result2 = isRelatedTo( constraint, @@ -70367,7 +70521,7 @@ function createTypeChecker(host) { ); } } - if (result2 && !(intersectionState & 2 /* Target */) && target2.flags & 2097152 /* Intersection */ && !isGenericObjectType(target2) && source2.flags & (524288 /* Object */ | 2097152 /* Intersection */)) { + if (result2 && !(intersectionState & 2 /* Target */) && target2.flags & 268435456 /* Intersection */ && !isGenericObjectType(target2) && source2.flags & (1048576 /* Object */ | 268435456 /* Intersection */)) { result2 &= propertiesRelatedTo( source2, target2, @@ -70388,7 +70542,7 @@ function createTypeChecker(host) { 0 /* None */ ); } - } else if (result2 && isNonGenericObjectType(target2) && !isArrayOrTupleType(target2) && source2.flags & 2097152 /* Intersection */ && getApparentType(source2).flags & 3670016 /* StructuredType */ && !some(source2.types, (t) => t === target2 || !!(getObjectFlags(t) & 262144 /* NonInferrableType */))) { + } else if (result2 && isNonGenericObjectType(target2) && !isArrayOrTupleType(target2) && source2.flags & 268435456 /* Intersection */ && getApparentType(source2).flags & 403701760 /* StructuredType */ && !some(source2.types, (t) => t === target2 || !!(getObjectFlags(t) & 262144 /* NonInferrableType */))) { result2 &= propertiesRelatedTo( source2, target2, @@ -70411,7 +70565,7 @@ function createTypeChecker(host) { const mappedKeys = []; forEachMappedTypePropertyKeyTypeAndIndexSignatureKeyType( modifiersType, - 8576 /* StringOrNumberLiteralOrUnique */, + 19456 /* StringOrNumberLiteralOrUnique */, /*stringsOnly*/ false, (t) => void mappedKeys.push(instantiateType(nameType, appendTypeMapping(targetType.mapper, getTypeParameterFromMappedType(targetType), t))) @@ -70425,14 +70579,14 @@ function createTypeChecker(host) { let sourceFlags = source2.flags; const targetFlags = target2.flags; if (relation === identityRelation) { - if (sourceFlags & 3145728 /* UnionOrIntersection */) { + if (sourceFlags & 402653184 /* UnionOrIntersection */) { let result3 = eachTypeRelatedToSomeType(source2, target2); if (result3) { result3 &= eachTypeRelatedToSomeType(target2, source2); } return result3; } - if (sourceFlags & 4194304 /* Index */) { + if (sourceFlags & 2097152 /* Index */) { return isRelatedTo( source2.type, target2.type, @@ -70441,7 +70595,7 @@ function createTypeChecker(host) { false ); } - if (sourceFlags & 8388608 /* IndexedAccess */) { + if (sourceFlags & 33554432 /* IndexedAccess */) { if (result2 = isRelatedTo( source2.objectType, target2.objectType, @@ -70460,7 +70614,7 @@ function createTypeChecker(host) { } } } - if (sourceFlags & 16777216 /* Conditional */) { + if (sourceFlags & 67108864 /* Conditional */) { if (source2.root.isDistributive === target2.root.isDistributive) { if (result2 = isRelatedTo( source2.checkType, @@ -70497,7 +70651,7 @@ function createTypeChecker(host) { } } } - if (sourceFlags & 33554432 /* Substitution */) { + if (sourceFlags & 16777216 /* Substitution */) { if (result2 = isRelatedTo( source2.baseType, target2.baseType, @@ -70516,7 +70670,7 @@ function createTypeChecker(host) { } } } - if (sourceFlags & 134217728 /* TemplateLiteral */) { + if (sourceFlags & 4194304 /* TemplateLiteral */) { if (arrayIsEqualTo(source2.texts, target2.texts)) { const sourceTypes = source2.types; const targetTypes = target2.types; @@ -70535,7 +70689,7 @@ function createTypeChecker(host) { return result2; } } - if (sourceFlags & 268435456 /* StringMapping */) { + if (sourceFlags & 8388608 /* StringMapping */) { if (source2.symbol === target2.symbol) { return isRelatedTo( source2.type, @@ -70546,18 +70700,18 @@ function createTypeChecker(host) { ); } } - if (!(sourceFlags & 524288 /* Object */)) { + if (!(sourceFlags & 1048576 /* Object */)) { return 0 /* False */; } - } else if (sourceFlags & 3145728 /* UnionOrIntersection */ || targetFlags & 3145728 /* UnionOrIntersection */) { + } else if (sourceFlags & 402653184 /* UnionOrIntersection */ || targetFlags & 402653184 /* UnionOrIntersection */) { if (result2 = unionOrIntersectionRelatedTo(source2, target2, reportErrors2, intersectionState)) { return result2; } - if (!(sourceFlags & 465829888 /* Instantiable */ || sourceFlags & 524288 /* Object */ && targetFlags & 1048576 /* Union */ || sourceFlags & 2097152 /* Intersection */ && targetFlags & (524288 /* Object */ | 1048576 /* Union */ | 465829888 /* Instantiable */))) { + if (!(sourceFlags & 132644864 /* Instantiable */ || sourceFlags & 1048576 /* Object */ && targetFlags & 134217728 /* Union */ || sourceFlags & 268435456 /* Intersection */ && targetFlags & (1048576 /* Object */ | 134217728 /* Union */ | 132644864 /* Instantiable */))) { return 0 /* False */; } } - if (sourceFlags & (524288 /* Object */ | 16777216 /* Conditional */) && source2.aliasSymbol && source2.aliasTypeArguments && source2.aliasSymbol === target2.aliasSymbol && !(isMarkerType(source2) || isMarkerType(target2))) { + if (sourceFlags & (1048576 /* Object */ | 67108864 /* Conditional */) && source2.aliasSymbol && source2.aliasTypeArguments && source2.aliasSymbol === target2.aliasSymbol && !(isMarkerType(source2) || isMarkerType(target2))) { const variances = getAliasVariances(source2.aliasSymbol); if (variances === emptyArray) { return 1 /* Unknown */; @@ -70574,7 +70728,7 @@ function createTypeChecker(host) { if (isSingleElementGenericTupleType(source2) && !source2.target.readonly && (result2 = isRelatedTo(getTypeArguments(source2)[0], target2, 1 /* Source */)) || isSingleElementGenericTupleType(target2) && (target2.target.readonly || isMutableArrayOrTuple(getBaseConstraintOfType(source2) || source2)) && (result2 = isRelatedTo(source2, getTypeArguments(target2)[0], 2 /* Target */))) { return result2; } - if (targetFlags & 262144 /* TypeParameter */) { + if (targetFlags & 524288 /* TypeParameter */) { if (getObjectFlags(source2) & 32 /* Mapped */ && !source2.declaration.nameType && isRelatedTo(getIndexType(target2), getConstraintTypeFromMappedType(source2), 3 /* Both */)) { if (!(getMappedTypeModifiers(source2) & 4 /* IncludeOptional */)) { const templateType = getTemplateTypeFromMappedType(source2); @@ -70584,10 +70738,10 @@ function createTypeChecker(host) { } } } - if (relation === comparableRelation && sourceFlags & 262144 /* TypeParameter */) { + if (relation === comparableRelation && sourceFlags & 524288 /* TypeParameter */) { let constraint = getConstraintOfTypeParameter(source2); if (constraint) { - while (constraint && someType(constraint, (c) => !!(c.flags & 262144 /* TypeParameter */))) { + while (constraint && someType(constraint, (c) => !!(c.flags & 524288 /* TypeParameter */))) { if (result2 = isRelatedTo( constraint, target2, @@ -70602,9 +70756,9 @@ function createTypeChecker(host) { } return 0 /* False */; } - } else if (targetFlags & 4194304 /* Index */) { + } else if (targetFlags & 2097152 /* Index */) { const targetType = target2.type; - if (sourceFlags & 4194304 /* Index */) { + if (sourceFlags & 2097152 /* Index */) { if (result2 = isRelatedTo( targetType, source2.type, @@ -70640,8 +70794,8 @@ function createTypeChecker(host) { } } } - } else if (targetFlags & 8388608 /* IndexedAccess */) { - if (sourceFlags & 8388608 /* IndexedAccess */) { + } else if (targetFlags & 33554432 /* IndexedAccess */) { + if (sourceFlags & 33554432 /* IndexedAccess */) { if (result2 = isRelatedTo(source2.objectType, target2.objectType, 3 /* Both */, reportErrors2)) { result2 &= isRelatedTo(source2.indexType, target2.indexType, 3 /* Both */, reportErrors2); } @@ -70689,7 +70843,7 @@ function createTypeChecker(host) { const templateType = getTemplateTypeFromMappedType(target2); const modifiers = getMappedTypeModifiers(target2); if (!(modifiers & 8 /* ExcludeOptional */)) { - if (!keysRemapped && templateType.flags & 8388608 /* IndexedAccess */ && templateType.objectType === source2 && templateType.indexType === getTypeParameterFromMappedType(target2)) { + if (!keysRemapped && templateType.flags & 33554432 /* IndexedAccess */ && templateType.objectType === source2 && templateType.indexType === getTypeParameterFromMappedType(target2)) { return -1 /* True */; } if (!isGenericMappedType(source2)) { @@ -70697,11 +70851,11 @@ function createTypeChecker(host) { const sourceKeys = getIndexType(source2, 2 /* NoIndexSignatures */); const includeOptional = modifiers & 4 /* IncludeOptional */; const filteredByApplicability = includeOptional ? intersectTypes(targetKeys, sourceKeys) : void 0; - if (includeOptional ? !(filteredByApplicability.flags & 131072 /* Never */) : isRelatedTo(targetKeys, sourceKeys, 3 /* Both */)) { + if (includeOptional ? !(filteredByApplicability.flags & 262144 /* Never */) : isRelatedTo(targetKeys, sourceKeys, 3 /* Both */)) { const templateType2 = getTemplateTypeFromMappedType(target2); const typeParameter = getTypeParameterFromMappedType(target2); - const nonNullComponent = extractTypesOfKind(templateType2, ~98304 /* Nullable */); - if (!keysRemapped && nonNullComponent.flags & 8388608 /* IndexedAccess */ && nonNullComponent.indexType === typeParameter) { + const nonNullComponent = extractTypesOfKind(templateType2, ~12 /* Nullable */); + if (!keysRemapped && nonNullComponent.flags & 33554432 /* IndexedAccess */ && nonNullComponent.indexType === typeParameter) { if (result2 = isRelatedTo(source2, nonNullComponent.objectType, 2 /* Target */, reportErrors2)) { return result2; } @@ -70717,12 +70871,12 @@ function createTypeChecker(host) { resetErrorInfo(saveErrorInfo); } } - } else if (targetFlags & 16777216 /* Conditional */) { + } else if (targetFlags & 67108864 /* Conditional */) { if (isDeeplyNestedType(target2, targetStack, targetDepth, 10)) { return 3 /* Maybe */; } const c = target2; - if (!c.root.inferTypeParameters && !isDistributionDependent(c.root) && !(source2.flags & 16777216 /* Conditional */ && source2.root === c.root)) { + if (!c.root.inferTypeParameters && !isDistributionDependent(c.root) && !(source2.flags & 67108864 /* Conditional */ && source2.root === c.root)) { const skipTrue = !isTypeAssignableTo(getPermissiveInstantiation(c.checkType), getPermissiveInstantiation(c.extendsType)); const skipFalse = !skipTrue && isTypeAssignableTo(getRestrictiveInstantiation(c.checkType), getRestrictiveInstantiation(c.extendsType)); if (result2 = skipTrue ? -1 /* True */ : isRelatedTo( @@ -70750,8 +70904,8 @@ function createTypeChecker(host) { } } } - } else if (targetFlags & 134217728 /* TemplateLiteral */) { - if (sourceFlags & 134217728 /* TemplateLiteral */) { + } else if (targetFlags & 4194304 /* TemplateLiteral */) { + if (sourceFlags & 4194304 /* TemplateLiteral */) { if (relation === comparableRelation) { return templateLiteralTypesDefinitelyUnrelated(source2, target2) ? 0 /* False */ : -1 /* True */; } @@ -70760,15 +70914,15 @@ function createTypeChecker(host) { if (isTypeMatchedByTemplateLiteralType(source2, target2)) { return -1 /* True */; } - } else if (target2.flags & 268435456 /* StringMapping */) { - if (!(source2.flags & 268435456 /* StringMapping */)) { + } else if (target2.flags & 8388608 /* StringMapping */) { + if (!(source2.flags & 8388608 /* StringMapping */)) { if (isMemberOfStringMapping(source2, target2)) { return -1 /* True */; } } } - if (sourceFlags & 8650752 /* TypeVariable */) { - if (!(sourceFlags & 8388608 /* IndexedAccess */ && targetFlags & 8388608 /* IndexedAccess */)) { + if (sourceFlags & 34078720 /* TypeVariable */) { + if (!(sourceFlags & 33554432 /* IndexedAccess */ && targetFlags & 33554432 /* IndexedAccess */)) { const constraint = getConstraintOfType(source2) || unknownType; if (result2 = isRelatedTo( constraint, @@ -70785,7 +70939,7 @@ function createTypeChecker(host) { getTypeWithThisArgument(constraint, source2), target2, 1 /* Source */, - reportErrors2 && constraint !== unknownType && !(targetFlags & sourceFlags & 262144 /* TypeParameter */), + reportErrors2 && constraint !== unknownType && !(targetFlags & sourceFlags & 524288 /* TypeParameter */), /*headMessage*/ void 0, intersectionState @@ -70801,7 +70955,7 @@ function createTypeChecker(host) { } } } - } else if (sourceFlags & 4194304 /* Index */) { + } else if (sourceFlags & 2097152 /* Index */) { const isDeferredMappedIndex = shouldDeferIndexType(source2.type, source2.indexFlags) && getObjectFlags(source2.type) & 32 /* Mapped */; if (result2 = isRelatedTo(stringNumberSymbolType, target2, 1 /* Source */, reportErrors2 && !isDeferredMappedIndex)) { return result2; @@ -70814,15 +70968,15 @@ function createTypeChecker(host) { return result2; } } - } else if (sourceFlags & 134217728 /* TemplateLiteral */ && !(targetFlags & 524288 /* Object */)) { - if (!(targetFlags & 134217728 /* TemplateLiteral */)) { + } else if (sourceFlags & 4194304 /* TemplateLiteral */ && !(targetFlags & 1048576 /* Object */)) { + if (!(targetFlags & 4194304 /* TemplateLiteral */)) { const constraint = getBaseConstraintOfType(source2); if (constraint && constraint !== source2 && (result2 = isRelatedTo(constraint, target2, 1 /* Source */, reportErrors2))) { return result2; } } - } else if (sourceFlags & 268435456 /* StringMapping */) { - if (targetFlags & 268435456 /* StringMapping */) { + } else if (sourceFlags & 8388608 /* StringMapping */) { + if (targetFlags & 8388608 /* StringMapping */) { if (source2.symbol !== target2.symbol) { return 0 /* False */; } @@ -70835,11 +70989,11 @@ function createTypeChecker(host) { return result2; } } - } else if (sourceFlags & 16777216 /* Conditional */) { + } else if (sourceFlags & 67108864 /* Conditional */) { if (isDeeplyNestedType(source2, sourceStack, sourceDepth, 10)) { return 3 /* Maybe */; } - if (targetFlags & 16777216 /* Conditional */) { + if (targetFlags & 67108864 /* Conditional */) { const sourceParams = source2.root.inferTypeParameters; let sourceExtends = source2.extendsType; let mapper; @@ -70870,7 +71024,7 @@ function createTypeChecker(host) { return result2; } } - const distributiveConstraint = !(targetFlags & 16777216 /* Conditional */) && hasNonCircularBaseConstraint(source2) ? getConstraintOfDistributiveConditionalType(source2) : void 0; + const distributiveConstraint = !(targetFlags & 67108864 /* Conditional */) && hasNonCircularBaseConstraint(source2) ? getConstraintOfDistributiveConditionalType(source2) : void 0; if (distributiveConstraint) { resetErrorInfo(saveErrorInfo); if (result2 = isRelatedTo(distributiveConstraint, target2, 1 /* Source */, reportErrors2)) { @@ -70889,7 +71043,7 @@ function createTypeChecker(host) { } return 0 /* False */; } - const sourceIsPrimitive = !!(sourceFlags & 402784252 /* Primitive */); + const sourceIsPrimitive = !!(sourceFlags & 12713980 /* Primitive */); if (relation !== identityRelation) { source2 = getApparentType(source2); sourceFlags = source2.flags; @@ -70922,7 +71076,7 @@ function createTypeChecker(host) { } else if ((relation === subtypeRelation || relation === strictSubtypeRelation) && isEmptyObjectType(target2) && getObjectFlags(target2) & 8192 /* FreshLiteral */ && !isEmptyObjectType(source2)) { return 0 /* False */; } - if (sourceFlags & (524288 /* Object */ | 2097152 /* Intersection */) && targetFlags & 524288 /* Object */) { + if (sourceFlags & (1048576 /* Object */ | 268435456 /* Intersection */) && targetFlags & 1048576 /* Object */) { const reportStructuralErrors = reportErrors2 && errorInfo === saveErrorInfo.errorInfo && !sourceIsPrimitive; result2 = propertiesRelatedTo( source2, @@ -70949,9 +71103,9 @@ function createTypeChecker(host) { return result2; } } - if (sourceFlags & (524288 /* Object */ | 2097152 /* Intersection */) && targetFlags & 1048576 /* Union */) { - const objectOnlyTarget = extractTypesOfKind(target2, 524288 /* Object */ | 2097152 /* Intersection */ | 33554432 /* Substitution */); - if (objectOnlyTarget.flags & 1048576 /* Union */) { + if (sourceFlags & (1048576 /* Object */ | 268435456 /* Intersection */) && targetFlags & 134217728 /* Union */) { + const objectOnlyTarget = extractTypesOfKind(target2, 1048576 /* Object */ | 268435456 /* Intersection */ | 16777216 /* Substitution */); + if (objectOnlyTarget.flags & 134217728 /* Union */) { const result3 = typeRelatedToDiscriminatedType(source2, objectOnlyTarget); if (result3) { return result3; @@ -71017,7 +71171,7 @@ function createTypeChecker(host) { for (let i = 0; i < sourcePropertiesFiltered.length; i++) { const sourceProperty = sourcePropertiesFiltered[i]; const sourcePropertyType = getNonMissingTypeOfSymbol(sourceProperty); - sourceDiscriminantTypes[i] = sourcePropertyType.flags & 1048576 /* Union */ ? sourcePropertyType.types : [sourcePropertyType]; + sourceDiscriminantTypes[i] = sourcePropertyType.flags & 134217728 /* Union */ ? sourcePropertyType.types : [sourcePropertyType]; excludedProperties.add(sourceProperty.escapedName); } const discriminantCombinations = cartesianProduct(sourceDiscriminantTypes); @@ -71363,13 +71517,10 @@ function createTypeChecker(host) { if (isObjectLiteralType2(target2)) { for (const sourceProp of excludeProperties(getPropertiesOfType(source2), excludedProperties)) { if (!getPropertyOfObjectType(target2, sourceProp.escapedName)) { - const sourceType = getTypeOfSymbol(sourceProp); - if (!(sourceType.flags & 32768 /* Undefined */)) { - if (reportErrors2) { - reportError(Diagnostics.Property_0_does_not_exist_on_type_1, symbolToString(sourceProp), typeToString(target2)); - } - return 0 /* False */; + if (reportErrors2) { + reportError(Diagnostics.Property_0_does_not_exist_on_type_1, symbolToString(sourceProp), typeToString(target2)); } + return 0 /* False */; } } } @@ -71391,7 +71542,7 @@ function createTypeChecker(host) { return result2; } function propertiesIdenticalTo(source2, target2, excludedProperties) { - if (!(source2.flags & 524288 /* Object */ && target2.flags & 524288 /* Object */)) { + if (!(source2.flags & 1048576 /* Object */ && target2.flags & 1048576 /* Object */)) { return 0 /* False */; } const sourceProperties = excludeProperties(getPropertiesOfObjectType(source2), excludedProperties); @@ -71418,9 +71569,12 @@ function createTypeChecker(host) { if (relation === identityRelation) { return signaturesIdenticalTo(source2, target2, kind); } - if (target2 === anyFunctionType || source2 === anyFunctionType) { + if (source2 === anyFunctionType) { return -1 /* True */; } + if (target2 === anyFunctionType) { + return 0 /* False */; + } const sourceIsJSConstructor = source2.symbol && isJSConstructor(source2.symbol.valueDeclaration); const targetIsJSConstructor = target2.symbol && isJSConstructor(target2.symbol.valueDeclaration); const sourceSignatures = getSignaturesOfType( @@ -71587,14 +71741,14 @@ function createTypeChecker(host) { function membersRelatedToIndexInfo(source2, targetInfo, reportErrors2, intersectionState) { let result2 = -1 /* True */; const keyType = targetInfo.keyType; - const props = source2.flags & 2097152 /* Intersection */ ? getPropertiesOfUnionOrIntersectionType(source2) : getPropertiesOfObjectType(source2); + const props = source2.flags & 268435456 /* Intersection */ ? getPropertiesOfUnionOrIntersectionType(source2) : getPropertiesOfObjectType(source2); for (const prop of props) { if (isIgnoredJsxProperty(source2, prop)) { continue; } - if (isApplicableIndexType(getLiteralTypeFromProperty(prop, 8576 /* StringOrNumberLiteralOrUnique */), keyType)) { + if (isApplicableIndexType(getLiteralTypeFromProperty(prop, 19456 /* StringOrNumberLiteralOrUnique */), keyType)) { const propType = getNonMissingTypeOfSymbol(prop); - const type = exactOptionalPropertyTypes || propType.flags & 32768 /* Undefined */ || keyType === numberType || !(prop.flags & 16777216 /* Optional */) ? propType : getTypeWithFacts(propType, 524288 /* NEUndefined */); + const type = exactOptionalPropertyTypes || propType.flags & 4 /* Undefined */ || keyType === numberType || !(prop.flags & 16777216 /* Optional */) ? propType : getTypeWithFacts(propType, 524288 /* NEUndefined */); const related = isRelatedTo( type, targetInfo.type, @@ -71708,26 +71862,26 @@ function createTypeChecker(host) { } } function typeCouldHaveTopLevelSingletonTypes(type) { - if (type.flags & 16 /* Boolean */) { + if (type.flags & 256 /* Boolean */) { return false; } - if (type.flags & 3145728 /* UnionOrIntersection */) { + if (type.flags & 402653184 /* UnionOrIntersection */) { return !!forEach(type.types, typeCouldHaveTopLevelSingletonTypes); } - if (type.flags & 465829888 /* Instantiable */) { + if (type.flags & 132644864 /* Instantiable */) { const constraint = getConstraintOfType(type); if (constraint && constraint !== type) { return typeCouldHaveTopLevelSingletonTypes(constraint); } } - return isUnitType(type) || !!(type.flags & 134217728 /* TemplateLiteral */) || !!(type.flags & 268435456 /* StringMapping */); + return isUnitType(type) || !!(type.flags & 4194304 /* TemplateLiteral */) || !!(type.flags & 8388608 /* StringMapping */); } function getExactOptionalUnassignableProperties(source, target) { if (isTupleType(source) && isTupleType(target)) return emptyArray; return getPropertiesOfType(target).filter((targetProp) => isExactOptionalPropertyMismatch(getTypeOfPropertyOfType(source, targetProp.escapedName), getTypeOfSymbol(targetProp))); } function isExactOptionalPropertyMismatch(source, target) { - return !!source && !!target && maybeTypeOfKind(source, 32768 /* Undefined */) && !!containsMissingType(target); + return !!source && !!target && maybeTypeOfKind(source, 4 /* Undefined */) && !!containsMissingType(target); } function getExactOptionalProperties(type) { return getPropertiesOfType(type).filter((targetProp) => containsMissingType(getTypeOfSymbol(targetProp))); @@ -71737,7 +71891,7 @@ function createTypeChecker(host) { } function discriminateTypeByDiscriminableItems(target, discriminators, related) { const types = target.types; - const include = types.map((t) => t.flags & 402784252 /* Primitive */ ? 0 /* False */ : -1 /* True */); + const include = types.map((t) => t.flags & 12713980 /* Primitive */ || getReducedType(t).flags & 262144 /* Never */ ? 0 /* False */ : -1 /* True */); for (const [getDiscriminatingType, propertyName] of discriminators) { let matched = false; for (let i = 0; i < types.length; i++) { @@ -71759,17 +71913,17 @@ function createTypeChecker(host) { } } const filtered = contains(include, 0 /* False */) ? getUnionType(types.filter((_, i) => include[i]), 0 /* None */) : target; - return filtered.flags & 131072 /* Never */ ? target : filtered; + return filtered.flags & 262144 /* Never */ ? target : filtered; } function isWeakType(type) { - if (type.flags & 524288 /* Object */) { + if (type.flags & 1048576 /* Object */) { const resolved = resolveStructuredTypeMembers(type); return resolved.callSignatures.length === 0 && resolved.constructSignatures.length === 0 && resolved.indexInfos.length === 0 && resolved.properties.length > 0 && every(resolved.properties, (p) => !!(p.flags & 16777216 /* Optional */)); } - if (type.flags & 33554432 /* Substitution */) { + if (type.flags & 16777216 /* Substitution */) { return isWeakType(type.baseType); } - if (type.flags & 2097152 /* Intersection */) { + if (type.flags & 268435456 /* Intersection */) { return every(type.types, isWeakType); } return false; @@ -71855,20 +72009,20 @@ function createTypeChecker(host) { } function hasCovariantVoidArgument(typeArguments, variances) { for (let i = 0; i < variances.length; i++) { - if ((variances[i] & 7 /* VarianceMask */) === 1 /* Covariant */ && typeArguments[i].flags & 16384 /* Void */) { + if ((variances[i] & 7 /* VarianceMask */) === 1 /* Covariant */ && typeArguments[i].flags & 16 /* Void */) { return true; } } return false; } function isUnconstrainedTypeParameter(type) { - return type.flags & 262144 /* TypeParameter */ && !getConstraintOfTypeParameter(type); + return type.flags & 524288 /* TypeParameter */ && !getConstraintOfTypeParameter(type); } function isNonDeferredTypeReference(type) { return !!(getObjectFlags(type) & 4 /* Reference */) && !type.node; } function isTypeReferenceWithGenericArguments(type) { - return isNonDeferredTypeReference(type) && some(getTypeArguments(type), (t) => !!(t.flags & 262144 /* TypeParameter */) || isTypeReferenceWithGenericArguments(t)); + return isNonDeferredTypeReference(type) && some(getTypeArguments(type), (t) => !!(t.flags & 524288 /* TypeParameter */) || isTypeReferenceWithGenericArguments(t)); } function getGenericTypeReferenceRelationKey(source, target, postFix, ignoreConstraints) { const typeParameters = []; @@ -71879,7 +72033,7 @@ function createTypeChecker(host) { function getTypeReferenceId(type, depth = 0) { let result = "" + type.target.id; for (const t of getTypeArguments(type)) { - if (t.flags & 262144 /* TypeParameter */) { + if (t.flags & 524288 /* TypeParameter */) { if (ignoreConstraints || isUnconstrainedTypeParameter(t)) { let index = typeParameters.indexOf(t); if (index < 0) { @@ -71946,7 +72100,7 @@ function createTypeChecker(host) { if ((getObjectFlags(type) & 96 /* InstantiatedMapped */) === 96 /* InstantiatedMapped */) { type = getMappedTargetWithSymbol(type); } - if (type.flags & 2097152 /* Intersection */) { + if (type.flags & 268435456 /* Intersection */) { return some(type.types, (t) => isDeeplyNestedType(t, stack, depth, maxDepth)); } const identity2 = getRecursionIdentity(type); @@ -71969,7 +72123,7 @@ function createTypeChecker(host) { } function getMappedTargetWithSymbol(type) { let target; - while ((getObjectFlags(type) & 96 /* InstantiatedMapped */) === 96 /* InstantiatedMapped */ && (target = getModifiersTypeFromMappedType(type)) && (target.symbol || target.flags & 2097152 /* Intersection */ && some(target.types, (t) => !!t.symbol))) { + while ((getObjectFlags(type) & 96 /* InstantiatedMapped */) === 96 /* InstantiatedMapped */ && (target = getModifiersTypeFromMappedType(type)) && (target.symbol || target.flags & 268435456 /* Intersection */ && some(target.types, (t) => !!t.symbol))) { type = target; } return type; @@ -71978,13 +72132,13 @@ function createTypeChecker(host) { if ((getObjectFlags(type) & 96 /* InstantiatedMapped */) === 96 /* InstantiatedMapped */) { type = getMappedTargetWithSymbol(type); } - if (type.flags & 2097152 /* Intersection */) { + if (type.flags & 268435456 /* Intersection */) { return some(type.types, (t) => hasMatchingRecursionIdentity(t, identity2)); } return getRecursionIdentity(type) === identity2; } function getRecursionIdentity(type) { - if (type.flags & 524288 /* Object */ && !isObjectOrArrayLiteralType(type)) { + if (type.flags & 1048576 /* Object */ && !isObjectOrArrayLiteralType(type)) { if (getObjectFlags(type) & 4 /* Reference */ && type.node) { return type.node; } @@ -71995,16 +72149,16 @@ function createTypeChecker(host) { return type.target; } } - if (type.flags & 262144 /* TypeParameter */) { + if (type.flags & 524288 /* TypeParameter */) { return type.symbol; } - if (type.flags & 8388608 /* IndexedAccess */) { + if (type.flags & 33554432 /* IndexedAccess */) { do { type = type.objectType; - } while (type.flags & 8388608 /* IndexedAccess */); + } while (type.flags & 33554432 /* IndexedAccess */); return type; } - if (type.flags & 16777216 /* Conditional */) { + if (type.flags & 67108864 /* Conditional */) { return type.root; } return type; @@ -72012,7 +72166,7 @@ function createTypeChecker(host) { function isPropertyIdenticalTo(sourceProp, targetProp) { return compareProperties2(sourceProp, targetProp, compareTypesIdentical) !== 0 /* False */; } - function compareProperties2(sourceProp, targetProp, compareTypes) { + function compareProperties2(sourceProp, targetProp, compareTypes2) { if (sourceProp === targetProp) { return -1 /* True */; } @@ -72033,7 +72187,7 @@ function createTypeChecker(host) { if (isReadonlySymbol(sourceProp) !== isReadonlySymbol(targetProp)) { return 0 /* False */; } - return compareTypes(getTypeOfSymbol(sourceProp), getTypeOfSymbol(targetProp)); + return compareTypes2(getNonMissingTypeOfSymbol(sourceProp), getNonMissingTypeOfSymbol(targetProp)); } function isMatchingSignature(source, target, partialMatch) { const sourceParameterCount = getParameterCount(source); @@ -72050,7 +72204,7 @@ function createTypeChecker(host) { } return false; } - function compareSignaturesIdentical(source, target, partialMatch, ignoreThisTypes, ignoreReturnTypes, compareTypes) { + function compareSignaturesIdentical(source, target, partialMatch, ignoreThisTypes, ignoreReturnTypes, compareTypes2) { if (source === target) { return -1 /* True */; } @@ -72065,7 +72219,7 @@ function createTypeChecker(host) { for (let i = 0; i < target.typeParameters.length; i++) { const s = source.typeParameters[i]; const t = target.typeParameters[i]; - if (!(s === t || compareTypes(instantiateType(getConstraintFromTypeParameter(s), mapper) || unknownType, getConstraintFromTypeParameter(t) || unknownType) && compareTypes(instantiateType(getDefaultFromTypeParameter(s), mapper) || unknownType, getDefaultFromTypeParameter(t) || unknownType))) { + if (!(s === t || compareTypes2(instantiateType(getConstraintFromTypeParameter(s), mapper) || unknownType, getConstraintFromTypeParameter(t) || unknownType) && compareTypes2(instantiateType(getDefaultFromTypeParameter(s), mapper) || unknownType, getDefaultFromTypeParameter(t) || unknownType))) { return 0 /* False */; } } @@ -72082,7 +72236,7 @@ function createTypeChecker(host) { if (sourceThisType) { const targetThisType = getThisTypeOfSignature(target); if (targetThisType) { - const related = compareTypes(sourceThisType, targetThisType); + const related = compareTypes2(sourceThisType, targetThisType); if (!related) { return 0 /* False */; } @@ -72094,7 +72248,7 @@ function createTypeChecker(host) { for (let i = 0; i < targetLen; i++) { const s = getTypeAtPosition(source, i); const t = getTypeAtPosition(target, i); - const related = compareTypes(t, s); + const related = compareTypes2(t, s); if (!related) { return 0 /* False */; } @@ -72103,17 +72257,17 @@ function createTypeChecker(host) { if (!ignoreReturnTypes) { const sourceTypePredicate = getTypePredicateOfSignature(source); const targetTypePredicate = getTypePredicateOfSignature(target); - result &= sourceTypePredicate || targetTypePredicate ? compareTypePredicatesIdentical(sourceTypePredicate, targetTypePredicate, compareTypes) : compareTypes(getReturnTypeOfSignature(source), getReturnTypeOfSignature(target)); + result &= sourceTypePredicate || targetTypePredicate ? compareTypePredicatesIdentical(sourceTypePredicate, targetTypePredicate, compareTypes2) : compareTypes2(getReturnTypeOfSignature(source), getReturnTypeOfSignature(target)); } return result; } - function compareTypePredicatesIdentical(source, target, compareTypes) { - return !(source && target && typePredicateKindsMatch(source, target)) ? 0 /* False */ : source.type === target.type ? -1 /* True */ : source.type && target.type ? compareTypes(source.type, target.type) : 0 /* False */; + function compareTypePredicatesIdentical(source, target, compareTypes2) { + return !(source && target && typePredicateKindsMatch(source, target)) ? 0 /* False */ : source.type === target.type ? -1 /* True */ : source.type && target.type ? compareTypes2(source.type, target.type) : 0 /* False */; } function literalTypesWithSameBaseType(types) { let commonBaseType; for (const t of types) { - if (!(t.flags & 131072 /* Never */)) { + if (!(t.flags & 262144 /* Never */)) { const baseType = getBaseTypeOfLiteralType(t); commonBaseType ?? (commonBaseType = baseType); if (baseType === t || baseType !== commonBaseType) { @@ -72124,15 +72278,15 @@ function createTypeChecker(host) { return true; } function getCombinedTypeFlags(types) { - return reduceLeft(types, (flags, t) => flags | (t.flags & 1048576 /* Union */ ? getCombinedTypeFlags(t.types) : t.flags), 0); + return reduceLeft(types, (flags, t) => flags | (t.flags & 134217728 /* Union */ ? getCombinedTypeFlags(t.types) : t.flags), 0); } function getCommonSupertype(types) { if (types.length === 1) { return types[0]; } - const primaryTypes = strictNullChecks ? sameMap(types, (t) => filterType(t, (u) => !(u.flags & 98304 /* Nullable */))) : types; + const primaryTypes = strictNullChecks ? sameMap(types, (t) => filterType(t, (u) => !(u.flags & 12 /* Nullable */))) : types; const superTypeOrUnion = literalTypesWithSameBaseType(primaryTypes) ? getUnionType(primaryTypes) : getSingleCommonSupertype(primaryTypes); - return primaryTypes === types ? superTypeOrUnion : getNullableType(superTypeOrUnion, getCombinedTypeFlags(types) & 98304 /* Nullable */); + return primaryTypes === types ? superTypeOrUnion : getNullableType(superTypeOrUnion, getCombinedTypeFlags(types) & 12 /* Nullable */); } function getSingleCommonSupertype(types) { const candidate = reduceLeft(types, (s, t) => isTypeStrictSubtypeOf(s, t) ? t : s); @@ -72157,10 +72311,10 @@ function createTypeChecker(host) { return isArrayType(type) ? getTypeArguments(type)[0] : void 0; } function isArrayLikeType(type) { - return isArrayType(type) || !(type.flags & 98304 /* Nullable */) && isTypeAssignableTo(type, anyReadonlyArrayType); + return isArrayType(type) || !(type.flags & 12 /* Nullable */) && isTypeAssignableTo(type, anyReadonlyArrayType); } function isMutableArrayLikeType(type) { - return isMutableArrayOrTuple(type) || !(type.flags & (1 /* Any */ | 98304 /* Nullable */)) && isTypeAssignableTo(type, anyArrayType); + return isMutableArrayOrTuple(type) || !(type.flags & (1 /* Any */ | 12 /* Nullable */)) && isTypeAssignableTo(type, anyArrayType); } function getSingleBaseForNonAugmentingSubtype(type) { if (!(getObjectFlags(type) & 4 /* Reference */) || !(getObjectFlags(type.target) & 3 /* ClassOrInterface */)) { @@ -72200,7 +72354,7 @@ function createTypeChecker(host) { } function isTupleLikeType(type) { let lengthType; - return isTupleType(type) || !!getPropertyOfType(type, "0") || isArrayLikeType(type) && !!(lengthType = getTypeOfPropertyOfType(type, "length")) && everyType(lengthType, (t) => !!(t.flags & 256 /* NumberLiteral */)); + return isTupleType(type) || !!getPropertyOfType(type, "0") || isArrayLikeType(type) && !!(lengthType = getTypeOfPropertyOfType(type, "length")) && everyType(lengthType, (t) => !!(t.flags & 2048 /* NumberLiteral */)); } function isArrayOrTupleLikeType(type) { return isArrayLikeType(type) || isTupleLikeType(type); @@ -72216,36 +72370,36 @@ function createTypeChecker(host) { return void 0; } function isNeitherUnitTypeNorNever(type) { - return !(type.flags & (109472 /* Unit */ | 131072 /* Never */)); + return !(type.flags & (97292 /* Unit */ | 262144 /* Never */)); } function isUnitType(type) { - return !!(type.flags & 109472 /* Unit */); + return !!(type.flags & 97292 /* Unit */); } function isUnitLikeType(type) { const t = getBaseConstraintOrType(type); - return t.flags & 2097152 /* Intersection */ ? some(t.types, isUnitType) : isUnitType(t); + return t.flags & 268435456 /* Intersection */ ? some(t.types, isUnitType) : isUnitType(t); } function extractUnitType(type) { - return type.flags & 2097152 /* Intersection */ ? find(type.types, isUnitType) || type : type; + return type.flags & 268435456 /* Intersection */ ? find(type.types, isUnitType) || type : type; } function isLiteralType(type) { - return type.flags & 16 /* Boolean */ ? true : type.flags & 1048576 /* Union */ ? type.flags & 1024 /* EnumLiteral */ ? true : every(type.types, isUnitType) : isUnitType(type); + return type.flags & 256 /* Boolean */ ? true : type.flags & 134217728 /* Union */ ? type.flags & 32768 /* EnumLiteral */ ? true : every(type.types, isUnitType) : isUnitType(type); } function getBaseTypeOfLiteralType(type) { - return type.flags & 1056 /* EnumLike */ ? getBaseTypeOfEnumLikeType(type) : type.flags & (128 /* StringLiteral */ | 134217728 /* TemplateLiteral */ | 268435456 /* StringMapping */) ? stringType : type.flags & 256 /* NumberLiteral */ ? numberType : type.flags & 2048 /* BigIntLiteral */ ? bigintType : type.flags & 512 /* BooleanLiteral */ ? booleanType : type.flags & 1048576 /* Union */ ? getBaseTypeOfLiteralTypeUnion(type) : type; + return type.flags & 98304 /* EnumLike */ ? getBaseTypeOfEnumLikeType(type) : type.flags & (1024 /* StringLiteral */ | 4194304 /* TemplateLiteral */ | 8388608 /* StringMapping */) ? stringType : type.flags & 2048 /* NumberLiteral */ ? numberType : type.flags & 4096 /* BigIntLiteral */ ? bigintType : type.flags & 8192 /* BooleanLiteral */ ? booleanType : type.flags & 134217728 /* Union */ ? getBaseTypeOfLiteralTypeUnion(type) : type; } function getBaseTypeOfLiteralTypeUnion(type) { const key = `B${getTypeId(type)}`; return getCachedType(key) ?? setCachedType(key, mapType(type, getBaseTypeOfLiteralType)); } function getBaseTypeOfLiteralTypeForComparison(type) { - return type.flags & (128 /* StringLiteral */ | 134217728 /* TemplateLiteral */ | 268435456 /* StringMapping */) ? stringType : type.flags & (256 /* NumberLiteral */ | 32 /* Enum */) ? numberType : type.flags & 2048 /* BigIntLiteral */ ? bigintType : type.flags & 512 /* BooleanLiteral */ ? booleanType : type.flags & 1048576 /* Union */ ? mapType(type, getBaseTypeOfLiteralTypeForComparison) : type; + return type.flags & (1024 /* StringLiteral */ | 4194304 /* TemplateLiteral */ | 8388608 /* StringMapping */) ? stringType : type.flags & (2048 /* NumberLiteral */ | 65536 /* Enum */) ? numberType : type.flags & 4096 /* BigIntLiteral */ ? bigintType : type.flags & 8192 /* BooleanLiteral */ ? booleanType : type.flags & 134217728 /* Union */ ? mapType(type, getBaseTypeOfLiteralTypeForComparison) : type; } function getWidenedLiteralType(type) { - return type.flags & 1056 /* EnumLike */ && isFreshLiteralType(type) ? getBaseTypeOfEnumLikeType(type) : type.flags & 128 /* StringLiteral */ && isFreshLiteralType(type) ? stringType : type.flags & 256 /* NumberLiteral */ && isFreshLiteralType(type) ? numberType : type.flags & 2048 /* BigIntLiteral */ && isFreshLiteralType(type) ? bigintType : type.flags & 512 /* BooleanLiteral */ && isFreshLiteralType(type) ? booleanType : type.flags & 1048576 /* Union */ ? mapType(type, getWidenedLiteralType) : type; + return type.flags & 98304 /* EnumLike */ && isFreshLiteralType(type) ? getBaseTypeOfEnumLikeType(type) : type.flags & 1024 /* StringLiteral */ && isFreshLiteralType(type) ? stringType : type.flags & 2048 /* NumberLiteral */ && isFreshLiteralType(type) ? numberType : type.flags & 4096 /* BigIntLiteral */ && isFreshLiteralType(type) ? bigintType : type.flags & 8192 /* BooleanLiteral */ && isFreshLiteralType(type) ? booleanType : type.flags & 134217728 /* Union */ ? mapType(type, getWidenedLiteralType) : type; } function getWidenedUniqueESSymbolType(type) { - return type.flags & 8192 /* UniqueESSymbol */ ? esSymbolType : type.flags & 1048576 /* Union */ ? mapType(type, getWidenedUniqueESSymbolType) : type; + return type.flags & 16384 /* UniqueESSymbol */ ? esSymbolType : type.flags & 134217728 /* Union */ ? mapType(type, getWidenedUniqueESSymbolType) : type; } function getWidenedLiteralLikeTypeForContextualType(type, contextualType) { if (!isLiteralOfContextualType(type, contextualType)) { @@ -72322,16 +72476,16 @@ function createTypeChecker(host) { return mapType(type, getDefinitelyFalsyPartOfType); } function getDefinitelyFalsyPartOfType(type) { - return type.flags & 4 /* String */ ? emptyStringType : type.flags & 8 /* Number */ ? zeroType : type.flags & 64 /* BigInt */ ? zeroBigIntType : type === regularFalseType || type === falseType || type.flags & (16384 /* Void */ | 32768 /* Undefined */ | 65536 /* Null */ | 3 /* AnyOrUnknown */) || type.flags & 128 /* StringLiteral */ && type.value === "" || type.flags & 256 /* NumberLiteral */ && type.value === 0 || type.flags & 2048 /* BigIntLiteral */ && isZeroBigInt(type) ? type : neverType; + return type.flags & 32 /* String */ ? emptyStringType : type.flags & 64 /* Number */ ? zeroType : type.flags & 128 /* BigInt */ ? zeroBigIntType : type === regularFalseType || type === falseType || type.flags & (16 /* Void */ | 4 /* Undefined */ | 8 /* Null */ | 3 /* AnyOrUnknown */) || type.flags & 1024 /* StringLiteral */ && type.value === "" || type.flags & 2048 /* NumberLiteral */ && type.value === 0 || type.flags & 4096 /* BigIntLiteral */ && isZeroBigInt(type) ? type : neverType; } function getNullableType(type, flags) { - const missing = flags & ~type.flags & (32768 /* Undefined */ | 65536 /* Null */); - return missing === 0 ? type : missing === 32768 /* Undefined */ ? getUnionType([type, undefinedType]) : missing === 65536 /* Null */ ? getUnionType([type, nullType]) : getUnionType([type, undefinedType, nullType]); + const missing = flags & ~type.flags & (4 /* Undefined */ | 8 /* Null */); + return missing === 0 ? type : missing === 4 /* Undefined */ ? getUnionType([type, undefinedType]) : missing === 8 /* Null */ ? getUnionType([type, nullType]) : getUnionType([type, undefinedType, nullType]); } function getOptionalType(type, isProperty = false) { Debug.assert(strictNullChecks); const missingOrUndefined = isProperty ? undefinedOrMissingType : undefinedType; - return type === missingOrUndefined || type.flags & 1048576 /* Union */ && type.types[0] === missingOrUndefined ? type : getUnionType([type, missingOrUndefined]); + return type === missingOrUndefined || type.flags & 134217728 /* Union */ && type.types[0] === missingOrUndefined ? type : getUnionType([type, missingOrUndefined]); } function getGlobalNonNullableTypeInstantiation(type) { if (!deferredGlobalNonNullableTypeAlias) { @@ -72363,17 +72517,17 @@ function createTypeChecker(host) { return exactOptionalPropertyTypes && isOptional ? removeType(type, missingType) : type; } function containsMissingType(type) { - return type === missingType || !!(type.flags & 1048576 /* Union */) && type.types[0] === missingType; + return type === missingType || !!(type.flags & 134217728 /* Union */) && type.types[0] === missingType; } function removeMissingOrUndefinedType(type) { return exactOptionalPropertyTypes ? removeType(type, missingType) : getTypeWithFacts(type, 524288 /* NEUndefined */); } function isCoercibleUnderDoubleEquals(source, target) { - return (source.flags & (8 /* Number */ | 4 /* String */ | 512 /* BooleanLiteral */)) !== 0 && (target.flags & (8 /* Number */ | 4 /* String */ | 16 /* Boolean */)) !== 0; + return (source.flags & (64 /* Number */ | 32 /* String */ | 8192 /* BooleanLiteral */)) !== 0 && (target.flags & (64 /* Number */ | 32 /* String */ | 256 /* Boolean */)) !== 0; } function isObjectTypeWithInferableIndex(type) { const objectFlags = getObjectFlags(type); - return type.flags & 2097152 /* Intersection */ ? every(type.types, isObjectTypeWithInferableIndex) : !!(type.symbol && (type.symbol.flags & (4096 /* ObjectLiteral */ | 2048 /* TypeLiteral */ | 384 /* Enum */ | 512 /* ValueModule */)) !== 0 && !(type.symbol.flags & 32 /* Class */) && !typeHasCallOrConstructSignatures(type)) || !!(objectFlags & 4194304 /* ObjectRestType */) || !!(objectFlags & 1024 /* ReverseMapped */ && isObjectTypeWithInferableIndex(type.source)); + return type.flags & 268435456 /* Intersection */ ? every(type.types, isObjectTypeWithInferableIndex) : !!(type.symbol && (type.symbol.flags & (4096 /* ObjectLiteral */ | 2048 /* TypeLiteral */ | 384 /* Enum */ | 512 /* ValueModule */)) !== 0 && !(type.symbol.flags & 32 /* Class */) && !typeHasCallOrConstructSignatures(type)) || !!(objectFlags & 4194304 /* ObjectRestType */) || !!(objectFlags & 1024 /* ReverseMapped */ && isObjectTypeWithInferableIndex(type.source)); } function createSymbolWithType(source, type) { const symbol = createSymbol(source.flags, source.escapedName, getCheckFlags(source) & 8 /* Readonly */); @@ -72502,11 +72656,11 @@ function createTypeChecker(host) { return type.widened; } let result; - if (type.flags & (1 /* Any */ | 98304 /* Nullable */)) { + if (type.flags & (1 /* Any */ | 12 /* Nullable */)) { result = anyType; } else if (isObjectLiteralType2(type)) { result = getWidenedTypeOfObjectLiteral(type, context); - } else if (type.flags & 1048576 /* Union */) { + } else if (type.flags & 134217728 /* Union */) { const unionContext = context || createWideningContext( /*parent*/ void 0, @@ -72514,9 +72668,9 @@ function createTypeChecker(host) { void 0, type.types ); - const widenedTypes = sameMap(type.types, (t) => t.flags & 98304 /* Nullable */ ? t : getWidenedTypeWithContext(t, unionContext)); + const widenedTypes = sameMap(type.types, (t) => t.flags & 12 /* Nullable */ ? t : getWidenedTypeWithContext(t, unionContext)); result = getUnionType(widenedTypes, some(widenedTypes, isEmptyObjectType) ? 2 /* Subtype */ : 1 /* Literal */); - } else if (type.flags & 2097152 /* Intersection */) { + } else if (type.flags & 268435456 /* Intersection */) { result = getIntersectionType(sameMap(type.types, getWidenedType)); } else if (isArrayOrTupleType(type)) { result = createTypeReference(type.target, sameMap(getTypeArguments(type), getWidenedType)); @@ -72532,7 +72686,7 @@ function createTypeChecker(host) { var _a; let errorReported = false; if (getObjectFlags(type) & 65536 /* ContainsWideningType */) { - if (type.flags & 1048576 /* Union */) { + if (type.flags & 134217728 /* Union */) { if (some(type.types, isEmptyObjectType)) { errorReported = true; } else { @@ -72714,18 +72868,18 @@ function createTypeChecker(host) { callback(getReturnTypeOfSignature(source), targetReturnType); } } - function createInferenceContext(typeParameters, signature, flags, compareTypes) { - return createInferenceContextWorker(typeParameters.map(createInferenceInfo), signature, flags, compareTypes || compareTypesAssignable); + function createInferenceContext(typeParameters, signature, flags, compareTypes2) { + return createInferenceContextWorker(typeParameters.map(createInferenceInfo), signature, flags, compareTypes2 || compareTypesAssignable); } function cloneInferenceContext(context, extraFlags = 0) { return context && createInferenceContextWorker(map(context.inferences, cloneInferenceInfo), context.signature, context.flags | extraFlags, context.compareTypes); } - function createInferenceContextWorker(inferences, signature, flags, compareTypes) { + function createInferenceContextWorker(inferences, signature, flags, compareTypes2) { const context = { inferences, signature, flags, - compareTypes, + compareTypes: compareTypes2, mapper: reportUnmeasurableMapper, // initialize to a noop mapper so the context object is available, but the underlying object shape is right upon construction nonFixingMapper: reportUnmeasurableMapper @@ -72812,8 +72966,8 @@ function createTypeChecker(host) { if (objectFlags & 524288 /* CouldContainTypeVariablesComputed */) { return !!(objectFlags & 1048576 /* CouldContainTypeVariables */); } - const result = !!(type.flags & 465829888 /* Instantiable */ || type.flags & 524288 /* Object */ && !isNonGenericTopLevelType(type) && (objectFlags & 4 /* Reference */ && (type.node || some(getTypeArguments(type), couldContainTypeVariables)) || objectFlags & 16 /* Anonymous */ && type.symbol && type.symbol.flags & (16 /* Function */ | 8192 /* Method */ | 32 /* Class */ | 2048 /* TypeLiteral */ | 4096 /* ObjectLiteral */) && type.symbol.declarations || objectFlags & (32 /* Mapped */ | 1024 /* ReverseMapped */ | 4194304 /* ObjectRestType */ | 8388608 /* InstantiationExpressionType */)) || type.flags & 3145728 /* UnionOrIntersection */ && !(type.flags & 1024 /* EnumLiteral */) && !isNonGenericTopLevelType(type) && some(type.types, couldContainTypeVariables)); - if (type.flags & 3899393 /* ObjectFlagsType */) { + const result = !!(type.flags & 132644864 /* Instantiable */ || type.flags & 1048576 /* Object */ && !isNonGenericTopLevelType(type) && (objectFlags & 4 /* Reference */ && (type.node || some(getTypeArguments(type), couldContainTypeVariables)) || objectFlags & 16 /* Anonymous */ && type.symbol && type.symbol.flags & (16 /* Function */ | 8192 /* Method */ | 32 /* Class */ | 2048 /* TypeLiteral */ | 4096 /* ObjectLiteral */) && type.symbol.declarations || objectFlags & (32 /* Mapped */ | 1024 /* ReverseMapped */ | 4194304 /* ObjectRestType */ | 8388608 /* InstantiationExpressionType */)) || type.flags & 402653184 /* UnionOrIntersection */ && !(type.flags & 32768 /* EnumLiteral */) && !isNonGenericTopLevelType(type) && some(type.types, couldContainTypeVariables)); + if (type.flags & 403963917 /* ObjectFlagsType */) { type.objectFlags |= 524288 /* CouldContainTypeVariablesComputed */ | (result ? 1048576 /* CouldContainTypeVariables */ : 0); } return result; @@ -72826,7 +72980,7 @@ function createTypeChecker(host) { return false; } function isTypeParameterAtTopLevel(type, tp, depth = 0) { - return !!(type === tp || type.flags & 3145728 /* UnionOrIntersection */ && some(type.types, (t) => isTypeParameterAtTopLevel(t, tp, depth)) || depth < 3 && type.flags & 16777216 /* Conditional */ && (isTypeParameterAtTopLevel(getTrueTypeFromConditionalType(type), tp, depth + 1) || isTypeParameterAtTopLevel(getFalseTypeFromConditionalType(type), tp, depth + 1))); + return !!(type === tp || type.flags & 402653184 /* UnionOrIntersection */ && some(type.types, (t) => isTypeParameterAtTopLevel(t, tp, depth)) || depth < 3 && type.flags & 67108864 /* Conditional */ && (isTypeParameterAtTopLevel(getTrueTypeFromConditionalType(type), tp, depth + 1) || isTypeParameterAtTopLevel(getFalseTypeFromConditionalType(type), tp, depth + 1))); } function isTypeParameterAtTopLevelInReturnType(signature, typeParameter) { const typePredicate = getTypePredicateOfSignature(signature); @@ -72835,7 +72989,7 @@ function createTypeChecker(host) { function createEmptyObjectTypeFromStringLiteral(type) { const members = createSymbolTable(); forEachType(type, (t) => { - if (!(t.flags & 128 /* StringLiteral */)) { + if (!(t.flags & 1024 /* StringLiteral */)) { return; } const name = escapeLeadingUnderscores(t.value); @@ -72847,7 +73001,7 @@ function createTypeChecker(host) { } members.set(name, literalProp); }); - const indexInfos = type.flags & 4 /* String */ ? [createIndexInfo( + const indexInfos = type.flags & 32 /* String */ ? [createIndexInfo( stringType, emptyObjectType, /*isReadonly*/ @@ -72915,7 +73069,7 @@ function createTypeChecker(host) { const templateType = getTemplateTypeFromMappedType(target); const inference = createInferenceInfo(typeParameter); inferTypes([inference], sourceType, templateType); - return getTypeFromInference(inference) || unknownType; + return getWidenedType(getTypeFromInference(inference) || unknownType); } function inferReverseMappedType(source, target, constraint) { const cacheKey = source.id + "," + target.id + "," + constraint.id; @@ -72949,7 +73103,7 @@ function createTypeChecker(host) { yield targetProp; } else if (matchDiscriminantProperties) { const targetType = getTypeOfSymbol(targetProp); - if (targetType.flags & 109472 /* Unit */) { + if (targetType.flags & 97292 /* Unit */) { const sourceType = getTypeOfSymbol(sourceProp); if (!(sourceType.flags & 1 /* Any */ || getRegularTypeOfLiteralType(sourceType) === getRegularTypeOfLiteralType(targetType))) { yield targetProp; @@ -73012,12 +73166,12 @@ function createTypeChecker(host) { if (target.flags & 1 /* Any */) { return true; } - if (target.flags & (4 /* String */ | 134217728 /* TemplateLiteral */)) { + if (target.flags & (32 /* String */ | 4194304 /* TemplateLiteral */)) { return isTypeAssignableTo(source, target); } - if (target.flags & 268435456 /* StringMapping */) { + if (target.flags & 8388608 /* StringMapping */) { const mappingStack = []; - while (target.flags & 268435456 /* StringMapping */) { + while (target.flags & 8388608 /* StringMapping */) { mappingStack.unshift(target.symbol); target = target.type; } @@ -73027,32 +73181,32 @@ function createTypeChecker(host) { return false; } function isValidTypeForTemplateLiteralPlaceholder(source, target) { - if (target.flags & 2097152 /* Intersection */) { + if (target.flags & 268435456 /* Intersection */) { return every(target.types, (t) => t === emptyTypeLiteralType || isValidTypeForTemplateLiteralPlaceholder(source, t)); } - if (target.flags & 4 /* String */ || isTypeAssignableTo(source, target)) { + if (target.flags & 32 /* String */ || isTypeAssignableTo(source, target)) { return true; } - if (source.flags & 128 /* StringLiteral */) { + if (source.flags & 1024 /* StringLiteral */) { const value = source.value; - return !!(target.flags & 8 /* Number */ && isValidNumberString( + return !!(target.flags & 64 /* Number */ && isValidNumberString( value, /*roundTripOnly*/ false - ) || target.flags & 64 /* BigInt */ && isValidBigIntString( + ) || target.flags & 128 /* BigInt */ && isValidBigIntString( value, /*roundTripOnly*/ false - ) || target.flags & (512 /* BooleanLiteral */ | 98304 /* Nullable */) && value === target.intrinsicName || target.flags & 268435456 /* StringMapping */ && isMemberOfStringMapping(source, target) || target.flags & 134217728 /* TemplateLiteral */ && isTypeMatchedByTemplateLiteralType(source, target)); + ) || target.flags & (8192 /* BooleanLiteral */ | 12 /* Nullable */) && value === target.intrinsicName || target.flags & 8388608 /* StringMapping */ && isMemberOfStringMapping(source, target) || target.flags & 4194304 /* TemplateLiteral */ && isTypeMatchedByTemplateLiteralType(source, target)); } - if (source.flags & 134217728 /* TemplateLiteral */) { + if (source.flags & 4194304 /* TemplateLiteral */) { const texts = source.texts; return texts.length === 2 && texts[0] === "" && texts[1] === "" && isTypeAssignableTo(source.types[0], target); } return false; } function inferTypesFromTemplateLiteralType(source, target) { - return source.flags & 128 /* StringLiteral */ ? inferFromLiteralPartsToTemplateLiteral([source.value], emptyArray, target) : source.flags & 134217728 /* TemplateLiteral */ ? arrayIsEqualTo(source.texts, target.texts) ? map(source.types, (s, i) => { + return source.flags & 1024 /* StringLiteral */ ? inferFromLiteralPartsToTemplateLiteral([source.value], emptyArray, target) : source.flags & 4194304 /* TemplateLiteral */ ? arrayIsEqualTo(source.texts, target.texts) ? map(source.types, (s, i) => { return isTypeAssignableTo(getBaseConstraintOrType(s), getBaseConstraintOrType(target.types[i])) ? s : getStringLikeTypeForType(s); }) : inferFromLiteralPartsToTemplateLiteral(source.texts, source.types, target) : void 0; } @@ -73061,7 +73215,7 @@ function createTypeChecker(host) { return !!inferences && every(inferences, (r, i) => isValidTypeForTemplateLiteralPlaceholder(r, target.types[i])); } function getStringLikeTypeForType(type) { - return type.flags & (1 /* Any */ | 402653316 /* StringLike */) ? type : getTemplateLiteralType(["", ""], [type]); + return type.flags & (1 /* Any */ | 12583968 /* StringLike */) ? type : getTemplateLiteralType(["", ""], [type]); } function inferFromLiteralPartsToTemplateLiteral(sourceTexts, sourceTypes, target) { const lastSourceIndex = sourceTexts.length - 1; @@ -73143,14 +73297,14 @@ function createTypeChecker(host) { } return; } - if (source === target && source.flags & 3145728 /* UnionOrIntersection */) { + if (source === target && source.flags & 402653184 /* UnionOrIntersection */) { for (const t of source.types) { inferFromTypes(t, t); } return; } - if (target.flags & 1048576 /* Union */) { - const [tempSources, tempTargets] = inferFromMatchingTypes(source.flags & 1048576 /* Union */ ? source.types : [source], target.types, isTypeOrBaseIdenticalTo); + if (target.flags & 134217728 /* Union */) { + const [tempSources, tempTargets] = inferFromMatchingTypes(source.flags & 134217728 /* Union */ ? source.types : [source], target.types, isTypeOrBaseIdenticalTo); const [sources, targets] = inferFromMatchingTypes(tempSources, tempTargets, isTypeCloselyMatchedBy); if (targets.length === 0) { return; @@ -73161,9 +73315,9 @@ function createTypeChecker(host) { return; } source = getUnionType(sources); - } else if (target.flags & 2097152 /* Intersection */ && !every(target.types, isNonGenericObjectType)) { - if (!(source.flags & 1048576 /* Union */)) { - const [sources, targets] = inferFromMatchingTypes(source.flags & 2097152 /* Intersection */ ? source.types : [source], target.types, isTypeIdenticalTo); + } else if (target.flags & 268435456 /* Intersection */ && !every(target.types, isNonGenericObjectType)) { + if (!(source.flags & 134217728 /* Union */)) { + const [sources, targets] = inferFromMatchingTypes(source.flags & 268435456 /* Intersection */ ? source.types : [source], target.types, isTypeIdenticalTo); if (sources.length === 0 || targets.length === 0) { return; } @@ -73171,13 +73325,13 @@ function createTypeChecker(host) { target = getIntersectionType(targets); } } - if (target.flags & (8388608 /* IndexedAccess */ | 33554432 /* Substitution */)) { + if (target.flags & (33554432 /* IndexedAccess */ | 16777216 /* Substitution */)) { if (isNoInferType(target)) { return; } target = getActualTypeVariable(target); } - if (target.flags & 8650752 /* TypeVariable */) { + if (target.flags & 34078720 /* TypeVariable */) { if (isFromInferenceBlockedSource(source)) { return; } @@ -73208,7 +73362,7 @@ function createTypeChecker(host) { clearCachedInferences(inferences); } } - if (!(priority & 128 /* ReturnType */) && target.flags & 262144 /* TypeParameter */ && inference.topLevel && !isTypeParameterAtTopLevel(originalTarget, target)) { + if (!(priority & 128 /* ReturnType */) && target.flags & 524288 /* TypeParameter */ && inference.topLevel && !isTypeParameterAtTopLevel(originalTarget, target)) { inference.topLevel = false; clearCachedInferences(inferences); } @@ -73223,13 +73377,13 @@ function createTypeChecker(host) { ); if (simplified !== target) { inferFromTypes(source, simplified); - } else if (target.flags & 8388608 /* IndexedAccess */) { + } else if (target.flags & 33554432 /* IndexedAccess */) { const indexType = getSimplifiedType( target.indexType, /*writing*/ false ); - if (indexType.flags & 465829888 /* Instantiable */) { + if (indexType.flags & 132644864 /* Instantiable */) { const simplified2 = distributeIndexOverObjectType( getSimplifiedType( target.objectType, @@ -73248,45 +73402,45 @@ function createTypeChecker(host) { } if (getObjectFlags(source) & 4 /* Reference */ && getObjectFlags(target) & 4 /* Reference */ && (source.target === target.target || isArrayType(source) && isArrayType(target)) && !(source.node && target.node)) { inferFromTypeArguments(getTypeArguments(source), getTypeArguments(target), getVariances(source.target)); - } else if (source.flags & 4194304 /* Index */ && target.flags & 4194304 /* Index */) { + } else if (source.flags & 2097152 /* Index */ && target.flags & 2097152 /* Index */) { inferFromContravariantTypes(source.type, target.type); - } else if ((isLiteralType(source) || source.flags & 4 /* String */) && target.flags & 4194304 /* Index */) { + } else if ((isLiteralType(source) || source.flags & 32 /* String */) && target.flags & 2097152 /* Index */) { const empty = createEmptyObjectTypeFromStringLiteral(source); inferFromContravariantTypesWithPriority(empty, target.type, 256 /* LiteralKeyof */); - } else if (source.flags & 8388608 /* IndexedAccess */ && target.flags & 8388608 /* IndexedAccess */) { + } else if (source.flags & 33554432 /* IndexedAccess */ && target.flags & 33554432 /* IndexedAccess */) { inferFromTypes(source.objectType, target.objectType); inferFromTypes(source.indexType, target.indexType); - } else if (source.flags & 268435456 /* StringMapping */ && target.flags & 268435456 /* StringMapping */) { + } else if (source.flags & 8388608 /* StringMapping */ && target.flags & 8388608 /* StringMapping */) { if (source.symbol === target.symbol) { inferFromTypes(source.type, target.type); } - } else if (source.flags & 33554432 /* Substitution */) { + } else if (source.flags & 16777216 /* Substitution */) { inferFromTypes(source.baseType, target); inferWithPriority(getSubstitutionIntersection(source), target, 4 /* SubstituteSource */); - } else if (target.flags & 16777216 /* Conditional */) { + } else if (target.flags & 67108864 /* Conditional */) { invokeOnce(source, target, inferToConditionalType); - } else if (target.flags & 3145728 /* UnionOrIntersection */) { + } else if (target.flags & 402653184 /* UnionOrIntersection */) { inferToMultipleTypes(source, target.types, target.flags); - } else if (source.flags & 1048576 /* Union */) { + } else if (source.flags & 134217728 /* Union */) { const sourceTypes = source.types; for (const sourceType of sourceTypes) { inferFromTypes(sourceType, target); } - } else if (target.flags & 134217728 /* TemplateLiteral */) { + } else if (target.flags & 4194304 /* TemplateLiteral */) { inferToTemplateLiteralType(source, target); } else { source = getReducedType(source); if (isGenericMappedType(source) && isGenericMappedType(target)) { invokeOnce(source, target, inferFromGenericMappedTypes); } - if (!(priority & 512 /* NoConstraints */ && source.flags & (2097152 /* Intersection */ | 465829888 /* Instantiable */))) { + if (!(priority & 512 /* NoConstraints */ && source.flags & (268435456 /* Intersection */ | 132644864 /* Instantiable */))) { const apparentSource = getApparentType(source); - if (apparentSource !== source && !(apparentSource.flags & (524288 /* Object */ | 2097152 /* Intersection */))) { + if (apparentSource !== source && !(apparentSource.flags & (1048576 /* Object */ | 268435456 /* Intersection */))) { return inferFromTypes(apparentSource, target); } source = apparentSource; } - if (source.flags & (524288 /* Object */ | 2097152 /* Intersection */)) { + if (source.flags & (1048576 /* Object */ | 268435456 /* Intersection */)) { invokeOnce(source, target, inferFromObjectTypes); } } @@ -73375,7 +73529,7 @@ function createTypeChecker(host) { } } function getInferenceInfoForType(type) { - if (type.flags & 8650752 /* TypeVariable */) { + if (type.flags & 34078720 /* TypeVariable */) { for (const inference of inferences) { if (type === inference.typeParameter) { return inference; @@ -73387,7 +73541,7 @@ function createTypeChecker(host) { function getSingleTypeVariableFromIntersectionTypes(types) { let typeVariable; for (const type of types) { - const t = type.flags & 2097152 /* Intersection */ && find(type.types, (t2) => !!getInferenceInfoForType(t2)); + const t = type.flags & 268435456 /* Intersection */ && find(type.types, (t2) => !!getInferenceInfoForType(t2)); if (!t || typeVariable && t !== typeVariable) { return void 0; } @@ -73397,9 +73551,9 @@ function createTypeChecker(host) { } function inferToMultipleTypes(source, targets, targetFlags) { let typeVariableCount = 0; - if (targetFlags & 1048576 /* Union */) { + if (targetFlags & 134217728 /* Union */) { let nakedTypeVariable; - const sources = source.flags & 1048576 /* Union */ ? source.types : [source]; + const sources = source.flags & 134217728 /* Union */ ? source.types : [source]; const matched = new Array(sources.length); let inferenceCircularity = false; for (const t of targets) { @@ -73440,7 +73594,7 @@ function createTypeChecker(host) { } } } - if (targetFlags & 2097152 /* Intersection */ ? typeVariableCount === 1 : typeVariableCount > 0) { + if (targetFlags & 268435456 /* Intersection */ ? typeVariableCount === 1 : typeVariableCount > 0) { for (const t of targets) { if (getInferenceInfoForType(t)) { inferWithPriority(source, t, 1 /* NakedTypeVariable */); @@ -73449,14 +73603,14 @@ function createTypeChecker(host) { } } function inferToMappedType(source, target, constraintType) { - if (constraintType.flags & 1048576 /* Union */ || constraintType.flags & 2097152 /* Intersection */) { + if (constraintType.flags & 134217728 /* Union */ || constraintType.flags & 268435456 /* Intersection */) { let result = false; for (const type of constraintType.types) { result = inferToMappedType(source, target, type) || result; } return result; } - if (constraintType.flags & 4194304 /* Index */) { + if (constraintType.flags & 2097152 /* Index */) { const inference = getInferenceInfoForType(constraintType.type); if (inference && !inference.isFixed && !isFromInferenceBlockedSource(source)) { const inferredType = inferTypeForHomomorphicMappedType(source, target, constraintType); @@ -73470,7 +73624,7 @@ function createTypeChecker(host) { } return true; } - if (constraintType.flags & 262144 /* TypeParameter */) { + if (constraintType.flags & 524288 /* TypeParameter */) { inferWithPriority(getIndexType( source, /*indexFlags*/ @@ -73488,7 +73642,7 @@ function createTypeChecker(host) { return false; } function inferToConditionalType(source, target) { - if (source.flags & 16777216 /* Conditional */) { + if (source.flags & 67108864 /* Conditional */) { inferFromTypes(source.checkType, target.checkType); inferFromTypes(source.extendsType, target.extendsType); inferFromTypes(getTrueTypeFromConditionalType(source), getTrueTypeFromConditionalType(target)); @@ -73505,30 +73659,30 @@ function createTypeChecker(host) { for (let i = 0; i < types.length; i++) { const source2 = matches ? matches[i] : neverType; const target2 = types[i]; - if (source2.flags & 128 /* StringLiteral */ && target2.flags & 8650752 /* TypeVariable */) { + if (source2.flags & 1024 /* StringLiteral */ && target2.flags & 34078720 /* TypeVariable */) { const inferenceContext = getInferenceInfoForType(target2); const constraint = inferenceContext ? getBaseConstraintOfType(inferenceContext.typeParameter) : void 0; if (constraint && !isTypeAny(constraint)) { - const constraintTypes = constraint.flags & 1048576 /* Union */ ? constraint.types : [constraint]; + const constraintTypes = constraint.flags & 134217728 /* Union */ ? constraint.types : [constraint]; let allTypeFlags = reduceLeft(constraintTypes, (flags, t) => flags | t.flags, 0); - if (!(allTypeFlags & 4 /* String */)) { + if (!(allTypeFlags & 32 /* String */)) { const str = source2.value; - if (allTypeFlags & 296 /* NumberLike */ && !isValidNumberString( + if (allTypeFlags & 67648 /* NumberLike */ && !isValidNumberString( str, /*roundTripOnly*/ true )) { - allTypeFlags &= ~296 /* NumberLike */; + allTypeFlags &= ~67648 /* NumberLike */; } - if (allTypeFlags & 2112 /* BigIntLike */ && !isValidBigIntString( + if (allTypeFlags & 4224 /* BigIntLike */ && !isValidBigIntString( str, /*roundTripOnly*/ true )) { - allTypeFlags &= ~2112 /* BigIntLike */; + allTypeFlags &= ~4224 /* BigIntLike */; } - const matchingType = reduceLeft(constraintTypes, (left, right) => !(right.flags & allTypeFlags) ? left : left.flags & 4 /* String */ ? left : right.flags & 4 /* String */ ? source2 : left.flags & 134217728 /* TemplateLiteral */ ? left : right.flags & 134217728 /* TemplateLiteral */ && isTypeMatchedByTemplateLiteralType(source2, right) ? source2 : left.flags & 268435456 /* StringMapping */ ? left : right.flags & 268435456 /* StringMapping */ && str === applyStringMapping(right.symbol, str) ? source2 : left.flags & 128 /* StringLiteral */ ? left : right.flags & 128 /* StringLiteral */ && right.value === str ? right : left.flags & 8 /* Number */ ? left : right.flags & 8 /* Number */ ? getNumberLiteralType(+str) : left.flags & 32 /* Enum */ ? left : right.flags & 32 /* Enum */ ? getNumberLiteralType(+str) : left.flags & 256 /* NumberLiteral */ ? left : right.flags & 256 /* NumberLiteral */ && right.value === +str ? right : left.flags & 64 /* BigInt */ ? left : right.flags & 64 /* BigInt */ ? parseBigIntLiteralType(str) : left.flags & 2048 /* BigIntLiteral */ ? left : right.flags & 2048 /* BigIntLiteral */ && pseudoBigIntToString(right.value) === str ? right : left.flags & 16 /* Boolean */ ? left : right.flags & 16 /* Boolean */ ? str === "true" ? trueType : str === "false" ? falseType : booleanType : left.flags & 512 /* BooleanLiteral */ ? left : right.flags & 512 /* BooleanLiteral */ && right.intrinsicName === str ? right : left.flags & 32768 /* Undefined */ ? left : right.flags & 32768 /* Undefined */ && right.intrinsicName === str ? right : left.flags & 65536 /* Null */ ? left : right.flags & 65536 /* Null */ && right.intrinsicName === str ? right : left, neverType); - if (!(matchingType.flags & 131072 /* Never */)) { + const matchingType = reduceLeft(constraintTypes, (left, right) => !(right.flags & allTypeFlags) ? left : left.flags & 32 /* String */ ? left : right.flags & 32 /* String */ ? source2 : left.flags & 4194304 /* TemplateLiteral */ ? left : right.flags & 4194304 /* TemplateLiteral */ && isTypeMatchedByTemplateLiteralType(source2, right) ? source2 : left.flags & 8388608 /* StringMapping */ ? left : right.flags & 8388608 /* StringMapping */ && str === applyStringMapping(right.symbol, str) ? source2 : left.flags & 1024 /* StringLiteral */ ? left : right.flags & 1024 /* StringLiteral */ && right.value === str ? right : left.flags & 64 /* Number */ ? left : right.flags & 64 /* Number */ ? getNumberLiteralType(+str) : left.flags & 65536 /* Enum */ ? left : right.flags & 65536 /* Enum */ ? getNumberLiteralType(+str) : left.flags & 2048 /* NumberLiteral */ ? left : right.flags & 2048 /* NumberLiteral */ && right.value === +str ? right : left.flags & 128 /* BigInt */ ? left : right.flags & 128 /* BigInt */ ? parseBigIntLiteralType(str) : left.flags & 4096 /* BigIntLiteral */ ? left : right.flags & 4096 /* BigIntLiteral */ && pseudoBigIntToString(right.value) === str ? right : left.flags & 256 /* Boolean */ ? left : right.flags & 256 /* Boolean */ ? str === "true" ? trueType : str === "false" ? falseType : booleanType : left.flags & 8192 /* BooleanLiteral */ ? left : right.flags & 8192 /* BooleanLiteral */ && right.intrinsicName === str ? right : left.flags & 4 /* Undefined */ ? left : right.flags & 4 /* Undefined */ && right.intrinsicName === str ? right : left.flags & 8 /* Null */ ? left : right.flags & 8 /* Null */ && right.intrinsicName === str ? right : left, neverType); + if (!(matchingType.flags & 262144 /* Never */)) { inferFromTypes(matchingType, target2); continue; } @@ -73687,7 +73841,7 @@ function createTypeChecker(host) { for (const targetInfo of indexInfos) { const propTypes = []; for (const prop of getPropertiesOfType(source)) { - if (isApplicableIndexType(getLiteralTypeFromProperty(prop, 8576 /* StringOrNumberLiteralOrUnique */), targetInfo.keyType)) { + if (isApplicableIndexType(getLiteralTypeFromProperty(prop, 19456 /* StringOrNumberLiteralOrUnique */), targetInfo.keyType)) { const propType = getTypeOfSymbol(prop); propTypes.push(prop.flags & 16777216 /* Optional */ ? removeMissingOrUndefinedType(propType) : propType); } @@ -73711,14 +73865,14 @@ function createTypeChecker(host) { } } function isTypeOrBaseIdenticalTo(s, t) { - return t === missingType ? s === t : isTypeIdenticalTo(s, t) || !!(t.flags & 4 /* String */ && s.flags & 128 /* StringLiteral */ || t.flags & 8 /* Number */ && s.flags & 256 /* NumberLiteral */); + return t === missingType ? s === t : isTypeIdenticalTo(s, t) || !!(t.flags & 32 /* String */ && s.flags & 1024 /* StringLiteral */ || t.flags & 64 /* Number */ && s.flags & 2048 /* NumberLiteral */); } function isTypeCloselyMatchedBy(s, t) { - return !!(s.flags & 524288 /* Object */ && t.flags & 524288 /* Object */ && s.symbol && s.symbol === t.symbol || s.aliasSymbol && s.aliasTypeArguments && s.aliasSymbol === t.aliasSymbol); + return !!(s.flags & 1048576 /* Object */ && t.flags & 1048576 /* Object */ && s.symbol && s.symbol === t.symbol || s.aliasSymbol && s.aliasTypeArguments && s.aliasSymbol === t.aliasSymbol); } function hasPrimitiveConstraint(type) { const constraint = getConstraintOfTypeParameter(type); - return !!constraint && maybeTypeOfKind(constraint.flags & 16777216 /* Conditional */ ? getDefaultConstraintOfConditionalType(constraint) : constraint, 402784252 /* Primitive */ | 4194304 /* Index */ | 134217728 /* TemplateLiteral */ | 268435456 /* StringMapping */); + return !!constraint && maybeTypeOfKind(constraint.flags & 67108864 /* Conditional */ ? getDefaultConstraintOfConditionalType(constraint) : constraint, 12713980 /* Primitive */ | 2097152 /* Index */ | 4194304 /* TemplateLiteral */ | 8388608 /* StringMapping */); } function isObjectLiteralType2(type) { return !!(getObjectFlags(type) & 128 /* ObjectLiteral */); @@ -73756,7 +73910,7 @@ function createTypeChecker(host) { const inferredCovariantType = inference.candidates ? getCovariantInference(inference, context.signature) : void 0; const inferredContravariantType = inference.contraCandidates ? getContravariantInference(inference) : void 0; if (inferredCovariantType || inferredContravariantType) { - const preferCovariantType = inferredCovariantType && (!inferredContravariantType || !(inferredCovariantType.flags & (131072 /* Never */ | 1 /* Any */)) && some(inference.contraCandidates, (t) => isTypeAssignableTo(inferredCovariantType, t)) && every(context.inferences, (other) => other !== inference && getConstraintOfTypeParameter(other.typeParameter) !== inference.typeParameter || every(other.candidates, (t) => isTypeAssignableTo(t, inferredCovariantType)))); + const preferCovariantType = inferredCovariantType && (!inferredContravariantType || !(inferredCovariantType.flags & (262144 /* Never */ | 1 /* Any */)) && some(inference.contraCandidates, (t) => isTypeAssignableTo(inferredCovariantType, t)) && every(context.inferences, (other) => other !== inference && getConstraintOfTypeParameter(other.typeParameter) !== inference.typeParameter || every(other.candidates, (t) => isTypeAssignableTo(t, inferredCovariantType)))); inferredType = preferCovariantType ? inferredCovariantType : inferredContravariantType; fallbackType = preferCovariantType ? inferredContravariantType : inferredCovariantType; } else if (context.flags & 1 /* NoDefault */) { @@ -73774,9 +73928,17 @@ function createTypeChecker(host) { const constraint = getConstraintOfTypeParameter(inference.typeParameter); if (constraint) { const instantiatedConstraint = instantiateType(constraint, context.nonFixingMapper); - if (!inferredType || !context.compareTypes(inferredType, getTypeWithThisArgument(instantiatedConstraint, inferredType))) { - inference.inferredType = fallbackType && context.compareTypes(fallbackType, getTypeWithThisArgument(instantiatedConstraint, fallbackType)) ? fallbackType : instantiatedConstraint; + if (inferredType) { + const constraintWithThis = getTypeWithThisArgument(instantiatedConstraint, inferredType); + if (!context.compareTypes(inferredType, constraintWithThis)) { + const filteredByConstraint = inference.priority === 128 /* ReturnType */ ? filterType(inferredType, (t) => !!context.compareTypes(t, constraintWithThis)) : neverType; + inferredType = !(filteredByConstraint.flags & 262144 /* Never */) ? filteredByConstraint : void 0; + } + } + if (!inferredType) { + inferredType = fallbackType && context.compareTypes(fallbackType, getTypeWithThisArgument(instantiatedConstraint, fallbackType)) ? fallbackType : instantiatedConstraint; } + inference.inferredType = inferredType; } clearActiveMapperCaches(); } @@ -73798,19 +73960,21 @@ function createTypeChecker(host) { case "console": return Diagnostics.Cannot_find_name_0_Do_you_need_to_change_your_target_library_Try_changing_the_lib_compiler_option_to_include_dom; case "$": - return compilerOptions.types ? Diagnostics.Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_jQuery_Try_npm_i_save_dev_types_Slashjquery_and_then_add_jquery_to_the_types_field_in_your_tsconfig : Diagnostics.Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_jQuery_Try_npm_i_save_dev_types_Slashjquery; + return usesWildcardTypes(compilerOptions) ? Diagnostics.Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_jQuery_Try_npm_i_save_dev_types_Slashjquery : Diagnostics.Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_jQuery_Try_npm_i_save_dev_types_Slashjquery_and_then_add_jquery_to_the_types_field_in_your_tsconfig; + case "beforeEach": case "describe": case "suite": case "it": case "test": - return compilerOptions.types ? Diagnostics.Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_a_test_runner_Try_npm_i_save_dev_types_Slashjest_or_npm_i_save_dev_types_Slashmocha_and_then_add_jest_or_mocha_to_the_types_field_in_your_tsconfig : Diagnostics.Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_a_test_runner_Try_npm_i_save_dev_types_Slashjest_or_npm_i_save_dev_types_Slashmocha; + return usesWildcardTypes(compilerOptions) ? Diagnostics.Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_a_test_runner_Try_npm_i_save_dev_types_Slashjest_or_npm_i_save_dev_types_Slashmocha : Diagnostics.Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_a_test_runner_Try_npm_i_save_dev_types_Slashjest_or_npm_i_save_dev_types_Slashmocha_and_then_add_jest_or_mocha_to_the_types_field_in_your_tsconfig; case "process": case "require": case "Buffer": case "module": - return compilerOptions.types ? Diagnostics.Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_node_Try_npm_i_save_dev_types_Slashnode_and_then_add_node_to_the_types_field_in_your_tsconfig : Diagnostics.Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_node_Try_npm_i_save_dev_types_Slashnode; + case "NodeJS": + return usesWildcardTypes(compilerOptions) ? Diagnostics.Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_node_Try_npm_i_save_dev_types_Slashnode : Diagnostics.Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_node_Try_npm_i_save_dev_types_Slashnode_and_then_add_node_to_the_types_field_in_your_tsconfig; case "Bun": - return compilerOptions.types ? Diagnostics.Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_Bun_Try_npm_i_save_dev_types_Slashbun_and_then_add_bun_to_the_types_field_in_your_tsconfig : Diagnostics.Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_Bun_Try_npm_i_save_dev_types_Slashbun; + return usesWildcardTypes(compilerOptions) ? Diagnostics.Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_Bun_Try_npm_i_save_dev_types_Slashbun : Diagnostics.Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_Bun_Try_npm_i_save_dev_types_Slashbun_and_then_add_bun_to_the_types_field_in_your_tsconfig; case "Map": case "Set": case "Promise": @@ -73843,6 +74007,18 @@ function createTypeChecker(host) { } } } + function getCannotResolveModuleNameErrorForSpecificModule(moduleName) { + if (moduleName.kind === 11 /* StringLiteral */) { + if (nodeCoreModules.has(moduleName.text)) { + if (usesWildcardTypes(compilerOptions)) { + return Diagnostics.Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_node_Try_npm_i_save_dev_types_Slashnode; + } else { + return Diagnostics.Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_node_Try_npm_i_save_dev_types_Slashnode_and_then_add_node_to_the_types_field_in_your_tsconfig; + } + } + } + return void 0; + } function getResolvedSymbol(node) { const links = getNodeLinks(node); if (!links.resolvedSymbol) { @@ -73964,7 +74140,7 @@ function createTypeChecker(host) { return void 0; } function tryGetNameFromType(type) { - return type.flags & 8192 /* UniqueESSymbol */ ? type.escapedName : type.flags & 384 /* StringOrNumberLiteral */ ? escapeLeadingUnderscores("" + type.value) : void 0; + return type.flags & 16384 /* UniqueESSymbol */ ? type.escapedName : type.flags & 3072 /* StringOrNumberLiteral */ ? escapeLeadingUnderscores("" + type.value) : void 0; } function tryGetElementAccessExpressionName(node) { return isStringOrNumericLiteralLike(node.argumentExpression) ? escapeLeadingUnderscores(node.argumentExpression.text) : isEntityNameExpression(node.argumentExpression) ? tryGetNameFromEntityNameExpression(node.argumentExpression) : void 0; @@ -74017,7 +74193,7 @@ function createTypeChecker(host) { return false; } function isDiscriminantProperty(type, name) { - if (type && type.flags & 1048576 /* Union */) { + if (type && type.flags & 134217728 /* Union */) { const prop = getUnionOrIntersectionProperty(type, name); if (prop && getCheckFlags(prop) & 2 /* SyntheticProperty */) { if (prop.links.isDiscriminantProperty === void 0) { @@ -74045,36 +74221,34 @@ function createTypeChecker(host) { const map2 = /* @__PURE__ */ new Map(); let count = 0; for (const type of types) { - if (type.flags & (524288 /* Object */ | 2097152 /* Intersection */ | 58982400 /* InstantiableNonPrimitive */)) { + if (type.flags & (1048576 /* Object */ | 268435456 /* Intersection */ | 117964800 /* InstantiableNonPrimitive */)) { const discriminant = getTypeOfPropertyOfType(type, name); - if (discriminant) { - if (!isLiteralType(discriminant)) { - return void 0; - } - let duplicate = false; - forEachType(discriminant, (t) => { - const id = getTypeId(getRegularTypeOfLiteralType(t)); - const existing = map2.get(id); - if (!existing) { - map2.set(id, type); - } else if (existing !== unknownType) { - map2.set(id, unknownType); - duplicate = true; - } - }); - if (!duplicate) count++; + if (!discriminant || !isLiteralType(discriminant)) { + return void 0; } + let duplicate = false; + forEachType(discriminant, (t) => { + const id = getTypeId(getRegularTypeOfLiteralType(t)); + const existing = map2.get(id); + if (!existing) { + map2.set(id, type); + } else if (existing !== unknownType) { + map2.set(id, unknownType); + duplicate = true; + } + }); + if (!duplicate) count++; } } return count >= 10 && count * 2 >= types.length ? map2 : void 0; } function getKeyPropertyName(unionType) { const types = unionType.types; - if (types.length < 10 || getObjectFlags(unionType) & 32768 /* PrimitiveUnion */ || countWhere(types, (t) => !!(t.flags & (524288 /* Object */ | 58982400 /* InstantiableNonPrimitive */))) < 10) { + if (types.length < 10 || getObjectFlags(unionType) & 32768 /* PrimitiveUnion */ || countWhere(types, (t) => !!(t.flags & (1048576 /* Object */ | 117964800 /* InstantiableNonPrimitive */))) < 10) { return void 0; } if (unionType.keyPropertyName === void 0) { - const keyPropertyName = forEach(types, (t) => t.flags & (524288 /* Object */ | 58982400 /* InstantiableNonPrimitive */) ? forEach(getPropertiesOfType(t), (p) => isUnitType(getTypeOfSymbol(p)) ? p.escapedName : void 0) : void 0); + const keyPropertyName = forEach(types, (t) => t.flags & (1048576 /* Object */ | 117964800 /* InstantiableNonPrimitive */) ? forEach(getPropertiesOfType(t), (p) => isUnitType(getTypeOfSymbol(p)) ? p.escapedName : void 0) : void 0); const mapByKeyProperty = keyPropertyName && mapTypesByKeyProperty(types, keyPropertyName); unionType.keyPropertyName = mapByKeyProperty ? keyPropertyName : ""; unionType.constituentMap = mapByKeyProperty; @@ -74121,7 +74295,7 @@ function createTypeChecker(host) { return flow.id; } function typeMaybeAssignableTo(source, target) { - if (!(source.flags & 1048576 /* Union */)) { + if (!(source.flags & 134217728 /* Union */)) { return isTypeAssignableTo(source, target); } for (const t of source.types) { @@ -74135,7 +74309,7 @@ function createTypeChecker(host) { if (declaredType === assignedType) { return declaredType; } - if (assignedType.flags & 131072 /* Never */) { + if (assignedType.flags & 262144 /* Never */) { return assignedType; } const key = `A${getTypeId(declaredType)},${getTypeId(assignedType)}`; @@ -74143,7 +74317,7 @@ function createTypeChecker(host) { } function getAssignmentReducedTypeWorker(declaredType, assignedType) { const filteredType = filterType(declaredType, (t) => typeMaybeAssignableTo(assignedType, t)); - const reducedType = assignedType.flags & 512 /* BooleanLiteral */ && isFreshLiteralType(assignedType) ? mapType(filteredType, getFreshTypeOfLiteralType) : filteredType; + const reducedType = assignedType.flags & 8192 /* BooleanLiteral */ && isFreshLiteralType(assignedType) ? mapType(filteredType, getFreshTypeOfLiteralType) : filteredType; return isTypeAssignableTo(assignedType, reducedType) ? reducedType : declaredType; } function isFunctionObjectType(type) { @@ -74160,76 +74334,76 @@ function createTypeChecker(host) { return getTypeFacts(type, mask2) !== 0; } function getTypeFactsWorker(type, callerOnlyNeeds) { - if (type.flags & (2097152 /* Intersection */ | 465829888 /* Instantiable */)) { + if (type.flags & (268435456 /* Intersection */ | 132644864 /* Instantiable */)) { type = getBaseConstraintOfType(type) || unknownType; } const flags = type.flags; - if (flags & (4 /* String */ | 268435456 /* StringMapping */)) { + if (flags & (32 /* String */ | 8388608 /* StringMapping */)) { return strictNullChecks ? 16317953 /* StringStrictFacts */ : 16776705 /* StringFacts */; } - if (flags & (128 /* StringLiteral */ | 134217728 /* TemplateLiteral */)) { - const isEmpty = flags & 128 /* StringLiteral */ && type.value === ""; + if (flags & (1024 /* StringLiteral */ | 4194304 /* TemplateLiteral */)) { + const isEmpty = flags & 1024 /* StringLiteral */ && type.value === ""; return strictNullChecks ? isEmpty ? 12123649 /* EmptyStringStrictFacts */ : 7929345 /* NonEmptyStringStrictFacts */ : isEmpty ? 12582401 /* EmptyStringFacts */ : 16776705 /* NonEmptyStringFacts */; } - if (flags & (8 /* Number */ | 32 /* Enum */)) { + if (flags & (64 /* Number */ | 65536 /* Enum */)) { return strictNullChecks ? 16317698 /* NumberStrictFacts */ : 16776450 /* NumberFacts */; } - if (flags & 256 /* NumberLiteral */) { + if (flags & 2048 /* NumberLiteral */) { const isZero = type.value === 0; return strictNullChecks ? isZero ? 12123394 /* ZeroNumberStrictFacts */ : 7929090 /* NonZeroNumberStrictFacts */ : isZero ? 12582146 /* ZeroNumberFacts */ : 16776450 /* NonZeroNumberFacts */; } - if (flags & 64 /* BigInt */) { + if (flags & 128 /* BigInt */) { return strictNullChecks ? 16317188 /* BigIntStrictFacts */ : 16775940 /* BigIntFacts */; } - if (flags & 2048 /* BigIntLiteral */) { + if (flags & 4096 /* BigIntLiteral */) { const isZero = isZeroBigInt(type); return strictNullChecks ? isZero ? 12122884 /* ZeroBigIntStrictFacts */ : 7928580 /* NonZeroBigIntStrictFacts */ : isZero ? 12581636 /* ZeroBigIntFacts */ : 16775940 /* NonZeroBigIntFacts */; } - if (flags & 16 /* Boolean */) { + if (flags & 256 /* Boolean */) { return strictNullChecks ? 16316168 /* BooleanStrictFacts */ : 16774920 /* BooleanFacts */; } - if (flags & 528 /* BooleanLike */) { + if (flags & 8448 /* BooleanLike */) { return strictNullChecks ? type === falseType || type === regularFalseType ? 12121864 /* FalseStrictFacts */ : 7927560 /* TrueStrictFacts */ : type === falseType || type === regularFalseType ? 12580616 /* FalseFacts */ : 16774920 /* TrueFacts */; } - if (flags & 524288 /* Object */) { + if (flags & 1048576 /* Object */) { const possibleFacts = strictNullChecks ? 83427327 /* EmptyObjectStrictFacts */ | 7880640 /* FunctionStrictFacts */ | 7888800 /* ObjectStrictFacts */ : 83886079 /* EmptyObjectFacts */ | 16728e3 /* FunctionFacts */ | 16736160 /* ObjectFacts */; if ((callerOnlyNeeds & possibleFacts) === 0) { return 0; } return getObjectFlags(type) & 16 /* Anonymous */ && isEmptyObjectType(type) ? strictNullChecks ? 83427327 /* EmptyObjectStrictFacts */ : 83886079 /* EmptyObjectFacts */ : isFunctionObjectType(type) ? strictNullChecks ? 7880640 /* FunctionStrictFacts */ : 16728e3 /* FunctionFacts */ : strictNullChecks ? 7888800 /* ObjectStrictFacts */ : 16736160 /* ObjectFacts */; } - if (flags & 16384 /* Void */) { + if (flags & 16 /* Void */) { return 9830144 /* VoidFacts */; } - if (flags & 32768 /* Undefined */) { + if (flags & 4 /* Undefined */) { return 26607360 /* UndefinedFacts */; } - if (flags & 65536 /* Null */) { + if (flags & 8 /* Null */) { return 42917664 /* NullFacts */; } - if (flags & 12288 /* ESSymbolLike */) { + if (flags & 16896 /* ESSymbolLike */) { return strictNullChecks ? 7925520 /* SymbolStrictFacts */ : 16772880 /* SymbolFacts */; } - if (flags & 67108864 /* NonPrimitive */) { + if (flags & 131072 /* NonPrimitive */) { return strictNullChecks ? 7888800 /* ObjectStrictFacts */ : 16736160 /* ObjectFacts */; } - if (flags & 131072 /* Never */) { + if (flags & 262144 /* Never */) { return 0 /* None */; } - if (flags & 1048576 /* Union */) { + if (flags & 134217728 /* Union */) { return reduceLeft(type.types, (facts, t) => facts | getTypeFactsWorker(t, callerOnlyNeeds), 0 /* None */); } - if (flags & 2097152 /* Intersection */) { + if (flags & 268435456 /* Intersection */) { return getIntersectionTypeFacts(type, callerOnlyNeeds); } return 83886079 /* UnknownFacts */; } function getIntersectionTypeFacts(type, callerOnlyNeeds) { - const ignoreObjects = maybeTypeOfKind(type, 402784252 /* Primitive */); + const ignoreObjects = maybeTypeOfKind(type, 12713980 /* Primitive */); let oredFacts = 0 /* None */; let andedFacts = 134217727 /* All */; for (const t of type.types) { - if (!(ignoreObjects && t.flags & 524288 /* Object */)) { + if (!(ignoreObjects && t.flags & 1048576 /* Object */)) { const f = getTypeFactsWorker(t, callerOnlyNeeds); oredFacts |= f; andedFacts &= f; @@ -74416,13 +74590,13 @@ function createTypeChecker(host) { return witnesses; } function eachTypeContainedIn(source, types) { - return source.flags & 1048576 /* Union */ ? !forEach(source.types, (t) => !contains(types, t)) : contains(types, source); + return source.flags & 134217728 /* Union */ ? !forEach(source.types, (t) => !contains(types, t)) : contains(types, source); } function isTypeSubsetOf(source, target) { - return !!(source === target || source.flags & 131072 /* Never */ || target.flags & 1048576 /* Union */ && isTypeSubsetOfUnion(source, target)); + return !!(source === target || source.flags & 262144 /* Never */ || target.flags & 134217728 /* Union */ && isTypeSubsetOfUnion(source, target)); } function isTypeSubsetOfUnion(source, target) { - if (source.flags & 1048576 /* Union */) { + if (source.flags & 134217728 /* Union */) { for (const t of source.types) { if (!containsType(target.types, t)) { return false; @@ -74430,25 +74604,25 @@ function createTypeChecker(host) { } return true; } - if (source.flags & 1056 /* EnumLike */ && getBaseTypeOfEnumLikeType(source) === target) { + if (source.flags & 98304 /* EnumLike */ && getBaseTypeOfEnumLikeType(source) === target) { return true; } return containsType(target.types, source); } function forEachType(type, f) { - return type.flags & 1048576 /* Union */ ? forEach(type.types, f) : f(type); + return type.flags & 134217728 /* Union */ ? forEach(type.types, f) : f(type); } function someType(type, f) { - return type.flags & 1048576 /* Union */ ? some(type.types, f) : f(type); + return type.flags & 134217728 /* Union */ ? some(type.types, f) : f(type); } function everyType(type, f) { - return type.flags & 1048576 /* Union */ ? every(type.types, f) : f(type); + return type.flags & 134217728 /* Union */ ? every(type.types, f) : f(type); } function everyContainedType(type, f) { - return type.flags & 3145728 /* UnionOrIntersection */ ? every(type.types, f) : f(type); + return type.flags & 402653184 /* UnionOrIntersection */ ? every(type.types, f) : f(type); } function filterType(type, f) { - if (type.flags & 1048576 /* Union */) { + if (type.flags & 134217728 /* Union */) { const types = type.types; const filtered = filter(types, f); if (filtered === types) { @@ -74456,14 +74630,14 @@ function createTypeChecker(host) { } const origin = type.origin; let newOrigin; - if (origin && origin.flags & 1048576 /* Union */) { + if (origin && origin.flags & 134217728 /* Union */) { const originTypes = origin.types; - const originFiltered = filter(originTypes, (t) => !!(t.flags & 1048576 /* Union */) || f(t)); + const originFiltered = filter(originTypes, (t) => !!(t.flags & 134217728 /* Union */) || f(t)); if (originTypes.length - originFiltered.length === types.length - filtered.length) { if (originFiltered.length === 1) { return originFiltered[0]; } - newOrigin = createOriginUnionOrIntersectionType(1048576 /* Union */, originFiltered); + newOrigin = createOriginUnionOrIntersectionType(134217728 /* Union */, originFiltered); } } return getUnionTypeFromSortedList( @@ -74476,27 +74650,27 @@ function createTypeChecker(host) { newOrigin ); } - return type.flags & 131072 /* Never */ || f(type) ? type : neverType; + return type.flags & 262144 /* Never */ || f(type) ? type : neverType; } function removeType(type, targetType) { return filterType(type, (t) => t !== targetType); } function countTypes(type) { - return type.flags & 1048576 /* Union */ ? type.types.length : 1; + return type.flags & 134217728 /* Union */ ? type.types.length : 1; } function mapType(type, mapper, noReductions) { - if (type.flags & 131072 /* Never */) { + if (type.flags & 262144 /* Never */) { return type; } - if (!(type.flags & 1048576 /* Union */)) { + if (!(type.flags & 134217728 /* Union */)) { return mapper(type); } const origin = type.origin; - const types = origin && origin.flags & 1048576 /* Union */ ? origin.types : type.types; + const types = origin && origin.flags & 134217728 /* Union */ ? origin.types : type.types; let mappedTypes; let changed = false; for (const t of types) { - const mapped = t.flags & 1048576 /* Union */ ? mapType(t, mapper, noReductions) : mapper(t); + const mapped = t.flags & 134217728 /* Union */ ? mapType(t, mapper, noReductions) : mapper(t); changed || (changed = t !== mapped); if (mapped) { if (!mappedTypes) { @@ -74509,14 +74683,14 @@ function createTypeChecker(host) { return changed ? mappedTypes && getUnionType(mappedTypes, noReductions ? 0 /* None */ : 1 /* Literal */) : type; } function mapTypeWithAlias(type, mapper, aliasSymbol, aliasTypeArguments) { - return type.flags & 1048576 /* Union */ && aliasSymbol ? getUnionType(map(type.types, mapper), 1 /* Literal */, aliasSymbol, aliasTypeArguments) : mapType(type, mapper); + return type.flags & 134217728 /* Union */ && aliasSymbol ? getUnionType(map(type.types, mapper), 1 /* Literal */, aliasSymbol, aliasTypeArguments) : mapType(type, mapper); } function extractTypesOfKind(type, kind) { return filterType(type, (t) => (t.flags & kind) !== 0); } function replacePrimitivesWithLiterals(typeWithPrimitives, typeWithLiterals) { - if (maybeTypeOfKind(typeWithPrimitives, 4 /* String */ | 134217728 /* TemplateLiteral */ | 8 /* Number */ | 64 /* BigInt */) && maybeTypeOfKind(typeWithLiterals, 128 /* StringLiteral */ | 134217728 /* TemplateLiteral */ | 268435456 /* StringMapping */ | 256 /* NumberLiteral */ | 2048 /* BigIntLiteral */)) { - return mapType(typeWithPrimitives, (t) => t.flags & 4 /* String */ ? extractTypesOfKind(typeWithLiterals, 4 /* String */ | 128 /* StringLiteral */ | 134217728 /* TemplateLiteral */ | 268435456 /* StringMapping */) : isPatternLiteralType(t) && !maybeTypeOfKind(typeWithLiterals, 4 /* String */ | 134217728 /* TemplateLiteral */ | 268435456 /* StringMapping */) ? extractTypesOfKind(typeWithLiterals, 128 /* StringLiteral */) : t.flags & 8 /* Number */ ? extractTypesOfKind(typeWithLiterals, 8 /* Number */ | 256 /* NumberLiteral */) : t.flags & 64 /* BigInt */ ? extractTypesOfKind(typeWithLiterals, 64 /* BigInt */ | 2048 /* BigIntLiteral */) : t); + if (maybeTypeOfKind(typeWithPrimitives, 32 /* String */ | 4194304 /* TemplateLiteral */ | 64 /* Number */ | 128 /* BigInt */) && maybeTypeOfKind(typeWithLiterals, 1024 /* StringLiteral */ | 4194304 /* TemplateLiteral */ | 8388608 /* StringMapping */ | 2048 /* NumberLiteral */ | 4096 /* BigIntLiteral */)) { + return mapType(typeWithPrimitives, (t) => t.flags & 32 /* String */ ? extractTypesOfKind(typeWithLiterals, 32 /* String */ | 1024 /* StringLiteral */ | 4194304 /* TemplateLiteral */ | 8388608 /* StringMapping */) : isPatternLiteralType(t) && !maybeTypeOfKind(typeWithLiterals, 32 /* String */ | 4194304 /* TemplateLiteral */ | 8388608 /* StringMapping */) ? extractTypesOfKind(typeWithLiterals, 1024 /* StringLiteral */) : t.flags & 64 /* Number */ ? extractTypesOfKind(typeWithLiterals, 64 /* Number */ | 2048 /* NumberLiteral */) : t.flags & 128 /* BigInt */ ? extractTypesOfKind(typeWithLiterals, 128 /* BigInt */ | 4096 /* BigIntLiteral */) : t); } return typeWithPrimitives; } @@ -74527,7 +74701,7 @@ function createTypeChecker(host) { return flowType.flags === 0 ? flowType.type : flowType; } function createFlowType(type, incomplete) { - return incomplete ? { flags: 0, type: type.flags & 131072 /* Never */ ? silentNeverType : type } : type; + return incomplete ? { flags: 0, type: type.flags & 262144 /* Never */ ? silentNeverType : type } : type; } function createEvolvingArrayType(elementType) { const result = createObjectType(256 /* EvolvingArray */); @@ -74542,8 +74716,8 @@ function createTypeChecker(host) { return isTypeSubsetOf(elementType, evolvingArrayType.elementType) ? evolvingArrayType : getEvolvingArrayType(getUnionType([evolvingArrayType.elementType, elementType])); } function createFinalArrayType(elementType) { - return elementType.flags & 131072 /* Never */ ? autoArrayType : createArrayType( - elementType.flags & 1048576 /* Union */ ? getUnionType(elementType.types, 2 /* Subtype */) : elementType + return elementType.flags & 262144 /* Never */ ? autoArrayType : createArrayType( + elementType.flags & 134217728 /* Union */ ? getUnionType(elementType.types, 2 /* Subtype */) : elementType ); } function getFinalArrayType(evolvingArrayType) { @@ -74558,7 +74732,7 @@ function createTypeChecker(host) { function isEvolvingArrayTypeList(types) { let hasEvolvingArrayType = false; for (const t of types) { - if (!(t.flags & 131072 /* Never */)) { + if (!(t.flags & 262144 /* Never */)) { if (!(getObjectFlags(t) & 256 /* EvolvingArray */)) { return false; } @@ -74571,7 +74745,7 @@ function createTypeChecker(host) { const root = getReferenceRoot(node); const parent2 = root.parent; const isLengthPushOrUnshift = isPropertyAccessExpression(parent2) && (parent2.name.escapedText === "length" || parent2.parent.kind === 214 /* CallExpression */ && isIdentifier(parent2.name) && isPushOrUnshiftIdentifier(parent2.name)); - const isElementAssignment = parent2.kind === 213 /* ElementAccessExpression */ && parent2.expression === root && parent2.parent.kind === 227 /* BinaryExpression */ && parent2.parent.operatorToken.kind === 64 /* EqualsToken */ && parent2.parent.left === parent2 && !isAssignmentTarget(parent2.parent) && isTypeAssignableToKind(getTypeOfExpression(parent2.argumentExpression), 296 /* NumberLike */); + const isElementAssignment = parent2.kind === 213 /* ElementAccessExpression */ && parent2.expression === root && parent2.parent.kind === 227 /* BinaryExpression */ && parent2.parent.operatorToken.kind === 64 /* EqualsToken */ && parent2.parent.left === parent2 && !isAssignmentTarget(parent2.parent) && isTypeAssignableToKind(getTypeOfExpression(parent2.argumentExpression), 67648 /* NumberLike */); return isLengthPushOrUnshift || isElementAssignment; } function isDeclarationWithExplicitTypeAnnotation(node) { @@ -74681,7 +74855,7 @@ function createTypeChecker(host) { return signature === unknownSignature ? void 0 : signature; } function hasTypePredicateOrNeverReturnType(signature) { - return !!(getTypePredicateOfSignature(signature) || signature.declaration && (getReturnTypeFromAnnotation(signature.declaration) || unknownType).flags & 131072 /* Never */); + return !!(getTypePredicateOfSignature(signature) || signature.declaration && (getReturnTypeFromAnnotation(signature.declaration) || unknownType).flags & 262144 /* Never */); } function getTypePredicateArgument(predicate, callExpression) { if (predicate.kind === 1 /* Identifier */ || predicate.kind === 3 /* AssertsIdentifier */) { @@ -74744,7 +74918,7 @@ function createTypeChecker(host) { return false; } } - if (getReturnTypeOfSignature(signature).flags & 131072 /* Never */) { + if (getReturnTypeOfSignature(signature).flags & 262144 /* Never */) { return false; } } @@ -74865,7 +75039,7 @@ function createTypeChecker(host) { const evolvedType = getTypeFromFlowType(getTypeAtFlowNode(flowNode)); sharedFlowCount = sharedFlowStart; const resultType = getObjectFlags(evolvedType) & 256 /* EvolvingArray */ && isEvolvingArrayOperationTarget(reference) ? autoArrayType : finalizeEvolvingArrayType(evolvedType); - if (resultType === unreachableNeverType || reference.parent && reference.parent.kind === 236 /* NonNullExpression */ && !(resultType.flags & 131072 /* Never */) && getTypeWithFacts(resultType, 2097152 /* NEUndefinedOrNull */).flags & 131072 /* Never */) { + if (resultType === unreachableNeverType || reference.parent && reference.parent.kind === 236 /* NonNullExpression */ && !(resultType.flags & 262144 /* Never */) && getTypeWithFacts(resultType, 2097152 /* NEUndefinedOrNull */).flags & 262144 /* Never */) { return declaredType; } return resultType; @@ -74976,7 +75150,7 @@ function createTypeChecker(host) { return isTypeAssignableTo(assignedType, declaredType) ? assignedType : anyArrayType; } const t = isInCompoundLikeAssignment(node) ? getBaseTypeOfLiteralType(declaredType) : declaredType; - if (t.flags & 1048576 /* Union */) { + if (t.flags & 134217728 /* Union */) { return getAssignmentReducedType(t, getInitialOrAssignedType(flow)); } return t; @@ -75038,7 +75212,7 @@ function createTypeChecker(host) { ) : predicate.kind === 3 /* AssertsIdentifier */ && predicate.parameterIndex >= 0 && predicate.parameterIndex < flow.node.arguments.length ? narrowTypeByAssertion(type, flow.node.arguments[predicate.parameterIndex]) : type; return narrowedType === type ? flowType : createFlowType(narrowedType, isIncomplete(flowType)); } - if (getReturnTypeOfSignature(signature).flags & 131072 /* Never */) { + if (getReturnTypeOfSignature(signature).flags & 262144 /* Never */) { return unreachableNeverType; } } @@ -75059,7 +75233,7 @@ function createTypeChecker(host) { } } else { const indexType = getContextFreeTypeOfExpression(node.left.argumentExpression); - if (isTypeAssignableToKind(indexType, 296 /* NumberLike */)) { + if (isTypeAssignableToKind(indexType, 67648 /* NumberLike */)) { evolvedType2 = addEvolvingArrayElementType(evolvedType2, node.right); } } @@ -75073,7 +75247,7 @@ function createTypeChecker(host) { function getTypeAtFlowCondition(flow) { const flowType = getTypeAtFlowNode(flow.antecedent); const type = getTypeFromFlowType(flowType); - if (type.flags & 131072 /* Never */) { + if (type.flags & 262144 /* Never */) { return flowType; } const assumeTrue = (flow.flags & 32 /* TrueCondition */) !== 0; @@ -75097,9 +75271,9 @@ function createTypeChecker(host) { } else { if (strictNullChecks) { if (optionalChainContainsReference(expr, reference)) { - type = narrowTypeBySwitchOptionalChainContainment(type, flow.node, (t) => !(t.flags & (32768 /* Undefined */ | 131072 /* Never */))); + type = narrowTypeBySwitchOptionalChainContainment(type, flow.node, (t) => !(t.flags & (4 /* Undefined */ | 262144 /* Never */))); } else if (expr.kind === 222 /* TypeOfExpression */ && optionalChainContainsReference(expr.expression, reference)) { - type = narrowTypeBySwitchOptionalChainContainment(type, flow.node, (t) => !(t.flags & 131072 /* Never */ || t.flags & 128 /* StringLiteral */ && t.value === "undefined")); + type = narrowTypeBySwitchOptionalChainContainment(type, flow.node, (t) => !(t.flags & 262144 /* Never */ || t.flags & 1024 /* StringLiteral */ && t.value === "undefined")); } } const access = getDiscriminantPropertyAccess(expr, type); @@ -75135,7 +75309,7 @@ function createTypeChecker(host) { if (bypassFlow) { const flowType = getTypeAtFlowNode(bypassFlow); const type = getTypeFromFlowType(flowType); - if (!(type.flags & 131072 /* Never */) && !contains(antecedentTypes, type) && !isExhaustiveSwitchStatement(bypassFlow.node.switchStatement)) { + if (!(type.flags & 262144 /* Never */) && !contains(antecedentTypes, type) && !isExhaustiveSwitchStatement(bypassFlow.node.switchStatement)) { if (type === declaredType && declaredType === initialType) { return type; } @@ -75217,7 +75391,7 @@ function createTypeChecker(host) { return getEvolvingArrayType(getUnionType(map(types, getElementTypeOfEvolvingArrayType))); } const result = recombineUnknownType(getUnionType(sameMap(types, finalizeEvolvingArrayType), subtypeReduction)); - if (result !== declaredType && result.flags & declaredType.flags & 1048576 /* Union */ && arrayIsEqualTo(result.types, declaredType.types)) { + if (result !== declaredType && result.flags & declaredType.flags & 134217728 /* Union */ && arrayIsEqualTo(result.types, declaredType.types)) { return declaredType; } return result; @@ -75239,26 +75413,30 @@ function createTypeChecker(host) { const symbol = getResolvedSymbol(expr); if (isConstantVariable(symbol)) { const declaration = symbol.valueDeclaration; - if (isVariableDeclaration(declaration) && !declaration.type && declaration.initializer && isAccessExpression(declaration.initializer) && isMatchingReference(reference, declaration.initializer.expression)) { - return declaration.initializer; + let initializer = getCandidateVariableDeclarationInitializer(declaration); + if (initializer && isAccessExpression(initializer) && isMatchingReference(reference, initializer.expression)) { + return initializer; } if (isBindingElement(declaration) && !declaration.initializer) { - const parent2 = declaration.parent.parent; - if (isVariableDeclaration(parent2) && !parent2.type && parent2.initializer && (isIdentifier(parent2.initializer) || isAccessExpression(parent2.initializer)) && isMatchingReference(reference, parent2.initializer)) { + initializer = getCandidateVariableDeclarationInitializer(declaration.parent.parent); + if (initializer && (isIdentifier(initializer) || isAccessExpression(initializer)) && isMatchingReference(reference, initializer)) { return declaration; } } } } return void 0; + function getCandidateVariableDeclarationInitializer(node) { + return isVariableDeclaration(node) && !node.type && node.initializer ? skipParentheses(node.initializer) : void 0; + } } function getDiscriminantPropertyAccess(expr, computedType) { - if (declaredType.flags & 1048576 /* Union */ || computedType.flags & 1048576 /* Union */) { + if (declaredType.flags & 134217728 /* Union */ || computedType.flags & 134217728 /* Union */) { const access = getCandidateDiscriminantPropertyAccess(expr); if (access) { const name = getAccessedPropertyName(access); if (name) { - const type = declaredType.flags & 1048576 /* Union */ && isTypeSubsetOf(computedType, declaredType) ? declaredType : computedType; + const type = declaredType.flags & 134217728 /* Union */ && isTypeSubsetOf(computedType, declaredType) ? declaredType : computedType; if (isDiscriminantProperty(type, name)) { return access; } @@ -75273,7 +75451,7 @@ function createTypeChecker(host) { return type; } const optionalChain = isOptionalChain(access); - const removeNullable = strictNullChecks && (optionalChain || isNonNullAccess(access)) && maybeTypeOfKind(type, 98304 /* Nullable */); + const removeNullable = strictNullChecks && (optionalChain || isNonNullAccess(access)) && maybeTypeOfKind(type, 12 /* Nullable */); let propType = getTypeOfPropertyOfType(removeNullable ? getTypeWithFacts(type, 2097152 /* NEUndefinedOrNull */) : type, propName); if (!propType) { return type; @@ -75282,11 +75460,11 @@ function createTypeChecker(host) { const narrowedPropType = narrowType2(propType); return filterType(type, (t) => { const discriminantType = getTypeOfPropertyOrIndexSignatureOfType(t, propName) || unknownType; - return !(discriminantType.flags & 131072 /* Never */) && !(narrowedPropType.flags & 131072 /* Never */) && areTypesComparable(narrowedPropType, discriminantType); + return !(discriminantType.flags & 262144 /* Never */) && !(narrowedPropType.flags & 262144 /* Never */) && areTypesComparable(narrowedPropType, discriminantType); }); } function narrowTypeByDiscriminantProperty(type, access, operator, value, assumeTrue) { - if ((operator === 37 /* EqualsEqualsEqualsToken */ || operator === 38 /* ExclamationEqualsEqualsToken */) && type.flags & 1048576 /* Union */) { + if ((operator === 37 /* EqualsEqualsEqualsToken */ || operator === 38 /* ExclamationEqualsEqualsToken */) && type.flags & 134217728 /* Union */) { const keyPropertyName = getKeyPropertyName(type); if (keyPropertyName && keyPropertyName === getAccessedPropertyName(access)) { const candidate = getConstituentTypeForKeyType(type, getTypeOfExpression(value)); @@ -75298,7 +75476,7 @@ function createTypeChecker(host) { return narrowTypeByDiscriminant(type, access, (t) => narrowTypeByEquality(t, operator, value, assumeTrue)); } function narrowTypeBySwitchOnDiscriminantProperty(type, access, data) { - if (data.clauseStart < data.clauseEnd && type.flags & 1048576 /* Union */ && getKeyPropertyName(type) === getAccessedPropertyName(access)) { + if (data.clauseStart < data.clauseEnd && type.flags & 134217728 /* Union */ && getKeyPropertyName(type) === getAccessedPropertyName(access)) { const clauseTypes = getSwitchClauseTypes(data.switchStatement).slice(data.clauseStart, data.clauseEnd); const candidate = getUnionType(map(clauseTypes, (t) => getConstituentTypeForKeyType(type, t) || unknownType)); if (candidate !== unknownType) { @@ -75495,7 +75673,7 @@ function createTypeChecker(host) { } function narrowTypeByOptionalChainContainment(type, operator, value, assumeTrue) { const equalsOperator = operator === 35 /* EqualsEqualsToken */ || operator === 37 /* EqualsEqualsEqualsToken */; - const nullableFlags = operator === 35 /* EqualsEqualsToken */ || operator === 36 /* ExclamationEqualsToken */ ? 98304 /* Nullable */ : 32768 /* Undefined */; + const nullableFlags = operator === 35 /* EqualsEqualsToken */ || operator === 36 /* ExclamationEqualsToken */ ? 12 /* Nullable */ : 4 /* Undefined */; const valueType = getTypeOfExpression(value); const removeNullable = equalsOperator !== assumeTrue && everyType(valueType, (t) => !!(t.flags & nullableFlags)) || equalsOperator === assumeTrue && everyType(valueType, (t) => !(t.flags & (3 /* AnyOrUnknown */ | nullableFlags))); return removeNullable ? getAdjustedTypeWithFacts(type, 2097152 /* NEUndefinedOrNull */) : type; @@ -75509,19 +75687,19 @@ function createTypeChecker(host) { } const valueType = getTypeOfExpression(value); const doubleEquals = operator === 35 /* EqualsEqualsToken */ || operator === 36 /* ExclamationEqualsToken */; - if (valueType.flags & 98304 /* Nullable */) { + if (valueType.flags & 12 /* Nullable */) { if (!strictNullChecks) { return type; } - const facts = doubleEquals ? assumeTrue ? 262144 /* EQUndefinedOrNull */ : 2097152 /* NEUndefinedOrNull */ : valueType.flags & 65536 /* Null */ ? assumeTrue ? 131072 /* EQNull */ : 1048576 /* NENull */ : assumeTrue ? 65536 /* EQUndefined */ : 524288 /* NEUndefined */; + const facts = doubleEquals ? assumeTrue ? 262144 /* EQUndefinedOrNull */ : 2097152 /* NEUndefinedOrNull */ : valueType.flags & 8 /* Null */ ? assumeTrue ? 131072 /* EQNull */ : 1048576 /* NENull */ : assumeTrue ? 65536 /* EQUndefined */ : 524288 /* NEUndefined */; return getAdjustedTypeWithFacts(type, facts); } if (assumeTrue) { if (!doubleEquals && (type.flags & 2 /* Unknown */ || someType(type, isEmptyAnonymousObjectType))) { - if (valueType.flags & (402784252 /* Primitive */ | 67108864 /* NonPrimitive */) || isEmptyAnonymousObjectType(valueType)) { + if (valueType.flags & (12713980 /* Primitive */ | 131072 /* NonPrimitive */) || isEmptyAnonymousObjectType(valueType)) { return valueType; } - if (valueType.flags & 524288 /* Object */) { + if (valueType.flags & 1048576 /* Object */) { return nonPrimitiveType; } } @@ -75568,11 +75746,11 @@ function createTypeChecker(host) { let groundClauseTypes; for (let i = 0; i < clauseTypes.length; i += 1) { const t = clauseTypes[i]; - if (t.flags & (402784252 /* Primitive */ | 67108864 /* NonPrimitive */)) { + if (t.flags & (12713980 /* Primitive */ | 131072 /* NonPrimitive */)) { if (groundClauseTypes !== void 0) { groundClauseTypes.push(t); } - } else if (t.flags & 524288 /* Object */) { + } else if (t.flags & 1048576 /* Object */) { if (groundClauseTypes === void 0) { groundClauseTypes = clauseTypes.slice(0, i); } @@ -75584,12 +75762,12 @@ function createTypeChecker(host) { return getUnionType(groundClauseTypes === void 0 ? clauseTypes : groundClauseTypes); } const discriminantType = getUnionType(clauseTypes); - const caseType = discriminantType.flags & 131072 /* Never */ ? neverType : replacePrimitivesWithLiterals(filterType(type, (t) => areTypesComparable(discriminantType, t)), discriminantType); + const caseType = discriminantType.flags & 262144 /* Never */ ? neverType : replacePrimitivesWithLiterals(filterType(type, (t) => areTypesComparable(discriminantType, t)), discriminantType); if (!hasDefaultClause) { return caseType; } - const defaultType = filterType(type, (t) => !(isUnitLikeType(t) && contains(switchTypes, t.flags & 32768 /* Undefined */ ? undefinedType : getRegularTypeOfLiteralType(extractUnitType(t))))); - return caseType.flags & 131072 /* Never */ ? defaultType : getUnionType([caseType, defaultType]); + const defaultType = filterType(type, (t) => !(isUnitLikeType(t) && contains(switchTypes, t.flags & 4 /* Undefined */ ? undefinedType : getRegularTypeOfLiteralType(extractUnitType(t)), (t1, t2) => isUnitType(t1) && areTypesComparable(t1, t2)))); + return caseType.flags & 262144 /* Never */ ? defaultType : getUnionType([caseType, defaultType]); } function narrowTypeByTypeName(type, typeName) { switch (typeName) { @@ -75705,7 +75883,7 @@ function createTypeChecker(host) { } return filterType(type, (t) => isConstructedBy(t, candidate)); function isConstructedBy(source, target) { - if (source.flags & 524288 /* Object */ && getObjectFlags(source) & 1 /* Class */ || target.flags & 524288 /* Object */ && getObjectFlags(target) & 1 /* Class */) { + if (source.flags & 1048576 /* Object */ && getObjectFlags(source) & 1 /* Class */ || target.flags & 1048576 /* Object */ && getObjectFlags(target) & 1 /* Class */) { return source.symbol === target.symbol; } return isTypeSubtypeOf(source, target); @@ -75739,7 +75917,7 @@ function createTypeChecker(host) { return type; } const instanceType = mapType(rightType, getInstanceType); - if (isTypeAny(type) && (instanceType === globalObjectType || instanceType === globalFunctionType) || !assumeTrue && !(instanceType.flags & 524288 /* Object */ && !isEmptyAnonymousObjectType(instanceType))) { + if (isTypeAny(type) && (instanceType === globalObjectType || instanceType === globalFunctionType) || !assumeTrue && !(instanceType.flags & 1048576 /* Object */ && !isEmptyAnonymousObjectType(instanceType))) { return type; } return getNarrowedType( @@ -75762,7 +75940,7 @@ function createTypeChecker(host) { return emptyObjectType; } function getNarrowedType(type, candidate, assumeTrue, checkDerived) { - const key2 = type.flags & 1048576 /* Union */ ? `N${getTypeId(type)},${getTypeId(candidate)},${(assumeTrue ? 1 : 0) | (checkDerived ? 2 : 0)}` : void 0; + const key2 = type.flags & 134217728 /* Union */ ? `N${getTypeId(type)},${getTypeId(candidate)},${(assumeTrue ? 1 : 0) | (checkDerived ? 2 : 0)}` : void 0; return getCachedType(key2) ?? setCachedType(key2, getNarrowedTypeWorker(type, candidate, assumeTrue, checkDerived)); } function getNarrowedTypeWorker(type, candidate, assumeTrue, checkDerived) { @@ -75791,7 +75969,7 @@ function createTypeChecker(host) { return candidate; } const isRelated = checkDerived ? isTypeDerivedFrom : isTypeSubtypeOf; - const keyPropertyName = type.flags & 1048576 /* Union */ ? getKeyPropertyName(type) : void 0; + const keyPropertyName = type.flags & 134217728 /* Union */ ? getKeyPropertyName(type) : void 0; const narrowedType = mapType(candidate, (c) => { const discriminant = keyPropertyName && getTypeOfPropertyOfType(c, keyPropertyName); const matching = discriminant && getConstituentTypeForKeyType(type, discriminant); @@ -75799,9 +75977,9 @@ function createTypeChecker(host) { matching || type, checkDerived ? (t) => isTypeDerivedFrom(t, c) ? t : isTypeDerivedFrom(c, t) ? c : neverType : (t) => isTypeStrictSubtypeOf(t, c) ? t : isTypeStrictSubtypeOf(c, t) ? c : isTypeSubtypeOf(t, c) ? t : isTypeSubtypeOf(c, t) ? c : neverType ); - return directlyRelated.flags & 131072 /* Never */ ? mapType(type, (t) => maybeTypeOfKind(t, 465829888 /* Instantiable */) && isRelated(c, getBaseConstraintOfType(t) || unknownType) ? getIntersectionType([t, c]) : neverType) : directlyRelated; + return directlyRelated.flags & 262144 /* Never */ ? mapType(type, (t) => maybeTypeOfKind(t, 132644864 /* Instantiable */) && isRelated(c, getBaseConstraintOfType(t) || unknownType) ? getIntersectionType([t, c]) : neverType) : directlyRelated; }); - return !(narrowedType.flags & 131072 /* Never */) ? narrowedType : isTypeSubtypeOf(candidate, type) ? candidate : isTypeAssignableTo(type, candidate) ? type : isTypeAssignableTo(candidate, type) ? candidate : getIntersectionType([type, candidate]); + return !(narrowedType.flags & 262144 /* Never */) ? narrowedType : isTypeSubtypeOf(candidate, type) ? candidate : isTypeAssignableTo(type, candidate) ? type : isTypeAssignableTo(candidate, type) ? candidate : getIntersectionType([type, candidate]); } function narrowTypeByCallExpression(type, callExpression, assumeTrue) { if (hasMatchingArgument(callExpression, reference)) { @@ -76079,10 +76257,10 @@ function createTypeChecker(host) { return parent2.kind === 212 /* PropertyAccessExpression */ || parent2.kind === 167 /* QualifiedName */ || parent2.kind === 214 /* CallExpression */ && parent2.expression === node || parent2.kind === 215 /* NewExpression */ && parent2.expression === node || parent2.kind === 213 /* ElementAccessExpression */ && parent2.expression === node && !(someType(type, isGenericTypeWithoutNullableConstraint) && isGenericIndexType(getTypeOfExpression(parent2.argumentExpression))); } function isGenericTypeWithUnionConstraint(type) { - return type.flags & 2097152 /* Intersection */ ? some(type.types, isGenericTypeWithUnionConstraint) : !!(type.flags & 465829888 /* Instantiable */ && getBaseConstraintOrType(type).flags & (98304 /* Nullable */ | 1048576 /* Union */)); + return type.flags & 268435456 /* Intersection */ ? some(type.types, isGenericTypeWithUnionConstraint) : !!(type.flags & 132644864 /* Instantiable */ && getBaseConstraintOrType(type).flags & (12 /* Nullable */ | 134217728 /* Union */)); } function isGenericTypeWithoutNullableConstraint(type) { - return type.flags & 2097152 /* Intersection */ ? some(type.types, isGenericTypeWithoutNullableConstraint) : !!(type.flags & 465829888 /* Instantiable */ && !maybeTypeOfKind(getBaseConstraintOrType(type), 98304 /* Nullable */)); + return type.flags & 268435456 /* Intersection */ ? some(type.types, isGenericTypeWithoutNullableConstraint) : !!(type.flags & 132644864 /* Instantiable */ && !maybeTypeOfKind(getBaseConstraintOrType(type), 12 /* Nullable */)); } function hasContextualTypeWithNoGenericTypes(node, checkMode) { const contextualType = (isIdentifier(node) || isPropertyAccessExpression(node) || isElementAccessExpression(node)) && !((isJsxOpeningElement(node.parent) || isJsxSelfClosingElement(node.parent)) && node.parent.tagName === node) && (checkMode && checkMode & 32 /* RestBindingElement */ ? getContextualType2(node, 8 /* SkipBindingPatterns */) : getContextualType2( @@ -76468,7 +76646,7 @@ function createTypeChecker(host) { const parentType = getTypeForBindingElementParent(parent2, 0 /* Normal */); const parentTypeConstraint = parentType && mapType(parentType, getBaseConstraintOrType); links.flags &= ~4194304 /* InCheckIdentifier */; - if (parentTypeConstraint && parentTypeConstraint.flags & 1048576 /* Union */ && !(rootDeclaration.kind === 170 /* Parameter */ && isSomeSymbolAssigned(rootDeclaration))) { + if (parentTypeConstraint && parentTypeConstraint.flags & 134217728 /* Union */ && !(rootDeclaration.kind === 170 /* Parameter */ && isSomeSymbolAssigned(rootDeclaration))) { const pattern = declaration.parent; const narrowedType = getFlowTypeOfReference( pattern, @@ -76478,7 +76656,7 @@ function createTypeChecker(host) { void 0, location.flowNode ); - if (narrowedType.flags & 131072 /* Never */) { + if (narrowedType.flags & 262144 /* Never */) { return neverType; } return getBindingElementTypeFromParentType( @@ -76497,7 +76675,7 @@ function createTypeChecker(host) { const contextualSignature = getContextualSignature(func); if (contextualSignature && contextualSignature.parameters.length === 1 && signatureHasRestParameter(contextualSignature)) { const restType = getReducedApparentType(instantiateType(getTypeOfSymbol(contextualSignature.parameters[0]), (_a = getInferenceContext(func)) == null ? void 0 : _a.nonFixingMapper)); - if (restType.flags & 1048576 /* Union */ && everyType(restType, isTupleType) && !some(func.parameters, isSomeSymbolAssigned)) { + if (restType.flags & 134217728 /* Union */ && everyType(restType, isTupleType) && !some(func.parameters, isSomeSymbolAssigned)) { const narrowedType = getFlowTypeOfReference( func, restType, @@ -76588,7 +76766,11 @@ function createTypeChecker(host) { } checkIdentifierCalculateNodeCheckFlags(node, symbol); if (symbol === argumentsSymbol) { - if (isInPropertyInitializerOrClassStaticBlock(node)) { + if (isInPropertyInitializerOrClassStaticBlock( + node, + /*ignoreArrowFunctions*/ + true + )) { return errorType; } return getTypeOfSymbol(symbol); @@ -76644,8 +76826,8 @@ function createTypeChecker(host) { while (flowContainer !== declarationContainer && (flowContainer.kind === 219 /* FunctionExpression */ || flowContainer.kind === 220 /* ArrowFunction */ || isObjectLiteralOrClassExpressionMethodOrAccessor(flowContainer)) && (isConstantVariable(localOrExportSymbol) && type !== autoArrayType || isParameterOrMutableLocalVariable(localOrExportSymbol) && isPastLastAssignment(localOrExportSymbol, node))) { flowContainer = getControlFlowContainer(flowContainer); } - const isNeverInitialized = immediateDeclaration && isVariableDeclaration(immediateDeclaration) && !immediateDeclaration.initializer && !immediateDeclaration.exclamationToken && isMutableLocalVariableDeclaration(immediateDeclaration) && !isSymbolAssignedDefinitely(symbol); - const assumeInitialized = isParameter2 || isAlias || isOuterVariable && !isNeverInitialized || isSpreadDestructuringAssignmentTarget || isModuleExports || isSameScopedBindingElement(node, declaration) || type !== autoType && type !== autoArrayType && (!strictNullChecks || (type.flags & (3 /* AnyOrUnknown */ | 16384 /* Void */)) !== 0 || isInTypeQuery(node) || isInAmbientOrTypeNode(node) || node.parent.kind === 282 /* ExportSpecifier */) || node.parent.kind === 236 /* NonNullExpression */ || declaration.kind === 261 /* VariableDeclaration */ && declaration.exclamationToken || declaration.flags & 33554432 /* Ambient */; + const isNeverInitialized = immediateDeclaration && isVariableDeclaration(immediateDeclaration) && !isForInOrOfStatement(immediateDeclaration.parent.parent) && !immediateDeclaration.initializer && !immediateDeclaration.exclamationToken && isMutableLocalVariableDeclaration(immediateDeclaration) && !isSymbolAssignedDefinitely(symbol); + const assumeInitialized = isParameter2 || isAlias || isOuterVariable && !isNeverInitialized || isSpreadDestructuringAssignmentTarget || isModuleExports || isSameScopedBindingElement(node, declaration) || type !== autoType && type !== autoArrayType && (!strictNullChecks || (type.flags & (3 /* AnyOrUnknown */ | 16 /* Void */)) !== 0 || isInTypeQuery(node) || isInAmbientOrTypeNode(node) || node.parent.kind === 282 /* ExportSpecifier */) || node.parent.kind === 236 /* NonNullExpression */ || declaration.kind === 261 /* VariableDeclaration */ && declaration.exclamationToken || declaration.flags & 33554432 /* Ambient */; const initialType = isAutomaticTypeInNonNull ? undefinedType : assumeInitialized ? isParameter2 ? removeOptionalityFromDeclaredType(type, declaration) : type : typeIsAutomatic ? undefinedType : getOptionalType(type); const flowType = isAutomaticTypeInNonNull ? getNonNullableType(getFlowTypeOfReference(node, type, initialType, flowContainer)) : getFlowTypeOfReference(node, type, initialType, flowContainer); if (!isEvolvingArrayOperationTarget(node) && (type === autoType || type === autoArrayType)) { @@ -77068,7 +77250,7 @@ function createTypeChecker(host) { } function getThisTypeFromContextualType(type) { return mapType(type, (t) => { - return t.flags & 2097152 /* Intersection */ ? forEach(t.types, getThisTypeArgument) : getThisTypeArgument(t); + return t.flags & 268435456 /* Intersection */ ? forEach(t.types, getThisTypeArgument) : getThisTypeArgument(t); }); } function getThisTypeOfObjectLiteralFromContextualType(containingLiteral, contextualType) { @@ -77232,7 +77414,7 @@ function createTypeChecker(host) { const functionFlags = getFunctionFlags(func); if (functionFlags & 1 /* Generator */) { const isAsyncGenerator = (functionFlags & 2 /* Async */) !== 0; - if (contextualReturnType.flags & 1048576 /* Union */) { + if (contextualReturnType.flags & 134217728 /* Union */) { contextualReturnType = filterType(contextualReturnType, (type) => !!getIterationTypeOfGeneratorFunctionReturnType(1 /* Return */, type, isAsyncGenerator)); } const iterationReturnType = getIterationTypeOfGeneratorFunctionReturnType(1 /* Return */, contextualReturnType, (functionFlags & 2 /* Async */) !== 0); @@ -77265,7 +77447,7 @@ function createTypeChecker(host) { let contextualReturnType = getContextualReturnType(func, contextFlags); if (contextualReturnType) { const isAsyncGenerator = (functionFlags & 2 /* Async */) !== 0; - if (!node.asteriskToken && contextualReturnType.flags & 1048576 /* Union */) { + if (!node.asteriskToken && contextualReturnType.flags & 134217728 /* Union */) { contextualReturnType = filterType(contextualReturnType, (type) => !!getIterationTypeOfGeneratorFunctionReturnType(1 /* Return */, type, isAsyncGenerator)); } if (node.asteriskToken) { @@ -77333,7 +77515,7 @@ function createTypeChecker(host) { const functionFlags = getFunctionFlags(functionDecl); if (functionFlags & 1 /* Generator */) { return filterType(returnType2, (t) => { - return !!(t.flags & (3 /* AnyOrUnknown */ | 16384 /* Void */ | 58982400 /* InstantiableNonPrimitive */)) || checkGeneratorInstantiationAssignabilityToReturnType( + return !!(t.flags & (3 /* AnyOrUnknown */ | 16 /* Void */ | 117964800 /* InstantiableNonPrimitive */)) || checkGeneratorInstantiationAssignabilityToReturnType( t, functionFlags, /*errorNode*/ @@ -77343,7 +77525,7 @@ function createTypeChecker(host) { } if (functionFlags & 2 /* Async */) { return filterType(returnType2, (t) => { - return !!(t.flags & (3 /* AnyOrUnknown */ | 16384 /* Void */ | 58982400 /* InstantiableNonPrimitive */)) || !!getAwaitedTypeOfPromise(t); + return !!(t.flags & (3 /* AnyOrUnknown */ | 16 /* Void */ | 117964800 /* InstantiableNonPrimitive */)) || !!getAwaitedTypeOfPromise(t); }); } return returnType2; @@ -77551,11 +77733,11 @@ function createTypeChecker(host) { return !!(getCheckFlags(symbol) & 262144 /* Mapped */ && !symbol.links.type && findResolutionCycleStartIndex(symbol, 0 /* Type */) >= 0); } function isExcludedMappedPropertyName(constraint, propertyNameType) { - if (constraint.flags & 16777216 /* Conditional */) { + if (constraint.flags & 67108864 /* Conditional */) { const type = constraint; - return !!(getReducedType(getTrueTypeFromConditionalType(type)).flags & 131072 /* Never */) && getActualTypeVariable(getFalseTypeFromConditionalType(type)) === getActualTypeVariable(type.checkType) && isTypeAssignableTo(propertyNameType, type.extendsType); + return !!(getReducedType(getTrueTypeFromConditionalType(type)).flags & 262144 /* Never */) && getActualTypeVariable(getFalseTypeFromConditionalType(type)) === getActualTypeVariable(type.checkType) && isTypeAssignableTo(propertyNameType, type.extendsType); } - if (constraint.flags & 2097152 /* Intersection */) { + if (constraint.flags & 268435456 /* Intersection */) { return some(constraint.types, (t) => isExcludedMappedPropertyName(t, propertyNameType)); } return false; @@ -77564,12 +77746,12 @@ function createTypeChecker(host) { return mapType( type, (t) => { - if (t.flags & 2097152 /* Intersection */) { + if (t.flags & 268435456 /* Intersection */) { let types; let indexInfoCandidates; let ignoreIndexInfos = false; for (const constituentType of t.types) { - if (!(constituentType.flags & 524288 /* Object */)) { + if (!(constituentType.flags & 1048576 /* Object */)) { continue; } if (isGenericMappedType(constituentType) && getMappedTypeNameTypeKind(constituentType) !== 2 /* Remapping */) { @@ -77602,7 +77784,7 @@ function createTypeChecker(host) { } return getIntersectionType(types); } - if (!(t.flags & 524288 /* Object */)) { + if (!(t.flags & 1048576 /* Object */)) { return; } return isGenericMappedType(t) && getMappedTypeNameTypeKind(t) !== 2 /* Remapping */ ? getIndexedMappedTypeSubstitutedTypeOfContextualType(t, name, nameType) : getTypeOfConcretePropertyOfContextualType(t, name) ?? getTypeFromIndexInfosOfContextualType(t, name, nameType); @@ -77851,7 +78033,7 @@ function createTypeChecker(host) { concatenate( map( filter(node.properties, (p) => !!p.symbol && p.kind === 292 /* JsxAttribute */ && isDiscriminantProperty(contextualType, p.symbol.escapedName) && (!p.initializer || isPossiblyDiscriminantValue(p.initializer))), - (prop) => [!prop.initializer ? () => trueType : () => getContextFreeTypeOfExpression(prop.initializer), prop.symbol.escapedName] + (prop) => [!prop.initializer ? (() => trueType) : (() => getContextFreeTypeOfExpression(prop.initializer)), prop.symbol.escapedName] ), map( filter(getPropertiesOfType(contextualType), (s) => { @@ -77875,7 +78057,7 @@ function createTypeChecker(host) { function getApparentTypeOfContextualType(node, contextFlags) { const contextualType = isObjectLiteralMethod(node) ? getContextualTypeForObjectLiteralMethod(node, contextFlags) : getContextualType2(node, contextFlags); const instantiatedType = instantiateContextualType(contextualType, node, contextFlags); - if (instantiatedType && !(contextFlags && contextFlags & 2 /* NoConstraints */ && instantiatedType.flags & 8650752 /* TypeVariable */)) { + if (instantiatedType && !(contextFlags && contextFlags & 2 /* NoConstraints */ && instantiatedType.flags & 34078720 /* TypeVariable */)) { const apparentType = mapType( instantiatedType, // When obtaining apparent type of *contextual* type we don't want to get apparent type of mapped types. @@ -77886,30 +78068,35 @@ function createTypeChecker(host) { /*noReductions*/ true ); - return apparentType.flags & 1048576 /* Union */ && isObjectLiteralExpression(node) ? discriminateContextualTypeByObjectMembers(node, apparentType) : apparentType.flags & 1048576 /* Union */ && isJsxAttributes(node) ? discriminateContextualTypeByJSXAttributes(node, apparentType) : apparentType; + return apparentType.flags & 134217728 /* Union */ && isObjectLiteralExpression(node) ? discriminateContextualTypeByObjectMembers(node, apparentType) : apparentType.flags & 134217728 /* Union */ && isJsxAttributes(node) ? discriminateContextualTypeByJSXAttributes(node, apparentType) : apparentType; } } function instantiateContextualType(contextualType, node, contextFlags) { - if (contextualType && maybeTypeOfKind(contextualType, 465829888 /* Instantiable */)) { + if (contextualType && maybeTypeOfKind(contextualType, 132644864 /* Instantiable */)) { const inferenceContext = getInferenceContext(node); if (inferenceContext && contextFlags & 1 /* Signature */ && some(inferenceContext.inferences, hasInferenceCandidatesOrDefault)) { - return instantiateInstantiableTypes(contextualType, inferenceContext.nonFixingMapper); + const type = instantiateInstantiableTypes(contextualType, inferenceContext.nonFixingMapper); + if (!(type.flags & 3 /* AnyOrUnknown */)) { + return type; + } } if (inferenceContext == null ? void 0 : inferenceContext.returnMapper) { const type = instantiateInstantiableTypes(contextualType, inferenceContext.returnMapper); - return type.flags & 1048576 /* Union */ && containsType(type.types, regularFalseType) && containsType(type.types, regularTrueType) ? filterType(type, (t) => t !== regularFalseType && t !== regularTrueType) : type; + if (!(type.flags & 3 /* AnyOrUnknown */)) { + return type.flags & 134217728 /* Union */ && containsType(type.types, regularFalseType) && containsType(type.types, regularTrueType) ? filterType(type, (t) => t !== regularFalseType && t !== regularTrueType) : type; + } } } return contextualType; } function instantiateInstantiableTypes(type, mapper) { - if (type.flags & 465829888 /* Instantiable */) { + if (type.flags & 132644864 /* Instantiable */) { return instantiateType(type, mapper); } - if (type.flags & 1048576 /* Union */) { + if (type.flags & 134217728 /* Union */) { return getUnionType(map(type.types, (t) => instantiateInstantiableTypes(t, mapper)), 0 /* None */); } - if (type.flags & 2097152 /* Intersection */) { + if (type.flags & 268435456 /* Intersection */) { return getIntersectionType(map(type.types, (t) => instantiateInstantiableTypes(t, mapper))); } return type; @@ -78079,7 +78266,7 @@ function createTypeChecker(host) { ), getNameFromImportAttribute(node)); } function getContextualJsxElementAttributesType(node, contextFlags) { - if (isJsxOpeningElement(node) && contextFlags !== 4 /* Completions */) { + if (isJsxOpeningElement(node) && contextFlags !== 4 /* IgnoreNodeInferences */) { const index = findContextualNode( node.parent, /*includeCaches*/ @@ -78130,7 +78317,7 @@ function createTypeChecker(host) { return getOrCreateTypeFromSignature(fakeSignature); } const tagType = checkExpressionCached(context.tagName); - if (tagType.flags & 128 /* StringLiteral */) { + if (tagType.flags & 1024 /* StringLiteral */) { const result = getIntrinsicAttributesTypeFromStringLiteralType(tagType, context); if (!result) { return errorType; @@ -78266,10 +78453,10 @@ function createTypeChecker(host) { minArgCount, flags ); - result.compositeKind = 2097152 /* Intersection */; - result.compositeSignatures = concatenate(left.compositeKind === 2097152 /* Intersection */ && left.compositeSignatures || [left], [right]); + result.compositeKind = 268435456 /* Intersection */; + result.compositeSignatures = concatenate(left.compositeKind === 268435456 /* Intersection */ && left.compositeSignatures || [left], [right]); if (paramMapper) { - result.mapper = left.compositeKind === 2097152 /* Intersection */ && left.mapper && left.compositeSignatures ? combineTypeMappers(left.mapper, paramMapper) : paramMapper; + result.mapper = left.compositeKind === 268435456 /* Intersection */ && left.mapper && left.compositeSignatures ? combineTypeMappers(left.mapper, paramMapper) : paramMapper; } return result; } @@ -78304,7 +78491,7 @@ function createTypeChecker(host) { if (!type) { return void 0; } - if (!(type.flags & 1048576 /* Union */)) { + if (!(type.flags & 134217728 /* Union */)) { return getContextualCallSignature(type, node); } let signatureList; @@ -78502,7 +78689,7 @@ function createTypeChecker(host) { } } function isNumericComputedName(name) { - return isTypeAssignableToKind(checkComputedPropertyName(name), 296 /* NumberLike */); + return isTypeAssignableToKind(checkComputedPropertyName(name), 67648 /* NumberLike */); } function checkComputedPropertyName(node) { const links = getNodeLinks(node.expression); @@ -78520,7 +78707,7 @@ function createTypeChecker(host) { getNodeLinks(node.parent.parent).flags |= 32768 /* BlockScopedBindingInLoop */; } } - if (links.resolvedType.flags & 98304 /* Nullable */ || !isTypeAssignableToKind(links.resolvedType, 402653316 /* StringLike */ | 296 /* NumberLike */ | 12288 /* ESSymbolLike */) && !isTypeAssignableTo(links.resolvedType, stringNumberSymbolType)) { + if (links.resolvedType.flags & 12 /* Nullable */ || !isTypeAssignableToKind(links.resolvedType, 12583968 /* StringLike */ | 67648 /* NumberLike */ | 16896 /* ESSymbolLike */) && !isTypeAssignableTo(links.resolvedType, stringNumberSymbolType)) { error2(node, Diagnostics.A_computed_property_name_must_be_of_type_string_number_symbol_or_any); } } @@ -78534,7 +78721,7 @@ function createTypeChecker(host) { function isSymbolWithSymbolName(symbol) { var _a; const firstDecl = (_a = symbol.declarations) == null ? void 0 : _a[0]; - return isKnownSymbol(symbol) || firstDecl && isNamedDeclaration(firstDecl) && isComputedPropertyName(firstDecl.name) && isTypeAssignableToKind(checkComputedPropertyName(firstDecl.name), 4096 /* ESSymbol */); + return isKnownSymbol(symbol) || firstDecl && isNamedDeclaration(firstDecl) && isComputedPropertyName(firstDecl.name) && isTypeAssignableToKind(checkComputedPropertyName(firstDecl.name), 512 /* ESSymbol */); } function isSymbolWithComputedName(symbol) { var _a; @@ -78690,7 +78877,7 @@ function createTypeChecker(host) { Debug.assert(memberDecl.kind === 178 /* GetAccessor */ || memberDecl.kind === 179 /* SetAccessor */); checkNodeDeferred(memberDecl); } - if (computedNameType && !(computedNameType.flags & 8576 /* StringOrNumberLiteralOrUnique */)) { + if (computedNameType && !(computedNameType.flags & 19456 /* StringOrNumberLiteralOrUnique */)) { if (isTypeAssignableTo(computedNameType, stringNumberSymbolType)) { if (isTypeAssignableTo(computedNameType, numberType)) { hasComputedNumberProperty = true; @@ -78745,7 +78932,7 @@ function createTypeChecker(host) { } function isValidSpreadType(type) { const t = removeDefinitelyFalsyTypes(mapType(type, getBaseConstraintOrType)); - return !!(t.flags & (1 /* Any */ | 67108864 /* NonPrimitive */ | 524288 /* Object */ | 58982400 /* InstantiableNonPrimitive */) || t.flags & 3145728 /* UnionOrIntersection */ && every(t.types, isValidSpreadType)); + return !!(t.flags & (1 /* Any */ | 131072 /* NonPrimitive */ | 1048576 /* Object */ | 117964800 /* InstantiableNonPrimitive */) || t.flags & 402653184 /* UnionOrIntersection */ && every(t.types, isValidSpreadType)); } function checkJsxSelfClosingElementDeferred(node) { checkJsxOpeningLikeElementOrOpeningFragment(node); @@ -78916,7 +79103,7 @@ function createTypeChecker(host) { spread, createAnonymousType(attributesSymbol, childPropMap, emptyArray, emptyArray, emptyArray), attributesSymbol, - objectFlags, + objectFlags | getPropagatingFlagsOfTypes(childrenTypes), /*readonly*/ false ); @@ -78956,7 +79143,7 @@ function createTypeChecker(host) { } function checkSpreadPropOverrides(type, props, spread) { for (const right of getPropertiesOfType(type)) { - if (!(right.flags & 16777216 /* Optional */)) { + if (!(right.flags & 16777216 /* Optional */) && !(getCheckFlags(right) & 48 /* Partial */)) { const left = props.get(right.escapedName); if (left) { const diagnostic = error2(left.valueDeclaration, Diagnostics._0_is_specified_more_than_once_so_this_usage_will_be_overwritten, unescapeLeadingUnderscores(left.escapedName)); @@ -79103,9 +79290,9 @@ function createTypeChecker(host) { return getNameFromJsxElementAttributesContainer(JsxNames.ElementChildrenAttributeNameContainer, jsxNamespace); } function getUninstantiatedJsxSignaturesOfType(elementType, caller) { - if (elementType.flags & 4 /* String */) { + if (elementType.flags & 32 /* String */) { return [anySignature]; - } else if (elementType.flags & 128 /* StringLiteral */) { + } else if (elementType.flags & 1024 /* StringLiteral */) { const intrinsicType = getIntrinsicAttributesTypeFromStringLiteralType(elementType, caller); if (!intrinsicType) { error2(caller, Diagnostics.Property_0_does_not_exist_on_type_1, elementType.value, "JSX." + JsxNames.IntrinsicElements); @@ -79120,7 +79307,7 @@ function createTypeChecker(host) { if (signatures.length === 0) { signatures = getSignaturesOfType(apparentElemType, 0 /* Call */); } - if (signatures.length === 0 && apparentElemType.flags & 1048576 /* Union */) { + if (signatures.length === 0 && apparentElemType.flags & 134217728 /* Union */) { signatures = getUnionSignatures(map(apparentElemType.types, (t) => getUninstantiatedJsxSignaturesOfType(t, caller))); } return signatures; @@ -79270,15 +79457,15 @@ function createTypeChecker(host) { } } function isKnownProperty(targetType, name, isComparingJsxAttributes) { - if (targetType.flags & 524288 /* Object */) { + if (targetType.flags & 1048576 /* Object */) { if (getPropertyOfObjectType(targetType, name) || getApplicableIndexInfoForName(targetType, name) || isLateBoundName(name) && getIndexInfoOfType(targetType, stringType) || isComparingJsxAttributes && isHyphenatedJsxName(name)) { return true; } } - if (targetType.flags & 33554432 /* Substitution */) { + if (targetType.flags & 16777216 /* Substitution */) { return isKnownProperty(targetType.baseType, name, isComparingJsxAttributes); } - if (targetType.flags & 3145728 /* UnionOrIntersection */ && isExcessPropertyCheckTarget(targetType)) { + if (targetType.flags & 402653184 /* UnionOrIntersection */ && isExcessPropertyCheckTarget(targetType)) { for (const t of targetType.types) { if (isKnownProperty(t, name, isComparingJsxAttributes)) { return true; @@ -79288,7 +79475,7 @@ function createTypeChecker(host) { return false; } function isExcessPropertyCheckTarget(type) { - return !!(type.flags & 524288 /* Object */ && !(getObjectFlags(type) & 512 /* ObjectLiteralPatternWithComputedProperties */) || type.flags & 67108864 /* NonPrimitive */ || type.flags & 33554432 /* Substitution */ && isExcessPropertyCheckTarget(type.baseType) || type.flags & 1048576 /* Union */ && some(type.types, isExcessPropertyCheckTarget) || type.flags & 2097152 /* Intersection */ && every(type.types, isExcessPropertyCheckTarget)); + return !!(type.flags & 1048576 /* Object */ && !(getObjectFlags(type) & 512 /* ObjectLiteralPatternWithComputedProperties */) || type.flags & 131072 /* NonPrimitive */ || type.flags & 16777216 /* Substitution */ && isExcessPropertyCheckTarget(type.baseType) || type.flags & 134217728 /* Union */ && some(type.types, isExcessPropertyCheckTarget) || type.flags & 268435456 /* Intersection */ && every(type.types, isExcessPropertyCheckTarget)); } function checkJsxExpression(node, checkMode) { checkGrammarJsxExpression(node); @@ -79344,10 +79531,10 @@ function createTypeChecker(host) { } } if (flags & 64 /* Abstract */ && symbolHasNonMethodDeclaration(prop) && (isThisProperty(location) || isThisInitializedObjectBindingExpression(location) || isObjectBindingPattern(location.parent) && isThisInitializedDeclaration(location.parent.parent))) { - const declaringClassDeclaration = getClassLikeDeclarationOfSymbol(getParentOfSymbol(prop)); - if (declaringClassDeclaration && isNodeUsedDuringClassInitialization(location)) { + const parentSymbol = getParentOfSymbol(prop); + if (parentSymbol && parentSymbol.flags & 32 /* Class */ && isNodeUsedDuringClassInitialization(location)) { if (errorNode) { - error2(errorNode, Diagnostics.Abstract_property_0_in_class_1_cannot_be_accessed_in_the_constructor, symbolToString(prop), getTextOfIdentifierOrLiteral(declaringClassDeclaration.name)); + error2(errorNode, Diagnostics.Abstract_property_0_in_class_1_cannot_be_accessed_in_the_constructor, symbolToString(prop), symbolToString(parentSymbol)); } return false; } @@ -79385,7 +79572,7 @@ function createTypeChecker(host) { if (flags & 256 /* Static */) { return true; } - if (containingType.flags & 262144 /* TypeParameter */) { + if (containingType.flags & 524288 /* TypeParameter */) { containingType = containingType.isThisType ? getConstraintOfTypeParameter(containingType) : getBaseConstraintOfType(containingType); } if (!containingType || !hasBaseType(containingType, enclosingClass)) { @@ -79400,7 +79587,7 @@ function createTypeChecker(host) { const thisParameter = getThisParameterFromNodeContext(node); let thisType = (thisParameter == null ? void 0 : thisParameter.type) && getTypeFromTypeNode(thisParameter.type); if (thisType) { - if (thisType.flags & 262144 /* TypeParameter */) { + if (thisType.flags & 524288 /* TypeParameter */) { thisType = getConstraintOfTypeParameter(thisType); } } else { @@ -79487,7 +79674,7 @@ function createTypeChecker(host) { if (facts & 50331648 /* IsUndefinedOrNull */) { reportError(node, facts); const t = getNonNullableType(type); - return t.flags & (98304 /* Nullable */ | 131072 /* Never */) ? errorType : t; + return t.flags & (12 /* Nullable */ | 262144 /* Never */) ? errorType : t; } return type; } @@ -79496,7 +79683,7 @@ function createTypeChecker(host) { } function checkNonNullNonVoidType(type, node) { const nonNullType = checkNonNullType(type, node); - if (nonNullType.flags & 16384 /* Void */) { + if (nonNullType.flags & 16 /* Void */) { if (isEntityNameExpression(node)) { const nodeText2 = entityNameToString(node); if (isIdentifier(node) && nodeText2 === "undefined") { @@ -79787,7 +79974,7 @@ function createTypeChecker(host) { if (assignmentKind === 1 /* Definite */) { return removeMissingType(propType, !!(prop && prop.flags & 16777216 /* Optional */)); } - if (prop && !(prop.flags & (3 /* Variable */ | 4 /* Property */ | 98304 /* Accessor */)) && !(prop.flags & 8192 /* Method */ && propType.flags & 1048576 /* Union */) && !isDuplicatedCommonJSExport(prop.declarations)) { + if (prop && !(prop.flags & (3 /* Variable */ | 4 /* Property */ | 98304 /* Accessor */)) && !(prop.flags & 8192 /* Method */ && propType.flags & 134217728 /* Union */) && !isDuplicatedCommonJSExport(prop.declarations)) { return propType; } if (propType === autoType) { @@ -79850,27 +80037,14 @@ function createTypeChecker(host) { }); } function isPropertyDeclaredInAncestorClass(prop) { - if (!(prop.parent.flags & 32 /* Class */)) { - return false; - } - let classType = getTypeOfSymbol(prop.parent); - while (true) { - classType = classType.symbol && getSuperClass(classType); - if (!classType) { - return false; - } - const superProperty = getPropertyOfType(classType, prop.escapedName); - if (superProperty && superProperty.valueDeclaration) { - return true; + if (prop.parent && prop.parent.flags & 32 /* Class */) { + const baseTypes = getBaseTypes(getDeclaredTypeOfSymbol(prop.parent)); + if (baseTypes.length) { + const superProperty = getPropertyOfType(baseTypes[0], prop.escapedName); + return !!(superProperty && superProperty.valueDeclaration); } } - } - function getSuperClass(classType) { - const x = getBaseTypes(classType); - if (x.length === 0) { - return void 0; - } - return getIntersectionType(x); + return false; } function reportNonexistentProperty(propNode, containingType, isUncheckedJS) { const links = getNodeLinks(propNode); @@ -79882,7 +80056,7 @@ function createTypeChecker(host) { cache.add(key); let errorInfo; let relatedInfo; - if (!isPrivateIdentifier(propNode) && containingType.flags & 1048576 /* Union */ && !(containingType.flags & 402784252 /* Primitive */)) { + if (!isPrivateIdentifier(propNode) && containingType.flags & 134217728 /* Union */ && !(containingType.flags & 12713980 /* Primitive */)) { for (const subtype of containingType.types) { if (!getPropertyOfType(subtype, propNode.escapedText) && !getApplicableIndexInfoForName(subtype, propNode.escapedText)) { errorInfo = chainDiagnosticMessages(errorInfo, Diagnostics.Property_0_does_not_exist_on_type_1, declarationNameToString(propNode), typeToString(subtype)); @@ -79981,16 +80155,15 @@ function createTypeChecker(host) { function getSuggestionForSymbolNameLookup(symbols, name, meaning) { const symbol = getSymbol2(symbols, name, meaning); if (symbol) return symbol; - let candidates; + let candidates = arrayFrom(symbols.values()); if (symbols === globals) { const primitives = mapDefined( ["string", "number", "boolean", "object", "bigint", "symbol"], (s) => symbols.has(s.charAt(0).toUpperCase() + s.slice(1)) ? createSymbol(524288 /* TypeAlias */, s) : void 0 ); - candidates = primitives.concat(arrayFrom(symbols.values())); - } else { - candidates = arrayFrom(symbols.values()); + candidates = concatenate(primitives, candidates); } + sortSymbolsIfTSGoCompat(candidates); return getSpellingSuggestionForName(unescapeLeadingUnderscores(name), candidates, meaning); } function getSuggestedSymbolForNonexistentSymbol(location, outerName, meaning) { @@ -80009,7 +80182,7 @@ function createTypeChecker(host) { return result; } function getSuggestedSymbolForNonexistentModule(name, targetModule) { - return targetModule.exports && getSpellingSuggestionForName(idText(name), getExportsOfModuleAsArray(targetModule), 2623475 /* ModuleMember */); + return targetModule.exports && getSpellingSuggestionForName(idText(name), sortSymbolsIfTSGoCompat(getExportsOfModuleAsArray(targetModule)), 2623475 /* ModuleMember */); } function getSuggestionForNonexistentIndexSignature(objectType, expr, keyedType) { function hasProp(name) { @@ -80033,7 +80206,7 @@ function createTypeChecker(host) { return suggestion; } function getSuggestedTypeForNonexistentStringLiteralType(source, target) { - const candidates = target.types.filter((type) => !!(type.flags & 128 /* StringLiteral */)); + const candidates = target.types.filter((type) => !!(type.flags & 1024 /* StringLiteral */)); return getSpellingSuggestion(source.value, candidates, (type) => type.value); } function getSpellingSuggestionForName(name, symbols, meaning) { @@ -80265,10 +80438,10 @@ function createTypeChecker(host) { return findIndex(args, isSpreadArgument); } function acceptsVoid(t) { - return !!(t.flags & 16384 /* Void */); + return !!(t.flags & 16 /* Void */); } function acceptsVoidUndefinedUnknownOrAny(t) { - return !!(t.flags & (16384 /* Void */ | 32768 /* Undefined */ | 2 /* Unknown */ | 1 /* Any */)); + return !!(t.flags & (16 /* Void */ | 4 /* Undefined */ | 2 /* Unknown */ | 1 /* Any */)); } function hasCorrectArity(node, args, signature, signatureHelpTrailingComma = false) { if (isJsxOpeningFragment(node)) return true; @@ -80317,7 +80490,7 @@ function createTypeChecker(host) { } for (let i = argCount; i < effectiveMinimumArguments; i++) { const type = getTypeAtPosition(signature, i); - if (filterType(type, isInJSFile(node) && !strictNullChecks ? acceptsVoidUndefinedUnknownOrAny : acceptsVoid).flags & 131072 /* Never */) { + if (filterType(type, isInJSFile(node) && !strictNullChecks ? acceptsVoidUndefinedUnknownOrAny : acceptsVoid).flags & 262144 /* Never */) { return false; } } @@ -80354,7 +80527,7 @@ function createTypeChecker(host) { ); } function getSingleSignature(type, kind, allowMembers) { - if (type.flags & 524288 /* Object */) { + if (type.flags & 1048576 /* Object */) { const resolved = resolveStructuredTypeMembers(type); if (allowMembers || resolved.properties.length === 0 && resolved.indexInfos.length === 0) { if (kind === 0 /* Call */ && resolved.callSignatures.length === 1 && resolved.constructSignatures.length === 0) { @@ -80367,10 +80540,10 @@ function createTypeChecker(host) { } return void 0; } - function instantiateSignatureInContextOf(signature, contextualSignature, inferenceContext, compareTypes) { - const context = createInferenceContext(getTypeParametersForMapper(signature), signature, 0 /* None */, compareTypes); + function instantiateSignatureInContextOf(signature, contextualSignature, inferenceContext, compareTypes2) { + const context = createInferenceContext(getTypeParametersForMapper(signature), signature, 0 /* None */, compareTypes2); const restType = getEffectiveRestType(contextualSignature); - const mapper = inferenceContext && (restType && restType.flags & 262144 /* TypeParameter */ ? inferenceContext.nonFixingMapper : inferenceContext.mapper); + const mapper = inferenceContext && (restType && restType.flags & 524288 /* TypeParameter */ ? inferenceContext.nonFixingMapper : inferenceContext.mapper); const sourceSignature = mapper ? instantiateSignature(contextualSignature, mapper) : contextualSignature; applyToParameterTypes(sourceSignature, signature, (source, target) => { inferTypes(context.inferences, source, target); @@ -80423,7 +80596,7 @@ function createTypeChecker(host) { } const restType = getNonArrayRestType(signature); const argCount = restType ? Math.min(getParameterCount(signature) - 1, args.length) : args.length; - if (restType && restType.flags & 262144 /* TypeParameter */) { + if (restType && restType.flags & 524288 /* TypeParameter */) { const info = find(context.inferences, (info2) => info2.typeParameter === restType); if (info) { info.impliedArity = findIndex(args, isSpreadArgument, argCount) < 0 ? args.length - argCount : void 0; @@ -80451,7 +80624,7 @@ function createTypeChecker(host) { return getInferredTypes(context); } function getMutableArrayOrTupleType(type) { - return type.flags & 1048576 /* Union */ ? mapType(type, getMutableArrayOrTupleType) : type.flags & 1 /* Any */ || isMutableArrayOrTuple(getBaseConstraintOfType(type) || type) ? type : isTupleType(type) ? createTupleType( + return type.flags & 134217728 /* Union */ ? mapType(type, getMutableArrayOrTupleType) : type.flags & 1 /* Any */ || isMutableArrayOrTuple(getBaseConstraintOfType(type) || type) ? type : isTupleType(type) ? createTupleType( getElementTypes(type), type.target.elementFlags, /*readonly*/ @@ -80488,7 +80661,7 @@ function createTypeChecker(host) { } else { const contextualType = isTupleType(restType) ? getContextualTypeForElementExpression(restType, i - index, argCount - index) || unknownType : getIndexedAccessType(restType, getNumberLiteralType(i - index), 256 /* Contextual */); const argType = checkExpressionWithContextualType(arg, contextualType, context, checkMode); - const hasPrimitiveContextualType = inConstContext || maybeTypeOfKind(contextualType, 402784252 /* Primitive */ | 4194304 /* Index */ | 134217728 /* TemplateLiteral */ | 268435456 /* StringMapping */); + const hasPrimitiveContextualType = inConstContext || maybeTypeOfKind(contextualType, 12713980 /* Primitive */ | 2097152 /* Index */ | 4194304 /* TemplateLiteral */ | 8388608 /* StringMapping */); types.push(hasPrimitiveContextualType ? getRegularTypeOfLiteralType(argType) : getWidenedLiteralType(argType)); flags.push(1 /* Required */); } @@ -80509,11 +80682,11 @@ function createTypeChecker(host) { Debug.assert(typeParameters[i] !== void 0, "Should not call checkTypeArguments with too many type arguments"); const constraint = getConstraintOfTypeParameter(typeParameters[i]); if (constraint) { - const errorInfo = reportErrors2 && headMessage ? () => chainDiagnosticMessages( + const errorInfo = reportErrors2 && headMessage ? (() => chainDiagnosticMessages( /*details*/ void 0, Diagnostics.Type_0_does_not_satisfy_the_constraint_1 - ) : void 0; + )) : void 0; const typeArgumentHeadMessage = headMessage || Diagnostics.Type_0_does_not_satisfy_the_constraint_1; if (!mapper) { mapper = createTypeMapper(typeParameters, typeArgumentTypes); @@ -81510,7 +81683,7 @@ function createTypeChecker(host) { return !!(signature.typeParameters && isFunctionType(getReturnTypeOfSignature(signature))); } function isUntypedFunctionCall(funcType, apparentFuncType, numCallSignatures, numConstructSignatures) { - return isTypeAny(funcType) || isTypeAny(apparentFuncType) && !!(funcType.flags & 262144 /* TypeParameter */) || !numCallSignatures && !numConstructSignatures && !(apparentFuncType.flags & 1048576 /* Union */) && !(getReducedType(apparentFuncType).flags & 131072 /* Never */) && isTypeAssignableTo(funcType, globalFunctionType); + return isTypeAny(funcType) || isTypeAny(apparentFuncType) && !!(funcType.flags & 524288 /* TypeParameter */) || !numCallSignatures && !numConstructSignatures && !(apparentFuncType.flags & 134217728 /* Union */) && !(getReducedType(apparentFuncType).flags & 262144 /* Never */) && isTypeAssignableTo(funcType, globalFunctionType); } function resolveNewExpression(node, candidatesOutArray, checkMode) { let expressionType = checkNonNullExpression(node.expression); @@ -81563,7 +81736,7 @@ function createTypeChecker(host) { if (isArray(signatures)) { return some(signatures, (signature) => someSignature(signature, f)); } - return signatures.compositeKind === 1048576 /* Union */ ? some(signatures.compositeSignatures, f) : f(signatures); + return signatures.compositeKind === 134217728 /* Union */ ? some(signatures.compositeSignatures, f) : f(signatures); } function typeHasProtectedAccessibleBase(target, type) { const baseTypes = getBaseTypes(type); @@ -81571,7 +81744,7 @@ function createTypeChecker(host) { return false; } const firstBase = baseTypes[0]; - if (firstBase.flags & 2097152 /* Intersection */) { + if (firstBase.flags & 268435456 /* Intersection */) { const types = firstBase.types; const mixinFlags = findMixins(types); let i = 0; @@ -81629,7 +81802,7 @@ function createTypeChecker(host) { const isCall = kind === 0 /* Call */; const awaitedType = getAwaitedType(apparentType); const maybeMissingAwait = awaitedType && getSignaturesOfType(awaitedType, kind).length > 0; - if (apparentType.flags & 1048576 /* Union */) { + if (apparentType.flags & 134217728 /* Union */) { const types = apparentType.types; let hasSignatures2 = false; for (const constituent of types) { @@ -82093,10 +82266,10 @@ function createTypeChecker(host) { return resolveExternalModuleTypeByLiteral(node.arguments[0]); } const returnType = getReturnTypeOfSignature(signature); - if (returnType.flags & 12288 /* ESSymbolLike */ && isSymbolOrSymbolForCall(node)) { + if (returnType.flags & 16896 /* ESSymbolLike */ && isSymbolOrSymbolForCall(node)) { return getESSymbolLikeTypeForNode(walkUpParenthesizedExpressions(node.parent)); } - if (node.kind === 214 /* CallExpression */ && !node.questionDotToken && node.parent.kind === 245 /* ExpressionStatement */ && returnType.flags & 16384 /* Void */ && getTypePredicateOfSignature(signature)) { + if (node.kind === 214 /* CallExpression */ && !node.questionDotToken && node.parent.kind === 245 /* ExpressionStatement */ && returnType.flags & 16 /* Void */ && getTypePredicateOfSignature(signature)) { if (!isDottedName(node.expression)) { error2(node.expression, Diagnostics.Assertions_require_the_call_target_to_be_an_identifier_or_qualified_name); } else if (!getEffectsSignature(node)) { @@ -82186,7 +82359,7 @@ function createTypeChecker(host) { for (let i = 2; i < node.arguments.length; ++i) { checkExpressionCached(node.arguments[i]); } - if (specifierType.flags & 32768 /* Undefined */ || specifierType.flags & 65536 /* Null */ || !isTypeAssignableTo(specifierType, stringType)) { + if (specifierType.flags & 4 /* Undefined */ || specifierType.flags & 8 /* Null */ || !isTypeAssignableTo(specifierType, stringType)) { error2(specifier, Diagnostics.Dynamic_import_s_specifier_must_be_of_type_string_but_here_has_type_0, typeToString(specifierType)); } if (optionsType) { @@ -82195,7 +82368,15 @@ function createTypeChecker(host) { true ); if (importCallOptionsType !== emptyObjectType) { - checkTypeAssignableTo(optionsType, getNullableType(importCallOptionsType, 32768 /* Undefined */), node.arguments[1]); + checkTypeAssignableTo(optionsType, getNullableType(importCallOptionsType, 4 /* Undefined */), node.arguments[1]); + } + if (compilerOptions.ignoreDeprecations !== "6.0" && isObjectLiteralExpression(node.arguments[1])) { + for (const prop of node.arguments[1].properties) { + if (isPropertyAssignment(prop) && isIdentifier(prop.name) && prop.name.escapedText === "assert") { + grammarErrorOnNode(prop.name, Diagnostics.Import_assertions_have_been_replaced_by_import_attributes_Use_with_instead_of_assert); + break; + } + } } } const moduleSymbol = resolveExternalModuleName(node, specifier); @@ -82362,7 +82543,7 @@ function createTypeChecker(host) { const exprType = checkExpression(expression, checkMode); if (isConstTypeReference(type)) { if (!isValidConstAssertionArgument(expression)) { - error2(expression, Diagnostics.A_const_assertions_can_only_be_applied_to_references_to_enum_members_or_string_number_boolean_array_or_object_literals); + error2(expression, Diagnostics.A_const_assertion_can_only_be_applied_to_references_to_enum_members_or_string_number_boolean_array_or_object_literals); } return getRegularTypeOfLiteralType(exprType); } @@ -82455,7 +82636,7 @@ function createTypeChecker(host) { } return result2; function getInstantiatedTypePart(type2) { - if (type2.flags & 524288 /* Object */) { + if (type2.flags & 1048576 /* Object */) { const resolved = resolveStructuredTypeMembers(type2); const callSignatures = getInstantiatedSignatures(resolved.callSignatures); const constructSignatures = getInstantiatedSignatures(resolved.constructSignatures); @@ -82467,7 +82648,7 @@ function createTypeChecker(host) { result3.node = node; return result3; } - } else if (type2.flags & 58982400 /* InstantiableNonPrimitive */) { + } else if (type2.flags & 117964800 /* InstantiableNonPrimitive */) { const constraint = getBaseConstraintOfType(type2); if (constraint) { const instantiated = getInstantiatedTypePart(constraint); @@ -82475,9 +82656,9 @@ function createTypeChecker(host) { return instantiated; } } - } else if (type2.flags & 1048576 /* Union */) { + } else if (type2.flags & 134217728 /* Union */) { return mapType(type2, getInstantiatedType); - } else if (type2.flags & 2097152 /* Intersection */) { + } else if (type2.flags & 268435456 /* Intersection */) { return getIntersectionType(sameMap(type2.types, getInstantiatedTypePart)); } return type2; @@ -82762,7 +82943,7 @@ function createTypeChecker(host) { } for (let i = minArgumentCount - 1; i >= 0; i--) { const type = getTypeAtPosition(signature, i); - if (filterType(type, acceptsVoid).flags & 131072 /* Never */) { + if (filterType(type, acceptsVoid).flags & 262144 /* Never */) { break; } minArgumentCount = i; @@ -83214,6 +83395,9 @@ function createTypeChecker(host) { let fallbackReturnType = voidType; if (func.body.kind !== 242 /* Block */) { returnType = checkExpressionCached(func.body, checkMode && checkMode & ~8 /* SkipGenericFunctions */); + if (isConstContext(func.body)) { + returnType = getRegularTypeOfLiteralType(returnType); + } if (isAsync) { returnType = unwrapAwaitedType(checkAwaitedType( returnType, @@ -83245,7 +83429,7 @@ function createTypeChecker(host) { /*contextFlags*/ void 0 ); - const returnType2 = contextualReturnType && (unwrapReturnType(contextualReturnType, functionFlags) || voidType).flags & 32768 /* Undefined */ ? undefinedType : voidType; + const returnType2 = contextualReturnType && someType(unwrapReturnType(contextualReturnType, functionFlags) || voidType, (t) => !!(t.flags & 4 /* Undefined */)) ? undefinedType : voidType; return functionFlags & 2 /* Async */ ? createPromiseReturnType(func, returnType2) : ( // Async function returnType2 @@ -83325,7 +83509,10 @@ function createTypeChecker(host) { const nextTypes = []; const isAsync = (getFunctionFlags(func) & 2 /* Async */) !== 0; forEachYieldExpression(func.body, (yieldExpression) => { - const yieldExpressionType = yieldExpression.expression ? checkExpression(yieldExpression.expression, checkMode) : undefinedWideningType; + let yieldExpressionType = yieldExpression.expression ? checkExpression(yieldExpression.expression, checkMode && checkMode & ~8 /* SkipGenericFunctions */) : undefinedWideningType; + if (yieldExpression.expression && isConstContext(yieldExpression.expression)) { + yieldExpressionType = getRegularTypeOfLiteralType(yieldExpressionType); + } pushIfUnique(yieldTypes, getYieldedTypeOfYieldExpression(yieldExpression, yieldExpressionType, anyType, isAsync)); let nextType; if (yieldExpression.asteriskToken) { @@ -83347,9 +83534,6 @@ function createTypeChecker(host) { return { yieldTypes, nextTypes }; } function getYieldedTypeOfYieldExpression(node, expressionType, sentType, isAsync) { - if (expressionType === silentNeverType) { - return silentNeverType; - } const errorNode = node.expression || node; const yieldedType = node.asteriskToken ? checkIteratedTypeOrElementType(isAsync ? 19 /* AsyncYieldStar */ : 17 /* YieldStar */, expressionType, sentType, errorNode) : expressionType; return !isAsync ? yieldedType : getAwaitedType( @@ -83439,10 +83623,10 @@ function createTypeChecker(host) { Diagnostics.The_return_type_of_an_async_function_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member )); } - if (type.flags & 131072 /* Never */) { + if (type.flags & 262144 /* Never */) { hasReturnOfTypeNever = true; } - pushIfUnique(aggregatedTypes, type); + pushIfUnique(aggregatedTypes, isConstContext(expr) ? getRegularTypeOfLiteralType(type) : type); } else { hasReturnWithNoExpression = true; } @@ -83494,10 +83678,10 @@ function createTypeChecker(host) { true ); const returnType = checkExpressionCached(expr); - if (!(returnType.flags & 16 /* Boolean */)) return void 0; + if (!(returnType.flags & 256 /* Boolean */)) return void 0; return forEach(func.parameters, (param, i) => { const initType = getTypeOfSymbol(param.symbol); - if (!initType || initType.flags & 16 /* Boolean */ || !isIdentifier(param.name) || isSymbolAssigned(param.symbol) || isRestParameter(param)) { + if (!initType || initType.flags & 256 /* Boolean */ || !isIdentifier(param.name) || isSymbolAssigned(param.symbol) || isRestParameter(param)) { return; } const trueType2 = checkIfExpressionRefinesParameter(func, expr, param, initType); @@ -83519,7 +83703,7 @@ function createTypeChecker(host) { if (trueType2 === initType) return void 0; const falseCondition = createFlowNode(64 /* FalseCondition */, expr, antecedent); const falseSubtype = getReducedType(getFlowTypeOfReference(param.name, initType, trueType2, func, falseCondition)); - return falseSubtype.flags & 131072 /* Never */ ? trueType2 : void 0; + return falseSubtype.flags & 262144 /* Never */ ? trueType2 : void 0; } function checkAllCodePathsInNonVoidFunctionReturnOrThrow(func, returnType) { addLazyDiagnostic(checkAllCodePathsInNonVoidFunctionReturnOrThrowDiagnostics); @@ -83527,7 +83711,7 @@ function createTypeChecker(host) { function checkAllCodePathsInNonVoidFunctionReturnOrThrowDiagnostics() { const functionFlags = getFunctionFlags(func); const type = returnType && unwrapReturnType(returnType, functionFlags); - if (type && (maybeTypeOfKind(type, 16384 /* Void */) || type.flags & (1 /* Any */ | 32768 /* Undefined */))) { + if (type && (maybeTypeOfKind(type, 16 /* Void */) || type.flags & (1 /* Any */ | 4 /* Undefined */))) { return; } if (func.kind === 174 /* MethodSignature */ || nodeIsMissing(func.body) || func.body.kind !== 242 /* Block */ || !functionHasImplicitReturn(func)) { @@ -83535,7 +83719,7 @@ function createTypeChecker(host) { } const hasExplicitReturn = func.flags & 1024 /* HasExplicitReturn */; const errorNode = getEffectiveReturnTypeNode(func) || func; - if (type && type.flags & 131072 /* Never */) { + if (type && type.flags & 262144 /* Never */) { error2(errorNode, Diagnostics.A_function_returning_never_cannot_have_a_reachable_end_point); } else if (type && !hasExplicitReturn) { error2(errorNode, Diagnostics.A_function_whose_declared_type_is_neither_undefined_void_nor_any_must_return_a_value); @@ -83615,7 +83799,7 @@ function createTypeChecker(host) { if (checkMode && checkMode & 2 /* Inferential */) { inferFromAnnotatedParametersAndReturn(signature, contextualSignature, inferenceContext); const restType = getEffectiveRestType(contextualSignature); - if (restType && restType.flags & 262144 /* TypeParameter */) { + if (restType && restType.flags & 524288 /* TypeParameter */) { instantiatedContextualSignature = instantiateSignature(contextualSignature, inferenceContext.nonFixingMapper); } } @@ -83772,7 +83956,7 @@ function createTypeChecker(host) { } function checkDeleteExpressionMustBeOptional(expr, symbol) { const type = getTypeOfSymbol(symbol); - if (strictNullChecks && !(type.flags & (3 /* AnyOrUnknown */ | 131072 /* Never */)) && !(exactOptionalPropertyTypes ? symbol.flags & 16777216 /* Optional */ : hasTypeFacts(type, 16777216 /* IsUndefined */))) { + if (strictNullChecks && !(type.flags & (3 /* AnyOrUnknown */ | 262144 /* Never */)) && !(exactOptionalPropertyTypes ? symbol.flags & 16777216 /* Optional */ : hasTypeFacts(type, 16777216 /* IsUndefined */))) { error2(expr, Diagnostics.The_operand_of_a_delete_operator_must_be_optional); } } @@ -83900,11 +84084,11 @@ function createTypeChecker(host) { case 41 /* MinusToken */: case 55 /* TildeToken */: checkNonNullType(operandType, node.operand); - if (maybeTypeOfKindConsideringBaseConstraint(operandType, 12288 /* ESSymbolLike */)) { + if (maybeTypeOfKindConsideringBaseConstraint(operandType, 16896 /* ESSymbolLike */)) { error2(node.operand, Diagnostics.The_0_operator_cannot_be_applied_to_type_symbol, tokenToString(node.operator)); } if (node.operator === 40 /* PlusToken */) { - if (maybeTypeOfKindConsideringBaseConstraint(operandType, 2112 /* BigIntLike */)) { + if (maybeTypeOfKindConsideringBaseConstraint(operandType, 4224 /* BigIntLike */)) { error2(node.operand, Diagnostics.Operator_0_cannot_be_applied_to_type_1, tokenToString(node.operator), typeToString(getBaseTypeOfLiteralType(operandType))); } return numberType; @@ -83948,8 +84132,8 @@ function createTypeChecker(host) { return getUnaryResultType(operandType); } function getUnaryResultType(operandType) { - if (maybeTypeOfKind(operandType, 2112 /* BigIntLike */)) { - return isTypeAssignableToKind(operandType, 3 /* AnyOrUnknown */) || maybeTypeOfKind(operandType, 296 /* NumberLike */) ? numberOrBigIntType : bigintType; + if (maybeTypeOfKind(operandType, 4224 /* BigIntLike */)) { + return isTypeAssignableToKind(operandType, 3 /* AnyOrUnknown */) || maybeTypeOfKind(operandType, 67648 /* NumberLike */) ? numberOrBigIntType : bigintType; } return numberType; } @@ -83964,7 +84148,7 @@ function createTypeChecker(host) { if (type.flags & kind) { return true; } - if (type.flags & 3145728 /* UnionOrIntersection */) { + if (type.flags & 402653184 /* UnionOrIntersection */) { const types = type.types; for (const t of types) { if (maybeTypeOfKind(t, kind)) { @@ -83978,13 +84162,13 @@ function createTypeChecker(host) { if (source.flags & kind) { return true; } - if (strict && source.flags & (3 /* AnyOrUnknown */ | 16384 /* Void */ | 32768 /* Undefined */ | 65536 /* Null */)) { + if (strict && source.flags & (3 /* AnyOrUnknown */ | 16 /* Void */ | 4 /* Undefined */ | 8 /* Null */)) { return false; } - return !!(kind & 296 /* NumberLike */) && isTypeAssignableTo(source, numberType) || !!(kind & 2112 /* BigIntLike */) && isTypeAssignableTo(source, bigintType) || !!(kind & 402653316 /* StringLike */) && isTypeAssignableTo(source, stringType) || !!(kind & 528 /* BooleanLike */) && isTypeAssignableTo(source, booleanType) || !!(kind & 16384 /* Void */) && isTypeAssignableTo(source, voidType) || !!(kind & 131072 /* Never */) && isTypeAssignableTo(source, neverType) || !!(kind & 65536 /* Null */) && isTypeAssignableTo(source, nullType) || !!(kind & 32768 /* Undefined */) && isTypeAssignableTo(source, undefinedType) || !!(kind & 4096 /* ESSymbol */) && isTypeAssignableTo(source, esSymbolType) || !!(kind & 67108864 /* NonPrimitive */) && isTypeAssignableTo(source, nonPrimitiveType); + return !!(kind & 67648 /* NumberLike */) && isTypeAssignableTo(source, numberType) || !!(kind & 4224 /* BigIntLike */) && isTypeAssignableTo(source, bigintType) || !!(kind & 12583968 /* StringLike */) && isTypeAssignableTo(source, stringType) || !!(kind & 8448 /* BooleanLike */) && isTypeAssignableTo(source, booleanType) || !!(kind & 16 /* Void */) && isTypeAssignableTo(source, voidType) || !!(kind & 262144 /* Never */) && isTypeAssignableTo(source, neverType) || !!(kind & 8 /* Null */) && isTypeAssignableTo(source, nullType) || !!(kind & 4 /* Undefined */) && isTypeAssignableTo(source, undefinedType) || !!(kind & 512 /* ESSymbol */) && isTypeAssignableTo(source, esSymbolType) || !!(kind & 131072 /* NonPrimitive */) && isTypeAssignableTo(source, nonPrimitiveType); } function allTypesAssignableToKind(source, kind, strict) { - return source.flags & 1048576 /* Union */ ? every(source.types, (subType) => allTypesAssignableToKind(subType, kind, strict)) : isTypeAssignableToKind(source, kind, strict); + return source.flags & 134217728 /* Union */ ? every(source.types, (subType) => allTypesAssignableToKind(subType, kind, strict)) : isTypeAssignableToKind(source, kind, strict); } function isConstEnumObjectType(type) { return !!(getObjectFlags(type) & 16 /* Anonymous */) && !!type.symbol && isConstEnumSymbol(type.symbol); @@ -83994,7 +84178,7 @@ function createTypeChecker(host) { } function getSymbolHasInstanceMethodOfObjectType(type) { const hasInstancePropertyName = getPropertyNameForKnownSymbolName("hasInstance"); - if (allTypesAssignableToKind(type, 67108864 /* NonPrimitive */)) { + if (allTypesAssignableToKind(type, 131072 /* NonPrimitive */)) { const hasInstanceProperty = getPropertyOfType(type, hasInstancePropertyName); if (hasInstanceProperty) { const hasInstancePropertyType = getTypeOfSymbol(hasInstanceProperty); @@ -84008,7 +84192,7 @@ function createTypeChecker(host) { if (leftType === silentNeverType || rightType === silentNeverType) { return silentNeverType; } - if (!isTypeAny(leftType) && allTypesAssignableToKind(leftType, 402784252 /* Primitive */)) { + if (!isTypeAny(leftType) && allTypesAssignableToKind(leftType, 12713980 /* Primitive */)) { error2(left, Diagnostics.The_left_hand_side_of_an_instanceof_expression_must_be_of_type_any_an_object_type_or_a_type_parameter); } Debug.assert(isInstanceOfExpression(left.parent)); @@ -84026,7 +84210,7 @@ function createTypeChecker(host) { return booleanType; } function hasEmptyObjectIntersection(type) { - return someType(type, (t) => t === unknownEmptyObjectType || !!(t.flags & 2097152 /* Intersection */) && isEmptyAnonymousObjectType(getBaseConstraintOrType(t))); + return someType(type, (t) => t === unknownEmptyObjectType || !!(t.flags & 268435456 /* Intersection */) && isEmptyAnonymousObjectType(getBaseConstraintOrType(t))); } function checkInExpression(left, right, leftType, rightType) { if (leftType === silentNeverType || rightType === silentNeverType) { @@ -84254,7 +84438,7 @@ function createTypeChecker(host) { } } function isTypeEqualityComparableTo(source, target) { - return (target.flags & 98304 /* Nullable */) !== 0 || isTypeComparableTo(source, target); + return (target.flags & 12 /* Nullable */) !== 0 || isTypeComparableTo(source, target); } function createCheckBinaryExpression() { const trampoline = createBinaryExpressionTrampoline(onEnter, onLeft, onOperator, onRight, onExit, foldState); @@ -84403,7 +84587,6 @@ function createTypeChecker(host) { } } checkNullishCoalesceOperandLeft(node); - checkNullishCoalesceOperandRight(node); } function checkNullishCoalesceOperandLeft(node) { const leftTarget = skipOuterExpressions(node.left, 63 /* All */); @@ -84416,21 +84599,6 @@ function createTypeChecker(host) { } } } - function checkNullishCoalesceOperandRight(node) { - const rightTarget = skipOuterExpressions(node.right, 63 /* All */); - const nullishSemantics = getSyntacticNullishnessSemantics(rightTarget); - if (isNotWithinNullishCoalesceExpression(node)) { - return; - } - if (nullishSemantics === 1 /* Always */) { - error2(rightTarget, Diagnostics.This_expression_is_always_nullish); - } else if (nullishSemantics === 2 /* Never */) { - error2(rightTarget, Diagnostics.This_expression_is_never_nullish); - } - } - function isNotWithinNullishCoalesceExpression(node) { - return !isBinaryExpression(node.parent) || node.parent.operatorToken.kind !== 61 /* QuestionQuestionToken */; - } function getSyntacticNullishnessSemantics(node) { node = skipOuterExpressions(node); switch (node.kind) { @@ -84446,15 +84614,16 @@ function createTypeChecker(host) { return 3 /* Sometimes */; case 227 /* BinaryExpression */: switch (node.operatorToken.kind) { - case 64 /* EqualsToken */: - case 61 /* QuestionQuestionToken */: - case 78 /* QuestionQuestionEqualsToken */: case 57 /* BarBarToken */: case 76 /* BarBarEqualsToken */: case 56 /* AmpersandAmpersandToken */: case 77 /* AmpersandAmpersandEqualsToken */: return 3 /* Sometimes */; + // For these operator kinds, the right operand is effectively controlling case 28 /* CommaToken */: + case 64 /* EqualsToken */: + case 61 /* QuestionQuestionToken */: + case 78 /* QuestionQuestionEqualsToken */: return getSyntacticNullishnessSemantics(node.right); } return 2 /* Never */; @@ -84515,7 +84684,7 @@ function createTypeChecker(host) { leftType = checkNonNullType(leftType, left); rightType = checkNonNullType(rightType, right); let suggestedOperator; - if (leftType.flags & 528 /* BooleanLike */ && rightType.flags & 528 /* BooleanLike */ && (suggestedOperator = getSuggestedBooleanOperator(operatorToken.kind)) !== void 0) { + if (leftType.flags & 8448 /* BooleanLike */ && rightType.flags & 8448 /* BooleanLike */ && (suggestedOperator = getSuggestedBooleanOperator(operatorToken.kind)) !== void 0) { error2(errorNode || operatorToken, Diagnostics.The_0_operator_is_not_allowed_for_boolean_types_Consider_using_1_instead, tokenToString(operatorToken.kind), tokenToString(suggestedOperator)); return numberType; } else { @@ -84535,7 +84704,7 @@ function createTypeChecker(host) { ); let resultType2; if (isTypeAssignableToKind(leftType, 3 /* AnyOrUnknown */) && isTypeAssignableToKind(rightType, 3 /* AnyOrUnknown */) || // Or, if neither could be bigint, implicit coercion results in a number result - !(maybeTypeOfKind(leftType, 2112 /* BigIntLike */) || maybeTypeOfKind(rightType, 2112 /* BigIntLike */))) { + !(maybeTypeOfKind(leftType, 4224 /* BigIntLike */) || maybeTypeOfKind(rightType, 4224 /* BigIntLike */))) { resultType2 = numberType; } else if (bothAreBigIntLike(leftType, rightType)) { switch (operator) { @@ -84587,43 +84756,43 @@ function createTypeChecker(host) { if (leftType === silentNeverType || rightType === silentNeverType) { return silentNeverType; } - if (!isTypeAssignableToKind(leftType, 402653316 /* StringLike */) && !isTypeAssignableToKind(rightType, 402653316 /* StringLike */)) { + if (!isTypeAssignableToKind(leftType, 12583968 /* StringLike */) && !isTypeAssignableToKind(rightType, 12583968 /* StringLike */)) { leftType = checkNonNullType(leftType, left); rightType = checkNonNullType(rightType, right); } let resultType; if (isTypeAssignableToKind( leftType, - 296 /* NumberLike */, + 67648 /* NumberLike */, /*strict*/ true ) && isTypeAssignableToKind( rightType, - 296 /* NumberLike */, + 67648 /* NumberLike */, /*strict*/ true )) { resultType = numberType; } else if (isTypeAssignableToKind( leftType, - 2112 /* BigIntLike */, + 4224 /* BigIntLike */, /*strict*/ true ) && isTypeAssignableToKind( rightType, - 2112 /* BigIntLike */, + 4224 /* BigIntLike */, /*strict*/ true )) { resultType = bigintType; } else if (isTypeAssignableToKind( leftType, - 402653316 /* StringLike */, + 12583968 /* StringLike */, /*strict*/ true ) || isTypeAssignableToKind( rightType, - 402653316 /* StringLike */, + 12583968 /* StringLike */, /*strict*/ true )) { @@ -84635,7 +84804,7 @@ function createTypeChecker(host) { return resultType; } if (!resultType) { - const closeEnoughKind = 296 /* NumberLike */ | 2112 /* BigIntLike */ | 402653316 /* StringLike */ | 3 /* AnyOrUnknown */; + const closeEnoughKind = 67648 /* NumberLike */ | 4224 /* BigIntLike */ | 12583968 /* StringLike */ | 3 /* AnyOrUnknown */; reportOperatorError( (left2, right2) => isTypeAssignableToKind(left2, closeEnoughKind) && isTypeAssignableToKind(right2, closeEnoughKind) ); @@ -84708,7 +84877,7 @@ function createTypeChecker(host) { const declKind = isBinaryExpression(left.parent) ? getAssignmentDeclarationKind(left.parent) : 0 /* None */; checkAssignmentDeclaration(declKind, rightType); if (isAssignmentDeclaration2(declKind)) { - if (!(rightType.flags & 524288 /* Object */) || declKind !== 2 /* ModuleExports */ && declKind !== 6 /* Prototype */ && !isEmptyObjectType(rightType) && !isFunctionObjectType(rightType) && !(getObjectFlags(rightType) & 1 /* Class */)) { + if (!(rightType.flags & 1048576 /* Object */) || declKind !== 2 /* ModuleExports */ && declKind !== 6 /* Prototype */ && !isEmptyObjectType(rightType) && !isFunctionObjectType(rightType) && !(getObjectFlags(rightType) & 1 /* Class */)) { checkAssignmentOperator(rightType); } return leftType; @@ -84732,7 +84901,7 @@ function createTypeChecker(host) { return Debug.fail(); } function bothAreBigIntLike(left2, right2) { - return isTypeAssignableToKind(left2, 2112 /* BigIntLike */) && isTypeAssignableToKind(right2, 2112 /* BigIntLike */); + return isTypeAssignableToKind(left2, 4224 /* BigIntLike */) && isTypeAssignableToKind(right2, 4224 /* BigIntLike */); } function checkAssignmentDeclaration(kind, rightType2) { if (kind === 2 /* ModuleExports */) { @@ -84762,7 +84931,7 @@ function createTypeChecker(host) { (isAccessExpression(node.right) || isIdentifier(node.right) && node.right.escapedText === "eval"); } function checkForDisallowedESSymbolOperand(operator2) { - const offendingSymbolOperand = maybeTypeOfKindConsideringBaseConstraint(leftType, 12288 /* ESSymbolLike */) ? left : maybeTypeOfKindConsideringBaseConstraint(rightType, 12288 /* ESSymbolLike */) ? right : void 0; + const offendingSymbolOperand = maybeTypeOfKindConsideringBaseConstraint(leftType, 16896 /* ESSymbolLike */) ? left : maybeTypeOfKindConsideringBaseConstraint(rightType, 16896 /* ESSymbolLike */) ? right : void 0; if (offendingSymbolOperand) { error2(offendingSymbolOperand, Diagnostics.The_0_operator_cannot_be_applied_to_type_symbol, tokenToString(operator2)); return false; @@ -84801,7 +84970,7 @@ function createTypeChecker(host) { } if (checkReferenceExpression(left, Diagnostics.The_left_hand_side_of_an_assignment_expression_must_be_a_variable_or_a_property_access, Diagnostics.The_left_hand_side_of_an_assignment_expression_may_not_be_an_optional_property_access)) { let headMessage; - if (exactOptionalPropertyTypes && isPropertyAccessExpression(left) && maybeTypeOfKind(valueType, 32768 /* Undefined */)) { + if (exactOptionalPropertyTypes && isPropertyAccessExpression(left) && maybeTypeOfKind(valueType, 4 /* Undefined */)) { const target = getTypeOfPropertyOfType(getTypeOfExpression(left.expression), left.name.escapedText); if (isExactOptionalPropertyMismatch(valueType, target)) { headMessage = Diagnostics.Type_0_is_not_assignable_to_type_1_with_exactOptionalPropertyTypes_Colon_true_Consider_adding_undefined_to_the_type_of_the_target; @@ -84926,7 +85095,7 @@ function createTypeChecker(host) { } } let returnType = getReturnTypeFromAnnotation(func); - if (returnType && returnType.flags & 1048576 /* Union */) { + if (returnType && returnType.flags & 134217728 /* Union */) { returnType = filterType(returnType, (t) => checkGeneratorInstantiationAssignabilityToReturnType( t, functionFlags, @@ -84990,7 +85159,7 @@ function createTypeChecker(host) { const types = []; for (const span of node.templateSpans) { const type = checkExpression(span.expression); - if (maybeTypeOfKindConsideringBaseConstraint(type, 12288 /* ESSymbolLike */)) { + if (maybeTypeOfKindConsideringBaseConstraint(type, 16896 /* ESSymbolLike */)) { error2(span.expression, Diagnostics.Implicit_conversion_of_a_symbol_to_a_string_will_fail_at_runtime_Consider_wrapping_this_expression_in_String); } texts.push(span.literal.text); @@ -85010,7 +85179,7 @@ function createTypeChecker(host) { return stringType; } function isTemplateLiteralContextualType(type) { - return !!(type.flags & (128 /* StringLiteral */ | 134217728 /* TemplateLiteral */) || type.flags & 58982400 /* InstantiableNonPrimitive */ && maybeTypeOfKind(getBaseConstraintOfType(type) || unknownType, 402653316 /* StringLike */)); + return !!(type.flags & (1024 /* StringLiteral */ | 4194304 /* TemplateLiteral */) || type.flags & 117964800 /* InstantiableNonPrimitive */ && maybeTypeOfKind(getBaseConstraintOfType(type) || unknownType, 12583968 /* StringLike */)); } function getContextNode2(node) { if (isJsxAttributes(node) && !isJsxSelfClosingElement(node.parent)) { @@ -85031,7 +85200,7 @@ function createTypeChecker(host) { if (inferenceContext && inferenceContext.intraExpressionInferenceSites) { inferenceContext.intraExpressionInferenceSites = void 0; } - const result = maybeTypeOfKind(type, 2944 /* Literal */) && isLiteralOfContextualType(type, instantiateContextualType( + const result = maybeTypeOfKind(type, 15360 /* Literal */) && isLiteralOfContextualType(type, instantiateContextualType( contextualType, node, /*contextFlags*/ @@ -85169,15 +85338,15 @@ function createTypeChecker(host) { } function isLiteralOfContextualType(candidateType, contextualType) { if (contextualType) { - if (contextualType.flags & 3145728 /* UnionOrIntersection */) { + if (contextualType.flags & 402653184 /* UnionOrIntersection */) { const types = contextualType.types; return some(types, (t) => isLiteralOfContextualType(candidateType, t)); } - if (contextualType.flags & 58982400 /* InstantiableNonPrimitive */) { + if (contextualType.flags & 117964800 /* InstantiableNonPrimitive */) { const constraint = getBaseConstraintOfType(contextualType) || unknownType; - return maybeTypeOfKind(constraint, 4 /* String */) && maybeTypeOfKind(candidateType, 128 /* StringLiteral */) || maybeTypeOfKind(constraint, 8 /* Number */) && maybeTypeOfKind(candidateType, 256 /* NumberLiteral */) || maybeTypeOfKind(constraint, 64 /* BigInt */) && maybeTypeOfKind(candidateType, 2048 /* BigIntLiteral */) || maybeTypeOfKind(constraint, 4096 /* ESSymbol */) && maybeTypeOfKind(candidateType, 8192 /* UniqueESSymbol */) || isLiteralOfContextualType(candidateType, constraint); + return maybeTypeOfKind(constraint, 32 /* String */) && maybeTypeOfKind(candidateType, 1024 /* StringLiteral */) || maybeTypeOfKind(constraint, 64 /* Number */) && maybeTypeOfKind(candidateType, 2048 /* NumberLiteral */) || maybeTypeOfKind(constraint, 128 /* BigInt */) && maybeTypeOfKind(candidateType, 4096 /* BigIntLiteral */) || maybeTypeOfKind(constraint, 512 /* ESSymbol */) && maybeTypeOfKind(candidateType, 16384 /* UniqueESSymbol */) || isLiteralOfContextualType(candidateType, constraint); } - return !!(contextualType.flags & (128 /* StringLiteral */ | 4194304 /* Index */ | 134217728 /* TemplateLiteral */ | 268435456 /* StringMapping */) && maybeTypeOfKind(candidateType, 128 /* StringLiteral */) || contextualType.flags & 256 /* NumberLiteral */ && maybeTypeOfKind(candidateType, 256 /* NumberLiteral */) || contextualType.flags & 2048 /* BigIntLiteral */ && maybeTypeOfKind(candidateType, 2048 /* BigIntLiteral */) || contextualType.flags & 512 /* BooleanLiteral */ && maybeTypeOfKind(candidateType, 512 /* BooleanLiteral */) || contextualType.flags & 8192 /* UniqueESSymbol */ && maybeTypeOfKind(candidateType, 8192 /* UniqueESSymbol */)); + return !!(contextualType.flags & (1024 /* StringLiteral */ | 2097152 /* Index */ | 4194304 /* TemplateLiteral */ | 8388608 /* StringMapping */) && maybeTypeOfKind(candidateType, 1024 /* StringLiteral */) || contextualType.flags & 2048 /* NumberLiteral */ && maybeTypeOfKind(candidateType, 2048 /* NumberLiteral */) || contextualType.flags & 4096 /* BigIntLiteral */ && maybeTypeOfKind(candidateType, 4096 /* BigIntLiteral */) || contextualType.flags & 8192 /* BooleanLiteral */ && maybeTypeOfKind(candidateType, 8192 /* BooleanLiteral */) || contextualType.flags & 16384 /* UniqueESSymbol */ && maybeTypeOfKind(candidateType, 16384 /* UniqueESSymbol */)); } return false; } @@ -86180,6 +86349,47 @@ function createTypeChecker(host) { } return void 0; } + function getUninstantiatedSignatures(node) { + switch (node.kind) { + case 214 /* CallExpression */: + case 171 /* Decorator */: + return getSignaturesOfType( + getTypeOfExpression(node.expression), + 0 /* Call */ + ); + case 215 /* NewExpression */: + return getSignaturesOfType( + getTypeOfExpression(node.expression), + 1 /* Construct */ + ); + case 286 /* JsxSelfClosingElement */: + case 287 /* JsxOpeningElement */: + if (isJsxIntrinsicTagName(node.tagName)) return []; + return getSignaturesOfType( + getTypeOfExpression(node.tagName), + 0 /* Call */ + ); + case 216 /* TaggedTemplateExpression */: + return getSignaturesOfType( + getTypeOfExpression(node.tag), + 0 /* Call */ + ); + case 227 /* BinaryExpression */: + case 290 /* JsxOpeningFragment */: + return []; + } + } + function getTypeParameterConstraintForPositionAcrossSignatures(signatures, position) { + const relevantTypeParameterConstraints = flatMap(signatures, (signature) => { + var _a; + const relevantTypeParameter = (_a = signature.typeParameters) == null ? void 0 : _a[position]; + if (relevantTypeParameter === void 0) return []; + const relevantConstraint = getConstraintOfTypeParameter(relevantTypeParameter); + if (relevantConstraint === void 0) return []; + return [relevantConstraint]; + }); + return getUnionType(relevantTypeParameterConstraints); + } function checkTypeReferenceNode(node) { checkGrammarTypeArguments(node, node.typeArguments); if (node.kind === 184 /* TypeReference */ && !isInJSFile(node) && !isInJSDoc(node) && node.typeArguments && node.typeName.end !== node.typeArguments.pos) { @@ -86215,12 +86425,48 @@ function createTypeChecker(host) { } } function getTypeArgumentConstraint(node) { - const typeReferenceNode = tryCast(node.parent, isTypeReferenceType); - if (!typeReferenceNode) return void 0; - const typeParameters = getTypeParametersForTypeReferenceOrImport(typeReferenceNode); - if (!typeParameters) return void 0; - const constraint = getConstraintOfTypeParameter(typeParameters[typeReferenceNode.typeArguments.indexOf(node)]); - return constraint && instantiateType(constraint, createTypeMapper(typeParameters, getEffectiveTypeArguments2(typeReferenceNode, typeParameters))); + let typeArgumentPosition; + if (hasTypeArguments(node.parent) && Array.isArray(node.parent.typeArguments)) { + typeArgumentPosition = node.parent.typeArguments.indexOf(node); + } + if (typeArgumentPosition !== void 0) { + if (isCallLikeExpression(node.parent)) { + return getTypeParameterConstraintForPositionAcrossSignatures( + getUninstantiatedSignatures(node.parent), + typeArgumentPosition + ); + } + if (isDecorator(node.parent.parent)) { + return getTypeParameterConstraintForPositionAcrossSignatures( + getUninstantiatedSignatures(node.parent.parent), + typeArgumentPosition + ); + } + if (isExpressionWithTypeArguments(node.parent) && isExpressionStatement(node.parent.parent)) { + const uninstantiatedType = checkExpression(node.parent.expression); + const callConstraint = getTypeParameterConstraintForPositionAcrossSignatures( + getSignaturesOfType(uninstantiatedType, 0 /* Call */), + typeArgumentPosition + ); + const constructConstraint = getTypeParameterConstraintForPositionAcrossSignatures( + getSignaturesOfType(uninstantiatedType, 1 /* Construct */), + typeArgumentPosition + ); + if (constructConstraint.flags & 262144 /* Never */) return callConstraint; + if (callConstraint.flags & 262144 /* Never */) return constructConstraint; + return getIntersectionType([callConstraint, constructConstraint]); + } + if (isTypeReferenceType(node.parent)) { + const typeParameters = getTypeParametersForTypeReferenceOrImport(node.parent); + if (!typeParameters) return void 0; + const relevantTypeParameter = typeParameters[typeArgumentPosition]; + const constraint = getConstraintOfTypeParameter(relevantTypeParameter); + return constraint && instantiateType( + constraint, + createTypeMapper(typeParameters, getEffectiveTypeArguments2(node.parent, typeParameters)) + ); + } + } } function checkTypeQuery(node) { getTypeFromTypeQueryNode(node); @@ -86278,14 +86524,13 @@ function createTypeChecker(host) { getTypeFromTypeNode(node); } function checkIndexedAccessIndexType(type, accessNode) { - if (!(type.flags & 8388608 /* IndexedAccess */)) { + if (!(type.flags & 33554432 /* IndexedAccess */)) { return type; } const objectType = type.objectType; const indexType = type.indexType; - const objectIndexType = isGenericMappedType(objectType) && getMappedTypeNameTypeKind(objectType) === 2 /* Remapping */ ? getIndexTypeForMappedType(objectType, 0 /* None */) : getIndexType(objectType, 0 /* None */); const hasNumberIndexInfo = !!getIndexInfoOfType(objectType, numberType); - if (everyType(indexType, (t) => isTypeAssignableTo(t, objectIndexType) || hasNumberIndexInfo && isApplicableIndexType(t, numberType))) { + if (everyType(indexType, (t) => isTypeAssignableTo(t, getIndexType(objectType, 0 /* None */)) || hasNumberIndexInfo && isApplicableIndexType(t, numberType))) { if (accessNode.kind === 213 /* ElementAccessExpression */ && isAssignmentTarget(accessNode) && getObjectFlags(objectType) & 32 /* Mapped */ && getMappedTypeModifiers(objectType) & 1 /* IncludeReadonly */) { error2(accessNode, Diagnostics.Index_signature_in_type_0_only_permits_reading, typeToString(objectType)); } @@ -86375,6 +86620,9 @@ function createTypeChecker(host) { function checkImportType(node) { checkSourceElement(node.argument); if (node.attributes) { + if (node.attributes.token !== 118 /* WithKeyword */ && compilerOptions.ignoreDeprecations !== "6.0") { + grammarErrorOnFirstToken(node.attributes, Diagnostics.Import_assertions_have_been_replaced_by_import_attributes_Use_with_instead_of_assert); + } getResolutionModeOverride(node.attributes, grammarErrorOnNode); } checkTypeReferenceOrImport(node); @@ -86712,7 +86960,7 @@ function createTypeChecker(host) { ))) { return typeAsPromise.promisedTypeOfPromise = getTypeArguments(type)[0]; } - if (allTypesAssignableToKind(getBaseConstraintOrType(type), 402784252 /* Primitive */ | 131072 /* Never */)) { + if (allTypesAssignableToKind(getBaseConstraintOrType(type), 12713980 /* Primitive */ | 262144 /* Never */)) { return void 0; } const thenFunction = getTypeOfPropertyOfType(type, "then"); @@ -86764,7 +87012,7 @@ function createTypeChecker(host) { return awaitedType || errorType; } function isThenableType(type) { - if (allTypesAssignableToKind(getBaseConstraintOrType(type), 402784252 /* Primitive */ | 131072 /* Never */)) { + if (allTypesAssignableToKind(getBaseConstraintOrType(type), 12713980 /* Primitive */ | 262144 /* Never */)) { return false; } const thenFunction = getTypeOfPropertyOfType(type, "then"); @@ -86772,7 +87020,7 @@ function createTypeChecker(host) { } function isAwaitedTypeInstantiation(type) { var _a; - if (type.flags & 16777216 /* Conditional */) { + if (type.flags & 67108864 /* Conditional */) { const awaitedSymbol = getGlobalAwaitedSymbol( /*reportErrors*/ false @@ -86782,7 +87030,7 @@ function createTypeChecker(host) { return false; } function unwrapAwaitedType(type) { - return type.flags & 1048576 /* Union */ ? mapType(type, unwrapAwaitedType) : isAwaitedTypeInstantiation(type) ? type.aliasTypeArguments[0] : type; + return type.flags & 134217728 /* Union */ ? mapType(type, unwrapAwaitedType) : isAwaitedTypeInstantiation(type) ? type.aliasTypeArguments[0] : type; } function isAwaitedTypeNeeded(type) { if (isTypeAny(type) || isAwaitedTypeInstantiation(type)) { @@ -86790,7 +87038,7 @@ function createTypeChecker(host) { } if (isGenericObjectType(type)) { const baseConstraint = getBaseConstraintOfType(type); - if (baseConstraint ? baseConstraint.flags & 3 /* AnyOrUnknown */ || isEmptyObjectType(baseConstraint) || someType(baseConstraint, isThenableType) : maybeTypeOfKind(type, 8650752 /* TypeVariable */)) { + if (baseConstraint ? baseConstraint.flags & 3 /* AnyOrUnknown */ || isEmptyObjectType(baseConstraint) || someType(baseConstraint, isThenableType) : maybeTypeOfKind(type, 34078720 /* TypeVariable */)) { return true; } } @@ -86828,7 +87076,7 @@ function createTypeChecker(host) { if (typeAsAwaitable.awaitedTypeOfType) { return typeAsAwaitable.awaitedTypeOfType; } - if (type.flags & 1048576 /* Union */) { + if (type.flags & 134217728 /* Union */) { if (awaitedTypeStack.lastIndexOf(type.id) >= 0) { if (errorNode) { error2(errorNode, Diagnostics.Type_is_referenced_directly_or_indirectly_in_the_fulfillment_callback_of_its_own_then_method); @@ -88039,7 +88287,7 @@ function createTypeChecker(host) { return; } const type = location === condExpr2 ? condType : checkExpression(location); - if (type.flags & 1024 /* EnumLiteral */ && isPropertyAccessExpression(location) && (getNodeLinks(location.expression).resolvedSymbol ?? unknownSymbol).flags & 384 /* Enum */) { + if (type.flags & 32768 /* EnumLiteral */ && isPropertyAccessExpression(location) && (getNodeLinks(location.expression).resolvedSymbol ?? unknownSymbol).flags & 384 /* Enum */) { error2(location, Diagnostics.This_condition_will_always_return_0, !!type.value ? "true" : "false"); return; } @@ -88131,7 +88379,7 @@ function createTypeChecker(host) { checkSourceElement(node.statement); } function checkTruthinessOfType(type, node) { - if (type.flags & 16384 /* Void */) { + if (type.flags & 16 /* Void */) { error2(node, Diagnostics.An_expression_of_type_void_cannot_be_tested_for_truthiness); } else { const semantics = getSyntacticTruthySemantics(node); @@ -88264,7 +88512,7 @@ function createTypeChecker(host) { ); } } - if (rightType === neverType || !isTypeAssignableToKind(rightType, 67108864 /* NonPrimitive */ | 58982400 /* InstantiableNonPrimitive */)) { + if (rightType === neverType || !isTypeAssignableToKind(rightType, 131072 /* NonPrimitive */ | 117964800 /* InstantiableNonPrimitive */)) { error2(node.expression, Diagnostics.The_right_hand_side_of_a_for_in_statement_must_be_of_type_any_an_object_type_or_a_type_parameter_but_here_has_type_0, typeToString(rightType)); } checkSourceElement(node.statement); @@ -88297,7 +88545,11 @@ function createTypeChecker(host) { } return void 0; } - const uplevelIteration = languageVersion >= 2 /* ES2015 */; + const iterableExists = getGlobalIterableType( + /*reportErrors*/ + false + ) !== emptyGenericType; + const uplevelIteration = languageVersion >= 2 /* ES2015 */ && iterableExists; const downlevelIteration = !uplevelIteration && compilerOptions.downlevelIteration; const possibleOutOfBounds = compilerOptions.noUncheckedIndexedAccess && !!(use & 128 /* PossiblyOutOfBounds */); if (uplevelIteration || downlevelIteration || allowAsyncIterables) { @@ -88317,18 +88569,18 @@ function createTypeChecker(host) { let arrayType = inputType; let hasStringConstituent = false; if (use & 4 /* AllowsStringInputFlag */) { - if (arrayType.flags & 1048576 /* Union */) { + if (arrayType.flags & 134217728 /* Union */) { const arrayTypes = inputType.types; - const filteredTypes = filter(arrayTypes, (t) => !(t.flags & 402653316 /* StringLike */)); + const filteredTypes = filter(arrayTypes, (t) => !(t.flags & 12583968 /* StringLike */)); if (filteredTypes !== arrayTypes) { arrayType = getUnionType(filteredTypes, 2 /* Subtype */); } - } else if (arrayType.flags & 402653316 /* StringLike */) { + } else if (arrayType.flags & 12583968 /* StringLike */) { arrayType = neverType; } hasStringConstituent = arrayType !== inputType; if (hasStringConstituent) { - if (arrayType.flags & 131072 /* Never */) { + if (arrayType.flags & 262144 /* Never */) { return possibleOutOfBounds ? includeUndefinedInIndexSignature(stringType) : stringType; } } @@ -88348,7 +88600,7 @@ function createTypeChecker(host) { } const arrayElementType = getIndexTypeOfType(arrayType, numberType); if (hasStringConstituent && arrayElementType) { - if (arrayElementType.flags & 402653316 /* StringLike */ && !compilerOptions.noUncheckedIndexedAccess) { + if (arrayElementType.flags & 12583968 /* StringLike */ && !compilerOptions.noUncheckedIndexedAccess) { return stringType; } return getUnionType(possibleOutOfBounds ? [arrayElementType, stringType, undefinedType] : [arrayElementType, stringType], 2 /* Subtype */); @@ -88399,7 +88651,7 @@ function createTypeChecker(host) { return iterationTypes && iterationTypes[getIterationTypesKeyFromIterationTypeKind(typeKind)]; } function createIterationTypes(yieldType = neverType, returnType = neverType, nextType = unknownType) { - if (yieldType.flags & 67359327 /* Intrinsic */ && returnType.flags & (1 /* Any */ | 131072 /* Never */ | 2 /* Unknown */ | 16384 /* Void */ | 32768 /* Undefined */) && nextType.flags & (1 /* Any */ | 131072 /* Never */ | 2 /* Unknown */ | 16384 /* Void */ | 32768 /* Undefined */)) { + if (yieldType.flags & 402431 /* Intrinsic */ && returnType.flags & (1 /* Any */ | 262144 /* Never */ | 2 /* Unknown */ | 16 /* Void */ | 4 /* Undefined */) && nextType.flags & (1 /* Any */ | 262144 /* Never */ | 2 /* Unknown */ | 16 /* Void */ | 4 /* Undefined */)) { const id = getTypeListId([yieldType, returnType, nextType]); let iterationTypes = iterationTypesCache.get(id); if (!iterationTypes) { @@ -88442,13 +88694,11 @@ function createTypeChecker(host) { } function getIterationTypesOfIterable(type, use, errorNode) { var _a, _b; - if (type === silentNeverType) { - return silentNeverIterationTypes; - } + type = getReducedType(type); if (isTypeAny(type)) { return anyIterationTypes; } - if (!(type.flags & 1048576 /* Union */)) { + if (!(type.flags & 134217728 /* Union */)) { const errorOutputContainer = errorNode ? { errors: void 0, skipLogging: true } : void 0; const iterationTypes2 = getIterationTypesOfIterableWorker(type, use, errorNode, errorOutputContainer); if (iterationTypes2 === noIterationTypes) { @@ -88515,7 +88765,7 @@ function createTypeChecker(host) { } let noCache = false; if (use & 2 /* AllowsAsyncIterablesFlag */) { - const iterationTypes = getIterationTypesOfIterableCached(type, asyncIterationTypesResolver) || getIterationTypesOfIterableFast(type, asyncIterationTypesResolver); + let iterationTypes = getIterationTypesOfIterableCached(type, asyncIterationTypesResolver) || getIterationTypesOfIterableFast(type, asyncIterationTypesResolver); if (iterationTypes) { if (iterationTypes === noIterationTypes && errorNode) { noCache = true; @@ -88523,6 +88773,10 @@ function createTypeChecker(host) { return use & 8 /* ForOfFlag */ ? getAsyncFromSyncIterationTypes(iterationTypes, errorNode) : iterationTypes; } } + iterationTypes = getIterationTypesOfIterableSlow(type, asyncIterationTypesResolver, errorNode, errorOutputContainer, noCache); + if (iterationTypes !== noIterationTypes) { + return iterationTypes; + } } if (use & 1 /* AllowsSyncIterablesFlag */) { let iterationTypes = getIterationTypesOfIterableCached(type, syncIterationTypesResolver) || getIterationTypesOfIterableFast(type, syncIterationTypesResolver); @@ -88540,15 +88794,7 @@ function createTypeChecker(host) { } } } - } - if (use & 2 /* AllowsAsyncIterablesFlag */) { - const iterationTypes = getIterationTypesOfIterableSlow(type, asyncIterationTypesResolver, errorNode, errorOutputContainer, noCache); - if (iterationTypes !== noIterationTypes) { - return iterationTypes; - } - } - if (use & 1 /* AllowsSyncIterablesFlag */) { - let iterationTypes = getIterationTypesOfIterableSlow(type, syncIterationTypesResolver, errorNode, errorOutputContainer, noCache); + iterationTypes = getIterationTypesOfIterableSlow(type, syncIterationTypesResolver, errorNode, errorOutputContainer, noCache); if (iterationTypes !== noIterationTypes) { if (use & 2 /* AllowsAsyncIterablesFlag */) { iterationTypes = getAsyncFromSyncIterationTypes(iterationTypes, errorNode); @@ -88898,7 +89144,7 @@ function createTypeChecker(host) { } function isUnwrappedReturnTypeUndefinedVoidOrAny(func, returnType) { const type = unwrapReturnType(returnType, getFunctionFlags(func)); - return !!(type && (maybeTypeOfKind(type, 16384 /* Void */) || type.flags & (1 /* Any */ | 32768 /* Undefined */))); + return !!(type && (maybeTypeOfKind(type, 16 /* Void */) || type.flags & (1 /* Any */ | 4 /* Undefined */))); } function checkReturnStatement(node) { if (checkGrammarStatementInAmbientContext(node)) { @@ -88915,7 +89161,7 @@ function createTypeChecker(host) { } const signature = getSignatureFromDeclaration(container); const returnType = getReturnTypeOfSignature(signature); - if (strictNullChecks || node.expression || returnType.flags & 131072 /* Never */) { + if (strictNullChecks || node.expression || returnType.flags & 262144 /* Never */) { const exprType = node.expression ? checkExpressionCached(node.expression) : undefinedType; if (container.kind === 179 /* SetAccessor */) { if (node.expression) { @@ -89040,6 +89286,9 @@ function createTypeChecker(host) { return false; }); } + if (node.label.flags & 1073741824 /* Unreachable */ && compilerOptions.allowUnusedLabels !== true) { + errorOrSuggestion(compilerOptions.allowUnusedLabels === false, node.label, Diagnostics.Unused_label); + } checkSourceElement(node.statement); } function checkThrowStatement(node) { @@ -89095,7 +89344,7 @@ function createTypeChecker(host) { if (!(isStaticIndex && prop.flags & 4194304 /* Prototype */)) { checkIndexConstraintForProperty(type, prop, getLiteralTypeFromProperty( prop, - 8576 /* StringOrNumberLiteralOrUnique */, + 19456 /* StringOrNumberLiteralOrUnique */, /*includeNonPublic*/ true ), getNonMissingTypeOfSymbol(prop)); @@ -89169,7 +89418,7 @@ function createTypeChecker(host) { } } function checkClassNameCollisionWithObject(name) { - if (languageVersion >= 1 /* ES5 */ && name.escapedText === "Object" && host.getEmitModuleFormatOfFile(getSourceFileOfNode(name)) < 5 /* ES2015 */) { + if (name.escapedText === "Object" && host.getEmitModuleFormatOfFile(getSourceFileOfNode(name)) < 5 /* ES2015 */) { error2(name, Diagnostics.Class_name_cannot_be_Object_when_targeting_ES5_and_above_with_module_0, ModuleKind[moduleKind]); } } @@ -89241,7 +89490,7 @@ function createTypeChecker(host) { function visit(node) { if (node.kind === 184 /* TypeReference */) { const type = getTypeFromTypeReference(node); - if (type.flags & 262144 /* TypeParameter */) { + if (type.flags & 524288 /* TypeParameter */) { for (let i = index; i < typeParameters.length; i++) { if (type.symbol === getSymbolOfDeclaration(typeParameters[i])) { error2(node, Diagnostics.Type_parameter_defaults_can_only_reference_previously_declared_type_parameters); @@ -89429,7 +89678,7 @@ function createTypeChecker(host) { } else { checkTypeAssignableTo(staticType, getTypeWithoutSignatures(staticBaseType), node.name || node, Diagnostics.Class_static_side_0_incorrectly_extends_base_class_static_side_1); } - if (baseConstructorType.flags & 8650752 /* TypeVariable */) { + if (baseConstructorType.flags & 34078720 /* TypeVariable */) { if (!isMixinConstructorType(staticType)) { error2(node.name || node, Diagnostics.A_mixin_class_must_have_a_constructor_with_a_single_rest_parameter_of_type_any); } else { @@ -89439,7 +89688,7 @@ function createTypeChecker(host) { } } } - if (!(staticBaseType.symbol && staticBaseType.symbol.flags & 32 /* Class */) && !(baseConstructorType.flags & 8650752 /* TypeVariable */)) { + if (!(staticBaseType.symbol && staticBaseType.symbol.flags & 32 /* Class */) && !(baseConstructorType.flags & 34078720 /* TypeVariable */)) { const constructors = getInstantiatedConstructorsForTypeArguments(staticBaseType, baseTypeNode.typeArguments, baseTypeNode); if (forEach(constructors, (sig) => !isJSConstructor(sig.declaration) && !isTypeIdenticalTo(getReturnTypeOfSignature(sig), baseType))) { error2(baseTypeNode.expression, Diagnostics.Base_constructors_must_all_have_the_same_return_type); @@ -90249,12 +90498,7 @@ function createTypeChecker(host) { if (isIdentifier(node.name)) { checkCollisionsForDeclarationName(node, node.name); if (!(node.flags & (32 /* Namespace */ | 2048 /* GlobalAugmentation */))) { - const sourceFile = getSourceFileOfNode(node); - const pos = getNonModifierTokenPosOfNode(node); - const span = getSpanOfTokenAtPosition(sourceFile, pos); - suggestionDiagnostics.add( - createFileDiagnostic(sourceFile, span.start, span.length, Diagnostics.A_namespace_declaration_should_not_be_declared_using_the_module_keyword_Please_use_the_namespace_keyword_instead) - ); + error2(node.name, Diagnostics.A_namespace_declaration_should_not_be_declared_using_the_module_keyword_Please_use_the_namespace_keyword_instead); } } checkExportsOnMergedDeclarations(node); @@ -90568,7 +90812,7 @@ function createTypeChecker(host) { true ); if (importAttributesType !== emptyObjectType) { - checkTypeAssignableTo(getTypeFromImportAttributes(node), getNullableType(importAttributesType, 32768 /* Undefined */), node); + checkTypeAssignableTo(getTypeFromImportAttributes(node), getNullableType(importAttributesType, 4 /* Undefined */), node); } const validForTypeAttributes = isExclusivelyTypeOnlyImportOrExport(declaration); const override = getResolutionModeOverride(node, validForTypeAttributes ? grammarErrorOnNode : void 0); @@ -90585,6 +90829,9 @@ function createTypeChecker(host) { if (102 /* Node20 */ <= moduleKind && moduleKind <= 199 /* NodeNext */ && !isImportAttributes2) { return grammarErrorOnFirstToken(node, Diagnostics.Import_assertions_have_been_replaced_by_import_attributes_Use_with_instead_of_assert); } + if (!isImportAttributes2 && compilerOptions.ignoreDeprecations !== "6.0") { + grammarErrorOnFirstToken(node, Diagnostics.Import_assertions_have_been_replaced_by_import_attributes_Use_with_instead_of_assert); + } if (declaration.moduleSpecifier && getEmitSyntaxForModuleSpecifierExpression(declaration.moduleSpecifier) === 1 /* CommonJS */) { return grammarErrorOnNode( node, @@ -90634,7 +90881,13 @@ function createTypeChecker(host) { error2(node.moduleSpecifier, Diagnostics.Importing_a_JSON_file_into_an_ECMAScript_module_requires_a_type_Colon_json_import_attribute_when_module_is_set_to_0, ModuleKind[moduleKind]); } } else if (noUncheckedSideEffectImports && !importClause) { - void resolveExternalModuleName(node, node.moduleSpecifier); + void resolveExternalModuleName( + node, + node.moduleSpecifier, + /*ignoreErrors*/ + void 0, + Diagnostics.Cannot_find_module_or_type_declarations_for_side_effect_import_of_0 + ); } } checkImportAttributes(node); @@ -90926,10 +91179,12 @@ function createTypeChecker(host) { function checkSourceElement(node) { if (node) { const saveCurrentNode = currentNode; + const saveWithinUnreachableCode = withinUnreachableCode; currentNode = node; instantiationCount = 0; checkSourceElementWorker(node); currentNode = saveCurrentNode; + withinUnreachableCode = saveWithinUnreachableCode; } } function checkSourceElementWorker(node) { @@ -90957,8 +91212,10 @@ function createTypeChecker(host) { cancellationToken.throwIfCancellationRequested(); } } - if (kind >= 244 /* FirstStatement */ && kind <= 260 /* LastStatement */ && canHaveFlowNode(node) && node.flowNode && !isReachableFlowNode(node.flowNode)) { - errorOrSuggestion(compilerOptions.allowUnreachableCode === false, node, Diagnostics.Unreachable_code_detected); + if (compilerOptions.allowUnreachableCode !== true && !withinUnreachableCode) { + if (checkSourceElementUnreachable(node)) { + withinUnreachableCode = true; + } } switch (kind) { case 169 /* TypeParameter */: @@ -91136,6 +91393,66 @@ function createTypeChecker(host) { return checkMissingDeclaration(node); } } + function checkSourceElementUnreachable(node) { + if (!isPotentiallyExecutableNode(node)) { + return false; + } + if (reportedUnreachableNodes == null ? void 0 : reportedUnreachableNodes.has(node)) { + return true; + } + if (!isSourceElementUnreachable(node)) { + return false; + } + (reportedUnreachableNodes ?? (reportedUnreachableNodes = /* @__PURE__ */ new Set())).add(node); + const sourceFile = getSourceFileOfNode(node); + let startNode2 = node; + let endNode2 = node; + const parent2 = node.parent; + if (canHaveStatements(parent2)) { + const statements = parent2.statements; + const offset = statements.indexOf(node); + if (offset >= 0) { + let first2 = offset; + for (let i = offset - 1; i >= 0; i--) { + const prevNode = statements[i]; + if (!isPotentiallyExecutableNode(prevNode) || reportedUnreachableNodes.has(prevNode) || !isSourceElementUnreachable(prevNode)) { + break; + } + first2 = i; + reportedUnreachableNodes.add(prevNode); + } + let last2 = offset; + for (let i = offset + 1; i < statements.length; i++) { + const nextNode = statements[i]; + if (!isPotentiallyExecutableNode(nextNode) || !isSourceElementUnreachable(nextNode)) { + break; + } + last2 = i; + reportedUnreachableNodes.add(nextNode); + } + startNode2 = statements[first2]; + endNode2 = statements[last2]; + } + } + const start = getTokenPosOfNode(startNode2, sourceFile); + addErrorOrSuggestion(compilerOptions.allowUnreachableCode === false, createFileDiagnostic(sourceFile, start, endNode2.end - start, Diagnostics.Unreachable_code_detected)); + return true; + } + function isSourceElementUnreachable(node) { + if (node.flags & 1073741824 /* Unreachable */) { + switch (node.kind) { + case 267 /* EnumDeclaration */: + return !isEnumConst(node) || shouldPreserveConstEnums(compilerOptions); + case 268 /* ModuleDeclaration */: + return isInstantiatedModule(node, shouldPreserveConstEnums(compilerOptions)); + default: + return true; + } + } else if (canHaveFlowNode(node) && node.flowNode) { + return !isReachableFlowNode(node.flowNode); + } + return false; + } function checkJSDocCommentWorker(node) { if (isArray(node)) { forEach(node, (tag) => { @@ -91298,6 +91615,7 @@ function createTypeChecker(host) { mark(afterMark); measure("Check", beforeMark, afterMark); (_b = tracing) == null ? void 0 : _b.pop(); + reportedUnreachableNodes = void 0; } function unusedIsError(kind, isAmbient) { if (isAmbient) { @@ -91969,7 +92287,7 @@ function createTypeChecker(host) { if (isIdentifier(node) && isPropertyAccessExpression(node.parent) && node.parent.name === node) { const keyType = getLiteralTypeFromPropertyName(node); const objectType = getTypeOfExpression(node.parent.expression); - const objectTypes = objectType.flags & 1048576 /* Union */ ? objectType.types : [objectType]; + const objectTypes = objectType.flags & 134217728 /* Union */ ? objectType.types : [objectType]; return flatMap(objectTypes, (t) => filter(getIndexInfosOfType(t), (info) => isApplicableIndexType(keyType, info.keyType))); } return void 0; @@ -92124,7 +92442,7 @@ function createTypeChecker(host) { return getStringLiteralType(name.text); case 168 /* ComputedPropertyName */: const nameType = checkComputedPropertyName(name); - return isTypeAssignableToKind(nameType, 12288 /* ESSymbolLike */) ? nameType : stringType; + return isTypeAssignableToKind(nameType, 16896 /* ESSymbolLike */) ? nameType : stringType; default: return Debug.fail("Unsupported property name."); } @@ -92140,7 +92458,11 @@ function createTypeChecker(host) { } }); } - return getNamedMembers(propsByName); + return getNamedMembers( + propsByName, + /*container*/ + void 0 + ); } function typeHasCallOrConstructSignatures(type) { return getSignaturesOfType(type, 0 /* Call */).length !== 0 || getSignaturesOfType(type, 1 /* Construct */).length !== 0; @@ -92577,7 +92899,7 @@ function createTypeChecker(host) { return void 0; } function isFunctionType(type) { - return !!(type.flags & 524288 /* Object */) && getSignaturesOfType(type, 0 /* Call */).length > 0; + return !!(type.flags & 1048576 /* Object */) && getSignaturesOfType(type, 0 /* Call */).length > 0; } function getTypeReferenceSerializationKind(typeNameIn, location) { var _a; @@ -92645,19 +92967,19 @@ function createTypeChecker(host) { return isTypeOnly ? 11 /* ObjectType */ : 0 /* Unknown */; } else if (type.flags & 3 /* AnyOrUnknown */) { return 11 /* ObjectType */; - } else if (isTypeAssignableToKind(type, 16384 /* Void */ | 98304 /* Nullable */ | 131072 /* Never */)) { + } else if (isTypeAssignableToKind(type, 16 /* Void */ | 12 /* Nullable */ | 262144 /* Never */)) { return 2 /* VoidNullableOrNeverType */; - } else if (isTypeAssignableToKind(type, 528 /* BooleanLike */)) { + } else if (isTypeAssignableToKind(type, 8448 /* BooleanLike */)) { return 6 /* BooleanType */; - } else if (isTypeAssignableToKind(type, 296 /* NumberLike */)) { + } else if (isTypeAssignableToKind(type, 67648 /* NumberLike */)) { return 3 /* NumberLikeType */; - } else if (isTypeAssignableToKind(type, 2112 /* BigIntLike */)) { + } else if (isTypeAssignableToKind(type, 4224 /* BigIntLike */)) { return 4 /* BigIntLikeType */; - } else if (isTypeAssignableToKind(type, 402653316 /* StringLike */)) { + } else if (isTypeAssignableToKind(type, 12583968 /* StringLike */)) { return 5 /* StringLikeType */; } else if (isTupleType(type)) { return 7 /* ArrayLikeType */; - } else if (isTypeAssignableToKind(type, 12288 /* ESSymbolLike */)) { + } else if (isTypeAssignableToKind(type, 16896 /* ESSymbolLike */)) { return 8 /* ESSymbolType */; } else if (isFunctionType(type)) { return 10 /* TypeWithCallSignature */; @@ -92800,7 +93122,7 @@ function createTypeChecker(host) { return false; } function literalTypeToNode(type, enclosing, tracker) { - const enumResult = type.flags & 1056 /* EnumLike */ ? nodeBuilder.symbolToExpression( + const enumResult = type.flags & 98304 /* EnumLike */ ? nodeBuilder.symbolToExpression( type.symbol, 111551 /* Value */, enclosing, @@ -93822,7 +94144,7 @@ function createTypeChecker(host) { return grammarErrorOnNode(parameter.name, Diagnostics.An_index_signature_parameter_must_have_a_type_annotation); } const type = getTypeFromTypeNode(parameter.type); - if (someType(type, (t) => !!(t.flags & 8576 /* StringOrNumberLiteralOrUnique */)) || isGenericType(type)) { + if (someType(type, (t) => !!(t.flags & 19456 /* StringOrNumberLiteralOrUnique */)) || isGenericType(type)) { return grammarErrorOnNode(parameter.name, Diagnostics.An_index_signature_parameter_type_cannot_be_a_literal_type_or_generic_type_Consider_using_a_mapped_object_type_instead); } if (!everyType(type, isValidIndexKeyType)) { @@ -94354,7 +94676,7 @@ function createTypeChecker(host) { } function isSimpleLiteralEnumReference(expr) { if ((isPropertyAccessExpression(expr) || isElementAccessExpression(expr) && isStringOrNumberLiteralExpression(expr.argumentExpression)) && isEntityNameExpression(expr.expression)) { - return !!(checkExpressionCached(expr).flags & 1056 /* EnumLike */); + return !!(checkExpressionCached(expr).flags & 98304 /* EnumLike */); } } function checkAmbientInitializer(node) { @@ -94453,6 +94775,11 @@ function createTypeChecker(host) { declarationList, blockScopeFlags === 4 /* Using */ ? Diagnostics.The_left_hand_side_of_a_for_in_statement_cannot_be_a_using_declaration : Diagnostics.The_left_hand_side_of_a_for_in_statement_cannot_be_an_await_using_declaration ); + } else if (isVariableStatement(declarationList.parent) && isCaseOrDefaultClause(declarationList.parent.parent)) { + return grammarErrorOnNode( + declarationList, + blockScopeFlags === 4 /* Using */ ? Diagnostics.using_declarations_are_not_allowed_in_case_or_default_clauses_unless_contained_within_a_block : Diagnostics.await_using_declarations_are_not_allowed_in_case_or_default_clauses_unless_contained_within_a_block + ); } if (declarationList.flags & 33554432 /* Ambient */) { return grammarErrorOnNode( @@ -94764,9 +95091,9 @@ function createTypeChecker(host) { } function findMatchingTypeReferenceOrTypeAliasReference(source, unionTarget) { const sourceObjectFlags = getObjectFlags(source); - if (sourceObjectFlags & (4 /* Reference */ | 16 /* Anonymous */) && unionTarget.flags & 1048576 /* Union */) { + if (sourceObjectFlags & (4 /* Reference */ | 16 /* Anonymous */) && unionTarget.flags & 134217728 /* Union */) { return find(unionTarget.types, (target) => { - if (target.flags & 524288 /* Object */) { + if (target.flags & 1048576 /* Object */) { const overlapObjFlags = sourceObjectFlags & getObjectFlags(target); if (overlapObjFlags & 4 /* Reference */) { return source.target === target.target; @@ -94793,15 +95120,15 @@ function createTypeChecker(host) { } function findMostOverlappyType(source, unionTarget) { let bestMatch; - if (!(source.flags & (402784252 /* Primitive */ | 406847488 /* InstantiablePrimitive */))) { + if (!(source.flags & (12713980 /* Primitive */ | 14680064 /* InstantiablePrimitive */))) { let matchingCount = 0; for (const target of unionTarget.types) { - if (!(target.flags & (402784252 /* Primitive */ | 406847488 /* InstantiablePrimitive */))) { + if (!(target.flags & (12713980 /* Primitive */ | 14680064 /* InstantiablePrimitive */))) { const overlap = getIntersectionType([getIndexType(source), getIndexType(target)]); - if (overlap.flags & 4194304 /* Index */) { + if (overlap.flags & 2097152 /* Index */) { return target; - } else if (isUnitType(overlap) || overlap.flags & 1048576 /* Union */) { - const len = overlap.flags & 1048576 /* Union */ ? countWhere(overlap.types, isUnitType) : 1; + } else if (isUnitType(overlap) || overlap.flags & 134217728 /* Union */) { + const len = overlap.flags & 134217728 /* Union */ ? countWhere(overlap.types, isUnitType) : 1; if (len >= matchingCount) { bestMatch = target; matchingCount = len; @@ -94813,16 +95140,16 @@ function createTypeChecker(host) { return bestMatch; } function filterPrimitivesIfContainsNonPrimitive(type) { - if (maybeTypeOfKind(type, 67108864 /* NonPrimitive */)) { - const result = filterType(type, (t) => !(t.flags & 402784252 /* Primitive */)); - if (!(result.flags & 131072 /* Never */)) { + if (maybeTypeOfKind(type, 131072 /* NonPrimitive */)) { + const result = filterType(type, (t) => !(t.flags & 12713980 /* Primitive */)); + if (!(result.flags & 262144 /* Never */)) { return result; } } return type; } function findMatchingDiscriminantType(source, target, isRelatedTo) { - if (target.flags & 1048576 /* Union */ && source.flags & (2097152 /* Intersection */ | 524288 /* Object */)) { + if (target.flags & 134217728 /* Union */ && source.flags & (268435456 /* Intersection */ | 1048576 /* Object */)) { const match = getMatchingUnionConstituentForType(target, source); if (match) { return match; @@ -94878,6 +95205,330 @@ function createTypeChecker(host) { Debug.assert(specifier && nodeIsSynthesized(specifier) && specifier.text === "tslib", `Expected sourceFile.imports[0] to be the synthesized tslib import`); return specifier; } + function sortSymbolsIfTSGoCompat(array) { + if (stableTypeOrdering && array) { + return array.sort(compareSymbols); + } + return array; + } + function compareSymbols(s1, s2) { + if (s1 === s2) return 0; + if (s1 === void 0) return 1; + if (s2 === void 0) return -1; + if (length(s1.declarations) !== 0 && length(s2.declarations) !== 0) { + const r2 = compareNodes(s1.declarations[0], s2.declarations[0]); + if (r2 !== 0) return r2; + } else if (length(s1.declarations) !== 0) { + return -1; + } else if (length(s2.declarations) !== 0) { + return 1; + } + const r = compareComparableValues(s1.escapedName, s2.escapedName); + if (r !== 0) return r; + return getSymbolId(s1) - getSymbolId(s2); + } + function compareNodes(n1, n2) { + if (n1 === n2) return 0; + if (n1 === void 0) return 1; + if (n2 === void 0) return -1; + const s1 = getSourceFileOfNode(n1); + const s2 = getSourceFileOfNode(n2); + if (s1 !== s2) { + const f1 = fileIndexMap.get(s1); + const f2 = fileIndexMap.get(s2); + return f1 - f2; + } + return n1.pos - n2.pos; + } + function compareTypes(t1, t2) { + if (t1 === t2) return 0; + if (t1 === void 0) return -1; + if (t2 === void 0) return 1; + let c = getSortOrderFlags(t1) - getSortOrderFlags(t2); + if (c !== 0) return c; + c = compareTypeNames(t1, t2); + if (c !== 0) return c; + if (t1.flags & (1 /* Any */ | 2 /* Unknown */ | 32 /* String */ | 64 /* Number */ | 256 /* Boolean */ | 128 /* BigInt */ | 512 /* ESSymbol */ | 16 /* Void */ | 4 /* Undefined */ | 8 /* Null */ | 262144 /* Never */ | 131072 /* NonPrimitive */)) { + } else if (t1.flags & 1048576 /* Object */) { + const c2 = compareSymbols(t1.symbol, t2.symbol); + if (c2 !== 0) return c2; + if (getObjectFlags(t1) & 4 /* Reference */ && getObjectFlags(t2) & 4 /* Reference */) { + const r1 = t1; + const r2 = t2; + if (getObjectFlags(r1.target) & 8 /* Tuple */ && getObjectFlags(r2.target) & 8 /* Tuple */) { + const c3 = compareTupleTypes(r1.target, r2.target); + if (c3 !== 0) { + return c3; + } + } + if (r1.node === void 0 && r2.node === void 0) { + const c3 = compareTypeLists(t1.resolvedTypeArguments, t2.resolvedTypeArguments); + if (c3 !== 0) { + return c3; + } + } else { + let c3 = compareNodes(r1.node, r2.node); + if (c3 !== 0) { + return c3; + } + c3 = compareTypeMappers(t1.mapper, t2.mapper); + if (c3 !== 0) { + return c3; + } + } + } else if (getObjectFlags(t1) & 4 /* Reference */) { + return -1; + } else if (getObjectFlags(t2) & 4 /* Reference */) { + return 1; + } else { + let c3 = (getObjectFlags(t1) & 142607679 /* ObjectTypeKindMask */) - (getObjectFlags(t2) & 142607679 /* ObjectTypeKindMask */); + if (c3 !== 0) { + return c3; + } + c3 = compareTypeMappers(t1.mapper, t2.mapper); + if (c3 !== 0) { + return c3; + } + } + } else if (t1.flags & 134217728 /* Union */) { + const o1 = t1.origin; + const o2 = t2.origin; + if (o1 === void 0 && o2 === void 0) { + const c2 = compareTypeLists(t1.types, t2.types); + if (c2 !== 0) { + return c2; + } + } else if (o1 === void 0) { + return 1; + } else if (o2 === void 0) { + return -1; + } else { + const c2 = compareTypes(o1, o2); + if (c2 !== 0) { + return c2; + } + } + } else if (t1.flags & 268435456 /* Intersection */) { + const c2 = compareTypeLists(t1.types, t2.types); + if (c2 !== 0) { + return c2; + } + } else if (t1.flags & (65536 /* Enum */ | 32768 /* EnumLiteral */ | 16384 /* UniqueESSymbol */)) { + const c2 = compareSymbols(t1.symbol, t2.symbol); + if (c2 !== 0) { + return c2; + } + } else if (t1.flags & 1024 /* StringLiteral */) { + const c2 = compareComparableValues(t1.value, t2.value); + if (c2 !== 0) { + return c2; + } + } else if (t1.flags & 2048 /* NumberLiteral */) { + const c2 = compareComparableValues(t1.value, t2.value); + if (c2 !== 0) { + return c2; + } + } else if (t1.flags & 8192 /* BooleanLiteral */) { + const b1 = t1.intrinsicName === "true"; + const b2 = t2.intrinsicName === "true"; + if (b1 !== b2) { + if (b1) { + return 1; + } + return -1; + } + } else if (t1.flags & 524288 /* TypeParameter */) { + const c2 = compareSymbols(t1.symbol, t2.symbol); + if (c2 !== 0) { + return c2; + } + } else if (t1.flags & 2097152 /* Index */) { + let c2 = compareTypes(t1.type, t2.type); + if (c2 !== 0) { + return c2; + } + c2 = t1.indexFlags - t2.indexFlags; + if (c2 !== 0) { + return c2; + } + } else if (t1.flags & 33554432 /* IndexedAccess */) { + let c2 = compareTypes(t1.objectType, t2.objectType); + if (c2 !== 0) { + return c2; + } + c2 = compareTypes(t1.indexType, t2.indexType); + if (c2 !== 0) { + return c2; + } + } else if (t1.flags & 67108864 /* Conditional */) { + let c2 = compareNodes(t1.root.node, t2.root.node); + if (c2 !== 0) { + return c2; + } + c2 = compareTypeMappers(t1.mapper, t2.mapper); + if (c2 !== 0) { + return c2; + } + } else if (t1.flags & 16777216 /* Substitution */) { + let c2 = compareTypes(t1.baseType, t2.baseType); + if (c2 !== 0) { + return c2; + } + c2 = compareTypes(t1.constraint, t2.constraint); + if (c2 !== 0) { + return c2; + } + } else if (t1.flags & 4194304 /* TemplateLiteral */) { + let c2 = slicesCompareString(t1.texts, t2.texts); + if (c2 !== 0) { + return c2; + } + c2 = compareTypeLists(t1.types, t2.types); + if (c2 !== 0) { + return c2; + } + } else if (t1.flags & 8388608 /* StringMapping */) { + const c2 = compareTypes(t1.type, t2.type); + if (c2 !== 0) { + return c2; + } + } + return t1.id - t2.id; + function slicesCompareString(s1, s2) { + for (let i = 0; i < s1.length; i++) { + if (i > s2.length) { + return 1; + } + const v1 = s1[i]; + const v2 = s2[i]; + const c2 = compareComparableValues(v1, v2); + if (c2 !== 0) return c2; + } + if (s1.length < s2.length) { + return -1; + } + return 0; + } + } + function getSortOrderFlags(t) { + if (t.flags & (32768 /* EnumLiteral */ | 65536 /* Enum */) && !(t.flags & 134217728 /* Union */)) { + return 65536 /* Enum */; + } + return t.flags; + } + function compareTypeNames(t1, t2) { + const s1 = getTypeNameSymbol(t1); + const s2 = getTypeNameSymbol(t2); + if (s1 === s2) { + if (t1.aliasTypeArguments !== void 0) { + return compareTypeLists(t1.aliasTypeArguments, t2.aliasTypeArguments); + } + return 0; + } + if (s1 === void 0) { + return 1; + } + if (s2 === void 0) { + return -1; + } + return compareComparableValues(s1.escapedName, s2.escapedName); + } + function getTypeNameSymbol(t) { + if (t.aliasSymbol !== void 0) { + return t.aliasSymbol; + } + if (t.flags & (524288 /* TypeParameter */ | 8388608 /* StringMapping */) || getObjectFlags(t) & (3 /* ClassOrInterface */ | 4 /* Reference */)) { + return t.symbol; + } + return void 0; + } + function compareTupleTypes(t1, t2) { + var _a; + if (t1 === t2) { + return 0; + } + if (t1.readonly !== t2.readonly) { + return t1.readonly ? 1 : -1; + } + if (t1.elementFlags.length !== t2.elementFlags.length) { + return t1.elementFlags.length - t2.elementFlags.length; + } + for (let i = 0; i < t1.elementFlags.length; i++) { + const c = t1.elementFlags[i] - t2.elementFlags[i]; + if (c !== 0) { + return c; + } + } + for (let i = 0; i < (((_a = t1.labeledElementDeclarations) == null ? void 0 : _a.length) ?? 0); i++) { + const c = compareElementLabels(t1.labeledElementDeclarations[i], t2.labeledElementDeclarations[i]); + if (c !== 0) { + return c; + } + } + return 0; + } + function compareElementLabels(n1, n2) { + if (n1 === n2) { + return 0; + } + if (n1 === void 0) { + return -1; + } + if (n2 === void 0) { + return 1; + } + return compareComparableValues(n1.name.escapedText, n2.name.escapedText); + } + function compareTypeLists(s1, s2) { + if (length(s1) !== length(s2)) { + return length(s1) - length(s2); + } + for (let i = 0; i < length(s1); i++) { + const c = compareTypes(s1[i], s2 == null ? void 0 : s2[i]); + if (c !== 0) return c; + } + return 0; + } + function compareTypeMappers(m1, m2) { + if (m1 === m2) { + return 0; + } + if (m1 === void 0) { + return 1; + } + if (m2 === void 0) { + return -1; + } + const kind1 = m1.kind; + const kind2 = m2.kind; + if (kind1 !== kind2) { + return kind1 - kind2; + } + switch (kind1) { + case 0 /* Simple */: { + const c = compareTypes(m1.source, m2.source); + if (c !== 0) { + return c; + } + return compareTypes(m1.target, m2.target); + } + case 1 /* Array */: { + const c = compareTypeLists(m1.sources, m2.sources); + if (c !== 0) { + return c; + } + return compareTypeLists(m1.targets, m2.targets); + } + case 5 /* Merged */: { + const c = compareTypeMappers(m1.mapper1, m2.mapper1); + if (c !== 0) { + return c; + } + return compareTypeMappers(m1.mapper2, m2.mapper2); + } + } + return 0; + } } function isNotAccessor(declaration) { return !isAccessor(declaration); @@ -94942,7 +95593,7 @@ function createBasicNodeBuilderModuleSpecifierResolutionHost(host) { isSourceOfProjectReferenceRedirect: (fileName) => host.isSourceOfProjectReferenceRedirect(fileName), fileExists: (fileName) => host.fileExists(fileName), getFileIncludeReasons: () => host.getFileIncludeReasons(), - readFile: host.readFile ? (fileName) => host.readFile(fileName) : void 0, + readFile: host.readFile ? ((fileName) => host.readFile(fileName)) : void 0, getDefaultResolutionModeForFile: (file) => host.getDefaultResolutionModeForFile(file), getModeForResolutionAtIndex: (file, index) => host.getModeForResolutionAtIndex(file, index), getGlobalTypingsCacheLocation: maybeBind(host, host.getGlobalTypingsCacheLocation) @@ -95001,11 +95652,11 @@ var SymbolTrackerImpl = class _SymbolTrackerImpl { this.inner.reportCyclicStructureError(); } } - reportLikelyUnsafeImportRequiredError(specifier) { + reportLikelyUnsafeImportRequiredError(specifier, symbolName2) { var _a; if ((_a = this.inner) == null ? void 0 : _a.reportLikelyUnsafeImportRequiredError) { this.onDiagnosticReported(); - this.inner.reportLikelyUnsafeImportRequiredError(specifier); + this.inner.reportLikelyUnsafeImportRequiredError(specifier, symbolName2); } } reportTruncationError() { @@ -98552,7 +99203,7 @@ function transformTypeScript(context) { } } function visitSourceFile(node) { - const alwaysStrict = getStrictOptionValue(compilerOptions, "alwaysStrict") && !(isExternalModule(node) && moduleKind >= 5 /* ES2015 */) && !isJsonSourceFile(node); + const alwaysStrict = getAlwaysStrict(compilerOptions) && !(isExternalModule(node) && moduleKind >= 5 /* ES2015 */) && !isJsonSourceFile(node); return factory2.updateSourceFile( node, visitLexicalEnvironment( @@ -98597,7 +99248,7 @@ function transformTypeScript(context) { } function visitClassDeclaration(node) { const facts = getClassFacts(node); - const promoteToIIFE = languageVersion <= 1 /* ES5 */ && !!(facts & 7 /* MayNeedImmediatelyInvokedFunctionExpression */); + const promoteToIIFE = languageVersion < 2 /* ES2015 */ && !!(facts & 7 /* MayNeedImmediatelyInvokedFunctionExpression */); if (!isClassLikeDeclarationWithTypeScriptSyntax(node) && !classOrConstructorParameterIsDecorated(legacyDecorators, node) && !isExportOfNamespace(node)) { return factory2.updateClassDeclaration( node, @@ -98732,6 +99383,9 @@ function transformTypeScript(context) { const parametersWithPropertyAssignments = constructor && filter(constructor.parameters, (p) => isParameterPropertyDeclaration(p, constructor)); if (parametersWithPropertyAssignments) { for (const parameter of parametersWithPropertyAssignments) { + if (!isIdentifier(parameter.name)) { + continue; + } const parameterProperty = factory2.createPropertyDeclaration( /*modifiers*/ void 0, @@ -103830,7 +104484,7 @@ function transformESDecorators(context) { } else { Debug.assertIsDefined(node.name, "A class declaration that is not a default export must have a name."); const iife = transformClassLike(node); - const modifierVisitorNoExport = isExport ? (node2) => isExportModifier(node2) ? void 0 : modifierVisitor(node2) : modifierVisitor; + const modifierVisitorNoExport = isExport ? ((node2) => isExportModifier(node2) ? void 0 : modifierVisitor(node2)) : modifierVisitor; const modifiers = visitNodes2(node.modifiers, modifierVisitorNoExport, isModifier); const declName = factory2.getLocalName( node, @@ -107473,8 +108127,6 @@ function transformESNext(context) { return visitForStatement(node); case 251 /* ForOfStatement */: return visitForOfStatement(node); - case 256 /* SwitchStatement */: - return visitSwitchStatement(node); default: return visitEachChild(node, visitor, context); } @@ -107638,60 +108290,6 @@ function transformESNext(context) { } return visitEachChild(node, visitor, context); } - function visitCaseOrDefaultClause(node, envBinding) { - if (getUsingKindOfStatements(node.statements) !== 0 /* None */) { - if (isCaseClause(node)) { - return factory2.updateCaseClause( - node, - visitNode(node.expression, visitor, isExpression), - transformUsingDeclarations( - node.statements, - /*start*/ - 0, - node.statements.length, - envBinding, - /*topLevelStatements*/ - void 0 - ) - ); - } else { - return factory2.updateDefaultClause( - node, - transformUsingDeclarations( - node.statements, - /*start*/ - 0, - node.statements.length, - envBinding, - /*topLevelStatements*/ - void 0 - ) - ); - } - } - return visitEachChild(node, visitor, context); - } - function visitSwitchStatement(node) { - const usingKind = getUsingKindOfCaseOrDefaultClauses(node.caseBlock.clauses); - if (usingKind) { - const envBinding = createEnvBinding(); - return createDownlevelUsingStatements( - [ - factory2.updateSwitchStatement( - node, - visitNode(node.expression, visitor, isExpression), - factory2.updateCaseBlock( - node.caseBlock, - node.caseBlock.clauses.map((clause) => visitCaseOrDefaultClause(clause, envBinding)) - ) - ) - ], - envBinding, - usingKind === 2 /* Async */ - ); - } - return visitEachChild(node, visitor, context); - } function transformUsingDeclarations(statementsIn, start, end, envBinding, topLevelStatements) { const statements = []; for (let i = start; i < end; i++) { @@ -108057,15 +108655,6 @@ function getUsingKindOfStatements(statements) { } return result; } -function getUsingKindOfCaseOrDefaultClauses(clauses) { - let result = 0 /* None */; - for (const clause of clauses) { - const usingKind = getUsingKindOfStatements(clause.statements); - if (usingKind === 2 /* Async */) return 2 /* Async */; - if (usingKind > result) result = usingKind; - } - return result; -} // src/compiler/transformers/jsx.ts function transformJsx(context) { @@ -108296,7 +108885,7 @@ function transformJsx(context) { node.children, isChild, /*location*/ - node + createRange(skipTrivia(currentSourceFile.text, node.pos), node.end) ); } function visitJsxSelfClosingElement(node, isChild) { @@ -108307,7 +108896,7 @@ function transformJsx(context) { void 0, isChild, /*location*/ - node + createRange(skipTrivia(currentSourceFile.text, node.pos), node.end) ); } function visitJsxFragment(node, isChild) { @@ -108317,7 +108906,7 @@ function transformJsx(context) { node.children, isChild, /*location*/ - node + createRange(skipTrivia(currentSourceFile.text, node.pos), node.end) ); } function convertJsxChildrenToChildrenPropObject(children) { @@ -114393,7 +114982,7 @@ function transformModule(context) { function transformCommonJSModule(node) { startLexicalEnvironment(); const statements = []; - const ensureUseStrict = getStrictOptionValue(compilerOptions, "alwaysStrict") || isExternalModule(currentSourceFile); + const ensureUseStrict = getAlwaysStrict(compilerOptions) || isExternalModule(currentSourceFile); const statementOffset = factory2.copyPrologue(node.statements, statements, ensureUseStrict && !isJsonSourceFile(node), topLevelVisitor); if (shouldEmitUnderscoreUnderscoreESModule()) { append(statements, createUnderscoreUnderscoreESModule()); @@ -116406,7 +116995,7 @@ function transformSystemModule(context) { function createSystemModuleBody(node, dependencyGroups) { const statements = []; startLexicalEnvironment(); - const ensureUseStrict = getStrictOptionValue(compilerOptions, "alwaysStrict") || isExternalModule(currentSourceFile); + const ensureUseStrict = getAlwaysStrict(compilerOptions) || isExternalModule(currentSourceFile); const statementOffset = factory2.copyPrologue(node.statements, statements, ensureUseStrict, topLevelVisitor); statements.push( factory2.createVariableStatement( @@ -118622,9 +119211,13 @@ function transformDeclarations(context) { context.addDiagnostic(createDiagnosticForNode(errorNameNode || errorFallbackNode, Diagnostics.The_inferred_type_of_0_references_an_inaccessible_1_type_A_type_annotation_is_necessary, errorDeclarationNameWithFallback(), "this")); } } - function reportLikelyUnsafeImportRequiredError(specifier) { + function reportLikelyUnsafeImportRequiredError(specifier, symbolName2) { if (errorNameNode || errorFallbackNode) { - context.addDiagnostic(createDiagnosticForNode(errorNameNode || errorFallbackNode, Diagnostics.The_inferred_type_of_0_cannot_be_named_without_a_reference_to_1_This_is_likely_not_portable_A_type_annotation_is_necessary, errorDeclarationNameWithFallback(), specifier)); + if (symbolName2) { + context.addDiagnostic(createDiagnosticForNode(errorNameNode || errorFallbackNode, Diagnostics.The_inferred_type_of_0_cannot_be_named_without_a_reference_to_2_from_1_This_is_likely_not_portable_A_type_annotation_is_necessary, errorDeclarationNameWithFallback(), specifier, symbolName2)); + } else { + context.addDiagnostic(createDiagnosticForNode(errorNameNode || errorFallbackNode, Diagnostics.The_inferred_type_of_0_cannot_be_named_without_a_reference_to_1_This_is_likely_not_portable_A_type_annotation_is_necessary, errorDeclarationNameWithFallback(), specifier)); + } } } function reportTruncationError() { @@ -118669,11 +119262,9 @@ function transformDeclarations(context) { rawReferencedFiles = []; rawTypeReferenceDirectives = []; rawLibReferenceDirectives = []; - let hasNoDefaultLib = false; const bundle = factory2.createBundle( map(node.sourceFiles, (sourceFile) => { if (sourceFile.isDeclarationFile) return void 0; - hasNoDefaultLib = hasNoDefaultLib || sourceFile.hasNoDefaultLib; currentSourceFile = sourceFile; enclosingDeclaration = sourceFile; lateMarkedStatements = void 0; @@ -118734,7 +119325,6 @@ function transformDeclarations(context) { bundle.syntheticFileReferences = getReferencedFiles(outputFilePath2); bundle.syntheticTypeReferences = getTypeReferences(); bundle.syntheticLibReferences = getLibReferences(); - bundle.hasNoDefaultLib = hasNoDefaultLib; return bundle; } needsDeclare = true; @@ -118775,7 +119365,8 @@ function transformDeclarations(context) { true, getReferencedFiles(outputFilePath), getTypeReferences(), - node.hasNoDefaultLib, + /*hasNoDefaultLib*/ + false, getLibReferences() ); function collectFileReferences(sourceFile) { @@ -119799,6 +120390,7 @@ function transformDeclarations(context) { if (isOmittedExpression(elem)) continue; if (isBindingPattern(elem.name)) { elems = concatenate(elems, walkBindingPattern(elem.name)); + continue; } elems = elems || []; elems.push(factory2.createPropertyDeclaration( @@ -120685,7 +121277,7 @@ function getCommonSourceDirectory(options, emittedFiles, currentDirectory, getCa if (options.rootDir) { commonSourceDirectory = getNormalizedAbsolutePath(options.rootDir, currentDirectory); checkSourceFilesBelongToPath == null ? void 0 : checkSourceFilesBelongToPath(options.rootDir); - } else if (options.composite && options.configFilePath) { + } else if (options.configFilePath) { commonSourceDirectory = getDirectoryPath(normalizeSlashes(options.configFilePath)); checkSourceFilesBelongToPath == null ? void 0 : checkSourceFilesBelongToPath(commonSourceDirectory); } else { @@ -120696,6 +121288,13 @@ function getCommonSourceDirectory(options, emittedFiles, currentDirectory, getCa } return commonSourceDirectory; } +function getComputedCommonSourceDirectory(emittedFiles, currentDirectory, getCanonicalFileName) { + let commonSourceDirectory = computeCommonSourceDirectoryOfFilenames(emittedFiles, currentDirectory, getCanonicalFileName); + if (commonSourceDirectory && commonSourceDirectory[commonSourceDirectory.length - 1] !== directorySeparator) { + commonSourceDirectory += directorySeparator; + } + return commonSourceDirectory; +} function getCommonSourceDirectoryOfConfig({ options, fileNames }, ignoreCase) { return getCommonSourceDirectory( options, @@ -122440,7 +123039,7 @@ function createPrinter(printerOptions = {}, handlers = {}) { increaseIndent(); } const preferNewLine = node.multiLine ? 65536 /* PreferNewLine */ : 0 /* None */; - const allowTrailingComma = currentSourceFile && currentSourceFile.languageVersion >= 1 /* ES5 */ && !isJsonSourceFile(currentSourceFile) ? 64 /* AllowTrailingComma */ : 0 /* None */; + const allowTrailingComma = currentSourceFile && !isJsonSourceFile(currentSourceFile) ? 64 /* AllowTrailingComma */ : 0 /* None */; emitList(node, node.properties, 526226 /* ObjectLiteralExpressionProperties */ | allowTrailingComma | preferNewLine); if (indentedFlag) { decreaseIndent(); @@ -123945,16 +124544,12 @@ function createPrinter(printerOptions = {}, handlers = {}) { emitSourceFileWorker(node); } function emitSyntheticTripleSlashReferencesIfNeeded(node) { - emitTripleSlashDirectives(!!node.hasNoDefaultLib, node.syntheticFileReferences || [], node.syntheticTypeReferences || [], node.syntheticLibReferences || []); + emitTripleSlashDirectives(node.syntheticFileReferences || [], node.syntheticTypeReferences || [], node.syntheticLibReferences || []); } function emitTripleSlashDirectivesIfNeeded(node) { - if (node.isDeclarationFile) emitTripleSlashDirectives(node.hasNoDefaultLib, node.referencedFiles, node.typeReferenceDirectives, node.libReferenceDirectives); + if (node.isDeclarationFile) emitTripleSlashDirectives(node.referencedFiles, node.typeReferenceDirectives, node.libReferenceDirectives); } - function emitTripleSlashDirectives(hasNoDefaultLib, files, types, libs2) { - if (hasNoDefaultLib) { - writeComment(`/// `); - writeLine(); - } + function emitTripleSlashDirectives(files, types, libs2) { if (currentSourceFile && currentSourceFile.moduleName) { writeComment(`/// `); writeLine(); @@ -126947,7 +127542,6 @@ function createProgram(_rootNamesOrOptions, _options, _host, _oldProgram, _confi mark("beforeProgram"); const host = createProgramOptionsHost || createCompilerHost(options); const configParsingHost = parseConfigHostFromCompilerHostLike(host); - let skipDefaultLib = options.noLib; const getDefaultLibraryFileName = memoize(() => host.getDefaultLibFileName(options)); const defaultLibraryPath = host.getDefaultLibLocation ? host.getDefaultLibLocation() : getDirectoryPath(getDefaultLibraryFileName()); let skipVerifyCompilerOptions = false; @@ -127035,6 +127629,7 @@ function createProgram(_rootNamesOrOptions, _options, _host, _oldProgram, _confi let redirectTargetsMap = createMultiMap(); let usesUriStyleNodeCoreModules; const filesByName = /* @__PURE__ */ new Map(); + const libFiles = /* @__PURE__ */ new Set(); let missingFileNames = /* @__PURE__ */ new Map(); const filesByNameIgnoreCase = host.useCaseSensitiveFileNames() ? /* @__PURE__ */ new Map() : void 0; let resolvedProjectReferences; @@ -127096,8 +127691,6 @@ function createProgram(_rootNamesOrOptions, _options, _host, _oldProgram, _confi name, /*isDefaultLib*/ false, - /*ignoreNoDefaultLib*/ - false, { kind: 0 /* RootFile */, index } )); (_j = tracing) == null ? void 0 : _j.pop(); @@ -127129,15 +127722,14 @@ function createProgram(_rootNamesOrOptions, _options, _host, _oldProgram, _confi } (_n = tracing) == null ? void 0 : _n.pop(); } - if (rootNames.length && !skipDefaultLib) { + if (rootNames.length && !options.noLib) { const defaultLibraryFileName = getDefaultLibraryFileName(); if (!options.lib && defaultLibraryFileName) { + libFiles.add(toPath3(defaultLibraryFileName)); processRootFile( defaultLibraryFileName, /*isDefaultLib*/ true, - /*ignoreNoDefaultLib*/ - false, { kind: 6 /* LibFile */ } ); } else { @@ -127146,8 +127738,6 @@ function createProgram(_rootNamesOrOptions, _options, _host, _oldProgram, _confi pathForLibFile(libFileName), /*isDefaultLib*/ true, - /*ignoreNoDefaultLib*/ - false, { kind: 6 /* LibFile */, index } ); }); @@ -127658,8 +128248,6 @@ function createProgram(_rootNamesOrOptions, _options, _host, _oldProgram, _confi structureIsReused = 1 /* SafeModules */; } else if (!arrayIsEqualTo(oldSourceFile.libReferenceDirectives, newSourceFile.libReferenceDirectives, fileReferenceIsEqualTo)) { structureIsReused = 1 /* SafeModules */; - } else if (oldSourceFile.hasNoDefaultLib !== newSourceFile.hasNoDefaultLib) { - structureIsReused = 1 /* SafeModules */; } else if (!arrayIsEqualTo(oldSourceFile.referencedFiles, newSourceFile.referencedFiles, fileReferenceIsEqualTo)) { structureIsReused = 1 /* SafeModules */; } else { @@ -127730,6 +128318,9 @@ function createProgram(_rootNamesOrOptions, _options, _host, _oldProgram, _confi Debug.assert(newSourceFiles.length === oldProgram.getSourceFiles().length); for (const newSourceFile of newSourceFiles) { filesByName.set(newSourceFile.path, newSourceFile); + if (oldProgram.isSourceFileDefaultLibrary(newSourceFile)) { + libFiles.add(newSourceFile.path); + } } const oldFilesByNameMap = oldProgram.getFilesByNameMap(); oldFilesByNameMap.forEach((oldFile, path) => { @@ -127841,24 +128432,7 @@ function createProgram(_rootNamesOrOptions, _options, _host, _oldProgram, _confi return !!sourceFilesFoundSearchingNodeModules.get(file.path); } function isSourceFileDefaultLibrary(file) { - if (!file.isDeclarationFile) { - return false; - } - if (file.hasNoDefaultLib) { - return true; - } - if (options.noLib) { - return false; - } - const equalityComparer = host.useCaseSensitiveFileNames() ? equateStringsCaseSensitive : equateStringsCaseInsensitive; - if (!options.lib) { - return equalityComparer(file.fileName, getDefaultLibraryFileName()); - } else { - return some(options.lib, (libFileName) => { - const resolvedLib = resolvedLibReferences.get(libFileName); - return !!resolvedLib && equalityComparer(file.fileName, resolvedLib.actual); - }); - } + return libFiles.has(file.path); } function getTypeChecker() { return typeChecker || (typeChecker = createTypeChecker(program)); @@ -128339,11 +128913,10 @@ function createProgram(_rootNamesOrOptions, _options, _host, _oldProgram, _confi function getConfigFileParsingDiagnostics2() { return configFileParsingDiagnostics || emptyArray; } - function processRootFile(fileName, isDefaultLib, ignoreNoDefaultLib, reason) { + function processRootFile(fileName, isDefaultLib, reason) { processSourceFile( normalizePath(fileName), isDefaultLib, - ignoreNoDefaultLib, /*packageId*/ void 0, reason @@ -128508,10 +129081,10 @@ function createProgram(_rootNamesOrOptions, _options, _host, _oldProgram, _confi return sourceFileWithAddedExtension; } } - function processSourceFile(fileName, isDefaultLib, ignoreNoDefaultLib, packageId, reason) { + function processSourceFile(fileName, isDefaultLib, packageId, reason) { getSourceFileFromReferenceWorker( fileName, - (fileName2) => findSourceFile(fileName2, isDefaultLib, ignoreNoDefaultLib, reason, packageId), + (fileName2) => findSourceFile(fileName2, isDefaultLib, reason, packageId), // TODO: GH#18217 (diagnostic, ...args) => addFilePreprocessingFileExplainingDiagnostic( /*file*/ @@ -128528,8 +129101,6 @@ function createProgram(_rootNamesOrOptions, _options, _host, _oldProgram, _confi fileName, /*isDefaultLib*/ false, - /*ignoreNoDefaultLib*/ - false, /*packageId*/ void 0, reason @@ -128555,14 +129126,14 @@ function createProgram(_rootNamesOrOptions, _options, _host, _oldProgram, _confi sourceFilesFoundSearchingNodeModules.set(path, currentNodeModulesDepth > 0); return redirect; } - function findSourceFile(fileName, isDefaultLib, ignoreNoDefaultLib, reason, packageId) { + function findSourceFile(fileName, isDefaultLib, reason, packageId) { var _a2, _b2; (_a2 = tracing) == null ? void 0 : _a2.push(tracing.Phase.Program, "findSourceFile", { fileName, isDefaultLib: isDefaultLib || void 0, fileIncludeKind: FileIncludeKind[reason.kind] }); - const result = findSourceFileWorker(fileName, isDefaultLib, ignoreNoDefaultLib, reason, packageId); + const result = findSourceFileWorker(fileName, isDefaultLib, reason, packageId); (_b2 = tracing) == null ? void 0 : _b2.pop(); return result; } @@ -128572,7 +129143,7 @@ function createProgram(_rootNamesOrOptions, _options, _host, _oldProgram, _confi const setExternalModuleIndicator2 = getSetExternalModuleIndicator(options2); return typeof result === "object" ? { ...result, languageVersion, setExternalModuleIndicator: setExternalModuleIndicator2, jsDocParsingMode: host2.jsDocParsingMode } : { languageVersion, impliedNodeFormat: result, setExternalModuleIndicator: setExternalModuleIndicator2, jsDocParsingMode: host2.jsDocParsingMode }; } - function findSourceFileWorker(fileName, isDefaultLib, ignoreNoDefaultLib, reason, packageId) { + function findSourceFileWorker(fileName, isDefaultLib, reason, packageId) { var _a2, _b2; const path = toPath3(fileName); if (useSourceOfProjectReferenceRedirect) { @@ -128582,7 +129153,7 @@ function createProgram(_rootNamesOrOptions, _options, _host, _oldProgram, _confi if (realPath2 !== path) source = getRedirectFromOutput(realPath2); } if (source == null ? void 0 : source.source) { - const file2 = findSourceFile(source.source, isDefaultLib, ignoreNoDefaultLib, reason, packageId); + const file2 = findSourceFile(source.source, isDefaultLib, reason, packageId); if (file2) addFileToFilesByName( file2, path, @@ -128702,7 +129273,6 @@ function createProgram(_rootNamesOrOptions, _options, _host, _oldProgram, _confi filesByNameIgnoreCase.set(pathLowerCase, file); } } - skipDefaultLib = skipDefaultLib || file.hasNoDefaultLib && !ignoreNoDefaultLib; if (!options.noResolve) { processReferencedFiles(file, isDefaultLib); processTypeReferenceDirectives(file); @@ -128763,8 +129333,6 @@ function createProgram(_rootNamesOrOptions, _options, _host, _oldProgram, _confi processSourceFile( resolveTripleslashReference(ref.fileName, file.fileName), isDefaultLib, - /*ignoreNoDefaultLib*/ - false, /*packageId*/ void 0, { kind: 4 /* ReferenceFile */, file: file.path, index } @@ -128805,8 +129373,6 @@ function createProgram(_rootNamesOrOptions, _options, _host, _oldProgram, _confi resolvedTypeReferenceDirective.resolvedFileName, /*isDefaultLib*/ false, - /*ignoreNoDefaultLib*/ - false, resolvedTypeReferenceDirective.packageId, reason ); @@ -128826,13 +129392,14 @@ function createProgram(_rootNamesOrOptions, _options, _host, _oldProgram, _confi if (existing) return existing.actual; const result = pathForLibFileWorker(libFileName); (resolvedLibReferences ?? (resolvedLibReferences = /* @__PURE__ */ new Map())).set(libFileName, result); + libFiles.add(toPath3(result.actual)); return result.actual; } function pathForLibFileWorker(libFileName) { var _a2, _b2, _c2, _d2, _e2; const existing = resolvedLibProcessing == null ? void 0 : resolvedLibProcessing.get(libFileName); if (existing) return existing; - if (options.libReplacement === false) { + if (!options.libReplacement) { const result2 = { resolution: { resolvedModule: void 0 @@ -128884,8 +129451,6 @@ function createProgram(_rootNamesOrOptions, _options, _host, _oldProgram, _confi pathForLibFile(libFileName), /*isDefaultLib*/ true, - /*ignoreNoDefaultLib*/ - true, { kind: 7 /* LibReferenceDirective */, file: file.path, index } ); } else { @@ -128933,8 +129498,6 @@ function createProgram(_rootNamesOrOptions, _options, _host, _oldProgram, _confi resolvedFileName, /*isDefaultLib*/ false, - /*ignoreNoDefaultLib*/ - false, { kind: 3 /* Import */, file: file.path, index }, resolution.packageId ); @@ -129038,10 +129601,9 @@ function createProgram(_rootNamesOrOptions, _options, _host, _oldProgram, _confi } const getCommonSourceDirectory3 = memoize(() => getCommonSourceDirectoryOfConfig(resolvedRef.commandLine, !host.useCaseSensitiveFileNames())); commandLine.fileNames.forEach((fileName) => { - if (isDeclarationFileName(fileName)) return; const path = toPath3(fileName); let outputDts; - if (!fileExtensionIs(fileName, ".json" /* Json */)) { + if (!isDeclarationFileName(fileName) && !fileExtensionIs(fileName, ".json" /* Json */)) { if (!commandLine.options.outFile) { outputDts = getOutputDeclarationFileName(fileName, resolvedRef.commandLine, !host.useCaseSensitiveFileNames(), getCommonSourceDirectory3); mapOutputFileToResolvedRef.set(toPath3(outputDts), { resolvedRef, source: fileName }); @@ -129225,6 +129787,31 @@ function createProgram(_rootNamesOrOptions, _options, _host, _oldProgram, _confi createDiagnosticForOptionName(Diagnostics.Cannot_find_the_common_subdirectory_path_for_the_input_files, "outDir"); } } + if (!options.noEmit && !options.composite && !options.rootDir && options.configFilePath && (options.outDir || // there is --outDir specified + getEmitDeclarations(options) && options.declarationDir || // there is --declarationDir specified + options.outFile)) { + const dir = getCommonSourceDirectory2(); + const emittedFiles = mapDefined(files, (file) => !file.isDeclarationFile && sourceFileMayBeEmitted(file, program) ? file.fileName : void 0); + const dir59 = getComputedCommonSourceDirectory(emittedFiles, currentDirectory, getCanonicalFileName); + if (dir59 !== "" && getCanonicalFileName(dir) !== getCanonicalFileName(dir59)) { + createDiagnosticForOption( + /*onKey*/ + true, + options.outFile ? "outFile" : options.outDir ? "outDir" : "declarationDir", + !options.outFile && options.outDir ? "declarationDir" : void 0, + chainDiagnosticMessages( + chainDiagnosticMessages( + /*details*/ + void 0, + Diagnostics.Visit_https_Colon_Slash_Slashaka_ms_Slashts6_for_migration_information + ), + Diagnostics.The_common_source_directory_of_0_is_1_The_rootDir_setting_must_be_explicitly_set_to_this_or_another_path_to_adjust_your_output_s_file_layout, + getBaseFileName(options.configFilePath), + getRelativePathFromFile(options.configFilePath, dir59, getCanonicalFileName) + ) + ); + } + } if (options.checkJs && !getAllowJSCompilerOption(options)) { createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_without_specifying_option_1, "checkJs", "allowJs"); } @@ -129277,7 +129864,7 @@ function createProgram(_rootNamesOrOptions, _options, _host, _oldProgram, _confi } } if (options.allowImportingTsExtensions && !(options.noEmit || options.emitDeclarationOnly || options.rewriteRelativeImportExtensions)) { - createOptionValueDiagnostic("allowImportingTsExtensions", Diagnostics.Option_allowImportingTsExtensions_can_only_be_used_when_either_noEmit_or_emitDeclarationOnly_is_set); + createOptionValueDiagnostic("allowImportingTsExtensions", Diagnostics.Option_allowImportingTsExtensions_can_only_be_used_when_one_of_noEmit_emitDeclarationOnly_or_rewriteRelativeImportExtensions_is_set); } const moduleResolution = getEmitModuleResolutionKind(options); if (options.resolvePackageJsonExports && !moduleResolutionSupportsPackageJsonExportsAndImports(moduleResolution)) { @@ -129289,8 +129876,8 @@ function createProgram(_rootNamesOrOptions, _options, _host, _oldProgram, _confi if (options.customConditions && !moduleResolutionSupportsPackageJsonExportsAndImports(moduleResolution)) { createDiagnosticForOptionName(Diagnostics.Option_0_can_only_be_used_when_moduleResolution_is_set_to_node16_nodenext_or_bundler, "customConditions"); } - if (moduleResolution === 100 /* Bundler */ && !emitModuleKindIsNonNodeESM(moduleKind) && moduleKind !== 200 /* Preserve */) { - createOptionValueDiagnostic("moduleResolution", Diagnostics.Option_0_can_only_be_used_when_module_is_set_to_preserve_or_to_es2015_or_later, "bundler"); + if (moduleResolution === 100 /* Bundler */ && !emitModuleKindIsNonNodeESM(moduleKind) && moduleKind !== 200 /* Preserve */ && moduleKind !== 1 /* CommonJS */) { + createOptionValueDiagnostic("moduleResolution", Diagnostics.Option_0_can_only_be_used_when_module_is_set_to_preserve_commonjs_or_es2015_or_later, "bundler"); } if (ModuleKind[moduleKind] && (100 /* Node16 */ <= moduleKind && moduleKind <= 199 /* NodeNext */) && !(3 /* Node16 */ <= moduleResolution && moduleResolution <= 99 /* NodeNext */)) { const moduleKindName = ModuleKind[moduleKind]; @@ -129337,7 +129924,7 @@ function createProgram(_rootNamesOrOptions, _options, _host, _oldProgram, _confi function getIgnoreDeprecationsVersion() { const ignoreDeprecations = options.ignoreDeprecations; if (ignoreDeprecations) { - if (ignoreDeprecations === "5.0") { + if (ignoreDeprecations === "5.0" || ignoreDeprecations === "6.0") { return new Version(ignoreDeprecations); } reportInvalidIgnoreDeprecations(); @@ -129352,32 +129939,35 @@ function createProgram(_rootNamesOrOptions, _options, _host, _oldProgram, _confi const mustBeRemoved = !(removedInVersion.compareTo(typescriptVersion) === 1 /* GreaterThan */); const canBeSilenced = !mustBeRemoved && ignoreDeprecationsVersion.compareTo(deprecatedInVersion) === -1 /* LessThan */; if (mustBeRemoved || canBeSilenced) { - fn((name, value, useInstead) => { + fn((name, value, useInstead, related) => { if (mustBeRemoved) { if (value === void 0) { - createDiagnostic(name, value, useInstead, Diagnostics.Option_0_has_been_removed_Please_remove_it_from_your_configuration, name); + createDiagnostic(name, value, useInstead, related, Diagnostics.Option_0_has_been_removed_Please_remove_it_from_your_configuration, name); } else { - createDiagnostic(name, value, useInstead, Diagnostics.Option_0_1_has_been_removed_Please_remove_it_from_your_configuration, name, value); + createDiagnostic(name, value, useInstead, related, Diagnostics.Option_0_1_has_been_removed_Please_remove_it_from_your_configuration, name, value); } } else { if (value === void 0) { - createDiagnostic(name, value, useInstead, Diagnostics.Option_0_is_deprecated_and_will_stop_functioning_in_TypeScript_1_Specify_compilerOption_ignoreDeprecations_Colon_2_to_silence_this_error, name, removedIn, deprecatedIn); + createDiagnostic(name, value, useInstead, related, Diagnostics.Option_0_is_deprecated_and_will_stop_functioning_in_TypeScript_1_Specify_compilerOption_ignoreDeprecations_Colon_2_to_silence_this_error, name, removedIn, deprecatedIn); } else { - createDiagnostic(name, value, useInstead, Diagnostics.Option_0_1_is_deprecated_and_will_stop_functioning_in_TypeScript_2_Specify_compilerOption_ignoreDeprecations_Colon_3_to_silence_this_error, name, value, removedIn, deprecatedIn); + createDiagnostic(name, value, useInstead, related, Diagnostics.Option_0_1_is_deprecated_and_will_stop_functioning_in_TypeScript_2_Specify_compilerOption_ignoreDeprecations_Colon_3_to_silence_this_error, name, value, removedIn, deprecatedIn); } } }); } } function verifyDeprecatedCompilerOptions() { - function createDiagnostic(name, value, useInstead, message, ...args) { + function createDiagnostic(name, value, useInstead, related, message, ...args) { if (useInstead) { - const details = chainDiagnosticMessages( + let details = chainDiagnosticMessages( /*details*/ void 0, Diagnostics.Use_0_instead, useInstead ); + if (related) { + details = chainDiagnosticMessages(details, related); + } const chain = chainDiagnosticMessages(details, message, ...args); createDiagnosticForOption( /*onKey*/ @@ -129388,14 +129978,22 @@ function createProgram(_rootNamesOrOptions, _options, _host, _oldProgram, _confi chain ); } else { + let details; + if (related) { + details = chainDiagnosticMessages( + /*details*/ + void 0, + related + ); + } + const chain = chainDiagnosticMessages(details, message, ...args); createDiagnosticForOption( /*onKey*/ !value, name, /*option2*/ void 0, - message, - ...args + chain ); } } @@ -129422,12 +130020,7 @@ function createProgram(_rootNamesOrOptions, _options, _host, _oldProgram, _confi createDeprecatedDiagnostic("charset"); } if (options.out) { - createDeprecatedDiagnostic( - "out", - /*value*/ - void 0, - "outFile" - ); + createDeprecatedDiagnostic("out"); } if (options.importsNotUsedAsValues) { createDeprecatedDiagnostic( @@ -129446,9 +130039,89 @@ function createProgram(_rootNamesOrOptions, _options, _host, _oldProgram, _confi ); } }); + checkDeprecations("6.0", "7.0", createDiagnostic, (createDeprecatedDiagnostic) => { + if (options.alwaysStrict === false) { + createDeprecatedDiagnostic( + "alwaysStrict", + "false", + /*useInstead*/ + void 0, + /*related*/ + void 0 + ); + } + if (options.target === 1 /* ES5 */) { + createDeprecatedDiagnostic("target", "ES5"); + } + if (options.moduleResolution === 2 /* Node10 */) { + createDeprecatedDiagnostic( + "moduleResolution", + "node10", + /*useInstead*/ + void 0, + Diagnostics.Visit_https_Colon_Slash_Slashaka_ms_Slashts6_for_migration_information + ); + } + if (options.moduleResolution === 1 /* Classic */) { + createDeprecatedDiagnostic( + "moduleResolution", + "classic", + /*useInstead*/ + void 0, + /*related*/ + void 0 + ); + } + if (options.baseUrl !== void 0) { + createDeprecatedDiagnostic( + "baseUrl", + /*value*/ + void 0, + /*useInstead*/ + void 0, + Diagnostics.Visit_https_Colon_Slash_Slashaka_ms_Slashts6_for_migration_information + ); + } + if (options.esModuleInterop === false) { + createDeprecatedDiagnostic( + "esModuleInterop", + "false", + /*useInstead*/ + void 0, + /*related*/ + void 0 + ); + } + if (options.allowSyntheticDefaultImports === false) { + createDeprecatedDiagnostic( + "allowSyntheticDefaultImports", + "false", + /*useInstead*/ + void 0, + /*related*/ + void 0 + ); + } + if (options.outFile) { + createDeprecatedDiagnostic("outFile"); + } + if (options.module === 0 /* None */ || options.module === 2 /* AMD */ || options.module === 3 /* UMD */ || options.module === 4 /* System */) { + createDeprecatedDiagnostic( + "module", + ModuleKind[options.module], + /*useInstead*/ + void 0, + /*related*/ + void 0 + ); + } + if (options.downlevelIteration !== void 0) { + createDeprecatedDiagnostic("downlevelIteration"); + } + }); } function verifyDeprecatedProjectReference(ref, parentFile, index) { - function createDiagnostic(_name, _value, _useInstead, message, ...args) { + function createDiagnostic(_name, _value, _useInstead, _related, message, ...args) { createDiagnosticForReference(parentFile, index, message, ...args); } checkDeprecations("5.0", "5.5", createDiagnostic, (createDeprecatedDiagnostic) => { @@ -130201,8 +130874,7 @@ function createProgramDiagnostics(getCompilerOptionsObjectLiteralSyntax) { reason.kind === 2 /* OutputFromProjectReference */ ? Diagnostics.File_is_output_from_referenced_project_specified_here : Diagnostics.File_is_source_from_referenced_project_specified_here ) : void 0; case 8 /* AutomaticTypeDirectiveFile */: - if (!options.types) return void 0; - configFileNode = getOptionsSyntaxByArrayElementValue(getCompilerOptionsObjectLiteralSyntax(), "types", reason.typeReference); + configFileNode = getOptionsSyntaxByArrayElementValue(getCompilerOptionsObjectLiteralSyntax(), "types", usesWildcardTypes(options) ? "*" : reason.typeReference); message = Diagnostics.File_is_entry_point_of_type_library_specified_here; break; case 6 /* LibFile */: @@ -130712,7 +131384,7 @@ function createBuilderProgramState(newProgram, oldState) { } if (canCopySemanticDiagnostics) { if (sourceFile.isDeclarationFile && !copyDeclarationFileDiagnostics) return; - if (sourceFile.hasNoDefaultLib && !copyLibFileDiagnostics) return; + if (newProgram.isSourceFileDefaultLibrary(sourceFile) && !copyLibFileDiagnostics) return; const diagnostics = oldState.semanticDiagnosticsPerFile.get(sourceFilePath); if (diagnostics) { state.semanticDiagnosticsPerFile.set( @@ -132639,7 +133311,7 @@ function createResolutionCache(resolutionHost, rootDirForResolution, logChangesW shouldRetryResolution, logChanges }) { - var _a; + var _a, _b; const path = resolutionHost.toPath(containingFile); const resolutionsInFile = perFileCache.get(path) || perFileCache.set(path, createModeAwareCache()).get(path); const resolvedModules = []; @@ -132660,7 +133332,7 @@ function createResolutionCache(resolutionHost, rootDirForResolution, logChangesW resolutionHost.onDiscoveredSymlink(); } resolutionsInFile.set(name, mode, resolution); - if (resolution !== existingResolution) { + if (resolution !== existingResolution && !((_b = resolutionHost.skipWatchingFailedLookups) == null ? void 0 : _b.call(resolutionHost, path))) { watchFailedLookupLocationsOfExternalModuleResolutions(name, resolution, path, getResolutionWithResolvedFileName, deferWatchingNonRelativeResolution); if (existingResolution) { stopWatchFailedLookupLocationOfResolution(existingResolution, path, getResolutionWithResolvedFileName); @@ -132697,8 +133369,11 @@ function createResolutionCache(resolutionHost, rootDirForResolution, logChangesW ); if (resolutionsInFile.size() !== seenNamesInFile.size()) { resolutionsInFile.forEach((resolution, name, mode) => { + var _a2; if (!seenNamesInFile.has(name, mode)) { - stopWatchFailedLookupLocationOfResolution(resolution, path, getResolutionWithResolvedFileName); + if (!((_a2 = resolutionHost.skipWatchingFailedLookups) == null ? void 0 : _a2.call(resolutionHost, path))) { + stopWatchFailedLookupLocationOfResolution(resolution, path, getResolutionWithResolvedFileName); + } resolutionsInFile.delete(name, mode); } }); @@ -133112,15 +133787,18 @@ function createResolutionCache(resolutionHost, rootDirForResolution, logChangesW }, nonRecursive ? 0 /* None */ : 1 /* Recursive */); } function removeResolutionsOfFileFromCache(cache, filePath, getResolutionWithResolvedFileName) { + var _a; const resolutions = cache.get(filePath); if (resolutions) { - resolutions.forEach( - (resolution) => stopWatchFailedLookupLocationOfResolution( - resolution, - filePath, - getResolutionWithResolvedFileName - ) - ); + if (!((_a = resolutionHost.skipWatchingFailedLookups) == null ? void 0 : _a.call(resolutionHost, filePath))) { + resolutions.forEach( + (resolution) => stopWatchFailedLookupLocationOfResolution( + resolution, + filePath, + getResolutionWithResolvedFileName + ) + ); + } cache.delete(filePath); } } @@ -133275,8 +133953,13 @@ function createResolutionCache(resolutionHost, rootDirForResolution, logChangesW }, 1 /* Recursive */) : noopFileWatcher; } function updateTypeRootsWatch() { + var _a; const options = resolutionHost.getCompilationSettings(); - if (options.types) { + if (!usesWildcardTypes(options)) { + closeTypeRootsWatch(); + return; + } + if (!isRootWatchable || ((_a = resolutionHost.skipWatchingTypeRoots) == null ? void 0 : _a.call(resolutionHost))) { closeTypeRootsWatch(); return; } @@ -133629,7 +134312,7 @@ function fileIncludeReasonToDiagnostics(program, reason, fileNameConvertor) { options.outFile ? "--outFile" : "--out" ); case 8 /* AutomaticTypeDirectiveFile */: { - const messageAndArgs = options.types ? reason.packageId ? [Diagnostics.Entry_point_of_type_library_0_specified_in_compilerOptions_with_packageId_1, reason.typeReference, packageIdToString(reason.packageId)] : [Diagnostics.Entry_point_of_type_library_0_specified_in_compilerOptions, reason.typeReference] : reason.packageId ? [Diagnostics.Entry_point_for_implicit_type_library_0_with_packageId_1, reason.typeReference, packageIdToString(reason.packageId)] : [Diagnostics.Entry_point_for_implicit_type_library_0, reason.typeReference]; + const messageAndArgs = !usesWildcardTypes(options) ? reason.packageId ? [Diagnostics.Entry_point_of_type_library_0_specified_in_compilerOptions_with_packageId_1, reason.typeReference, packageIdToString(reason.packageId)] : [Diagnostics.Entry_point_of_type_library_0_specified_in_compilerOptions, reason.typeReference] : reason.packageId ? [Diagnostics.Entry_point_for_implicit_type_library_0_with_packageId_1, reason.typeReference, packageIdToString(reason.packageId)] : [Diagnostics.Entry_point_for_implicit_type_library_0, reason.typeReference]; return chainDiagnosticMessages( /*details*/ void 0, @@ -133771,7 +134454,7 @@ var WatchType = { }; function createWatchFactory(host, options) { const watchLogLevel = host.trace ? options.extendedDiagnostics ? 2 /* Verbose */ : options.diagnostics ? 1 /* TriggerOnly */ : 0 /* None */ : 0 /* None */; - const writeLog = watchLogLevel !== 0 /* None */ ? (s) => host.trace(s) : noop; + const writeLog = watchLogLevel !== 0 /* None */ ? ((s) => host.trace(s)) : noop; const result = getWatchFactory(host, watchLogLevel, writeLog); result.writeLog = writeLog; return result; @@ -134105,7 +134788,7 @@ function createWatchProgram(host) { compilerHost.resolveTypeReferenceDirectiveReferences = resolutionCache.resolveTypeReferenceDirectiveReferences.bind(resolutionCache); } compilerHost.resolveLibrary = !host.resolveLibrary ? resolutionCache.resolveLibrary.bind(resolutionCache) : host.resolveLibrary.bind(host); - compilerHost.getModuleResolutionCache = host.resolveModuleNameLiterals || host.resolveModuleNames ? maybeBind(host, host.getModuleResolutionCache) : () => resolutionCache.getModuleResolutionCache(); + compilerHost.getModuleResolutionCache = host.resolveModuleNameLiterals || host.resolveModuleNames ? maybeBind(host, host.getModuleResolutionCache) : (() => resolutionCache.getModuleResolutionCache()); const userProvidedResolution = !!host.resolveModuleNameLiterals || !!host.resolveTypeReferenceDirectiveReferences || !!host.resolveModuleNames || !!host.resolveTypeReferenceDirectives; const customHasInvalidatedResolutions = userProvidedResolution ? maybeBind(host, host.hasInvalidatedResolutions) || returnTrue : returnFalse; const customHasInvalidLibResolutions = host.resolveLibrary ? maybeBind(host, host.hasInvalidatedLibResolutions) || returnTrue : returnFalse; @@ -136498,7 +137181,13 @@ function updateReportDiagnostic(sys2, existing, options) { ) : existing; } function defaultIsPretty(sys2) { - return !!sys2.writeOutputIsTTY && sys2.writeOutputIsTTY() && !sys2.getEnvironmentVariable("NO_COLOR"); + if (sys2.getEnvironmentVariable("NO_COLOR")) { + return false; + } + if (sys2.getEnvironmentVariable("FORCE_COLOR")) { + return true; + } + return !!sys2.writeOutputIsTTY && sys2.writeOutputIsTTY(); } function shouldBePretty(sys2, options) { if (!options || typeof options.pretty === "undefined") { @@ -136507,7 +137196,8 @@ function shouldBePretty(sys2, options) { return options.pretty; } function getOptionsForHelp(commandLine) { - return !!commandLine.options.all ? toSorted(optionDeclarations.concat(tscBuildOption), (a, b) => compareStringsCaseInsensitive(a.name, b.name)) : filter(optionDeclarations.concat(tscBuildOption), (v) => !!v.showInSimplifiedHelpView); + const helpOptions = filter(optionDeclarations.concat(tscBuildOption), (option) => option.showInHelp !== false); + return !!commandLine.options.all ? toSorted(helpOptions, (a, b) => compareStringsCaseInsensitive(a.name, b.name)) : filter(helpOptions, (v) => !!v.showInSimplifiedHelpView); } function printVersion(sys2) { sys2.write(getDiagnosticText(Diagnostics.Version_0, version) + sys2.newLine); @@ -136823,7 +137513,7 @@ function printAllHelp(sys2, compilerOptions, buildOptions, watchOptions) { output = [...output, ...generateSectionOptionsOutput( sys2, getDiagnosticText(Diagnostics.WATCH_OPTIONS), - watchOptions, + filter(watchOptions, (option) => option.showInHelp !== false), /*subCategory*/ false, getDiagnosticText(Diagnostics.Including_watch_w_will_start_watching_the_current_project_for_the_file_changes_Once_set_you_can_config_watch_mode_with_Colon) @@ -136831,7 +137521,7 @@ function printAllHelp(sys2, compilerOptions, buildOptions, watchOptions) { output = [...output, ...generateSectionOptionsOutput( sys2, getDiagnosticText(Diagnostics.BUILD_OPTIONS), - filter(buildOptions, (option) => option !== tscBuildOption), + filter(buildOptions, (option) => option !== tscBuildOption && option.showInHelp !== false), /*subCategory*/ false, formatMessage(Diagnostics.Using_build_b_will_make_tsc_behave_more_like_a_build_orchestrator_than_a_compiler_This_is_used_to_trigger_building_composite_projects_which_you_can_learn_more_about_at_0, "https://aka.ms/tsc-composite-builds") @@ -136845,7 +137535,7 @@ function printBuildHelp(sys2, buildOptions) { output = [...output, ...generateSectionOptionsOutput( sys2, getDiagnosticText(Diagnostics.BUILD_OPTIONS), - filter(buildOptions, (option) => option !== tscBuildOption), + filter(buildOptions, (option) => option !== tscBuildOption && option.showInHelp !== false), /*subCategory*/ false, formatMessage(Diagnostics.Using_build_b_will_make_tsc_behave_more_like_a_build_orchestrator_than_a_compiler_This_is_used_to_trigger_building_composite_projects_which_you_can_learn_more_about_at_0, "https://aka.ms/tsc-composite-builds") @@ -136925,18 +137615,23 @@ function executeCommandLineWorker(sys2, cb, commandLine) { return sys2.exit(1 /* DiagnosticsPresent_OutputsSkipped */); } } - } else if (commandLine.fileNames.length === 0) { + } else if (!commandLine.options.ignoreConfig || commandLine.fileNames.length === 0) { const searchPath = normalizePath(sys2.getCurrentDirectory()); configFileName = findConfigFile(searchPath, (fileName) => sys2.fileExists(fileName)); - } - if (commandLine.fileNames.length === 0 && !configFileName) { - if (commandLine.options.showConfig) { - reportDiagnostic(createCompilerDiagnostic(Diagnostics.Cannot_find_a_tsconfig_json_file_at_the_current_directory_Colon_0, normalizePath(sys2.getCurrentDirectory()))); - } else { - printVersion(sys2); - printHelp(sys2, commandLine); + if (commandLine.fileNames.length !== 0) { + if (configFileName) { + reportDiagnostic(createCompilerDiagnostic(Diagnostics.tsconfig_json_is_present_but_will_not_be_loaded_if_files_are_specified_on_commandline_Use_ignoreConfig_to_skip_this_error)); + return sys2.exit(1 /* DiagnosticsPresent_OutputsSkipped */); + } + } else if (!configFileName) { + if (commandLine.options.showConfig) { + reportDiagnostic(createCompilerDiagnostic(Diagnostics.Cannot_find_a_tsconfig_json_file_at_the_current_directory_Colon_0, normalizePath(sys2.getCurrentDirectory()))); + } else { + printVersion(sys2); + printHelp(sys2, commandLine); + } + return sys2.exit(1 /* DiagnosticsPresent_OutputsSkipped */); } - return sys2.exit(1 /* DiagnosticsPresent_OutputsSkipped */); } const currentDirectory = sys2.getCurrentDirectory(); const commandLineOptions = convertToOptionsWithAbsolutePaths( @@ -138826,7 +139521,7 @@ function discoverTypings(host, log, fileNames, projectRootPath, safeList, packag const filesToWatch = []; if (typeAcquisition.include) addInferredTypings(typeAcquisition.include, "Explicitly included types"); const exclude = typeAcquisition.exclude || []; - if (!compilerOptions.types) { + if (!compilerOptions.types || usesWildcardTypes(compilerOptions)) { const possibleSearchDirs = new Set(fileNames.map(getDirectoryPath)); possibleSearchDirs.add(projectRootPath); possibleSearchDirs.forEach((searchDir) => { @@ -140403,7 +141098,7 @@ function isInsideJsxElementOrAttribute(sourceFile, position) { if (token && token.kind === 20 /* CloseBraceToken */ && token.parent.kind === 295 /* JsxExpression */) { return true; } - if (token.kind === 31 /* LessThanSlashToken */ && token.parent.kind === 288 /* JsxClosingElement */) { + if (token.kind === 30 /* LessThanToken */ && token.parent.kind === 288 /* JsxClosingElement */) { return true; } return false; @@ -140431,7 +141126,7 @@ function isInJSXText(sourceFile, position) { function isInsideJsxElement(sourceFile, position) { function isInsideJsxElementTraversal(node) { while (node) { - if (node.kind >= 286 /* JsxSelfClosingElement */ && node.kind <= 295 /* JsxExpression */ || node.kind === 12 /* JsxText */ || node.kind === 30 /* LessThanToken */ || node.kind === 32 /* GreaterThanToken */ || node.kind === 80 /* Identifier */ || node.kind === 20 /* CloseBraceToken */ || node.kind === 19 /* OpenBraceToken */ || node.kind === 44 /* SlashToken */ || node.kind === 31 /* LessThanSlashToken */) { + if (node.kind >= 286 /* JsxSelfClosingElement */ && node.kind <= 295 /* JsxExpression */ || node.kind === 12 /* JsxText */ || node.kind === 30 /* LessThanToken */ || node.kind === 32 /* GreaterThanToken */ || node.kind === 80 /* Identifier */ || node.kind === 20 /* CloseBraceToken */ || node.kind === 19 /* OpenBraceToken */ || node.kind === 44 /* SlashToken */) { node = node.parent; } else if (node.kind === 285 /* JsxElement */) { if (position > node.getStart(sourceFile)) return true; @@ -140617,7 +141312,7 @@ function isStringOrRegularExpressionOrTemplateLiteral(kind) { return false; } function areIntersectedTypesAvoidingStringReduction(checker, t1, t2) { - return !!(t1.flags & 4 /* String */) && checker.isEmptyAnonymousObjectType(t2); + return !!(t1.flags & 32 /* String */) && checker.isEmptyAnonymousObjectType(t2); } function isStringAndEmptyAnonymousObjectIntersection(type) { if (!type.isIntersection()) { @@ -142404,7 +143099,7 @@ function forEachExternalModule(checker, allSourceFiles, excludePatterns, host, c function getIsExcluded(excludePatterns, host) { var _a; const realpathsWithSymlinks = (_a = host.getSymlinkCache) == null ? void 0 : _a.call(host).getSymlinkedDirectoriesByRealpath(); - return ({ fileName, path }) => { + return (({ fileName, path }) => { if (excludePatterns.some((p) => p.test(fileName))) return true; if ((realpathsWithSymlinks == null ? void 0 : realpathsWithSymlinks.size) && pathContainsNodeModules(fileName)) { let dir = getDirectoryPath(fileName); @@ -142421,7 +143116,7 @@ function getIsExcluded(excludePatterns, host) { ) ?? false; } return false; - }; + }); } function getIsFileExcluded(host, preferences) { if (!preferences.autoImportFileExcludePatterns) return () => false; @@ -144595,7 +145290,7 @@ function every2(s, pred, start = 0, end = s.length) { // src/services/preProcess.ts function preProcessFile(sourceText, readImportFiles = true, detectJavaScriptImports = false) { const pragmaContext = { - languageVersion: 1 /* ES5 */, + languageVersion: 12 /* LatestStandard */, // controls whether the token scanner considers unicode identifiers or not - shouldn't matter, since we're only using it for trivia pragmas: void 0, checkJsDirective: void 0, @@ -144603,7 +145298,6 @@ function preProcessFile(sourceText, readImportFiles = true, detectJavaScriptImpo typeReferenceDirectives: [], libReferenceDirectives: [], amdDependencies: [], - hasNoDefaultLib: void 0, moduleName: void 0 }; const importedFiles = []; @@ -144912,7 +145606,7 @@ function preProcessFile(sourceText, readImportFiles = true, detectJavaScriptImpo importedFiles.push(decl.ref); } } - return { referencedFiles: pragmaContext.referencedFiles, typeReferenceDirectives: pragmaContext.typeReferenceDirectives, libReferenceDirectives: pragmaContext.libReferenceDirectives, importedFiles, isLibFile: !!pragmaContext.hasNoDefaultLib, ambientExternalModules: void 0 }; + return { referencedFiles: pragmaContext.referencedFiles, typeReferenceDirectives: pragmaContext.typeReferenceDirectives, libReferenceDirectives: pragmaContext.libReferenceDirectives, importedFiles, isLibFile: false, ambientExternalModules: void 0 }; } else { let ambientModuleNames; if (ambientExternalModules) { @@ -144927,7 +145621,7 @@ function preProcessFile(sourceText, readImportFiles = true, detectJavaScriptImpo } } } - return { referencedFiles: pragmaContext.referencedFiles, typeReferenceDirectives: pragmaContext.typeReferenceDirectives, libReferenceDirectives: pragmaContext.libReferenceDirectives, importedFiles, isLibFile: !!pragmaContext.hasNoDefaultLib, ambientExternalModules: ambientModuleNames }; + return { referencedFiles: pragmaContext.referencedFiles, typeReferenceDirectives: pragmaContext.typeReferenceDirectives, libReferenceDirectives: pragmaContext.libReferenceDirectives, importedFiles, isLibFile: false, ambientExternalModules: ambientModuleNames }; } } @@ -145301,8 +145995,7 @@ function transpileDeclaration(input, transpileOptions) { true ); } -var barebonesLibContent = `/// -interface Boolean {} +var barebonesLibContent = `interface Boolean {} interface Function {} interface CallableFunction {} interface NewableFunction {} @@ -145349,6 +146042,7 @@ function transpileWorker(input, transpileOptions, declaration) { options.declaration = false; options.declarationMap = false; } + options.noLib = !declaration; const newLine = getNewLineCharacter(options); const compilerHost = { getSourceFile: (fileName) => fileName === normalizePath(inputFileName) ? sourceFile : fileName === normalizePath(barebonesLibName) ? barebonesLibSourceFile : void 0, @@ -145396,8 +146090,7 @@ function transpileWorker(input, transpileOptions, declaration) { } let outputText; let sourceMapText; - const inputs = declaration ? [inputFileName, barebonesLibName] : [inputFileName]; - const program = createProgram(inputs, options, compilerHost); + const program = createProgram([inputFileName], options, compilerHost); if (transpileOptions.reportDiagnostics) { addRange( /*to*/ @@ -145466,7 +146159,7 @@ __export(ts_NavigateTo_exports, { }); // src/services/navigateTo.ts -function getNavigateToItems(sourceFiles, checker, cancellationToken, searchValue, maxResultCount, excludeDtsFiles, excludeLibFiles) { +function getNavigateToItems(sourceFiles, checker, cancellationToken, searchValue, maxResultCount, excludeDtsFiles, excludeLibFiles, program) { const patternMatcher = createPatternMatcher(searchValue); if (!patternMatcher) return emptyArray; const rawItems = []; @@ -145476,26 +146169,26 @@ function getNavigateToItems(sourceFiles, checker, cancellationToken, searchValue if (excludeDtsFiles && sourceFile.isDeclarationFile) { continue; } - if (shouldExcludeFile(sourceFile, !!excludeLibFiles, singleCurrentFile)) { + if (shouldExcludeFile(sourceFile, !!excludeLibFiles, singleCurrentFile, program)) { continue; } sourceFile.getNamedDeclarations().forEach((declarations, name) => { - getItemsFromNamedDeclaration(patternMatcher, name, declarations, checker, sourceFile.fileName, !!excludeLibFiles, singleCurrentFile, rawItems); + getItemsFromNamedDeclaration(patternMatcher, name, declarations, checker, sourceFile.fileName, !!excludeLibFiles, singleCurrentFile, rawItems, program); }); } rawItems.sort(compareNavigateToItems); return (maxResultCount === void 0 ? rawItems : rawItems.slice(0, maxResultCount)).map(createNavigateToItem); } -function shouldExcludeFile(file, excludeLibFiles, singleCurrentFile) { - return file !== singleCurrentFile && excludeLibFiles && (isInsideNodeModules(file.path) || file.hasNoDefaultLib); +function shouldExcludeFile(file, excludeLibFiles, singleCurrentFile, program) { + return file !== singleCurrentFile && excludeLibFiles && (isInsideNodeModules(file.path) || program.isSourceFileDefaultLibrary(file)); } -function getItemsFromNamedDeclaration(patternMatcher, name, declarations, checker, fileName, excludeLibFiles, singleCurrentFile, rawItems) { +function getItemsFromNamedDeclaration(patternMatcher, name, declarations, checker, fileName, excludeLibFiles, singleCurrentFile, rawItems, program) { const match = patternMatcher.getMatchForLastSegmentOfPattern(name); if (!match) { return; } for (const declaration of declarations) { - if (!shouldKeepItem(declaration, checker, excludeLibFiles, singleCurrentFile)) continue; + if (!shouldKeepItem(declaration, checker, excludeLibFiles, singleCurrentFile, program)) continue; if (patternMatcher.patternContainsDots) { const fullMatch = patternMatcher.getFullMatch(getContainers(declaration), name); if (fullMatch) { @@ -145506,7 +146199,7 @@ function getItemsFromNamedDeclaration(patternMatcher, name, declarations, checke } } } -function shouldKeepItem(declaration, checker, excludeLibFiles, singleCurrentFile) { +function shouldKeepItem(declaration, checker, excludeLibFiles, singleCurrentFile, program) { var _a; switch (declaration.kind) { case 274 /* ImportClause */: @@ -145514,7 +146207,7 @@ function shouldKeepItem(declaration, checker, excludeLibFiles, singleCurrentFile case 272 /* ImportEqualsDeclaration */: const importer = checker.getSymbolAtLocation(declaration.name); const imported = checker.getAliasedSymbol(importer); - return importer.escapedName !== imported.escapedName && !((_a = imported.declarations) == null ? void 0 : _a.every((d) => shouldExcludeFile(d.getSourceFile(), excludeLibFiles, singleCurrentFile))); + return importer.escapedName !== imported.escapedName && !((_a = imported.declarations) == null ? void 0 : _a.every((d) => shouldExcludeFile(d.getSourceFile(), excludeLibFiles, singleCurrentFile, program))); default: return true; } @@ -145810,8 +146503,8 @@ function addChildrenRecursively(node) { addNodeWithRecursiveChild(node, getInteriorModule(node).body); break; case 278 /* ExportAssignment */: { - const expression2 = node.expression; - const child = isObjectLiteralExpression(expression2) || isCallExpression(expression2) ? expression2 : isArrowFunction(expression2) || isFunctionExpression(expression2) ? expression2.body : void 0; + const expression2 = skipOuterExpressions(node.expression); + const child = isObjectLiteralExpression(expression2) || isCallExpression(expression2) || isClassExpression(expression2) ? expression2 : isArrowFunction(expression2) || isFunctionExpression(expression2) ? expression2.body : void 0; if (child) { startNode(node); addChildrenRecursively(child); @@ -151107,7 +151800,7 @@ function collectReadsAndWrites(targetRange, scopes, enclosingTextRange, sourceFi const start = first(statements).getStart(); const end = last(statements).end; expressionDiagnostic = createFileDiagnostic(sourceFile, start, end - start, Messages.expressionExpected); - } else if (checker.getTypeAtLocation(expression).flags & (16384 /* Void */ | 131072 /* Never */)) { + } else if (checker.getTypeAtLocation(expression).flags & (16 /* Void */ | 262144 /* Never */)) { expressionDiagnostic = createDiagnosticForNode(expression, Messages.uselessConstantType); } for (const scope of scopes) { @@ -151873,9 +152566,7 @@ function createChildren(node, sourceFile) { }); return children; } - const languageVariant = (sourceFile == null ? void 0 : sourceFile.languageVariant) ?? 0 /* Standard */; scanner.setText((sourceFile || node.getSourceFile()).text); - scanner.setLanguageVariant(languageVariant); let pos = node.pos; const processNode = (child) => { addSyntheticNodes(children, pos, child.pos, node); @@ -151892,7 +152583,6 @@ function createChildren(node, sourceFile) { node.forEachChild(processNode, processNodes); addSyntheticNodes(children, pos, node.end, node); scanner.setText(void 0); - scanner.setLanguageVariant(0 /* Standard */); return children; } function addSyntheticNodes(nodes, pos, end, parent2) { @@ -152158,25 +152848,25 @@ var TypeObject = class { return this.checker.getDefaultFromTypeParameter(this); } isUnion() { - return !!(this.flags & 1048576 /* Union */); + return !!(this.flags & 134217728 /* Union */); } isIntersection() { - return !!(this.flags & 2097152 /* Intersection */); + return !!(this.flags & 268435456 /* Intersection */); } isUnionOrIntersection() { - return !!(this.flags & 3145728 /* UnionOrIntersection */); + return !!(this.flags & 402653184 /* UnionOrIntersection */); } isLiteral() { - return !!(this.flags & (128 /* StringLiteral */ | 256 /* NumberLiteral */ | 2048 /* BigIntLiteral */)); + return !!(this.flags & (1024 /* StringLiteral */ | 2048 /* NumberLiteral */ | 4096 /* BigIntLiteral */)); } isStringLiteral() { - return !!(this.flags & 128 /* StringLiteral */); + return !!(this.flags & 1024 /* StringLiteral */); } isNumberLiteral() { - return !!(this.flags & 256 /* NumberLiteral */); + return !!(this.flags & 2048 /* NumberLiteral */); } isTypeParameter() { - return !!(this.flags & 262144 /* TypeParameter */); + return !!(this.flags & 524288 /* TypeParameter */); } isClassOrInterface() { return !!(getObjectFlags(this) & 3 /* ClassOrInterface */); @@ -152185,7 +152875,7 @@ var TypeObject = class { return !!(getObjectFlags(this) & 1 /* Class */); } isIndexType() { - return !!(this.flags & 4194304 /* Index */); + return !!(this.flags & 2097152 /* Index */); } /** * This polyfills `referenceType.typeArguments` for API consumers @@ -152496,7 +153186,7 @@ function displayPartsToString(displayParts) { } function getDefaultCompilerOptions2() { return { - target: 1 /* ES5 */, + target: 12 /* LatestStandard */, jsx: 1 /* Preserve */ }; } @@ -153322,7 +154012,7 @@ function createLanguageService(host, documentRegistry = createDocumentRegistry(h function getNavigateToItems2(searchValue, maxResultCount, fileName, excludeDtsFiles = false, excludeLibFiles = false) { synchronizeHostData(); const sourceFiles = fileName ? [getValidSourceFile(fileName)] : program.getSourceFiles(); - return getNavigateToItems(sourceFiles, program.getTypeChecker(), cancellationToken, searchValue, maxResultCount, excludeDtsFiles, excludeLibFiles); + return getNavigateToItems(sourceFiles, program.getTypeChecker(), cancellationToken, searchValue, maxResultCount, excludeDtsFiles, excludeLibFiles, program); } function getEmitOutput(fileName, emitOnlyDtsFiles, forceDtsEmit) { synchronizeHostData(); @@ -154100,6 +154790,7 @@ function getSymbolAtLocationForQuickInfo(node, checker) { return checker.getSymbolAtLocation(node); } function getPropertySymbolsFromContextualType(node, checker, contextualType, unionSymbolOk) { + contextualType = contextualType.getNonNullableType(); const name = getNameFromPropertyName(node.name); if (!name) return emptyArray; if (!contextualType.isUnion()) { @@ -160919,7 +161610,7 @@ function getInfo10(sourceFile, tokenPos, errorCode, checker, program) { return { kind: 0 /* TypeLikeDeclaration */, token, call, modifierFlags, parentDeclaration: declaration, declSourceFile, isJSFile }; } const enumDeclaration = find(symbol.declarations, isEnumDeclaration); - if (enumDeclaration && !(leftExpressionType.flags & 1056 /* EnumLike */) && !isPrivateIdentifier(token) && !isSourceFileFromLibrary(program, enumDeclaration.getSourceFile())) { + if (enumDeclaration && !(leftExpressionType.flags & 98304 /* EnumLike */) && !isPrivateIdentifier(token) && !isSourceFileFromLibrary(program, enumDeclaration.getSourceFile())) { return { kind: 1 /* Enum */, token, parentDeclaration: enumDeclaration }; } return void 0; @@ -161095,7 +161786,7 @@ function addMethodDeclaration(context, changes, callExpression, name, modifierFl function addEnumMemberDeclaration(changes, checker, { token, parentDeclaration }) { const hasStringInitializer = some(parentDeclaration.members, (member) => { const type = checker.getTypeAtLocation(member); - return !!(type && type.flags & 402653316 /* StringLike */); + return !!(type && type.flags & 12583968 /* StringLike */); }); const sourceFile = parentDeclaration.getSourceFile(); const enumMember = factory.createEnumMember(token, hasStringInitializer ? factory.createStringLiteral(token.text) : void 0); @@ -161183,23 +161874,23 @@ function tryGetValueFromType(context, checker, importAdder, quotePreference, typ if (type.flags & 3 /* AnyOrUnknown */) { return createUndefined(); } - if (type.flags & (4 /* String */ | 134217728 /* TemplateLiteral */)) { + if (type.flags & (32 /* String */ | 4194304 /* TemplateLiteral */)) { return factory.createStringLiteral( "", /* isSingleQuote */ quotePreference === 0 /* Single */ ); } - if (type.flags & 8 /* Number */) { + if (type.flags & 64 /* Number */) { return factory.createNumericLiteral(0); } - if (type.flags & 64 /* BigInt */) { + if (type.flags & 128 /* BigInt */) { return factory.createBigIntLiteral("0n"); } - if (type.flags & 16 /* Boolean */) { + if (type.flags & 256 /* Boolean */) { return factory.createFalse(); } - if (type.flags & 1056 /* EnumLike */) { + if (type.flags & 98304 /* EnumLike */) { const enumMember = type.symbol.exports ? firstOrUndefinedIterator(type.symbol.exports.values()) : type.symbol; const symbol = type.symbol.parent && type.symbol.parent.flags & 256 /* RegularEnum */ ? type.symbol.parent : type.symbol; const name = checker.symbolToExpression( @@ -161212,29 +161903,29 @@ function tryGetValueFromType(context, checker, importAdder, quotePreference, typ ); return enumMember === void 0 || name === void 0 ? factory.createNumericLiteral(0) : factory.createPropertyAccessExpression(name, checker.symbolToString(enumMember)); } - if (type.flags & 256 /* NumberLiteral */) { + if (type.flags & 2048 /* NumberLiteral */) { return factory.createNumericLiteral(type.value); } - if (type.flags & 2048 /* BigIntLiteral */) { + if (type.flags & 4096 /* BigIntLiteral */) { return factory.createBigIntLiteral(type.value); } - if (type.flags & 128 /* StringLiteral */) { + if (type.flags & 1024 /* StringLiteral */) { return factory.createStringLiteral( type.value, /* isSingleQuote */ quotePreference === 0 /* Single */ ); } - if (type.flags & 512 /* BooleanLiteral */) { + if (type.flags & 8192 /* BooleanLiteral */) { return type === checker.getFalseType() || type === checker.getFalseType( /*fresh*/ true ) ? factory.createFalse() : factory.createTrue(); } - if (type.flags & 65536 /* Null */) { + if (type.flags & 8 /* Null */) { return factory.createNull(); } - if (type.flags & 1048576 /* Union */) { + if (type.flags & 134217728 /* Union */) { const expression = firstDefined(type.types, (t) => tryGetValueFromType(context, checker, importAdder, quotePreference, t, enclosingDeclaration)); return expression ?? createUndefined(); } @@ -161294,7 +161985,7 @@ function createUndefined() { return factory.createIdentifier("undefined"); } function isObjectLiteralType(type) { - return type.flags & 524288 /* Object */ && (getObjectFlags(type) & 128 /* ObjectLiteral */ || type.symbol && tryCast(singleOrUndefined(type.symbol.declarations), isTypeLiteralNode)); + return type.flags & 1048576 /* Object */ && (getObjectFlags(type) & 128 /* ObjectLiteral */ || type.symbol && tryCast(singleOrUndefined(type.symbol.declarations), isTypeLiteralNode)); } function getUnmatchedAttributes(checker, target, source) { const attrsType = checker.getContextualType(source.attributes); @@ -161639,6 +162330,8 @@ var errorCannotFindImplicitJsxImport = Diagnostics.This_JSX_tag_requires_the_mod var errorCodes31 = [ errorCodeCannotFindModule, Diagnostics.Could_not_find_a_declaration_file_for_module_0_1_implicitly_has_an_any_type.code, + Diagnostics.Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_node_Try_npm_i_save_dev_types_Slashnode.code, + Diagnostics.Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_node_Try_npm_i_save_dev_types_Slashnode_and_then_add_node_to_the_types_field_in_your_tsconfig.code, errorCannotFindImplicitJsxImport ]; registerCodeFix({ @@ -161689,7 +162382,13 @@ function tryGetImportedPackageName(sourceFile, pos) { } function getTypesPackageNameToInstall(packageName, host, diagCode) { var _a; - return diagCode === errorCodeCannotFindModule ? nodeCoreModules.has(packageName) ? "@types/node" : void 0 : ((_a = host.isKnownTypesPackageName) == null ? void 0 : _a.call(host, packageName)) ? getTypesPackageName(packageName) : void 0; + if (nodeCoreModules.has(packageName)) { + return "@types/node"; + } + if (diagCode !== errorCodeCannotFindModule) { + return ((_a = host.isKnownTypesPackageName) == null ? void 0 : _a.call(host, packageName)) ? getTypesPackageName(packageName) : void 0; + } + return void 0; } // src/services/codefixes/fixClassDoesntImplementInheritedAbstractMember.ts @@ -162691,7 +163390,7 @@ registerCodeFix({ const info = getInfo15(err.file, err.start, checker); if (!info) return; const { typeNode, type } = info; - const fixedType = typeNode.kind === 315 /* JSDocNullableType */ && fixId56 === fixIdNullable ? checker.getNullableType(type, 32768 /* Undefined */) : type; + const fixedType = typeNode.kind === 315 /* JSDocNullableType */ && fixId56 === fixIdNullable ? checker.getNullableType(type, 4 /* Undefined */) : type; doChange29(changes, sourceFile, typeNode, fixedType, checker); }); } @@ -162980,7 +163679,7 @@ function withContext(context, typePrintMode, cb) { } const variableDeclaration = findAncestor(targetNode, isVariableDeclaration); const type = variableDeclaration && typeChecker.getTypeAtLocation(variableDeclaration); - if (type && type.flags & 8192 /* UniqueESSymbol */) { + if (type && type.flags & 16384 /* UniqueESSymbol */) { return void 0; } if (!(isExpressionTarget || isShorthandPropertyAssignmentTarget)) return void 0; @@ -163461,7 +164160,7 @@ function withContext(context, typePrintMode, cb) { mutatedTarget: false }; function getFlags(type2) { - return (isVariableDeclaration(node) || isPropertyDeclaration(node) && hasSyntacticModifier(node, 256 /* Static */ | 8 /* Readonly */)) && type2.flags & 8192 /* UniqueESSymbol */ ? 1048576 /* AllowUniqueESSymbolType */ : 0 /* None */; + return (isVariableDeclaration(node) || isPropertyDeclaration(node) && hasSyntacticModifier(node, 256 /* Static */ | 8 /* Readonly */)) && type2.flags & 16384 /* UniqueESSymbol */ ? 1048576 /* AllowUniqueESSymbolType */ : 0 /* None */; } } function createTypeOfFromEntityNameExpression(node) { @@ -164441,7 +165140,7 @@ function inferTypeFromReferences(program, references, cancellationToken) { case 32 /* GreaterThanToken */: case 34 /* GreaterThanEqualsToken */: const operandType = checker.getTypeAtLocation(parent2.left === node ? parent2.right : parent2.left); - if (operandType.flags & 1056 /* EnumLike */) { + if (operandType.flags & 98304 /* EnumLike */) { addCandidateType(usage, operandType); } else { usage.isNumber = true; @@ -164450,11 +165149,11 @@ function inferTypeFromReferences(program, references, cancellationToken) { case 65 /* PlusEqualsToken */: case 40 /* PlusToken */: const otherOperandType = checker.getTypeAtLocation(parent2.left === node ? parent2.right : parent2.left); - if (otherOperandType.flags & 1056 /* EnumLike */) { + if (otherOperandType.flags & 98304 /* EnumLike */) { addCandidateType(usage, otherOperandType); - } else if (otherOperandType.flags & 296 /* NumberLike */) { + } else if (otherOperandType.flags & 67648 /* NumberLike */) { usage.isNumber = true; - } else if (otherOperandType.flags & 402653316 /* StringLike */) { + } else if (otherOperandType.flags & 12583968 /* StringLike */) { usage.isString = true; } else if (otherOperandType.flags & 1 /* Any */) { } else { @@ -164531,7 +165230,7 @@ function inferTypeFromReferences(program, references, cancellationToken) { const indexType = checker.getTypeAtLocation(parent2.argumentExpression); const indexUsage = createEmptyUsage(); calculateUsageOfNode(parent2, indexUsage); - if (indexType.flags & 296 /* NumberLike */) { + if (indexType.flags & 67648 /* NumberLike */) { usage.numberIndex = indexUsage; } else { usage.stringIndex = indexUsage; @@ -164569,11 +165268,11 @@ function inferTypeFromReferences(program, references, cancellationToken) { low: (t) => t === stringNumber }, { - high: (t) => !(t.flags & (1 /* Any */ | 16384 /* Void */)), - low: (t) => !!(t.flags & (1 /* Any */ | 16384 /* Void */)) + high: (t) => !(t.flags & (1 /* Any */ | 16 /* Void */)), + low: (t) => !!(t.flags & (1 /* Any */ | 16 /* Void */)) }, { - high: (t) => !(t.flags & (98304 /* Nullable */ | 1 /* Any */ | 16384 /* Void */)) && !(getObjectFlags(t) & 16 /* Anonymous */), + high: (t) => !(t.flags & (12 /* Nullable */ | 1 /* Any */ | 16 /* Void */)) && !(getObjectFlags(t) & 16 /* Anonymous */), low: (t) => !!(getObjectFlags(t) & 16 /* Anonymous */) } ]; @@ -164730,7 +165429,7 @@ function inferTypeFromReferences(program, references, cancellationToken) { function inferTypeParameters(genericType, usageType, typeParameter) { if (genericType === typeParameter) { return [usageType]; - } else if (genericType.flags & 3145728 /* UnionOrIntersection */) { + } else if (genericType.flags & 402653184 /* UnionOrIntersection */) { return flatMap(genericType.types, (t) => inferTypeParameters(t, usageType, typeParameter)); } else if (getObjectFlags(genericType) & 4 /* Reference */ && getObjectFlags(usageType) & 4 /* Reference */) { const genericArgs = checker.getTypeArguments(genericType); @@ -164813,12 +165512,12 @@ function inferTypeFromReferences(program, references, cancellationToken) { ); } function addCandidateType(usage, type) { - if (type && !(type.flags & 1 /* Any */) && !(type.flags & 131072 /* Never */)) { + if (type && !(type.flags & 1 /* Any */) && !(type.flags & 262144 /* Never */)) { (usage.candidateTypes || (usage.candidateTypes = [])).push(type); } } function addCandidateThisType(usage, type) { - if (type && !(type.flags & 1 /* Any */) && !(type.flags & 131072 /* Never */)) { + if (type && !(type.flags & 1 /* Any */) && !(type.flags & 262144 /* Never */)) { (usage.candidateThisTypes || (usage.candidateThisTypes = [])).push(type); } } @@ -165405,7 +166104,7 @@ function typeContainsTypeParameter(type) { if (type.isUnionOrIntersection()) { return type.types.some(typeContainsTypeParameter); } - return type.flags & 262144 /* TypeParameter */; + return type.flags & 524288 /* TypeParameter */; } function getArgumentTypesAndTypeParameters(checker, importAdder, instanceTypes, contextNode, scriptTarget, flags, internalFlags, tracker) { const argumentTypeNodes = []; @@ -165433,11 +166132,11 @@ function getArgumentTypesAndTypeParameters(checker, importAdder, instanceTypes, return { argumentTypeNodes, argumentTypeParameters: arrayFrom(argumentTypeParameters.entries()) }; } function isAnonymousObjectConstraintType(type) { - return type.flags & 524288 /* Object */ && type.objectFlags === 16 /* Anonymous */; + return type.flags & 1048576 /* Object */ && type.objectFlags === 16 /* Anonymous */; } function getFirstTypeParameterName(type) { var _a; - if (type.flags & (1048576 /* Union */ | 2097152 /* Intersection */)) { + if (type.flags & (134217728 /* Union */ | 268435456 /* Intersection */)) { for (const subType of type.types) { const subTypeName = getFirstTypeParameterName(subType); if (subTypeName) { @@ -165445,7 +166144,7 @@ function getFirstTypeParameterName(type) { } } } - return type.flags & 262144 /* TypeParameter */ ? (_a = type.getSymbol()) == null ? void 0 : _a.getName() : void 0; + return type.flags & 524288 /* TypeParameter */ ? (_a = type.getSymbol()) == null ? void 0 : _a.getName() : void 0; } function createDummyParameters(argCount, names, types, minArgumentCount, inJs) { const parameters = []; @@ -166072,7 +166771,7 @@ function getInitializer(checker, propertyDeclaration) { return getDefaultValueFromType(checker, checker.getTypeFromTypeNode(propertyDeclaration.type)); } function getDefaultValueFromType(checker, type) { - if (type.flags & 512 /* BooleanLiteral */) { + if (type.flags & 8192 /* BooleanLiteral */) { return type === checker.getFalseType() || type === checker.getFalseType( /*fresh*/ true @@ -166081,7 +166780,7 @@ function getDefaultValueFromType(checker, type) { return factory.createStringLiteral(type.value); } else if (type.isNumberLiteral()) { return factory.createNumericLiteral(type.value); - } else if (type.flags & 2048 /* BigIntLiteral */) { + } else if (type.flags & 4096 /* BigIntLiteral */) { return factory.createBigIntLiteral(type.value); } else if (type.isUnion()) { return firstDefined(type.types, (t) => getDefaultValueFromType(checker, t)); @@ -166705,6 +167404,7 @@ __export(ts_Completions_exports, { getCompletionEntryDetails: () => getCompletionEntryDetails, getCompletionEntrySymbol: () => getCompletionEntrySymbol, getCompletionsAtPosition: () => getCompletionsAtPosition, + getConstraintOfTypeArgumentProperty: () => getConstraintOfTypeArgumentProperty, getDefaultCommitCharacters: () => getDefaultCommitCharacters, getPropertiesForObjectExpression: () => getPropertiesForObjectExpression, moduleSpecifierResolutionCacheAttemptLimit: () => moduleSpecifierResolutionCacheAttemptLimit, @@ -166759,7 +167459,7 @@ var SymbolOriginInfoKind = /* @__PURE__ */ ((SymbolOriginInfoKind2) => { SymbolOriginInfoKind2[SymbolOriginInfoKind2["Ignore"] = 256] = "Ignore"; SymbolOriginInfoKind2[SymbolOriginInfoKind2["ComputedPropertyName"] = 512] = "ComputedPropertyName"; SymbolOriginInfoKind2[SymbolOriginInfoKind2["SymbolMemberNoExport"] = 2 /* SymbolMember */] = "SymbolMemberNoExport"; - SymbolOriginInfoKind2[SymbolOriginInfoKind2["SymbolMemberExport"] = 6] = "SymbolMemberExport"; + SymbolOriginInfoKind2[SymbolOriginInfoKind2["SymbolMemberExport"] = 34] = "SymbolMemberExport"; return SymbolOriginInfoKind2; })(SymbolOriginInfoKind || {}); function originIsThisType(origin) { @@ -166772,7 +167472,7 @@ function originIsExport(origin) { return !!(origin && origin.kind & 4 /* Export */); } function originIsResolvedExport(origin) { - return !!(origin && origin.kind === 32 /* ResolvedExport */); + return !!(origin && origin.kind & 32 /* ResolvedExport */); } function originIncludesSymbolName(origin) { return originIsExport(origin) || originIsResolvedExport(origin) || originIsComputedPropertyName(origin); @@ -167246,7 +167946,7 @@ function getJSDocParamAnnotation(paramName, initializer, dotDotDotToken, isJs, i } else { if (initializer) { const inferredType = checker.getTypeAtLocation(initializer.parent); - if (!(inferredType.flags & (1 /* Any */ | 16384 /* Void */))) { + if (!(inferredType.flags & (1 /* Any */ | 16 /* Void */))) { const sourceFile = initializer.getSourceFile(); const quotePreference = getQuotePreference(sourceFile, preferences); const builderFlags = quotePreference === 0 /* Single */ ? 268435456 /* UseSingleQuotesForStringLiteralType */ : 0 /* None */; @@ -167478,7 +168178,7 @@ function getExhaustiveCaseSnippets(caseBlock, sourceFile, preferences, options, const importAdder = ts_codefix_exports.createImportAdder(sourceFile, program, preferences, host); const elements = []; for (const type of switchType.types) { - if (type.flags & 1024 /* EnumLiteral */) { + if (type.flags & 32768 /* EnumLiteral */) { Debug.assert(type.symbol, "An enum member type should have a symbol"); Debug.assert(type.symbol.parent, "An enum member type should have a parent symbol (the enum symbol)"); const enumValue = type.symbol.valueDeclaration && checker.getConstantValue(type.symbol.valueDeclaration); @@ -167606,7 +168306,7 @@ function getJsxClosingTagCompletion(location, sourceFile) { switch (node.kind) { case 288 /* JsxClosingElement */: return true; - case 31 /* LessThanSlashToken */: + case 44 /* SlashToken */: case 32 /* GreaterThanToken */: case 80 /* Identifier */: case 212 /* PropertyAccessExpression */: @@ -167772,8 +168472,8 @@ function createCompletionEntry(symbol, sortText, replacementToken, contextToken, if (isJsxIdentifierExpected && !isRightOfOpenTag && preferences.includeCompletionsWithSnippetText && preferences.jsxAttributeCompletionStyle && preferences.jsxAttributeCompletionStyle !== "none" && !(isJsxAttribute(location.parent) && location.parent.initializer)) { let useBraces2 = preferences.jsxAttributeCompletionStyle === "braces"; const type = typeChecker.getTypeOfSymbolAtLocation(symbol, location); - if (preferences.jsxAttributeCompletionStyle === "auto" && !(type.flags & 528 /* BooleanLike */) && !(type.flags & 1048576 /* Union */ && find(type.types, (type2) => !!(type2.flags & 528 /* BooleanLike */)))) { - if (type.flags & 402653316 /* StringLike */ || type.flags & 1048576 /* Union */ && every(type.types, (type2) => !!(type2.flags & (402653316 /* StringLike */ | 32768 /* Undefined */) || isStringAndEmptyAnonymousObjectIntersection(type2)))) { + if (preferences.jsxAttributeCompletionStyle === "auto" && !(type.flags & 8448 /* BooleanLike */) && !(type.flags & 134217728 /* Union */ && find(type.types, (type2) => !!(type2.flags & 8448 /* BooleanLike */)))) { + if (type.flags & 12583968 /* StringLike */ || type.flags & 134217728 /* Union */ && every(type.types, (type2) => !!(type2.flags & (12583968 /* StringLike */ | 4 /* Undefined */) || isStringAndEmptyAnonymousObjectIntersection(type2)))) { insertText = `${escapeSnippetText(name)}=${quote(sourceFile, preferences, "$1")}`; isSnippet = true; } else { @@ -168080,8 +168780,8 @@ function createObjectLiteralMethod(symbol, enclosingDeclaration, sourceFile, pro case 173 /* PropertyDeclaration */: case 174 /* MethodSignature */: case 175 /* MethodDeclaration */: { - let effectiveType = type.flags & 1048576 /* Union */ && type.types.length < 10 ? checker.getUnionType(type.types, 2 /* Subtype */) : type; - if (effectiveType.flags & 1048576 /* Union */) { + let effectiveType = type.flags & 134217728 /* Union */ && type.types.length < 10 ? checker.getUnionType(type.types, 2 /* Subtype */) : type; + if (effectiveType.flags & 134217728 /* Union */) { const functionTypes = filter(effectiveType.types, (type2) => checker.getSignaturesOfType(type2, 0 /* Call */).length > 0); if (functionTypes.length === 1) { effectiveType = functionTypes[0]; @@ -168349,12 +169049,12 @@ function isRecommendedCompletionMatch(localSymbol, recommendedCompletion, checke return localSymbol === recommendedCompletion || !!(localSymbol.flags & 1048576 /* ExportValue */) && checker.getExportSymbolOfSymbol(localSymbol) === recommendedCompletion; } function getSourceFromOrigin(origin) { - if (originIsExport(origin)) { - return stripQuotes(origin.moduleSymbol.name); - } if (originIsResolvedExport(origin)) { return origin.moduleSpecifier; } + if (originIsExport(origin)) { + return stripQuotes(origin.moduleSymbol.name); + } if ((origin == null ? void 0 : origin.kind) === 1 /* ThisType */) { return "ThisProperty/" /* ThisProperty */; } @@ -168793,7 +169493,7 @@ function getContextualType(previousToken, position, sourceFile, checker) { return argInfo ? checker.getContextualTypeForArgumentAtIndex(argInfo.invocation, argInfo.argumentIndex) : isEqualityOperatorKind(previousToken.kind) && isBinaryExpression(parent2) && isEqualityOperatorKind(parent2.operatorToken.kind) ? ( // completion at `x ===/**/` should be for the right side checker.getTypeAtLocation(parent2.left) - ) : checker.getContextualType(previousToken, 4 /* Completions */) || checker.getContextualType(previousToken); + ) : checker.getContextualType(previousToken, 4 /* IgnoreNodeInferences */) || checker.getContextualType(previousToken); } } function getFirstSymbolInChain(symbol, enclosingDeclaration, checker) { @@ -168942,7 +169642,7 @@ function getCompletionData(program, log, sourceFile, compilerOptions, position, location = currentToken; } break; - case 31 /* LessThanSlashToken */: + case 44 /* SlashToken */: if (currentToken.parent.kind === 286 /* JsxSelfClosingElement */) { location = currentToken; } @@ -168951,7 +169651,7 @@ function getCompletionData(program, log, sourceFile, compilerOptions, position, } switch (parent2.kind) { case 288 /* JsxClosingElement */: - if (contextToken.kind === 31 /* LessThanSlashToken */) { + if (contextToken.kind === 44 /* SlashToken */) { isStartingCloseTag = true; location = contextToken; } @@ -169029,13 +169729,13 @@ function getCompletionData(program, log, sourceFile, compilerOptions, position, } } log("getCompletionData: Semantic work: " + (timestamp() - semanticStart)); - const contextualType = previousToken && getContextualType(previousToken, position, sourceFile, typeChecker); + const contextualTypeOrConstraint = previousToken && (getContextualType(previousToken, position, sourceFile, typeChecker) ?? getConstraintOfTypeArgumentProperty(previousToken, typeChecker)); const isLiteralExpected = !tryCast(previousToken, isStringLiteralLike) && !isJsxIdentifierExpected; const literals = !isLiteralExpected ? [] : mapDefined( - contextualType && (contextualType.isUnion() ? contextualType.types : [contextualType]), - (t) => t.isLiteral() && !(t.flags & 1024 /* EnumLiteral */) ? t.value : void 0 + contextualTypeOrConstraint && (contextualTypeOrConstraint.isUnion() ? contextualTypeOrConstraint.types : [contextualTypeOrConstraint]), + (t) => t.isLiteral() && !(t.flags & 32768 /* EnumLiteral */) ? t.value : void 0 ); - const recommendedCompletion = previousToken && contextualType && getRecommendedCompletion(previousToken, contextualType, typeChecker); + const recommendedCompletion = previousToken && contextualTypeOrConstraint && getRecommendedCompletion(previousToken, contextualTypeOrConstraint, typeChecker); return { kind: 0 /* Data */, symbols, @@ -169238,7 +169938,7 @@ function getCompletionData(program, log, sourceFile, compilerOptions, position, ) || {}; if (moduleSpecifier) { const origin = { - kind: getNullableSymbolOriginInfoKind(6 /* SymbolMemberExport */), + kind: getNullableSymbolOriginInfoKind(34 /* SymbolMemberExport */), moduleSymbol, isDefaultExport: false, symbolName: firstAccessibleSymbol.name, @@ -169298,7 +169998,7 @@ function getCompletionData(program, log, sourceFile, compilerOptions, position, const jsxContainer = tryGetContainingJsxElement(contextToken); const attrsType = jsxContainer && typeChecker.getContextualType(jsxContainer.attributes); if (!attrsType) return 0 /* Continue */; - const completionsType = jsxContainer && typeChecker.getContextualType(jsxContainer.attributes, 4 /* Completions */); + const completionsType = jsxContainer && typeChecker.getContextualType(jsxContainer.attributes, 4 /* IgnoreNodeInferences */); symbols = concatenate(symbols, filterJsxAttributes(getPropertiesForObjectExpression(attrsType, completionsType, jsxContainer.attributes, typeChecker), jsxContainer.attributes.properties)); setSortTextToOptionalMember(); completionKind = 3 /* MemberLike */; @@ -169442,9 +170142,6 @@ function getCompletionData(program, log, sourceFile, compilerOptions, position, return charactersFuzzyMatchInString(symbolName2, lowerCaseTokenText); }, (info, symbolName2, isFromAmbientModule, exportMapKey) => { - if (detailsEntryId && !some(info, (i) => detailsEntryId.source === stripQuotes(i.moduleSymbol.name))) { - return; - } info = filter(info, isImportableExportInfo); if (!info.length) { return; @@ -169455,6 +170152,9 @@ function getCompletionData(program, log, sourceFile, compilerOptions, position, if (result !== "skipped") { ({ exportInfo: exportInfo2 = info[0], moduleSpecifier } = result); } + if (detailsEntryId && (detailsEntryId.source !== moduleSpecifier && !some(info, (i) => detailsEntryId.source === stripQuotes(i.moduleSymbol.name)))) { + return; + } const isDefaultExport = exportInfo2.exportKind === 1 /* Default */; const symbol = isDefaultExport && getLocalSymbolForExportDefault(Debug.checkDefined(exportInfo2.symbol)) || Debug.checkDefined(exportInfo2.symbol); pushAutoImportSymbol(symbol, { @@ -169725,7 +170425,7 @@ function getCompletionData(program, log, sourceFile, compilerOptions, position, } return 0 /* Continue */; } - const completionsType = typeChecker.getContextualType(objectLikeContainer, 4 /* Completions */); + const completionsType = typeChecker.getContextualType(objectLikeContainer, 4 /* IgnoreNodeInferences */); const hasStringIndexType = (completionsType || instantiatedType).getStringIndexType(); const hasNumberIndextype = (completionsType || instantiatedType).getNumberIndexType(); isNewIdentifierLocation = !!hasStringIndexType || !!hasNumberIndextype; @@ -170444,7 +171144,7 @@ function getPropertiesForObjectExpression(contextualType, completionsType, obj, const hasCompletionsType = completionsType && completionsType !== contextualType; const promiseFilteredContextualType = checker.getUnionType( filter( - contextualType.flags & 1048576 /* Union */ ? contextualType.types : [contextualType], + contextualType.flags & 134217728 /* Union */ ? contextualType.types : [contextualType], (t) => !checker.getPromisedTypeOfPromise(t) ) ); @@ -170458,7 +171158,7 @@ function getPropertiesForObjectExpression(contextualType, completionsType, obj, } function getApparentProperties(type, node, checker) { if (!type.isUnion()) return type.getApparentProperties(); - return checker.getAllPossiblePropertiesOfTypes(filter(type.types, (memberType) => !(memberType.flags & 402784252 /* Primitive */ || checker.isArrayLikeType(memberType) || checker.isTypeInvalidDueToUnionDiscriminant(memberType, node) || checker.typeHasCallOrConstructSignatures(memberType) || memberType.isClass() && containsNonPublicProperties(memberType.getApparentProperties())))); + return checker.getAllPossiblePropertiesOfTypes(filter(type.types, (memberType) => !(memberType.flags & 12713980 /* Primitive */ || checker.isArrayLikeType(memberType) || checker.isTypeInvalidDueToUnionDiscriminant(memberType, node) || checker.typeHasCallOrConstructSignatures(memberType) || memberType.isClass() && containsNonPublicProperties(memberType.getApparentProperties())))); } function containsNonPublicProperties(props) { return some(props, (p) => !!(getDeclarationModifierFlagsFromSymbol(p) & 6 /* NonPublicAccessibilityModifier */)); @@ -170541,18 +171241,26 @@ function tryGetTypeLiteralNode(node) { } function getConstraintOfTypeArgumentProperty(node, checker) { if (!node) return void 0; - if (isTypeNode(node) && isTypeReferenceType(node.parent)) { - return checker.getTypeArgumentConstraint(node); + if (isTypeNode(node)) { + const constraint = checker.getTypeArgumentConstraint(node); + if (constraint) return constraint; } const t = getConstraintOfTypeArgumentProperty(node.parent, checker); if (!t) return void 0; switch (node.kind) { case 172 /* PropertySignature */: return checker.getTypeOfPropertyOfContextualType(t, node.symbol.escapedName); + case 59 /* ColonToken */: + if (node.parent.kind === 172 /* PropertySignature */) { + return t; + } + break; case 194 /* IntersectionType */: case 188 /* TypeLiteral */: case 193 /* UnionType */: return t; + case 23 /* OpenBracketToken */: + return checker.getElementTypeOfArrayType(t); } } function isFromObjectTypeDeclaration(node) { @@ -170572,7 +171280,7 @@ function isValidTrigger(sourceFile, triggerCharacter, contextToken, position) { case "<": return !!contextToken && contextToken.kind === 30 /* LessThanToken */ && (!isBinaryExpression(contextToken.parent) || binaryExpressionMayBeOpenTag(contextToken.parent)); case "/": - return !!contextToken && (isStringLiteralLike(contextToken) ? !!tryGetImportFromModuleSpecifier(contextToken) : contextToken.kind === 31 /* LessThanSlashToken */ && isJsxClosingElement(contextToken.parent)); + return !!contextToken && (isStringLiteralLike(contextToken) ? !!tryGetImportFromModuleSpecifier(contextToken) : contextToken.kind === 44 /* SlashToken */ && isJsxClosingElement(contextToken.parent)); case " ": return !!contextToken && isImportKeyword(contextToken) && contextToken.parent.kind === 308 /* SourceFile */; default: @@ -171014,7 +171722,15 @@ function getStringLiteralCompletionEntries(sourceFile, node, position, program, if (isObjectLiteralExpression(parent2.parent) && parent2.name === node) { return stringLiteralCompletionsForObjectLiteral(typeChecker, parent2.parent); } - return fromContextualType() || fromContextualType(0 /* None */); + if (findAncestor(parent2.parent, isCallLikeExpression)) { + const uniques2 = /* @__PURE__ */ new Set(); + const stringLiteralTypes = concatenate( + getStringLiteralTypes(typeChecker.getContextualType(node, 0 /* None */), uniques2), + getStringLiteralTypes(typeChecker.getContextualType(node, 4 /* IgnoreNodeInferences */), uniques2) + ); + return toStringLiteralCompletionsFromTypes(stringLiteralTypes); + } + return fromContextualType(0 /* None */); case 213 /* ElementAccessExpression */: { const { expression, argumentExpression } = parent2; if (node === skipParentheses(argumentExpression)) { @@ -171074,7 +171790,12 @@ function getStringLiteralCompletionEntries(sourceFile, node, position, program, } function fromUnionableLiteralType(grandParent) { switch (grandParent.kind) { + case 214 /* CallExpression */: case 234 /* ExpressionWithTypeArguments */: + case 287 /* JsxOpeningElement */: + case 286 /* JsxSelfClosingElement */: + case 215 /* NewExpression */: + case 216 /* TaggedTemplateExpression */: case 184 /* TypeReference */: { const typeArgument = findAncestor(parent2, (n) => n.parent === grandParent); if (typeArgument) { @@ -171088,6 +171809,8 @@ function getStringLiteralCompletionEntries(sourceFile, node, position, program, return void 0; } return stringLiteralCompletionsFromProperties(typeChecker.getTypeFromTypeNode(objectType)); + case 172 /* PropertySignature */: + return { kind: 2 /* Types */, types: getStringLiteralTypes(getConstraintOfTypeArgumentProperty(grandParent, typeChecker)), isNewIdentifier: false }; case 193 /* UnionType */: { const result = fromUnionableLiteralType(walkUpParentheses(grandParent.parent)); if (!result) { @@ -171103,14 +171826,13 @@ function getStringLiteralCompletionEntries(sourceFile, node, position, program, return void 0; } } - function fromContextualType(contextFlags = 4 /* Completions */) { - const types = getStringLiteralTypes(getContextualTypeFromParent(node, typeChecker, contextFlags)); - if (!types.length) { - return; - } - return { kind: 2 /* Types */, types, isNewIdentifier: false }; + function fromContextualType(contextFlags = 4 /* IgnoreNodeInferences */) { + return toStringLiteralCompletionsFromTypes(getStringLiteralTypes(getContextualTypeFromParent(node, typeChecker, contextFlags))); } } +function toStringLiteralCompletionsFromTypes(types) { + return types.length ? { kind: 2 /* Types */, types, isNewIdentifier: false } : void 0; +} function walkUpParentheses(node) { switch (node.kind) { case 197 /* ParenthesizedType */: @@ -171138,7 +171860,7 @@ function getStringLiteralCompletionsFromSignature(call, arg, argumentInfo, check type = propType; } } - isNewIdentifier = isNewIdentifier || !!(type.flags & 4 /* String */); + isNewIdentifier = isNewIdentifier || !!(type.flags & 32 /* String */); return getStringLiteralTypes(type, uniques); }); return length(types) ? { kind: 2 /* Types */, types, isNewIdentifier } : void 0; @@ -171153,7 +171875,7 @@ function stringLiteralCompletionsFromProperties(type) { function stringLiteralCompletionsForObjectLiteral(checker, objectLiteralExpression) { const contextualType = checker.getContextualType(objectLiteralExpression); if (!contextualType) return void 0; - const completionsType = checker.getContextualType(objectLiteralExpression, 4 /* Completions */); + const completionsType = checker.getContextualType(objectLiteralExpression, 4 /* IgnoreNodeInferences */); const symbols = getPropertiesForObjectExpression( contextualType, completionsType, @@ -171169,7 +171891,7 @@ function stringLiteralCompletionsForObjectLiteral(checker, objectLiteralExpressi function getStringLiteralTypes(type, uniques = /* @__PURE__ */ new Set()) { if (!type) return emptyArray; type = skipConstraint(type); - return type.isUnion() ? flatMap(type.types, (t) => getStringLiteralTypes(t, uniques)) : type.isStringLiteral() && !(type.flags & 1024 /* EnumLiteral */) && addToSeen(uniques, type.value) ? [type] : emptyArray; + return type.isUnion() ? flatMap(type.types, (t) => getStringLiteralTypes(t, uniques)) : type.isStringLiteral() && !(type.flags & 32768 /* EnumLiteral */) && addToSeen(uniques, type.value) ? [type] : emptyArray; } function nameAndKind(name, kind, extension) { return { name, kind, extension }; @@ -171545,7 +172267,7 @@ function getCompletionEntriesForNonRelativeModules(fragment, scriptPath, mode, p if (tryFileExists(host, packageFile)) { const packageJson = readJson(packageFile, host); const fragmentSubpath = components.join("/") + (components.length && hasTrailingDirectorySeparator(fragment) ? "/" : ""); - exportsOrImportsLookup( + if (exportsOrImportsLookup( packageJson.exports, fragmentSubpath, packageDirectory, @@ -171553,8 +172275,9 @@ function getCompletionEntriesForNonRelativeModules(fragment, scriptPath, mode, p true, /*isImports*/ false - ); - return; + )) { + return; + } } return nodeModulesDirectoryOrImportsLookup(ancestor); }; @@ -171565,7 +172288,7 @@ function getCompletionEntriesForNonRelativeModules(fragment, scriptPath, mode, p return arrayFrom(result.values()); function exportsOrImportsLookup(lookupTable, fragment2, baseDirectory, isExports, isImports) { if (typeof lookupTable !== "object" || lookupTable === null) { - return; + return lookupTable !== void 0; } const keys = getOwnKeys(lookupTable); const conditions = getConditions(compilerOptions, mode); @@ -171589,6 +172312,7 @@ function getCompletionEntriesForNonRelativeModules(fragment, scriptPath, mode, p }, comparePatternKeys ); + return true; } } function getPatternFromFirstMatchingCondition(target, conditions) { @@ -174446,13 +175170,29 @@ function getDefinitionFromObjectLiteralElement(typeChecker, node) { if (element) { const contextualType = element && typeChecker.getContextualType(element.parent); if (contextualType) { - return flatMap(getPropertySymbolsFromContextualType( + let properties = getPropertySymbolsFromContextualType( element, typeChecker, contextualType, /*unionSymbolOk*/ false - ), (propertySymbol) => getDefinitionFromSymbol(typeChecker, propertySymbol, node)); + ); + if (some(properties, (p) => !!(p.valueDeclaration && isObjectLiteralExpression(p.valueDeclaration.parent) && isObjectLiteralElementLike(p.valueDeclaration) && p.valueDeclaration.name === node))) { + const withoutNodeInferencesType = typeChecker.getContextualType(element.parent, 4 /* IgnoreNodeInferences */); + if (withoutNodeInferencesType) { + const withoutNodeInferencesProperties = getPropertySymbolsFromContextualType( + element, + typeChecker, + withoutNodeInferencesType, + /*unionSymbolOk*/ + false + ); + if (withoutNodeInferencesProperties.length) { + properties = withoutNodeInferencesProperties; + } + } + } + return flatMap(properties, (propertySymbol) => getDefinitionFromSymbol(typeChecker, propertySymbol, node)); } } return emptyArray; @@ -174625,7 +175365,7 @@ function getTypeDefinitionAtPosition(typeChecker, sourceFile, position) { return typeDefinitions.length ? [...getFirstTypeArgumentDefinitions(typeChecker, resolvedType, node, failedAliasResolution), ...typeDefinitions] : !(symbol.flags & 111551 /* Value */) && symbol.flags & 788968 /* Type */ ? getDefinitionFromSymbol(typeChecker, skipAlias(symbol, typeChecker), node, failedAliasResolution) : void 0; } function definitionFromType(type, checker, node, failedAliasResolution) { - return flatMap(type.isUnion() && !(type.flags & 32 /* Enum */) ? type.types : [type], (t) => t.symbol && getDefinitionFromSymbol(checker, t.symbol, node, failedAliasResolution)); + return flatMap(type.isUnion() && !(type.flags & 65536 /* Enum */) ? type.types : [type], (t) => t.symbol && getDefinitionFromSymbol(checker, t.symbol, node, failedAliasResolution)); } function tryGetReturnTypeOfFunction(symbol, type, checker) { if (type.symbol === symbol || // At `const f = () => {}`, the symbol is `f` and the type symbol is at `() => {}` @@ -175277,6 +176017,7 @@ function provideInlayHints(context) { Debug.assertNode(node2, isTypeParameterDeclaration); if (node2.modifiers) { visitDisplayPartList(node2.modifiers, " "); + parts.push({ text: " " }); } visitForDisplayParts(node2.name); if (node2.constraint) { @@ -175292,6 +176033,7 @@ function provideInlayHints(context) { Debug.assertNode(node2, isParameter); if (node2.modifiers) { visitDisplayPartList(node2.modifiers, " "); + parts.push({ text: " " }); } if (node2.dotDotDotToken) { parts.push({ text: "..." }); @@ -177345,7 +178087,7 @@ function getRenameInfoForNode(node, typeChecker, sourceFile, program, preference if (!symbol) { if (isStringLiteralLike(node)) { const type = getContextualTypeFromParentOrAncestorTypeNode(node, typeChecker); - if (type && (type.flags & 128 /* StringLiteral */ || type.flags & 1048576 /* Union */ && every(type.types, (type2) => !!(type2.flags & 128 /* StringLiteral */)))) { + if (type && (type.flags & 1024 /* StringLiteral */ || type.flags & 134217728 /* Union */ && every(type.types, (type2) => !!(type2.flags & 1024 /* StringLiteral */)))) { return getRenameInfoSuccess(node.text, node.text, "string" /* string */, "", node, sourceFile); } } else if (isLabelName(node)) { @@ -183458,6 +184200,7 @@ __export(ts_exports2, { canHaveLocals: () => canHaveLocals, canHaveModifiers: () => canHaveModifiers, canHaveModuleSpecifier: () => canHaveModuleSpecifier, + canHaveStatements: () => canHaveStatements, canHaveSymbol: () => canHaveSymbol, canIncludeBindAndCheckDiagnostics: () => canIncludeBindAndCheckDiagnostics, canJsonReportNoInputFiles: () => canJsonReportNoInputFiles, @@ -183505,6 +184248,7 @@ __export(ts_exports2, { commonOptionsWithBuild: () => commonOptionsWithBuild, compact: () => compact, compareBooleans: () => compareBooleans, + compareComparableValues: () => compareComparableValues, compareDataObjects: () => compareDataObjects, compareDiagnostics: () => compareDiagnostics, compareEmitHelpers: () => compareEmitHelpers, @@ -183850,6 +184594,7 @@ __export(ts_exports2, { getAllowImportingTsExtensions: () => getAllowImportingTsExtensions, getAllowJSCompilerOption: () => getAllowJSCompilerOption, getAllowSyntheticDefaultImports: () => getAllowSyntheticDefaultImports, + getAlwaysStrict: () => getAlwaysStrict, getAncestor: () => getAncestor, getAnyExtensionFromPath: () => getAnyExtensionFromPath, getAreDeclarationMapsEnabled: () => getAreDeclarationMapsEnabled, @@ -183879,6 +184624,7 @@ __export(ts_exports2, { getCommonSourceDirectory: () => getCommonSourceDirectory, getCommonSourceDirectoryOfConfig: () => getCommonSourceDirectoryOfConfig, getCompilerOptionValue: () => getCompilerOptionValue, + getComputedCommonSourceDirectory: () => getComputedCommonSourceDirectory, getConditions: () => getConditions, getConfigFileParsingDiagnostics: () => getConfigFileParsingDiagnostics, getConstantValue: () => getConstantValue, @@ -184088,6 +184834,7 @@ __export(ts_exports2, { getModuleInstanceState: () => getModuleInstanceState, getModuleNameStringLiteralAt: () => getModuleNameStringLiteralAt, getModuleSpecifierEndingPreference: () => getModuleSpecifierEndingPreference, + getModuleSpecifierOfBareOrAccessedRequire: () => getModuleSpecifierOfBareOrAccessedRequire, getModuleSpecifierResolverHost: () => getModuleSpecifierResolverHost, getNameForExportedSymbol: () => getNameForExportedSymbol, getNameFromImportAttribute: () => getNameFromImportAttribute, @@ -184118,7 +184865,6 @@ __export(ts_exports2, { getNonAugmentationDeclaration: () => getNonAugmentationDeclaration, getNonDecoratorTokenPosOfNode: () => getNonDecoratorTokenPosOfNode, getNonIncrementalBuildInfoRoots: () => getNonIncrementalBuildInfoRoots, - getNonModifierTokenPosOfNode: () => getNonModifierTokenPosOfNode, getNormalizedAbsolutePath: () => getNormalizedAbsolutePath, getNormalizedAbsolutePathWithoutRoot: () => getNormalizedAbsolutePathWithoutRoot, getNormalizedPathComponents: () => getNormalizedPathComponents, @@ -184849,6 +185595,7 @@ __export(ts_exports2, { isPlusToken: () => isPlusToken, isPossiblyTypeArgumentPosition: () => isPossiblyTypeArgumentPosition, isPostfixUnaryExpression: () => isPostfixUnaryExpression, + isPotentiallyExecutableNode: () => isPotentiallyExecutableNode, isPrefixUnaryExpression: () => isPrefixUnaryExpression, isPrimitiveLiteralValue: () => isPrimitiveLiteralValue, isPrivateIdentifier: () => isPrivateIdentifier, @@ -185451,9 +186198,7 @@ __export(ts_exports2, { unmangleScopedPackageName: () => unmangleScopedPackageName, unorderedRemoveItem: () => unorderedRemoveItem, unprefixedNodeCoreModules: () => unprefixedNodeCoreModules, - unreachableCodeIsError: () => unreachableCodeIsError, unsetNodeChildren: () => unsetNodeChildren, - unusedLabelIsError: () => unusedLabelIsError, unwrapInnermostStatementOfLabel: () => unwrapInnermostStatementOfLabel, unwrapParenthesizedExpression: () => unwrapParenthesizedExpression, updateErrorForNoInputFiles: () => updateErrorForNoInputFiles, @@ -185463,6 +186208,7 @@ __export(ts_exports2, { updateSharedExtendedConfigFileWatcher: () => updateSharedExtendedConfigFileWatcher, updateSourceFile: () => updateSourceFile, updateWatchingWildcardDirectories: () => updateWatchingWildcardDirectories, + usesWildcardTypes: () => usesWildcardTypes, usingSingleLineStringWriter: () => usingSingleLineStringWriter, utf16EncodeAsString: () => utf16EncodeAsString, validateLocaleAndSetLanguage: () => validateLocaleAndSetLanguage, @@ -185827,7 +186573,7 @@ var TypingsInstaller = class { } const discoverTypingsResult = ts_JsTyping_exports.discoverTypings( this.installTypingHost, - this.log.isEnabled() ? (s) => this.log.writeLine(s) : void 0, + this.log.isEnabled() ? ((s) => this.log.writeLine(s)) : void 0, req.fileNames, req.projectRootPath, this.safeList, @@ -186486,9 +187232,11 @@ var ScriptTarget11 = /* @__PURE__ */ ((ScriptTarget12) => { ScriptTarget12["ES2022"] = "es2022"; ScriptTarget12["ES2023"] = "es2023"; ScriptTarget12["ES2024"] = "es2024"; + ScriptTarget12["ES2025"] = "es2025"; ScriptTarget12["ESNext"] = "esnext"; ScriptTarget12["JSON"] = "json"; ScriptTarget12["Latest"] = "esnext" /* ESNext */; + ScriptTarget12["LatestStandard"] = "es2025" /* ES2025 */; return ScriptTarget12; })(ScriptTarget11 || {}); { @@ -187998,6 +188746,9 @@ var Project2 = class _Project { } /** @internal */ watchTypingLocations(files) { + if (this.currentDirectory === this.projectService.currentDirectory || !canWatchDirectoryOrFilePath(this.toPath(this.currentDirectory))) { + return; + } if (!files) { this.typingWatchers.isInvoked = false; return; @@ -188066,6 +188817,15 @@ var Project2 = class _Project { }); } /** @internal */ + skipWatchingFailedLookups(path) { + const info = this.projectService.getScriptInfoForPath(path); + return info == null ? void 0 : info.isDynamic; + } + /** @internal */ + skipWatchingTypeRoots() { + return isInferredProject(this) && this.currentDirectory === this.projectService.currentDirectory; + } + /** @internal */ getCurrentProgram() { return this.program; } @@ -189463,6 +190223,9 @@ function convertCompilerOptions(protocolOptions) { protocolOptions[id] = mappedValues.get(propertyValue.toLowerCase()); } }); + if (isArray(protocolOptions.lib)) { + protocolOptions.lib = protocolOptions.lib.map((libName) => libMap.get(libName) ?? libName); + } return protocolOptions; } function convertWatchOptions(protocolOptions, currentDirectory) { @@ -190039,7 +190802,7 @@ var _ProjectService = class _ProjectService { this ); const watchLogLevel = this.logger.hasLevel(3 /* verbose */) ? 2 /* Verbose */ : this.logger.loggingEnabled() ? 1 /* TriggerOnly */ : 0 /* None */; - const log = watchLogLevel !== 0 /* None */ ? (s) => this.logger.info(s) : noop; + const log = watchLogLevel !== 0 /* None */ ? ((s) => this.logger.info(s)) : noop; this.packageJsonCache = createPackageJsonCache(this); this.watchFactory = this.serverMode !== 0 /* Semantic */ ? { watchFile: returnNoopFileWatcher, @@ -190503,7 +191266,7 @@ var _ProjectService = class _ProjectService { useCaseSensitiveFileNames: this.host.useCaseSensitiveFileNames, writeLog: (s) => this.logger.info(s), toPath: (s) => this.toPath(s), - getScriptKind: configuredProjectForConfig ? (fileName) => configuredProjectForConfig.getScriptKind(fileName) : void 0 + getScriptKind: configuredProjectForConfig ? ((fileName) => configuredProjectForConfig.getScriptKind(fileName)) : void 0 })) return; if (config.updateLevel !== 2 /* Full */) config.updateLevel = 1 /* RootNamesAndUpdate */; config.projects.forEach((watchWildcardDirectories, projectCanonicalPath) => { @@ -198219,6 +198982,7 @@ if (typeof console !== "undefined") { canHaveLocals, canHaveModifiers, canHaveModuleSpecifier, + canHaveStatements, canHaveSymbol, canIncludeBindAndCheckDiagnostics, canJsonReportNoInputFiles, @@ -198266,6 +199030,7 @@ if (typeof console !== "undefined") { commonOptionsWithBuild, compact, compareBooleans, + compareComparableValues, compareDataObjects, compareDiagnostics, compareEmitHelpers, @@ -198611,6 +199376,7 @@ if (typeof console !== "undefined") { getAllowImportingTsExtensions, getAllowJSCompilerOption, getAllowSyntheticDefaultImports, + getAlwaysStrict, getAncestor, getAnyExtensionFromPath, getAreDeclarationMapsEnabled, @@ -198640,6 +199406,7 @@ if (typeof console !== "undefined") { getCommonSourceDirectory, getCommonSourceDirectoryOfConfig, getCompilerOptionValue, + getComputedCommonSourceDirectory, getConditions, getConfigFileParsingDiagnostics, getConstantValue, @@ -198849,6 +199616,7 @@ if (typeof console !== "undefined") { getModuleInstanceState, getModuleNameStringLiteralAt, getModuleSpecifierEndingPreference, + getModuleSpecifierOfBareOrAccessedRequire, getModuleSpecifierResolverHost, getNameForExportedSymbol, getNameFromImportAttribute, @@ -198879,7 +199647,6 @@ if (typeof console !== "undefined") { getNonAugmentationDeclaration, getNonDecoratorTokenPosOfNode, getNonIncrementalBuildInfoRoots, - getNonModifierTokenPosOfNode, getNormalizedAbsolutePath, getNormalizedAbsolutePathWithoutRoot, getNormalizedPathComponents, @@ -199610,6 +200377,7 @@ if (typeof console !== "undefined") { isPlusToken, isPossiblyTypeArgumentPosition, isPostfixUnaryExpression, + isPotentiallyExecutableNode, isPrefixUnaryExpression, isPrimitiveLiteralValue, isPrivateIdentifier, @@ -200212,9 +200980,7 @@ if (typeof console !== "undefined") { unmangleScopedPackageName, unorderedRemoveItem, unprefixedNodeCoreModules, - unreachableCodeIsError, unsetNodeChildren, - unusedLabelIsError, unwrapInnermostStatementOfLabel, unwrapParenthesizedExpression, updateErrorForNoInputFiles, @@ -200224,6 +200990,7 @@ if (typeof console !== "undefined") { updateSharedExtendedConfigFileWatcher, updateSourceFile, updateWatchingWildcardDirectories, + usesWildcardTypes, usingSingleLineStringWriter, utf16EncodeAsString, validateLocaleAndSetLanguage, diff --git a/packages/schematics/angular/utility/dependencies.ts b/packages/schematics/angular/utility/dependencies.ts index b90ba8796975..0bd61807c390 100644 --- a/packages/schematics/angular/utility/dependencies.ts +++ b/packages/schematics/angular/utility/dependencies.ts @@ -97,6 +97,7 @@ export function addTestRunnerDependencies( 'karma-jasmine-html-reporter', 'jasmine-core', '@types/jasmine', + 'istanbul-lib-instrument', ]; return dependencies.map((name) => diff --git a/packages/schematics/angular/utility/dependencies_spec.ts b/packages/schematics/angular/utility/dependencies_spec.ts index d2d7b69e2c45..01a0278828fc 100644 --- a/packages/schematics/angular/utility/dependencies_spec.ts +++ b/packages/schematics/angular/utility/dependencies_spec.ts @@ -19,16 +19,10 @@ describe('dependencies', () => { describe('addDependency', () => { let tree: UnitTestTree; const pkgJsonPath = '/package.json'; - let dependency: NodeDependency; + beforeEach(() => { tree = new UnitTestTree(new EmptyTree()); tree.create(pkgJsonPath, '{}'); - - dependency = { - type: NodeDependencyType.Default, - name: 'my-pkg', - version: '1.2.3', - }; }); [ @@ -36,29 +30,39 @@ describe('dependencies', () => { { type: NodeDependencyType.Dev, key: 'devDependencies' }, { type: NodeDependencyType.Optional, key: 'optionalDependencies' }, { type: NodeDependencyType.Peer, key: 'peerDependencies' }, - ].forEach((type) => { - describe(`Type: ${type.toString()}`, () => { - beforeEach(() => { - dependency.type = type.type; - }); + ].forEach(({ type, key }) => { + describe(`Type: ${type}`, () => { + const dependency: NodeDependency = { + type, + name: 'my-pkg', + version: '1.2.3', + }; it('should add a dependency', () => { addPackageJsonDependency(tree, dependency); const pkgJson = JSON.parse(tree.readContent(pkgJsonPath)); - expect(pkgJson[type.key][dependency.name]).toEqual(dependency.version); + + expect(pkgJson[key][dependency.name]).toEqual(dependency.version); }); it('should handle an existing dependency (update version)', () => { addPackageJsonDependency(tree, { ...dependency, version: '0.0.0' }); addPackageJsonDependency(tree, { ...dependency, overwrite: true }); const pkgJson = JSON.parse(tree.readContent(pkgJsonPath)); - expect(pkgJson[type.key][dependency.name]).toEqual(dependency.version); + + expect(pkgJson[key][dependency.name]).toEqual(dependency.version); }); }); }); it('should throw when missing package.json', () => { - expect(() => addPackageJsonDependency(new EmptyTree(), dependency)).toThrow(); + expect(() => + addPackageJsonDependency(new EmptyTree(), { + type: NodeDependencyType.Default, + name: 'my-pkg', + version: '1.2.3', + }), + ).toThrow(); }); }); diff --git a/packages/schematics/angular/utility/latest-versions/package.json b/packages/schematics/angular/utility/latest-versions/package.json index bd7be5095b13..b0846597edcc 100644 --- a/packages/schematics/angular/utility/latest-versions/package.json +++ b/packages/schematics/angular/utility/latest-versions/package.json @@ -8,7 +8,8 @@ "@types/node": "^20.17.19", "browser-sync": "^3.0.0", "express": "^5.1.0", - "jasmine-core": "~6.0.0", + "istanbul-lib-instrument": "^6.0.3", + "jasmine-core": "~6.1.0", "jasmine-spec-reporter": "~7.0.0", "karma-chrome-launcher": "~3.2.0", "karma-coverage": "~2.2.0", @@ -19,14 +20,13 @@ "less": "^4.2.0", "postcss": "^8.5.3", "prettier": "^3.8.1", - "protractor": "~7.0.0", "rxjs": "~7.8.0", "tailwindcss": "^4.1.12", "@tailwindcss/postcss": "^4.1.12", "tslib": "^2.3.0", - "ts-node": "~10.9.0", - "typescript": "~5.9.2", + "typescript": "~6.0.2", "vitest": "^4.0.8", + "@vitest/coverage-v8": "^4.0.8", "@vitest/browser-playwright": "^4.0.8", "@vitest/browser-webdriverio": "^4.0.8", "@vitest/browser-preview": "^4.0.8", diff --git a/packages/schematics/angular/utility/ng-ast-utils.ts b/packages/schematics/angular/utility/ng-ast-utils.ts index 05a9f45c87ca..a78738e9623b 100644 --- a/packages/schematics/angular/utility/ng-ast-utils.ts +++ b/packages/schematics/angular/utility/ng-ast-utils.ts @@ -21,8 +21,7 @@ export function findBootstrapModuleCall(host: Tree, mainPath: string): ts.CallEx let bootstrapCall: ts.CallExpression | null = null; for (const node of allNodes) { - let bootstrapCallNode: ts.Node | null = null; - bootstrapCallNode = findNode(node, ts.SyntaxKind.Identifier, 'bootstrapModule'); + let bootstrapCallNode = findNode(node, ts.SyntaxKind.Identifier, 'bootstrapModule'); // Walk up the parent until CallExpression is found. while ( diff --git a/packages/schematics/angular/utility/workspace-models.ts b/packages/schematics/angular/utility/workspace-models.ts index e4a570410371..d1ae1b146835 100644 --- a/packages/schematics/angular/utility/workspace-models.ts +++ b/packages/schematics/angular/utility/workspace-models.ts @@ -35,7 +35,6 @@ export enum Builders { BuildDevServer = '@angular/build:dev-server', ExtractI18n = '@angular-devkit/build-angular:extract-i18n', BuildExtractI18n = '@angular/build:extract-i18n', - Protractor = '@angular-devkit/build-angular:private-protractor', BuildApplication = '@angular/build:application', } @@ -123,7 +122,6 @@ export interface ExtractI18nOptions { } export interface E2EOptions { - protractorConfig: string; devServerTarget: string; } @@ -143,7 +141,6 @@ export type AppShellBuilderTarget = BuilderTarget; export type ServeBuilderTarget = BuilderTarget; export type ExtractI18nBuilderTarget = BuilderTarget; -export type E2EBuilderTarget = BuilderTarget; interface WorkspaceCLISchema { warnings?: Record; @@ -185,7 +182,6 @@ export interface WorkspaceTargets, "strictInjectionParameters": true, - "strictInputAccessModifiers": true, - "strictTemplates": true<% } %> + "strictInputAccessModifiers": true<% } else { %>, + "strictTemplates": false<% } %> }, "files": [] } diff --git a/packages/schematics/angular/workspace/index_spec.ts b/packages/schematics/angular/workspace/index_spec.ts index bc7a9366b68b..7941fbac96cc 100644 --- a/packages/schematics/angular/workspace/index_spec.ts +++ b/packages/schematics/angular/workspace/index_spec.ts @@ -99,9 +99,9 @@ describe('Workspace Schematic', () => { tree.readContent('tsconfig.json').toString(), ); expect(compilerOptions.strict).toBeUndefined(); - expect( - Object.keys(angularCompilerOptions).filter((option) => option.startsWith('strict')), - ).toEqual([]); + expect(angularCompilerOptions.strictTemplates).toBeFalse(); + expect(angularCompilerOptions.strictInputAccessModifiers).toBeUndefined(); + expect(angularCompilerOptions.strictInjectionParameters).toBeUndefined(); }); it('should add strict compiler options when true', async () => { @@ -112,8 +112,10 @@ describe('Workspace Schematic', () => { const { compilerOptions, angularCompilerOptions } = parseJson( tree.readContent('tsconfig.json').toString(), ); - expect(compilerOptions.strict).toBe(true); - expect(angularCompilerOptions.strictTemplates).toBe(true); + expect(compilerOptions.strict).toBeTrue(); + expect(angularCompilerOptions.strictTemplates).toBeUndefined(); + expect(angularCompilerOptions.strictInputAccessModifiers).toBeTrue(); + expect(angularCompilerOptions.strictInjectionParameters).toBeTrue(); }); it('should add vscode testing configuration', async () => { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 65a1b3421df4..6060ae0515ee 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,7 +8,7 @@ overrides: undici-types: ^7.16.0 '@angular/build': workspace:* -packageExtensionsChecksum: sha256-3L73Fw32UVtE6x5BJxJPBtQtH/mgsr31grNpdhHP1IY= +packageExtensionsChecksum: sha256-V29Z7ZDJEQFju55ZS5zQ23Kb0736+P+eGNolWn/T274= importers: @@ -20,47 +20,47 @@ importers: built: true devDependencies: '@angular/animations': - specifier: 21.2.0-next.3 - version: 21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0)) + specifier: 22.0.0-next.6 + version: 22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1)) '@angular/cdk': - specifier: 21.2.0-next.4 - version: 21.2.0-next.4(@angular/common@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(@angular/platform-browser@21.2.0-next.3(@angular/animations@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0)))(rxjs@7.8.2) + specifier: 22.0.0-next.3 + version: 22.0.0-next.3(@angular/common@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.6(@angular/animations@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) '@angular/common': - specifier: 21.2.0-next.3 - version: 21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2) + specifier: 22.0.0-next.6 + version: 22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) '@angular/compiler': - specifier: 21.2.0-next.3 - version: 21.2.0-next.3 + specifier: 22.0.0-next.6 + version: 22.0.0-next.6 '@angular/compiler-cli': - specifier: 21.2.0-next.3 - version: 21.2.0-next.3(@angular/compiler@21.2.0-next.3)(typescript@5.9.3) + specifier: 22.0.0-next.6 + version: 22.0.0-next.6(@angular/compiler@22.0.0-next.6)(typescript@6.0.2) '@angular/core': - specifier: 21.2.0-next.3 - version: 21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0) + specifier: 22.0.0-next.6 + version: 22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1) '@angular/forms': - specifier: 21.2.0-next.3 - version: 21.2.0-next.3(@angular/common@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(@angular/platform-browser@21.2.0-next.3(@angular/animations@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0)))(rxjs@7.8.2) + specifier: 22.0.0-next.6 + version: 22.0.0-next.6(@angular/common@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.6(@angular/animations@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) '@angular/localize': - specifier: 21.2.0-next.3 - version: 21.2.0-next.3(@angular/compiler-cli@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(typescript@5.9.3))(@angular/compiler@21.2.0-next.3) + specifier: 22.0.0-next.6 + version: 22.0.0-next.6(@angular/compiler-cli@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(typescript@6.0.2))(@angular/compiler@22.0.0-next.6) '@angular/material': - specifier: 21.2.0-next.4 - version: 21.2.0-next.4(75d10325bbcfc22e53b1e47f427450d8) + specifier: 22.0.0-next.3 + version: 22.0.0-next.3(2e9636f7d8dd68137b51ac62db842fa5) '@angular/ng-dev': - specifier: https://github.com/angular/dev-infra-private-ng-dev-builds.git#2a5e8e5b5398ae13a8d9a963ac980707313a6c9e - version: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/2a5e8e5b5398ae13a8d9a963ac980707313a6c9e(@modelcontextprotocol/sdk@1.26.0(zod@4.3.6)) + specifier: https://github.com/angular/dev-infra-private-ng-dev-builds.git#1c95e84f330960eea28b5e3ed9b7a6a21b2c605b + version: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/1c95e84f330960eea28b5e3ed9b7a6a21b2c605b(@modelcontextprotocol/sdk@1.28.0(zod@4.3.6)) '@angular/platform-browser': - specifier: 21.2.0-next.3 - version: 21.2.0-next.3(@angular/animations@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0)) + specifier: 22.0.0-next.6 + version: 22.0.0-next.6(@angular/animations@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1)) '@angular/platform-server': - specifier: 21.2.0-next.3 - version: 21.2.0-next.3(@angular/common@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/compiler@21.2.0-next.3)(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(@angular/platform-browser@21.2.0-next.3(@angular/animations@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0)))(rxjs@7.8.2) + specifier: 22.0.0-next.6 + version: 22.0.0-next.6(@angular/common@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/compiler@22.0.0-next.6)(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.6(@angular/animations@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) '@angular/router': - specifier: 21.2.0-next.3 - version: 21.2.0-next.3(@angular/common@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(@angular/platform-browser@21.2.0-next.3(@angular/animations@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0)))(rxjs@7.8.2) + specifier: 22.0.0-next.6 + version: 22.0.0-next.6(@angular/common@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.6(@angular/animations@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) '@angular/service-worker': - specifier: 21.2.0-next.3 - version: 21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2) + specifier: 22.0.0-next.6 + version: 22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) '@babel/core': specifier: 7.29.0 version: 7.29.0 @@ -70,30 +70,39 @@ importers: '@bazel/buildifier': specifier: 8.2.1 version: 8.2.1 + '@bazel/ibazel': + specifier: ^0.28.0 + version: 0.28.0 '@eslint/compat': - specifier: 2.0.2 - version: 2.0.2(eslint@9.39.2(jiti@2.6.1)) + specifier: 2.0.3 + version: 2.0.3(eslint@10.1.0(jiti@2.6.1)) '@eslint/eslintrc': - specifier: 3.3.3 - version: 3.3.3 + specifier: 3.3.5 + version: 3.3.5 '@eslint/js': - specifier: 9.39.2 - version: 9.39.2 + specifier: 10.0.1 + version: 10.0.1(eslint@10.1.0(jiti@2.6.1)) '@rollup/plugin-alias': specifier: ^6.0.0 - version: 6.0.0(rollup@4.57.1) + version: 6.0.0(rollup@4.60.0) '@rollup/plugin-commonjs': specifier: ^29.0.0 - version: 29.0.0(rollup@4.57.1) + version: 29.0.2(rollup@4.60.0) '@rollup/plugin-json': specifier: ^6.1.0 - version: 6.1.0(rollup@4.57.1) + version: 6.1.0(rollup@4.60.0) '@rollup/plugin-node-resolve': specifier: 16.0.3 - version: 16.0.3(rollup@4.57.1) + version: 16.0.3(rollup@4.60.0) + '@rollup/wasm-node': + specifier: 4.60.0 + version: 4.60.0 '@stylistic/eslint-plugin': specifier: ^5.0.0 - version: 5.8.0(eslint@9.39.2(jiti@2.6.1)) + version: 5.10.0(eslint@10.1.0(jiti@2.6.1)) + '@tony.ganchev/eslint-plugin-header': + specifier: ~3.3.1 + version: 3.3.4(eslint@10.1.0(jiti@2.6.1)) '@types/babel__core': specifier: 7.20.5 version: 7.20.5 @@ -113,8 +122,8 @@ importers: specifier: ^4.0.0 version: 4.1.1 '@types/jasmine': - specifier: ~5.1.0 - version: 5.1.15 + specifier: ~6.0.0 + version: 6.0.0 '@types/jasmine-reporters': specifier: ^2 version: 2.5.3 @@ -129,10 +138,10 @@ importers: version: 3.0.0(esbuild@0.27.3) '@types/lodash': specifier: ^4.17.0 - version: 4.17.23 + version: 4.17.24 '@types/node': specifier: ^22.12.0 - version: 22.19.11 + version: 22.19.17 '@types/npm-package-arg': specifier: ^6.1.0 version: 6.1.4 @@ -141,7 +150,7 @@ importers: version: 11.1.8 '@types/picomatch': specifier: ^4.0.0 - version: 4.0.2 + version: 4.0.3 '@types/progress': specifier: ^2.0.3 version: 2.0.7 @@ -161,11 +170,11 @@ importers: specifier: ^1.1.5 version: 1.1.9 '@typescript-eslint/eslint-plugin': - specifier: 8.55.0 - version: 8.55.0(@typescript-eslint/parser@8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + specifier: 8.57.2 + version: 8.57.2(@typescript-eslint/parser@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2) '@typescript-eslint/parser': - specifier: 8.55.0 - version: 8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + specifier: 8.57.2 + version: 8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2) ajv: specifier: 8.18.0 version: 8.18.0 @@ -179,17 +188,14 @@ importers: specifier: 0.27.3 version: 0.27.3 eslint: - specifier: 9.39.2 - version: 9.39.2(jiti@2.6.1) + specifier: 10.1.0 + version: 10.1.0(jiti@2.6.1) eslint-config-prettier: specifier: 10.1.8 - version: 10.1.8(eslint@9.39.2(jiti@2.6.1)) - eslint-plugin-header: - specifier: 3.1.1 - version: 3.1.1(eslint@9.39.2(jiti@2.6.1)) + version: 10.1.8(eslint@10.1.0(jiti@2.6.1)) eslint-plugin-import: specifier: 2.32.0 - version: 2.32.0(@typescript-eslint/parser@8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)) + version: 2.32.0(@typescript-eslint/parser@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.1.0(jiti@2.6.1)) express: specifier: 5.2.1 version: 5.2.1 @@ -197,8 +203,8 @@ importers: specifier: 3.3.3 version: 3.3.3 globals: - specifier: 17.3.0 - version: 17.3.0 + specifier: 17.4.0 + version: 17.4.0 http-proxy: specifier: ^1.18.1 version: 1.18.1(debug@4.4.3) @@ -209,11 +215,11 @@ importers: specifier: 9.1.7 version: 9.1.7 jasmine: - specifier: ~5.13.0 - version: 5.13.0 + specifier: ~6.1.0 + version: 6.1.0 jasmine-core: - specifier: ~5.13.0 - version: 5.13.0 + specifier: ~6.1.0 + version: 6.1.0 jasmine-reporters: specifier: ^2.5.2 version: 2.5.2 @@ -222,7 +228,7 @@ importers: version: 7.0.0 karma: specifier: ~6.4.0 - version: 6.4.4(bufferutil@4.1.0) + version: 6.4.4(bufferutil@4.1.0)(utf-8-validate@6.0.6) karma-chrome-launcher: specifier: ~3.2.0 version: 3.2.0 @@ -231,73 +237,67 @@ importers: version: 2.2.1 karma-jasmine: specifier: ~5.1.0 - version: 5.1.0(karma@6.4.4(bufferutil@4.1.0)) + version: 5.1.0(karma@6.4.4(bufferutil@4.1.0)(utf-8-validate@6.0.6)) karma-jasmine-html-reporter: specifier: ~2.2.0 - version: 2.2.0(jasmine-core@5.13.0)(karma-jasmine@5.1.0(karma@6.4.4(bufferutil@4.1.0)))(karma@6.4.4(bufferutil@4.1.0)) + version: 2.2.0(jasmine-core@6.1.0)(karma-jasmine@5.1.0(karma@6.4.4(bufferutil@4.1.0)(utf-8-validate@6.0.6)))(karma@6.4.4(bufferutil@4.1.0)(utf-8-validate@6.0.6)) karma-source-map-support: specifier: 1.4.0 version: 1.4.0 lodash: specifier: ^4.17.21 - version: 4.17.23 + version: 4.18.1 magic-string: specifier: 0.30.21 version: 0.30.21 prettier: specifier: ^3.0.0 version: 3.8.1 - protractor: - specifier: ~7.0.0 - version: 7.0.0 puppeteer: - specifier: 18.2.1 - version: 18.2.1(bufferutil@4.1.0)(encoding@0.1.13) + specifier: 24.40.0 + version: 24.40.0(bufferutil@4.1.0)(typescript@6.0.2)(utf-8-validate@6.0.6) quicktype-core: specifier: 23.2.6 version: 23.2.6(encoding@0.1.13) rollup: - specifier: 4.57.1 - version: 4.57.1 + specifier: 4.60.0 + version: 4.60.0 rollup-license-plugin: - specifier: ~3.1.0 - version: 3.1.0 + specifier: ~3.2.0 + version: 3.2.1 rollup-plugin-dts: - specifier: 6.3.0 - version: 6.3.0(rollup@4.57.1)(typescript@5.9.3) + specifier: 6.4.1 + version: 6.4.1(rollup@4.60.0)(typescript@6.0.2) rollup-plugin-sourcemaps2: - specifier: 0.5.4 - version: 0.5.4(@types/node@22.19.11)(rollup@4.57.1) + specifier: 0.5.6 + version: 0.5.6(@types/node@22.19.17)(rollup@4.60.0) semver: specifier: 7.7.4 version: 7.7.4 source-map-support: specifier: 0.5.21 version: 0.5.21 - ts-node: - specifier: ^10.9.1 - version: 10.9.2(@types/node@22.19.11)(typescript@5.9.3) tslib: specifier: 2.8.1 version: 2.8.1 typescript: - specifier: 5.9.3 - version: 5.9.3 + specifier: 6.0.2 + version: 6.0.2 undici: - specifier: 7.22.0 - version: 7.22.0 + specifier: 7.24.6 + version: 7.24.6 unenv: specifier: ^1.10.0 version: 1.10.0 verdaccio: - specifier: 6.2.5 - version: 6.2.5(encoding@0.1.13) + specifier: 6.3.2 + version: 6.3.2(encoding@0.1.13) verdaccio-auth-memory: specifier: ^10.0.0 version: 10.3.1 zone.js: specifier: ^0.16.0 - version: 0.16.0 + version: 0.16.1 modules/testing/builder: devDependencies: @@ -314,20 +314,26 @@ importers: specifier: workspace:* version: link:../../../packages/angular/ssr '@vitest/coverage-v8': - specifier: 4.0.18 - version: 4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(jiti@2.6.1)(jsdom@28.1.0)(less@4.4.2)(sass@1.97.3)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + specifier: 4.1.2 + version: 4.1.2(vitest@4.1.2) browser-sync: specifier: 3.0.4 version: 3.0.4(bufferutil@4.1.0)(utf-8-validate@6.0.6) + istanbul-lib-instrument: + specifier: 6.0.3 + version: 6.0.3 jsdom: - specifier: 28.1.0 - version: 28.1.0 + specifier: 29.0.1 + version: 29.0.1 + ng-packagr: + specifier: 22.0.0-next.1 + version: 22.0.0-next.1(@angular/compiler-cli@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(typescript@6.0.2))(tslib@2.8.1)(typescript@6.0.2) rxjs: specifier: 7.8.2 version: 7.8.2 vitest: - specifier: 4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(jiti@2.6.1)(jsdom@28.1.0)(less@4.4.2)(sass@1.97.3)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + specifier: 4.1.2 + version: 4.1.2(@opentelemetry/api@1.9.1)(@types/node@24.12.0)(@vitest/coverage-v8@4.1.2)(jiti@2.6.1)(jsdom@29.0.1)(less@4.6.4)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) packages/angular/build: dependencies: @@ -347,32 +353,29 @@ importers: specifier: 7.24.7 version: 7.24.7 '@inquirer/confirm': - specifier: 5.1.21 - version: 5.1.21(@types/node@24.10.9) + specifier: 6.0.10 + version: 6.0.10(@types/node@24.12.0) '@vitejs/plugin-basic-ssl': - specifier: 2.1.4 - version: 2.1.4(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.4.2)(sass@1.97.3)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + specifier: 2.3.0 + version: 2.3.0(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(less@4.6.4)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) beasties: specifier: 0.4.1 version: 0.4.1 browserslist: specifier: ^4.26.0 - version: 4.28.1 + version: 4.28.2 esbuild: specifier: 0.27.3 version: 0.27.3 https-proxy-agent: - specifier: 7.0.6 - version: 7.0.6(supports-color@10.2.2) - istanbul-lib-instrument: - specifier: 6.0.3 - version: 6.0.3 + specifier: 9.0.0 + version: 9.0.0 jsonc-parser: specifier: 3.3.1 version: 3.3.1 listr2: - specifier: 9.0.5 - version: 9.0.5 + specifier: 10.2.1 + version: 10.2.1 magic-string: specifier: 0.30.21 version: 0.30.21 @@ -383,17 +386,17 @@ importers: specifier: 8.0.0 version: 8.0.0 picomatch: - specifier: 4.0.3 - version: 4.0.3 + specifier: 4.0.4 + version: 4.0.4 piscina: specifier: 5.1.4 version: 5.1.4 rolldown: - specifier: 1.0.0-rc.4 - version: 1.0.0-rc.4 + specifier: 1.0.0-rc.12 + version: 1.0.0-rc.12 sass: - specifier: 1.97.3 - version: 1.97.3 + specifier: 1.98.0 + version: 1.98.0 semver: specifier: 7.7.4 version: 7.7.4 @@ -403,12 +406,9 @@ importers: tinyglobby: specifier: 0.2.15 version: 0.2.15 - undici: - specifier: 7.22.0 - version: 7.22.0 vite: specifier: 7.3.1 - version: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.4.2)(sass@1.97.3)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + version: 7.3.1(@types/node@24.12.0)(jiti@2.6.1)(less@4.6.4)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) watchpack: specifier: 2.5.1 version: 2.5.1 @@ -419,28 +419,31 @@ importers: '@angular/ssr': specifier: workspace:* version: link:../ssr + istanbul-lib-instrument: + specifier: 6.0.3 + version: 6.0.3 jsdom: - specifier: 28.1.0 - version: 28.1.0 + specifier: 29.0.1 + version: 29.0.1 less: - specifier: 4.4.2 - version: 4.4.2 + specifier: 4.6.4 + version: 4.6.4 ng-packagr: - specifier: 21.2.0-next.0 - version: 21.2.0-next.0(@angular/compiler-cli@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3) + specifier: 22.0.0-next.1 + version: 22.0.0-next.1(@angular/compiler-cli@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(typescript@6.0.2))(tslib@2.8.1)(typescript@6.0.2) postcss: - specifier: 8.5.6 - version: 8.5.6 + specifier: 8.5.8 + version: 8.5.8 rxjs: specifier: 7.8.2 version: 7.8.2 vitest: - specifier: 4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(jiti@2.6.1)(jsdom@28.1.0)(less@4.4.2)(sass@1.97.3)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + specifier: 4.1.2 + version: 4.1.2(@opentelemetry/api@1.9.1)(@types/node@24.12.0)(@vitest/coverage-v8@4.1.2)(jiti@2.6.1)(jsdom@29.0.1)(less@4.6.4)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) optionalDependencies: lmdb: - specifier: 3.5.1 - version: 3.5.1 + specifier: 3.5.2 + version: 3.5.2 packages/angular/cli: dependencies: @@ -454,14 +457,14 @@ importers: specifier: workspace:0.0.0-PLACEHOLDER version: link:../../angular_devkit/schematics '@inquirer/prompts': - specifier: 7.10.1 - version: 7.10.1(@types/node@24.10.9) + specifier: 8.3.2 + version: 8.3.2(@types/node@24.12.0) '@listr2/prompt-adapter-inquirer': - specifier: 3.0.5 - version: 3.0.5(@inquirer/prompts@7.10.1(@types/node@24.10.9))(@types/node@24.10.9)(listr2@9.0.5) + specifier: 4.2.2 + version: 4.2.2(@inquirer/prompts@8.3.2(@types/node@24.12.0))(@types/node@24.12.0)(listr2@10.2.1) '@modelcontextprotocol/sdk': - specifier: 1.26.0 - version: 1.26.0(zod@4.3.6) + specifier: 1.28.0 + version: 1.28.0(zod@4.3.6) '@schematics/angular': specifier: workspace:0.0.0-PLACEHOLDER version: link:../../schematics/angular @@ -469,8 +472,8 @@ importers: specifier: 1.1.0 version: 1.1.0 algoliasearch: - specifier: 5.48.1 - version: 5.48.1 + specifier: 5.50.0 + version: 5.50.0 ini: specifier: 6.0.0 version: 6.0.0 @@ -478,14 +481,14 @@ importers: specifier: 3.3.1 version: 3.3.1 listr2: - specifier: 9.0.5 - version: 9.0.5 + specifier: 10.2.1 + version: 10.2.1 npm-package-arg: specifier: 13.0.2 version: 13.0.2 pacote: - specifier: 21.3.1 - version: 21.3.1 + specifier: 21.5.0 + version: 21.5.0 parse5-html-rewriting-stream: specifier: 8.0.0 version: 8.0.0 @@ -521,23 +524,23 @@ importers: specifier: workspace:* version: link:../../angular_devkit/schematics '@angular/common': - specifier: 21.2.0-next.3 - version: 21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2) + specifier: 22.0.0-next.6 + version: 22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) '@angular/compiler': - specifier: 21.2.0-next.3 - version: 21.2.0-next.3 + specifier: 22.0.0-next.6 + version: 22.0.0-next.6 '@angular/core': - specifier: 21.2.0-next.3 - version: 21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0) + specifier: 22.0.0-next.6 + version: 22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1) '@angular/platform-browser': - specifier: 21.2.0-next.3 - version: 21.2.0-next.3(@angular/animations@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0)) + specifier: 22.0.0-next.6 + version: 22.0.0-next.6(@angular/animations@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1)) '@angular/platform-server': - specifier: 21.2.0-next.3 - version: 21.2.0-next.3(@angular/common@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/compiler@21.2.0-next.3)(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(@angular/platform-browser@21.2.0-next.3(@angular/animations@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0)))(rxjs@7.8.2) + specifier: 22.0.0-next.6 + version: 22.0.0-next.6(@angular/common@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/compiler@22.0.0-next.6)(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.6(@angular/animations@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) '@angular/router': - specifier: 21.2.0-next.3 - version: 21.2.0-next.3(@angular/common@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(@angular/platform-browser@21.2.0-next.3(@angular/animations@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0)))(rxjs@7.8.2) + specifier: 22.0.0-next.6 + version: 22.0.0-next.6(@angular/common@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.6(@angular/animations@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) '@schematics/angular': specifier: workspace:* version: link:../../schematics/angular @@ -554,12 +557,6 @@ importers: specifier: 7.8.2 version: 7.8.2 - packages/angular_devkit/architect_cli: - dependencies: - '@angular-devkit/architect': - specifier: workspace:0.0.0-EXPERIMENTAL-PLACEHOLDER - version: link:../architect - packages/angular_devkit/build_angular: dependencies: '@ampproject/remapping': @@ -599,14 +596,14 @@ importers: specifier: 7.29.0 version: 7.29.0(@babel/core@7.29.0) '@babel/preset-env': - specifier: 7.29.0 - version: 7.29.0(@babel/core@7.29.0) + specifier: 7.29.2 + version: 7.29.2(@babel/core@7.29.0) '@babel/runtime': - specifier: 7.28.6 - version: 7.28.6 + specifier: 7.29.2 + version: 7.29.2 '@discoveryjs/json-ext': - specifier: 0.6.3 - version: 0.6.3 + specifier: 1.0.0 + version: 1.0.0 '@ngtools/webpack': specifier: workspace:0.0.0-PLACEHOLDER version: link:../../ngtools/webpack @@ -614,20 +611,20 @@ importers: specifier: 4.1.3 version: 4.1.3 autoprefixer: - specifier: 10.4.24 - version: 10.4.24(postcss@8.5.6) + specifier: 10.4.27 + version: 10.4.27(postcss@8.5.8) babel-loader: - specifier: 10.0.0 - version: 10.0.0(@babel/core@7.29.0)(webpack@5.105.2(esbuild@0.27.3)) + specifier: 10.1.1 + version: 10.1.1(@babel/core@7.29.0)(webpack@5.105.4(esbuild@0.27.3)) browserslist: specifier: ^4.26.0 - version: 4.28.1 + version: 4.28.2 copy-webpack-plugin: - specifier: 13.0.1 - version: 13.0.1(webpack@5.105.2(esbuild@0.27.3)) + specifier: 14.0.0 + version: 14.0.0(webpack@5.105.4(esbuild@0.27.3)) css-loader: - specifier: 7.1.3 - version: 7.1.3(webpack@5.105.2(esbuild@0.27.3)) + specifier: 7.1.4 + version: 7.1.4(webpack@5.105.4(esbuild@0.27.3)) esbuild-wasm: specifier: 0.27.3 version: 0.27.3 @@ -644,20 +641,20 @@ importers: specifier: 1.4.0 version: 1.4.0 less: - specifier: 4.4.2 - version: 4.4.2 + specifier: 4.6.4 + version: 4.6.4 less-loader: - specifier: 12.3.1 - version: 12.3.1(less@4.4.2)(webpack@5.105.2(esbuild@0.27.3)) + specifier: 12.3.2 + version: 12.3.2(less@4.6.4)(webpack@5.105.4(esbuild@0.27.3)) license-webpack-plugin: specifier: 4.0.2 - version: 4.0.2(webpack@5.105.2(esbuild@0.27.3)) + version: 4.0.2(webpack@5.105.4(esbuild@0.27.3)) loader-utils: specifier: 3.3.1 version: 3.3.1 mini-css-extract-plugin: - specifier: 2.10.0 - version: 2.10.0(webpack@5.105.2(esbuild@0.27.3)) + specifier: 2.10.2 + version: 2.10.2(webpack@5.105.4(esbuild@0.27.3)) open: specifier: 11.0.0 version: 11.0.0 @@ -665,17 +662,17 @@ importers: specifier: 9.3.0 version: 9.3.0 picomatch: - specifier: 4.0.3 - version: 4.0.3 + specifier: 4.0.4 + version: 4.0.4 piscina: specifier: 5.1.4 version: 5.1.4 postcss: - specifier: 8.5.6 - version: 8.5.6 + specifier: 8.5.8 + version: 8.5.8 postcss-loader: - specifier: 8.2.0 - version: 8.2.0(postcss@8.5.6)(typescript@5.9.3)(webpack@5.105.2(esbuild@0.27.3)) + specifier: 8.2.1 + version: 8.2.1(postcss@8.5.8)(typescript@6.0.2)(webpack@5.105.4(esbuild@0.27.3)) resolve-url-loader: specifier: 5.0.0 version: 5.0.0 @@ -683,63 +680,57 @@ importers: specifier: 7.8.2 version: 7.8.2 sass: - specifier: 1.97.3 - version: 1.97.3 + specifier: 1.98.0 + version: 1.98.0 sass-loader: specifier: 16.0.7 - version: 16.0.7(sass@1.97.3)(webpack@5.105.2(esbuild@0.27.3)) + version: 16.0.7(sass@1.98.0)(webpack@5.105.4(esbuild@0.27.3)) semver: specifier: 7.7.4 version: 7.7.4 source-map-loader: specifier: 5.0.0 - version: 5.0.0(webpack@5.105.2(esbuild@0.27.3)) + version: 5.0.0(webpack@5.105.4(esbuild@0.27.3)) source-map-support: specifier: 0.5.21 version: 0.5.21 terser: - specifier: 5.46.0 - version: 5.46.0 + specifier: 5.46.1 + version: 5.46.1 tinyglobby: specifier: 0.2.15 version: 0.2.15 - tree-kill: - specifier: 1.2.2 - version: 1.2.2 tslib: specifier: 2.8.1 version: 2.8.1 webpack: - specifier: 5.105.2 - version: 5.105.2(esbuild@0.27.3) + specifier: 5.105.4 + version: 5.105.4(esbuild@0.27.3) webpack-dev-middleware: - specifier: 7.4.5 - version: 7.4.5(tslib@2.8.1)(webpack@5.105.2(esbuild@0.27.3)) + specifier: 8.0.2 + version: 8.0.2(tslib@2.8.1)(webpack@5.105.4(esbuild@0.27.3)) webpack-dev-server: specifier: 5.2.3 - version: 5.2.3(bufferutil@4.1.0)(tslib@2.8.1)(utf-8-validate@6.0.6)(webpack@5.105.2(esbuild@0.27.3)) + version: 5.2.3(bufferutil@4.1.0)(tslib@2.8.1)(utf-8-validate@6.0.6)(webpack@5.105.4(esbuild@0.27.3)) webpack-merge: specifier: 6.0.1 version: 6.0.1 webpack-subresource-integrity: specifier: 5.1.0 - version: 5.1.0(webpack@5.105.2(esbuild@0.27.3)) + version: 5.1.0(webpack@5.105.4(esbuild@0.27.3)) devDependencies: '@angular/ssr': specifier: workspace:* version: link:../../angular/ssr - '@web/test-runner': - specifier: 0.20.2 - version: 0.20.2(bufferutil@4.1.0) browser-sync: specifier: 3.0.4 version: 3.0.4(bufferutil@4.1.0)(utf-8-validate@6.0.6) ng-packagr: - specifier: 21.2.0-next.0 - version: 21.2.0-next.0(@angular/compiler-cli@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3) + specifier: 22.0.0-next.1 + version: 22.0.0-next.1(@angular/compiler-cli@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(typescript@6.0.2))(tslib@2.8.1)(typescript@6.0.2) undici: - specifier: 7.22.0 - version: 7.22.0 + specifier: 7.24.6 + version: 7.24.6 optionalDependencies: esbuild: specifier: 0.27.3 @@ -761,11 +752,11 @@ importers: specifier: workspace:0.0.0-PLACEHOLDER version: link:../../ngtools/webpack webpack: - specifier: 5.105.2 - version: 5.105.2(esbuild@0.27.3) + specifier: 5.105.4 + version: 5.105.4(esbuild@0.27.3) webpack-dev-server: specifier: 5.2.3 - version: 5.2.3(bufferutil@4.1.0)(tslib@2.8.1)(utf-8-validate@6.0.6)(webpack@5.105.2(esbuild@0.27.3)) + version: 5.2.3(bufferutil@4.1.0)(tslib@2.8.1)(utf-8-validate@6.0.6)(webpack@5.105.4(esbuild@0.27.3)) packages/angular_devkit/core: dependencies: @@ -779,8 +770,8 @@ importers: specifier: 3.3.1 version: 3.3.1 picomatch: - specifier: 4.0.3 - version: 4.0.3 + specifier: 4.0.4 + version: 4.0.4 rxjs: specifier: 7.8.2 version: 7.8.2 @@ -819,8 +810,8 @@ importers: specifier: workspace:0.0.0-PLACEHOLDER version: link:../schematics '@inquirer/prompts': - specifier: 7.10.1 - version: 7.10.1(@types/node@24.10.9) + specifier: 8.3.2 + version: 8.3.2(@types/node@24.12.0) packages/ngtools/webpack: devDependencies: @@ -828,17 +819,17 @@ importers: specifier: workspace:0.0.0-PLACEHOLDER version: link:../../angular_devkit/core '@angular/compiler': - specifier: 21.2.0-next.3 - version: 21.2.0-next.3 + specifier: 22.0.0-next.6 + version: 22.0.0-next.6 '@angular/compiler-cli': - specifier: 21.2.0-next.3 - version: 21.2.0-next.3(@angular/compiler@21.2.0-next.3)(typescript@5.9.3) + specifier: 22.0.0-next.6 + version: 22.0.0-next.6(@angular/compiler@22.0.0-next.6)(typescript@6.0.2) typescript: - specifier: 5.9.3 - version: 5.9.3 + specifier: 6.0.2 + version: 6.0.2 webpack: - specifier: 5.105.2 - version: 5.105.2(esbuild@0.27.3) + specifier: 5.105.4 + version: 5.105.4(esbuild@0.27.3) packages/schematics/angular: dependencies: @@ -861,17 +852,11 @@ importers: specifier: 3.1.4 version: 3.1.4 tar-stream: - specifier: 3.1.7 - version: 3.1.7 - tree-kill: - specifier: 1.2.2 - version: 1.2.2 + specifier: 3.1.8 + version: 3.1.8 packages: - '@acemir/cssom@0.9.31': - resolution: {integrity: sha512-ZnR3GSaH+/vJ0YlHau21FjfLYjMpYVIzTD8M8vIEQvIGxeOXyXdzCI140rrCY862p/C/BbzWsjc1dgnM9mkoTA==} - '@actions/core@3.0.0': resolution: {integrity: sha512-zYt6cz+ivnTmiT/ksRVriMBOiuoUpDCJJlZ5KPl2/FRdvwU3f7MPh9qftvbkXJThragzUZieit2nyHUyw53Seg==} @@ -884,107 +869,107 @@ packages: '@actions/io@3.0.2': resolution: {integrity: sha512-nRBchcMM+QK1pdjO7/idu86rbJI5YHUKCvKs0KxnSYbVe3F51UfGxuZX4Qy/fWlp6l7gWFwIkrOzN+oUK03kfw==} - '@algolia/abtesting@1.14.1': - resolution: {integrity: sha512-Dkj0BgPiLAaim9sbQ97UKDFHJE/880wgStAM18U++NaJ/2Cws34J5731ovJifr6E3Pv4T2CqvMXf8qLCC417Ew==} + '@algolia/abtesting@1.16.0': + resolution: {integrity: sha512-alHFZ68/i9qLC/muEB07VQ9r7cB8AvCcGX6dVQi2PNHhc/ZQRmmFAv8KK1ay4UiseGSFr7f0nXBKsZ/jRg7e4g==} engines: {node: '>= 14.0.0'} - '@algolia/client-abtesting@5.48.1': - resolution: {integrity: sha512-LV5qCJdj+/m9I+Aj91o+glYszrzd7CX6NgKaYdTOj4+tUYfbS62pwYgUfZprYNayhkQpVFcrW8x8ZlIHpS23Vw==} + '@algolia/client-abtesting@5.50.0': + resolution: {integrity: sha512-mfgUdLQNxOAvCZUGzPQxjahEWEPuQkKlV0ZtGmePOa9ZxIQZlk31vRBNbM6ScU8jTH41SCYE77G/lCifDr1SVw==} engines: {node: '>= 14.0.0'} - '@algolia/client-analytics@5.48.1': - resolution: {integrity: sha512-/AVoMqHhPm14CcHq7mwB+bUJbfCv+jrxlNvRjXAuO+TQa+V37N8k1b0ijaRBPdmSjULMd8KtJbQyUyabXOu6Kg==} + '@algolia/client-analytics@5.50.0': + resolution: {integrity: sha512-5mjokeKYyPaP3Q8IYJEnutI+O4dW/Ixxx5IgsSxT04pCfGqPXxTOH311hTQxyNpcGGEOGrMv8n8Z+UMTPamioQ==} engines: {node: '>= 14.0.0'} - '@algolia/client-common@5.48.1': - resolution: {integrity: sha512-VXO+qu2Ep6ota28ktvBm3sG53wUHS2n7bgLWmce5jTskdlCD0/JrV4tnBm1l7qpla1CeoQb8D7ShFhad+UoSOw==} + '@algolia/client-common@5.50.0': + resolution: {integrity: sha512-emtOvR6dl3rX3sBJXXbofMNHU1qMQqQSWu319RMrNL5BWoBqyiq7y0Zn6cjJm7aGHV/Qbf+KCCYeWNKEMPI3BQ==} engines: {node: '>= 14.0.0'} - '@algolia/client-insights@5.48.1': - resolution: {integrity: sha512-zl+Qyb0nLg+Y5YvKp1Ij+u9OaPaKg2/EPzTwKNiVyOHnQJlFxmXyUZL1EInczAZsEY8hVpPCLtNfhMhfxluXKQ==} + '@algolia/client-insights@5.50.0': + resolution: {integrity: sha512-IerGH2/hcj/6bwkpQg/HHRqmlGN1XwygQWythAk0gZFBrghs9danJaYuSS3ShzLSVoIVth4jY5GDPX9Lbw5cgg==} engines: {node: '>= 14.0.0'} - '@algolia/client-personalization@5.48.1': - resolution: {integrity: sha512-r89Qf9Oo9mKWQXumRu/1LtvVJAmEDpn8mHZMc485pRfQUMAwSSrsnaw1tQ3sszqzEgAr1c7rw6fjBI+zrAXTOw==} + '@algolia/client-personalization@5.50.0': + resolution: {integrity: sha512-3idPJeXn5L0MmgP9jk9JJqblrQ/SguN93dNK9z9gfgyupBhHnJMOEjrRYcVgTIfvG13Y04wO+Q0FxE2Ut8PVbA==} engines: {node: '>= 14.0.0'} - '@algolia/client-query-suggestions@5.48.1': - resolution: {integrity: sha512-TPKNPKfghKG/bMSc7mQYD9HxHRUkBZA4q1PEmHgICaSeHQscGqL4wBrKkhfPlDV1uYBKW02pbFMUhsOt7p4ZpA==} + '@algolia/client-query-suggestions@5.50.0': + resolution: {integrity: sha512-q7qRoWrQK1a8m5EFQEmPlo7+pg9mVQ8X5jsChtChERre0uS2pdYEDixBBl0ydBSGkdGbLUDufcACIhH/077E4g==} engines: {node: '>= 14.0.0'} - '@algolia/client-search@5.48.1': - resolution: {integrity: sha512-4Fu7dnzQyQmMFknYwTiN/HxPbH4DyxvQ1m+IxpPp5oslOgz8m6PG5qhiGbqJzH4HiT1I58ecDiCAC716UyVA8Q==} + '@algolia/client-search@5.50.0': + resolution: {integrity: sha512-Jc360x4yqb3eEg4OY4KEIdGePBxZogivKI+OGIU8aLXgAYPTECvzeOBc90312yHA1hr3AeRlAFl0rIc8lQaIrQ==} engines: {node: '>= 14.0.0'} - '@algolia/ingestion@1.48.1': - resolution: {integrity: sha512-/RFq3TqtXDUUawwic/A9xylA2P3LDMO8dNhphHAUOU51b1ZLHrmZ6YYJm3df1APz7xLY1aht6okCQf+/vmrV9w==} + '@algolia/ingestion@1.50.0': + resolution: {integrity: sha512-OS3/Viao+NPpyBbEY3tf6hLewppG+UclD+9i0ju56mq2DrdMJFCkEky6Sk9S5VPcbLzxzg3BqBX6u9Q35w19aQ==} engines: {node: '>= 14.0.0'} - '@algolia/monitoring@1.48.1': - resolution: {integrity: sha512-Of0jTeAZRyRhC7XzDSjJef0aBkgRcvRAaw0ooYRlOw57APii7lZdq+layuNdeL72BRq1snaJhoMMwkmLIpJScw==} + '@algolia/monitoring@1.50.0': + resolution: {integrity: sha512-/znwgSiGufpbJVIoDmeQaHtTq+OMdDawFRbMSJVv+12n79hW+qdQXS8/Uu3BD3yn0BzgVFJEvrsHrCsInZKdhw==} engines: {node: '>= 14.0.0'} - '@algolia/recommend@5.48.1': - resolution: {integrity: sha512-bE7JcpFXzxF5zHwj/vkl2eiCBvyR1zQ7aoUdO+GDXxGp0DGw7nI0p8Xj6u8VmRQ+RDuPcICFQcCwRIJT5tDJFw==} + '@algolia/recommend@5.50.0': + resolution: {integrity: sha512-dHjUfu4jfjdQiKDpCpAnM7LP5yfG0oNShtfpF5rMCel6/4HIoqJ4DC4h5GKDzgrvJYtgAhblo0AYBmOM00T+lQ==} engines: {node: '>= 14.0.0'} - '@algolia/requester-browser-xhr@5.48.1': - resolution: {integrity: sha512-MK3wZ2koLDnvH/AmqIF1EKbJlhRS5j74OZGkLpxI4rYvNi9Jn/C7vb5DytBnQ4KUWts7QsmbdwHkxY5txQHXVw==} + '@algolia/requester-browser-xhr@5.50.0': + resolution: {integrity: sha512-bffIbUljAWnh/Ctu5uScORajuUavqmZ0ACYd1fQQeSSYA9NNN83ynO26pSc2dZRXpSK0fkc1//qSSFXMKGu+aw==} engines: {node: '>= 14.0.0'} - '@algolia/requester-fetch@5.48.1': - resolution: {integrity: sha512-2oDT43Y5HWRSIQMPQI4tA/W+TN/N2tjggZCUsqQV440kxzzoPGsvv9QP1GhQ4CoDa+yn6ygUsGp6Dr+a9sPPSg==} + '@algolia/requester-fetch@5.50.0': + resolution: {integrity: sha512-y0EwNvPGvkM+yTAqqO6Gpt9wVGm3CLDtpLvNEiB3VGvN3WzfkjZGtLUsG/ru2kVJIIU7QcV0puuYgEpBeFxcJg==} engines: {node: '>= 14.0.0'} - '@algolia/requester-node-http@5.48.1': - resolution: {integrity: sha512-xcaCqbhupVWhuBP1nwbk1XNvwrGljozutEiLx06mvqDf3o8cHyEgQSHS4fKJM+UAggaWVnnFW+Nne5aQ8SUJXg==} + '@algolia/requester-node-http@5.50.0': + resolution: {integrity: sha512-xpwefe4fCOWnZgXCbkGpqQY6jgBSCf2hmgnySbyzZIccrv3SoashHKGPE4x6vVG+gdHrGciMTAcDo9HOZwH22Q==} engines: {node: '>= 14.0.0'} '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@angular/animations@21.2.0-next.3': - resolution: {integrity: sha512-DTiRWm2aBlX+uVS1K3PnEbJZ4SQbWBPTl898lUYJ79WArPaHoTtrBurZ5zcGA6R5OyBfAvv3MvU0qZtihFIMoA==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + '@angular/animations@22.0.0-next.6': + resolution: {integrity: sha512-QfoRrMrHh/3+JJBvmXBM0UfBxTvcGO/CBPH450RNktmqnaFKwsPyXTE+fA0S3xkhV0rCCQH5WVKNaBE18RsFvw==} + engines: {node: ^22.22.0 || >=24.13.1} peerDependencies: - '@angular/core': 21.2.0-next.3 + '@angular/core': 22.0.0-next.6 - '@angular/cdk@21.2.0-next.4': - resolution: {integrity: sha512-GbcDW+qeSV4QlPQojGh5jCPATGfClCYnZhEGLXfabfEy/uhKGehILW37FK4VRhLdZKW9nMTs7w436jaovh84/A==} + '@angular/cdk@22.0.0-next.3': + resolution: {integrity: sha512-dQrSUW9jR5cISKoA0iewbLWFMFNYvg4w32DZZvz/lv2mvRoHKcPv6wyc7K2egB4qLjEp/FV/bs3icNFZ+6a9qw==} peerDependencies: - '@angular/common': ^21.0.0-0 || ^21.1.0-0 || ^21.2.0-0 || ^21.3.0-0 || ^22.0.0-0 - '@angular/core': ^21.0.0-0 || ^21.1.0-0 || ^21.2.0-0 || ^21.3.0-0 || ^22.0.0-0 - '@angular/platform-browser': ^21.0.0-0 || ^21.1.0-0 || ^21.2.0-0 || ^21.3.0-0 || ^22.0.0-0 + '@angular/common': ^22.0.0-0 || ^22.1.0-0 || ^22.2.0-0 || ^22.3.0-0 || ^23.0.0-0 + '@angular/core': ^22.0.0-0 || ^22.1.0-0 || ^22.2.0-0 || ^22.3.0-0 || ^23.0.0-0 + '@angular/platform-browser': ^22.0.0-0 || ^22.1.0-0 || ^22.2.0-0 || ^22.3.0-0 || ^23.0.0-0 rxjs: ^6.5.3 || ^7.4.0 - '@angular/common@21.2.0-next.3': - resolution: {integrity: sha512-7Mfsk/ahcKqvPFW1e9IMnfyvsyGKARIORdVxI8r/05N+Bt1aeW6iZbteEqM2cCEFZ4UqWjkaqdlBZndevqfqsA==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + '@angular/common@22.0.0-next.6': + resolution: {integrity: sha512-LIP+K7uqUxHc2W83hKCuvChuwsvxsy3aGDjGL2RdkG9ejOl8D4mIhVfWSDl1/EGtet+9URmJeaUK66DRyltVlg==} + engines: {node: ^22.22.0 || >=24.13.1} peerDependencies: - '@angular/core': 21.2.0-next.3 + '@angular/core': 22.0.0-next.6 rxjs: ^6.5.3 || ^7.4.0 - '@angular/compiler-cli@21.2.0-next.3': - resolution: {integrity: sha512-q3OUWuK/mspdxRfPQq2RPnGosq7yYzWzK+FikEYHv9I2pPTqt1cXWArWzknLouxs2zVaRhpaqXreCGtBeicYwg==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + '@angular/compiler-cli@22.0.0-next.6': + resolution: {integrity: sha512-S66R3kNBvbNm6QUeR4HoXq3kXt29YcIM5LJ+ucp2P/eUktEtzoUF+2g0ad1vDPG7tvis16ey1+ohLOJog/GrGA==} + engines: {node: ^22.22.0 || >=24.13.1} hasBin: true peerDependencies: - '@angular/compiler': 21.2.0-next.3 - typescript: '>=5.9 <6.0' + '@angular/compiler': 22.0.0-next.6 + typescript: '>=5.9 <6.1' peerDependenciesMeta: typescript: optional: true - '@angular/compiler@21.2.0-next.3': - resolution: {integrity: sha512-vMNEt+qFt4+k7lGoalHqmxgB6XiEWUTG7UaT9BkcU5Ezs64RLfkLVSGd0MNAuE2RL1gOa0/wvIl11yv0pD2T7g==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + '@angular/compiler@22.0.0-next.6': + resolution: {integrity: sha512-LfHwtfEBPM/AV8+nJx4YREJJun52t0k6Hc8rf6djvBELW5QHwm9Qttgre/edHFlOSiTdw8sWN0jVfQ+5ocTKqw==} + engines: {node: ^22.22.0 || >=24.13.1} - '@angular/core@21.2.0-next.3': - resolution: {integrity: sha512-9cieyRQ3DIWANEQ1DfjOuZS8EdzcPzaikO1Vi81hNmsr7an8yok0oRXfonkkudFUtAE0Xl6B1wYyD4FZ3ig47g==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + '@angular/core@22.0.0-next.6': + resolution: {integrity: sha512-eoWQfKMRftk+tYtbi8zBpQCmdnIn+4mJTD+/8x86gYKVMZWKvCkFFCTN87hfu0ry9505/eybdi/o2c8W9UZS7Q==} + engines: {node: ^22.22.0 || >=24.13.1} peerDependencies: - '@angular/compiler': 21.2.0-next.3 + '@angular/compiler': 22.0.0-next.6 rxjs: ^6.5.3 || ^7.4.0 zone.js: ~0.15.0 || ~0.16.0 peerDependenciesMeta: @@ -993,81 +978,83 @@ packages: zone.js: optional: true - '@angular/forms@21.2.0-next.3': - resolution: {integrity: sha512-YHrLsKO1fozXw0jptI3kwCc5w13DRQzf/Q8ajmtu+o2oy1NjYuoPlRyTBuIufThYKgBqC2ZfWOCWkOa8gyyKQA==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + '@angular/forms@22.0.0-next.6': + resolution: {integrity: sha512-xykgAkiNZ8H3J0VMGPo3dTmKs/Epydnh4FK0Yojh/oxKa9lMPx9vxftS5J5Wgah57/CMtZ1ndhN/xukQxzCTgQ==} + engines: {node: ^22.22.0 || >=24.13.1} peerDependencies: - '@angular/common': 21.2.0-next.3 - '@angular/core': 21.2.0-next.3 - '@angular/platform-browser': 21.2.0-next.3 + '@angular/common': 22.0.0-next.6 + '@angular/core': 22.0.0-next.6 + '@angular/platform-browser': 22.0.0-next.6 rxjs: ^6.5.3 || ^7.4.0 - '@angular/localize@21.2.0-next.3': - resolution: {integrity: sha512-348iYNZ5PrnjxiSVuPE9XomIWrZNYOPPDq/3VVVTl/f9G+iwmHGfCJ1GsGxwg31DRu3X6ZFKw4IBqUyfLJaJiQ==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + '@angular/localize@22.0.0-next.6': + resolution: {integrity: sha512-ICUJZCCKU1yf88f4zmFZQfYnvMRX1lufOFgR7CLMPrfSuU0lvPyhlJbI+/0/SA1sBvDjaH3t6Z5SX0XVT/Beeg==} + engines: {node: ^22.22.0 || >=24.13.1} hasBin: true peerDependencies: - '@angular/compiler': 21.2.0-next.3 - '@angular/compiler-cli': 21.2.0-next.3 + '@angular/compiler': 22.0.0-next.6 + '@angular/compiler-cli': 22.0.0-next.6 - '@angular/material@21.2.0-next.4': - resolution: {integrity: sha512-mUNP2z/FehBfmdDtQNznXO/jjOm7FPCc0DBqdXsTgIyeHqf9UitwC6huBzSmzN8Kq/v/ftDp04Ph+Jjbp/6VaA==} + '@angular/material@22.0.0-next.3': + resolution: {integrity: sha512-w52poT7V/JaSb/MhWXcD6VSNcA4e3CwlHlz3R+qnqs8yCF+9YsD4xCmlChycXbTNVS9sl+CWus8WGxhdn5HccA==} peerDependencies: - '@angular/cdk': 21.2.0-next.4 - '@angular/common': ^21.0.0-0 || ^21.1.0-0 || ^21.2.0-0 || ^21.3.0-0 || ^22.0.0-0 - '@angular/core': ^21.0.0-0 || ^21.1.0-0 || ^21.2.0-0 || ^21.3.0-0 || ^22.0.0-0 - '@angular/forms': ^21.0.0-0 || ^21.1.0-0 || ^21.2.0-0 || ^21.3.0-0 || ^22.0.0-0 - '@angular/platform-browser': ^21.0.0-0 || ^21.1.0-0 || ^21.2.0-0 || ^21.3.0-0 || ^22.0.0-0 + '@angular/cdk': 22.0.0-next.3 + '@angular/common': ^22.0.0-0 || ^22.1.0-0 || ^22.2.0-0 || ^22.3.0-0 || ^23.0.0-0 + '@angular/core': ^22.0.0-0 || ^22.1.0-0 || ^22.2.0-0 || ^22.3.0-0 || ^23.0.0-0 + '@angular/forms': ^22.0.0-0 || ^22.1.0-0 || ^22.2.0-0 || ^22.3.0-0 || ^23.0.0-0 + '@angular/platform-browser': ^22.0.0-0 || ^22.1.0-0 || ^22.2.0-0 || ^22.3.0-0 || ^23.0.0-0 rxjs: ^6.5.3 || ^7.4.0 - '@angular/ng-dev@https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/2a5e8e5b5398ae13a8d9a963ac980707313a6c9e': - resolution: {tarball: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/2a5e8e5b5398ae13a8d9a963ac980707313a6c9e} - version: 0.0.0-469708f109a90884ca403d150d33079a3a5a8769 + '@angular/ng-dev@https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/1c95e84f330960eea28b5e3ed9b7a6a21b2c605b': + resolution: {tarball: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/1c95e84f330960eea28b5e3ed9b7a6a21b2c605b} + version: 0.0.0-ba726e7bca0b08b125ccc6f93c233749e1213c17 hasBin: true - '@angular/platform-browser@21.2.0-next.3': - resolution: {integrity: sha512-YsKkQaZ4jPs/xicQ9baJ0hlSLfKfsBsXrwNBw7XjvnyinU8tlB707KZ0eThyx9FSoLeBO2FgrWM75NTiEd2Rvg==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + '@angular/platform-browser@22.0.0-next.6': + resolution: {integrity: sha512-45tSzemNZLxXEz2+wWlYE3kFZl2eD4WQ0nYNVx+grzK3U9h9GOSN/YxvrBm/q9cnZD2x+O9RQDyj+9/Vq3a5mw==} + engines: {node: ^22.22.0 || >=24.13.1} peerDependencies: - '@angular/animations': 21.2.0-next.3 - '@angular/common': 21.2.0-next.3 - '@angular/core': 21.2.0-next.3 + '@angular/animations': 22.0.0-next.6 + '@angular/common': 22.0.0-next.6 + '@angular/core': 22.0.0-next.6 peerDependenciesMeta: '@angular/animations': optional: true - '@angular/platform-server@21.2.0-next.3': - resolution: {integrity: sha512-ETjC41XcL0m19hONZebrGNKqOTFqtuz2qP6I5g4JKS6jDJ5aLx9ERtcq+ALnuEmPICcR7rbGzMigM2WTDTdZ0A==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + '@angular/platform-server@22.0.0-next.6': + resolution: {integrity: sha512-rbK9/8G0Ftc3I3IoHoV+KiMq+QLx8k29PTpnm49QttvI8T/Mw6aQ2pW1coH+rJPDtJNwN7Z7lccACYA3vzPyCw==} + engines: {node: ^22.22.0 || >=24.13.1} peerDependencies: - '@angular/common': 21.2.0-next.3 - '@angular/compiler': 21.2.0-next.3 - '@angular/core': 21.2.0-next.3 - '@angular/platform-browser': 21.2.0-next.3 + '@angular/common': 22.0.0-next.6 + '@angular/compiler': 22.0.0-next.6 + '@angular/core': 22.0.0-next.6 + '@angular/platform-browser': 22.0.0-next.6 rxjs: ^6.5.3 || ^7.4.0 - '@angular/router@21.2.0-next.3': - resolution: {integrity: sha512-NHokfVBqk8Elei9AtWreWdrm6oThwCbJZEbi3MqKJBEKCo33BEtZuv3QrwrbpNb+Pnm5RJVYMK4Z0sXvt/qohg==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + '@angular/router@22.0.0-next.6': + resolution: {integrity: sha512-RwwNT2HCiIMzaNRCs1uwcvvC3/Uvkih9A3jLbIU4+uHbi0st4DHQVtRY1zBKsAtpXarxdK7ykHUA32HbC11l9A==} + engines: {node: ^22.22.0 || >=24.13.1} peerDependencies: - '@angular/common': 21.2.0-next.3 - '@angular/core': 21.2.0-next.3 - '@angular/platform-browser': 21.2.0-next.3 + '@angular/common': 22.0.0-next.6 + '@angular/core': 22.0.0-next.6 + '@angular/platform-browser': 22.0.0-next.6 rxjs: ^6.5.3 || ^7.4.0 - '@angular/service-worker@21.2.0-next.3': - resolution: {integrity: sha512-52Z2plR7926tBS/2nCIYLLXuXcwZ1ByJeoMHXfMXNEx4uM0vbMlcALqkCB/pvrehCtqLlT/8Ec0paHk/uE0jcw==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + '@angular/service-worker@22.0.0-next.6': + resolution: {integrity: sha512-qRgDs8TVd6jbu3Ctnit2ZuzWWVr+gCbeK9mo7OOWtPQAIX0Xe53MnXPTFrr3xxdO8AtTlJ0k2FYhoHaH4LPkZA==} + engines: {node: ^22.22.0 || >=24.13.1} hasBin: true peerDependencies: - '@angular/core': 21.2.0-next.3 + '@angular/core': 22.0.0-next.6 rxjs: ^6.5.3 || ^7.4.0 - '@asamuzakjp/css-color@4.1.2': - resolution: {integrity: sha512-NfBUvBaYgKIuq6E/RBLY1m0IohzNHAYyaJGuTK79Z23uNwmz2jl1mPsC5ZxCCxylinKhT1Amn5oNTlx1wN8cQg==} + '@asamuzakjp/css-color@5.1.6': + resolution: {integrity: sha512-BXWCh8dHs9GOfpo/fWGDJtDmleta2VePN9rn6WQt3GjEbxzutVF4t0x2pmH+7dbMCLtuv3MlwqRsAuxlzFXqFg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - '@asamuzakjp/dom-selector@6.8.1': - resolution: {integrity: sha512-MvRz1nCqW0fsy8Qz4dnLIvhOlMzqDVBabZx6lH+YywFDdjXhMY37SmpV1XFX3JzG5GWHn63j6HX6QPr3lZXHvQ==} + '@asamuzakjp/dom-selector@7.0.8': + resolution: {integrity: sha512-erMO6FgtM02dC24NGm0xufMzWz5OF0wXKR7BpvGD973bq/GbmR8/DbxNZbj0YevQ5hlToJaWSVK/G9/NDgGEVw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} '@asamuzakjp/nwsapi@2.3.9': resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} @@ -1108,8 +1095,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-define-polyfill-provider@0.6.6': - resolution: {integrity: sha512-mOAsxeeKkUKayvZR3HeTYD/fICpCPLJrU5ZjelT/PA6WHtNDBOE436YiaEUvHN454bRM3CebhDsIpieCc4texA==} + '@babel/helper-define-polyfill-provider@0.6.8': + resolution: {integrity: sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 @@ -1175,12 +1162,12 @@ packages: resolution: {integrity: sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.28.6': - resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==} + '@babel/helpers@7.29.2': + resolution: {integrity: sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==} engines: {node: '>=6.9.0'} - '@babel/parser@7.29.0': - resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} + '@babel/parser@7.29.2': + resolution: {integrity: sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==} engines: {node: '>=6.0.0'} hasBin: true @@ -1550,8 +1537,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/preset-env@7.29.0': - resolution: {integrity: sha512-fNEdfc0yi16lt6IZo2Qxk3knHVdfMYX33czNb4v8yWhemoBhibCpQK/uYHtSKIiO+p/zd3+8fYVXhQdOVV608w==} + '@babel/preset-env@7.29.2': + resolution: {integrity: sha512-DYD23veRYGvBFhcTY1iUvJnDNpuqNd/BzBwCvzOTKUnJjKg5kpUBh3/u9585Agdkgj+QuygG7jLfOPWMa2KVNw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1561,8 +1548,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 - '@babel/runtime@7.28.6': - resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} + '@babel/runtime@7.29.2': + resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} engines: {node: '>=6.9.0'} '@babel/template@7.28.6': @@ -1585,6 +1572,10 @@ packages: resolution: {integrity: sha512-eZ/Aq+2r4PcJa6LbPCT6ffgIJfTU/gYilqIzoX2OLM4nNkbQC6tTMPZNn7aHHjhGPxbNLv41zm4Xqt1olCLgXw==} hasBin: true + '@bazel/ibazel@0.28.0': + resolution: {integrity: sha512-8WV3Uulai7afTG0OLo7Kf72actI0N6WK4a89i0kClO0WVlY2DguKyBPR/Xs//Sn/U4c4V93b0HS1ufUv3aTxbA==} + hasBin: true + '@bcoe/v8-coverage@1.0.2': resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} @@ -1597,24 +1588,20 @@ packages: resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} engines: {node: '>=0.1.90'} - '@conventional-changelog/git-client@1.0.1': - resolution: {integrity: sha512-PJEqBwAleffCMETaVm/fUgHldzBE35JFk3/9LL6NUA5EXa3qednu+UT6M7E5iBu3zIQZCULYIiZ90fBYHt6xUw==} + '@conventional-changelog/git-client@2.6.0': + resolution: {integrity: sha512-T+uPDciKf0/ioNNDpMGc8FDsehJClZP0yR3Q5MN6wE/Y/1QZ7F+80OgznnTCOlMEG4AV0LvH2UJi3C/nBnaBUg==} engines: {node: '>=18'} peerDependencies: conventional-commits-filter: ^5.0.0 - conventional-commits-parser: ^6.0.0 + conventional-commits-parser: ^6.3.0 peerDependenciesMeta: conventional-commits-filter: optional: true conventional-commits-parser: optional: true - '@cspotcode/source-map-support@0.8.1': - resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} - engines: {node: '>=12'} - - '@csstools/color-helpers@6.0.1': - resolution: {integrity: sha512-NmXRccUJMk2AWA5A7e5a//3bCIMyOu2hAtdRYrhPPHjDxINuCwX1w6rnIZ4xjLcp0ayv6h8Pc3X0eJUGiAAXHQ==} + '@csstools/color-helpers@6.0.2': + resolution: {integrity: sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==} engines: {node: '>=20.19.0'} '@csstools/css-calc@3.1.1': @@ -1624,8 +1611,8 @@ packages: '@csstools/css-parser-algorithms': ^4.0.0 '@csstools/css-tokenizer': ^4.0.0 - '@csstools/css-color-parser@4.0.1': - resolution: {integrity: sha512-vYwO15eRBEkeF6xjAno/KQ61HacNhfQuuU/eGwH67DplL0zD5ZixUa563phQvUelA07yDczIXdtmYojCphKJcw==} + '@csstools/css-color-parser@4.0.2': + resolution: {integrity: sha512-0GEfbBLmTFf0dJlpsNU7zwxRIH0/BGEMuXLTCvFYxuL1tNhqzTbtnFICyJLTNK4a+RechKP75e7w42ClXSnJQw==} engines: {node: '>=20.19.0'} peerDependencies: '@csstools/css-parser-algorithms': ^4.0.0 @@ -1637,30 +1624,26 @@ packages: peerDependencies: '@csstools/css-tokenizer': ^4.0.0 - '@csstools/css-syntax-patches-for-csstree@1.0.27': - resolution: {integrity: sha512-sxP33Jwg1bviSUXAV43cVYdmjt2TLnLXNqCWl9xmxHawWVjGz/kEbdkr7F9pxJNBN2Mh+dq0crgItbW6tQvyow==} + '@csstools/css-syntax-patches-for-csstree@1.1.2': + resolution: {integrity: sha512-5GkLzz4prTIpoyeUiIu3iV6CSG3Plo7xRVOFPKI7FVEJ3mZ0A8SwK0XU3Gl7xAkiQ+mDyam+NNp875/C5y+jSA==} + peerDependencies: + css-tree: ^3.2.1 + peerDependenciesMeta: + css-tree: + optional: true '@csstools/css-tokenizer@4.0.0': resolution: {integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==} engines: {node: '>=20.19.0'} - '@cypress/request@3.0.9': - resolution: {integrity: sha512-I3l7FdGRXluAS44/0NguwWlO83J18p0vlr2FYHrJkWdNYhgVoiYo61IXPqaOsL+vNxU1ZqMACzItGK3/KKDsdw==} + '@cypress/request@3.0.10': + resolution: {integrity: sha512-hauBrOdvu08vOsagkZ/Aju5XuiZx6ldsLfByg1htFeldhex+PeMrYauANzFsMJeAA0+dyPLbDoX2OYuvVoLDkQ==} engines: {node: '>= 6'} - '@discoveryjs/json-ext@0.6.3': - resolution: {integrity: sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==} + '@discoveryjs/json-ext@1.0.0': + resolution: {integrity: sha512-dDlz3W405VMFO4w5kIP9DOmELBcvFQGmLoKSdIRstBDubKFYwaNHV1NnlzMCQpXQFGWVALmeMORAuiLx18AvZQ==} engines: {node: '>=14.17.0'} - '@emnapi/core@1.8.1': - resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==} - - '@emnapi/runtime@1.8.1': - resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} - - '@emnapi/wasi-threads@1.1.0': - resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} - '@esbuild/aix-ppc64@0.27.3': resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==} engines: {node: '>=18'} @@ -1827,8 +1810,8 @@ packages: resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/compat@2.0.2': - resolution: {integrity: sha512-pR1DoD0h3HfF675QZx0xsyrsU8q70Z/plx7880NOhS02NuWLgBCOMDL787nUeQ7EWLkxv3bPQJaarjcPQb2Dwg==} + '@eslint/compat@2.0.3': + resolution: {integrity: sha512-SjIJhGigp8hmd1YGIBwh7Ovri7Kisl42GYFjrOyHhtfYGGoLW6teYi/5p8W50KSsawUPpuLOSmsq1bD0NGQLBw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} peerDependencies: eslint: ^8.40 || 9 || 10 @@ -1836,40 +1819,41 @@ packages: eslint: optional: true - '@eslint/config-array@0.21.1': - resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/config-helpers@0.4.2': - resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/config-array@0.23.4': + resolution: {integrity: sha512-lf19F24LSMfF8weXvW5QEtnLqW70u7kgit5e9PSx0MsHAFclGd1T9ynvWEMDT1w5J4Qt54tomGeAhdoAku1Xow==} + 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/config-helpers@0.5.4': + resolution: {integrity: sha512-jJhqiY3wPMlWWO3370M86CPJ7pt8GmEwSLglMfQhjXal07RCvhmU0as4IuUEW5SJeunfItiEetHmSxCCe9lDBg==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/core@1.1.0': - resolution: {integrity: sha512-/nr9K9wkr3P1EzFTdFdMoLuo1PmIxjmwvPozwoSodjNBdefGujXQUF93u1DDZpEaTuDvMsIQddsd35BwtrW9Xw==} + '@eslint/core@1.2.0': + resolution: {integrity: sha512-8FTGbNzTvmSlc4cZBaShkC6YvFMG0riksYWRFKXztqVdXaQbcZLXlFbSpC05s70sGEsXAw0qwhx69JiW7hQS7A==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/eslintrc@3.3.3': - resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} + '@eslint/eslintrc@3.3.5': + resolution: {integrity: sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.39.2': - resolution: {integrity: sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==} - 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/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} + '@eslint/object-schema@3.0.4': + resolution: {integrity: sha512-55lO/7+Yp0ISKRP0PsPtNTeNGapXaO085aELZmWCVc5SH3jfrqpuU6YgOdIxMS99ZHkQN1cXKE+cdIqwww9ptw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/plugin-kit@0.4.1': - resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/plugin-kit@0.6.1': + resolution: {integrity: sha512-iH1B076HoAshH1mLpHMgwdGeTs0CYwL0SPMkGuSebZrwBp16v415e9NZXg2jtrqPVQjf6IANe2Vtlr5KswtcZQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@exodus/bytes@1.14.1': - resolution: {integrity: sha512-OhkBFWI6GcRMUroChZiopRiSp2iAMvEBK47NhJooDqz1RERO4QuZIZnjP63TXX8GAiLABkYmX+fuQsdJ1dd2QQ==} + '@exodus/bytes@1.15.0': + resolution: {integrity: sha512-UY0nlA+feH81UGSHv92sLEPLCeZFjXOuHhrIo0HQydScuQc8s0A7kL/UdgwgDq8g8ilksmuoF35YVTNphV2aBQ==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: '@noble/hashes': ^1.8.0 || ^2.0.0 @@ -1877,28 +1861,28 @@ packages: '@noble/hashes': optional: true - '@firebase/ai@2.7.0': - resolution: {integrity: sha512-PwpCz+TtAMWICM7uQNO0mkSPpUKwrMV4NSwHkbVKDvPKoaQmSlO96vIz+Suw2Ao1EaUUsxYb5LGImHWt/fSnRQ==} + '@firebase/ai@2.10.0': + resolution: {integrity: sha512-1lI6HomyoO/8RSJb6ItyHLpHnB2z27m5F4aX/Vpi1nhwWoxdNjkq+6UQOykHyCE0KairojOE5qQ20i1tnF0nNA==} engines: {node: '>=20.0.0'} peerDependencies: '@firebase/app': 0.x '@firebase/app-types': 0.x - '@firebase/analytics-compat@0.2.25': - resolution: {integrity: sha512-fdzoaG0BEKbqksRDhmf4JoyZf16Wosrl0Y7tbZtJyVDOOwziE0vrFjmZuTdviL0yhak+Nco6rMsUUbkbD+qb6Q==} + '@firebase/analytics-compat@0.2.27': + resolution: {integrity: sha512-ZObpYpAxL6JfgH7GnvlDD0sbzGZ0o4nijV8skatV9ZX49hJtCYbFqaEcPYptT94rgX1KUoKEderC7/fa7hybtw==} peerDependencies: '@firebase/app-compat': 0.x '@firebase/analytics-types@0.8.3': resolution: {integrity: sha512-VrIp/d8iq2g501qO46uGz3hjbDb8xzYMrbu8Tp0ovzIzrvJZ2fvmj649gTjge/b7cCCcjT0H37g1gVtlNhnkbg==} - '@firebase/analytics@0.10.19': - resolution: {integrity: sha512-3wU676fh60gaiVYQEEXsbGS4HbF2XsiBphyvvqDbtC1U4/dO4coshbYktcCHq+HFaGIK07iHOh4pME0hEq1fcg==} + '@firebase/analytics@0.10.21': + resolution: {integrity: sha512-j2y2q65BlgLGB5Pwjhv/Jopw2X/TBTzvAtI5z/DSp56U4wBj7LfhBfzbdCtFPges+Wz0g55GdoawXibOH5jGng==} peerDependencies: '@firebase/app': 0.x - '@firebase/app-check-compat@0.4.0': - resolution: {integrity: sha512-UfK2Q8RJNjYM/8MFORltZRG9lJj11k0nW84rrffiKvcJxLf1jf6IEjCIkCamykHE73C6BwqhVfhIBs69GXQV0g==} + '@firebase/app-check-compat@0.4.2': + resolution: {integrity: sha512-M91NhxqbSkI0ChkJWy69blC+rPr6HEgaeRllddSaU1pQ/7IiegeCQM9pPDIgvWnwnBSzKhUHpe6ro/jhJ+cvzw==} engines: {node: '>=20.0.0'} peerDependencies: '@firebase/app-compat': 0.x @@ -1909,25 +1893,25 @@ packages: '@firebase/app-check-types@0.5.3': resolution: {integrity: sha512-hyl5rKSj0QmwPdsAxrI5x1otDlByQ7bvNvVt8G/XPO2CSwE++rmSVf3VEhaeOR4J8ZFaF0Z0NDSmLejPweZ3ng==} - '@firebase/app-check@0.11.0': - resolution: {integrity: sha512-XAvALQayUMBJo58U/rxW02IhsesaxxfWVmVkauZvGEz3vOAjMEQnzFlyblqkc2iAaO82uJ2ZVyZv9XzPfxjJ6w==} + '@firebase/app-check@0.11.2': + resolution: {integrity: sha512-jcXQVMHAQ5AEKzVD5C7s5fmAYeFOuN6lAJeNTgZK2B9aLnofWaJt8u1A8Idm8gpsBBYSaY3cVyeH5SWMOVPBLQ==} engines: {node: '>=20.0.0'} peerDependencies: '@firebase/app': 0.x - '@firebase/app-compat@0.5.7': - resolution: {integrity: sha512-MO+jfap8IBZQ+K8L2QCiHObyMgpYHrxo4Hc7iJgfb9hjGRW/z1y6LWVdT9wBBK+VJ7cRP2DjAiWQP+thu53hHA==} + '@firebase/app-compat@0.5.10': + resolution: {integrity: sha512-tFmBuZL0/v1h6eyKRgWI58ucft6dEJmAi9nhPUXoAW4ZbPSTlnsh31AuEwUoRTz+wwRk9gmgss9GZV05ZM9Kug==} engines: {node: '>=20.0.0'} '@firebase/app-types@0.9.3': resolution: {integrity: sha512-kRVpIl4vVGJ4baogMDINbyrIOtOxqhkZQg4jTq3l8Lw6WSk0xfpEYzezFu+Kl4ve4fbPl79dvwRtaFqAC/ucCw==} - '@firebase/app@0.14.7': - resolution: {integrity: sha512-o3ZfnOx0AWBD5n/36p2zPoB0rDDxQP8H/A60zDLvvfRLtW8b3LfCyV97GKpJaAVV1JMMl/BC89EDzMyzxFZxTw==} + '@firebase/app@0.14.10': + resolution: {integrity: sha512-PlPhdtjgWUra+LImQTnXOUqUa/jcufZhizdR93ZjlQSS3ahCtDTG6pJw7j0OwFal18DQjICXfeVNsUUrcNisfA==} engines: {node: '>=20.0.0'} - '@firebase/auth-compat@0.6.2': - resolution: {integrity: sha512-8UhCzF6pav9bw/eXA8Zy1QAKssPRYEYXaWagie1ewLTwHkXv6bKp/j6/IwzSYQP67sy/BMFXIFaCCsoXzFLr7A==} + '@firebase/auth-compat@0.6.4': + resolution: {integrity: sha512-2pj8m/hnqXvMLfC0Mk+fORVTM5DQPkS6l8JpMgtoAWGVgCmYnoWdFMaNWtKbmCxBEyvMA3FlnCJyzrUSMWTfuA==} engines: {node: '>=20.0.0'} peerDependencies: '@firebase/app-compat': 0.x @@ -1941,8 +1925,8 @@ packages: '@firebase/app-types': 0.x '@firebase/util': 1.x - '@firebase/auth@1.12.0': - resolution: {integrity: sha512-zkvLpsrxynWHk07qGrUDfCSqKf4AvfZGEqJ7mVCtYGjNNDbGE71k0Yn84rg8QEZu4hQw1BC0qDEHzpNVBcSVmA==} + '@firebase/auth@1.12.2': + resolution: {integrity: sha512-CZJL8V10Vzibs+pDTXdQF+hot1IigIoqF4a4lA/qr5Deo1srcefiyIfgg28B67Lk7IxZhwfJMuI+1bu2xBmV0A==} engines: {node: '>=20.0.0'} peerDependencies: '@firebase/app': 0.x @@ -1951,28 +1935,28 @@ packages: '@react-native-async-storage/async-storage': optional: true - '@firebase/component@0.7.0': - resolution: {integrity: sha512-wR9En2A+WESUHexjmRHkqtaVH94WLNKt6rmeqZhSLBybg4Wyf0Umk04SZsS6sBq4102ZsDBFwoqMqJYj2IoDSg==} + '@firebase/component@0.7.2': + resolution: {integrity: sha512-iyVDGc6Vjx7Rm0cAdccLH/NG6fADsgJak/XW9IA2lPf8AjIlsemOpFGKczYyPHxm4rnKdR8z6sK4+KEC7NwmEg==} engines: {node: '>=20.0.0'} - '@firebase/data-connect@0.3.12': - resolution: {integrity: sha512-baPddcoNLj/+vYo+HSJidJUdr5W4OkhT109c5qhR8T1dJoZcyJpkv/dFpYlw/VJ3dV66vI8GHQFrmAZw/xUS4g==} + '@firebase/data-connect@0.5.0': + resolution: {integrity: sha512-G3GYHpWNJJ95502RQLApzw0jaG3pScHl+J/2MdxIuB51xtHnkRL6KvIAP3fFF1drUewWJHOnDA1U+q4Evf3KSw==} peerDependencies: '@firebase/app': 0.x - '@firebase/database-compat@2.1.0': - resolution: {integrity: sha512-8nYc43RqxScsePVd1qe1xxvWNf0OBnbwHxmXJ7MHSuuTVYFO3eLyLW3PiCKJ9fHnmIz4p4LbieXwz+qtr9PZDg==} + '@firebase/database-compat@2.1.2': + resolution: {integrity: sha512-j4A6IhVZbgxAzT6gJJC2PfOxYCK9SrDrUO7nTM4EscTYtKkAkzsbKoCnDdjFapQfnsncvPWjqVTr/0PffUwg3g==} engines: {node: '>=20.0.0'} - '@firebase/database-types@1.0.16': - resolution: {integrity: sha512-xkQLQfU5De7+SPhEGAXFBnDryUWhhlFXelEg2YeZOQMCdoe7dL64DDAd77SQsR+6uoXIZY5MB4y/inCs4GTfcw==} + '@firebase/database-types@1.0.18': + resolution: {integrity: sha512-yOY8IC2go9lfbVDMiy2ATun4EB2AFwocPaQADwMN/RHRUAZSM4rlAV7PGbWPSG/YhkJ2A9xQAiAENgSua9G5Fg==} - '@firebase/database@1.1.0': - resolution: {integrity: sha512-gM6MJFae3pTyNLoc9VcJNuaUDej0ctdjn3cVtILo3D5lpp0dmUHHLFN/pUKe7ImyeB1KAvRlEYxvIHNF04Filg==} + '@firebase/database@1.1.2': + resolution: {integrity: sha512-lP96CMjMPy/+d1d9qaaHjHHdzdwvEOuyyLq9ehX89e2XMKwS1jHNzYBO+42bdSumuj5ukPbmnFtViZu8YOMT+w==} engines: {node: '>=20.0.0'} - '@firebase/firestore-compat@0.4.4': - resolution: {integrity: sha512-JvxxIgi+D5v9BecjLA1YomdyF7LA6CXhJuVK10b4GtRrB3m2O2hT1jJWbKYZYHUAjTaajkvnos+4U5VNxqkI2w==} + '@firebase/firestore-compat@0.4.7': + resolution: {integrity: sha512-Et4XxtGnjp0Q9tmaEMETnY5GHJ8gQ9+RN6sSTT4ETWKmym2d6gIjarw0rCQcx+7BrWVYLEIOAXSXysl0b3xnUA==} engines: {node: '>=20.0.0'} peerDependencies: '@firebase/app-compat': 0.x @@ -1983,14 +1967,14 @@ packages: '@firebase/app-types': 0.x '@firebase/util': 1.x - '@firebase/firestore@4.10.0': - resolution: {integrity: sha512-fgF6EbpoagGWh5Vwfu/7/jYgBFwUCwTlPNVF/aSjHcoEDRXpRsIqVfAFTp1LD+dWAUcAKEK3h+osk8spMJXtxA==} + '@firebase/firestore@4.13.0': + resolution: {integrity: sha512-7i4cVNJXTMim7/P7UsNim0DwyLPk4QQ3y1oSNzv4l0ykJOKYCiFMOuEeUxUYvrReXDJxWHrT/4XMeVQm+13rRw==} engines: {node: '>=20.0.0'} peerDependencies: '@firebase/app': 0.x - '@firebase/functions-compat@0.4.1': - resolution: {integrity: sha512-AxxUBXKuPrWaVNQ8o1cG1GaCAtXT8a0eaTDfqgS5VsRYLAR0ALcfqDLwo/QyijZj1w8Qf8n3Qrfy/+Im245hOQ==} + '@firebase/functions-compat@0.4.3': + resolution: {integrity: sha512-BxkEwWgx1of0tKaao/r2VR6WBLk/RAiyztatiONPrPE8gkitFkOnOCxf8i9cUyA5hX5RGt5H30uNn25Q6QNEmQ==} engines: {node: '>=20.0.0'} peerDependencies: '@firebase/app-compat': 0.x @@ -1998,14 +1982,14 @@ packages: '@firebase/functions-types@0.6.3': resolution: {integrity: sha512-EZoDKQLUHFKNx6VLipQwrSMh01A1SaL3Wg6Hpi//x6/fJ6Ee4hrAeswK99I5Ht8roiniKHw4iO0B1Oxj5I4plg==} - '@firebase/functions@0.13.1': - resolution: {integrity: sha512-sUeWSb0rw5T+6wuV2o9XNmh9yHxjFI9zVGFnjFi+n7drTEWpl7ZTz1nROgGrSu472r+LAaj+2YaSicD4R8wfbw==} + '@firebase/functions@0.13.3': + resolution: {integrity: sha512-csO7ckK3SSs+NUZW1nms9EK7ckHe/1QOjiP8uAkCYa7ND18s44vjE9g3KxEeIUpyEPqZaX1EhJuFyZjHigAcYw==} engines: {node: '>=20.0.0'} peerDependencies: '@firebase/app': 0.x - '@firebase/installations-compat@0.2.19': - resolution: {integrity: sha512-khfzIY3EI5LePePo7vT19/VEIH1E3iYsHknI/6ek9T8QCozAZshWT9CjlwOzZrKvTHMeNcbpo/VSOSIWDSjWdQ==} + '@firebase/installations-compat@0.2.21': + resolution: {integrity: sha512-zahIUkaVKbR8zmTeBHkdfaVl6JGWlhVoSjF7CVH33nFqD3SlPEpEEegn2GNT5iAfsVdtlCyJJ9GW4YKjq+RJKQ==} peerDependencies: '@firebase/app-compat': 0.x @@ -2014,8 +1998,8 @@ packages: peerDependencies: '@firebase/app-types': 0.x - '@firebase/installations@0.6.19': - resolution: {integrity: sha512-nGDmiwKLI1lerhwfwSHvMR9RZuIH5/8E3kgUWnVRqqL7kGVSktjLTWEMva7oh5yxQ3zXfIlIwJwMcaM5bK5j8Q==} + '@firebase/installations@0.6.21': + resolution: {integrity: sha512-xGFGTeICJZ5vhrmmDukeczIcFULFXybojML2+QSDFoKj5A7zbGN7KzFGSKNhDkIxpjzsYG9IleJyUebuAcmqWA==} peerDependencies: '@firebase/app': 0.x @@ -2023,47 +2007,47 @@ packages: resolution: {integrity: sha512-cGskaAvkrnh42b3BA3doDWeBmuHFO/Mx5A83rbRDYakPjO9bJtRL3dX7javzc2Rr/JHZf4HlterTW2lUkfeN4g==} engines: {node: '>=20.0.0'} - '@firebase/messaging-compat@0.2.23': - resolution: {integrity: sha512-SN857v/kBUvlQ9X/UjAqBoQ2FEaL1ZozpnmL1ByTe57iXkmnVVFm9KqAsTfmf+OEwWI4kJJe9NObtN/w22lUgg==} + '@firebase/messaging-compat@0.2.25': + resolution: {integrity: sha512-eoOQqGLtRlseTdiemTN44LlHZpltK5gnhq8XVUuLgtIOG+odtDzrz2UoTpcJWSzaJQVxNLb/x9f39tHdDM4N4w==} peerDependencies: '@firebase/app-compat': 0.x '@firebase/messaging-interop-types@0.2.3': resolution: {integrity: sha512-xfzFaJpzcmtDjycpDeCUj0Ge10ATFi/VHVIvEEjDNc3hodVBQADZ7BWQU7CuFpjSHE+eLuBI13z5F/9xOoGX8Q==} - '@firebase/messaging@0.12.23': - resolution: {integrity: sha512-cfuzv47XxqW4HH/OcR5rM+AlQd1xL/VhuaeW/wzMW1LFrsFcTn0GND/hak1vkQc2th8UisBcrkVcQAnOnKwYxg==} + '@firebase/messaging@0.12.25': + resolution: {integrity: sha512-7RhDwoDHlOK1/ou0/LeubxmjcngsTjDdrY/ssg2vwAVpUuVAhQzQvuCAOYxcX5wNC1zCgQ54AP1vdngBwbCmOQ==} peerDependencies: '@firebase/app': 0.x - '@firebase/performance-compat@0.2.22': - resolution: {integrity: sha512-xLKxaSAl/FVi10wDX/CHIYEUP13jXUjinL+UaNXT9ByIvxII5Ne5150mx6IgM8G6Q3V+sPiw9C8/kygkyHUVxg==} + '@firebase/performance-compat@0.2.24': + resolution: {integrity: sha512-YRlejH8wLt7ThWao+HXoKUHUrZKGYq+otxkPS+8nuE5PeN1cBXX7NAJl9ueuUkBwMIrnKdnDqL/voHXxDAAt3g==} peerDependencies: '@firebase/app-compat': 0.x '@firebase/performance-types@0.2.3': resolution: {integrity: sha512-IgkyTz6QZVPAq8GSkLYJvwSLr3LS9+V6vNPQr0x4YozZJiLF5jYixj0amDtATf1X0EtYHqoPO48a9ija8GocxQ==} - '@firebase/performance@0.7.9': - resolution: {integrity: sha512-UzybENl1EdM2I1sjYm74xGt/0JzRnU/0VmfMAKo2LSpHJzaj77FCLZXmYQ4oOuE+Pxtt8Wy2BVJEENiZkaZAzQ==} + '@firebase/performance@0.7.11': + resolution: {integrity: sha512-V3uAhrz7IYJuji+OgT3qYTGKxpek/TViXti9OSsUJ4AexZ3jQjYH5Yrn7JvBxk8MGiSLsC872hh+BxQiPZsm7g==} peerDependencies: '@firebase/app': 0.x - '@firebase/remote-config-compat@0.2.21': - resolution: {integrity: sha512-9+lm0eUycxbu8GO25JfJe4s6R2xlDqlVt0CR6CvN9E6B4AFArEV4qfLoDVRgIEB7nHKwvH2nYRocPWfmjRQTnw==} + '@firebase/remote-config-compat@0.2.23': + resolution: {integrity: sha512-4+KqRRHEUUmKT6tFmnpWATOsaFfmSuBs1jXH8JzVtMLEYqq/WS9IDM92OdefFDSrAA2xGd0WN004z8mKeIIscw==} peerDependencies: '@firebase/app-compat': 0.x '@firebase/remote-config-types@0.5.0': resolution: {integrity: sha512-vI3bqLoF14L/GchtgayMiFpZJF+Ao3uR8WCde0XpYNkSokDpAKca2DxvcfeZv7lZUqkUwQPL2wD83d3vQ4vvrg==} - '@firebase/remote-config@0.8.0': - resolution: {integrity: sha512-sJz7C2VACeE257Z/3kY9Ap2WXbFsgsDLfaGfZmmToKAK39ipXxFan+vzB9CSbF6mP7bzjyzEnqPcMXhAnYE6fQ==} + '@firebase/remote-config@0.8.2': + resolution: {integrity: sha512-5EXqOThV4upjK9D38d/qOSVwOqRhemlaOFk9vCkMNNALeIlwr+4pLjtLNo4qoY8etQmU/1q4aIATE9N8PFqg0g==} peerDependencies: '@firebase/app': 0.x - '@firebase/storage-compat@0.4.0': - resolution: {integrity: sha512-vDzhgGczr1OfcOy285YAPur5pWDEvD67w4thyeCUh6Ys0izN9fNYtA1MJERmNBfqjqu0lg0FM5GLbw0Il21M+g==} + '@firebase/storage-compat@0.4.2': + resolution: {integrity: sha512-R+aB38wxCH5zjIO/xu9KznI7fgiPuZAG98uVm1NcidHyyupGgIDLKigGmRGBZMnxibe/m2oxNKoZpfEbUX2aQQ==} engines: {node: '>=20.0.0'} peerDependencies: '@firebase/app-compat': 0.x @@ -2074,19 +2058,23 @@ packages: '@firebase/app-types': 0.x '@firebase/util': 1.x - '@firebase/storage@0.14.0': - resolution: {integrity: sha512-xWWbb15o6/pWEw8H01UQ1dC5U3rf8QTAzOChYyCpafV6Xki7KVp3Yaw2nSklUwHEziSWE9KoZJS7iYeyqWnYFA==} + '@firebase/storage@0.14.2': + resolution: {integrity: sha512-o/culaTeJ8GRpKXRJov21rux/n9dRaSOWLebyatFP2sqEdCxQPjVA1H9Z2fzYwQxMIU0JVmC7SPPmU11v7L6vQ==} engines: {node: '>=20.0.0'} peerDependencies: '@firebase/app': 0.x - '@firebase/util@1.13.0': - resolution: {integrity: sha512-0AZUyYUfpMNcztR5l09izHwXkZpghLgCUaAGjtMwXnCg3bj4ml5VgiwqOMOxJ+Nw4qN/zJAaOQBcJ7KGkWStqQ==} + '@firebase/util@1.15.0': + resolution: {integrity: sha512-AmWf3cHAOMbrCPG4xdPKQaj5iHnyYfyLKZxwz+Xf55bqKbpAmcYifB4jQinT2W9XhDRHISOoPyBOariJpCG6FA==} engines: {node: '>=20.0.0'} '@firebase/webchannel-wrapper@1.0.5': resolution: {integrity: sha512-+uGNN7rkfn41HLO0vekTFhTxk61eKa8mTpRGLO0QSqlQdKvIoGAvLp3ppdVIWbTGYJWM6Kp0iN+PjMIOcnVqTw==} + '@gar/promise-retry@1.0.3': + resolution: {integrity: sha512-GmzA9ckNokPypTg10pgpeHNQe7ph+iIKKmhKu3Ob9ANkswreCx7R3cKmY781K8QK3AqVL3xVh9A42JvIAbkkSA==} + engines: {node: ^20.17.0 || >=22.9.0} + '@glideapps/ts-necessities@2.2.3': resolution: {integrity: sha512-gXi0awOZLHk3TbW55GZLCPP6O+y/b5X1pBXKBVckFONSwF1z1E5ND2BGJsghQFah+pW7pkkyFb2VhUQI2qhL5w==} @@ -2118,8 +2106,8 @@ packages: resolution: {integrity: sha512-IJn+8A3QZJfe7FUtWqHVNo3xJs7KFpurCWGWCiCz3oEh+BkRymKZ1QxfAbU2yGMDzTytLGQ2IV6T2r3cuo75/w==} engines: {node: '>=18'} - '@google/genai@1.38.0': - resolution: {integrity: sha512-V/4CQVQGovvGHuS73lwJwHKR9x33kCij3zz/ReEQ4A7RJaV0U7m4k1mvYhFk55cGZdF5JLKu2S9BTaFuEs5xTA==} + '@google/genai@1.48.0': + resolution: {integrity: sha512-plonYK4ML2PrxsRD9SeqmFt76eREWkQdPCglOA6aYDzL1AAbE+7PUnT54SvpWGfws13L0AZEqGSpL7+1IPnTxQ==} engines: {node: '>=20.0.0'} peerDependencies: '@modelcontextprotocol/sdk': ^1.25.2 @@ -2145,14 +2133,11 @@ packages: engines: {node: '>=6'} hasBin: true - '@hapi/bourne@3.0.0': - resolution: {integrity: sha512-Waj1cwPXJDucOib4a3bAISsKJVb15MKi9IvmTI/7ssVEm6sywXGjVJDhl6/umt1pK1ZS7PacXU3A1PmFKHEZ2w==} - '@harperfast/extended-iterable@1.0.3': resolution: {integrity: sha512-sSAYhQca3rDWtQUHSAPeO7axFIUJOI6hn1gjRC5APVE1a90tuyT8f5WIgRsFhhWA7htNkju2veB9eWL6YHi/Lw==} - '@hono/node-server@1.19.9': - resolution: {integrity: sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw==} + '@hono/node-server@1.19.13': + resolution: {integrity: sha512-TsQLe4i2gvoTtrHje625ngThGBySOgSK3Xo2XRYOdqGN1teR8+I7vchQC46uLJi8OF62YTYA3AhSpumtkhsaKQ==} engines: {node: '>=18.14.1'} peerDependencies: hono: ^4 @@ -2173,25 +2158,12 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} - '@inquirer/ansi@1.0.2': - resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==} - engines: {node: '>=18'} - - '@inquirer/ansi@2.0.3': - resolution: {integrity: sha512-g44zhR3NIKVs0zUesa4iMzExmZpLUdTLRMCStqX3GE5NT6VkPcxQGJ+uC8tDgBUC/vB1rUhUd55cOf++4NZcmw==} + '@inquirer/ansi@2.0.5': + resolution: {integrity: sha512-doc2sWgJpbFQ64UflSVd17ibMGDuxO1yKgOgLMwavzESnXjFWJqUeG8saYosqKpHp4kWiM5x1nXvEjbpx90gzw==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} - '@inquirer/checkbox@4.3.2': - resolution: {integrity: sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - - '@inquirer/checkbox@5.0.6': - resolution: {integrity: sha512-qLZ1gOpsqsieB5k98GQ9bWYggvMsCXTc7HUwhEQpTsxFQYGthqR9UysCwqB7L9h47THYdXhJegnYb1IqURMjng==} + '@inquirer/checkbox@5.1.3': + resolution: {integrity: sha512-+G7I8CT+EHv/hasNfUl3P37DVoMoZfpA+2FXmM54dA8MxYle1YqucxbacxHalw1iAFSdKNEDTGNV7F+j1Ldqcg==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -2199,17 +2171,8 @@ packages: '@types/node': optional: true - '@inquirer/confirm@5.1.21': - resolution: {integrity: sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - - '@inquirer/confirm@6.0.6': - resolution: {integrity: sha512-9ZkrGYiWnOKQPc3xfLIORE3lZW1qvtgRoJcoqopr5zssBn7yk4yONmzGynEOjc16FnUXzkAejj/I29BbfcoUfQ==} + '@inquirer/confirm@6.0.10': + resolution: {integrity: sha512-tiNyA73pgpQ0FQ7axqtoLUe4GDYjNCDcVsbgcA5anvwg2z6i+suEngLKKJrWKJolT//GFPZHwN30binDIHgSgQ==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -2217,17 +2180,8 @@ packages: '@types/node': optional: true - '@inquirer/core@10.3.2': - resolution: {integrity: sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - - '@inquirer/core@11.1.3': - resolution: {integrity: sha512-TBAGPDGvpwFSQ4nkawQzq5/X7DhElANjvKeUtcjpVnBIfuH/OEu4M+79R3+bGPtwxST4DOIGRtF933mUH2bRVw==} + '@inquirer/core@11.1.8': + resolution: {integrity: sha512-/u+yJk2pOKNDOh1ZgdUH2RQaRx6OOH4I0uwL95qPvTFTIL38YBsuSC4r1yXBB3Q6JvNqFFc202gk0Ew79rrcjA==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -2235,17 +2189,8 @@ packages: '@types/node': optional: true - '@inquirer/editor@4.2.23': - resolution: {integrity: sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - - '@inquirer/editor@5.0.6': - resolution: {integrity: sha512-dxTi/TB29NaW18u0pQl3B140695izGUMzr340a4Yhxll3oa0/iwxl6C88sX9LDUPFaaM4FDASEMnLm8XVk2VVg==} + '@inquirer/editor@5.1.0': + resolution: {integrity: sha512-6wlkYl65Qfayy48gPCfU4D7li6KCAGN79mLXa/tYHZH99OfZ820yY+HA+DgE88r8YwwgeuY6PQgNqMeK6LuMmw==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -2253,17 +2198,8 @@ packages: '@types/node': optional: true - '@inquirer/expand@4.0.23': - resolution: {integrity: sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - - '@inquirer/expand@5.0.6': - resolution: {integrity: sha512-HmgMzFdMk/gmPXfuFy4xgWkyIVbdH81otQkrFbhklFZcGauwDFD1EbgmZdgmYCN5pWhSEnYIadg1kysLgPIYag==} + '@inquirer/expand@5.0.12': + resolution: {integrity: sha512-vOfrB33b7YIZfDauXS8vNNz2Z86FozTZLIt7e+7/dCaPJ1RXZsHCuI9TlcERzEUq57vkM+UdnBgxP0rFd23JYQ==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -2271,17 +2207,8 @@ packages: '@types/node': optional: true - '@inquirer/external-editor@1.0.3': - resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - - '@inquirer/external-editor@2.0.3': - resolution: {integrity: sha512-LgyI7Agbda74/cL5MvA88iDpvdXI2KuMBCGRkbCl2Dg1vzHeOgs+s0SDcXV7b+WZJrv2+ERpWSM65Fpi9VfY3w==} + '@inquirer/external-editor@3.0.0': + resolution: {integrity: sha512-lDSwMgg+M5rq6JKBYaJwSX6T9e/HK2qqZ1oxmOwn4AQoJE5D+7TumsxLGC02PWS//rkIVqbZv3XA3ejsc9FYvg==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -2289,25 +2216,12 @@ packages: '@types/node': optional: true - '@inquirer/figures@1.0.15': - resolution: {integrity: sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==} - engines: {node: '>=18'} - - '@inquirer/figures@2.0.3': - resolution: {integrity: sha512-y09iGt3JKoOCBQ3w4YrSJdokcD8ciSlMIWsD+auPu+OZpfxLuyz+gICAQ6GCBOmJJt4KEQGHuZSVff2jiNOy7g==} + '@inquirer/figures@2.0.5': + resolution: {integrity: sha512-NsSs4kzfm12lNetHwAn3GEuH317IzpwrMCbOuMIVytpjnJ90YYHNwdRgYGuKmVxwuIqSgqk3M5qqQt1cDk0tGQ==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} - '@inquirer/input@4.3.1': - resolution: {integrity: sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - - '@inquirer/input@5.0.6': - resolution: {integrity: sha512-RZsJcjMJA3QNI9q9OiAi1fAom+Pb8on6alJB1Teh5jjKaiG5C79P69cG955ZRfgPdxTmI4uyhf33+94Xj7xWig==} + '@inquirer/input@5.0.11': + resolution: {integrity: sha512-twUWidn4ocPO8qi6fRM7tNWt7W1FOnOZqQ+/+PsfLUacMR5rFLDPK9ql0nBPwxi0oELbo8T5NhRs8B2+qQEqFQ==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -2315,17 +2229,8 @@ packages: '@types/node': optional: true - '@inquirer/number@3.0.23': - resolution: {integrity: sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - - '@inquirer/number@4.0.6': - resolution: {integrity: sha512-owMkAY+gR0BggomDTL+Z22x/yfE4ocFrmNyJacOiaDVA/d+iL4IWyk7Ds7JEuDMxuhHFB46Dubdxg1uiD7GlCA==} + '@inquirer/number@4.0.11': + resolution: {integrity: sha512-Vscmim9TCksQsfjPtka/JwPUcbLhqWYrgfPf1cHrCm24X/F2joFwnageD50yMKsaX14oNGOyKf/RNXAFkNjWpA==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -2333,17 +2238,8 @@ packages: '@types/node': optional: true - '@inquirer/password@4.0.23': - resolution: {integrity: sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - - '@inquirer/password@5.0.6': - resolution: {integrity: sha512-c4BT4SB79iYwPhtGVBSvrlTnn4oFSYnwocafmktpay8RK75T2c2+fLlR0i1Cxw0QOhdy/YULdmpHoy1sOrPzvA==} + '@inquirer/password@5.0.11': + resolution: {integrity: sha512-9KZFeRaNHIcejtPb0wN4ddFc7EvobVoAFa049eS3LrDZFxI8O7xUXiITEOinBzkZFAIwY5V4yzQae/QfO9cbbg==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -2351,17 +2247,8 @@ packages: '@types/node': optional: true - '@inquirer/prompts@7.10.1': - resolution: {integrity: sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - - '@inquirer/prompts@8.2.0': - resolution: {integrity: sha512-rqTzOprAj55a27jctS3vhvDDJzYXsr33WXTjODgVOru21NvBo9yIgLIAf7SBdSV0WERVly3dR6TWyp7ZHkvKFA==} + '@inquirer/prompts@8.3.2': + resolution: {integrity: sha512-yFroiSj2iiBFlm59amdTvAcQFvWS6ph5oKESls/uqPBect7rTU2GbjyZO2DqxMGuIwVA8z0P4K6ViPcd/cp+0w==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -2369,17 +2256,8 @@ packages: '@types/node': optional: true - '@inquirer/rawlist@4.1.11': - resolution: {integrity: sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - - '@inquirer/rawlist@5.2.2': - resolution: {integrity: sha512-ld2EhLlf3fsBv7QfxR31NdBecGdS6eeFFZ+Nx88ApjtifeCEc9TNrw8x5tGe+gd6HG1ERczOb4B/bMojiGIp1g==} + '@inquirer/rawlist@5.2.7': + resolution: {integrity: sha512-AqRMiD9+uE1lskDPrdqHwrV/EUmxKEBLX44SR7uxK3vD2413AmVfE5EQaPeNzYf5Pq5SitHJDYUFVF0poIr09w==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -2387,17 +2265,8 @@ packages: '@types/node': optional: true - '@inquirer/search@3.2.2': - resolution: {integrity: sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - - '@inquirer/search@4.1.2': - resolution: {integrity: sha512-kdGbbbWYKldWxpxodKYPmFl/ctBi3DjWlA4LX48jXtqJ7NEeoEKlyFTbE4xNEFcGDi15tvaxRLzCV4A53zqYIw==} + '@inquirer/search@4.1.7': + resolution: {integrity: sha512-1y7+0N65AWk5RdlXH/Kn13txf3IjIQ7OEfhCEkDTU+h5wKMLq8DUF3P6z+/kLSxDGDtQT1dRBWEUC3o/VvImsQ==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -2405,17 +2274,8 @@ packages: '@types/node': optional: true - '@inquirer/select@4.4.2': - resolution: {integrity: sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - - '@inquirer/select@5.0.6': - resolution: {integrity: sha512-9DyVbNCo4q0C3CkGd6zW0SW3NQuuk4Hy0NSbP6zErz2YNWF4EHHJCRzcV34/CDQLraeAQXbHYlMofuUrs6BBZQ==} + '@inquirer/select@5.1.3': + resolution: {integrity: sha512-zYyqWgGQi3NhBcNq4Isc5rB3oEdQEh1Q/EcAnOW0FK4MpnXWkvSBYgA4cYrTM4A9UB573omouZbnL9JJ74Mq3A==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -2423,17 +2283,17 @@ packages: '@types/node': optional: true - '@inquirer/type@3.0.10': - resolution: {integrity: sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==} - engines: {node: '>=18'} + '@inquirer/type@4.0.4': + resolution: {integrity: sha512-PamArxO3cFJZoOzspzo6cxVlLeIftyBsZw/S9bKY5DzxqJVZgjoj1oP8d0rskKtp7sZxBycsoer1g6UeJV1BBA==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: '@types/node': optional: true - '@inquirer/type@4.0.3': - resolution: {integrity: sha512-cKZN7qcXOpj1h+1eTTcGDVLaBIHNMT1Rz9JqJP5MnEJ0JhgVWllx7H/tahUp5YEK1qaByH2Itb8wLG/iScD5kw==} + '@inquirer/type@4.0.5': + resolution: {integrity: sha512-aetVUNeKNc/VriqXlw1NRSW0zhMBB0W4bNbWRJgzRl/3d0QNDQFfk0GO5SDdtjMZVg6o8ZKEiadd7SCCzoOn5Q==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -2441,22 +2301,10 @@ packages: '@types/node': optional: true - '@isaacs/balanced-match@4.0.1': - resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} - engines: {node: 20 || >=22} - - '@isaacs/brace-expansion@5.0.1': - resolution: {integrity: sha512-WMz71T1JS624nWj2n2fnYAuPovhv7EUhk69R6i9dsVyzxt5eM3bjwvgk9L+APE1TRscGysAVMANkB0jh0LQZrQ==} - engines: {node: 20 || >=22} - '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} - '@isaacs/cliui@9.0.0': - resolution: {integrity: sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==} - engines: {node: '>=18'} - '@isaacs/fs-minipass@4.0.1': resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} engines: {node: '>=18.0.0'} @@ -2487,9 +2335,6 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - '@jridgewell/trace-mapping@0.3.9': - resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - '@js-sdsl/ordered-map@4.4.2': resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} @@ -2529,50 +2374,50 @@ packages: peerDependencies: tslib: '2' - '@jsonjoy.com/fs-core@4.56.10': - resolution: {integrity: sha512-PyAEA/3cnHhsGcdY+AmIU+ZPqTuZkDhCXQ2wkXypdLitSpd6d5Ivxhnq4wa2ETRWFVJGabYynBWxIijOswSmOw==} + '@jsonjoy.com/fs-core@4.57.1': + resolution: {integrity: sha512-YrEi/ZPmgc+GfdO0esBF04qv8boK9Dg9WpRQw/+vM8Qt3nnVIJWIa8HwZ/LXVZ0DB11XUROM8El/7yYTJX+WtA==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' - '@jsonjoy.com/fs-fsa@4.56.10': - resolution: {integrity: sha512-/FVK63ysNzTPOnCCcPoPHt77TOmachdMS422txM4KhxddLdbW1fIbFMYH0AM0ow/YchCyS5gqEjKLNyv71j/5Q==} + '@jsonjoy.com/fs-fsa@4.57.1': + resolution: {integrity: sha512-ooEPvSW/HQDivPDPZMibHGKZf/QS4WRir1czGZmXmp3MsQqLECZEpN0JobrD8iV9BzsuwdIv+PxtWX9WpPLsIA==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' - '@jsonjoy.com/fs-node-builtins@4.56.10': - resolution: {integrity: sha512-uUnKz8R0YJyKq5jXpZtkGV9U0pJDt8hmYcLRrPjROheIfjMXsz82kXMgAA/qNg0wrZ1Kv+hrg7azqEZx6XZCVw==} + '@jsonjoy.com/fs-node-builtins@4.57.1': + resolution: {integrity: sha512-XHkFKQ5GSH3uxm8c3ZYXVrexGdscpWKIcMWKFQpMpMJc8gA3AwOMBJXJlgpdJqmrhPyQXxaY9nbkNeYpacC0Og==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' - '@jsonjoy.com/fs-node-to-fsa@4.56.10': - resolution: {integrity: sha512-oH+O6Y4lhn9NyG6aEoFwIBNKZeYy66toP5LJcDOMBgL99BKQMUf/zWJspdRhMdn/3hbzQsZ8EHHsuekbFLGUWw==} + '@jsonjoy.com/fs-node-to-fsa@4.57.1': + resolution: {integrity: sha512-pqGHyWWzNck4jRfaGV39hkqpY5QjRUQ/nRbNT7FYbBa0xf4bDG+TE1Gt2KWZrSkrkZZDE3qZUjYMbjwSliX6pg==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' - '@jsonjoy.com/fs-node-utils@4.56.10': - resolution: {integrity: sha512-8EuPBgVI2aDPwFdaNQeNpHsyqPi3rr+85tMNG/lHvQLiVjzoZsvxA//Xd8aB567LUhy4QS03ptT+unkD/DIsNg==} + '@jsonjoy.com/fs-node-utils@4.57.1': + resolution: {integrity: sha512-vp+7ZzIB8v43G+GLXTS4oDUSQmhAsRz532QmmWBbdYA20s465JvwhkSFvX9cVTqRRAQg+vZ7zWDaIEh0lFe2gw==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' - '@jsonjoy.com/fs-node@4.56.10': - resolution: {integrity: sha512-7R4Gv3tkUdW3dXfXiOkqxkElxKNVdd8BDOWC0/dbERd0pXpPY+s2s1Mino+aTvkGrFPiY+mmVxA7zhskm4Ue4Q==} + '@jsonjoy.com/fs-node@4.57.1': + resolution: {integrity: sha512-3YaKhP8gXEKN+2O49GLNfNb5l2gbnCFHyAaybbA2JkkbQP3dpdef7WcUaHAulg/c5Dg4VncHsA3NWAUSZMR5KQ==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' - '@jsonjoy.com/fs-print@4.56.10': - resolution: {integrity: sha512-JW4fp5mAYepzFsSGrQ48ep8FXxpg4niFWHdF78wDrFGof7F3tKDJln72QFDEn/27M1yHd4v7sKHHVPh78aWcEw==} + '@jsonjoy.com/fs-print@4.57.1': + resolution: {integrity: sha512-Ynct7ZJmfk6qoXDOKfpovNA36ITUx8rChLmRQtW08J73VOiuNsU8PB6d/Xs7fxJC2ohWR3a5AqyjmLojfrw5yw==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' - '@jsonjoy.com/fs-snapshot@4.56.10': - resolution: {integrity: sha512-DkR6l5fj7+qj0+fVKm/OOXMGfDFCGXLfyHkORH3DF8hxkpDgIHbhf/DwncBMs2igu/ST7OEkexn1gIqoU6Y+9g==} + '@jsonjoy.com/fs-snapshot@4.57.1': + resolution: {integrity: sha512-/oG8xBNFMbDXTq9J7vepSA1kerS5vpgd3p5QZSPd+nX59uwodGJftI51gDYyHRpP57P3WCQf7LHtBYPqwUg2Bg==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' @@ -2616,50 +2461,50 @@ packages: '@leichtgewicht/ip-codec@2.0.5': resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} - '@listr2/prompt-adapter-inquirer@3.0.5': - resolution: {integrity: sha512-WELs+hj6xcilkloBXYf9XXK8tYEnKsgLj01Xl5ONUJpKjmT5hGVUzNUS5tooUxs7pGMrw+jFD/41WpqW4V3LDA==} - engines: {node: '>=20.0.0'} + '@listr2/prompt-adapter-inquirer@4.2.2': + resolution: {integrity: sha512-QCVBPLxPEG3ZLSfGz8DfzgiqkLiK31sb4JTIxp+sfdOrpze5rjZscHSAuSI0e/engIS9tWgzifLhSCwlocFsZQ==} + engines: {node: '>=22.13.0'} peerDependencies: - '@inquirer/prompts': '>= 3 < 8' - listr2: 9.0.5 + '@inquirer/prompts': '>= 3 < 9' + listr2: 10.2.1 - '@lmdb/lmdb-darwin-arm64@3.5.1': - resolution: {integrity: sha512-tpfN4kKrrMpQ+If1l8bhmoNkECJi0iOu6AEdrTJvWVC+32sLxTARX5Rsu579mPImRP9YFWfWgeRQ5oav7zApQQ==} + '@lmdb/lmdb-darwin-arm64@3.5.2': + resolution: {integrity: sha512-ZTEuSwB3QHOA6Jal4bi0oxAV1MK3xtzS3oUMq5OK3HSXNN4A79f9dhieZA0hgvwOTaGzEWmTd8Fg9XSkBIhAWw==} cpu: [arm64] os: [darwin] - '@lmdb/lmdb-darwin-x64@3.5.1': - resolution: {integrity: sha512-+a2tTfc3rmWhLAolFUWRgJtpSuu+Fw/yjn4rF406NMxhfjbMuiOUTDRvRlMFV+DzyjkwnokisskHbCWkS3Ly5w==} + '@lmdb/lmdb-darwin-x64@3.5.2': + resolution: {integrity: sha512-Zs+mdB6gNqpPK6ybNbqFoSU+DCIdhE8tqeaAzRs+hNJt8V43PRvTVxu1UPBHwK2917FnQ4dL5/OIoqHDa+9Dpw==} cpu: [x64] os: [darwin] - '@lmdb/lmdb-linux-arm64@3.5.1': - resolution: {integrity: sha512-aoERa5B6ywXdyFeYGQ1gbQpkMkDbEo45qVoXE5QpIRavqjnyPwjOulMkmkypkmsbJ5z4Wi0TBztON8agCTG0Vg==} + '@lmdb/lmdb-linux-arm64@3.5.2': + resolution: {integrity: sha512-hT6JPw5hDCXzppBgpIFS/cQp4v2LqNMgd5nuo4U9H5/wnbMS7Prh0twu5IbDvzYZf2a/xPTXtTDRuUiFc39lEw==} cpu: [arm64] os: [linux] - '@lmdb/lmdb-linux-arm@3.5.1': - resolution: {integrity: sha512-0EgcE6reYr8InjD7V37EgXcYrloqpxVPINy3ig1MwDSbl6LF/vXTYRH9OE1Ti1D8YZnB35ZH9aTcdfSb5lql2A==} + '@lmdb/lmdb-linux-arm@3.5.2': + resolution: {integrity: sha512-GhdC4huGWDzcbZWfS+G3dW4/TopNUnO+/E7aVdfWIhslSs1FI2+sVo94040S9BPJ7lNpnf1zVxaBlLmqZpKhcw==} cpu: [arm] os: [linux] - '@lmdb/lmdb-linux-x64@3.5.1': - resolution: {integrity: sha512-SqNDY1+vpji7bh0sFH5wlWyFTOzjbDOl0/kB5RLLYDAFyd/uw3n7wyrmas3rYPpAW7z18lMOi1yKlTPv967E3g==} + '@lmdb/lmdb-linux-x64@3.5.2': + resolution: {integrity: sha512-aTBBxTQGdgKcqZD6ywIVCIbCIJ3fJ28OhzCxgl3zGQzzJwkDt5TSIuBtMt4oKZMgDSjuRBjtID9TOUvSRg8IQA==} cpu: [x64] os: [linux] - '@lmdb/lmdb-win32-arm64@3.5.1': - resolution: {integrity: sha512-50v0O1Lt37cwrmR9vWZK5hRW0Aw+KEmxJJ75fge/zIYdvNKB/0bSMSVR5Uc2OV9JhosIUyklOmrEvavwNJ8D6w==} + '@lmdb/lmdb-win32-arm64@3.5.2': + resolution: {integrity: sha512-mqfNN5zb3z3QnHEPaV4Zv5zd3BhlcL+uqPNF7kGRkmCaRHuh6T9N5g/4ZqOiNHNPWglv3g8Ut15XxCKZjf6jHw==} cpu: [arm64] os: [win32] - '@lmdb/lmdb-win32-x64@3.5.1': - resolution: {integrity: sha512-qwosvPyl+zpUlp3gRb7UcJ3H8S28XHCzkv0Y0EgQToXjQP91ZD67EHSCDmaLjtKhe+GVIW5om1KUpzVLA0l6pg==} + '@lmdb/lmdb-win32-x64@3.5.2': + resolution: {integrity: sha512-JhPxlA8sIxPIdS78e4LeNfTlkF+2I/r98jKXf90pf+yhMCzyLkphcvbnWv7YL8yckp32c1uKZ1vf/JqcSiplHg==} cpu: [x64] os: [win32] - '@modelcontextprotocol/sdk@1.26.0': - resolution: {integrity: sha512-Y5RmPncpiDtTXDbLKswIJzTqu2hyBKxTNsgKqKclDbhIgg1wgtf1fRuvxgTnRfcnxtvvgbIEcqUOzZrJ6iSReg==} + '@modelcontextprotocol/sdk@1.28.0': + resolution: {integrity: sha512-gmloF+i+flI8ouQK7MWW4mOwuMh4RePBuPFAEPC6+pdqyWOUMDOixb6qZ69owLJpz6XmyllCouc4t8YWO+E2Nw==} engines: {node: '>=18'} peerDependencies: '@cfworker/json-schema': ^4.1.1 @@ -2698,8 +2543,8 @@ packages: cpu: [x64] os: [win32] - '@mswjs/interceptors@0.39.8': - resolution: {integrity: sha512-2+BzZbjRO7Ct61k8fMNHEtoKjeWI9pIlHFTqBwZ5icHpqszIgEZbjb1MW5Z0+bITTCTl3gk4PDBxs9tA/csXvA==} + '@mswjs/interceptors@0.41.3': + resolution: {integrity: sha512-cXu86tF4VQVfwz8W1SPbhoRyHJkti6mjH/XJIxp40jhO4j2k1m4KYrEykxqWPkFF3vrK4rgQppBh//AwyGSXPA==} engines: {node: '>=18'} '@napi-rs/nice-android-arm-eabi@1.1.1': @@ -2815,8 +2660,11 @@ packages: resolution: {integrity: sha512-xJIPs+bYuc9ASBl+cvGsKbGrJmS6fAKaSZCnT0lhahT5rhA2VVy9/EcIgd2JhtEuFOJNx7UHNn/qiTPTY4nrQw==} engines: {node: '>= 10'} - '@napi-rs/wasm-runtime@1.1.1': - resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} + '@napi-rs/wasm-runtime@1.1.2': + resolution: {integrity: sha512-sNXv5oLJ7ob93xkZ1XnxisYhGYXfaG9f65/ZgYuAu3qt7b3NadcOEhLvx28hv31PgX8SZJRYrAIPQilQmFpLVw==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 '@noble/hashes@1.4.0': resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} @@ -2842,8 +2690,8 @@ packages: resolution: {integrity: sha512-7OsC1gNORBEawOa5+j2pXN9vsicaIOH5cPXxoR6fJOmH6/EXpJB2CajXOu1fPRFun2m1lktEFX11+P89hqO/og==} engines: {node: ^20.17.0 || >=22.9.0} - '@npmcli/git@7.0.1': - resolution: {integrity: sha512-+XTFxK2jJF/EJJ5SoAzXk3qwIDfvFc5/g+bD274LZ7uY7LE8sTfG6Z8rOanPl2ZEvZWqNvmEdtXC25cE54VcoA==} + '@npmcli/git@7.0.2': + resolution: {integrity: sha512-oeolHDjExNAJAnlYP2qzNjMX/Xi9bmu78C9dIGr4xjobrSKbuMYCph8lTzn4vnW3NjIqVmw/f8BCfouqyJXlRg==} engines: {node: ^20.17.0 || >=22.9.0} '@npmcli/installed-package-contents@4.0.0': @@ -2855,8 +2703,8 @@ packages: resolution: {integrity: sha512-uuG5HZFXLfyFKqg8QypsmgLQW7smiRjVc45bqD/ofZZcR/uxEjgQU8qDPv0s9TEeMUiAAU/GC5bR6++UdTirIQ==} engines: {node: ^20.17.0 || >=22.9.0} - '@npmcli/package-json@7.0.4': - resolution: {integrity: sha512-0wInJG3j/K40OJt/33ax47WfWMzZTm6OQxB9cDhTt5huCP2a9g2GnlsxmfN+PulItNPIpPrZ+kfwwUil7eHcZQ==} + '@npmcli/package-json@7.0.5': + resolution: {integrity: sha512-iVuTlG3ORq2iaVa1IWUxAO/jIp77tUKBhoMjuzYW2kL4MLN1bi/ofqkZ7D7OOwh8coAx1/S2ge0rMdGv8sLSOQ==} engines: {node: ^20.17.0 || >=22.9.0} '@npmcli/promise-spawn@9.0.1': @@ -2867,12 +2715,12 @@ packages: resolution: {integrity: sha512-gOBg5YHMfZy+TfHArfVogwgfBeQnKbbGo3pSUyK/gSI0AVu+pEiDVcKlQb0D8Mg1LNRZILZ6XG8I5dJ4KuAd9Q==} engines: {node: ^20.17.0 || >=22.9.0} - '@npmcli/run-script@10.0.3': - resolution: {integrity: sha512-ER2N6itRkzWbbtVmZ9WKaWxVlKlOeBFF1/7xx+KA5J1xKa4JjUwBdb6tDpk0v1qA+d+VDwHI9qmLcXSWcmi+Rw==} + '@npmcli/run-script@10.0.4': + resolution: {integrity: sha512-mGUWr1uMnf0le2TwfOZY4SFxZGXGfm4Jtay/nwAa2FLNAKXUoUwaGwBMNH36UHPtinWfTSJ3nqFQr0091CxVGg==} engines: {node: ^20.17.0 || >=22.9.0} - '@octokit/auth-app@8.1.2': - resolution: {integrity: sha512-db8VO0PqXxfzI6GdjtgEFHY9tzqUql5xMFXYA12juq8TeTgPAuiiP3zid4h50lwlIP457p5+56PnJOgd2GGBuw==} + '@octokit/auth-app@8.2.0': + resolution: {integrity: sha512-vVjdtQQwomrZ4V46B9LaCsxsySxGoHsyw6IYBov/TqJVROrlYdyNgw5q6tQbB7KZt53v1l1W53RiqTvpzL907g==} engines: {node: '>= 20'} '@octokit/auth-oauth-app@9.0.3': @@ -2895,8 +2743,8 @@ packages: resolution: {integrity: sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q==} engines: {node: '>= 20'} - '@octokit/endpoint@11.0.2': - resolution: {integrity: sha512-4zCpzP1fWc7QlqunZ5bSEjxc6yLAlRTnDwKtgXfcI/FxxGoqedDG8V2+xJ60bV2kODqcGB+nATdtap/XYq2NZQ==} + '@octokit/endpoint@11.0.3': + resolution: {integrity: sha512-FWFlNxghg4HrXkD3ifYbS/IdL/mDHjh9QcsNyhQjN8dplUoZbejsdpmuqdA76nxj2xoWPs7p8uX2SNr9rYu0Ag==} engines: {node: '>= 20'} '@octokit/graphql-schema@15.26.1': @@ -2939,8 +2787,8 @@ packages: resolution: {integrity: sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw==} engines: {node: '>= 20'} - '@octokit/request@10.0.7': - resolution: {integrity: sha512-v93h0i1yu4idj8qFPZwjehoJx4j3Ntn+JhXsdJrG9pYaX6j/XRz2RmasMUHtNgQD39nrv/VwTWSqK0RNXR8upA==} + '@octokit/request@10.0.8': + resolution: {integrity: sha512-SJZNwY9pur9Agf7l87ywFi14W+Hd9Jg6Ifivsd33+/bGUQIjNujdFiXII2/qSlN2ybqUHfp5xpekMEjIBTjlSw==} engines: {node: '>= 20'} '@octokit/rest@22.0.1': @@ -2959,28 +2807,28 @@ packages: '@open-draft/until@2.1.0': resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} - '@opentelemetry/api@1.9.0': - resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} + '@opentelemetry/api@1.9.1': + resolution: {integrity: sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==} engines: {node: '>=8.0.0'} - '@opentelemetry/context-async-hooks@2.5.1': - resolution: {integrity: sha512-MHbu8XxCHcBn6RwvCt2Vpn1WnLMNECfNKYB14LI5XypcgH4IE0/DiVifVR9tAkwPMyLXN8dOoPJfya3IryLQVw==} + '@opentelemetry/context-async-hooks@2.6.1': + resolution: {integrity: sha512-XHzhwRNkBpeP8Fs/qjGrAf9r9PRv67wkJQ/7ZPaBQQ68DYlTBBx5MF9LvPx7mhuXcDessKK2b+DcxqwpgkcivQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/core@2.5.1': - resolution: {integrity: sha512-Dwlc+3HAZqpgTYq0MUyZABjFkcrKTePwuiFVLjahGD8cx3enqihmpAmdgNFO1R4m/sIe5afjJrA25Prqy4NXlA==} + '@opentelemetry/core@2.6.1': + resolution: {integrity: sha512-8xHSGWpJP9wBxgBpnqGL0R3PbdWQndL1Qp50qrg71+B28zK5OQmUgcDKLJgzyAAV38t4tOyLMGDD60LneR5W8g==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/semantic-conventions@1.39.0': - resolution: {integrity: sha512-R5R9tb2AXs2IRLNKLBJDynhkfmx7mX0vi8NkhZb3gUkPWHn6HXk5J8iQ/dql0U3ApfWym4kXXmBDRGO+oeOfjg==} + '@opentelemetry/semantic-conventions@1.40.0': + resolution: {integrity: sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw==} engines: {node: '>=14'} - '@oxc-project/types@0.113.0': - resolution: {integrity: sha512-Tp3XmgxwNQ9pEN9vxgJBAqdRamHibi76iowQ38O2I4PMpcvNRQNVsU2n1x1nv9yh0XoTrGFzf7cZSGxmixxrhA==} + '@oxc-project/types@0.122.0': + resolution: {integrity: sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==} '@parcel/watcher-android-arm64@2.5.6': resolution: {integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==} @@ -3111,20 +2959,20 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@pnpm/crypto.hash@1000.2.1': - resolution: {integrity: sha512-Kgo3bgYbdKkC5xFvvQshbHa+Nru7k50D91+yyq7enp4Ur2EMp4wg5oXleaC5xu5hC9A/1eSCRI8npCioplxG4A==} + '@pnpm/crypto.hash@1000.2.2': + resolution: {integrity: sha512-W8pLZvXWLlGG5p0Z2nCvtBhlM6uuTcbAbsS15wlGS31jBBJKJW2udLoFeM7qfWPo7E2PqRPGxca7APpVYAjJhw==} engines: {node: '>=18.12'} '@pnpm/crypto.polyfill@1000.1.0': resolution: {integrity: sha512-tNe7a6U4rCpxLMBaR0SIYTdjxGdL0Vwb3G1zY8++sPtHSvy7qd54u8CIB0Z+Y6t5tc9pNYMYCMwhE/wdSY7ltg==} engines: {node: '>=18.12'} - '@pnpm/dependency-path@1001.1.9': - resolution: {integrity: sha512-C1V4H54GyMfLL47q93PmdVRJkJyNVEE6Ht6cFrMSsjgsR7fxXWqjlem7OaA9MMjSTBB/d/g9mV4xZnoT/HAkDQ==} + '@pnpm/dependency-path@1001.1.10': + resolution: {integrity: sha512-PNImtV2SmNTDpLi4HdN86tJPmsOeIxm4VhmxgBVsMrJPEBfkNEWFcflR3wU6XVn/26g9qWdvlNHaawtCjeB93Q==} engines: {node: '>=18.12'} - '@pnpm/graceful-fs@1000.0.1': - resolution: {integrity: sha512-JnzaAVFJIEgwTcB55eww8N3h5B6qJdZqDA2wYkSK+OcTvvMSQb9c2STMhBP6GfkWygG1fs3w8D7JRx9SPZnxJg==} + '@pnpm/graceful-fs@1000.1.0': + resolution: {integrity: sha512-EsMX4slK0qJN2AR0/AYohY5m0HQNYGMNe+jhN74O994zp22/WbX+PbkIKyw3UQn39yQm2+z6SgwklDxbeapsmQ==} engines: {node: '>=18.12'} '@pnpm/types@1001.3.0': @@ -3161,94 +3009,108 @@ packages: '@protobufjs/utf8@1.1.0': resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} - '@puppeteer/browsers@2.12.1': - resolution: {integrity: sha512-fXa6uXLxfslBlus3MEpW8S6S9fe5RwmAE5Gd8u3krqOwnkZJV3/lQJiY3LaFdTctLLqJtyMgEUGkbDnRNf6vbQ==} + '@puppeteer/browsers@2.13.0': + resolution: {integrity: sha512-46BZJYJjc/WwmKjsvDFykHtXrtomsCIrwYQPOP7VfMJoZY2bsDF9oROBABR3paDjDcmkUye1Pb1BqdcdiipaWA==} engines: {node: '>=18'} hasBin: true - '@rolldown/binding-android-arm64@1.0.0-rc.4': - resolution: {integrity: sha512-vRq9f4NzvbdZavhQbjkJBx7rRebDKYR9zHfO/Wg486+I7bSecdUapzCm5cyXoK+LHokTxgSq7A5baAXUZkIz0w==} + '@rolldown/binding-android-arm64@1.0.0-rc.12': + resolution: {integrity: sha512-pv1y2Fv0JybcykuiiD3qBOBdz6RteYojRFY1d+b95WVuzx211CRh+ytI/+9iVyWQ6koTh5dawe4S/yRfOFjgaA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.0.0-rc.4': - resolution: {integrity: sha512-kFgEvkWLqt3YCgKB5re9RlIrx9bRsvyVUnaTakEpOPuLGzLpLapYxE9BufJNvPg8GjT6mB1alN4yN1NjzoeM8Q==} + '@rolldown/binding-darwin-arm64@1.0.0-rc.12': + resolution: {integrity: sha512-cFYr6zTG/3PXXF3pUO+umXxt1wkRK/0AYT8lDwuqvRC+LuKYWSAQAQZjCWDQpAH172ZV6ieYrNnFzVVcnSflAg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.0-rc.4': - resolution: {integrity: sha512-JXmaOJGsL/+rsmMfutcDjxWM2fTaVgCHGoXS7nE8Z3c9NAYjGqHvXrAhMUZvMpHS/k7Mg+X7n/MVKb7NYWKKww==} + '@rolldown/binding-darwin-x64@1.0.0-rc.12': + resolution: {integrity: sha512-ZCsYknnHzeXYps0lGBz8JrF37GpE9bFVefrlmDrAQhOEi4IOIlcoU1+FwHEtyXGx2VkYAvhu7dyBf75EJQffBw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.0.0-rc.4': - resolution: {integrity: sha512-ep3Catd6sPnHTM0P4hNEvIv5arnDvk01PfyJIJ+J3wVCG1eEaPo09tvFqdtcaTrkwQy0VWR24uz+cb4IsK53Qw==} + '@rolldown/binding-freebsd-x64@1.0.0-rc.12': + resolution: {integrity: sha512-dMLeprcVsyJsKolRXyoTH3NL6qtsT0Y2xeuEA8WQJquWFXkEC4bcu1rLZZSnZRMtAqwtrF/Ib9Ddtpa/Gkge9Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.4': - resolution: {integrity: sha512-LwA5ayKIpnsgXJEwWc3h8wPiS33NMIHd9BhsV92T8VetVAbGe2qXlJwNVDGHN5cOQ22R9uYvbrQir2AB+ntT2w==} + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.12': + resolution: {integrity: sha512-YqWjAgGC/9M1lz3GR1r1rP79nMgo3mQiiA+Hfo+pvKFK1fAJ1bCi0ZQVh8noOqNacuY1qIcfyVfP6HoyBRZ85Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.4': - resolution: {integrity: sha512-AC1WsGdlV1MtGay/OQ4J9T7GRadVnpYRzTcygV1hKnypbYN20Yh4t6O1Sa2qRBMqv1etulUknqXjc3CTIsBu6A==} + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.12': + resolution: {integrity: sha512-/I5AS4cIroLpslsmzXfwbe5OmWvSsrFuEw3mwvbQ1kDxJ822hFHIx+vsN/TAzNVyepI/j/GSzrtCIwQPeKCLIg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.4': - resolution: {integrity: sha512-lU+6rgXXViO61B4EudxtVMXSOfiZONR29Sys5VGSetUY7X8mg9FCKIIjcPPj8xNDeYzKl+H8F/qSKOBVFJChCQ==} + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.12': + resolution: {integrity: sha512-V6/wZztnBqlx5hJQqNWwFdxIKN0m38p8Jas+VoSfgH54HSj9tKTt1dZvG6JRHcjh6D7TvrJPWFGaY9UBVOaWPw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.4': - resolution: {integrity: sha512-DZaN1f0PGp/bSvKhtw50pPsnln4T13ycDq1FrDWRiHmWt1JeW+UtYg9touPFf8yt993p8tS2QjybpzKNTxYEwg==} + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.12': + resolution: {integrity: sha512-AP3E9BpcUYliZCxa3w5Kwj9OtEVDYK6sVoUzy4vTOJsjPOgdaJZKFmN4oOlX0Wp0RPV2ETfmIra9x1xuayFB7g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.12': + resolution: {integrity: sha512-nWwpvUSPkoFmZo0kQazZYOrT7J5DGOJ/+QHHzjvNlooDZED8oH82Yg67HvehPPLAg5fUff7TfWFHQS8IV1n3og==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.12': + resolution: {integrity: sha512-RNrafz5bcwRy+O9e6P8Z/OCAJW/A+qtBczIqVYwTs14pf4iV1/+eKEjdOUta93q2TsT/FI0XYDP3TCky38LMAg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-musl@1.0.0-rc.4': - resolution: {integrity: sha512-RnGxwZLN7fhMMAItnD6dZ7lvy+TI7ba+2V54UF4dhaWa/p8I/ys1E73KO6HmPmgz92ZkfD8TXS1IMV8+uhbR9g==} + '@rolldown/binding-linux-x64-musl@1.0.0-rc.12': + resolution: {integrity: sha512-Jpw/0iwoKWx3LJ2rc1yjFrj+T7iHZn2JDg1Yny1ma0luviFS4mhAIcd1LFNxK3EYu3DHWCps0ydXQ5i/rrJ2ig==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@rolldown/binding-openharmony-arm64@1.0.0-rc.4': - resolution: {integrity: sha512-6lcI79+X8klGiGd8yHuTgQRjuuJYNggmEml+RsyN596P23l/zf9FVmJ7K0KVKkFAeYEdg0iMUKyIxiV5vebDNQ==} + '@rolldown/binding-openharmony-arm64@1.0.0-rc.12': + resolution: {integrity: sha512-vRugONE4yMfVn0+7lUKdKvN4D5YusEiPilaoO2sgUWpCvrncvWgPMzK00ZFFJuiPgLwgFNP5eSiUlv2tfc+lpA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-wasm32-wasi@1.0.0-rc.4': - resolution: {integrity: sha512-wz7ohsKCAIWy91blZ/1FlpPdqrsm1xpcEOQVveWoL6+aSPKL4VUcoYmmzuLTssyZxRpEwzuIxL/GDsvpjaBtOw==} + '@rolldown/binding-wasm32-wasi@1.0.0-rc.12': + resolution: {integrity: sha512-ykGiLr/6kkiHc0XnBfmFJuCjr5ZYKKofkx+chJWDjitX+KsJuAmrzWhwyOMSHzPhzOHOy7u9HlFoa5MoAOJ/Zg==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.4': - resolution: {integrity: sha512-cfiMrfuWCIgsFmcVG0IPuO6qTRHvF7NuG3wngX1RZzc6dU8FuBFb+J3MIR5WrdTNozlumfgL4cvz+R4ozBCvsQ==} + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.12': + resolution: {integrity: sha512-5eOND4duWkwx1AzCxadcOrNeighiLwMInEADT0YM7xeEOOFcovWZCq8dadXgcRHSf3Ulh1kFo/qvzoFiCLOL1Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.4': - resolution: {integrity: sha512-p6UeR9y7ht82AH57qwGuFYn69S6CZ7LLKdCKy/8T3zS9VTrJei2/CGsTUV45Da4Z9Rbhc7G4gyWQ/Ioamqn09g==} + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.12': + resolution: {integrity: sha512-PyqoipaswDLAZtot351MLhrlrh6lcZPo2LSYE+VDxbVk24LVKAGOuE4hb8xZQmrPAuEtTZW8E6D2zc5EUZX4Lw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@rolldown/pluginutils@1.0.0-rc.4': - resolution: {integrity: sha512-1BrrmTu0TWfOP1riA8uakjFc9bpIUGzVKETsOtzY39pPga8zELGDl8eu1Dx7/gjM5CAz14UknsUMpBO8L+YntQ==} + '@rolldown/pluginutils@1.0.0-rc.12': + resolution: {integrity: sha512-HHMwmarRKvoFsJorqYlFeFRzXZqCt2ETQlEDOb9aqssrnVBB1/+xgTGtuTrIk5vzLNX1MjMtTf7W9z3tsSbrxw==} '@rollup/plugin-alias@6.0.0': resolution: {integrity: sha512-tPCzJOtS7uuVZd+xPhoy5W4vThe6KWXNmsFCNktaAh5RTqcLiSfT4huPQIXkgJ6YCOjJHvecOAzQxLFhPxKr+g==} @@ -3259,8 +3121,8 @@ packages: rollup: optional: true - '@rollup/plugin-commonjs@29.0.0': - resolution: {integrity: sha512-U2YHaxR2cU/yAiwKJtJRhnyLk7cifnQw0zUpISsocBDoHDJn+HTV74ABqnwr5bEgWUwFZC9oFL6wLe21lHu5eQ==} + '@rollup/plugin-commonjs@29.0.2': + resolution: {integrity: sha512-S/ggWH1LU7jTyi9DxZOKyxpVd4hF/OZ0JrEbeLjXk/DFXwRny0tjD2c992zOUYQobLrVkRVMDdmHP16HKP7GRg==} engines: {node: '>=16.0.0 || 14 >= 14.17'} peerDependencies: rollup: ^2.68.0||^3.0.0||^4.0.0 @@ -3277,15 +3139,6 @@ packages: rollup: optional: true - '@rollup/plugin-node-resolve@15.3.1': - resolution: {integrity: sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.78.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - '@rollup/plugin-node-resolve@16.0.3': resolution: {integrity: sha512-lUYM3UBGuM93CnMPG1YocWu7X802BrNF3jW2zny5gQyLQgRFJhV1Sq0Zi74+dh/6NBx1DxFC4b4GXg9wUCG5Qg==} engines: {node: '>=14.0.0'} @@ -3295,15 +3148,6 @@ packages: rollup: optional: true - '@rollup/pluginutils@5.2.0': - resolution: {integrity: sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - '@rollup/pluginutils@5.3.0': resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} engines: {node: '>=14.0.0'} @@ -3313,146 +3157,146 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.57.1': - resolution: {integrity: sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==} + '@rollup/rollup-android-arm-eabi@4.60.0': + resolution: {integrity: sha512-WOhNW9K8bR3kf4zLxbfg6Pxu2ybOUbB2AjMDHSQx86LIF4rH4Ft7vmMwNt0loO0eonglSNy4cpD3MKXXKQu0/A==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.57.1': - resolution: {integrity: sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==} + '@rollup/rollup-android-arm64@4.60.0': + resolution: {integrity: sha512-u6JHLll5QKRvjciE78bQXDmqRqNs5M/3GVqZeMwvmjaNODJih/WIrJlFVEihvV0MiYFmd+ZyPr9wxOVbPAG2Iw==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.57.1': - resolution: {integrity: sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==} + '@rollup/rollup-darwin-arm64@4.60.0': + resolution: {integrity: sha512-qEF7CsKKzSRc20Ciu2Zw1wRrBz4g56F7r/vRwY430UPp/nt1x21Q/fpJ9N5l47WWvJlkNCPJz3QRVw008fi7yA==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.57.1': - resolution: {integrity: sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==} + '@rollup/rollup-darwin-x64@4.60.0': + resolution: {integrity: sha512-WADYozJ4QCnXCH4wPB+3FuGmDPoFseVCUrANmA5LWwGmC6FL14BWC7pcq+FstOZv3baGX65tZ378uT6WG8ynTw==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.57.1': - resolution: {integrity: sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==} + '@rollup/rollup-freebsd-arm64@4.60.0': + resolution: {integrity: sha512-6b8wGHJlDrGeSE3aH5mGNHBjA0TTkxdoNHik5EkvPHCt351XnigA4pS7Wsj/Eo9Y8RBU6f35cjN9SYmCFBtzxw==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.57.1': - resolution: {integrity: sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==} + '@rollup/rollup-freebsd-x64@4.60.0': + resolution: {integrity: sha512-h25Ga0t4jaylMB8M/JKAyrvvfxGRjnPQIR8lnCayyzEjEOx2EJIlIiMbhpWxDRKGKF8jbNH01NnN663dH638mA==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.57.1': - resolution: {integrity: sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==} + '@rollup/rollup-linux-arm-gnueabihf@4.60.0': + resolution: {integrity: sha512-RzeBwv0B3qtVBWtcuABtSuCzToo2IEAIQrcyB/b2zMvBWVbjo8bZDjACUpnaafaxhTw2W+imQbP2BD1usasK4g==} cpu: [arm] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm-musleabihf@4.57.1': - resolution: {integrity: sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==} + '@rollup/rollup-linux-arm-musleabihf@4.60.0': + resolution: {integrity: sha512-Sf7zusNI2CIU1HLzuu9Tc5YGAHEZs5Lu7N1ssJG4Tkw6e0MEsN7NdjUDDfGNHy2IU+ENyWT+L2obgWiguWibWQ==} cpu: [arm] os: [linux] libc: [musl] - '@rollup/rollup-linux-arm64-gnu@4.57.1': - resolution: {integrity: sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==} + '@rollup/rollup-linux-arm64-gnu@4.60.0': + resolution: {integrity: sha512-DX2x7CMcrJzsE91q7/O02IJQ5/aLkVtYFryqCjduJhUfGKG6yJV8hxaw8pZa93lLEpPTP/ohdN4wFz7yp/ry9A==} cpu: [arm64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm64-musl@4.57.1': - resolution: {integrity: sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==} + '@rollup/rollup-linux-arm64-musl@4.60.0': + resolution: {integrity: sha512-09EL+yFVbJZlhcQfShpswwRZ0Rg+z/CsSELFCnPt3iK+iqwGsI4zht3secj5vLEs957QvFFXnzAT0FFPIxSrkQ==} cpu: [arm64] os: [linux] libc: [musl] - '@rollup/rollup-linux-loong64-gnu@4.57.1': - resolution: {integrity: sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==} + '@rollup/rollup-linux-loong64-gnu@4.60.0': + resolution: {integrity: sha512-i9IcCMPr3EXm8EQg5jnja0Zyc1iFxJjZWlb4wr7U2Wx/GrddOuEafxRdMPRYVaXjgbhvqalp6np07hN1w9kAKw==} cpu: [loong64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-loong64-musl@4.57.1': - resolution: {integrity: sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==} + '@rollup/rollup-linux-loong64-musl@4.60.0': + resolution: {integrity: sha512-DGzdJK9kyJ+B78MCkWeGnpXJ91tK/iKA6HwHxF4TAlPIY7GXEvMe8hBFRgdrR9Ly4qebR/7gfUs9y2IoaVEyog==} cpu: [loong64] os: [linux] libc: [musl] - '@rollup/rollup-linux-ppc64-gnu@4.57.1': - resolution: {integrity: sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==} + '@rollup/rollup-linux-ppc64-gnu@4.60.0': + resolution: {integrity: sha512-RwpnLsqC8qbS8z1H1AxBA1H6qknR4YpPR9w2XX0vo2Sz10miu57PkNcnHVaZkbqyw/kUWfKMI73jhmfi9BRMUQ==} cpu: [ppc64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-ppc64-musl@4.57.1': - resolution: {integrity: sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==} + '@rollup/rollup-linux-ppc64-musl@4.60.0': + resolution: {integrity: sha512-Z8pPf54Ly3aqtdWC3G4rFigZgNvd+qJlOE52fmko3KST9SoGfAdSRCwyoyG05q1HrrAblLbk1/PSIV+80/pxLg==} cpu: [ppc64] os: [linux] libc: [musl] - '@rollup/rollup-linux-riscv64-gnu@4.57.1': - resolution: {integrity: sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==} + '@rollup/rollup-linux-riscv64-gnu@4.60.0': + resolution: {integrity: sha512-3a3qQustp3COCGvnP4SvrMHnPQ9d1vzCakQVRTliaz8cIp/wULGjiGpbcqrkv0WrHTEp8bQD/B3HBjzujVWLOA==} cpu: [riscv64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-riscv64-musl@4.57.1': - resolution: {integrity: sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==} + '@rollup/rollup-linux-riscv64-musl@4.60.0': + resolution: {integrity: sha512-pjZDsVH/1VsghMJ2/kAaxt6dL0psT6ZexQVrijczOf+PeP2BUqTHYejk3l6TlPRydggINOeNRhvpLa0AYpCWSQ==} cpu: [riscv64] os: [linux] libc: [musl] - '@rollup/rollup-linux-s390x-gnu@4.57.1': - resolution: {integrity: sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==} + '@rollup/rollup-linux-s390x-gnu@4.60.0': + resolution: {integrity: sha512-3ObQs0BhvPgiUVZrN7gqCSvmFuMWvWvsjG5ayJ3Lraqv+2KhOsp+pUbigqbeWqueGIsnn+09HBw27rJ+gYK4VQ==} cpu: [s390x] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.57.1': - resolution: {integrity: sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==} + '@rollup/rollup-linux-x64-gnu@4.60.0': + resolution: {integrity: sha512-EtylprDtQPdS5rXvAayrNDYoJhIz1/vzN2fEubo3yLE7tfAw+948dO0g4M0vkTVFhKojnF+n6C8bDNe+gDRdTg==} cpu: [x64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-musl@4.57.1': - resolution: {integrity: sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==} + '@rollup/rollup-linux-x64-musl@4.60.0': + resolution: {integrity: sha512-k09oiRCi/bHU9UVFqD17r3eJR9bn03TyKraCrlz5ULFJGdJGi7VOmm9jl44vOJvRJ6P7WuBi/s2A97LxxHGIdw==} cpu: [x64] os: [linux] libc: [musl] - '@rollup/rollup-openbsd-x64@4.57.1': - resolution: {integrity: sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==} + '@rollup/rollup-openbsd-x64@4.60.0': + resolution: {integrity: sha512-1o/0/pIhozoSaDJoDcec+IVLbnRtQmHwPV730+AOD29lHEEo4F5BEUB24H0OBdhbBBDwIOSuf7vgg0Ywxdfiiw==} cpu: [x64] os: [openbsd] - '@rollup/rollup-openharmony-arm64@4.57.1': - resolution: {integrity: sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==} + '@rollup/rollup-openharmony-arm64@4.60.0': + resolution: {integrity: sha512-pESDkos/PDzYwtyzB5p/UoNU/8fJo68vcXM9ZW2V0kjYayj1KaaUfi1NmTUTUpMn4UhU4gTuK8gIaFO4UGuMbA==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.57.1': - resolution: {integrity: sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==} + '@rollup/rollup-win32-arm64-msvc@4.60.0': + resolution: {integrity: sha512-hj1wFStD7B1YBeYmvY+lWXZ7ey73YGPcViMShYikqKT1GtstIKQAtfUI6yrzPjAy/O7pO0VLXGmUVWXQMaYgTQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.57.1': - resolution: {integrity: sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==} + '@rollup/rollup-win32-ia32-msvc@4.60.0': + resolution: {integrity: sha512-SyaIPFoxmUPlNDq5EHkTbiKzmSEmq/gOYFI/3HHJ8iS/v1mbugVa7dXUzcJGQfoytp9DJFLhHH4U3/eTy2Bq4w==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.57.1': - resolution: {integrity: sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==} + '@rollup/rollup-win32-x64-gnu@4.60.0': + resolution: {integrity: sha512-RdcryEfzZr+lAr5kRm2ucN9aVlCCa2QNq4hXelZxb8GG0NJSazq44Z3PCCc8wISRuCVnGs0lQJVX5Vp6fKA+IA==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.57.1': - resolution: {integrity: sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==} + '@rollup/rollup-win32-x64-msvc@4.60.0': + resolution: {integrity: sha512-PrsWNQ8BuE00O3Xsx3ALh2Df8fAj9+cvvX9AIA6o4KpATR98c9mud4XtDWVvsEuyia5U4tVSTKygawyJkjm60w==} cpu: [x64] os: [win32] - '@rollup/wasm-node@4.57.1': - resolution: {integrity: sha512-b0rcJH8ykEanfgTeDtlPubhphIUOx0oaAek+3hizTaFkoC1FBSTsY0GixwB4D5HZ5r3Gt2yI9c8M13OcW/kW5A==} + '@rollup/wasm-node@4.60.0': + resolution: {integrity: sha512-b4MyEi8S6dvHy0ZAwxO/zQPxpagdv+VZQDlTDaQJloif+axEHbjaJ+dkjN+uTs4mj8qT3nOidkGtDdNvVj7rrg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -3463,26 +3307,34 @@ packages: resolution: {integrity: sha512-NwCl5Y0V6Di0NexvkTqdoVfmjTaQwoLM236r89KEojGmq/jMls8S+zb7yOwAPdXvbwfKDlP+lmXgAL4vKSQT+A==} engines: {node: ^20.17.0 || >=22.9.0} - '@sigstore/core@3.1.0': - resolution: {integrity: sha512-o5cw1QYhNQ9IroioJxpzexmPjfCe7gzafd2RY3qnMpxr4ZEja+Jad/U8sgFpaue6bOaF+z7RVkyKVV44FN+N8A==} + '@sigstore/core@3.2.0': + resolution: {integrity: sha512-kxHrDQ9YgfrWUSXU0cjsQGv8JykOFZQ9ErNKbFPWzk3Hgpwu8x2hHrQ9IdA8yl+j9RTLTC3sAF3Tdq1IQCP4oA==} engines: {node: ^20.17.0 || >=22.9.0} - '@sigstore/protobuf-specs@0.5.0': - resolution: {integrity: sha512-MM8XIwUjN2bwvCg1QvrMtbBmpcSHrkhFSCu1D11NyPvDQ25HEc4oG5/OcQfd/Tlf/OxmKWERDj0zGE23jQaMwA==} + '@sigstore/protobuf-specs@0.5.1': + resolution: {integrity: sha512-/ScWUhhoFasJsSRGTVBwId1loQjjnjAfE4djL6ZhrXRpNCmPTnUKF5Jokd58ILseOMjzET3UrMOtJPS9sYeI0g==} engines: {node: ^18.17.0 || >=20.5.0} - '@sigstore/sign@4.1.0': - resolution: {integrity: sha512-Vx1RmLxLGnSUqx/o5/VsCjkuN5L7y+vxEEwawvc7u+6WtX2W4GNa7b9HEjmcRWohw/d6BpATXmvOwc78m+Swdg==} + '@sigstore/sign@4.1.1': + resolution: {integrity: sha512-Hf4xglukg0XXQ2RiD5vSoLjdPe8OBUPA8XeVjUObheuDcWdYWrnH/BNmxZCzkAy68MzmNCxXLeurJvs6hcP2OQ==} engines: {node: ^20.17.0 || >=22.9.0} - '@sigstore/tuf@4.0.1': - resolution: {integrity: sha512-OPZBg8y5Vc9yZjmWCHrlWPMBqW5yd8+wFNl+thMdtcWz3vjVSoJQutF8YkrzI0SLGnkuFof4HSsWUhXrf219Lw==} + '@sigstore/tuf@4.0.2': + resolution: {integrity: sha512-TCAzTy0xzdP79EnxSjq9KQ3eaR7+FmudLC6eRKknVKZbV7ZNlGLClAAQb/HMNJ5n2OBNk2GT1tEmU0xuPr+SLQ==} engines: {node: ^20.17.0 || >=22.9.0} '@sigstore/verify@3.1.0': resolution: {integrity: sha512-mNe0Iigql08YupSOGv197YdHpPPr+EzDZmfCgMc7RPNaZTw5aLN01nBl6CHJOh3BGtnMIj83EeN4butBchc8Ag==} engines: {node: ^20.17.0 || >=22.9.0} + '@simple-libs/child-process-utils@1.0.2': + resolution: {integrity: sha512-/4R8QKnd/8agJynkNdJmNw2MBxuFTRcNFnE5Sg/G+jkSsV8/UBgULMzhizWWW42p8L5H7flImV2ATi79Ove2Tw==} + engines: {node: '>=18'} + + '@simple-libs/stream-utils@1.2.0': + resolution: {integrity: sha512-KxXvfapcixpz6rVEB6HPjOUZT22yN6v0vI0urQSk1L8MlEWPDFCZkhw2xmkyoTGYeFw7tWTZd7e3lVzRZRN/EA==} + engines: {node: '>=18'} + '@sindresorhus/is@4.6.0': resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} @@ -3493,35 +3345,24 @@ packages: '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} - '@stylistic/eslint-plugin@5.8.0': - resolution: {integrity: sha512-WNPVF/FfBAjyi3OA7gok8swRiImNLKI4dmV3iK/GC/0xSJR7eCzBFsw9hLZVgb1+MYNLy7aDsjohxN1hA/FIfQ==} + '@stylistic/eslint-plugin@5.10.0': + resolution: {integrity: sha512-nPK52ZHvot8Ju/0A4ucSX1dcPV2/1clx0kLcH5wDmrE4naKso7TUC/voUyU1O9OTKTrR6MYip6LP0ogEMQ9jPQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: '>=9.0.0' + eslint: ^9.0.0 || ^10.0.0 '@szmarczak/http-timer@4.0.6': resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} engines: {node: '>=10'} - '@tootallnate/once@2.0.0': - resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} - engines: {node: '>= 10'} + '@tony.ganchev/eslint-plugin-header@3.3.4': + resolution: {integrity: sha512-w6RqKLUO4Bvi8pdFJnNUl1o5bux3/i9ZaC+TIY593d+ad15InN8qe9rpqnzyL7Guk9i/vIc4ztlyw9todgKGPw==} + peerDependencies: + eslint: '>=7.7.0' '@tootallnate/quickjs-emscripten@0.23.0': resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} - '@tsconfig/node10@1.0.12': - resolution: {integrity: sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==} - - '@tsconfig/node12@1.0.11': - resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} - - '@tsconfig/node14@1.0.3': - resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} - - '@tsconfig/node16@1.0.4': - resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - '@tufjs/canonical-json@2.0.0': resolution: {integrity: sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==} engines: {node: ^16.14.0 || >=18.0.0} @@ -3533,12 +3374,6 @@ packages: '@tybys/wasm-util@0.10.1': resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} - '@types/accepts@1.3.7': - resolution: {integrity: sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==} - - '@types/babel__code-frame@7.27.0': - resolution: {integrity: sha512-Dwlo+LrxDx/0SpfmJ/BKveHf7QXWvLBLc+x03l5sbzykj3oB9nHygCpSECF1a+s+QIxbghe+KHqC90vGtxLRAA==} - '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -3569,33 +3404,15 @@ packages: '@types/cli-progress@3.11.6': resolution: {integrity: sha512-cE3+jb9WRlu+uOSAugewNpITJDt1VF8dHOopPO4IABFc3SXYL5WE/+PTz/FCdZRRfIujiWW3n3aMbv1eIGVRWA==} - '@types/co-body@6.1.3': - resolution: {integrity: sha512-UhuhrQ5hclX6UJctv5m4Rfp52AfG9o9+d9/HwjxhVB5NjXxr5t9oKgJxN8xRHgr35oo8meUEHUPFWiKg6y71aA==} - - '@types/command-line-args@5.2.3': - resolution: {integrity: sha512-uv0aG6R0Y8WHZLTamZwtfsDLVRnOa+n+n5rEvFWL5Na5gZ8V2Teab/duDPFzIIIhs9qizDpcavCusCLJZu62Kw==} - '@types/connect-history-api-fallback@1.5.4': resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==} '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - '@types/content-disposition@0.5.9': - resolution: {integrity: sha512-8uYXI3Gw35MhiVYhG3s295oihrxRyytcRHjSjqnqZVDDy/xcGBRny7+Xj1Wgfhv5QzRtN2hB2dVRBUX9XW3UcQ==} - - '@types/convert-source-map@2.0.3': - resolution: {integrity: sha512-ag0BfJLZf6CQz8VIuRIEYQ5Ggwk/82uvTQf27RcpyDNbY0Vw49LIPqAxk5tqYfrCs9xDaIMvl4aj7ZopnYL8bA==} - - '@types/cookies@0.9.2': - resolution: {integrity: sha512-1AvkDdZM2dbyFybL4fxpuNCaWyv//0AwsuUk2DWeXyM1/5ZKm6W3z6mQi24RZ4l2ucY+bkSHzbDVpySqPGuV8A==} - '@types/cors@2.8.19': resolution: {integrity: sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==} - '@types/debounce@1.2.4': - resolution: {integrity: sha512-jBqiORIzKDOToaF63Fm//haOCHuwQuLa2202RK4MozpA6lh93eCBc+/8+wZn5OzjJt3ySdc+74SXWXB55Ewtyw==} - '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} @@ -3611,6 +3428,9 @@ packages: '@types/eslint@9.6.1': resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + '@types/esrecurse@4.3.1': + resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} + '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} @@ -3632,15 +3452,9 @@ packages: '@types/folder-hash@4.0.4': resolution: {integrity: sha512-c+PwHm51Dw3fXM8SDK+93PO3oXdk4XNouCCvV67lj4aijRkZz5g67myk+9wqWWnyv3go6q96hT6ywcd3XtoZiQ==} - '@types/git-raw-commits@5.0.1': - resolution: {integrity: sha512-sd4kgxJbuZF0RDy6cX7KlKSGiwqB1mqn8nriUbxt5e1F+MO/N4hJlhaYn0Omw4g2biClFpT5Mre07x7OkGt8tg==} - '@types/graceful-fs@4.1.9': resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} - '@types/http-assert@1.5.6': - resolution: {integrity: sha512-TTEwmtjgVbYAzZYWyeHPrrtWnfVkm8tQkP8P21uQifPgMRgjrow3XDEYqucuC8SKZJT7pUnhU/JymvjggxO9vw==} - '@types/http-errors@2.0.5': resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} @@ -3650,21 +3464,9 @@ packages: '@types/ini@4.1.1': resolution: {integrity: sha512-MIyNUZipBTbyUNnhvuXJTY7B6qNI78meck9Jbv3wk0OgNwRyOOVEKDutAkOs1snB/tx0FafyR6/SN4Ps0hZPeg==} - '@types/istanbul-lib-coverage@2.0.6': - resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} - - '@types/istanbul-lib-report@3.0.3': - resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} - - '@types/istanbul-reports@3.0.4': - resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} - '@types/jasmine-reporters@2.5.3': resolution: {integrity: sha512-8aojAUdgdiD9VQbllBJb/9gny3lOjz9T5gyMcbYlKe6npwGVsarbr8v2JYSFJSZSuFYXcPVzFG2lLX3ib0j/DA==} - '@types/jasmine@5.1.15': - resolution: {integrity: sha512-ZAC8KjmV2MJxbNTrwXFN+HKeajpXQZp6KpPiR6Aa4XvaEnjP6qh23lL/Rqb7AYzlp3h/rcwDrQ7Gg7q28cQTQg==} - '@types/jasmine@6.0.0': resolution: {integrity: sha512-18lgGsLmEh3VJk9eZ5wAjTISxdqzl6YOwu8UdMpolajN57QOCNbl+AbHUd+Yu9ItrsFdB+c8LSZSGNg8nHaguw==} @@ -3677,23 +3479,14 @@ packages: '@types/karma@6.3.9': resolution: {integrity: sha512-sjE/MHnoAZAQYAKRXAbjTOiBKyGGErEM725bruRcmDdMa2vp1bjWPhApI7/i564PTyHlzc3vIGXLL6TFIpAxFg==} - '@types/keygrip@1.0.6': - resolution: {integrity: sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==} - - '@types/koa-compose@3.2.9': - resolution: {integrity: sha512-BroAZ9FTvPiCy0Pi8tjD1OfJ7bgU1gQf0eR6e1Vm+JJATy9eKOG3hQMFtMciMawiSOVnLMdmUOC46s7HBhSTsA==} - - '@types/koa@2.15.0': - resolution: {integrity: sha512-7QFsywoE5URbuVnG3loe03QXuGajrnotr3gQkXcEBShORai23MePfFYdhz90FEtBBpkyIYQbVD+evKtloCgX3g==} - '@types/less@3.0.8': resolution: {integrity: sha512-Gjm4+H9noDJgu5EdT3rUw5MhPBag46fiOy27BefvWkNL8mlZnKnCaVVVTLKj6RYXed9b62CPKnPav9govyQDzA==} '@types/loader-utils@3.0.0': resolution: {integrity: sha512-oOi4OGpiLUbb+Q/cN9FIkkDFgOpOGZ2cUAzb5i03wrGstnG6Syx1WDMhSiB5rcP10XX7cw7Uev8mv++/aplnNg==} - '@types/lodash@4.17.23': - resolution: {integrity: sha512-RDvF6wTulMPjrNdCoYRC8gNR880JNGT8uB+REUpC2Ns4pRqQJhGz90wh7rgdXDPpCczF3VGktDuFGVnz8zP7HA==} + '@types/lodash@4.17.24': + resolution: {integrity: sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==} '@types/micromatch@2.3.35': resolution: {integrity: sha512-J749bHo/Zu56w0G0NI/IGHLQPiSsjx//0zJhfEVAN95K/xM5C8ZDmhkXtU3qns0sBOao7HuQzr8XV1/2o5LbXA==} @@ -3704,11 +3497,11 @@ packages: '@types/node-fetch@2.6.13': resolution: {integrity: sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==} - '@types/node@22.19.11': - resolution: {integrity: sha512-BH7YwL6rA93ReqeQS1c4bsPpcfOmJasG+Fkr6Y59q83f9M1WcBRHR2vM+P9eOisYRcN3ujQoiZY8uk5W+1WL8w==} + '@types/node@22.19.17': + resolution: {integrity: sha512-wGdMcf+vPYM6jikpS/qhg6WiqSV/OhG+jeeHT/KlVqxYfD40iYJf9/AE1uQxVWFvU7MipKRkRv8NSHiCGgPr8Q==} - '@types/node@24.10.9': - resolution: {integrity: sha512-ne4A0IpG3+2ETuREInjPNhUGis1SFjv1d5asp8MzEAGtOZeTeHVDOYqOgqfhvseqg/iXty2hjBf1zAOb7RNiNw==} + '@types/node@24.12.0': + resolution: {integrity: sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ==} '@types/npm-package-arg@6.1.4': resolution: {integrity: sha512-vDgdbMy2QXHnAruzlv68pUtXCjmqUk3WrBAsRboRovsOmxbfn/WiYCjmecyKjGztnMps5dWp4Uq2prp+Ilo17Q==} @@ -3725,11 +3518,8 @@ packages: '@types/parse-glob@3.0.32': resolution: {integrity: sha512-n4xmml2WKR12XeQprN8L/sfiVPa8FHS3k+fxp4kSr/PA2GsGUgFND+bvISJxM0y5QdvzNEGjEVU3eIrcKks/pA==} - '@types/parse5@6.0.3': - resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==} - - '@types/picomatch@4.0.2': - resolution: {integrity: sha512-qHHxQ+P9PysNEGbALT8f8YOSHW0KJu6l2xU8DYY0fu/EmGxXdVnuTLvFUvBgPJMSqXq29SYHveejeAha+4AYgA==} + '@types/picomatch@4.0.3': + resolution: {integrity: sha512-iG0T6+nYJ9FAPmx9SsUlnwcq1ZVRuCXcVEvWnntoPlrOpwtSTKNDC9uVAxTsC3PUvJ+99n4RpAcNgBbHX3JSnQ==} '@types/progress@2.0.7': resolution: {integrity: sha512-iadjw02vte8qWx7U0YM++EybBha2CQLPGu9iJ97whVgJUT5Zq9MjAPYUnbfRI2Kpehimf1QjFJYxD0t8nqzu5w==} @@ -3737,11 +3527,8 @@ packages: '@types/pumpify@1.4.5': resolution: {integrity: sha512-BGVAQyK5yJdfIII230fVYGY47V63hUNAhryuuS3b4lEN2LNwxUXFKsEf8QLDCjmZuimlj23BHppJgcrGvNtqKg==} - '@types/q@0.0.32': - resolution: {integrity: sha512-qYi3YV9inU/REEfxwVcGZzbS3KG/Xs90lv0Pr+lDtuVjBPGd1A+eciXzVSaRvLify132BfcvhvEjeVahrUl0Ug==} - - '@types/qs@6.14.0': - resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} + '@types/qs@6.15.0': + resolution: {integrity: sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow==} '@types/range-parser@1.2.7': resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} @@ -3752,12 +3539,12 @@ packages: '@types/responselike@1.0.0': resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} + '@types/retry@0.12.0': + resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} + '@types/retry@0.12.2': resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==} - '@types/selenium-webdriver@3.0.26': - resolution: {integrity: sha512-dyIGFKXfUFiwkMfNGn1+F6b80ZjR3uSYv1j6xVJSDlft5waZ2cwkHW4e7zNzvq7hiEackcgvBpmnXZrI1GltPg==} - '@types/semver@7.7.1': resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} @@ -3794,9 +3581,6 @@ packages: '@types/which@3.0.4': resolution: {integrity: sha512-liyfuo/106JdlgSchJzXEQCVArk0CvevqPote8F8HgWgJ3dRCcTHgJIsLDuee0kxk/mhbInzIZk3QWSZJ8R+2w==} - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} @@ -3812,79 +3596,83 @@ packages: '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@typescript-eslint/eslint-plugin@8.55.0': - resolution: {integrity: sha512-1y/MVSz0NglV1ijHC8OT49mPJ4qhPYjiK08YUQVbIOyu+5k862LKUHFkpKHWu//zmr7hDR2rhwUm6gnCGNmGBQ==} + '@typescript-eslint/eslint-plugin@8.57.2': + resolution: {integrity: sha512-NZZgp0Fm2IkD+La5PR81sd+g+8oS6JwJje+aRWsDocxHkjyRw0J5L5ZTlN3LI1LlOcGL7ph3eaIUmTXMIjLk0w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.55.0 - eslint: ^8.57.0 || ^9.0.0 + '@typescript-eslint/parser': ^8.57.2 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.55.0': - resolution: {integrity: sha512-4z2nCSBfVIMnbuu8uinj+f0o4qOeggYJLbjpPHka3KH1om7e+H9yLKTYgksTaHcGco+NClhhY2vyO3HsMH1RGw==} + '@typescript-eslint/parser@8.57.2': + resolution: {integrity: sha512-30ScMRHIAD33JJQkgfGW1t8CURZtjc2JpTrq5n2HFhOefbAhb7ucc7xJwdWcrEtqUIYJ73Nybpsggii6GtAHjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.55.0': - resolution: {integrity: sha512-zRcVVPFUYWa3kNnjaZGXSu3xkKV1zXy8M4nO/pElzQhFweb7PPtluDLQtKArEOGmjXoRjnUZ29NjOiF0eCDkcQ==} + '@typescript-eslint/project-service@8.57.2': + resolution: {integrity: sha512-FuH0wipFywXRTHf+bTTjNyuNQQsQC3qh/dYzaM4I4W0jrCqjCVuUh99+xd9KamUfmCGPvbO8NDngo/vsnNVqgw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@8.55.0': - resolution: {integrity: sha512-fVu5Omrd3jeqeQLiB9f1YsuK/iHFOwb04bCtY4BSCLgjNbOD33ZdV6KyEqplHr+IlpgT0QTZ/iJ+wT7hvTx49Q==} + '@typescript-eslint/scope-manager@8.57.2': + resolution: {integrity: sha512-snZKH+W4WbWkrBqj4gUNRIGb/jipDW3qMqVJ4C9rzdFc+wLwruxk+2a5D+uoFcKPAqyqEnSb4l2ULuZf95eSkw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.55.0': - resolution: {integrity: sha512-1R9cXqY7RQd7WuqSN47PK9EDpgFUK3VqdmbYrvWJZYDd0cavROGn+74ktWBlmJ13NXUQKlZ/iAEQHI/V0kKe0Q==} + '@typescript-eslint/tsconfig-utils@8.57.2': + resolution: {integrity: sha512-3Lm5DSM+DCowsUOJC+YqHHnKEfFh5CoGkj5Z31NQSNF4l5wdOwqGn99wmwN/LImhfY3KJnmordBq/4+VDe2eKw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.55.0': - resolution: {integrity: sha512-x1iH2unH4qAt6I37I2CGlsNs+B9WGxurP2uyZLRz6UJoZWDBx9cJL1xVN/FiOmHEONEg6RIufdvyT0TEYIgC5g==} + '@typescript-eslint/type-utils@8.57.2': + resolution: {integrity: sha512-Co6ZCShm6kIbAM/s+oYVpKFfW7LBc6FXoPXjTRQ449PPNBY8U0KZXuevz5IFuuUj2H9ss40atTaf9dlGLzbWZg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@8.55.0': - resolution: {integrity: sha512-ujT0Je8GI5BJWi+/mMoR0wxwVEQaxM+pi30xuMiJETlX80OPovb2p9E8ss87gnSVtYXtJoU9U1Cowcr6w2FE0w==} + '@typescript-eslint/types@8.57.2': + resolution: {integrity: sha512-/iZM6FnM4tnx9csuTxspMW4BOSegshwX5oBDznJ7S4WggL7Vczz5d2W11ecc4vRrQMQHXRSxzrCsyG5EsPPTbA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.55.0': - resolution: {integrity: sha512-EwrH67bSWdx/3aRQhCoxDaHM+CrZjotc2UCCpEDVqfCE+7OjKAGWNY2HsCSTEVvWH2clYQK8pdeLp42EVs+xQw==} + '@typescript-eslint/types@8.58.0': + resolution: {integrity: sha512-O9CjxypDT89fbHxRfETNoAnHj/i6IpRK0CvbVN3qibxlLdo5p5hcLmUuCCrHMpxiWSwKyI8mCP7qRNYuOJ0Uww==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.57.2': + resolution: {integrity: sha512-2MKM+I6g8tJxfSmFKOnHv2t8Sk3T6rF20A1Puk0svLK+uVapDZB/4pfAeB7nE83uAZrU6OxW+HmOd5wHVdXwXA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.55.0': - resolution: {integrity: sha512-BqZEsnPGdYpgyEIkDC1BadNY8oMwckftxBT+C8W0g1iKPdeqKZBtTfnvcq0nf60u7MkjFO8RBvpRGZBPw4L2ow==} + '@typescript-eslint/utils@8.57.2': + resolution: {integrity: sha512-krRIbvPK1ju1WBKIefiX+bngPs+odIQUtR7kymzPfo1POVw3jlF+nLkmexdSSd4UCbDcQn+wMBATOOmpBbqgKg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@8.55.0': - resolution: {integrity: sha512-AxNRwEie8Nn4eFS1FzDMJWIISMGoXMb037sgCBJ3UR6o0fQTzr2tqN9WT+DkWJPhIdQCfV7T6D387566VtnCJA==} + '@typescript-eslint/visitor-keys@8.57.2': + resolution: {integrity: sha512-zhahknjobV2FiD6Ee9iLbS7OV9zi10rG26odsQdfBO/hjSzUQbkIYgda+iNKK1zNiW2ey+Lf8MU5btN17V3dUw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@verdaccio/auth@8.0.0-next-8.29': - resolution: {integrity: sha512-lEIqneZ7LYYkF07/P9cJhOYVZTIIARGRVE66j666VR58T/fY/pC4hxEfuyqlfd3BhS3hM65aIrPZu+s03hyg+w==} + '@verdaccio/auth@8.0.0-next-8.33': + resolution: {integrity: sha512-HRIqEj9J7t95ZG3pCVpaCJoXCNVPB0R2DpkEXfG19TXsapf/mv5vMnBYG6O1C/ShNagHMA7z+Z6NwFZXHUzm9g==} engines: {node: '>=18'} - '@verdaccio/config@8.0.0-next-8.29': - resolution: {integrity: sha512-7kEZ6tv3NsJFPcKQrxELMkvJFI9Hmy1s8IPjuXjz9gobDV3NyF9VhPsh6l18Tm+nsqXb6ZTWiRup9V8Lkg0p0g==} + '@verdaccio/config@8.0.0-next-8.33': + resolution: {integrity: sha512-6/n/qcVMbNTK8oFY8l6vlJMeG6zor/aOFcR2Wd6yCoKcehITigmLn8MFziZPriYivzxYJJRjlaKO9+HuuQSKCA==} engines: {node: '>=18'} '@verdaccio/core@8.0.0-next-8.21': resolution: {integrity: sha512-n3Y8cqf84cwXxUUdTTfEJc8fV55PONPKijCt2YaC0jilb5qp1ieB3d4brqTOdCdXuwkmnG2uLCiGpUd/RuSW0Q==} engines: {node: '>=18'} - '@verdaccio/core@8.0.0-next-8.29': - resolution: {integrity: sha512-ztsNbnHMGqpOJlC3x/Jz7+0Xzrul+UIQQAFsTFHO3pET8nyZWkh/1TH50olz0pZ/OS87O/+7mk04TK9hHD/eFQ==} + '@verdaccio/core@8.0.0-next-8.33': + resolution: {integrity: sha512-ndPAfZVyN677y/EZX+USkL0/aOcU5rvnzS99nRCIHarZB44WMno9jl6FdX5Ax3b3exGo9GsxhEdbYHgOYaRlLQ==} engines: {node: '>=18'} '@verdaccio/file-locking@10.3.1': @@ -3895,166 +3683,116 @@ packages: resolution: {integrity: sha512-F6xQWvsZnEyGjugrYfe+D/ChSVudXmBFWi8xuTIX6PAdp7dk9x9biOGQFW8O3GSAK8UhJ6WlRisQKJeYRa6vWQ==} engines: {node: '>=18'} - '@verdaccio/hooks@8.0.0-next-8.29': - resolution: {integrity: sha512-KRuTN6iYg9ntFXmrH+fY+dNCFpNBMcEwOVLOJXk/fA3I3ki188FpRZz9rKToyj1XYZzPDqGUWv82ekswX5wrYw==} + '@verdaccio/hooks@8.0.0-next-8.33': + resolution: {integrity: sha512-8xP6kVOCufjaZWriFtaxP3HEmvYTIBhcxWldui4eCG7dzBdZzPlCkRbYKWP8LMnOEIxbJNbeFkokOaI1nho1jg==} engines: {node: '>=18'} - '@verdaccio/loaders@8.0.0-next-8.19': - resolution: {integrity: sha512-+mQuEZNLRZ4EEjzfROHrVeZXVHNFhQTpI98KCpcbU1NEC7ZAl5m7OBD2XPVtvNTia2ZT83q4H0JPi/bAomnIRA==} + '@verdaccio/loaders@8.0.0-next-8.23': + resolution: {integrity: sha512-UruK7pFz7aRKkR41/Hg/cPFSqX5Oxbx9rKGWK5ql3mvg2+xaWleRwknmnNjbVod7QK6cWsYA6cKnttRBTQuPkQ==} engines: {node: '>=18'} '@verdaccio/local-storage-legacy@11.1.1': resolution: {integrity: sha512-P6ahH2W6/KqfJFKP+Eid7P134FHDLNvHa+i8KVgRVBeo2/IXb6FEANpM1mCVNvPANu0LCAmNJBOXweoUKViaoA==} engines: {node: '>=18'} - '@verdaccio/logger-commons@8.0.0-next-8.29': - resolution: {integrity: sha512-CVeLv+U0cL9wtNJVwtzjj7wtUFYxMDmynWoXtepP+AthVoNj6G6rU2P2tGLX/uqH40EwqaHJy5Vo0uZ3ex2qhQ==} + '@verdaccio/logger-commons@8.0.0-next-8.33': + resolution: {integrity: sha512-WmMq/6HyRliKWus3sQR9Pgodopzbp84dl/h/E0tnxuOmzc/eDwYCEiQMfFhIBaOlpVJdsdLYqNAM9+YkoSDK0g==} engines: {node: '>=18'} '@verdaccio/logger-prettify@8.0.0-next-8.4': resolution: {integrity: sha512-gjI/JW29fyalutn/X1PQ0iNuGvzeVWKXRmnLa7gXVKhdi4p37l/j7YZ7n44XVbbiLIKAK0pbavEg9Yr66QrYaA==} engines: {node: '>=18'} - '@verdaccio/logger@8.0.0-next-8.29': - resolution: {integrity: sha512-AF6hBAkgsRjDFGLjFWO9hzUWM47Jt15v90I6Wk0TotzsrWxgBYbslfJyTgwmTpGjhPe7al2dnFwT7hxKa6fr/w==} + '@verdaccio/logger@8.0.0-next-8.33': + resolution: {integrity: sha512-8nR3hreOcINIbMIOohhxZNUL3l0uvgGYQecl8WJvR4XizYTp1vPHv4qz1CPyuaI5bKj1QFRqHkKvvtEnD1A0rw==} engines: {node: '>=18'} - '@verdaccio/middleware@8.0.0-next-8.29': - resolution: {integrity: sha512-ANsQ8qjyNslH6BfGZnNkBvK1acTlnFgedXen6BnbN9nF+AWzHUea6knh529J5Clm3zrWggbRnGCrp1SSlbOqSA==} + '@verdaccio/middleware@8.0.0-next-8.33': + resolution: {integrity: sha512-iMzE3stUp/qocHzFX2+xkzUe6L89vWZ/J4a4v7IxPu6KqBH39XCg4gI8Qu0xXRIFeYSTpZNzRUO+FTkeZRhJ1A==} engines: {node: '>=18'} '@verdaccio/search-indexer@8.0.0-next-8.5': resolution: {integrity: sha512-0GC2tJKstbPg/W2PZl2yE+hoAxffD2ZWilEnEYSEo2e9UQpNIy2zg7KE/uMUq2P72Vf5EVfVzb8jdaH4KV4QeA==} engines: {node: '>=18'} - '@verdaccio/signature@8.0.0-next-8.21': - resolution: {integrity: sha512-5TuGPRT4c5B3k6svxJ6Q5l31UBZTODo3iAJxmuAAC0iZBLNnivdvJlqUVdpZtYfrhwvuP5vuo7lucHQk6DsSmw==} + '@verdaccio/signature@8.0.0-next-8.25': + resolution: {integrity: sha512-3qMHZ9uXgNmRQDw7Bz3coCbXJAfI3q+bWRXQ0/fKg03LgSV6pbMD0HinGKcIBn0Kni+e8IsXxBfrs5ga4FF+Rg==} engines: {node: '>=18'} '@verdaccio/streams@10.2.1': resolution: {integrity: sha512-OojIG/f7UYKxC4dYX8x5ax8QhRx1b8OYUAMz82rUottCuzrssX/4nn5QE7Ank0DUSX3C9l/HPthc4d9uKRJqJQ==} engines: {node: '>=12', npm: '>=5'} - '@verdaccio/tarball@13.0.0-next-8.29': - resolution: {integrity: sha512-4hTQMXYF1olwwydaVfb6ab1TTImM42rAxLmw3VnJUI5ttbmfB9h095/TYsCssy5vqGQMp3l8YW/JxVTPcVtGYA==} + '@verdaccio/tarball@13.0.0-next-8.33': + resolution: {integrity: sha512-VQZ8I5Fs6INxO1cY6Lpk4Wx3sD0Uy7YIzTY9qWrZNRPGDxGcZu2fyFMUfoNc1+ygJP0r5TTqdVAY74z0iQnsWg==} engines: {node: '>=18'} - '@verdaccio/ui-theme@8.0.0-next-8.29': - resolution: {integrity: sha512-kSg69so1LHOL2SA1qLJikFxkx8FEOFQJV+Nde0lN3XMkp0RST8DgLx/hiVbgYzPz54S8LuvYR/DQAulyRulMcg==} + '@verdaccio/ui-theme@8.0.0-next-8.30': + resolution: {integrity: sha512-MSvFnYeocTWp6hqtIqtwp7Zm920UNhO3zQkKTPT6qGNjarkhxCCWRcSOAz7oJZhpbyLXc85zuxOLkTezCl4KUg==} - '@verdaccio/url@13.0.0-next-8.29': - resolution: {integrity: sha512-ucJ6MhLfY0g8uU0zjcJypSkCa1mXSLmrqdiILyj16Lo0y4w/gEvddMrfab8QUmgvvuzbCgSqCZHJmbZn7DFxQg==} + '@verdaccio/url@13.0.0-next-8.33': + resolution: {integrity: sha512-26LzQTCuUFFcNasAdzayBqsYWBheQy+D4tSWnVtmj4kKQnVhufBvHLjpEjK1gqphOMx6/Mju0IQe0LsjRc1zdg==} engines: {node: '>=18'} - '@verdaccio/utils@8.1.0-next-8.29': - resolution: {integrity: sha512-EgyazlL0VejvZqWZ6KL3ig27Yl8RXcwhz1hayuqeAIxaqbsnmSmogL2zKXgGnm9y/A6QkPfZH1BcQoUh1STvtQ==} + '@verdaccio/utils@8.1.0-next-8.33': + resolution: {integrity: sha512-WLE8qTBgzuZPa+gq/nKPWtF4MTMayaeOD3Qy6yfChxNvFXY+6yPFkS0QocXL7CdB2A+w+ylgTOOzKr0tWvyTpQ==} engines: {node: '>=18'} - '@vitejs/plugin-basic-ssl@2.1.4': - resolution: {integrity: sha512-HXciTXN/sDBYWgeAD4V4s0DN0g72x5mlxQhHxtYu3Tt8BLa6MzcJZUyDVFCdtjNs3bfENVHVzOsmooTVuNgAAw==} + '@vitejs/plugin-basic-ssl@2.3.0': + resolution: {integrity: sha512-bdyo8rB3NnQbikdMpHaML9Z1OZPBu6fFOBo+OtxsBlvMJtysWskmBcnbIDhUqgC8tcxNv/a+BcV5U+2nQMm1OQ==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} peerDependencies: - vite: ^6.0.0 || ^7.0.0 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 - '@vitest/coverage-v8@4.0.18': - resolution: {integrity: sha512-7i+N2i0+ME+2JFZhfuz7Tg/FqKtilHjGyGvoHYQ6iLV0zahbsJ9sljC9OcFcPDbhYKCet+sG8SsVqlyGvPflZg==} + '@vitest/coverage-v8@4.1.2': + resolution: {integrity: sha512-sPK//PHO+kAkScb8XITeB1bf7fsk85Km7+rt4eeuRR3VS1/crD47cmV5wicisJmjNdfeokTZwjMk4Mj2d58Mgg==} peerDependencies: - '@vitest/browser': 4.0.18 - vitest: 4.0.18 + '@vitest/browser': 4.1.2 + vitest: 4.1.2 peerDependenciesMeta: '@vitest/browser': optional: true - '@vitest/expect@4.0.18': - resolution: {integrity: sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==} + '@vitest/expect@4.1.2': + resolution: {integrity: sha512-gbu+7B0YgUJ2nkdsRJrFFW6X7NTP44WlhiclHniUhxADQJH5Szt9mZ9hWnJPJ8YwOK5zUOSSlSvyzRf0u1DSBQ==} - '@vitest/mocker@4.0.18': - resolution: {integrity: sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==} + '@vitest/mocker@4.1.2': + resolution: {integrity: sha512-Ize4iQtEALHDttPRCmN+FKqOl2vxTiNUhzobQFFt/BM1lRUTG7zRCLOykG/6Vo4E4hnUdfVLo5/eqKPukcWW7Q==} peerDependencies: msw: ^2.4.9 - vite: ^6.0.0 || ^7.0.0-0 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: msw: optional: true vite: optional: true - '@vitest/pretty-format@4.0.18': - resolution: {integrity: sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==} + '@vitest/pretty-format@4.1.2': + resolution: {integrity: sha512-dwQga8aejqeuB+TvXCMzSQemvV9hNEtDDpgUKDzOmNQayl2OG241PSWeJwKRH3CiC+sESrmoFd49rfnq7T4RnA==} - '@vitest/runner@4.0.18': - resolution: {integrity: sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==} + '@vitest/runner@4.1.2': + resolution: {integrity: sha512-Gr+FQan34CdiYAwpGJmQG8PgkyFVmARK8/xSijia3eTFgVfpcpztWLuP6FttGNfPLJhaZVP/euvujeNYar36OQ==} - '@vitest/snapshot@4.0.18': - resolution: {integrity: sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==} + '@vitest/snapshot@4.1.2': + resolution: {integrity: sha512-g7yfUmxYS4mNxk31qbOYsSt2F4m1E02LFqO53Xpzg3zKMhLAPZAjjfyl9e6z7HrW6LvUdTwAQR3HHfLjpko16A==} - '@vitest/spy@4.0.18': - resolution: {integrity: sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==} + '@vitest/spy@4.1.2': + resolution: {integrity: sha512-DU4fBnbVCJGNBwVA6xSToNXrkZNSiw59H8tcuUspVMsBDBST4nfvsPsEHDHGtWRRnqBERBQu7TrTKskmjqTXKA==} - '@vitest/utils@4.0.18': - resolution: {integrity: sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==} + '@vitest/utils@4.1.2': + resolution: {integrity: sha512-xw2/TiX82lQHA06cgbqRKFb5lCAy3axQ4H4SoUFhUsg+wztiet+co86IAMDtF6Vm1hc7J6j09oh/rgDn+JdKIQ==} - '@web/browser-logs@0.4.1': - resolution: {integrity: sha512-ypmMG+72ERm+LvP+loj9A64MTXvWMXHUOu773cPO4L1SV/VWg6xA9Pv7vkvkXQX+ItJtCJt+KQ+U6ui2HhSFUw==} - engines: {node: '>=18.0.0'} + '@webassemblyjs/ast@1.14.1': + resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} - '@web/config-loader@0.3.3': - resolution: {integrity: sha512-ilzeQzrPpPLWZhzFCV+4doxKDGm7oKVfdKpW9wiUNVgive34NSzCw+WzXTvjE4Jgr5CkyTDIObEmMrqQEjhT0g==} - engines: {node: '>=18.0.0'} + '@webassemblyjs/floating-point-hex-parser@1.13.2': + resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} - '@web/dev-server-core@0.7.5': - resolution: {integrity: sha512-Da65zsiN6iZPMRuj4Oa6YPwvsmZmo5gtPWhW2lx3GTUf5CAEapjVpZVlUXnKPL7M7zRuk72jSsIl8lo+XpTCtw==} - engines: {node: '>=18.0.0'} + '@webassemblyjs/helper-api-error@1.13.2': + resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} - '@web/dev-server-rollup@0.6.4': - resolution: {integrity: sha512-sJZfTGCCrdku5xYnQQG51odGI092hKY9YFM0X3Z0tRY3iXKXcYRaLZrErw5KfCxr6g0JRuhe4BBhqXTA5Q2I3Q==} - engines: {node: '>=18.0.0'} - - '@web/dev-server@0.4.6': - resolution: {integrity: sha512-jj/1bcElAy5EZet8m2CcUdzxT+CRvUjIXGh8Lt7vxtthkN9PzY9wlhWx/9WOs5iwlnG1oj0VGo6f/zvbPO0s9w==} - engines: {node: '>=18.0.0'} - hasBin: true - - '@web/parse5-utils@2.1.1': - resolution: {integrity: sha512-7rBVZEMGfrq2iPcAEwJ0KSNSvmA2a6jT2CK8/gyIOHgn4reg7bSSRbzyWIEYWyIkeRoYEukX/aW+nAeCgSSqhQ==} - engines: {node: '>=18.0.0'} - - '@web/test-runner-chrome@0.18.1': - resolution: {integrity: sha512-eO6ctCaqSguGM6G3cFobGHnrEs9wlv9Juj/Akyr4XLjeEMTheNULdvOXw9Bygi+QC/ir/0snMmt+/YKnfy8rYA==} - engines: {node: '>=18.0.0'} - - '@web/test-runner-commands@0.9.0': - resolution: {integrity: sha512-zeLI6QdH0jzzJMDV5O42Pd8WLJtYqovgdt0JdytgHc0d1EpzXDsc7NTCJSImboc2NcayIsWAvvGGeRF69SMMYg==} - engines: {node: '>=18.0.0'} - - '@web/test-runner-core@0.13.4': - resolution: {integrity: sha512-84E1025aUSjvZU1j17eCTwV7m5Zg3cZHErV3+CaJM9JPCesZwLraIa0ONIQ9w4KLgcDgJFw9UnJ0LbFf42h6tg==} - engines: {node: '>=18.0.0'} - - '@web/test-runner-coverage-v8@0.8.0': - resolution: {integrity: sha512-PskiucYpjUtgNfR2zF2AWqWwjXL7H3WW/SnCAYmzUrtob7X9o/+BjdyZ4wKbOxWWSbJO4lEdGIDLu+8X2Xw+lA==} - engines: {node: '>=18.0.0'} - - '@web/test-runner-mocha@0.9.0': - resolution: {integrity: sha512-ZL9F6FXd0DBQvo/h/+mSfzFTSRVxzV9st/AHhpgABtUtV/AIpVE9to6+xdkpu6827kwjezdpuadPfg+PlrBWqQ==} - engines: {node: '>=18.0.0'} - - '@web/test-runner@0.20.2': - resolution: {integrity: sha512-zfEGYEDnS0EI8qgoWFjmtkIXhqP15W40NW3dCaKtbxj5eU0a7E53f3GV/tZGD0GlZKF8d4Fyw+AFrwOJU9Z4GA==} - engines: {node: '>=18.0.0'} - hasBin: true - - '@webassemblyjs/ast@1.14.1': - resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} - - '@webassemblyjs/floating-point-hex-parser@1.13.2': - resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} - - '@webassemblyjs/helper-api-error@1.13.2': - resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} - - '@webassemblyjs/helper-buffer@1.14.1': - resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} + '@webassemblyjs/helper-buffer@1.14.1': + resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} '@webassemblyjs/helper-numbers@1.13.2': resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} @@ -4089,8 +3827,8 @@ packages: '@webassemblyjs/wast-printer@1.14.1': resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} - '@xmldom/xmldom@0.8.11': - resolution: {integrity: sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==} + '@xmldom/xmldom@0.8.12': + resolution: {integrity: sha512-9k/gHF6n/pAi/9tqr3m3aqkuiNosYTurLLUtc7xQ9sxB/wm7WPygCv8GYa6mS0fLJEHhqMC1ATYhz++U/lRHqg==} engines: {node: '>=10.0.0'} '@xtuc/ieee754@1.2.0': @@ -4133,12 +3871,8 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn-walk@8.3.4: - resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} - engines: {node: '>=0.4.0'} - - acorn@8.15.0: - resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} engines: {node: '>=0.4.0'} hasBin: true @@ -4146,14 +3880,6 @@ packages: resolution: {integrity: sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==} engines: {node: '>=8.9'} - adm-zip@0.5.16: - resolution: {integrity: sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==} - engines: {node: '>=12.0'} - - agent-base@4.3.0: - resolution: {integrity: sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==} - engines: {node: '>= 4.0.0'} - agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} @@ -4162,6 +3888,10 @@ packages: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} + agent-base@9.0.0: + resolution: {integrity: sha512-TQf59BsZnytt8GdJKLPfUZ54g/iaUL2OWDSFCCvMOhsHduDQxO8xC4PNeyIkVcA5KwL2phPSv0douC0fgWzmnA==} + engines: {node: '>= 20'} + ajv-formats@2.1.1: resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} @@ -4178,8 +3908,8 @@ packages: peerDependencies: ajv: ^8.8.2 - ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@6.14.0: + resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} ajv@8.17.1: resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} @@ -4187,18 +3917,14 @@ packages: ajv@8.18.0: resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} - algoliasearch@5.48.1: - resolution: {integrity: sha512-Rf7xmeuIo7nb6S4mp4abW2faW8DauZyE2faBIKFaUfP3wnpOvNSbiI5AwVhqBNj0jPgBWEvhyCu0sLjN2q77Rg==} + algoliasearch@5.50.0: + resolution: {integrity: sha512-yE5I83Q2s8euVou8Y3feXK08wyZInJWLYXgWO6Xti9jBUEZAGUahyeQ7wSZWkifLWVnQVKEz5RAmBlXG5nqxog==} engines: {node: '>= 14.0.0'} ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} - ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} - ansi-escapes@7.3.0: resolution: {integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==} engines: {node: '>=18'} @@ -4208,10 +3934,6 @@ packages: engines: {'0': node >= 0.8.0} hasBin: true - ansi-regex@2.1.1: - resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} - engines: {node: '>=0.10.0'} - ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -4220,10 +3942,6 @@ packages: resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} engines: {node: '>=12'} - ansi-styles@2.2.1: - resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} - engines: {node: '>=0.10.0'} - ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} @@ -4240,20 +3958,9 @@ packages: resolution: {integrity: sha512-FCAJojipPn0bXjuEpjOOOMN8FZDkxfWWp4JGN9mifU2IhxvKyXZYqpzPHdnTSUpmPDy+tsslB6Z1g+Vg6nVbYA==} engines: {node: '>=8'} - arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} - argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - array-back@3.1.0: - resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==} - engines: {node: '>=6'} - - array-back@6.2.2: - resolution: {integrity: sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==} - engines: {node: '>=12.17'} - array-buffer-byte-length@1.0.2: resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} engines: {node: '>= 0.4'} @@ -4269,22 +3976,10 @@ packages: resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} engines: {node: '>= 0.4'} - array-union@1.0.2: - resolution: {integrity: sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==} - engines: {node: '>=0.10.0'} - - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - array-union@3.0.1: resolution: {integrity: sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==} engines: {node: '>=12'} - array-uniq@1.0.3: - resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} - engines: {node: '>=0.10.0'} - array.prototype.findlastindex@1.2.6: resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} engines: {node: '>= 0.4'} @@ -4301,10 +3996,6 @@ packages: resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - arrify@2.0.1: resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} engines: {node: '>=8'} @@ -4328,12 +4019,8 @@ packages: resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} engines: {node: '>=4'} - ast-v8-to-istanbul@0.3.11: - resolution: {integrity: sha512-Qya9fkoofMjCBNVdWINMjB5KZvkYfaO9/anwkWnjxibpWUxo5iHl2sOdP7/uAqaRuUYuoo8rDwnbaaKVFxoUvw==} - - astral-regex@2.0.0: - resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} - engines: {node: '>=8'} + ast-v8-to-istanbul@1.0.0: + resolution: {integrity: sha512-1fSfIwuDICFA4LKkCzRPO7F0hzFf0B7+Xqrl27ynQaa+Rh0e1Es0v6kWHPott3lU10AyAr7oKHa65OppjLn3Rg==} async-each-series@0.1.1: resolution: {integrity: sha512-p4jj6Fws4Iy2m0iCmI2am2ZNZCgbdgE+P8F/8csmn2vx7ixXrO2zGcuNsD46X5uZSVecmkEy/M06X2vG8KD6dQ==} @@ -4356,8 +4043,8 @@ packages: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} engines: {node: '>=8.0.0'} - autoprefixer@10.4.24: - resolution: {integrity: sha512-uHZg7N9ULTVbutaIsDRoUkoS8/h3bdsmVJYZ5l3wv8Cp/6UIIoRDm90hZ+BwxUj/hGBEzLxdHNSKuFpn8WOyZw==} + autoprefixer@10.4.27: + resolution: {integrity: sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA==} engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: @@ -4373,23 +4060,29 @@ packages: aws4@1.13.2: resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==} - b4a@1.7.4: - resolution: {integrity: sha512-u20zJLDaSWpxaZ+zaAkEIB2dZZ1o+DF4T/MRbmsvGp9nletHOyiai19OzX1fF8xUBYsO1bPXxODvcd0978pnug==} + b4a@1.8.0: + resolution: {integrity: sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==} peerDependencies: react-native-b4a: '*' peerDependenciesMeta: react-native-b4a: optional: true - babel-loader@10.0.0: - resolution: {integrity: sha512-z8jt+EdS61AMw22nSfoNJAZ0vrtmhPRVi6ghL3rCeRZI8cdNYFiV5xeV3HbE7rlZZNmGH8BVccwWt8/ED0QOHA==} + babel-loader@10.1.1: + resolution: {integrity: sha512-JwKSzk2kjIe7mgPK+/lyZ2QAaJcpahNAdM+hgR2HI8D0OJVkdj8Rl6J3kaLYki9pwF7P2iWnD8qVv80Lq1ABtg==} engines: {node: ^18.20.0 || ^20.10.0 || >=22.0.0} peerDependencies: - '@babel/core': ^7.12.0 + '@babel/core': ^7.12.0 || ^8.0.0-beta.1 + '@rspack/core': ^1.0.0 || ^2.0.0-0 webpack: '>=5.61.0' + peerDependenciesMeta: + '@rspack/core': + optional: true + webpack: + optional: true - babel-plugin-polyfill-corejs2@0.4.15: - resolution: {integrity: sha512-hR3GwrRwHUfYwGfrisXPIDP3JcYfBrW7wKE7+Au6wDYl7fm/ka1NEII6kORzxNU556JjfidZeBsO10kYvtV1aw==} + babel-plugin-polyfill-corejs2@0.4.17: + resolution: {integrity: sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 @@ -4398,22 +4091,22 @@ packages: peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-polyfill-corejs3@0.14.0: - resolution: {integrity: sha512-AvDcMxJ34W4Wgy4KBIIePQTAOP1Ie2WFwkQp3dB7FQ/f0lI5+nM96zUnYEOE1P9sEg0es5VCP0HxiWu5fUHZAQ==} + babel-plugin-polyfill-corejs3@0.14.2: + resolution: {integrity: sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-polyfill-regenerator@0.6.6: - resolution: {integrity: sha512-hYm+XLYRMvupxiQzrvXUj7YyvFFVfv5gI0R71AJzudg1g2AI2vyCPPIFEBjk162/wFzti3inBHo7isWFuEVS/A==} + babel-plugin-polyfill-regenerator@0.6.8: + resolution: {integrity: sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - balanced-match@4.0.2: - resolution: {integrity: sha512-x0K50QvKQ97fdEz2kPehIerj+YTeptKF9hyYkKf6egnwmMWAkADiO0QCzSp0R5xN8FTZgYaBfSaue46Ej62nMg==} - engines: {node: 20 || >=22} + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} bare-events@2.8.2: resolution: {integrity: sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==} @@ -4423,8 +4116,8 @@ packages: bare-abort-controller: optional: true - bare-fs@4.5.4: - resolution: {integrity: sha512-POK4oplfA7P7gqvetNmCs4CNtm9fNsx+IAh7jH7GgU0OJdge2rso0R20TNWVq6VoWcCvsTdlNDaleLHGaKx8CA==} + bare-fs@4.6.0: + resolution: {integrity: sha512-2YkS7NuiJceSEbyEOdSNLE9tsGd+f4+f7C+Nik/MCk27SYdwIMPT/yRKvg++FZhQXgk0KWJKJyXX9RhVV0RGqA==} engines: {bare: '>=1.16.0'} peerDependencies: bare-buffer: '*' @@ -4432,26 +4125,29 @@ packages: bare-buffer: optional: true - bare-os@3.6.2: - resolution: {integrity: sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==} + bare-os@3.8.7: + resolution: {integrity: sha512-G4Gr1UsGeEy2qtDTZwL7JFLo2wapUarz7iTMcYcMFdS89AIQuBoyjgXZz0Utv7uHs3xA9LckhVbeBi8lEQrC+w==} engines: {bare: '>=1.14.0'} bare-path@3.0.0: resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} - bare-stream@2.7.0: - resolution: {integrity: sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==} + bare-stream@2.12.0: + resolution: {integrity: sha512-w28i8lkBgREV3rPXGbgK+BO66q+ZpKqRWrZLiCdmmUlLPrQ45CzkvRhN+7lnv00Gpi2zy5naRxnUFAxCECDm9g==} peerDependencies: + bare-abort-controller: '*' bare-buffer: '*' bare-events: '*' peerDependenciesMeta: + bare-abort-controller: + optional: true bare-buffer: optional: true bare-events: optional: true - bare-url@2.3.2: - resolution: {integrity: sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==} + bare-url@2.4.0: + resolution: {integrity: sha512-NSTU5WN+fy/L0DDenfE8SXQna4voXuW0FHM7wH8i3/q9khUSchfPbPezO4zSFMnDGIf9YE+mt/RWhZgNRKRIXA==} base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -4460,12 +4156,13 @@ packages: resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} engines: {node: ^4.5.0 || >= 5.9} - baseline-browser-mapping@2.9.19: - resolution: {integrity: sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==} + baseline-browser-mapping@2.10.16: + resolution: {integrity: sha512-Lyf3aK28zpsD1yQMiiHD4RvVb6UdMoo8xzG2XzFIfR9luPzOpcBlAsT/qfB1XWS1bxWT+UtE4WmQgsp297FYOA==} + engines: {node: '>=6.0.0'} hasBin: true - basic-ftp@5.1.0: - resolution: {integrity: sha512-RkaJzeJKDbaDWTIPiJwubyljaEPwpVWkm9Rt5h9Nd6h7tEXTJ3VB4qxdZBioV7JO5yLUaOKwz7vDOzlncUsegw==} + basic-ftp@5.2.0: + resolution: {integrity: sha512-VoMINM2rqJwJgfdHq6RiUudKt2BV+FY5ZFezP/ypmwayk68+NzzAQy4XXLlqsGD4MCzq3DrmNFD/uUmBJuGoXw==} engines: {node: '>=10.0.0'} batch@0.6.1: @@ -4500,14 +4197,6 @@ packages: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} - bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - - blocking-proxy@1.0.1: - resolution: {integrity: sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA==} - engines: {node: '>=6.9.x'} - hasBin: true - body-parser@1.20.4: resolution: {integrity: sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -4522,15 +4211,15 @@ packages: boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - brace-expansion@1.1.12: - resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + brace-expansion@1.1.13: + resolution: {integrity: sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==} - brace-expansion@2.0.2: - resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + brace-expansion@2.0.3: + resolution: {integrity: sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==} - brace-expansion@5.0.2: - resolution: {integrity: sha512-Pdk8c9poy+YhOgVWw1JNN22/HcivgKWwpxKq04M/jTmHyCZn12WPJebZxdjSa5TmBqISrUSgNYU3eRORljfCCw==} - engines: {node: 20 || >=22} + brace-expansion@5.0.5: + resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} + engines: {node: 18 || 20 || >=22} braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} @@ -4554,14 +4243,11 @@ packages: browserify-zlib@0.1.4: resolution: {integrity: sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==} - browserslist@4.28.1: - resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} + browserslist@4.28.2: + resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - browserstack@1.6.1: - resolution: {integrity: sha512-GxtFjpIaKdbAyzHfFDKixKO8IBT7wR3NjbzrGc78nNs/Ciys9wU3/nBtsqsWv5nDSrdI5tz0peKuzCPuNXNUiw==} - bs-recipes@1.3.4: resolution: {integrity: sha512-BXvDkqhDNxXEjeGM8LFkSbR+jzmP/CYpCiVKYn+soB1dDldeU15EBNDkwVXndKuX35wnNUaPd0qSoQEAkmQtMw==} @@ -4574,9 +4260,6 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} @@ -4596,14 +4279,10 @@ packages: resolution: {integrity: sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==} engines: {node: '>=6.0.0'} - cacache@20.0.3: - resolution: {integrity: sha512-3pUp4e8hv07k1QlijZu6Kn7c9+ZpWWk4j3F8N3xPuCExULobqJydKYOTj1FTq58srkJsXvO7LbGAH4C0ZU3WGw==} + cacache@20.0.4: + resolution: {integrity: sha512-M3Lab8NPYlZU2exsL3bMVvMrMqgwCnMWfdZbK28bn3pK6APT/Te/I8hjRPNu1uwORY9a1eEQoifXbKPQMfMTOA==} engines: {node: ^20.17.0 || >=22.9.0} - cache-content-type@1.0.1: - resolution: {integrity: sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==} - engines: {node: '>= 6.0.0'} - cacheable-lookup@6.1.0: resolution: {integrity: sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==} engines: {node: '>=10.6.0'} @@ -4628,16 +4307,8 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - caniuse-lite@1.0.30001770: - resolution: {integrity: sha512-x/2CLQ1jHENRbHg5PSId2sXq1CIO1CISvwWAj027ltMVG2UNgW+w9oH2+HzgEIRFembL8bUlXtfbBHR1fCg2xw==} + caniuse-lite@1.0.30001786: + resolution: {integrity: sha512-4oxTZEvqmLLrERwxO76yfKM7acZo310U+v4kqexI2TL1DkkUEMT8UijrxxcnVdxR3qkVf5awGRX+4Z6aPHVKrA==} caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} @@ -4646,14 +4317,6 @@ packages: resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} engines: {node: '>=18'} - chalk-template@0.4.0: - resolution: {integrity: sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==} - engines: {node: '>=12'} - - chalk@1.1.3: - resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} - engines: {node: '>=0.10.0'} - chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -4680,18 +4343,10 @@ packages: resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} engines: {node: '>= 20.19.0'} - chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - chownr@3.0.0: resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} engines: {node: '>=18'} - chrome-launcher@0.15.2: - resolution: {integrity: sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==} - engines: {node: '>=12.13.0'} - hasBin: true - chrome-trace-event@1.0.4: resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} engines: {node: '>=6.0'} @@ -4701,10 +4356,6 @@ packages: peerDependencies: devtools-protocol: '*' - cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} - cli-cursor@5.0.0: resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} engines: {node: '>=18'} @@ -4717,8 +4368,8 @@ packages: resolution: {integrity: sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==} engines: {node: '>=18.20'} - cli-truncate@5.1.1: - resolution: {integrity: sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A==} + cli-truncate@5.2.0: + resolution: {integrity: sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw==} engines: {node: '>=20'} cli-width@4.1.0: @@ -4728,9 +4379,6 @@ packages: clipanion@4.0.0-rc.4: resolution: {integrity: sha512-CXkMQxU6s9GklO/1f714dkKBMu1lopS1WFF0B8o4AxPykR1hpozxSiUZ5ZUeBjfPgCWqbcNOtZVFhB8Lkfp1+Q==} - cliui@6.0.0: - resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} - cliui@7.0.4: resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} @@ -4749,18 +4397,6 @@ packages: clone-response@1.0.3: resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} - clone@2.1.2: - resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} - engines: {node: '>=0.8'} - - co-body@6.2.0: - resolution: {integrity: sha512-Kbpv2Yd1NdL1V/V4cwLVxraHDV6K8ayohr2rmH0J87Er8+zJjcTa6dAn9QMPC9CRgU8+aNajKbSf1TzDB1yKPA==} - engines: {node: '>=8.0.0'} - - co@4.6.0: - resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - collection-utils@1.0.1: resolution: {integrity: sha512-LA2YTIlR7biSpXkKYwwuzGjwL5rjWEZVOSnvdUc7gObvWe4WkjxOpfrdhoP7Hs09YWDVfg0Mal9BpAqLfVEzQg==} @@ -4782,14 +4418,6 @@ packages: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} - command-line-args@5.2.1: - resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==} - engines: {node: '>=4.0.0'} - - command-line-usage@7.0.3: - resolution: {integrity: sha512-PqMLy5+YGwhMh1wS04mVG44oqDsgyLRSKJBdOo1bnYhMKBW65gZF1dRp2OZRhiTjgUHljy99qkO7bsctLaw35Q==} - engines: {node: '>=12.20.0'} - commander@14.0.3: resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} engines: {node: '>=20'} @@ -4850,8 +4478,8 @@ packages: resolution: {integrity: sha512-tQMagCOC59EVgNZcC5zl7XqO30Wki9i9J3acbUvkaosCT6JX3EeFwJD7Qqp4MCikRnzS18WXV3BLIQ66ytu6+Q==} engines: {node: '>=18'} - conventional-commits-parser@6.2.1: - resolution: {integrity: sha512-20pyHgnO40rvfI0NGF/xiEoFMkXDtkF8FwHvk5BokoFoCuTQRI8vrNCNFWUOfuolKJMm1tPCHc8GgYEtr1XRNA==} + conventional-commits-parser@6.4.0: + resolution: {integrity: sha512-tvRg7FIBNlyPzjdG8wWRlPHQJJHI7DylhtRGeU9Lq+JuoPh5BKpPRX83ZdLrvXuOSu5Eo/e7SzOQhU4Hd2Miuw==} engines: {node: '>=18'} hasBin: true @@ -4872,21 +4500,18 @@ packages: resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} - cookies@0.9.1: - resolution: {integrity: sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==} - engines: {node: '>= 0.8'} - - copy-anything@2.0.6: - resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==} + copy-anything@3.0.5: + resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} + engines: {node: '>=12.13'} - copy-webpack-plugin@13.0.1: - resolution: {integrity: sha512-J+YV3WfhY6W/Xf9h+J1znYuqTye2xkBUIGyTPWuBAT27qajBa5mR4f8WBmfDY3YjRftT2kqZZiLi1qf0H+UOFw==} - engines: {node: '>= 18.12.0'} + copy-webpack-plugin@14.0.0: + resolution: {integrity: sha512-3JLW90aBGeaTLpM7mYQKpnVdgsUZRExY55giiZgLuX/xTQRUs1dOCwbBnWnvY6Q6rfZoXMNwzOQJCSZPppfqXA==} + engines: {node: '>= 20.9.0'} peerDependencies: webpack: ^5.1.0 - core-js-compat@3.48.0: - resolution: {integrity: sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q==} + core-js-compat@3.49.0: + resolution: {integrity: sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==} core-util-is@1.0.2: resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} @@ -4894,16 +4519,12 @@ packages: core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - cors@2.8.5: - resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} - engines: {node: '>= 0.10'} - cors@2.8.6: resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} engines: {node: '>= 0.10'} - cosmiconfig@9.0.0: - resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + cosmiconfig@9.0.1: + resolution: {integrity: sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==} engines: {node: '>=14'} peerDependencies: typescript: '>=4.9.5' @@ -4911,12 +4532,6 @@ packages: typescript: optional: true - create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - - cross-fetch@3.1.5: - resolution: {integrity: sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==} - cross-fetch@4.1.0: resolution: {integrity: sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==} @@ -4924,11 +4539,11 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - css-loader@7.1.3: - resolution: {integrity: sha512-frbERmjT0UC5lMheWpJmMilnt9GEhbZJN/heUb7/zaJYeIzj5St9HvDcfshzzOqbsS+rYpMk++2SD3vGETDSyA==} + css-loader@7.1.4: + resolution: {integrity: sha512-vv3J9tlOl04WjiMvHQI/9tmIrCxVrj6PFbHemBB1iihpeRbi/I4h033eoFIhwxBBqLhI0KYFS7yvynBFhIZfTw==} engines: {node: '>= 18.12.0'} peerDependencies: - '@rspack/core': 0.x || 1.x + '@rspack/core': 0.x || ^1.0.0 || ^2.0.0-0 webpack: ^5.27.0 peerDependenciesMeta: '@rspack/core': @@ -4939,8 +4554,8 @@ packages: css-select@6.0.0: resolution: {integrity: sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw==} - css-tree@3.1.0: - resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} + css-tree@3.2.1: + resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} css-what@7.0.0: @@ -4952,10 +4567,6 @@ packages: engines: {node: '>=4'} hasBin: true - cssstyle@6.0.1: - resolution: {integrity: sha512-IoJs7La+oFp/AB033wBStxNOJt4+9hHMxsXUPANcoXL2b3W4DZKghlJ2cI/eyeRZIQ9ysvYEorVhjrcYctWbog==} - engines: {node: '>=20'} - custom-event@1.0.1: resolution: {integrity: sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==} @@ -4994,9 +4605,6 @@ packages: dayjs@1.11.13: resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} - debounce@1.2.1: - resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} - debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -5049,10 +4657,6 @@ packages: supports-color: optional: true - decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} - decimal.js@10.6.0: resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} @@ -5060,9 +4664,6 @@ packages: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} - deep-equal@1.0.1: - resolution: {integrity: sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==} - deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -5078,10 +4679,6 @@ packages: resolution: {integrity: sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==} engines: {node: '>=18'} - default-gateway@6.0.3: - resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==} - engines: {node: '>= 10'} - defer-to-connect@2.0.1: resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} engines: {node: '>=10'} @@ -5090,10 +4687,6 @@ packages: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} - define-lazy-prop@2.0.0: - resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} - engines: {node: '>=8'} - define-lazy-prop@3.0.0: resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} engines: {node: '>=12'} @@ -5102,24 +4695,17 @@ packages: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} - defu@6.1.4: - resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + defu@6.1.7: + resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} degenerator@5.0.1: resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} engines: {node: '>= 14'} - del@2.2.2: - resolution: {integrity: sha512-Z4fzpbIRjOu7lO5jCETSWoqUDVe0IPOlfugBsF6suen2LKDlVb4QZpKEM9P+buNJ4KI1eN7I083w/pbKUpsrWQ==} - engines: {node: '>=0.10.0'} - delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} - delegates@1.0.0: - resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} - depd@1.1.2: resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} engines: {node: '>= 0.6'} @@ -5128,10 +4714,6 @@ packages: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} - dependency-graph@0.11.0: - resolution: {integrity: sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==} - engines: {node: '>= 0.6.0'} - dependency-graph@1.0.0: resolution: {integrity: sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==} engines: {node: '>=4'} @@ -5152,27 +4734,12 @@ packages: engines: {node: '>= 0.8.0'} hasBin: true - devtools-protocol@0.0.1045489: - resolution: {integrity: sha512-D+PTmWulkuQW4D1NTiCRCFxF7pQPn0hgp4YyX4wAQ6xYXKOadSWPR3ENGDQ47MW/Ewc9v2rpC/UEEGahgBYpSQ==} - - devtools-protocol@0.0.1566079: - resolution: {integrity: sha512-MJfAEA1UfVhSs7fbSQOG4czavUp1ajfg6prlAN0+cmfa2zNjaIbvq8VneP7do1WAQQIvgNJWSMeP6UyI90gIlQ==} + devtools-protocol@0.0.1581282: + resolution: {integrity: sha512-nv7iKtNZQshSW2hKzYNr46nM/Cfh5SEvE2oV0/SEGgc9XupIY5ggf84Cz8eJIkBce7S3bmTAauFD6aysMpnqsQ==} di@0.0.1: resolution: {integrity: sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==} - diff@4.0.4: - resolution: {integrity: sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==} - engines: {node: '>=0.3.1'} - - diff@5.2.2: - resolution: {integrity: sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==} - engines: {node: '>=0.3.1'} - - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - dns-packet@5.6.1: resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} engines: {node: '>=6'} @@ -5227,13 +4794,13 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - ejs@4.0.1: - resolution: {integrity: sha512-krvQtxc0btwSm/nvnt1UpnaFDFVJpJ0fdckmALpCgShsr/iGYHTnJiUliZTgmzq/UxTX33TtOQVKaNigMQp/6Q==} + ejs@5.0.1: + resolution: {integrity: sha512-COqBPFMxuPTPspXl2DkVYaDS3HtrD1GpzOGkNTJ1IYkifq/r9h8SVEFrjA3D9/VJGOEoMQcrlhpntcSUrM8k6A==} engines: {node: '>=0.12.18'} hasBin: true - electron-to-chromium@1.5.286: - resolution: {integrity: sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==} + electron-to-chromium@1.5.332: + resolution: {integrity: sha512-7OOtytmh/rINMLwaFTbcMVvYXO3AUm029X0LcyfYk0B557RlPkdpTpnH9+htMlfu5dKwOmT0+Zs2Aw+lnn6TeQ==} emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} @@ -5269,12 +4836,12 @@ packages: resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} engines: {node: '>=10.0.0'} - engine.io@6.6.5: - resolution: {integrity: sha512-2RZdgEbXmp5+dVbRm0P7HQUImZpICccJy7rN7Tv+SFa55pH+lxnuw6/K1ZxxBfHoYpSkHLAO92oa8O4SwFXA2A==} + engine.io@6.6.6: + resolution: {integrity: sha512-U2SN0w3OpjFRVlrc17E6TMDmH58Xl9rai1MblNjAdwWp07Kk+llmzX0hjDpQdrDGzwmvOtgM5yI+meYX6iZ2xA==} engines: {node: '>=10.2.0'} - enhanced-resolve@5.19.0: - resolution: {integrity: sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==} + enhanced-resolve@5.20.1: + resolution: {integrity: sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==} engines: {node: '>=10.13.0'} ent@2.2.2: @@ -5297,8 +4864,8 @@ packages: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} - envinfo@7.15.0: - resolution: {integrity: sha512-chR+t7exF6y59kelhXw5I3849nTy7KIRO+ePdLMhCD+JRP/JvmkenDWP7QSFGlsHX+kxGxdDutOPrmj5j1HR6g==} + envinfo@7.21.0: + resolution: {integrity: sha512-Lw7I8Zp5YKHFCXL7+Dz95g4CcbMEpgvqZNNq3AmlT5XAV6CgAAk6gyAMqn2zjw08K9BHfcNuKrMiCPLByGafow==} engines: {node: '>=4'} hasBin: true @@ -5306,9 +4873,6 @@ packages: resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} engines: {node: '>=18'} - err-code@2.0.3: - resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} - errno@0.1.8: resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} hasBin: true @@ -5316,9 +4880,6 @@ packages: error-ex@1.3.4: resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} - errorstacks@2.4.1: - resolution: {integrity: sha512-jE4i0SMYevwu/xxAuzhly/KTwtj0xDhbzB6m1xPImxTkw8wcCbgarOQPfCVMi5JKVyW7in29pNJCCJrry3Ynnw==} - es-abstract@1.24.1: resolution: {integrity: sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==} engines: {node: '>= 0.4'} @@ -5331,9 +4892,6 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-module-lexer@1.7.0: - resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} - es-module-lexer@2.0.0: resolution: {integrity: sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==} @@ -5353,12 +4911,6 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - esbuild-wasm@0.27.3: resolution: {integrity: sha512-AUXuOxZ145/5Az+lIqk6TdJbxKTyDGkXMJpTExmBdbnHR6n6qAFx+F4oG9ORpVYJ9dQYeQAqzv51TO4DFKsbXw==} engines: {node: '>=18'} @@ -5376,10 +4928,6 @@ packages: escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -5395,8 +4943,8 @@ packages: peerDependencies: eslint: '>=7.0.0' - eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + eslint-import-resolver-node@0.3.10: + resolution: {integrity: sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==} eslint-module-utils@2.12.1: resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==} @@ -5419,11 +4967,6 @@ packages: eslint-import-resolver-webpack: optional: true - eslint-plugin-header@3.1.1: - resolution: {integrity: sha512-9vlKxuJ4qf793CmeeSrZUvVClw6amtpghq3CuWcB5cUNnWHQhgcqy5eF8oVKFk1G3Y/CbchGfEaw3wiIJaNmVg==} - peerDependencies: - eslint: '>=7.7.0' - eslint-plugin-import@2.32.0: resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} engines: {node: '>=4'} @@ -5438,9 +4981,9 @@ 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} eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} @@ -5450,9 +4993,13 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.39.2: - resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==} - 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.1.0: + resolution: {integrity: sha512-S9jlY/ELKEUwwQnqWDO+f+m6sercqOPSqXM5Go94l7DOmxHVDgmSFGWEzeE/gwgTAr0W103BWt0QLe/7mabIvA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: jiti: '*' @@ -5464,6 +5011,10 @@ packages: resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + espree@11.2.0: + resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} @@ -5527,14 +5078,6 @@ packages: resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} engines: {node: '>=18.0.0'} - execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - - exit@0.1.2: - resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} - engines: {node: '>= 0.8.0'} - expect-type@1.3.0: resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} engines: {node: '>=12.0.0'} @@ -5545,8 +5088,8 @@ packages: express-rate-limit@5.5.1: resolution: {integrity: sha512-MTjE2eIbHv5DyfuFz4zLYWxpqVhEhkTiwFGuB74Q9CSou2WHO52nlE5y3Zlg6SIsiYUIPj6ifFxnkPz6O3sIUg==} - express-rate-limit@8.2.1: - resolution: {integrity: sha512-PCZEIEIxqwhzw4KF0n7QF4QqruVTcF73O5kFKUnGOyjbCCgizBBiFaYpd/fnBLUMPw/BWw9OsiN7GgrNYr7j6g==} + express-rate-limit@8.3.2: + resolution: {integrity: sha512-77VmFeJkO0/rvimEDuUC5H30oqUC4EyOhyGccfqoLebB0oiEYfM7nwPrsDsBL1gsTpwfzX8SFy2MT3TDyRq+bg==} engines: {node: '>= 16'} peerDependencies: express: '>= 4.11' @@ -5629,9 +5172,6 @@ packages: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} - filelist@1.0.4: - resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} - fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -5656,24 +5196,16 @@ packages: resolution: {integrity: sha512-CvFd5ivA6HcSHbD+59P7CyzINHXzwhuQK8RY7CxJZtgDSAtRlHiCaQpZQ2lMR/WRyUIEmzUvL6G2AGurMfegZA==} engines: {node: '>=20'} - find-replace@3.0.0: - resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} - engines: {node: '>=4.0.0'} - find-up-simple@1.0.1: resolution: {integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==} engines: {node: '>=18'} - find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} - find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} - firebase@12.8.0: - resolution: {integrity: sha512-S1tCIR3ENecee0tY2cfTHfMkXqkitHfbsvqpCtvsT0Zi9vDB7A4CodAjHfHCjVvu/XtGy1LHLjOasVcF10rCVw==} + firebase@12.11.0: + resolution: {integrity: sha512-W9f3Y+cgQYgF9gvCGxt0upec8zwAtiQVcHuU8MfzUIgVU/9fRQWtu48Geiv1lsigtBz9QHML++Km9xAKO5GB5Q==} flat-cache@4.0.1: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} @@ -5683,11 +5215,11 @@ packages: resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} hasBin: true - flatted@3.3.3: - resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + flatted@3.4.2: + resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} - folder-hash@4.1.1: - resolution: {integrity: sha512-1ZSlKJSbET3XpglnEXC9g+QF4QRZhqHIjpFfa4pAMfO4tu/XYPafpeHEX6zOFS2EolOIXr0lPh1eSjmdWItX2w==} + folder-hash@4.1.2: + resolution: {integrity: sha512-rjdiHw3ShVonhMZZXvD/I28boUkbJFT/RBsg5MbQQd8e61PhevIwFwmL218/AscBEsW/blH4BC4A+kFeIqHVfw==} engines: {node: '>=10.10.0'} hasBin: true @@ -5714,10 +5246,6 @@ packages: form-data-encoder@1.7.2: resolution: {integrity: sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==} - form-data@2.3.3: - resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} - engines: {node: '>= 0.12'} - form-data@4.0.5: resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} engines: {node: '>= 6'} @@ -5741,9 +5269,6 @@ packages: resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} engines: {node: '>= 0.8'} - fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - fs-extra@3.0.1: resolution: {integrity: sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg==} @@ -5773,8 +5298,8 @@ packages: functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - gaxios@7.1.3: - resolution: {integrity: sha512-YGGyuEdVIjqxkxVH1pUTMY/XtmmsApXrCVv5EU25iX6inEPbV+VakJfLealkBtJN69AQmh1eGOdCl9Sm1UP6XQ==} + gaxios@7.1.4: + resolution: {integrity: sha512-bTIgTsM2bWn3XklZISBTQX7ZSddGW+IO3bMdGaemHZ3tbqExMENHLx6kKZ/KlejgrMtj8q7wBItt51yegqalrA==} engines: {node: '>=18'} gcp-metadata@8.1.2: @@ -5793,8 +5318,8 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - get-east-asian-width@1.4.0: - resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} + get-east-asian-width@1.5.0: + resolution: {integrity: sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==} engines: {node: '>=18'} get-intrinsic@1.3.0: @@ -5821,8 +5346,8 @@ packages: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} - get-tsconfig@4.13.6: - resolution: {integrity: sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==} + get-tsconfig@4.13.7: + resolution: {integrity: sha512-7tN6rFgBlMgpBML5j8typ92BKFi2sFQvIdpAqLA2beia5avZDrMs0FLZiM5etShWq5irVyGcGMEA1jcDaK7A/Q==} get-uri@6.0.5: resolution: {integrity: sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==} @@ -5831,11 +5356,6 @@ packages: getpass@0.1.7: resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} - git-raw-commits@5.0.0: - resolution: {integrity: sha512-I2ZXrXeOc0KrCvC7swqtIFXFN+rbjnC7b2T943tvemIOVNl+XP8YnA9UVwqFhzzLClnSA60KR/qEjLpXzs73Qg==} - engines: {node: '>=18'} - hasBin: true - glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -5858,9 +5378,9 @@ packages: deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true - glob@13.0.3: - resolution: {integrity: sha512-/g3B0mC+4x724v1TgtBlBtt2hPi/EWptsIAmXUx9Z2rvBYleQcsrmaOzd5LyL50jf/Soi83ZDJmw2+XqvH/EeA==} - engines: {node: 20 || >=22} + glob@13.0.6: + resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} + engines: {node: 18 || 20 || >=22} glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} @@ -5870,24 +5390,16 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@17.3.0: - resolution: {integrity: sha512-yMqGUQVVCkD4tqjOJf3TnrvaaHDMYp4VlUSObbkIiuCPe/ofdMBFIAcBbCSRFWOnos6qRiTVStDwqPLUclaxIw==} + globals@17.4.0: + resolution: {integrity: sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw==} engines: {node: '>=18'} globalthis@1.0.4: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - - globby@5.0.0: - resolution: {integrity: sha512-HJRTIH2EeH44ka+LWig+EqT2ONSYpVlNfx6pyd592/VF1TbfljJ7elwie7oSwcViLGqOdWocSdu2txwBF9bjmQ==} - engines: {node: '>=0.10.0'} - - google-auth-library@10.5.0: - resolution: {integrity: sha512-7ABviyMOlX5hIVD60YOfHw4/CxOfBhyduaYB+wbFWCWoni4N7SLcV46hrVRktuBbZjFC9ONyqamZITN7q3n32w==} + google-auth-library@10.6.2: + resolution: {integrity: sha512-e27Z6EThmVNNvtYASwQxose/G57rkRuaRbQyxM2bvYLLX/GqWZ5chWq2EBoUchJbCc57eC9ArzO5wMsEmWftCw==} engines: {node: '>=18'} google-gax@5.0.6: @@ -5915,8 +5427,8 @@ packages: peerDependencies: graphql: ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - graphql@16.12.0: - resolution: {integrity: sha512-DKKrynuQRne0PNpEbzuEdHlYOMksHSUI8Zc9Unei5gTsMNA2/vMpoMz/yKba50pejK56qj98qM0SjYxAKi13gQ==} + graphql@16.13.2: + resolution: {integrity: sha512-5bJ+nf/UCpAjHM8i06fl7eLyVC9iuNAjm9qzkiu2ZGhM0VscSvS6WDPfAwkdkBuoXGM9FJSbKl6wylMwP9Ktig==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} grpc-gcp@1.0.1: @@ -5925,10 +5437,6 @@ packages: peerDependencies: protobufjs: '*' - gtoken@8.0.0: - resolution: {integrity: sha512-+CqsMbHPiSTdtSO14O51eMNlrp9N79gmeqmXeouJOhfucAedHw9noVe/n5uJk3tbKE6a+6ZCQg3RPhVhHByAIw==} - engines: {node: '>=18'} - gunzip-maybe@1.4.2: resolution: {integrity: sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==} hasBin: true @@ -5941,19 +5449,6 @@ packages: engines: {node: '>=0.4.7'} hasBin: true - har-schema@2.0.0: - resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} - engines: {node: '>=4'} - - har-validator@5.1.5: - resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} - engines: {node: '>=6'} - deprecated: this library is no longer supported - - has-ansi@2.0.0: - resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} - engines: {node: '>=0.10.0'} - has-bigints@1.1.0: resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} engines: {node: '>= 0.4'} @@ -5981,8 +5476,8 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} - hono@4.11.9: - resolution: {integrity: sha512-Eaw2YTGM6WOxA6CXbckaEvslr2Ne4NFsKrvc0v97JD5awbmeBLO5w9Ho9L9kmKonrwF9RJlW6BxT1PVv/agBHQ==} + hono@4.12.12: + resolution: {integrity: sha512-p1JfQMKaceuCbpJKAPKVqyqviZdS0eUxH9v82oWo1kb9xjQ5wA6iP3FNVAPDFlz5/p7d45lO+BpSk1tuSZMF4Q==} engines: {node: '>=16.9.0'} hosted-git-info@9.0.2: @@ -6005,20 +5500,12 @@ packages: htmlparser2@10.1.0: resolution: {integrity: sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==} - http-assert@1.5.0: - resolution: {integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==} - engines: {node: '>= 0.8'} - http-cache-semantics@4.2.0: resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} http-deceiver@1.2.7: resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} - http-errors@1.6.3: - resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} - engines: {node: '>= 0.6'} - http-errors@1.8.1: resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} engines: {node: '>= 0.6'} @@ -6034,10 +5521,6 @@ packages: http-parser-js@0.5.10: resolution: {integrity: sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==} - http-proxy-agent@5.0.0: - resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} - engines: {node: '>= 6'} - http-proxy-agent@7.0.2: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} @@ -6059,10 +5542,6 @@ packages: resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} engines: {node: '>=8.0.0'} - http-signature@1.2.0: - resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} - engines: {node: '>=0.8', npm: '>=1.3.7'} - http-signature@1.4.0: resolution: {integrity: sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg==} engines: {node: '>=0.10'} @@ -6074,10 +5553,6 @@ packages: resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} engines: {node: '>=10.19.0'} - https-proxy-agent@2.2.4: - resolution: {integrity: sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==} - engines: {node: '>= 4.5.0'} - https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} @@ -6086,9 +5561,9 @@ packages: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} - human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} + https-proxy-agent@9.0.0: + resolution: {integrity: sha512-/MVmHp58WkOypgFhCLk4fzpPcFQvTJ/e6LBI7irpIO2HfxUbpmYoHF+KzipzJpxxzJu7aJNWQ0xojJ/dzV2G5g==} + engines: {node: '>= 20'} husky@9.1.7: resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} @@ -6140,15 +5615,12 @@ packages: engines: {node: '>=0.10.0'} hasBin: true - immediate@3.0.6: - resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} - - immutable@3.8.2: - resolution: {integrity: sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==} + immutable@3.8.3: + resolution: {integrity: sha512-AUY/VyX0E5XlibOmWt10uabJzam1zlYjwiEgQSDc5+UIkFNaF9WM0JxXKaNMGf+F/ffUF+7kRKXM9A7C0xXqMg==} engines: {node: '>=0.10.0'} - immutable@5.1.4: - resolution: {integrity: sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==} + immutable@5.1.5: + resolution: {integrity: sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==} import-fresh@3.3.1: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} @@ -6158,23 +5630,13 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} - inflation@2.1.0: - resolution: {integrity: sha512-t54PPJHG1Pp7VQvxyVCJ9mBbjG3Hqryges9bXoOO6GExCPa+//i/d5GSuFtpx3ALLd7lgIAur6zrIlBQyJuMlQ==} - engines: {node: '>= 0.8.0'} - inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - inherits@2.0.3: - resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} - inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - ini@6.0.0: resolution: {integrity: sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==} engines: {node: ^20.17.0 || >=22.9.0} @@ -6182,26 +5644,14 @@ packages: injection-js@2.6.1: resolution: {integrity: sha512-dbR5bdhi7TWDoCye9cByZqeg/gAfamm8Vu3G1KZOTYkOif8WkuM8CD0oeDPtZYMzT5YH76JAFB7bkmyY9OJi2A==} - internal-ip@6.2.0: - resolution: {integrity: sha512-D8WGsR6yDt8uq7vDMu7mjcR+yRMm3dW8yufyChmszWRjcSHuxLBkR3GdS2HZAjodsaGuCvXeEJpueisXJULghg==} - engines: {node: '>=10'} - internal-slot@1.1.0: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} - ip-address@10.0.1: - resolution: {integrity: sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==} - engines: {node: '>= 12'} - ip-address@10.1.0: resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} engines: {node: '>= 12'} - ip-regex@4.3.0: - resolution: {integrity: sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==} - engines: {node: '>=8'} - ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} @@ -6252,11 +5702,6 @@ packages: is-deflate@1.0.0: resolution: {integrity: sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==} - is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - is-docker@3.0.0: resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -6303,10 +5748,6 @@ packages: resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} engines: {node: '>=12'} - is-ip@3.1.0: - resolution: {integrity: sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q==} - engines: {node: '>=8'} - is-map@2.0.3: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} @@ -6318,8 +5759,8 @@ packages: resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} engines: {node: '>= 0.4'} - is-network-error@1.3.0: - resolution: {integrity: sha512-6oIwpsgRfnDiyEDLMay/GqCl3HoAtH5+RUKW29gYkL0QA+ipzpDLA16yQs7/RHCSu+BwgbJaOUqa4A99qNVQVw==} + is-network-error@1.3.1: + resolution: {integrity: sha512-6QCxa49rQbmUWLfk0nuGqzql9U8uaV2H6279bRErPBHe/109hCzsLUBUHfbEtvLIHBd6hyXbgedBSHevm43Edw==} engines: {node: '>=16'} is-node-process@1.2.0: @@ -6336,18 +5777,6 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - is-path-cwd@1.0.0: - resolution: {integrity: sha512-cnS56eR9SPAscL77ik76ATVqoPARTqPIVkMDVxRaWH06zT+6+CzIroYRJ0VVvm0Z1zfAvxvz9i/D3Ppjaqt5Nw==} - engines: {node: '>=0.10.0'} - - is-path-in-cwd@1.0.1: - resolution: {integrity: sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==} - engines: {node: '>=0.10.0'} - - is-path-inside@1.0.1: - resolution: {integrity: sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g==} - engines: {node: '>=0.10.0'} - is-plain-obj@3.0.0: resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} engines: {node: '>=10'} @@ -6387,10 +5816,6 @@ packages: is-stream-ended@0.1.4: resolution: {integrity: sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw==} - is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - is-string@1.1.1: resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} engines: {node: '>= 0.4'} @@ -6425,17 +5850,14 @@ packages: resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} engines: {node: '>= 0.4'} - is-what@3.14.1: - resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} + is-what@4.1.16: + resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} + engines: {node: '>=12.13'} is-wsl@1.1.0: resolution: {integrity: sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==} engines: {node: '>=4'} - is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} - is-wsl@3.1.1: resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} engines: {node: '>=16'} @@ -6454,17 +5876,9 @@ packages: resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} engines: {node: '>= 8.0.0'} - isbinaryfile@5.0.7: - resolution: {integrity: sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ==} - engines: {node: '>= 18.0.0'} - isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - isexe@3.1.5: - resolution: {integrity: sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==} - engines: {node: '>=18'} - isexe@4.0.0: resolution: {integrity: sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==} engines: {node: '>=20'} @@ -6503,26 +5917,11 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - jackspeak@4.2.3: - resolution: {integrity: sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==} - engines: {node: 20 || >=22} - - jake@10.9.4: - resolution: {integrity: sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==} - engines: {node: '>=10'} - hasBin: true - - jasmine-core@2.8.0: - resolution: {integrity: sha512-SNkOkS+/jMZvLhuSx1fjhcNWUC/KG6oVyFUGkSBEr9n1axSNduWU8GlI7suaHXr4yxjet6KjrUZxUTE5WzzWwQ==} - jasmine-core@4.6.1: resolution: {integrity: sha512-VYz/BjjmC3klLJlLwA4Kw8ytk0zDSmbbDLNs794VnWmkcCB7I9aAL/D48VNQtmITyPvea2C3jdUMfc3kAoy0PQ==} - jasmine-core@5.13.0: - resolution: {integrity: sha512-vsYjfh7lyqvZX5QgqKc4YH8phs7g96Z8bsdIFNEU3VqXhlHaq+vov/Fgn/sr6MiUczdZkyXRC3TX369Ll4Nzbw==} - - jasmine-core@6.0.0: - resolution: {integrity: sha512-fmBb8aruz2mEIDBUGWOGNmxhXwFJs44SSzwbMcBDqQnNChavPTq3Ra9A6WAn6WdxvxWEdakKTcEb3NzeR3yD1A==} + jasmine-core@6.1.0: + resolution: {integrity: sha512-p/tjBw58O6vxKIWMlrU+yys8lqR3+l3UrqwNTT7wpj+dQ7N4etQekFM8joI+cWzPDYqZf54kN+hLC1+s5TvZvg==} jasmine-reporters@2.5.2: resolution: {integrity: sha512-qdewRUuFOSiWhiyWZX8Yx3YNQ9JG51ntBEO4ekLQRpktxFTwUHy24a86zD/Oi2BRTKksEdfWQZcQFqzjqIkPig==} @@ -6530,22 +5929,10 @@ packages: jasmine-spec-reporter@7.0.0: resolution: {integrity: sha512-OtC7JRasiTcjsaCBPtMO0Tl8glCejM4J4/dNuOJdA8lBjz4PmWjYQ6pzb0uzpBNAWJMDudYuj9OdXJWqM2QTJg==} - jasmine@2.8.0: - resolution: {integrity: sha512-KbdGQTf5jbZgltoHs31XGiChAPumMSY64OZMWLNYnEnMfG5uwGBhffePwuskexjT+/Jea/gU3qAU8344hNohSw==} - hasBin: true - - jasmine@5.13.0: - resolution: {integrity: sha512-oLCXIhEb5e0zzjn9GyuvcuisvLBwUjmgz7a0RNGWKwQtJCDld4m+vwKUpAIJVLB5vbmQFdtKhT86/tIZlJ5gYw==} - hasBin: true - - jasmine@6.0.0: - resolution: {integrity: sha512-eSPL6LPWT39WwvHSEEbRXuSvioXMTheNhIPaeUT1OPmSprDZwj4S29884DkTx6/tyiOWTWB1N+LdW2ZSg74aEA==} + jasmine@6.1.0: + resolution: {integrity: sha512-WPphPqEMY0uBRMjuhRHoVoxQNvJuxIMqz0yIcJ3k3oYxBedeGoH60/NXNgasxnx2FvfXrq5/r+2wssJ7WE8ABw==} hasBin: true - jasminewd2@2.2.0: - resolution: {integrity: sha512-Rn0nZe4rfDhzA63Al3ZGh0E+JTmM6ESZYXJGKuqKGZObsAB9fwXPD03GjtIEvJBDOhN94T5MzbwZSqzFHSQPzg==} - engines: {node: '>= 6.9.x'} - jest-worker@27.5.1: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} @@ -6554,8 +5941,8 @@ packages: resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true - jose@6.1.3: - resolution: {integrity: sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==} + jose@6.2.2: + resolution: {integrity: sha512-d7kPDd34KO/YnzaDOlikGpOurfF0ByC2sEV4cANCtdqLlTfBlw2p14O/5d/zv40gJPbIQxfES3nSx1/oYNyuZQ==} js-base64@3.7.8: resolution: {integrity: sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==} @@ -6573,9 +5960,9 @@ packages: jsbn@0.1.1: resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} - jsdom@28.1.0: - resolution: {integrity: sha512-0+MoQNYyr2rBHqO1xilltfDjV9G7ymYGlAUazgcDLQaUf8JDHbuGwsxN6U9qWaElZ4w1B2r7yEGIL3GdeW3Rug==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + jsdom@29.0.1: + resolution: {integrity: sha512-z6JOK5gRO7aMybVq/y/MlIpKh8JIi68FBKMUtKkK2KH/wMSRlCxQ682d08LB9fYXplyY/UXG8P4XXTScmdjApg==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24.0.0} peerDependencies: canvas: ^3.0.0 peerDependenciesMeta: @@ -6618,6 +6005,9 @@ packages: json-stringify-safe@5.0.1: resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + json-with-bigint@3.5.8: + resolution: {integrity: sha512-eq/4KP6K34kwa7TcFdtvnftvHCD9KvHOGGICWwMFc4dOOKF5t4iYqnfLK8otCRCRv06FXOzGGyqE8h8ElMvvdw==} + json5@1.0.2: resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true @@ -6644,17 +6034,10 @@ packages: resolution: {integrity: sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==} engines: {node: '>=12', npm: '>=6'} - jsprim@1.4.2: - resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} - engines: {node: '>=0.6.0'} - jsprim@2.0.2: resolution: {integrity: sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==} engines: {'0': node >=0.6.0} - jszip@3.10.1: - resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} - jwa@2.0.1: resolution: {integrity: sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==} @@ -6689,10 +6072,6 @@ packages: engines: {node: '>= 10'} hasBin: true - keygrip@1.1.0: - resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==} - engines: {node: '>= 0.6'} - keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} @@ -6700,33 +6079,11 @@ packages: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} - koa-compose@4.1.0: - resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} - - koa-convert@2.0.0: - resolution: {integrity: sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==} - engines: {node: '>= 10'} - - koa-etag@4.0.0: - resolution: {integrity: sha512-1cSdezCkBWlyuB9l6c/IFoe1ANCDdPBxkDkRiaIup40xpUub6U/wwRXoKBZw/O5BifX9OlqAjYnDyzM6+l+TAg==} - - koa-send@5.0.1: - resolution: {integrity: sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==} - engines: {node: '>= 8'} - - koa-static@5.0.0: - resolution: {integrity: sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==} - engines: {node: '>= 7.6.0'} - - koa@2.16.3: - resolution: {integrity: sha512-zPPuIt+ku1iCpFBRwseMcPYQ1cJL8l60rSmKeOuGfOXyE6YnTBmf2aEFNL2HQGrD0cPcLO/t+v9RTgC+fwEh/g==} - engines: {node: ^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4} - - launch-editor@2.12.0: - resolution: {integrity: sha512-giOHXoOtifjdHqUamwKq6c49GzBdLjvxrd2D+Q4V6uOHopJv7p9VJxikDsQ/CBXZbEITgUqSVHXLTG3VhPP1Dg==} + launch-editor@2.13.2: + resolution: {integrity: sha512-4VVDnbOpLXy/s8rdRCSXb+zfMeFR0WlJWpET1iA9CQdlZDfwyLjUuGQzXU4VeOoey6AicSAluWan7Etga6Kcmg==} - less-loader@12.3.1: - resolution: {integrity: sha512-JZZmG7gMzoDP3VGeEG8Sh6FW5wygB5jYL7Wp29FFihuRTsIBacqO3LbRPr2yStYD11riVf13selLm/CPFRDBRQ==} + less-loader@12.3.2: + resolution: {integrity: sha512-uLV5c702ff2jBvO7qewpkLRzkh/I9QW07ur2NKkv8TVTrtX2lrKjEbEU/LLXAn7cgpCIBbkfyUm4qYXCQs5/+w==} engines: {node: '>= 18.12.0'} peerDependencies: '@rspack/core': 0.x || ^1.0.0 || ^2.0.0-0 @@ -6738,9 +6095,9 @@ packages: webpack: optional: true - less@4.4.2: - resolution: {integrity: sha512-j1n1IuTX1VQjIy3tT7cyGbX7nvQOsFLoIqobZv4ttI5axP923gA44zUj6miiA6R5Aoms4sEGVIIcucXUbRI14g==} - engines: {node: '>=14'} + less@4.6.4: + resolution: {integrity: sha512-OJmO5+HxZLLw0RLzkqaNHzcgEAQG7C0y3aMbwtCzIUFZsLMNNq/1IdAdHEycQ58CwUO3jPTHmoN+tE5I7FQxNg==} + engines: {node: '>=18'} hasBin: true levn@0.4.1: @@ -6755,24 +6112,18 @@ packages: webpack: optional: true - lie@3.3.0: - resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} - - lighthouse-logger@1.4.2: - resolution: {integrity: sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==} - limiter@1.1.5: resolution: {integrity: sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==} lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - listr2@9.0.5: - resolution: {integrity: sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==} - engines: {node: '>=20.0.0'} + listr2@10.2.1: + resolution: {integrity: sha512-7I5knELsJKTUjXG+A6BkKAiGkW1i25fNa/xlUl9hFtk15WbE9jndA89xu5FzQKrY5llajE1hfZZFMILXkDHk/Q==} + engines: {node: '>=22.13.0'} - lmdb@3.5.1: - resolution: {integrity: sha512-NYHA0MRPjvNX+vSw8Xxg6FLKxzAG+e7Pt8RqAQA/EehzHVXq9SxDqJIN3JL1hK0dweb884y8kIh6rkWvPyg9Wg==} + lmdb@3.5.2: + resolution: {integrity: sha512-od5AWh1MNylIOeX7MB7TV627MM9tzyOUn8U8FZOeWKpWFnMU5FS9pu5t41pS4+pi7OxHRyk5QVRhuUimHjfkmg==} hasBin: true loader-runner@4.3.1: @@ -6787,10 +6138,6 @@ packages: resolution: {integrity: sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==} engines: {node: '>= 12.13.0'} - locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} - locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -6825,9 +6172,6 @@ packages: lodash.isstring@4.0.1: resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} - lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - lodash.once@4.1.1: resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} @@ -6840,14 +6184,13 @@ packages: lodash@4.17.23: resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} + lodash@4.18.1: + resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} + log-symbols@7.0.1: resolution: {integrity: sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==} engines: {node: '>=18'} - log-update@4.0.0: - resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} - engines: {node: '>=10'} - log-update@6.1.0: resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} engines: {node: '>=18'} @@ -6870,8 +6213,8 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.2.6: - resolution: {integrity: sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==} + lru-cache@11.3.2: + resolution: {integrity: sha512-wgWa6FWQ3QRRJbIjbsldRJZxdxYngT/dO0I5Ynmlnin8qy7tC6xYzbcJjtN4wHLXtkbVwHzk0C+OejVw1XM+DQ==} engines: {node: 20 || >=22} lru-cache@5.1.1: @@ -6881,10 +6224,6 @@ packages: resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} engines: {node: '>=12'} - lru-cache@8.0.5: - resolution: {integrity: sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==} - engines: {node: '>=16.14'} - magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} @@ -6899,22 +6238,16 @@ packages: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - make-fetch-happen@15.0.3: - resolution: {integrity: sha512-iyyEpDty1mwW3dGlYXAJqC/azFn5PPvgKVwXayOGBSmKLxhKZ9fg4qIan2ePpp1vJIwfFiO34LAPZgq9SZW9Aw==} + make-fetch-happen@15.0.5: + resolution: {integrity: sha512-uCbIa8jWWmQZt4dSnEStkVC6gdakiinAm4PiGsywIkguF0eWMdcjDz0ECYhUolFU3pFLOev9VNPCEygydXnddg==} engines: {node: ^20.17.0 || >=22.9.0} - marky@1.3.0: - resolution: {integrity: sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==} - math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} - mdn-data@2.12.2: - resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} + mdn-data@2.27.1: + resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} media-typer@0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} @@ -6924,8 +6257,8 @@ packages: resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} engines: {node: '>= 0.8'} - memfs@4.56.10: - resolution: {integrity: sha512-eLvzyrwqLHnLYalJP7YZ3wBe79MXktMdfQbvMrVD80K+NhrIukCVBvgP30zTJYEEDh9hZ/ep9z0KOdD7FSHo7w==} + memfs@4.57.1: + resolution: {integrity: sha512-WvzrWPwMQT+PtbX2Et64R4qXKK0fj/8pO85MrUCzymX3twwCiJCdvntW3HdhG1teLJcHDDLIKx5+c3HckWYZtQ==} peerDependencies: tslib: '2' @@ -6986,10 +6319,6 @@ packages: engines: {node: '>=10.0.0'} hasBin: true - mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - mimic-function@5.0.1: resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} engines: {node: '>=18'} @@ -7002,8 +6331,8 @@ packages: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} - mini-css-extract-plugin@2.10.0: - resolution: {integrity: sha512-540P2c5dYnJlyJxTaSloliZexv8rji6rY8FhQN+WF/82iHQfA23j/xtJx97L+mXOML27EqksSek/g4eK7jaL3g==} + mini-css-extract-plugin@2.10.2: + resolution: {integrity: sha512-AOSS0IdEB95ayVkxn5oGzNQwqAi2J0Jb/kKm43t7H73s8+f5873g0yuj0PNvK4dO75mu5DHg4nlgp4k6Kga8eg==} engines: {node: '>= 12.13.0'} peerDependencies: webpack: ^5.0.0 @@ -7011,27 +6340,23 @@ packages: minimalistic-assert@1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - minimatch@10.1.1: - resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} - engines: {node: 20 || >=22} - - minimatch@10.2.0: - resolution: {integrity: sha512-ugkC31VaVg9cF0DFVoADH12k6061zNZkZON+aX8AWsR9GhPcErkcMBceb6znR8wLERM2AkkOxy2nWRLpT9Jq5w==} - engines: {node: 20 || >=22} + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + engines: {node: 18 || 20 || >=22} - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} + minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} minimatch@7.4.6: resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} engines: {node: '>=10'} - minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + minimatch@7.4.9: + resolution: {integrity: sha512-Brg/fp/iAVDOQoHxkuN5bEYhyQlZhxddI78yWsCbeEwTHXQjlNLtiJDUsp1GIptVqMI7/gkJMz4vVAc01mpoBw==} + engines: {node: '>=10'} + + minimatch@9.0.9: + resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} engines: {node: '>=16 || 14 >=14.17'} minimist@1.2.8: @@ -7041,12 +6366,12 @@ packages: resolution: {integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==} engines: {node: '>=16 || 14 >=14.17'} - minipass-fetch@5.0.1: - resolution: {integrity: sha512-yHK8pb0iCGat0lDrs/D6RZmCdaBT64tULXjdxjSMAqoDi18Q3qKEUTHypHQZQd9+FYpIS+lkvpq6C/R6SbUeRw==} + minipass-fetch@5.0.2: + resolution: {integrity: sha512-2d0q2a8eCi2IRg/IGubCNRJoYbA1+YPXAzQVRFmB45gdGZafyivnZ5YSEfo3JikbjGxOdntGFvBQGqaSMXlAFQ==} engines: {node: ^20.17.0 || >=22.9.0} - minipass-flush@1.0.5: - resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} + minipass-flush@1.0.7: + resolution: {integrity: sha512-TbqTz9cUwWyHS2Dy89P3ocAGUGxKjjLuR9z8w4WUTGAVgEj17/4nhgo2Du56i0Fm3Pm30g4iA8Lcqctc76jCzA==} engines: {node: '>= 8'} minipass-pipeline@1.2.4: @@ -7061,8 +6386,8 @@ packages: resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} engines: {node: '>=8'} - minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} engines: {node: '>=16 || 14 >=14.17'} minizlib@3.1.0: @@ -7075,9 +6400,6 @@ packages: mitt@3.0.1: resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} - mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - mkdirp@0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true @@ -7104,28 +6426,21 @@ packages: resolution: {integrity: sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==} hasBin: true - msgpackr@1.11.8: - resolution: {integrity: sha512-bC4UGzHhVvgDNS7kn9tV8fAucIYUBuGojcaLiz7v+P63Lmtm0Xeji8B/8tYKddALXxJLpwIeBmUN3u64C4YkRA==} + msgpackr@1.11.9: + resolution: {integrity: sha512-FkoAAyyA6HM8wL882EcEyFZ9s7hVADSwG9xrVx3dxxNQAtgADTrJoEWivID82Iv1zWDsv/OtbrrcZAzGzOMdNw==} multicast-dns@7.2.5: resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} hasBin: true - multimatch@7.0.0: - resolution: {integrity: sha512-SYU3HBAdF4psHEL/+jXDKHO95/m5P2RvboHT2Y0WtTttvJLP4H/2WS9WlQPFvF6C8d6SpLw8vjCnQOnVIVOSJQ==} - engines: {node: '>=18'} - - mute-stream@2.0.0: - resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} - engines: {node: ^18.17.0 || >=20.5.0} + multimatch@8.0.0: + resolution: {integrity: sha512-0D10M2/MnEyvoog7tmozlpSqL3HEU1evxUFa3v1dsKYmBDFSP1dLSX4CH2rNjpQ+4Fps8GKmUkCwiKryaKqd9A==} + engines: {node: '>=20'} mute-stream@3.0.0: resolution: {integrity: sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==} engines: {node: ^20.17.0 || >=22.9.0} - nanocolors@0.2.13: - resolution: {integrity: sha512-0n3mSAQLPpGLV9ORXT5+C/D4mwew7Ebws69Hx4E2sgz2ZA5+32Q80B9tL8PbL7XHnRDiAxH/pnrUJ9a4fkTNTA==} - nanoid@3.3.11: resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -7134,8 +6449,8 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - needle@3.3.1: - resolution: {integrity: sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==} + needle@3.5.0: + resolution: {integrity: sha512-jaQyPKKk2YokHrEg+vFDYxXIHTCBgiZwSHOoVx/8V3GIBS8/VN6NdVRmg8q1ERtPkMvmOvebsgga4sAj5hls/w==} engines: {node: '>= 4.4.x'} hasBin: true @@ -7154,25 +6469,25 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - netmask@2.0.2: - resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} + netmask@2.1.0: + resolution: {integrity: sha512-z9sZrk6wyf8/NDKKqe+Tyl58XtgkYrV4kgt1O8xrzYvpl1LvPacPo0imMLHfpStk3kgCIq1ksJ2bmJn9hue2lQ==} engines: {node: '>= 0.4.0'} - ng-packagr@21.2.0-next.0: - resolution: {integrity: sha512-BkRAqx1ZljIYpBbjDi/+3y8AMo9S19vm8zx3YWpqMAaIpDb7cvsT+Une9b4oyEK/7p+XvWw+LaPVleTAQtQEMQ==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + ng-packagr@22.0.0-next.1: + resolution: {integrity: sha512-eCmMoX4U1WIv2RWCaYQBD+jEk7rmvAJWMxdLQiA/lt6hd6FwuNKZuzmaI8dT6eMXX7e4vrDrg1zhlPth6qwrBA==} + engines: {node: ^22.22.0 || >=24.13.1} hasBin: true peerDependencies: - '@angular/compiler-cli': ^21.0.0 || ^21.1.0-next || ^21.2.0-next + '@angular/compiler-cli': ^22.0.0-next tailwindcss: ^2.0.0 || ^3.0.0 || ^4.0.0 tslib: ^2.3.0 - typescript: '>=5.9 <6.0' + typescript: '>=5.9 <6.1' peerDependenciesMeta: tailwindcss: optional: true - nock@14.0.10: - resolution: {integrity: sha512-Q7HjkpyPeLa0ZVZC5qpxBt5EyLczFJ91MEewQiIi9taWuA0KB/MDJlUWtON+7dGouVdADTQsf9RA7TZk6D8VMw==} + nock@14.0.11: + resolution: {integrity: sha512-u5xUnYE+UOOBA6SpELJheMCtj2Laqx15Vl70QxKo43Wz/6nMHXS7PrEioXLjXAwhmawdEMNImwKCcPhBJWbKVw==} engines: {node: '>=18.20.0 <20 || >=20.12.1'} node-addon-api@6.1.0: @@ -7186,6 +6501,10 @@ packages: engines: {node: '>=10.5.0'} deprecated: Use your platform's native DOMException instead + node-exports-info@1.6.0: + resolution: {integrity: sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==} + engines: {node: '>= 0.4'} + node-fetch-native@1.6.7: resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} @@ -7224,8 +6543,8 @@ packages: engines: {node: ^20.17.0 || >=22.9.0} hasBin: true - node-releases@2.0.27: - resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + node-releases@2.0.37: + resolution: {integrity: sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==} nopt@9.0.0: resolution: {integrity: sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==} @@ -7256,8 +6575,8 @@ packages: resolution: {integrity: sha512-IciCE3SY3uE84Ld8WZU23gAPPV9rIYod4F+rc+vJ7h7cwAJt9Vk6TVsK60ry7Uj3SRS3bqRRIGuTp9YVlk6WNA==} engines: {node: ^20.17.0 || >=22.9.0} - npm-packlist@10.0.3: - resolution: {integrity: sha512-zPukTwJMOu5X5uvm0fztwS5Zxyvmk38H/LfidkOMt3gbZVCyro2cD/ETzwzVPcWZA3JOyPznfUN/nkyFiyUbxg==} + npm-packlist@10.0.4: + resolution: {integrity: sha512-uMW73iajD8hiH4ZBxEV3HC+eTnppIqwakjOYuvgddnalIw2lJguKviK1pcUJDlIWm1wSJkchpDZDSVVsZEYRng==} engines: {node: ^20.17.0 || >=22.9.0} npm-pick-manifest@11.0.3: @@ -7268,16 +6587,9 @@ packages: resolution: {integrity: sha512-TakBap6OM1w0H73VZVDf44iFXsOS3h+L4wVMXmbWOQroZgFhMch0juN6XSzBNlD965yIKvWg2dfu7NSiaYLxtw==} engines: {node: ^20.17.0 || >=22.9.0} - npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - oauth-sign@0.9.0: - resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} - object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -7298,6 +6610,10 @@ packages: resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} engines: {node: '>= 0.4'} + object.entries@1.1.9: + resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} + engines: {node: '>= 0.4'} + object.fromentries@2.0.8: resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} engines: {node: '>= 0.4'} @@ -7335,17 +6651,10 @@ packages: once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - onetime@7.0.0: resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} engines: {node: '>=18'} - only@0.0.2: - resolution: {integrity: sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==} - open@10.2.0: resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} engines: {node: '>=18'} @@ -7354,10 +6663,6 @@ packages: resolution: {integrity: sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==} engines: {node: '>=20'} - open@8.4.2: - resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} - engines: {node: '>=12'} - opn@5.3.0: resolution: {integrity: sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==} engines: {node: '>=4'} @@ -7373,10 +6678,6 @@ 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'} - outvariant@1.4.3: resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==} @@ -7388,26 +6689,14 @@ packages: resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} engines: {node: '>=8'} - p-event@4.2.0: - resolution: {integrity: sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==} - engines: {node: '>=8'} - p-finally@1.0.0: resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} engines: {node: '>=4'} - p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} - p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} - p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} - p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} @@ -7420,6 +6709,10 @@ packages: resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} engines: {node: '>=8'} + p-retry@4.6.2: + resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} + engines: {node: '>=8'} + p-retry@6.2.1: resolution: {integrity: sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==} engines: {node: '>=16.17'} @@ -7428,10 +6721,6 @@ packages: resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} engines: {node: '>=8'} - p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - pac-proxy-agent@7.2.0: resolution: {integrity: sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==} engines: {node: '>= 14'} @@ -7443,8 +6732,8 @@ packages: package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - pacote@21.3.1: - resolution: {integrity: sha512-O0EDXi85LF4AzdjG74GUwEArhdvawi/YOHcsW6IijKNj7wm8IvEWNF5GnfuxNpQ/ZpO3L37+v8hqdVh8GgWYhg==} + pacote@21.5.0: + resolution: {integrity: sha512-VtZ0SB8mb5Tzw3dXDfVAIjhyVKUHZkS/ZH9/5mpKenwC9sFOXNI0JI7kEF7IMkwOnsWMFrvAZHzx1T5fmrp9FQ==} engines: {node: ^20.17.0 || >=22.9.0} hasBin: true @@ -7472,9 +6761,6 @@ packages: parse5-sax-parser@8.0.0: resolution: {integrity: sha512-/dQ8UzHZwnrzs3EvDj6IkKrD/jIZyTlB+8XrHJvcjNgRdmWruNdN9i9RK/JtxakmlUdPwKubKPTCqvbTgzGhrw==} - parse5@6.0.1: - resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} - parse5@8.0.0: resolution: {integrity: sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==} @@ -7490,9 +6776,6 @@ packages: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} - path-is-inside@1.0.2: - resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==} - path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -7504,19 +6787,15 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} - path-scurry@2.0.1: - resolution: {integrity: sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==} - engines: {node: 20 || >=22} - - path-to-regexp@0.1.12: - resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} + path-scurry@2.0.2: + resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} + engines: {node: 18 || 20 || >=22} - path-to-regexp@8.3.0: - resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} + path-to-regexp@0.1.13: + resolution: {integrity: sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==} - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} + path-to-regexp@8.4.2: + resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} @@ -7536,18 +6815,14 @@ packages: picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} engines: {node: '>=8.6'} - picomatch@4.0.3: - resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} - pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} - pify@3.0.0: resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} engines: {node: '>=4'} @@ -7556,14 +6831,6 @@ packages: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} - pinkie-promise@2.0.1: - resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} - engines: {node: '>=0.10.0'} - - pinkie@2.0.4: - resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} - engines: {node: '>=0.10.0'} - pino-abstract-transport@1.2.0: resolution: {integrity: sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==} @@ -7589,18 +6856,14 @@ packages: resolution: {integrity: sha512-4peoBq4Wks0riS0z8741NVv+/8IiTvqnZAr8QGgtdifrtpdXbNw/FxRS1l6NFqm4EMzuS0EDqNNx4XGaz8cuyQ==} engines: {node: '>=18'} - pkijs@3.3.3: - resolution: {integrity: sha512-+KD8hJtqQMYoTuL1bbGOqxb4z+nZkTAwVdNtWwe8Tc2xNbEmdJYIYoc6Qt0uF55e6YW6KuTHw1DjQ18gMhzepw==} + pkijs@3.4.0: + resolution: {integrity: sha512-emEcLuomt2j03vxD54giVB4SxTjnsqkU692xZOZXHDVoYyypEm+b3jpiTcc+Cf+myooc+/Ly0z01jqeNHVgJGw==} engines: {node: '>=16.0.0'} pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} - portfinder@1.0.38: - resolution: {integrity: sha512-rEwq/ZHlJIKw++XtLAO8PPuOQA/zaPJOZJ37BVuN97nLpMJeuDVLVGRwbFoBgLudgdTMP2hdRJP++H+8QOA3vg==} - engines: {node: '>= 10.12'} - portscanner@2.2.0: resolution: {integrity: sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw==} engines: {node: '>=0.4', npm: '>=1.0.0'} @@ -7609,11 +6872,11 @@ packages: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} - postcss-loader@8.2.0: - resolution: {integrity: sha512-tHX+RkpsXVcc7st4dSdDGliI+r4aAQDuv+v3vFYHixb6YgjreG5AG4SEB0kDK8u2s6htqEEpKlkhSBUTvWKYnA==} + postcss-loader@8.2.1: + resolution: {integrity: sha512-k98jtRzthjj3f76MYTs9JTpRqV1RaaMhEU0Lpw9OTmQZQdppg4B30VZ74BojuBHt3F4KyubHJoXCMUeM8Bqeow==} engines: {node: '>= 18.12.0'} peerDependencies: - '@rspack/core': 0.x || 1.x + '@rspack/core': 0.x || ^1.0.0 || ^2.0.0-0 postcss: ^7.0.0 || ^8.0.1 webpack: ^5.0.0 peerDependenciesMeta: @@ -7662,8 +6925,8 @@ packages: postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.5.6: - resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + postcss@8.5.8: + resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==} engines: {node: ^10 || ^12 || >=14} powershell-utils@0.1.0: @@ -7700,10 +6963,6 @@ packages: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} - promise-retry@2.0.1: - resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} - engines: {node: '>=10'} - propagate@2.0.1: resolution: {integrity: sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==} engines: {node: '>= 8'} @@ -7716,12 +6975,6 @@ packages: resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==} engines: {node: '>=12.0.0'} - protractor@7.0.0: - resolution: {integrity: sha512-UqkFjivi4GcvUQYzqGYNe0mLzfn5jiLmO8w9nMhQoJRLhy2grJonpga2IWhI6yJO30LibWXJJtA4MOIZD2GgZw==} - engines: {node: '>=10.13.x'} - deprecated: We have news to share - Protractor is deprecated and will reach end-of-life by Summer 2023. To learn more and find out about other options please refer to this post on the Angular blog. Thank you for using and contributing to Protractor. https://goo.gle/state-of-e2e-in-angular - hasBin: true - proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} @@ -7736,14 +6989,11 @@ packages: prr@1.0.1: resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} - psl@1.15.0: - resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} - pump@2.0.1: resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} - pump@3.0.3: - resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} + pump@3.0.4: + resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} pumpify@1.5.1: resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} @@ -7755,18 +7005,14 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - puppeteer-core@18.2.1: - resolution: {integrity: sha512-MRtTAZfQTluz3U2oU/X2VqVWPcR1+94nbA2V6ZrSZRVEwLqZ8eclZ551qGFQD/vD2PYqHJwWOW/fpC721uznVw==} - engines: {node: '>=14.1.0'} - - puppeteer-core@24.37.3: - resolution: {integrity: sha512-fokQ8gv+hNgsRWqVuP5rUjGp+wzV5aMTP3fcm8ekNabmLGlJdFHas1OdMscAH9Gzq4Qcf7cfI/Pe6wEcAqQhqg==} + puppeteer-core@24.40.0: + resolution: {integrity: sha512-MWL3XbUCfVgGR0gRsidzT6oKJT2QydPLhMITU6HoVWiiv4gkb6gJi3pcdAa8q4HwjBTbqISOWVP4aJiiyUJvag==} engines: {node: '>=18'} - puppeteer@18.2.1: - resolution: {integrity: sha512-7+UhmYa7wxPh2oMRwA++k8UGVDxh3YdWFB52r9C3tM81T6BU7cuusUSxImz0GEYSOYUKk/YzIhkQ6+vc0gHbxQ==} - engines: {node: '>=14.1.0'} - deprecated: < 24.15.0 is no longer supported + puppeteer@24.40.0: + resolution: {integrity: sha512-IxQbDq93XHVVLWHrAkFP7F7iHvb9o0mgfsSIMlhHb+JM+JjM1V4v4MNSQfcRWJopx9dsNOr9adYv0U5fm9BJBQ==} + engines: {node: '>=18'} + hasBin: true pvtsutils@1.3.6: resolution: {integrity: sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==} @@ -7775,22 +7021,10 @@ packages: resolution: {integrity: sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==} engines: {node: '>=16.0.0'} - q@1.4.1: - resolution: {integrity: sha512-/CdEdaw49VZVmyIDGUQKDDT53c7qBkO6g5CefWz91Ae+l4+cRtcDYwMTXh6me4O8TMldeGHG3N2Bl84V78Ywbg==} - engines: {node: '>=0.6.0', teleport: '>=0.2.0'} - deprecated: |- - You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other. - - (For a CapTP with native promises, see @endo/eventual-send and @endo/captp) - qjobs@1.2.0: resolution: {integrity: sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==} engines: {node: '>=0.9'} - qs@6.14.0: - resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} - engines: {node: '>=0.6'} - qs@6.14.2: resolution: {integrity: sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==} engines: {node: '>=0.6'} @@ -7799,10 +7033,6 @@ packages: resolution: {integrity: sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==} engines: {node: '>=0.6'} - qs@6.5.5: - resolution: {integrity: sha512-mzR4sElr1bfCaPJe7m8ilJ6ZXdDaGoObcYR0ZHSsktM/Lt21MVHj5De30GQH2eiZ1qGRTO7LCAzQsUeXTNexWQ==} - engines: {node: '>=0.6'} - queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -7816,9 +7046,6 @@ packages: quicktype-core@23.2.6: resolution: {integrity: sha512-asfeSv7BKBNVb9WiYhFRBvBZHcRutPRBwJMxW0pefluK4kkKu4lv0IvZBwFKvw2XygLcL1Rl90zxWDHYgkwCmA==} - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} @@ -7890,15 +7117,10 @@ packages: regjsgen@0.8.0: resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} - regjsparser@0.13.0: - resolution: {integrity: sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==} + regjsparser@0.13.1: + resolution: {integrity: sha512-dLsljMd9sqwRkby8zhO1gSg3PnJIBFid8f4CQj/sXx+7cKx+E7u0PKhZ+U4wmhx7EfmtvnA318oVaIkAB1lRJw==} hasBin: true - request@2.88.2: - resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} - engines: {node: '>= 6'} - deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 - require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -7907,9 +7129,6 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} - require-main-filename@2.0.0: - resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} - requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} @@ -7920,10 +7139,6 @@ packages: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} - resolve-path@1.4.0: - resolution: {integrity: sha512-i1xevIst/Qa+nA9olDxLWnLk8YZbi8R/7JPbCMcgyWaFR6bKWaexgJgEB5oc2PKMjYdrHynyz0NY+if+H98t1w==} - engines: {node: '>= 0.8'} - resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} @@ -7936,6 +7151,11 @@ packages: engines: {node: '>= 0.4'} hasBin: true + resolve@2.0.0-next.6: + resolution: {integrity: sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA==} + engines: {node: '>= 0.4'} + hasBin: true + resp-modifier@6.0.2: resolution: {integrity: sha512-U1+0kWC/+4ncRFYqQWTx/3qkfE6a4B/h3XXgmXypfa0SPZ3t7cbbaFk297PjQS/yov24R18h6OZe6iZwj3NSLw==} engines: {node: '>= 0.8.0'} @@ -7943,10 +7163,6 @@ packages: responselike@2.0.1: resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} - restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} - restore-cursor@5.1.0: resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} engines: {node: '>=18'} @@ -7955,10 +7171,6 @@ packages: resolution: {integrity: sha512-JzFPAfklk1kjR1w76f0QOIhoDkNkSqW8wYKT08n9yysTmZfB+RQ2QoXoTAeOi1HD9ZipTyTAZg3c4pM/jeqgSw==} engines: {node: '>=18'} - retry@0.12.0: - resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} - engines: {node: '>= 4'} - retry@0.13.1: resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} engines: {node: '>= 4'} @@ -7970,11 +7182,6 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rimraf@2.7.1: - resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} deprecated: Rimraf versions prior to v4 are no longer supported @@ -7984,24 +7191,24 @@ packages: resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} hasBin: true - rolldown@1.0.0-rc.4: - resolution: {integrity: sha512-V2tPDUrY3WSevrvU2E41ijZlpF+5PbZu4giH+VpNraaadsJGHa4fR6IFwsocVwEXDoAdIv5qgPPxgrvKAOIPtA==} + rolldown@1.0.0-rc.12: + resolution: {integrity: sha512-yP4USLIMYrwpPHEFB5JGH1uxhcslv6/hL0OyvTuY+3qlOSJvZ7ntYnoWpehBxufkgN0cvXxppuTu5hHa/zPh+A==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - rollup-license-plugin@3.1.0: - resolution: {integrity: sha512-wt0sqnedDjYVUnalyDEajrVAiup2V3O30I5PzXDS3syN9liSRKrZ8H6EECiV3OEZRs2fLauwT9t0QZGLuVTs2Q==} + rollup-license-plugin@3.2.1: + resolution: {integrity: sha512-66iiym49fU6YDJW4DPEYbmUwm4emHXP048lJM9YkecADYGO4cKf0gQZ13U/IqRN00DXbKz0g7O3yOt8m4BNFew==} engines: {node: '>=18.0.0'} - rollup-plugin-dts@6.3.0: - resolution: {integrity: sha512-d0UrqxYd8KyZ6i3M2Nx7WOMy708qsV/7fTHMHxCMCBOAe3V/U7OMPu5GkX8hC+cmkHhzGnfeYongl1IgiooddA==} - engines: {node: '>=16'} + rollup-plugin-dts@6.4.1: + resolution: {integrity: sha512-l//F3Zf7ID5GoOfLfD8kroBjQKEKpy1qfhtAdnpibFZMffPaylrg1CoDC2vGkPeTeyxUe4bVFCln2EFuL7IGGg==} + engines: {node: '>=20'} peerDependencies: rollup: ^3.29.4 || ^4 - typescript: ^4.5 || ^5.0 + typescript: ^4.5 || ^5.0 || ^6.0 - rollup-plugin-sourcemaps2@0.5.4: - resolution: {integrity: sha512-XK6ITvEsKtUFN1GQbYKoqilwh1yKxTS9BLaFlVsm0IaYUYe3eVnhBWzKP4AHbkBO2BNOheGNlf407K7wCj6Rrw==} + rollup-plugin-sourcemaps2@0.5.6: + resolution: {integrity: sha512-oalmewAT4GLVsW6NugcDybx0ypet94vU0dUK3VofdYoWiN4ZjoX1L4dizFd0OhoJ78r/Am9sARTR9gMrX0cJ7w==} engines: {node: '>=18.0.0'} peerDependencies: '@types/node': '>=18.0.0' @@ -8010,8 +7217,8 @@ packages: '@types/node': optional: true - rollup@4.57.1: - resolution: {integrity: sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==} + rollup@4.60.0: + resolution: {integrity: sha512-yqjxruMGBQJ2gG4HtjZtAfXArHomazDHoFwFFmZZl0r7Pdo7qCIXKqKHZc8yeoMgzJJ+pO6pEEHa+V7uzWlrAQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -8078,16 +7285,13 @@ packages: webpack: optional: true - sass@1.97.3: - resolution: {integrity: sha512-fDz1zJpd5GycprAbu4Q2PV/RprsRtKC/0z82z0JLgdytmcq0+ujJbJ/09bPGDxCLkKY3Np5cRAOcWiVkLXJURg==} + sass@1.98.0: + resolution: {integrity: sha512-+4N/u9dZ4PrgzGgPlKnaaRQx64RO0JBKs9sDhQ2pLgN6JQZ25uPQZKQYaBJU48Kd5BxgXoJ4e09Dq7nMcOUW3A==} engines: {node: '>=14.0.0'} hasBin: true - saucelabs@1.5.0: - resolution: {integrity: sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ==} - - sax@1.4.4: - resolution: {integrity: sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==} + sax@1.6.0: + resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==} engines: {node: '>=11.0.0'} saxes@6.0.0: @@ -8101,10 +7305,6 @@ packages: select-hose@2.0.0: resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} - selenium-webdriver@3.6.0: - resolution: {integrity: sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==} - engines: {node: '>= 6.9.0'} - selfsigned@5.5.0: resolution: {integrity: sha512-ftnu3TW4+3eBfLRFnDEkzGxSF/10BJBkaLJuBHZX0kiPS7bRdlpZGu6YGt4KngMkdTwJE6MbjavFpqHvqVt+Ew==} engines: {node: '>=18'} @@ -8122,11 +7322,6 @@ packages: engines: {node: '>=10'} hasBin: true - semver@7.7.3: - resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} - engines: {node: '>=10'} - hasBin: true - semver@7.7.4: resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} engines: {node: '>=10'} @@ -8140,8 +7335,9 @@ packages: resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} engines: {node: '>= 18'} - serialize-javascript@6.0.2: - resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + serialize-javascript@7.0.5: + resolution: {integrity: sha512-F4LcB0UqUl1zErq+1nYEEzSHJnIwb3AF2XWB94b+afhrekOUijwooAYqFyRbjYkm2PAKBabx6oYv/xDxNi8IBw==} + engines: {node: '>=20.0.0'} serve-index@1.9.2: resolution: {integrity: sha512-KDj11HScOaLmrPxl70KYNW1PksP4Nb/CLL2yvC+Qd2kHMPEEpfc4Re2e4FOay+bC/+XQl/7zAcWON3JVo5v3KQ==} @@ -8158,9 +7354,6 @@ packages: server-destroy@1.0.1: resolution: {integrity: sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==} - set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -8173,12 +7366,6 @@ packages: resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} engines: {node: '>= 0.4'} - setimmediate@1.0.5: - resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} - - setprototypeof@1.1.0: - resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} - setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} @@ -8228,18 +7415,14 @@ packages: resolution: {integrity: sha512-/fUgUhYghuLzVT/gaJoeVehLCgZiUxPCPMcyVNY0lIf/cTCz58K/WTI7PefDarXxp9nUKpEwg1yyz3eSBMTtgA==} engines: {node: ^20.17.0 || >=22.9.0} - slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - - slice-ansi@4.0.0: - resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} - engines: {node: '>=10'} - slice-ansi@7.1.2: resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==} engines: {node: '>=18'} + slice-ansi@8.0.0: + resolution: {integrity: sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==} + engines: {node: '>=20'} + smart-buffer@4.2.0: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} @@ -8251,8 +7434,8 @@ packages: resolution: {integrity: sha512-uP0bpjWrjQmUt5DTHq9RuoCBdFJF10cdX9X+a368j/Ft0wmaVgxlrjvK3kjvgCODOMMOz9lcaRzxmso0bTWZ/g==} engines: {node: '>=10.0.0'} - socket.io-parser@4.2.5: - resolution: {integrity: sha512-bPMmpy/5WWKHea5Y/jYAP6k74A+hvmRCQaJuJB6I/ML5JZq/KfNieUVo/3Mh7SAqn7TyFdIo6wqYHInG1MU1bQ==} + socket.io-parser@4.2.6: + resolution: {integrity: sha512-asJqbVBDsBCJx0pTqw3WfesSY0iRX+2xzWEWzrpcH7L6fLzrhyF8WPI8UaeM4YCuDfpwA/cgsdugMsmtz8EJeg==} engines: {node: '>=10.0.0'} socket.io@4.8.3: @@ -8286,16 +7469,9 @@ packages: peerDependencies: webpack: ^5.72.1 - source-map-support@0.4.18: - resolution: {integrity: sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==} - source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - source-map@0.5.7: - resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} - engines: {node: '>=0.10.0'} - source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} @@ -8304,20 +7480,20 @@ 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==} + spdx-expression-validate@2.0.0: resolution: {integrity: sha512-b3wydZLM+Tc6CFvaRDBOF9d76oGIHNCLYFeHbftFXUWjnfZWganmDmvtM5sm1cRwJc/VDBMLyGGrsLFd1vOxbg==} - spdx-license-ids@3.0.22: - resolution: {integrity: sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==} + spdx-license-ids@3.0.23: + resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==} spdy-transport@3.0.0: resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} @@ -8371,8 +7547,8 @@ packages: resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} engines: {node: '>= 0.8'} - std-env@3.10.0: - resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + std-env@4.0.0: + resolution: {integrity: sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ==} stdin-discarder@0.3.1: resolution: {integrity: sha512-reExS1kSGoElkextOcPkel4NE99S0BWxjUHQeDFnR8S993JxpPX7KU4MNmO19NXhlJp+8dmdCbKQVNgLJh2teA==} @@ -8400,8 +7576,8 @@ packages: resolution: {integrity: sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==} engines: {node: '>=8.0'} - streamx@2.23.0: - resolution: {integrity: sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==} + streamx@2.25.0: + resolution: {integrity: sha512-0nQuG6jf1w+wddNEEXCF4nTg3LtufWINB5eFEN+5TNZW7KWJp6x87+JFL43vaAUPyCfH1wID+mNVyW6OHtFamg==} strict-event-emitter@0.5.1: resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} @@ -8418,8 +7594,8 @@ packages: resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} - string-width@8.1.1: - resolution: {integrity: sha512-KpqHIdDL9KwYk22wEOg/VIqYbrnLeSApsKT/bSj6Ez7pn3CftUiLAv2Lccpq1ALcpLV9UX1Ppn92npZWu2w/aw==} + string-width@8.2.0: + resolution: {integrity: sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==} engines: {node: '>=20'} string.prototype.trim@1.2.10: @@ -8440,26 +7616,18 @@ packages: string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - strip-ansi@3.0.1: - resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} - engines: {node: '>=0.10.0'} - strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} - strip-ansi@7.1.2: - resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} + strip-ansi@7.2.0: + resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} engines: {node: '>=12'} strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} - strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -8471,10 +7639,6 @@ packages: resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} engines: {node: '>=18'} - supports-color@2.0.0: - resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} - engines: {node: '>=0.8.0'} - supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -8490,37 +7654,32 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - table-layout@4.1.1: - resolution: {integrity: sha512-iK5/YhZxq5GO5z8wb0bY1317uDF3Zjpha0QFFLA8/trAoiLbQD0HUbMesEaxyzUgDxi2QlcbM8IvqOlEjgoXBA==} - engines: {node: '>=12.17'} - - tapable@2.3.0: - resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} + tapable@2.3.2: + resolution: {integrity: sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==} engines: {node: '>=6'} - tar-fs@2.1.1: - resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} - - tar-fs@3.1.1: - resolution: {integrity: sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==} - - tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} + tar-fs@3.1.2: + resolution: {integrity: sha512-QGxxTxxyleAdyM3kpFs14ymbYmNFrfY+pHj7Z8FgtbZ7w2//VAgLMac7sT6nRpIHjppXO2AwwEOg0bPFVRcmXw==} tar-stream@3.1.7: resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} - tar@7.5.9: - resolution: {integrity: sha512-BTLcK0xsDh2+PUe9F6c2TlRp4zOOBMTkoQHQIWSIzI0R7KG46uEwq4OPk2W7bZcprBMsuaeFsqwYr7pjh6CuHg==} + tar-stream@3.1.8: + resolution: {integrity: sha512-U6QpVRyCGHva435KoNWy9PRoi2IFYCgtEhq9nmrPPpbRacPs9IH4aJ3gbrFC8dPcXvdSZ4XXfXT5Fshbp2MtlQ==} + + tar@7.5.13: + resolution: {integrity: sha512-tOG/7GyXpFevhXVh8jOPJrmtRpOTsYqUIkVdVooZYJS/z8WhfQUX8RJILmeuJNinGAMSu1veBr4asSHFt5/hng==} engines: {node: '>=18'} - teeny-request@10.1.0: - resolution: {integrity: sha512-3ZnLvgWF29jikg1sAQ1g0o+lr5JX6sVgYvfUJazn7ZjJroDBUTWp44/+cFVX0bULjv4vci+rBD+oGVAkWqhUbw==} + teeny-request@10.1.2: + resolution: {integrity: sha512-Xj0ZAQ0CeuQn6UxCDPLbFRlgcSTUEyO3+wiepr2grjIjyL/lMMs1Z4OwXn8kLvn/V1OuaEP0UY7Na6UDNNsYrQ==} engines: {node: '>=18'} - terser-webpack-plugin@5.3.16: - resolution: {integrity: sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==} + teex@1.0.1: + resolution: {integrity: sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==} + + terser-webpack-plugin@5.4.0: + resolution: {integrity: sha512-Bn5vxm48flOIfkdl5CaD2+1CiUVbonWQ3KQPyP7/EuIl9Gbzq/gQFOzaMFUEgVjB1396tcK0SG8XcNJ/2kDH8g==} engines: {node: '>= 10.13.0'} peerDependencies: '@swc/core': '*' @@ -8535,16 +7694,16 @@ packages: uglify-js: optional: true - terser@5.46.0: - resolution: {integrity: sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==} + terser@5.46.1: + resolution: {integrity: sha512-vzCjQO/rgUuK9sf8VJZvjqiqiHFaZLnOiimmUuOKODxWL8mm/xua7viT7aqX7dgPY60otQjUotzFMmCB4VdmqQ==} engines: {node: '>=10'} hasBin: true - text-decoder@1.2.6: - resolution: {integrity: sha512-27FeW5GQFDfw0FpwMQhMagB7BztOOlmjcSRi97t2oplhKVTZtp0DZbSegSaXS5IIC6mxMvBG4AR1Sgc6BX3CQg==} + text-decoder@1.2.7: + resolution: {integrity: sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==} - thingies@2.5.0: - resolution: {integrity: sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw==} + thingies@2.6.0: + resolution: {integrity: sha512-rMHRjmlFLM1R96UYPvpmnc3LYtdFrT33JIB7L9hetGue1qAPfn1N2LJeEjxUSidu1Iku+haLZXDuEXUHNGO/lg==} engines: {node: '>=10.18'} peerDependencies: tslib: ^2 @@ -8570,36 +7729,32 @@ packages: tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - tinyexec@1.0.2: - resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} + tinyexec@1.1.1: + resolution: {integrity: sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg==} engines: {node: '>=18'} tinyglobby@0.2.15: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} - tinyrainbow@3.0.3: - resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} + 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.0.23: - resolution: {integrity: sha512-0g9vrtDQLrNIiCj22HSe9d4mLVG3g5ph5DZ8zCKBr4OtrspmNB6ss7hVyzArAeE88ceZocIEGkyW1Ime7fxPtQ==} + tldts-core@7.0.28: + resolution: {integrity: sha512-7W5Efjhsc3chVdFhqtaU0KtK32J37Zcr9RKtID54nG+tIpcY79CQK/veYPODxtD/LJ4Lue66jvrQzIX2Z2/pUQ==} tldts@6.1.86: resolution: {integrity: sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==} hasBin: true - tldts@7.0.23: - resolution: {integrity: sha512-ASdhgQIBSay0R/eXggAkQ53G4nTJqTXqC2kbaBbdDwM7SkjyZyO0OaaN1/FH7U/yCeqOHDwFO5j8+Os/IS1dXw==} + tldts@7.0.28: + resolution: {integrity: sha512-+Zg3vWhRUv8B1maGSTFdev9mjoo8Etn2Ayfs4cnjlD3CsGkxXX4QyW3j2WJ0wdjYcYmy7Lx2RDsZMhgCWafKIw==} hasBin: true - tmp@0.0.30: - resolution: {integrity: sha512-HXdTB7lvMwcb55XFfrTM8CPr/IYREk4hVBFaQ4b/6nInrluSL86hfHm7vu0luYKCfyBZp2trCjpc8caC3vVM3w==} - engines: {node: '>=0.4.0'} - tmp@0.2.5: resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} engines: {node: '>=14.14'} @@ -8616,25 +7771,17 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} - tough-cookie@2.5.0: - resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} - engines: {node: '>=0.8'} - tough-cookie@5.1.2: resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==} engines: {node: '>=16'} - tough-cookie@6.0.0: - resolution: {integrity: sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==} + tough-cookie@6.0.1: + resolution: {integrity: sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==} engines: {node: '>=16'} tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - tr46@5.1.1: - resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} - engines: {node: '>=18'} - tr46@6.0.0: resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==} engines: {node: '>=20'} @@ -8645,30 +7792,12 @@ packages: peerDependencies: tslib: '2' - tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} - hasBin: true - - ts-api-utils@2.4.0: - resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==} + ts-api-utils@2.5.0: + resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} engines: {node: '>=18.12'} peerDependencies: typescript: '>=4.8.4' - ts-node@10.9.2: - resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true - tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} @@ -8678,10 +7807,6 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tsscmp@1.0.6: - resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} - engines: {node: '>=0.6.x'} - tsx@4.21.0: resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} engines: {node: '>=18.0.0'} @@ -8712,10 +7837,6 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} @@ -8746,21 +7867,18 @@ packages: typed-graphqlify@3.1.6: resolution: {integrity: sha512-Snlg1ZrokbkQuemOb4xjWWCJrNcOMeb2Ii0/BwMfwLCcJVNjygyqhrFkrYNvi4gDrwWFrGE0TvxxM+Slym2JMg==} - typed-query-selector@2.12.0: - resolution: {integrity: sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==} + typed-query-selector@2.12.1: + resolution: {integrity: sha512-uzR+FzI8qrUEIu96oaeBJmd9E7CFEiQ3goA5qCVgc4s5llSubcfGHq9yUstZx/k4s9dXHVKsE35YWoFyvEqEHA==} typescript@5.9.3: resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} hasBin: true - typical@4.0.0: - resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} - engines: {node: '>=8'} - - typical@7.3.0: - resolution: {integrity: sha512-ya4mg/30vm+DOWfBg4YK3j2WD6TWtRkCbasOJr40CseYENzCUby/7rIvXA99JGsQHeNxLbnXdyLLxKSv3tauFw==} - engines: {node: '>=12.17'} + typescript@6.0.2: + resolution: {integrity: sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==} + engines: {node: '>=14.17'} + hasBin: true ua-parser-js@0.7.41: resolution: {integrity: sha512-O3oYyCMPYgNNHuO7Jjk3uacJWZF8loBgwrfd/5LE/HyZ3lUIOdniQ7DNXJcIgZbwioZxk0fLfI4EVnetdiX5jg==} @@ -8779,18 +7897,15 @@ packages: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} - unbzip2-stream@1.4.3: - resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} - - undici-types@7.22.0: - resolution: {integrity: sha512-RKZvifiL60xdsIuC80UY0dq8Z7DbJUV8/l2hOVbyZAxBzEeQU4Z58+4ZzJ6WN2Lidi9KzT5EbiGX+PI/UGYuRw==} + undici-types@7.24.7: + resolution: {integrity: sha512-XA+gOBkzYD3C74sZowtCLTpgtaCdqZhqCvR6y9LXvrKTt/IVU6bz49T4D+BPi475scshCCkb0IklJRw6T1ZlgQ==} - undici@6.23.0: - resolution: {integrity: sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==} + undici@6.24.1: + resolution: {integrity: sha512-sC+b0tB1whOCzbtlx20fx3WgCXwkW627p4EA9uM+/tNNPkSS+eSEld6pAs9nDv7WbY1UUljBMYPtu9BCOrCWKA==} engines: {node: '>=18.17'} - undici@7.22.0: - resolution: {integrity: sha512-RqslV2Us5BrllB+JeiZnK4peryVTndy9Dnqq62S3yYRRTj0tFQCwEniUy2167skdGOy3vqRzEvl1Dm4sV2ReDg==} + undici@7.24.6: + resolution: {integrity: sha512-Xi4agocCbRzt0yYMZGMA6ApD7gvtUFaxm4ZmeacWI4cZxaF6C+8I8QfofC20NAePiB/IcvZmzkJ7XPa471AEtA==} engines: {node: '>=20.18.1'} unenv@1.10.0: @@ -8818,14 +7933,6 @@ packages: unicode-trie@2.0.0: resolution: {integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==} - unique-filename@5.0.0: - resolution: {integrity: sha512-2RaJTAvAb4owyjllTfXzFClJ7WsGxlykkPvCr9pA//LD9goVq+m4PPAeBgNodGZ7nSrntT/auWpJ6Y5IFXcfjg==} - engines: {node: ^20.17.0 || >=22.9.0} - - unique-slug@6.0.0: - resolution: {integrity: sha512-4Lup7Ezn8W3d52/xBhZBVdx323ckxa7DEvd9kPQHppTkLoJXw6ltrBCyj5pnrxj0qKDxYMJ56CoxNuFCscdTiw==} - engines: {node: ^20.17.0 || >=22.9.0} - universal-github-app-jwt@2.2.2: resolution: {integrity: sha512-dcmbeSrOdTnsjGjUfAlqNDJrhxXizjAz94ija9Qw8YkZ1uu0d+GoZzyH+Jb9tIIqvGsadUfwg+22k5aDqqwzbw==} @@ -8866,25 +7973,10 @@ packages: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} - uuid@3.4.0: - resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} - deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. - hasBin: true - uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true - v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - - v8-to-istanbul@9.3.0: - 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} @@ -8897,20 +7989,20 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - verdaccio-audit@13.0.0-next-8.29: - resolution: {integrity: sha512-ZUNONewbFocBq3oWXrwAL8IX4ZovPU70yj0nuYStSVJ9+Vrb74Duc+eI+IIS+jLfyysZe5L0ZAODGN8ny1Lu6w==} + verdaccio-audit@13.0.0-next-8.33: + resolution: {integrity: sha512-qBMN0b4cbSbo6RbOke0QtVy/HuSzmxgRXIjnXM3C86ZhjN6DlhdeAoQYcZUfbXM8BklRXtObAnMoTlgeJ7BJLA==} engines: {node: '>=18'} verdaccio-auth-memory@10.3.1: resolution: {integrity: sha512-3m4VH5lD3qdRkDvcvVzHP6YftcsRXgu3WZuspcrH0/76+ugI2wkVezgBDbu4WRwJqRvG0MEf8Zxoup9zVK5SVw==} engines: {node: '>=18'} - verdaccio-htpasswd@13.0.0-next-8.29: - resolution: {integrity: sha512-JBYCaSTQSUws/EXOqNrh7iOyWPrGLTYSeufCS3Y6BOCJbfDiy2Nh8PbstoZn/L9ZbzUesjPPiIZ4Ou3eUaK0Mw==} + verdaccio-htpasswd@13.0.0-next-8.33: + resolution: {integrity: sha512-ZYqvF/EuA4W4idfv2O1ZN8YhSI2xreFbGdrcWgOd+QBedDin7NzMhgypbafutm9mPhkI6Xv/+3syee1u1cEL8g==} engines: {node: '>=18'} - verdaccio@6.2.5: - resolution: {integrity: sha512-sIek+ZF0a1aaRwHo9I5vbONGXzcAgbf5psEmbGVMG9M/MslblIae2wdehG6a2lSxsk4B9c8Ar0j/ZmliTjiStA==} + verdaccio@6.3.2: + resolution: {integrity: sha512-9BmfrGlakdAW1QNBrD2GgO8hOhwIp6ogbAhaaDgtDsK3/94qXwS6n2PM1/gG2V/zFC5JH1rWbLia390i0xbodA==} engines: {node: '>=18'} hasBin: true @@ -8958,18 +8050,19 @@ packages: yaml: optional: true - vitest@4.0.18: - resolution: {integrity: sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==} + vitest@4.1.2: + resolution: {integrity: sha512-xjR1dMTVHlFLh98JE3i/f/WePqJsah4A0FK9cc8Ehp9Udk0AZk6ccpIZhh1qJ/yxVWRZ+Q54ocnD8TXmkhspGg==} 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.0.18 - '@vitest/browser-preview': 4.0.18 - '@vitest/browser-webdriverio': 4.0.18 - '@vitest/ui': 4.0.18 + '@vitest/browser-playwright': 4.1.2 + '@vitest/browser-preview': 4.1.2 + '@vitest/browser-webdriverio': 4.1.2 + '@vitest/coverage-v8': '*' + '@vitest/ui': 4.1.2 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -9020,22 +8113,9 @@ packages: webdriver-bidi-protocol@0.4.1: resolution: {integrity: sha512-ARrjNjtWRRs2w4Tk7nqrf2gBI0QXWuOmMCx2hU+1jUt6d00MjMxURrhxhGbrsoiZKJrhTSTzbIrc554iKI10qw==} - webdriver-js-extender@2.1.0: - resolution: {integrity: sha512-lcUKrjbBfCK6MNsh7xaY2UAUmZwe+/ib03AjVOpFobX4O7+83BUveSrLfU0Qsyb1DaKJdQRbuU+kM9aZ6QUhiQ==} - engines: {node: '>=6.9.x'} - - webdriver-manager@12.1.9: - resolution: {integrity: sha512-Yl113uKm8z4m/KMUVWHq1Sjtla2uxEBtx2Ue3AmIlnlPAKloDn/Lvmy6pqWCUersVISpdMeVpAaGbNnvMuT2LQ==} - engines: {node: '>=6.9.x'} - hasBin: true - webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - webidl-conversions@7.0.0: - resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} - engines: {node: '>=12'} - webidl-conversions@8.0.1: resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==} engines: {node: '>=20'} @@ -9049,6 +8129,15 @@ packages: webpack: optional: true + webpack-dev-middleware@8.0.2: + resolution: {integrity: sha512-MCBgoI025uJEcIYDT+R3mXUnhZA/GAxqwngADOwmHxMhQUgDztGow6AmyeEfI8L9KG2pDVg2kU6vjFnbCBH5Pg==} + engines: {node: '>= 20.9.0'} + peerDependencies: + webpack: ^5.101.0 + peerDependenciesMeta: + webpack: + optional: true + webpack-dev-server@5.2.3: resolution: {integrity: sha512-9Gyu2F7+bg4Vv+pjbovuYDhHX+mqdqITykfzdM9UyKqKHlsE5aAjRhR+oOEfXW5vBeu8tarzlJFIZva4ZjAdrQ==} engines: {node: '>= 18.12.0'} @@ -9080,8 +8169,8 @@ packages: html-webpack-plugin: optional: true - webpack@5.105.2: - resolution: {integrity: sha512-dRXm0a2qcHPUBEzVk8uph0xWSjV/xZxenQQbLwnwP7caQCYpqG1qddwlyEkIDkYn0K8tvmcrZ+bOrzoQ3HxCDw==} + webpack@5.105.4: + resolution: {integrity: sha512-jTywjboN9aHxFlToqb0K0Zs9SbBoW4zRUlGzI2tYNxVYcEi/IPpn+Xi4ye5jTLvX2YeLuic/IvxNot+Q1jMoOw==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -9102,12 +8191,8 @@ packages: resolution: {integrity: sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==} engines: {node: '>=20'} - whatwg-url@14.2.0: - resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} - engines: {node: '>=18'} - - whatwg-url@16.0.0: - resolution: {integrity: sha512-9CcxtEKsf53UFwkSUZjG+9vydAsFO4lFHBpJUtjBcoJOCJpKnSJNwCw813zrYJHpCJ7sgfbtOe0V5Ku7Pa1XMQ==} + whatwg-url@16.0.1: + resolution: {integrity: sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} whatwg-url@5.0.0: @@ -9125,9 +8210,6 @@ packages: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} engines: {node: '>= 0.4'} - which-module@2.0.1: - resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} - which-typed-array@1.1.20: resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==} engines: {node: '>= 0.4'} @@ -9141,11 +8223,6 @@ packages: engines: {node: '>= 8'} hasBin: true - which@6.0.0: - resolution: {integrity: sha512-f+gEpIKMR9faW/JgAgPK1D7mekkFoqbmiwvNzuhsHetni20QSgzg9Vhn0g2JSJkkfehQnqdUAx7/e15qS1lPxg==} - engines: {node: ^20.17.0 || >=22.9.0} - hasBin: true - which@6.0.1: resolution: {integrity: sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==} engines: {node: ^20.17.0 || >=22.9.0} @@ -9166,13 +8243,9 @@ packages: wordwrap@1.0.0: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - wordwrapjs@5.1.1: - resolution: {integrity: sha512-0yweIbkINJodk27gX9LBGMzyQdBDan3s/dEAiwBOj+Mf0PPyWL6/rikalkv8EeD0E8jm4o5RXEOrFTP3NXbhJg==} - engines: {node: '>=12.17'} - - wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} + wrap-ansi@10.0.0: + resolution: {integrity: sha512-SGcvg80f0wUy2/fXES19feHMz8E0JoXv2uNgHOu4Dgi2OrCy1lqwFYEJz1BLbDI0exjPMe/ZdzZ/YpGECBG/aQ==} + engines: {node: '>=20'} wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} @@ -9189,18 +8262,6 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - ws@8.18.3: resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} engines: {node: '>=10.0.0'} @@ -9213,8 +8274,8 @@ packages: utf-8-validate: optional: true - ws@8.19.0: - resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==} + ws@8.20.0: + resolution: {integrity: sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -9225,18 +8286,6 @@ packages: utf-8-validate: optional: true - ws@8.9.0: - resolution: {integrity: sha512-Ja7nszREasGaYUYCI2k4lCKIRTt+y7XuqVoHR44YpI49TtryyqbqvDMn5eqfW7e6HzTukDRIsXqzVHScqRcafg==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - wsl-utils@0.1.0: resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} engines: {node: '>=18'} @@ -9253,14 +8302,6 @@ packages: resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} engines: {node: '>=18'} - xml2js@0.4.23: - resolution: {integrity: sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==} - engines: {node: '>=4.0.0'} - - xmlbuilder@11.0.1: - resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} - engines: {node: '>=4.0'} - xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} @@ -9272,9 +8313,6 @@ packages: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} - y18n@4.0.3: - resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} - y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -9289,15 +8327,11 @@ packages: resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} engines: {node: '>=18'} - yaml@2.8.2: - resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==} + yaml@2.8.3: + resolution: {integrity: sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==} engines: {node: '>= 14.6'} hasBin: true - yargs-parser@18.1.3: - resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} - engines: {node: '>=6'} - yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} @@ -9310,10 +8344,6 @@ packages: resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} engines: {node: ^20.19.0 || ^22.12.0 || >=23} - yargs@15.4.1: - resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} - engines: {node: '>=8'} - yargs@16.2.0: resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} engines: {node: '>=10'} @@ -9329,30 +8359,18 @@ packages: yauzl@2.10.0: resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} - ylru@1.4.0: - resolution: {integrity: sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA==} - engines: {node: '>= 4.0.0'} - - yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} - yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - yoctocolors-cjs@2.1.3: - resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} - engines: {node: '>=18'} - yoctocolors@2.1.2: resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} engines: {node: '>=18'} - zod-to-json-schema@3.25.1: - resolution: {integrity: sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==} + zod-to-json-schema@3.25.2: + resolution: {integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==} peerDependencies: - zod: ^3.25 || ^4 + zod: ^3.25.28 || ^4 zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} @@ -9360,13 +8378,11 @@ packages: zod@4.3.6: resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} - zone.js@0.16.0: - resolution: {integrity: sha512-LqLPpIQANebrlxY6jKcYKdgN5DTXyyHAKnnWWjE5pPfEQ4n7j5zn7mOEEpwNZVKGqx3kKKmvplEmoBrvpgROTA==} + zone.js@0.16.1: + resolution: {integrity: sha512-dpvY17vxYIW3+bNrP0ClUlaiY0CiIRK3tnoLaGoQsQcY9/I/NpzIWQ7tQNhbV7LacQMpCII6wVzuL3tuWOyfuA==} snapshots: - '@acemir/cssom@0.9.31': {} - '@actions/core@3.0.0': dependencies: '@actions/exec': 3.0.0 @@ -9379,122 +8395,122 @@ snapshots: '@actions/http-client@4.0.0': dependencies: tunnel: 0.0.6 - undici: 6.23.0 + undici: 6.24.1 '@actions/io@3.0.2': {} - '@algolia/abtesting@1.14.1': + '@algolia/abtesting@1.16.0': dependencies: - '@algolia/client-common': 5.48.1 - '@algolia/requester-browser-xhr': 5.48.1 - '@algolia/requester-fetch': 5.48.1 - '@algolia/requester-node-http': 5.48.1 + '@algolia/client-common': 5.50.0 + '@algolia/requester-browser-xhr': 5.50.0 + '@algolia/requester-fetch': 5.50.0 + '@algolia/requester-node-http': 5.50.0 - '@algolia/client-abtesting@5.48.1': + '@algolia/client-abtesting@5.50.0': dependencies: - '@algolia/client-common': 5.48.1 - '@algolia/requester-browser-xhr': 5.48.1 - '@algolia/requester-fetch': 5.48.1 - '@algolia/requester-node-http': 5.48.1 + '@algolia/client-common': 5.50.0 + '@algolia/requester-browser-xhr': 5.50.0 + '@algolia/requester-fetch': 5.50.0 + '@algolia/requester-node-http': 5.50.0 - '@algolia/client-analytics@5.48.1': + '@algolia/client-analytics@5.50.0': dependencies: - '@algolia/client-common': 5.48.1 - '@algolia/requester-browser-xhr': 5.48.1 - '@algolia/requester-fetch': 5.48.1 - '@algolia/requester-node-http': 5.48.1 + '@algolia/client-common': 5.50.0 + '@algolia/requester-browser-xhr': 5.50.0 + '@algolia/requester-fetch': 5.50.0 + '@algolia/requester-node-http': 5.50.0 - '@algolia/client-common@5.48.1': {} + '@algolia/client-common@5.50.0': {} - '@algolia/client-insights@5.48.1': + '@algolia/client-insights@5.50.0': dependencies: - '@algolia/client-common': 5.48.1 - '@algolia/requester-browser-xhr': 5.48.1 - '@algolia/requester-fetch': 5.48.1 - '@algolia/requester-node-http': 5.48.1 + '@algolia/client-common': 5.50.0 + '@algolia/requester-browser-xhr': 5.50.0 + '@algolia/requester-fetch': 5.50.0 + '@algolia/requester-node-http': 5.50.0 - '@algolia/client-personalization@5.48.1': + '@algolia/client-personalization@5.50.0': dependencies: - '@algolia/client-common': 5.48.1 - '@algolia/requester-browser-xhr': 5.48.1 - '@algolia/requester-fetch': 5.48.1 - '@algolia/requester-node-http': 5.48.1 + '@algolia/client-common': 5.50.0 + '@algolia/requester-browser-xhr': 5.50.0 + '@algolia/requester-fetch': 5.50.0 + '@algolia/requester-node-http': 5.50.0 - '@algolia/client-query-suggestions@5.48.1': + '@algolia/client-query-suggestions@5.50.0': dependencies: - '@algolia/client-common': 5.48.1 - '@algolia/requester-browser-xhr': 5.48.1 - '@algolia/requester-fetch': 5.48.1 - '@algolia/requester-node-http': 5.48.1 + '@algolia/client-common': 5.50.0 + '@algolia/requester-browser-xhr': 5.50.0 + '@algolia/requester-fetch': 5.50.0 + '@algolia/requester-node-http': 5.50.0 - '@algolia/client-search@5.48.1': + '@algolia/client-search@5.50.0': dependencies: - '@algolia/client-common': 5.48.1 - '@algolia/requester-browser-xhr': 5.48.1 - '@algolia/requester-fetch': 5.48.1 - '@algolia/requester-node-http': 5.48.1 + '@algolia/client-common': 5.50.0 + '@algolia/requester-browser-xhr': 5.50.0 + '@algolia/requester-fetch': 5.50.0 + '@algolia/requester-node-http': 5.50.0 - '@algolia/ingestion@1.48.1': + '@algolia/ingestion@1.50.0': dependencies: - '@algolia/client-common': 5.48.1 - '@algolia/requester-browser-xhr': 5.48.1 - '@algolia/requester-fetch': 5.48.1 - '@algolia/requester-node-http': 5.48.1 + '@algolia/client-common': 5.50.0 + '@algolia/requester-browser-xhr': 5.50.0 + '@algolia/requester-fetch': 5.50.0 + '@algolia/requester-node-http': 5.50.0 - '@algolia/monitoring@1.48.1': + '@algolia/monitoring@1.50.0': dependencies: - '@algolia/client-common': 5.48.1 - '@algolia/requester-browser-xhr': 5.48.1 - '@algolia/requester-fetch': 5.48.1 - '@algolia/requester-node-http': 5.48.1 + '@algolia/client-common': 5.50.0 + '@algolia/requester-browser-xhr': 5.50.0 + '@algolia/requester-fetch': 5.50.0 + '@algolia/requester-node-http': 5.50.0 - '@algolia/recommend@5.48.1': + '@algolia/recommend@5.50.0': dependencies: - '@algolia/client-common': 5.48.1 - '@algolia/requester-browser-xhr': 5.48.1 - '@algolia/requester-fetch': 5.48.1 - '@algolia/requester-node-http': 5.48.1 + '@algolia/client-common': 5.50.0 + '@algolia/requester-browser-xhr': 5.50.0 + '@algolia/requester-fetch': 5.50.0 + '@algolia/requester-node-http': 5.50.0 - '@algolia/requester-browser-xhr@5.48.1': + '@algolia/requester-browser-xhr@5.50.0': dependencies: - '@algolia/client-common': 5.48.1 + '@algolia/client-common': 5.50.0 - '@algolia/requester-fetch@5.48.1': + '@algolia/requester-fetch@5.50.0': dependencies: - '@algolia/client-common': 5.48.1 + '@algolia/client-common': 5.50.0 - '@algolia/requester-node-http@5.48.1': + '@algolia/requester-node-http@5.50.0': dependencies: - '@algolia/client-common': 5.48.1 + '@algolia/client-common': 5.50.0 '@ampproject/remapping@2.3.0': dependencies: '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 - '@angular/animations@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))': + '@angular/animations@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))': dependencies: - '@angular/core': 21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0) + '@angular/core': 22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1) tslib: 2.8.1 - '@angular/cdk@21.2.0-next.4(@angular/common@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(@angular/platform-browser@21.2.0-next.3(@angular/animations@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0)))(rxjs@7.8.2)': + '@angular/cdk@22.0.0-next.3(@angular/common@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.6(@angular/animations@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2)': dependencies: - '@angular/common': 21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2) - '@angular/core': 21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0) - '@angular/platform-browser': 21.2.0-next.3(@angular/animations@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0)) + '@angular/common': 22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/core': 22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/platform-browser': 22.0.0-next.6(@angular/animations@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1)) parse5: 8.0.0 rxjs: 7.8.2 tslib: 2.8.1 - '@angular/common@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2)': + '@angular/common@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2)': dependencies: - '@angular/core': 21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0) + '@angular/core': 22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1) rxjs: 7.8.2 tslib: 2.8.1 - '@angular/compiler-cli@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(typescript@5.9.3)': + '@angular/compiler-cli@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(typescript@6.0.2)': dependencies: - '@angular/compiler': 21.2.0-next.3 + '@angular/compiler': 22.0.0-next.6 '@babel/core': 7.29.0 '@jridgewell/sourcemap-codec': 1.5.5 chokidar: 5.0.0 @@ -9504,35 +8520,35 @@ snapshots: tslib: 2.8.1 yargs: 18.0.0 optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.2 transitivePeerDependencies: - supports-color - '@angular/compiler@21.2.0-next.3': + '@angular/compiler@22.0.0-next.6': dependencies: tslib: 2.8.1 - '@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0)': + '@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1)': dependencies: rxjs: 7.8.2 tslib: 2.8.1 optionalDependencies: - '@angular/compiler': 21.2.0-next.3 - zone.js: 0.16.0 + '@angular/compiler': 22.0.0-next.6 + zone.js: 0.16.1 - '@angular/forms@21.2.0-next.3(@angular/common@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(@angular/platform-browser@21.2.0-next.3(@angular/animations@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0)))(rxjs@7.8.2)': + '@angular/forms@22.0.0-next.6(@angular/common@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.6(@angular/animations@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2)': dependencies: - '@angular/common': 21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2) - '@angular/core': 21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0) - '@angular/platform-browser': 21.2.0-next.3(@angular/animations@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0)) + '@angular/common': 22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/core': 22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/platform-browser': 22.0.0-next.6(@angular/animations@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1)) '@standard-schema/spec': 1.1.0 rxjs: 7.8.2 tslib: 2.8.1 - '@angular/localize@21.2.0-next.3(@angular/compiler-cli@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(typescript@5.9.3))(@angular/compiler@21.2.0-next.3)': + '@angular/localize@22.0.0-next.6(@angular/compiler-cli@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(typescript@6.0.2))(@angular/compiler@22.0.0-next.6)': dependencies: - '@angular/compiler': 21.2.0-next.3 - '@angular/compiler-cli': 21.2.0-next.3(@angular/compiler@21.2.0-next.3)(typescript@5.9.3) + '@angular/compiler': 22.0.0-next.6 + '@angular/compiler-cli': 22.0.0-next.6(@angular/compiler@22.0.0-next.6)(typescript@6.0.2) '@babel/core': 7.29.0 '@types/babel__core': 7.20.5 tinyglobby: 0.2.15 @@ -9540,24 +8556,25 @@ snapshots: transitivePeerDependencies: - supports-color - '@angular/material@21.2.0-next.4(75d10325bbcfc22e53b1e47f427450d8)': + '@angular/material@22.0.0-next.3(2e9636f7d8dd68137b51ac62db842fa5)': dependencies: - '@angular/cdk': 21.2.0-next.4(@angular/common@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(@angular/platform-browser@21.2.0-next.3(@angular/animations@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0)))(rxjs@7.8.2) - '@angular/common': 21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2) - '@angular/core': 21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0) - '@angular/forms': 21.2.0-next.3(@angular/common@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(@angular/platform-browser@21.2.0-next.3(@angular/animations@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0)))(rxjs@7.8.2) - '@angular/platform-browser': 21.2.0-next.3(@angular/animations@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0)) + '@angular/cdk': 22.0.0-next.3(@angular/common@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.6(@angular/animations@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) + '@angular/common': 22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/core': 22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/forms': 22.0.0-next.6(@angular/common@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.6(@angular/animations@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) + '@angular/platform-browser': 22.0.0-next.6(@angular/animations@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1)) rxjs: 7.8.2 tslib: 2.8.1 - '@angular/ng-dev@https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/2a5e8e5b5398ae13a8d9a963ac980707313a6c9e(@modelcontextprotocol/sdk@1.26.0(zod@4.3.6))': + '@angular/ng-dev@https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/1c95e84f330960eea28b5e3ed9b7a6a21b2c605b(@modelcontextprotocol/sdk@1.28.0(zod@4.3.6))': dependencies: '@actions/core': 3.0.0 + '@conventional-changelog/git-client': 2.6.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.4.0) '@google-cloud/spanner': 8.0.0(supports-color@10.2.2) - '@google/genai': 1.38.0(@modelcontextprotocol/sdk@1.26.0(zod@4.3.6))(bufferutil@4.1.0)(supports-color@10.2.2)(utf-8-validate@6.0.6) - '@inquirer/prompts': 8.2.0(@types/node@24.10.9) - '@inquirer/type': 4.0.3(@types/node@24.10.9) - '@octokit/auth-app': 8.1.2 + '@google/genai': 1.48.0(@modelcontextprotocol/sdk@1.28.0(zod@4.3.6))(bufferutil@4.1.0)(supports-color@10.2.2)(utf-8-validate@6.0.6) + '@inquirer/prompts': 8.3.2(@types/node@24.12.0) + '@inquirer/type': 4.0.4(@types/node@24.12.0) + '@octokit/auth-app': 8.2.0 '@octokit/core': 7.0.6 '@octokit/graphql': 9.0.3 '@octokit/graphql-schema': 15.26.1 @@ -9567,14 +8584,13 @@ snapshots: '@octokit/request-error': 7.1.0 '@octokit/rest': 22.0.1 '@octokit/types': 16.0.0 - '@pnpm/dependency-path': 1001.1.9 + '@pnpm/dependency-path': 1001.1.10 '@types/cli-progress': 3.11.6 '@types/ejs': 3.1.5 '@types/events': 3.0.3 '@types/folder-hash': 4.0.4 - '@types/git-raw-commits': 5.0.1 '@types/jasmine': 6.0.0 - '@types/node': 24.10.9 + '@types/node': 24.12.0 '@types/semver': 7.7.1 '@types/which': 3.0.4 '@types/yargs': 17.0.35 @@ -9583,81 +8599,78 @@ snapshots: bufferutil: 4.1.0 cli-progress: 3.12.0 conventional-commits-filter: 5.0.0 - conventional-commits-parser: 6.2.1 - ejs: 4.0.1 + conventional-commits-parser: 6.4.0 + ejs: 5.0.1 encoding: 0.1.13 fast-glob: 3.3.3 - firebase: 12.8.0 - folder-hash: 4.1.1(supports-color@10.2.2) - git-raw-commits: 5.0.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.2.1) - jasmine: 6.0.0 - jasmine-core: 6.0.0 + firebase: 12.11.0 + folder-hash: 4.1.2(supports-color@10.2.2) + jasmine: 6.1.0 + jasmine-core: 6.1.0 jasmine-reporters: 2.5.2 jsonc-parser: 3.3.1 - minimatch: 10.1.1 - multimatch: 7.0.0 - nock: 14.0.10 - semver: 7.7.3 + minimatch: 10.2.5 + multimatch: 8.0.0 + nock: 14.0.11 + semver: 7.7.4 supports-color: 10.2.2 tsx: 4.21.0 typed-graphqlify: 3.1.6 typescript: 5.9.3 utf-8-validate: 6.0.6 - which: 6.0.0 - yaml: 2.8.2 + which: 6.0.1 + yaml: 2.8.3 yargs: 18.0.0 zod: 4.3.6 transitivePeerDependencies: - '@modelcontextprotocol/sdk' - '@react-native-async-storage/async-storage' - '@angular/platform-browser@21.2.0-next.3(@angular/animations@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))': + '@angular/platform-browser@22.0.0-next.6(@angular/animations@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))': dependencies: - '@angular/common': 21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2) - '@angular/core': 21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0) + '@angular/common': 22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/core': 22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1) tslib: 2.8.1 optionalDependencies: - '@angular/animations': 21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0)) + '@angular/animations': 22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1)) - '@angular/platform-server@21.2.0-next.3(@angular/common@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/compiler@21.2.0-next.3)(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(@angular/platform-browser@21.2.0-next.3(@angular/animations@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0)))(rxjs@7.8.2)': + '@angular/platform-server@22.0.0-next.6(@angular/common@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/compiler@22.0.0-next.6)(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.6(@angular/animations@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2)': dependencies: - '@angular/common': 21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2) - '@angular/compiler': 21.2.0-next.3 - '@angular/core': 21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0) - '@angular/platform-browser': 21.2.0-next.3(@angular/animations@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0)) + '@angular/common': 22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/compiler': 22.0.0-next.6 + '@angular/core': 22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/platform-browser': 22.0.0-next.6(@angular/animations@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1)) rxjs: 7.8.2 tslib: 2.8.1 xhr2: 0.2.1 - '@angular/router@21.2.0-next.3(@angular/common@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(@angular/platform-browser@21.2.0-next.3(@angular/animations@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0)))(rxjs@7.8.2)': + '@angular/router@22.0.0-next.6(@angular/common@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.6(@angular/animations@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2)': dependencies: - '@angular/common': 21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2) - '@angular/core': 21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0) - '@angular/platform-browser': 21.2.0-next.3(@angular/animations@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0)) + '@angular/common': 22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/core': 22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/platform-browser': 22.0.0-next.6(@angular/animations@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1)) rxjs: 7.8.2 tslib: 2.8.1 - '@angular/service-worker@21.2.0-next.3(@angular/core@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2)': + '@angular/service-worker@22.0.0-next.6(@angular/core@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2)': dependencies: - '@angular/core': 21.2.0-next.3(@angular/compiler@21.2.0-next.3)(rxjs@7.8.2)(zone.js@0.16.0) + '@angular/core': 22.0.0-next.6(@angular/compiler@22.0.0-next.6)(rxjs@7.8.2)(zone.js@0.16.1) rxjs: 7.8.2 tslib: 2.8.1 - '@asamuzakjp/css-color@4.1.2': + '@asamuzakjp/css-color@5.1.6': dependencies: '@csstools/css-calc': 3.1.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.0.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.0.2(@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 - lru-cache: 11.2.6 - '@asamuzakjp/dom-selector@6.8.1': + '@asamuzakjp/dom-selector@7.0.8': dependencies: '@asamuzakjp/nwsapi': 2.3.9 bidi-js: 1.0.3 - css-tree: 3.1.0 + css-tree: 3.2.1 is-potential-custom-element-name: 1.0.1 - lru-cache: 11.2.6 '@asamuzakjp/nwsapi@2.3.9': {} @@ -9675,8 +8688,8 @@ snapshots: '@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.28.6 - '@babel/parser': 7.29.0 + '@babel/helpers': 7.29.2 + '@babel/parser': 7.29.2 '@babel/template': 7.28.6 '@babel/traverse': 7.29.0 '@babel/types': 7.29.0 @@ -9691,7 +8704,7 @@ snapshots: '@babel/generator@7.29.1': dependencies: - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@babel/types': 7.29.0 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 @@ -9705,7 +8718,7 @@ snapshots: dependencies: '@babel/compat-data': 7.29.0 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.28.1 + browserslist: 4.28.2 lru-cache: 5.1.1 semver: 6.3.1 @@ -9729,7 +8742,7 @@ snapshots: regexpu-core: 6.4.0 semver: 6.3.1 - '@babel/helper-define-polyfill-provider@0.6.6(@babel/core@7.29.0)': + '@babel/helper-define-polyfill-provider@0.6.8(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 '@babel/helper-compilation-targets': 7.28.6 @@ -9814,12 +8827,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helpers@7.28.6': + '@babel/helpers@7.29.2': dependencies: '@babel/template': 7.28.6 '@babel/types': 7.29.0 - '@babel/parser@7.29.0': + '@babel/parser@7.29.2': dependencies: '@babel/types': 7.29.0 @@ -10165,9 +9178,9 @@ snapshots: '@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.15(@babel/core@7.29.0) + 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.6(@babel/core@7.29.0) + babel-plugin-polyfill-regenerator: 0.6.8(@babel/core@7.29.0) semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -10223,7 +9236,7 @@ snapshots: '@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.0(@babel/core@7.29.0)': + '@babel/preset-env@7.29.2(@babel/core@7.29.0)': dependencies: '@babel/compat-data': 7.29.0 '@babel/core': 7.29.0 @@ -10291,10 +9304,10 @@ snapshots: '@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.15(@babel/core@7.29.0) - babel-plugin-polyfill-corejs3: 0.14.0(@babel/core@7.29.0) - babel-plugin-polyfill-regenerator: 0.6.6(@babel/core@7.29.0) - core-js-compat: 3.48.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 @@ -10306,12 +9319,12 @@ snapshots: '@babel/types': 7.29.0 esutils: 2.0.3 - '@babel/runtime@7.28.6': {} + '@babel/runtime@7.29.2': {} '@babel/template@7.28.6': dependencies: '@babel/code-frame': 7.29.0 - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@babel/types': 7.29.0 '@babel/traverse@7.29.0': @@ -10319,7 +9332,7 @@ snapshots: '@babel/code-frame': 7.29.0 '@babel/generator': 7.29.1 '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@babel/template': 7.28.6 '@babel/types': 7.29.0 debug: 4.4.3(supports-color@10.2.2) @@ -10335,36 +9348,35 @@ snapshots: '@bazel/buildifier@8.2.1': {} + '@bazel/ibazel@0.28.0': {} + '@bcoe/v8-coverage@1.0.2': {} '@bramus/specificity@2.4.2': dependencies: - css-tree: 3.1.0 + css-tree: 3.2.1 '@colors/colors@1.5.0': {} - '@conventional-changelog/git-client@1.0.1(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.2.1)': + '@conventional-changelog/git-client@2.6.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.4.0)': dependencies: - '@types/semver': 7.7.1 + '@simple-libs/child-process-utils': 1.0.2 + '@simple-libs/stream-utils': 1.2.0 semver: 7.7.4 optionalDependencies: conventional-commits-filter: 5.0.0 - conventional-commits-parser: 6.2.1 - - '@cspotcode/source-map-support@0.8.1': - dependencies: - '@jridgewell/trace-mapping': 0.3.9 + conventional-commits-parser: 6.4.0 - '@csstools/color-helpers@6.0.1': {} + '@csstools/color-helpers@6.0.2': {} '@csstools/css-calc@3.1.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': dependencies: '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) '@csstools/css-tokenizer': 4.0.0 - '@csstools/css-color-parser@4.0.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.0.2(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': dependencies: - '@csstools/color-helpers': 6.0.1 + '@csstools/color-helpers': 6.0.2 '@csstools/css-calc': 3.1.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 @@ -10373,11 +9385,13 @@ snapshots: dependencies: '@csstools/css-tokenizer': 4.0.0 - '@csstools/css-syntax-patches-for-csstree@1.0.27': {} + '@csstools/css-syntax-patches-for-csstree@1.1.2(css-tree@3.2.1)': + optionalDependencies: + css-tree: 3.2.1 '@csstools/css-tokenizer@4.0.0': {} - '@cypress/request@3.0.9': + '@cypress/request@3.0.10': dependencies: aws-sign2: 0.7.0 aws4: 1.13.2 @@ -10392,29 +9406,13 @@ snapshots: json-stringify-safe: 5.0.1 mime-types: 2.1.35 performance-now: 2.1.0 - qs: 6.14.0 + qs: 6.14.2 safe-buffer: 5.2.1 tough-cookie: 5.1.2 tunnel-agent: 0.6.0 uuid: 8.3.2 - '@discoveryjs/json-ext@0.6.3': {} - - '@emnapi/core@1.8.1': - dependencies: - '@emnapi/wasi-threads': 1.1.0 - tslib: 2.8.1 - optional: true - - '@emnapi/runtime@1.8.1': - dependencies: - tslib: 2.8.1 - optional: true - - '@emnapi/wasi-threads@1.1.0': - dependencies: - tslib: 2.8.1 - optional: true + '@discoveryjs/json-ext@1.0.0': {} '@esbuild/aix-ppc64@0.27.3': optional: true @@ -10494,104 +9492,102 @@ snapshots: '@esbuild/win32-x64@0.27.3': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@9.39.2(jiti@2.6.1))': + '@eslint-community/eslint-utils@4.9.1(eslint@10.1.0(jiti@2.6.1))': dependencies: - eslint: 9.39.2(jiti@2.6.1) + eslint: 10.1.0(jiti@2.6.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint/compat@2.0.2(eslint@9.39.2(jiti@2.6.1))': + '@eslint/compat@2.0.3(eslint@10.1.0(jiti@2.6.1))': dependencies: - '@eslint/core': 1.1.0 + '@eslint/core': 1.2.0 optionalDependencies: - eslint: 9.39.2(jiti@2.6.1) + eslint: 10.1.0(jiti@2.6.1) - '@eslint/config-array@0.21.1': + '@eslint/config-array@0.23.4': dependencies: - '@eslint/object-schema': 2.1.7 + '@eslint/object-schema': 3.0.4 debug: 4.4.3(supports-color@10.2.2) - minimatch: 3.1.2 + minimatch: 10.2.5 transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.4.2': - dependencies: - '@eslint/core': 0.17.0 - - '@eslint/core@0.17.0': + '@eslint/config-helpers@0.5.4': dependencies: - '@types/json-schema': 7.0.15 + '@eslint/core': 1.2.0 - '@eslint/core@1.1.0': + '@eslint/core@1.2.0': dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.3.3': + '@eslint/eslintrc@3.3.5': dependencies: - ajv: 6.12.6 + ajv: 6.14.0 debug: 4.4.3(supports-color@10.2.2) 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.2 + minimatch: 3.1.5 strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - '@eslint/js@9.39.2': {} + '@eslint/js@10.0.1(eslint@10.1.0(jiti@2.6.1))': + optionalDependencies: + eslint: 10.1.0(jiti@2.6.1) - '@eslint/object-schema@2.1.7': {} + '@eslint/object-schema@3.0.4': {} - '@eslint/plugin-kit@0.4.1': + '@eslint/plugin-kit@0.6.1': dependencies: - '@eslint/core': 0.17.0 + '@eslint/core': 1.2.0 levn: 0.4.1 - '@exodus/bytes@1.14.1': {} + '@exodus/bytes@1.15.0': {} - '@firebase/ai@2.7.0(@firebase/app-types@0.9.3)(@firebase/app@0.14.7)': + '@firebase/ai@2.10.0(@firebase/app-types@0.9.3)(@firebase/app@0.14.10)': dependencies: - '@firebase/app': 0.14.7 + '@firebase/app': 0.14.10 '@firebase/app-check-interop-types': 0.3.3 '@firebase/app-types': 0.9.3 - '@firebase/component': 0.7.0 + '@firebase/component': 0.7.2 '@firebase/logger': 0.5.0 - '@firebase/util': 1.13.0 + '@firebase/util': 1.15.0 tslib: 2.8.1 - '@firebase/analytics-compat@0.2.25(@firebase/app-compat@0.5.7)(@firebase/app@0.14.7)': + '@firebase/analytics-compat@0.2.27(@firebase/app-compat@0.5.10)(@firebase/app@0.14.10)': dependencies: - '@firebase/analytics': 0.10.19(@firebase/app@0.14.7) + '@firebase/analytics': 0.10.21(@firebase/app@0.14.10) '@firebase/analytics-types': 0.8.3 - '@firebase/app-compat': 0.5.7 - '@firebase/component': 0.7.0 - '@firebase/util': 1.13.0 + '@firebase/app-compat': 0.5.10 + '@firebase/component': 0.7.2 + '@firebase/util': 1.15.0 tslib: 2.8.1 transitivePeerDependencies: - '@firebase/app' '@firebase/analytics-types@0.8.3': {} - '@firebase/analytics@0.10.19(@firebase/app@0.14.7)': + '@firebase/analytics@0.10.21(@firebase/app@0.14.10)': dependencies: - '@firebase/app': 0.14.7 - '@firebase/component': 0.7.0 - '@firebase/installations': 0.6.19(@firebase/app@0.14.7) + '@firebase/app': 0.14.10 + '@firebase/component': 0.7.2 + '@firebase/installations': 0.6.21(@firebase/app@0.14.10) '@firebase/logger': 0.5.0 - '@firebase/util': 1.13.0 + '@firebase/util': 1.15.0 tslib: 2.8.1 - '@firebase/app-check-compat@0.4.0(@firebase/app-compat@0.5.7)(@firebase/app@0.14.7)': + '@firebase/app-check-compat@0.4.2(@firebase/app-compat@0.5.10)(@firebase/app@0.14.10)': dependencies: - '@firebase/app-check': 0.11.0(@firebase/app@0.14.7) + '@firebase/app-check': 0.11.2(@firebase/app@0.14.10) '@firebase/app-check-types': 0.5.3 - '@firebase/app-compat': 0.5.7 - '@firebase/component': 0.7.0 + '@firebase/app-compat': 0.5.10 + '@firebase/component': 0.7.2 '@firebase/logger': 0.5.0 - '@firebase/util': 1.13.0 + '@firebase/util': 1.15.0 tslib: 2.8.1 transitivePeerDependencies: - '@firebase/app' @@ -10600,39 +9596,39 @@ snapshots: '@firebase/app-check-types@0.5.3': {} - '@firebase/app-check@0.11.0(@firebase/app@0.14.7)': + '@firebase/app-check@0.11.2(@firebase/app@0.14.10)': dependencies: - '@firebase/app': 0.14.7 - '@firebase/component': 0.7.0 + '@firebase/app': 0.14.10 + '@firebase/component': 0.7.2 '@firebase/logger': 0.5.0 - '@firebase/util': 1.13.0 + '@firebase/util': 1.15.0 tslib: 2.8.1 - '@firebase/app-compat@0.5.7': + '@firebase/app-compat@0.5.10': dependencies: - '@firebase/app': 0.14.7 - '@firebase/component': 0.7.0 + '@firebase/app': 0.14.10 + '@firebase/component': 0.7.2 '@firebase/logger': 0.5.0 - '@firebase/util': 1.13.0 + '@firebase/util': 1.15.0 tslib: 2.8.1 '@firebase/app-types@0.9.3': {} - '@firebase/app@0.14.7': + '@firebase/app@0.14.10': dependencies: - '@firebase/component': 0.7.0 + '@firebase/component': 0.7.2 '@firebase/logger': 0.5.0 - '@firebase/util': 1.13.0 + '@firebase/util': 1.15.0 idb: 7.1.1 tslib: 2.8.1 - '@firebase/auth-compat@0.6.2(@firebase/app-compat@0.5.7)(@firebase/app-types@0.9.3)(@firebase/app@0.14.7)': + '@firebase/auth-compat@0.6.4(@firebase/app-compat@0.5.10)(@firebase/app-types@0.9.3)(@firebase/app@0.14.10)': dependencies: - '@firebase/app-compat': 0.5.7 - '@firebase/auth': 1.12.0(@firebase/app@0.14.7) - '@firebase/auth-types': 0.13.0(@firebase/app-types@0.9.3)(@firebase/util@1.13.0) - '@firebase/component': 0.7.0 - '@firebase/util': 1.13.0 + '@firebase/app-compat': 0.5.10 + '@firebase/auth': 1.12.2(@firebase/app@0.14.10) + '@firebase/auth-types': 0.13.0(@firebase/app-types@0.9.3)(@firebase/util@1.15.0) + '@firebase/component': 0.7.2 + '@firebase/util': 1.15.0 tslib: 2.8.1 transitivePeerDependencies: - '@firebase/app' @@ -10641,115 +9637,115 @@ snapshots: '@firebase/auth-interop-types@0.2.4': {} - '@firebase/auth-types@0.13.0(@firebase/app-types@0.9.3)(@firebase/util@1.13.0)': + '@firebase/auth-types@0.13.0(@firebase/app-types@0.9.3)(@firebase/util@1.15.0)': dependencies: '@firebase/app-types': 0.9.3 - '@firebase/util': 1.13.0 + '@firebase/util': 1.15.0 - '@firebase/auth@1.12.0(@firebase/app@0.14.7)': + '@firebase/auth@1.12.2(@firebase/app@0.14.10)': dependencies: - '@firebase/app': 0.14.7 - '@firebase/component': 0.7.0 + '@firebase/app': 0.14.10 + '@firebase/component': 0.7.2 '@firebase/logger': 0.5.0 - '@firebase/util': 1.13.0 + '@firebase/util': 1.15.0 tslib: 2.8.1 - '@firebase/component@0.7.0': + '@firebase/component@0.7.2': dependencies: - '@firebase/util': 1.13.0 + '@firebase/util': 1.15.0 tslib: 2.8.1 - '@firebase/data-connect@0.3.12(@firebase/app@0.14.7)': + '@firebase/data-connect@0.5.0(@firebase/app@0.14.10)': dependencies: - '@firebase/app': 0.14.7 + '@firebase/app': 0.14.10 '@firebase/auth-interop-types': 0.2.4 - '@firebase/component': 0.7.0 + '@firebase/component': 0.7.2 '@firebase/logger': 0.5.0 - '@firebase/util': 1.13.0 + '@firebase/util': 1.15.0 tslib: 2.8.1 - '@firebase/database-compat@2.1.0': + '@firebase/database-compat@2.1.2': dependencies: - '@firebase/component': 0.7.0 - '@firebase/database': 1.1.0 - '@firebase/database-types': 1.0.16 + '@firebase/component': 0.7.2 + '@firebase/database': 1.1.2 + '@firebase/database-types': 1.0.18 '@firebase/logger': 0.5.0 - '@firebase/util': 1.13.0 + '@firebase/util': 1.15.0 tslib: 2.8.1 - '@firebase/database-types@1.0.16': + '@firebase/database-types@1.0.18': dependencies: '@firebase/app-types': 0.9.3 - '@firebase/util': 1.13.0 + '@firebase/util': 1.15.0 - '@firebase/database@1.1.0': + '@firebase/database@1.1.2': dependencies: '@firebase/app-check-interop-types': 0.3.3 '@firebase/auth-interop-types': 0.2.4 - '@firebase/component': 0.7.0 + '@firebase/component': 0.7.2 '@firebase/logger': 0.5.0 - '@firebase/util': 1.13.0 + '@firebase/util': 1.15.0 faye-websocket: 0.11.4 tslib: 2.8.1 - '@firebase/firestore-compat@0.4.4(@firebase/app-compat@0.5.7)(@firebase/app-types@0.9.3)(@firebase/app@0.14.7)': + '@firebase/firestore-compat@0.4.7(@firebase/app-compat@0.5.10)(@firebase/app-types@0.9.3)(@firebase/app@0.14.10)': dependencies: - '@firebase/app-compat': 0.5.7 - '@firebase/component': 0.7.0 - '@firebase/firestore': 4.10.0(@firebase/app@0.14.7) - '@firebase/firestore-types': 3.0.3(@firebase/app-types@0.9.3)(@firebase/util@1.13.0) - '@firebase/util': 1.13.0 + '@firebase/app-compat': 0.5.10 + '@firebase/component': 0.7.2 + '@firebase/firestore': 4.13.0(@firebase/app@0.14.10) + '@firebase/firestore-types': 3.0.3(@firebase/app-types@0.9.3)(@firebase/util@1.15.0) + '@firebase/util': 1.15.0 tslib: 2.8.1 transitivePeerDependencies: - '@firebase/app' - '@firebase/app-types' - '@firebase/firestore-types@3.0.3(@firebase/app-types@0.9.3)(@firebase/util@1.13.0)': + '@firebase/firestore-types@3.0.3(@firebase/app-types@0.9.3)(@firebase/util@1.15.0)': dependencies: '@firebase/app-types': 0.9.3 - '@firebase/util': 1.13.0 + '@firebase/util': 1.15.0 - '@firebase/firestore@4.10.0(@firebase/app@0.14.7)': + '@firebase/firestore@4.13.0(@firebase/app@0.14.10)': dependencies: - '@firebase/app': 0.14.7 - '@firebase/component': 0.7.0 + '@firebase/app': 0.14.10 + '@firebase/component': 0.7.2 '@firebase/logger': 0.5.0 - '@firebase/util': 1.13.0 + '@firebase/util': 1.15.0 '@firebase/webchannel-wrapper': 1.0.5 '@grpc/grpc-js': 1.9.15 '@grpc/proto-loader': 0.7.15 tslib: 2.8.1 - '@firebase/functions-compat@0.4.1(@firebase/app-compat@0.5.7)(@firebase/app@0.14.7)': + '@firebase/functions-compat@0.4.3(@firebase/app-compat@0.5.10)(@firebase/app@0.14.10)': dependencies: - '@firebase/app-compat': 0.5.7 - '@firebase/component': 0.7.0 - '@firebase/functions': 0.13.1(@firebase/app@0.14.7) + '@firebase/app-compat': 0.5.10 + '@firebase/component': 0.7.2 + '@firebase/functions': 0.13.3(@firebase/app@0.14.10) '@firebase/functions-types': 0.6.3 - '@firebase/util': 1.13.0 + '@firebase/util': 1.15.0 tslib: 2.8.1 transitivePeerDependencies: - '@firebase/app' '@firebase/functions-types@0.6.3': {} - '@firebase/functions@0.13.1(@firebase/app@0.14.7)': + '@firebase/functions@0.13.3(@firebase/app@0.14.10)': dependencies: - '@firebase/app': 0.14.7 + '@firebase/app': 0.14.10 '@firebase/app-check-interop-types': 0.3.3 '@firebase/auth-interop-types': 0.2.4 - '@firebase/component': 0.7.0 + '@firebase/component': 0.7.2 '@firebase/messaging-interop-types': 0.2.3 - '@firebase/util': 1.13.0 + '@firebase/util': 1.15.0 tslib: 2.8.1 - '@firebase/installations-compat@0.2.19(@firebase/app-compat@0.5.7)(@firebase/app-types@0.9.3)(@firebase/app@0.14.7)': + '@firebase/installations-compat@0.2.21(@firebase/app-compat@0.5.10)(@firebase/app-types@0.9.3)(@firebase/app@0.14.10)': dependencies: - '@firebase/app-compat': 0.5.7 - '@firebase/component': 0.7.0 - '@firebase/installations': 0.6.19(@firebase/app@0.14.7) + '@firebase/app-compat': 0.5.10 + '@firebase/component': 0.7.2 + '@firebase/installations': 0.6.21(@firebase/app@0.14.10) '@firebase/installations-types': 0.5.3(@firebase/app-types@0.9.3) - '@firebase/util': 1.13.0 + '@firebase/util': 1.15.0 tslib: 2.8.1 transitivePeerDependencies: - '@firebase/app' @@ -10759,11 +9755,11 @@ snapshots: dependencies: '@firebase/app-types': 0.9.3 - '@firebase/installations@0.6.19(@firebase/app@0.14.7)': + '@firebase/installations@0.6.21(@firebase/app@0.14.10)': dependencies: - '@firebase/app': 0.14.7 - '@firebase/component': 0.7.0 - '@firebase/util': 1.13.0 + '@firebase/app': 0.14.10 + '@firebase/component': 0.7.2 + '@firebase/util': 1.15.0 idb: 7.1.1 tslib: 2.8.1 @@ -10771,105 +9767,107 @@ snapshots: dependencies: tslib: 2.8.1 - '@firebase/messaging-compat@0.2.23(@firebase/app-compat@0.5.7)(@firebase/app@0.14.7)': + '@firebase/messaging-compat@0.2.25(@firebase/app-compat@0.5.10)(@firebase/app@0.14.10)': dependencies: - '@firebase/app-compat': 0.5.7 - '@firebase/component': 0.7.0 - '@firebase/messaging': 0.12.23(@firebase/app@0.14.7) - '@firebase/util': 1.13.0 + '@firebase/app-compat': 0.5.10 + '@firebase/component': 0.7.2 + '@firebase/messaging': 0.12.25(@firebase/app@0.14.10) + '@firebase/util': 1.15.0 tslib: 2.8.1 transitivePeerDependencies: - '@firebase/app' '@firebase/messaging-interop-types@0.2.3': {} - '@firebase/messaging@0.12.23(@firebase/app@0.14.7)': + '@firebase/messaging@0.12.25(@firebase/app@0.14.10)': dependencies: - '@firebase/app': 0.14.7 - '@firebase/component': 0.7.0 - '@firebase/installations': 0.6.19(@firebase/app@0.14.7) + '@firebase/app': 0.14.10 + '@firebase/component': 0.7.2 + '@firebase/installations': 0.6.21(@firebase/app@0.14.10) '@firebase/messaging-interop-types': 0.2.3 - '@firebase/util': 1.13.0 + '@firebase/util': 1.15.0 idb: 7.1.1 tslib: 2.8.1 - '@firebase/performance-compat@0.2.22(@firebase/app-compat@0.5.7)(@firebase/app@0.14.7)': + '@firebase/performance-compat@0.2.24(@firebase/app-compat@0.5.10)(@firebase/app@0.14.10)': dependencies: - '@firebase/app-compat': 0.5.7 - '@firebase/component': 0.7.0 + '@firebase/app-compat': 0.5.10 + '@firebase/component': 0.7.2 '@firebase/logger': 0.5.0 - '@firebase/performance': 0.7.9(@firebase/app@0.14.7) + '@firebase/performance': 0.7.11(@firebase/app@0.14.10) '@firebase/performance-types': 0.2.3 - '@firebase/util': 1.13.0 + '@firebase/util': 1.15.0 tslib: 2.8.1 transitivePeerDependencies: - '@firebase/app' '@firebase/performance-types@0.2.3': {} - '@firebase/performance@0.7.9(@firebase/app@0.14.7)': + '@firebase/performance@0.7.11(@firebase/app@0.14.10)': dependencies: - '@firebase/app': 0.14.7 - '@firebase/component': 0.7.0 - '@firebase/installations': 0.6.19(@firebase/app@0.14.7) + '@firebase/app': 0.14.10 + '@firebase/component': 0.7.2 + '@firebase/installations': 0.6.21(@firebase/app@0.14.10) '@firebase/logger': 0.5.0 - '@firebase/util': 1.13.0 + '@firebase/util': 1.15.0 tslib: 2.8.1 web-vitals: 4.2.4 - '@firebase/remote-config-compat@0.2.21(@firebase/app-compat@0.5.7)(@firebase/app@0.14.7)': + '@firebase/remote-config-compat@0.2.23(@firebase/app-compat@0.5.10)(@firebase/app@0.14.10)': dependencies: - '@firebase/app-compat': 0.5.7 - '@firebase/component': 0.7.0 + '@firebase/app-compat': 0.5.10 + '@firebase/component': 0.7.2 '@firebase/logger': 0.5.0 - '@firebase/remote-config': 0.8.0(@firebase/app@0.14.7) + '@firebase/remote-config': 0.8.2(@firebase/app@0.14.10) '@firebase/remote-config-types': 0.5.0 - '@firebase/util': 1.13.0 + '@firebase/util': 1.15.0 tslib: 2.8.1 transitivePeerDependencies: - '@firebase/app' '@firebase/remote-config-types@0.5.0': {} - '@firebase/remote-config@0.8.0(@firebase/app@0.14.7)': + '@firebase/remote-config@0.8.2(@firebase/app@0.14.10)': dependencies: - '@firebase/app': 0.14.7 - '@firebase/component': 0.7.0 - '@firebase/installations': 0.6.19(@firebase/app@0.14.7) + '@firebase/app': 0.14.10 + '@firebase/component': 0.7.2 + '@firebase/installations': 0.6.21(@firebase/app@0.14.10) '@firebase/logger': 0.5.0 - '@firebase/util': 1.13.0 + '@firebase/util': 1.15.0 tslib: 2.8.1 - '@firebase/storage-compat@0.4.0(@firebase/app-compat@0.5.7)(@firebase/app-types@0.9.3)(@firebase/app@0.14.7)': + '@firebase/storage-compat@0.4.2(@firebase/app-compat@0.5.10)(@firebase/app-types@0.9.3)(@firebase/app@0.14.10)': dependencies: - '@firebase/app-compat': 0.5.7 - '@firebase/component': 0.7.0 - '@firebase/storage': 0.14.0(@firebase/app@0.14.7) - '@firebase/storage-types': 0.8.3(@firebase/app-types@0.9.3)(@firebase/util@1.13.0) - '@firebase/util': 1.13.0 + '@firebase/app-compat': 0.5.10 + '@firebase/component': 0.7.2 + '@firebase/storage': 0.14.2(@firebase/app@0.14.10) + '@firebase/storage-types': 0.8.3(@firebase/app-types@0.9.3)(@firebase/util@1.15.0) + '@firebase/util': 1.15.0 tslib: 2.8.1 transitivePeerDependencies: - '@firebase/app' - '@firebase/app-types' - '@firebase/storage-types@0.8.3(@firebase/app-types@0.9.3)(@firebase/util@1.13.0)': + '@firebase/storage-types@0.8.3(@firebase/app-types@0.9.3)(@firebase/util@1.15.0)': dependencies: '@firebase/app-types': 0.9.3 - '@firebase/util': 1.13.0 + '@firebase/util': 1.15.0 - '@firebase/storage@0.14.0(@firebase/app@0.14.7)': + '@firebase/storage@0.14.2(@firebase/app@0.14.10)': dependencies: - '@firebase/app': 0.14.7 - '@firebase/component': 0.7.0 - '@firebase/util': 1.13.0 + '@firebase/app': 0.14.10 + '@firebase/component': 0.7.2 + '@firebase/util': 1.15.0 tslib: 2.8.1 - '@firebase/util@1.13.0': + '@firebase/util@1.15.0': dependencies: tslib: 2.8.1 '@firebase/webchannel-wrapper@1.0.5': {} + '@gar/promise-retry@1.0.3': {} + '@glideapps/ts-necessities@2.2.3': {} '@google-cloud/common@6.0.0(supports-color@10.2.2)': @@ -10879,10 +9877,10 @@ snapshots: arrify: 2.0.1 duplexify: 4.1.3 extend: 3.0.2 - google-auth-library: 10.5.0(supports-color@10.2.2) + google-auth-library: 10.6.2(supports-color@10.2.2) html-entities: 2.6.0 retry-request: 8.0.2(supports-color@10.2.2) - teeny-request: 10.1.0(supports-color@10.2.2) + teeny-request: 10.1.2(supports-color@10.2.2) transitivePeerDependencies: - supports-color @@ -10903,10 +9901,10 @@ snapshots: '@google-cloud/projectify': 5.0.0 '@google-cloud/promisify': 5.0.0 '@grpc/proto-loader': 0.7.15 - '@opentelemetry/api': 1.9.0 - '@opentelemetry/context-async-hooks': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.39.0 + '@opentelemetry/api': 1.9.1 + '@opentelemetry/context-async-hooks': 2.6.1(@opentelemetry/api@1.9.1) + '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.40.0 '@types/big.js': 6.2.2 '@types/stack-trace': 0.0.33 big.js: 7.0.1 @@ -10914,7 +9912,7 @@ snapshots: duplexify: 4.1.3 events-intercept: 2.0.0 extend: 3.0.2 - google-auth-library: 10.5.0(supports-color@10.2.2) + google-auth-library: 10.6.2(supports-color@10.2.2) google-gax: 5.0.6(supports-color@10.2.2) grpc-gcp: 1.0.1(protobufjs@7.5.4) is: 3.3.2 @@ -10926,18 +9924,19 @@ snapshots: split-array-stream: 2.0.0 stack-trace: 0.0.10 stream-events: 1.0.5 - teeny-request: 10.1.0(supports-color@10.2.2) + teeny-request: 10.1.2(supports-color@10.2.2) through2: 4.0.2 transitivePeerDependencies: - supports-color - '@google/genai@1.38.0(@modelcontextprotocol/sdk@1.26.0(zod@4.3.6))(bufferutil@4.1.0)(supports-color@10.2.2)(utf-8-validate@6.0.6)': + '@google/genai@1.48.0(@modelcontextprotocol/sdk@1.28.0(zod@4.3.6))(bufferutil@4.1.0)(supports-color@10.2.2)(utf-8-validate@6.0.6)': dependencies: - google-auth-library: 10.5.0(supports-color@10.2.2) + google-auth-library: 10.6.2(supports-color@10.2.2) + p-retry: 4.6.2 protobufjs: 7.5.4 - ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) + ws: 8.20.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) optionalDependencies: - '@modelcontextprotocol/sdk': 1.26.0(zod@4.3.6) + '@modelcontextprotocol/sdk': 1.28.0(zod@4.3.6) transitivePeerDependencies: - bufferutil - supports-color @@ -10951,7 +9950,7 @@ snapshots: '@grpc/grpc-js@1.9.15': dependencies: '@grpc/proto-loader': 0.7.15 - '@types/node': 22.19.11 + '@types/node': 22.19.17 '@grpc/proto-loader@0.7.15': dependencies: @@ -10967,14 +9966,12 @@ snapshots: protobufjs: 7.5.4 yargs: 17.7.2 - '@hapi/bourne@3.0.0': {} - '@harperfast/extended-iterable@1.0.3': optional: true - '@hono/node-server@1.19.9(hono@4.11.9)': + '@hono/node-server@1.19.13(hono@4.12.12)': dependencies: - hono: 4.11.9 + hono: 4.12.12 '@humanfs/core@0.19.1': {} @@ -10987,270 +9984,141 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} - '@inquirer/ansi@1.0.2': {} - - '@inquirer/ansi@2.0.3': {} - - '@inquirer/checkbox@4.3.2(@types/node@24.10.9)': - dependencies: - '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@24.10.9) - '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@24.10.9) - yoctocolors-cjs: 2.1.3 - optionalDependencies: - '@types/node': 24.10.9 - - '@inquirer/checkbox@5.0.6(@types/node@24.10.9)': - dependencies: - '@inquirer/ansi': 2.0.3 - '@inquirer/core': 11.1.3(@types/node@24.10.9) - '@inquirer/figures': 2.0.3 - '@inquirer/type': 4.0.3(@types/node@24.10.9) - optionalDependencies: - '@types/node': 24.10.9 - - '@inquirer/confirm@5.1.21(@types/node@24.10.9)': - dependencies: - '@inquirer/core': 10.3.2(@types/node@24.10.9) - '@inquirer/type': 3.0.10(@types/node@24.10.9) - optionalDependencies: - '@types/node': 24.10.9 + '@inquirer/ansi@2.0.5': {} - '@inquirer/confirm@6.0.6(@types/node@24.10.9)': + '@inquirer/checkbox@5.1.3(@types/node@24.12.0)': dependencies: - '@inquirer/core': 11.1.3(@types/node@24.10.9) - '@inquirer/type': 4.0.3(@types/node@24.10.9) + '@inquirer/ansi': 2.0.5 + '@inquirer/core': 11.1.8(@types/node@24.12.0) + '@inquirer/figures': 2.0.5 + '@inquirer/type': 4.0.5(@types/node@24.12.0) optionalDependencies: - '@types/node': 24.10.9 + '@types/node': 24.12.0 - '@inquirer/core@10.3.2(@types/node@24.10.9)': + '@inquirer/confirm@6.0.10(@types/node@24.12.0)': dependencies: - '@inquirer/ansi': 1.0.2 - '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@24.10.9) - cli-width: 4.1.0 - mute-stream: 2.0.0 - signal-exit: 4.1.0 - wrap-ansi: 6.2.0 - yoctocolors-cjs: 2.1.3 + '@inquirer/core': 11.1.8(@types/node@24.12.0) + '@inquirer/type': 4.0.5(@types/node@24.12.0) optionalDependencies: - '@types/node': 24.10.9 + '@types/node': 24.12.0 - '@inquirer/core@11.1.3(@types/node@24.10.9)': + '@inquirer/core@11.1.8(@types/node@24.12.0)': dependencies: - '@inquirer/ansi': 2.0.3 - '@inquirer/figures': 2.0.3 - '@inquirer/type': 4.0.3(@types/node@24.10.9) + '@inquirer/ansi': 2.0.5 + '@inquirer/figures': 2.0.5 + '@inquirer/type': 4.0.5(@types/node@24.12.0) cli-width: 4.1.0 fast-wrap-ansi: 0.2.0 mute-stream: 3.0.0 signal-exit: 4.1.0 optionalDependencies: - '@types/node': 24.10.9 - - '@inquirer/editor@4.2.23(@types/node@24.10.9)': - dependencies: - '@inquirer/core': 10.3.2(@types/node@24.10.9) - '@inquirer/external-editor': 1.0.3(@types/node@24.10.9) - '@inquirer/type': 3.0.10(@types/node@24.10.9) - optionalDependencies: - '@types/node': 24.10.9 + '@types/node': 24.12.0 - '@inquirer/editor@5.0.6(@types/node@24.10.9)': + '@inquirer/editor@5.1.0(@types/node@24.12.0)': dependencies: - '@inquirer/core': 11.1.3(@types/node@24.10.9) - '@inquirer/external-editor': 2.0.3(@types/node@24.10.9) - '@inquirer/type': 4.0.3(@types/node@24.10.9) + '@inquirer/core': 11.1.8(@types/node@24.12.0) + '@inquirer/external-editor': 3.0.0(@types/node@24.12.0) + '@inquirer/type': 4.0.5(@types/node@24.12.0) optionalDependencies: - '@types/node': 24.10.9 + '@types/node': 24.12.0 - '@inquirer/expand@4.0.23(@types/node@24.10.9)': + '@inquirer/expand@5.0.12(@types/node@24.12.0)': dependencies: - '@inquirer/core': 10.3.2(@types/node@24.10.9) - '@inquirer/type': 3.0.10(@types/node@24.10.9) - yoctocolors-cjs: 2.1.3 + '@inquirer/core': 11.1.8(@types/node@24.12.0) + '@inquirer/type': 4.0.5(@types/node@24.12.0) optionalDependencies: - '@types/node': 24.10.9 + '@types/node': 24.12.0 - '@inquirer/expand@5.0.6(@types/node@24.10.9)': - dependencies: - '@inquirer/core': 11.1.3(@types/node@24.10.9) - '@inquirer/type': 4.0.3(@types/node@24.10.9) - optionalDependencies: - '@types/node': 24.10.9 - - '@inquirer/external-editor@1.0.3(@types/node@24.10.9)': - dependencies: - chardet: 2.1.1 - iconv-lite: 0.7.2 - optionalDependencies: - '@types/node': 24.10.9 - - '@inquirer/external-editor@2.0.3(@types/node@24.10.9)': + '@inquirer/external-editor@3.0.0(@types/node@24.12.0)': dependencies: chardet: 2.1.1 iconv-lite: 0.7.2 optionalDependencies: - '@types/node': 24.10.9 + '@types/node': 24.12.0 - '@inquirer/figures@1.0.15': {} + '@inquirer/figures@2.0.5': {} - '@inquirer/figures@2.0.3': {} - - '@inquirer/input@4.3.1(@types/node@24.10.9)': + '@inquirer/input@5.0.11(@types/node@24.12.0)': dependencies: - '@inquirer/core': 10.3.2(@types/node@24.10.9) - '@inquirer/type': 3.0.10(@types/node@24.10.9) + '@inquirer/core': 11.1.8(@types/node@24.12.0) + '@inquirer/type': 4.0.5(@types/node@24.12.0) optionalDependencies: - '@types/node': 24.10.9 + '@types/node': 24.12.0 - '@inquirer/input@5.0.6(@types/node@24.10.9)': + '@inquirer/number@4.0.11(@types/node@24.12.0)': dependencies: - '@inquirer/core': 11.1.3(@types/node@24.10.9) - '@inquirer/type': 4.0.3(@types/node@24.10.9) + '@inquirer/core': 11.1.8(@types/node@24.12.0) + '@inquirer/type': 4.0.5(@types/node@24.12.0) optionalDependencies: - '@types/node': 24.10.9 + '@types/node': 24.12.0 - '@inquirer/number@3.0.23(@types/node@24.10.9)': + '@inquirer/password@5.0.11(@types/node@24.12.0)': dependencies: - '@inquirer/core': 10.3.2(@types/node@24.10.9) - '@inquirer/type': 3.0.10(@types/node@24.10.9) + '@inquirer/ansi': 2.0.5 + '@inquirer/core': 11.1.8(@types/node@24.12.0) + '@inquirer/type': 4.0.5(@types/node@24.12.0) optionalDependencies: - '@types/node': 24.10.9 - - '@inquirer/number@4.0.6(@types/node@24.10.9)': - dependencies: - '@inquirer/core': 11.1.3(@types/node@24.10.9) - '@inquirer/type': 4.0.3(@types/node@24.10.9) + '@types/node': 24.12.0 + + '@inquirer/prompts@8.3.2(@types/node@24.12.0)': + dependencies: + '@inquirer/checkbox': 5.1.3(@types/node@24.12.0) + '@inquirer/confirm': 6.0.10(@types/node@24.12.0) + '@inquirer/editor': 5.1.0(@types/node@24.12.0) + '@inquirer/expand': 5.0.12(@types/node@24.12.0) + '@inquirer/input': 5.0.11(@types/node@24.12.0) + '@inquirer/number': 4.0.11(@types/node@24.12.0) + '@inquirer/password': 5.0.11(@types/node@24.12.0) + '@inquirer/rawlist': 5.2.7(@types/node@24.12.0) + '@inquirer/search': 4.1.7(@types/node@24.12.0) + '@inquirer/select': 5.1.3(@types/node@24.12.0) optionalDependencies: - '@types/node': 24.10.9 + '@types/node': 24.12.0 - '@inquirer/password@4.0.23(@types/node@24.10.9)': + '@inquirer/rawlist@5.2.7(@types/node@24.12.0)': dependencies: - '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@24.10.9) - '@inquirer/type': 3.0.10(@types/node@24.10.9) + '@inquirer/core': 11.1.8(@types/node@24.12.0) + '@inquirer/type': 4.0.5(@types/node@24.12.0) optionalDependencies: - '@types/node': 24.10.9 + '@types/node': 24.12.0 - '@inquirer/password@5.0.6(@types/node@24.10.9)': + '@inquirer/search@4.1.7(@types/node@24.12.0)': dependencies: - '@inquirer/ansi': 2.0.3 - '@inquirer/core': 11.1.3(@types/node@24.10.9) - '@inquirer/type': 4.0.3(@types/node@24.10.9) - optionalDependencies: - '@types/node': 24.10.9 - - '@inquirer/prompts@7.10.1(@types/node@24.10.9)': - dependencies: - '@inquirer/checkbox': 4.3.2(@types/node@24.10.9) - '@inquirer/confirm': 5.1.21(@types/node@24.10.9) - '@inquirer/editor': 4.2.23(@types/node@24.10.9) - '@inquirer/expand': 4.0.23(@types/node@24.10.9) - '@inquirer/input': 4.3.1(@types/node@24.10.9) - '@inquirer/number': 3.0.23(@types/node@24.10.9) - '@inquirer/password': 4.0.23(@types/node@24.10.9) - '@inquirer/rawlist': 4.1.11(@types/node@24.10.9) - '@inquirer/search': 3.2.2(@types/node@24.10.9) - '@inquirer/select': 4.4.2(@types/node@24.10.9) + '@inquirer/core': 11.1.8(@types/node@24.12.0) + '@inquirer/figures': 2.0.5 + '@inquirer/type': 4.0.5(@types/node@24.12.0) optionalDependencies: - '@types/node': 24.10.9 - - '@inquirer/prompts@8.2.0(@types/node@24.10.9)': - dependencies: - '@inquirer/checkbox': 5.0.6(@types/node@24.10.9) - '@inquirer/confirm': 6.0.6(@types/node@24.10.9) - '@inquirer/editor': 5.0.6(@types/node@24.10.9) - '@inquirer/expand': 5.0.6(@types/node@24.10.9) - '@inquirer/input': 5.0.6(@types/node@24.10.9) - '@inquirer/number': 4.0.6(@types/node@24.10.9) - '@inquirer/password': 5.0.6(@types/node@24.10.9) - '@inquirer/rawlist': 5.2.2(@types/node@24.10.9) - '@inquirer/search': 4.1.2(@types/node@24.10.9) - '@inquirer/select': 5.0.6(@types/node@24.10.9) - optionalDependencies: - '@types/node': 24.10.9 + '@types/node': 24.12.0 - '@inquirer/rawlist@4.1.11(@types/node@24.10.9)': + '@inquirer/select@5.1.3(@types/node@24.12.0)': dependencies: - '@inquirer/core': 10.3.2(@types/node@24.10.9) - '@inquirer/type': 3.0.10(@types/node@24.10.9) - yoctocolors-cjs: 2.1.3 + '@inquirer/ansi': 2.0.5 + '@inquirer/core': 11.1.8(@types/node@24.12.0) + '@inquirer/figures': 2.0.5 + '@inquirer/type': 4.0.5(@types/node@24.12.0) optionalDependencies: - '@types/node': 24.10.9 + '@types/node': 24.12.0 - '@inquirer/rawlist@5.2.2(@types/node@24.10.9)': - dependencies: - '@inquirer/core': 11.1.3(@types/node@24.10.9) - '@inquirer/type': 4.0.3(@types/node@24.10.9) + '@inquirer/type@4.0.4(@types/node@24.12.0)': optionalDependencies: - '@types/node': 24.10.9 + '@types/node': 24.12.0 - '@inquirer/search@3.2.2(@types/node@24.10.9)': - dependencies: - '@inquirer/core': 10.3.2(@types/node@24.10.9) - '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@24.10.9) - yoctocolors-cjs: 2.1.3 + '@inquirer/type@4.0.5(@types/node@24.12.0)': optionalDependencies: - '@types/node': 24.10.9 + '@types/node': 24.12.0 - '@inquirer/search@4.1.2(@types/node@24.10.9)': - dependencies: - '@inquirer/core': 11.1.3(@types/node@24.10.9) - '@inquirer/figures': 2.0.3 - '@inquirer/type': 4.0.3(@types/node@24.10.9) - optionalDependencies: - '@types/node': 24.10.9 - - '@inquirer/select@4.4.2(@types/node@24.10.9)': - dependencies: - '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@24.10.9) - '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@24.10.9) - yoctocolors-cjs: 2.1.3 - optionalDependencies: - '@types/node': 24.10.9 - - '@inquirer/select@5.0.6(@types/node@24.10.9)': - dependencies: - '@inquirer/ansi': 2.0.3 - '@inquirer/core': 11.1.3(@types/node@24.10.9) - '@inquirer/figures': 2.0.3 - '@inquirer/type': 4.0.3(@types/node@24.10.9) - optionalDependencies: - '@types/node': 24.10.9 - - '@inquirer/type@3.0.10(@types/node@24.10.9)': - optionalDependencies: - '@types/node': 24.10.9 - - '@inquirer/type@4.0.3(@types/node@24.10.9)': - optionalDependencies: - '@types/node': 24.10.9 - - '@isaacs/balanced-match@4.0.1': {} - - '@isaacs/brace-expansion@5.0.1': - dependencies: - '@isaacs/balanced-match': 4.0.1 - - '@isaacs/cliui@8.0.2': + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.2 + strip-ansi: 7.2.0 strip-ansi-cjs: strip-ansi@6.0.1 wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 - '@isaacs/cliui@9.0.0': {} - '@isaacs/fs-minipass@4.0.1': dependencies: - minipass: 7.1.2 + minipass: 7.1.3 '@istanbuljs/schema@0.1.3': {} @@ -11280,11 +10148,6 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@jridgewell/trace-mapping@0.3.9': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 - '@js-sdsl/ordered-map@4.4.2': {} '@jsonjoy.com/base64@1.1.2(tslib@2.8.1)': @@ -11311,58 +10174,58 @@ snapshots: dependencies: tslib: 2.8.1 - '@jsonjoy.com/fs-core@4.56.10(tslib@2.8.1)': + '@jsonjoy.com/fs-core@4.57.1(tslib@2.8.1)': dependencies: - '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) - thingies: 2.5.0(tslib@2.8.1) + '@jsonjoy.com/fs-node-builtins': 4.57.1(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.57.1(tslib@2.8.1) + thingies: 2.6.0(tslib@2.8.1) tslib: 2.8.1 - '@jsonjoy.com/fs-fsa@4.56.10(tslib@2.8.1)': + '@jsonjoy.com/fs-fsa@4.57.1(tslib@2.8.1)': dependencies: - '@jsonjoy.com/fs-core': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) - thingies: 2.5.0(tslib@2.8.1) + '@jsonjoy.com/fs-core': 4.57.1(tslib@2.8.1) + '@jsonjoy.com/fs-node-builtins': 4.57.1(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.57.1(tslib@2.8.1) + thingies: 2.6.0(tslib@2.8.1) tslib: 2.8.1 - '@jsonjoy.com/fs-node-builtins@4.56.10(tslib@2.8.1)': + '@jsonjoy.com/fs-node-builtins@4.57.1(tslib@2.8.1)': dependencies: tslib: 2.8.1 - '@jsonjoy.com/fs-node-to-fsa@4.56.10(tslib@2.8.1)': + '@jsonjoy.com/fs-node-to-fsa@4.57.1(tslib@2.8.1)': dependencies: - '@jsonjoy.com/fs-fsa': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-fsa': 4.57.1(tslib@2.8.1) + '@jsonjoy.com/fs-node-builtins': 4.57.1(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.57.1(tslib@2.8.1) tslib: 2.8.1 - '@jsonjoy.com/fs-node-utils@4.56.10(tslib@2.8.1)': + '@jsonjoy.com/fs-node-utils@4.57.1(tslib@2.8.1)': dependencies: - '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-node-builtins': 4.57.1(tslib@2.8.1) tslib: 2.8.1 - '@jsonjoy.com/fs-node@4.56.10(tslib@2.8.1)': + '@jsonjoy.com/fs-node@4.57.1(tslib@2.8.1)': dependencies: - '@jsonjoy.com/fs-core': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-print': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-snapshot': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-core': 4.57.1(tslib@2.8.1) + '@jsonjoy.com/fs-node-builtins': 4.57.1(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.57.1(tslib@2.8.1) + '@jsonjoy.com/fs-print': 4.57.1(tslib@2.8.1) + '@jsonjoy.com/fs-snapshot': 4.57.1(tslib@2.8.1) glob-to-regex.js: 1.2.0(tslib@2.8.1) - thingies: 2.5.0(tslib@2.8.1) + thingies: 2.6.0(tslib@2.8.1) tslib: 2.8.1 - '@jsonjoy.com/fs-print@4.56.10(tslib@2.8.1)': + '@jsonjoy.com/fs-print@4.57.1(tslib@2.8.1)': dependencies: - '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.57.1(tslib@2.8.1) tree-dump: 1.1.0(tslib@2.8.1) tslib: 2.8.1 - '@jsonjoy.com/fs-snapshot@4.56.10(tslib@2.8.1)': + '@jsonjoy.com/fs-snapshot@4.57.1(tslib@2.8.1)': dependencies: '@jsonjoy.com/buffers': 17.67.0(tslib@2.8.1) - '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.57.1(tslib@2.8.1) '@jsonjoy.com/json-pack': 17.67.0(tslib@2.8.1) '@jsonjoy.com/util': 17.67.0(tslib@2.8.1) tslib: 2.8.1 @@ -11375,7 +10238,7 @@ snapshots: '@jsonjoy.com/json-pointer': 1.0.2(tslib@2.8.1) '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) hyperdyperid: 1.2.0 - thingies: 2.5.0(tslib@2.8.1) + thingies: 2.6.0(tslib@2.8.1) tree-dump: 1.1.0(tslib@2.8.1) tslib: 2.8.1 @@ -11387,7 +10250,7 @@ snapshots: '@jsonjoy.com/json-pointer': 17.67.0(tslib@2.8.1) '@jsonjoy.com/util': 17.67.0(tslib@2.8.1) hyperdyperid: 1.2.0 - thingies: 2.5.0(tslib@2.8.1) + thingies: 2.6.0(tslib@2.8.1) tree-dump: 1.1.0(tslib@2.8.1) tslib: 2.8.1 @@ -11416,38 +10279,38 @@ snapshots: '@leichtgewicht/ip-codec@2.0.5': {} - '@listr2/prompt-adapter-inquirer@3.0.5(@inquirer/prompts@7.10.1(@types/node@24.10.9))(@types/node@24.10.9)(listr2@9.0.5)': + '@listr2/prompt-adapter-inquirer@4.2.2(@inquirer/prompts@8.3.2(@types/node@24.12.0))(@types/node@24.12.0)(listr2@10.2.1)': dependencies: - '@inquirer/prompts': 7.10.1(@types/node@24.10.9) - '@inquirer/type': 3.0.10(@types/node@24.10.9) - listr2: 9.0.5 + '@inquirer/prompts': 8.3.2(@types/node@24.12.0) + '@inquirer/type': 4.0.5(@types/node@24.12.0) + listr2: 10.2.1 transitivePeerDependencies: - '@types/node' - '@lmdb/lmdb-darwin-arm64@3.5.1': + '@lmdb/lmdb-darwin-arm64@3.5.2': optional: true - '@lmdb/lmdb-darwin-x64@3.5.1': + '@lmdb/lmdb-darwin-x64@3.5.2': optional: true - '@lmdb/lmdb-linux-arm64@3.5.1': + '@lmdb/lmdb-linux-arm64@3.5.2': optional: true - '@lmdb/lmdb-linux-arm@3.5.1': + '@lmdb/lmdb-linux-arm@3.5.2': optional: true - '@lmdb/lmdb-linux-x64@3.5.1': + '@lmdb/lmdb-linux-x64@3.5.2': optional: true - '@lmdb/lmdb-win32-arm64@3.5.1': + '@lmdb/lmdb-win32-arm64@3.5.2': optional: true - '@lmdb/lmdb-win32-x64@3.5.1': + '@lmdb/lmdb-win32-x64@3.5.2': optional: true - '@modelcontextprotocol/sdk@1.26.0(zod@4.3.6)': + '@modelcontextprotocol/sdk@1.28.0(zod@4.3.6)': dependencies: - '@hono/node-server': 1.19.9(hono@4.11.9) + '@hono/node-server': 1.19.13(hono@4.12.12) ajv: 8.18.0 ajv-formats: 3.0.1(ajv@8.18.0) content-type: 1.0.5 @@ -11456,14 +10319,14 @@ snapshots: eventsource: 3.0.7 eventsource-parser: 3.0.6 express: 5.2.1 - express-rate-limit: 8.2.1(express@5.2.1) - hono: 4.11.9 - jose: 6.1.3 + express-rate-limit: 8.3.2(express@5.2.1) + hono: 4.12.12 + jose: 6.2.2 json-schema-typed: 8.0.2 pkce-challenge: 5.0.1 raw-body: 3.0.2 zod: 4.3.6 - zod-to-json-schema: 3.25.1(zod@4.3.6) + zod-to-json-schema: 3.25.2(zod@4.3.6) transitivePeerDependencies: - supports-color @@ -11485,7 +10348,7 @@ snapshots: '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': optional: true - '@mswjs/interceptors@0.39.8': + '@mswjs/interceptors@0.41.3': dependencies: '@open-draft/deferred-promise': 2.2.0 '@open-draft/logger': 0.3.0 @@ -11566,10 +10429,8 @@ snapshots: '@napi-rs/nice-win32-x64-msvc': 1.1.1 optional: true - '@napi-rs/wasm-runtime@1.1.1': + '@napi-rs/wasm-runtime@1.1.2': dependencies: - '@emnapi/core': 1.8.1 - '@emnapi/runtime': 1.8.1 '@tybys/wasm-util': 0.10.1 optional: true @@ -11590,9 +10451,9 @@ snapshots: '@npmcli/agent@4.0.0': dependencies: agent-base: 7.1.4 - http-proxy-agent: 7.0.2 + http-proxy-agent: 7.0.2(supports-color@10.2.2) https-proxy-agent: 7.0.6(supports-color@10.2.2) - lru-cache: 11.2.6 + lru-cache: 11.3.2 socks-proxy-agent: 8.0.5 transitivePeerDependencies: - supports-color @@ -11601,14 +10462,14 @@ snapshots: dependencies: semver: 7.7.4 - '@npmcli/git@7.0.1': + '@npmcli/git@7.0.2': dependencies: + '@gar/promise-retry': 1.0.3 '@npmcli/promise-spawn': 9.0.1 ini: 6.0.0 - lru-cache: 11.2.6 + lru-cache: 11.3.2 npm-pick-manifest: 11.0.3 proc-log: 6.1.0 - promise-retry: 2.0.1 semver: 7.7.4 which: 6.0.1 @@ -11619,15 +10480,15 @@ snapshots: '@npmcli/node-gyp@5.0.0': {} - '@npmcli/package-json@7.0.4': + '@npmcli/package-json@7.0.5': dependencies: - '@npmcli/git': 7.0.1 - glob: 13.0.3 + '@npmcli/git': 7.0.2 + glob: 13.0.6 hosted-git-info: 9.0.2 json-parse-even-better-errors: 5.0.0 proc-log: 6.1.0 semver: 7.7.4 - validate-npm-package-license: 3.0.4 + spdx-expression-parse: 4.0.0 '@npmcli/promise-spawn@9.0.1': dependencies: @@ -11635,22 +10496,21 @@ snapshots: '@npmcli/redact@4.0.0': {} - '@npmcli/run-script@10.0.3': + '@npmcli/run-script@10.0.4': dependencies: '@npmcli/node-gyp': 5.0.0 - '@npmcli/package-json': 7.0.4 + '@npmcli/package-json': 7.0.5 '@npmcli/promise-spawn': 9.0.1 node-gyp: 12.2.0 proc-log: 6.1.0 - which: 6.0.1 transitivePeerDependencies: - supports-color - '@octokit/auth-app@8.1.2': + '@octokit/auth-app@8.2.0': dependencies: '@octokit/auth-oauth-app': 9.0.3 '@octokit/auth-oauth-user': 6.0.2 - '@octokit/request': 10.0.7 + '@octokit/request': 10.0.8 '@octokit/request-error': 7.1.0 '@octokit/types': 16.0.0 toad-cache: 3.7.0 @@ -11661,14 +10521,14 @@ snapshots: dependencies: '@octokit/auth-oauth-device': 8.0.3 '@octokit/auth-oauth-user': 6.0.2 - '@octokit/request': 10.0.7 + '@octokit/request': 10.0.8 '@octokit/types': 16.0.0 universal-user-agent: 7.0.3 '@octokit/auth-oauth-device@8.0.3': dependencies: '@octokit/oauth-methods': 6.0.2 - '@octokit/request': 10.0.7 + '@octokit/request': 10.0.8 '@octokit/types': 16.0.0 universal-user-agent: 7.0.3 @@ -11676,7 +10536,7 @@ snapshots: dependencies: '@octokit/auth-oauth-device': 8.0.3 '@octokit/oauth-methods': 6.0.2 - '@octokit/request': 10.0.7 + '@octokit/request': 10.0.8 '@octokit/types': 16.0.0 universal-user-agent: 7.0.3 @@ -11686,25 +10546,25 @@ snapshots: dependencies: '@octokit/auth-token': 6.0.0 '@octokit/graphql': 9.0.3 - '@octokit/request': 10.0.7 + '@octokit/request': 10.0.8 '@octokit/request-error': 7.1.0 '@octokit/types': 16.0.0 before-after-hook: 4.0.0 universal-user-agent: 7.0.3 - '@octokit/endpoint@11.0.2': + '@octokit/endpoint@11.0.3': dependencies: '@octokit/types': 16.0.0 universal-user-agent: 7.0.3 '@octokit/graphql-schema@15.26.1': dependencies: - graphql: 16.12.0 - graphql-tag: 2.12.6(graphql@16.12.0) + graphql: 16.13.2 + graphql-tag: 2.12.6(graphql@16.13.2) '@octokit/graphql@9.0.3': dependencies: - '@octokit/request': 10.0.7 + '@octokit/request': 10.0.8 '@octokit/types': 16.0.0 universal-user-agent: 7.0.3 @@ -11713,7 +10573,7 @@ snapshots: '@octokit/oauth-methods@6.0.2': dependencies: '@octokit/oauth-authorization-url': 8.0.0 - '@octokit/request': 10.0.7 + '@octokit/request': 10.0.8 '@octokit/request-error': 7.1.0 '@octokit/types': 16.0.0 @@ -11737,12 +10597,13 @@ snapshots: dependencies: '@octokit/types': 16.0.0 - '@octokit/request@10.0.7': + '@octokit/request@10.0.8': dependencies: - '@octokit/endpoint': 11.0.2 + '@octokit/endpoint': 11.0.3 '@octokit/request-error': 7.1.0 '@octokit/types': 16.0.0 fast-content-type-parse: 3.0.0 + json-with-bigint: 3.5.8 universal-user-agent: 7.0.3 '@octokit/rest@22.0.1': @@ -11765,20 +10626,20 @@ snapshots: '@open-draft/until@2.1.0': {} - '@opentelemetry/api@1.9.0': {} + '@opentelemetry/api@1.9.1': {} - '@opentelemetry/context-async-hooks@2.5.1(@opentelemetry/api@1.9.0)': + '@opentelemetry/context-async-hooks@2.6.1(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 + '@opentelemetry/api': 1.9.1 - '@opentelemetry/core@2.5.1(@opentelemetry/api@1.9.0)': + '@opentelemetry/core@2.6.1(@opentelemetry/api@1.9.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/semantic-conventions': 1.39.0 + '@opentelemetry/api': 1.9.1 + '@opentelemetry/semantic-conventions': 1.40.0 - '@opentelemetry/semantic-conventions@1.39.0': {} + '@opentelemetry/semantic-conventions@1.40.0': {} - '@oxc-project/types@0.113.0': {} + '@oxc-project/types@0.122.0': {} '@parcel/watcher-android-arm64@2.5.6': optional: true @@ -11824,7 +10685,7 @@ snapshots: detect-libc: 2.1.2 is-glob: 4.0.3 node-addon-api: 7.1.1 - picomatch: 4.0.3 + picomatch: 4.0.4 optionalDependencies: '@parcel/watcher-android-arm64': 2.5.6 '@parcel/watcher-darwin-arm64': 2.5.6 @@ -11936,21 +10797,21 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@pnpm/crypto.hash@1000.2.1': + '@pnpm/crypto.hash@1000.2.2': dependencies: '@pnpm/crypto.polyfill': 1000.1.0 - '@pnpm/graceful-fs': 1000.0.1 + '@pnpm/graceful-fs': 1000.1.0 ssri: 10.0.5 '@pnpm/crypto.polyfill@1000.1.0': {} - '@pnpm/dependency-path@1001.1.9': + '@pnpm/dependency-path@1001.1.10': dependencies: - '@pnpm/crypto.hash': 1000.2.1 + '@pnpm/crypto.hash': 1000.2.2 '@pnpm/types': 1001.3.0 semver: 7.7.4 - '@pnpm/graceful-fs@1000.0.1': + '@pnpm/graceful-fs@1000.1.0': dependencies: graceful-fs: 4.2.11 @@ -11979,14 +10840,14 @@ snapshots: '@protobufjs/utf8@1.1.0': {} - '@puppeteer/browsers@2.12.1': + '@puppeteer/browsers@2.13.0': dependencies: debug: 4.4.3(supports-color@10.2.2) extract-zip: 2.0.1 progress: 2.0.3 proxy-agent: 6.5.0 semver: 7.7.4 - tar-fs: 3.1.1 + tar-fs: 3.1.2 yargs: 17.7.2 transitivePeerDependencies: - bare-abort-controller @@ -11994,183 +10855,174 @@ snapshots: - react-native-b4a - supports-color - '@rolldown/binding-android-arm64@1.0.0-rc.4': + '@rolldown/binding-android-arm64@1.0.0-rc.12': + optional: true + + '@rolldown/binding-darwin-arm64@1.0.0-rc.12': + optional: true + + '@rolldown/binding-darwin-x64@1.0.0-rc.12': optional: true - '@rolldown/binding-darwin-arm64@1.0.0-rc.4': + '@rolldown/binding-freebsd-x64@1.0.0-rc.12': optional: true - '@rolldown/binding-darwin-x64@1.0.0-rc.4': + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.12': optional: true - '@rolldown/binding-freebsd-x64@1.0.0-rc.4': + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.12': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.4': + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.12': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.4': + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.12': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.4': + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.12': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.4': + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.12': optional: true - '@rolldown/binding-linux-x64-musl@1.0.0-rc.4': + '@rolldown/binding-linux-x64-musl@1.0.0-rc.12': optional: true - '@rolldown/binding-openharmony-arm64@1.0.0-rc.4': + '@rolldown/binding-openharmony-arm64@1.0.0-rc.12': optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-rc.4': + '@rolldown/binding-wasm32-wasi@1.0.0-rc.12': dependencies: - '@napi-rs/wasm-runtime': 1.1.1 + '@napi-rs/wasm-runtime': 1.1.2 + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.4': + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.12': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.4': + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.12': optional: true - '@rolldown/pluginutils@1.0.0-rc.4': {} + '@rolldown/pluginutils@1.0.0-rc.12': {} - '@rollup/plugin-alias@6.0.0(rollup@4.57.1)': + '@rollup/plugin-alias@6.0.0(rollup@4.60.0)': optionalDependencies: - rollup: 4.57.1 + rollup: 4.60.0 - '@rollup/plugin-commonjs@29.0.0(rollup@4.57.1)': + '@rollup/plugin-commonjs@29.0.2(rollup@4.60.0)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.57.1) + '@rollup/pluginutils': 5.3.0(rollup@4.60.0) commondir: 1.0.1 estree-walker: 2.0.2 - fdir: 6.5.0(picomatch@4.0.3) + fdir: 6.5.0(picomatch@4.0.4) is-reference: 1.2.1 magic-string: 0.30.21 - picomatch: 4.0.3 + picomatch: 4.0.4 optionalDependencies: - rollup: 4.57.1 + rollup: 4.60.0 - '@rollup/plugin-json@6.1.0(rollup@4.57.1)': + '@rollup/plugin-json@6.1.0(rollup@4.60.0)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.57.1) - optionalDependencies: - rollup: 4.57.1 - - '@rollup/plugin-node-resolve@15.3.1(rollup@4.57.1)': - dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.57.1) - '@types/resolve': 1.20.2 - deepmerge: 4.3.1 - is-module: 1.0.0 - resolve: 1.22.11 + '@rollup/pluginutils': 5.3.0(rollup@4.60.0) optionalDependencies: - rollup: 4.57.1 + rollup: 4.60.0 - '@rollup/plugin-node-resolve@16.0.3(rollup@4.57.1)': + '@rollup/plugin-node-resolve@16.0.3(rollup@4.60.0)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.57.1) + '@rollup/pluginutils': 5.3.0(rollup@4.60.0) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-module: 1.0.0 resolve: 1.22.11 optionalDependencies: - rollup: 4.57.1 - - '@rollup/pluginutils@5.2.0(rollup@4.57.1)': - dependencies: - '@types/estree': 1.0.8 - estree-walker: 2.0.2 - picomatch: 4.0.3 - optionalDependencies: - rollup: 4.57.1 + rollup: 4.60.0 - '@rollup/pluginutils@5.3.0(rollup@4.57.1)': + '@rollup/pluginutils@5.3.0(rollup@4.60.0)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 - picomatch: 4.0.3 + picomatch: 4.0.4 optionalDependencies: - rollup: 4.57.1 + rollup: 4.60.0 - '@rollup/rollup-android-arm-eabi@4.57.1': + '@rollup/rollup-android-arm-eabi@4.60.0': optional: true - '@rollup/rollup-android-arm64@4.57.1': + '@rollup/rollup-android-arm64@4.60.0': optional: true - '@rollup/rollup-darwin-arm64@4.57.1': + '@rollup/rollup-darwin-arm64@4.60.0': optional: true - '@rollup/rollup-darwin-x64@4.57.1': + '@rollup/rollup-darwin-x64@4.60.0': optional: true - '@rollup/rollup-freebsd-arm64@4.57.1': + '@rollup/rollup-freebsd-arm64@4.60.0': optional: true - '@rollup/rollup-freebsd-x64@4.57.1': + '@rollup/rollup-freebsd-x64@4.60.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.57.1': + '@rollup/rollup-linux-arm-gnueabihf@4.60.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.57.1': + '@rollup/rollup-linux-arm-musleabihf@4.60.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.57.1': + '@rollup/rollup-linux-arm64-gnu@4.60.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.57.1': + '@rollup/rollup-linux-arm64-musl@4.60.0': optional: true - '@rollup/rollup-linux-loong64-gnu@4.57.1': + '@rollup/rollup-linux-loong64-gnu@4.60.0': optional: true - '@rollup/rollup-linux-loong64-musl@4.57.1': + '@rollup/rollup-linux-loong64-musl@4.60.0': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.57.1': + '@rollup/rollup-linux-ppc64-gnu@4.60.0': optional: true - '@rollup/rollup-linux-ppc64-musl@4.57.1': + '@rollup/rollup-linux-ppc64-musl@4.60.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.57.1': + '@rollup/rollup-linux-riscv64-gnu@4.60.0': optional: true - '@rollup/rollup-linux-riscv64-musl@4.57.1': + '@rollup/rollup-linux-riscv64-musl@4.60.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.57.1': + '@rollup/rollup-linux-s390x-gnu@4.60.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.57.1': + '@rollup/rollup-linux-x64-gnu@4.60.0': optional: true - '@rollup/rollup-linux-x64-musl@4.57.1': + '@rollup/rollup-linux-x64-musl@4.60.0': optional: true - '@rollup/rollup-openbsd-x64@4.57.1': + '@rollup/rollup-openbsd-x64@4.60.0': optional: true - '@rollup/rollup-openharmony-arm64@4.57.1': + '@rollup/rollup-openharmony-arm64@4.60.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.57.1': + '@rollup/rollup-win32-arm64-msvc@4.60.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.57.1': + '@rollup/rollup-win32-ia32-msvc@4.60.0': optional: true - '@rollup/rollup-win32-x64-gnu@4.57.1': + '@rollup/rollup-win32-x64-gnu@4.60.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.57.1': + '@rollup/rollup-win32-x64-msvc@4.60.0': optional: true - '@rollup/wasm-node@4.57.1': + '@rollup/wasm-node@4.60.0': dependencies: '@types/estree': 1.0.8 optionalDependencies: @@ -12180,26 +11032,26 @@ snapshots: '@sigstore/bundle@4.0.0': dependencies: - '@sigstore/protobuf-specs': 0.5.0 + '@sigstore/protobuf-specs': 0.5.1 - '@sigstore/core@3.1.0': {} + '@sigstore/core@3.2.0': {} - '@sigstore/protobuf-specs@0.5.0': {} + '@sigstore/protobuf-specs@0.5.1': {} - '@sigstore/sign@4.1.0': + '@sigstore/sign@4.1.1': dependencies: + '@gar/promise-retry': 1.0.3 '@sigstore/bundle': 4.0.0 - '@sigstore/core': 3.1.0 - '@sigstore/protobuf-specs': 0.5.0 - make-fetch-happen: 15.0.3 + '@sigstore/core': 3.2.0 + '@sigstore/protobuf-specs': 0.5.1 + make-fetch-happen: 15.0.5 proc-log: 6.1.0 - promise-retry: 2.0.1 transitivePeerDependencies: - supports-color - '@sigstore/tuf@4.0.1': + '@sigstore/tuf@4.0.2': dependencies: - '@sigstore/protobuf-specs': 0.5.0 + '@sigstore/protobuf-specs': 0.5.1 tuf-js: 4.1.0 transitivePeerDependencies: - supports-color @@ -12207,8 +11059,14 @@ snapshots: '@sigstore/verify@3.1.0': dependencies: '@sigstore/bundle': 4.0.0 - '@sigstore/core': 3.1.0 - '@sigstore/protobuf-specs': 0.5.0 + '@sigstore/core': 3.2.0 + '@sigstore/protobuf-specs': 0.5.1 + + '@simple-libs/child-process-utils@1.0.2': + dependencies: + '@simple-libs/stream-utils': 1.2.0 + + '@simple-libs/stream-utils@1.2.0': {} '@sindresorhus/is@4.6.0': {} @@ -12216,53 +11074,41 @@ snapshots: '@standard-schema/spec@1.1.0': {} - '@stylistic/eslint-plugin@5.8.0(eslint@9.39.2(jiti@2.6.1))': + '@stylistic/eslint-plugin@5.10.0(eslint@10.1.0(jiti@2.6.1))': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) - '@typescript-eslint/types': 8.55.0 - eslint: 9.39.2(jiti@2.6.1) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.1.0(jiti@2.6.1)) + '@typescript-eslint/types': 8.58.0 + eslint: 10.1.0(jiti@2.6.1) eslint-visitor-keys: 4.2.1 espree: 10.4.0 estraverse: 5.3.0 - picomatch: 4.0.3 + picomatch: 4.0.4 '@szmarczak/http-timer@4.0.6': dependencies: defer-to-connect: 2.0.1 - '@tootallnate/once@2.0.0': {} + '@tony.ganchev/eslint-plugin-header@3.3.4(eslint@10.1.0(jiti@2.6.1))': + dependencies: + eslint: 10.1.0(jiti@2.6.1) '@tootallnate/quickjs-emscripten@0.23.0': {} - '@tsconfig/node10@1.0.12': {} - - '@tsconfig/node12@1.0.11': {} - - '@tsconfig/node14@1.0.3': {} - - '@tsconfig/node16@1.0.4': {} - '@tufjs/canonical-json@2.0.0': {} '@tufjs/models@4.1.0': dependencies: '@tufjs/canonical-json': 2.0.0 - minimatch: 10.2.0 + minimatch: 10.2.5 '@tybys/wasm-util@0.10.1': dependencies: tslib: 2.8.1 optional: true - '@types/accepts@1.3.7': - dependencies: - '@types/node': 22.19.11 - - '@types/babel__code-frame@7.27.0': {} - '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@babel/types': 7.29.0 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 @@ -12274,7 +11120,7 @@ snapshots: '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@babel/types': 7.29.0 '@types/babel__traverse@7.28.0': @@ -12286,16 +11132,16 @@ snapshots: '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 22.19.11 + '@types/node': 22.19.17 '@types/bonjour@3.5.13': dependencies: - '@types/node': 22.19.11 + '@types/node': 22.19.17 '@types/browser-sync@2.29.1': dependencies: '@types/micromatch': 2.3.35 - '@types/node': 22.19.11 + '@types/node': 22.19.17 '@types/serve-static': 2.2.0 chokidar: 3.6.0 @@ -12306,46 +11152,26 @@ snapshots: '@types/cli-progress@3.11.6': dependencies: - '@types/node': 22.19.11 - - '@types/co-body@6.1.3': - dependencies: - '@types/node': 22.19.11 - '@types/qs': 6.14.0 - - '@types/command-line-args@5.2.3': {} + '@types/node': 22.19.17 '@types/connect-history-api-fallback@1.5.4': dependencies: '@types/express-serve-static-core': 4.19.8 - '@types/node': 22.19.11 + '@types/node': 22.19.17 '@types/connect@3.4.38': dependencies: - '@types/node': 22.19.11 - - '@types/content-disposition@0.5.9': {} - - '@types/convert-source-map@2.0.3': {} - - '@types/cookies@0.9.2': - dependencies: - '@types/connect': 3.4.38 - '@types/express': 5.0.6 - '@types/keygrip': 1.0.6 - '@types/node': 22.19.11 + '@types/node': 22.19.17 '@types/cors@2.8.19': dependencies: - '@types/node': 22.19.11 - - '@types/debounce@1.2.4': {} + '@types/node': 22.19.17 '@types/deep-eql@4.0.2': {} '@types/duplexify@3.6.5': dependencies: - '@types/node': 22.19.11 + '@types/node': 22.19.17 '@types/ejs@3.1.5': {} @@ -12359,21 +11185,23 @@ snapshots: '@types/estree': 1.0.8 '@types/json-schema': 7.0.15 + '@types/esrecurse@4.3.1': {} + '@types/estree@1.0.8': {} '@types/events@3.0.3': {} '@types/express-serve-static-core@4.19.8': dependencies: - '@types/node': 22.19.11 - '@types/qs': 6.14.0 + '@types/node': 22.19.17 + '@types/qs': 6.15.0 '@types/range-parser': 1.2.7 '@types/send': 1.2.1 '@types/express-serve-static-core@5.1.1': dependencies: - '@types/node': 22.19.11 - '@types/qs': 6.14.0 + '@types/node': 22.19.17 + '@types/qs': 6.15.0 '@types/range-parser': 1.2.7 '@types/send': 1.2.1 @@ -12381,7 +11209,7 @@ snapshots: dependencies: '@types/body-parser': 1.19.6 '@types/express-serve-static-core': 4.19.8 - '@types/qs': 6.14.0 + '@types/qs': 6.15.0 '@types/serve-static': 1.15.10 '@types/express@5.0.6': @@ -12392,39 +11220,21 @@ snapshots: '@types/folder-hash@4.0.4': {} - '@types/git-raw-commits@5.0.1': - dependencies: - '@types/node': 22.19.11 - '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 22.19.11 - - '@types/http-assert@1.5.6': {} + '@types/node': 22.19.17 '@types/http-errors@2.0.5': {} '@types/http-proxy@1.17.17': dependencies: - '@types/node': 22.19.11 + '@types/node': 22.19.17 '@types/ini@4.1.1': {} - '@types/istanbul-lib-coverage@2.0.6': {} - - '@types/istanbul-lib-report@3.0.3': - dependencies: - '@types/istanbul-lib-coverage': 2.0.6 - - '@types/istanbul-reports@3.0.4': - dependencies: - '@types/istanbul-lib-report': 3.0.3 - '@types/jasmine-reporters@2.5.3': dependencies: - '@types/jasmine': 5.1.15 - - '@types/jasmine@5.1.15': {} + '@types/jasmine': 6.0.0 '@types/jasmine@6.0.0': {} @@ -12434,41 +11244,24 @@ snapshots: '@types/karma@6.3.9': dependencies: - '@types/node': 22.19.11 + '@types/node': 22.19.17 log4js: 6.9.1 transitivePeerDependencies: - supports-color - '@types/keygrip@1.0.6': {} - - '@types/koa-compose@3.2.9': - dependencies: - '@types/koa': 2.15.0 - - '@types/koa@2.15.0': - dependencies: - '@types/accepts': 1.3.7 - '@types/content-disposition': 0.5.9 - '@types/cookies': 0.9.2 - '@types/http-assert': 1.5.6 - '@types/http-errors': 2.0.5 - '@types/keygrip': 1.0.6 - '@types/koa-compose': 3.2.9 - '@types/node': 22.19.11 - '@types/less@3.0.8': {} '@types/loader-utils@3.0.0(esbuild@0.27.3)': dependencies: - '@types/node': 22.19.11 - webpack: 5.105.2(esbuild@0.27.3) + '@types/node': 22.19.17 + webpack: 5.105.4(esbuild@0.27.3) transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - webpack-cli - '@types/lodash@4.17.23': {} + '@types/lodash@4.17.24': {} '@types/micromatch@2.3.35': dependencies: @@ -12478,22 +11271,22 @@ snapshots: '@types/node-fetch@2.6.13': dependencies: - '@types/node': 22.19.11 + '@types/node': 22.19.17 form-data: 4.0.5 - '@types/node@22.19.11': + '@types/node@22.19.17': dependencies: - undici-types: 7.22.0 + undici-types: 7.24.7 - '@types/node@24.10.9': + '@types/node@24.12.0': dependencies: - undici-types: 7.22.0 + undici-types: 7.24.7 '@types/npm-package-arg@6.1.4': {} '@types/npm-registry-fetch@8.0.9': dependencies: - '@types/node': 22.19.11 + '@types/node': 22.19.17 '@types/node-fetch': 2.6.13 '@types/npm-package-arg': 6.1.4 '@types/npmlog': 7.0.0 @@ -12501,33 +11294,29 @@ snapshots: '@types/npmlog@7.0.0': dependencies: - '@types/node': 22.19.11 + '@types/node': 22.19.17 '@types/pacote@11.1.8': dependencies: - '@types/node': 22.19.11 + '@types/node': 22.19.17 '@types/npm-registry-fetch': 8.0.9 '@types/npmlog': 7.0.0 '@types/ssri': 7.1.5 '@types/parse-glob@3.0.32': {} - '@types/parse5@6.0.3': {} - - '@types/picomatch@4.0.2': {} + '@types/picomatch@4.0.3': {} '@types/progress@2.0.7': dependencies: - '@types/node': 22.19.11 + '@types/node': 22.19.17 '@types/pumpify@1.4.5': dependencies: '@types/duplexify': 3.6.5 - '@types/node': 22.19.11 - - '@types/q@0.0.32': {} + '@types/node': 22.19.17 - '@types/qs@6.14.0': {} + '@types/qs@6.15.0': {} '@types/range-parser@1.2.7': {} @@ -12535,22 +11324,22 @@ snapshots: '@types/responselike@1.0.0': dependencies: - '@types/node': 22.19.11 + '@types/node': 22.19.17 - '@types/retry@0.12.2': {} + '@types/retry@0.12.0': {} - '@types/selenium-webdriver@3.0.26': {} + '@types/retry@0.12.2': {} '@types/semver@7.7.1': {} '@types/send@0.17.6': dependencies: '@types/mime': 1.3.5 - '@types/node': 22.19.11 + '@types/node': 22.19.17 '@types/send@1.2.1': dependencies: - '@types/node': 22.19.11 + '@types/node': 22.19.17 '@types/serve-index@1.9.4': dependencies: @@ -12559,42 +11348,38 @@ snapshots: '@types/serve-static@1.15.10': dependencies: '@types/http-errors': 2.0.5 - '@types/node': 22.19.11 + '@types/node': 22.19.17 '@types/send': 0.17.6 '@types/serve-static@2.2.0': dependencies: '@types/http-errors': 2.0.5 - '@types/node': 22.19.11 + '@types/node': 22.19.17 '@types/sockjs@0.3.36': dependencies: - '@types/node': 22.19.11 + '@types/node': 22.19.17 '@types/ssri@7.1.5': dependencies: - '@types/node': 22.19.11 + '@types/node': 22.19.17 '@types/stack-trace@0.0.33': {} '@types/tar-stream@3.1.4': dependencies: - '@types/node': 22.19.11 + '@types/node': 22.19.17 '@types/watchpack@2.4.5': dependencies: '@types/graceful-fs': 4.1.9 - '@types/node': 22.19.11 + '@types/node': 22.19.17 '@types/which@3.0.4': {} - '@types/ws@7.4.7': - dependencies: - '@types/node': 22.19.11 - '@types/ws@8.18.1': dependencies: - '@types/node': 22.19.11 + '@types/node': 22.19.17 '@types/yargs-parser@21.0.3': {} @@ -12606,118 +11391,120 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 22.19.11 + '@types/node': 22.19.17 optional: true - '@typescript-eslint/eslint-plugin@8.55.0(@typescript-eslint/parser@8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.57.2(@typescript-eslint/parser@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.55.0 - '@typescript-eslint/type-utils': 8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/utils': 8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.55.0 - eslint: 9.39.2(jiti@2.6.1) + '@typescript-eslint/parser': 8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2) + '@typescript-eslint/scope-manager': 8.57.2 + '@typescript-eslint/type-utils': 8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2) + '@typescript-eslint/utils': 8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2) + '@typescript-eslint/visitor-keys': 8.57.2 + eslint: 10.1.0(jiti@2.6.1) ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.4.0(typescript@5.9.3) - typescript: 5.9.3 + ts-api-utils: 2.5.0(typescript@6.0.2) + typescript: 6.0.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/parser@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2)': dependencies: - '@typescript-eslint/scope-manager': 8.55.0 - '@typescript-eslint/types': 8.55.0 - '@typescript-eslint/typescript-estree': 8.55.0(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.55.0 + '@typescript-eslint/scope-manager': 8.57.2 + '@typescript-eslint/types': 8.57.2 + '@typescript-eslint/typescript-estree': 8.57.2(typescript@6.0.2) + '@typescript-eslint/visitor-keys': 8.57.2 debug: 4.4.3(supports-color@10.2.2) - eslint: 9.39.2(jiti@2.6.1) - typescript: 5.9.3 + eslint: 10.1.0(jiti@2.6.1) + typescript: 6.0.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.55.0(typescript@5.9.3)': + '@typescript-eslint/project-service@8.57.2(typescript@6.0.2)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.55.0(typescript@5.9.3) - '@typescript-eslint/types': 8.55.0 + '@typescript-eslint/tsconfig-utils': 8.57.2(typescript@6.0.2) + '@typescript-eslint/types': 8.57.2 debug: 4.4.3(supports-color@10.2.2) - typescript: 5.9.3 + typescript: 6.0.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.55.0': + '@typescript-eslint/scope-manager@8.57.2': dependencies: - '@typescript-eslint/types': 8.55.0 - '@typescript-eslint/visitor-keys': 8.55.0 + '@typescript-eslint/types': 8.57.2 + '@typescript-eslint/visitor-keys': 8.57.2 - '@typescript-eslint/tsconfig-utils@8.55.0(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.57.2(typescript@6.0.2)': dependencies: - typescript: 5.9.3 + typescript: 6.0.2 - '@typescript-eslint/type-utils@8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2)': dependencies: - '@typescript-eslint/types': 8.55.0 - '@typescript-eslint/typescript-estree': 8.55.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/types': 8.57.2 + '@typescript-eslint/typescript-estree': 8.57.2(typescript@6.0.2) + '@typescript-eslint/utils': 8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2) debug: 4.4.3(supports-color@10.2.2) - eslint: 9.39.2(jiti@2.6.1) - ts-api-utils: 2.4.0(typescript@5.9.3) - typescript: 5.9.3 + eslint: 10.1.0(jiti@2.6.1) + ts-api-utils: 2.5.0(typescript@6.0.2) + typescript: 6.0.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.55.0': {} + '@typescript-eslint/types@8.57.2': {} + + '@typescript-eslint/types@8.58.0': {} - '@typescript-eslint/typescript-estree@8.55.0(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.57.2(typescript@6.0.2)': dependencies: - '@typescript-eslint/project-service': 8.55.0(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.55.0(typescript@5.9.3) - '@typescript-eslint/types': 8.55.0 - '@typescript-eslint/visitor-keys': 8.55.0 + '@typescript-eslint/project-service': 8.57.2(typescript@6.0.2) + '@typescript-eslint/tsconfig-utils': 8.57.2(typescript@6.0.2) + '@typescript-eslint/types': 8.57.2 + '@typescript-eslint/visitor-keys': 8.57.2 debug: 4.4.3(supports-color@10.2.2) - minimatch: 9.0.5 + minimatch: 10.2.5 semver: 7.7.4 tinyglobby: 0.2.15 - ts-api-utils: 2.4.0(typescript@5.9.3) - typescript: 5.9.3 + ts-api-utils: 2.5.0(typescript@6.0.2) + typescript: 6.0.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/utils@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) - '@typescript-eslint/scope-manager': 8.55.0 - '@typescript-eslint/types': 8.55.0 - '@typescript-eslint/typescript-estree': 8.55.0(typescript@5.9.3) - eslint: 9.39.2(jiti@2.6.1) - typescript: 5.9.3 + '@eslint-community/eslint-utils': 4.9.1(eslint@10.1.0(jiti@2.6.1)) + '@typescript-eslint/scope-manager': 8.57.2 + '@typescript-eslint/types': 8.57.2 + '@typescript-eslint/typescript-estree': 8.57.2(typescript@6.0.2) + eslint: 10.1.0(jiti@2.6.1) + typescript: 6.0.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.55.0': + '@typescript-eslint/visitor-keys@8.57.2': dependencies: - '@typescript-eslint/types': 8.55.0 - eslint-visitor-keys: 4.2.1 + '@typescript-eslint/types': 8.57.2 + eslint-visitor-keys: 5.0.1 - '@verdaccio/auth@8.0.0-next-8.29': + '@verdaccio/auth@8.0.0-next-8.33': dependencies: - '@verdaccio/config': 8.0.0-next-8.29 - '@verdaccio/core': 8.0.0-next-8.29 - '@verdaccio/loaders': 8.0.0-next-8.19 - '@verdaccio/signature': 8.0.0-next-8.21 + '@verdaccio/config': 8.0.0-next-8.33 + '@verdaccio/core': 8.0.0-next-8.33 + '@verdaccio/loaders': 8.0.0-next-8.23 + '@verdaccio/signature': 8.0.0-next-8.25 debug: 4.4.3(supports-color@10.2.2) - lodash: 4.17.21 - verdaccio-htpasswd: 13.0.0-next-8.29 + lodash: 4.17.23 + verdaccio-htpasswd: 13.0.0-next-8.33 transitivePeerDependencies: - supports-color - '@verdaccio/config@8.0.0-next-8.29': + '@verdaccio/config@8.0.0-next-8.33': dependencies: - '@verdaccio/core': 8.0.0-next-8.29 + '@verdaccio/core': 8.0.0-next-8.33 debug: 4.4.3(supports-color@10.2.2) js-yaml: 4.1.1 - lodash: 4.17.21 + lodash: 4.17.23 transitivePeerDependencies: - supports-color @@ -12730,14 +11517,14 @@ snapshots: process-warning: 1.0.0 semver: 7.7.2 - '@verdaccio/core@8.0.0-next-8.29': + '@verdaccio/core@8.0.0-next-8.33': dependencies: - ajv: 8.17.1 - http-errors: 2.0.0 + ajv: 8.18.0 + http-errors: 2.0.1 http-status-codes: 2.3.0 - minimatch: 7.4.6 + minimatch: 7.4.9 process-warning: 1.0.0 - semver: 7.7.3 + semver: 7.7.4 '@verdaccio/file-locking@10.3.1': dependencies: @@ -12747,21 +11534,21 @@ snapshots: dependencies: lockfile: 1.0.4 - '@verdaccio/hooks@8.0.0-next-8.29': + '@verdaccio/hooks@8.0.0-next-8.33': dependencies: - '@verdaccio/core': 8.0.0-next-8.29 - '@verdaccio/logger': 8.0.0-next-8.29 + '@verdaccio/core': 8.0.0-next-8.33 + '@verdaccio/logger': 8.0.0-next-8.33 debug: 4.4.3(supports-color@10.2.2) got-cjs: 12.5.4 handlebars: 4.7.8 transitivePeerDependencies: - supports-color - '@verdaccio/loaders@8.0.0-next-8.19': + '@verdaccio/loaders@8.0.0-next-8.23': dependencies: - '@verdaccio/core': 8.0.0-next-8.29 + '@verdaccio/core': 8.0.0-next-8.33 debug: 4.4.3(supports-color@10.2.2) - lodash: 4.17.21 + lodash: 4.17.23 transitivePeerDependencies: - supports-color @@ -12778,9 +11565,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@verdaccio/logger-commons@8.0.0-next-8.29': + '@verdaccio/logger-commons@8.0.0-next-8.33': dependencies: - '@verdaccio/core': 8.0.0-next-8.29 + '@verdaccio/core': 8.0.0-next-8.33 '@verdaccio/logger-prettify': 8.0.0-next-8.4 colorette: 2.0.20 debug: 4.4.3(supports-color@10.2.2) @@ -12796,32 +11583,32 @@ snapshots: pino-abstract-transport: 1.2.0 sonic-boom: 3.8.1 - '@verdaccio/logger@8.0.0-next-8.29': + '@verdaccio/logger@8.0.0-next-8.33': dependencies: - '@verdaccio/logger-commons': 8.0.0-next-8.29 + '@verdaccio/logger-commons': 8.0.0-next-8.33 pino: 9.14.0 transitivePeerDependencies: - supports-color - '@verdaccio/middleware@8.0.0-next-8.29': + '@verdaccio/middleware@8.0.0-next-8.33': dependencies: - '@verdaccio/config': 8.0.0-next-8.29 - '@verdaccio/core': 8.0.0-next-8.29 - '@verdaccio/url': 13.0.0-next-8.29 + '@verdaccio/config': 8.0.0-next-8.33 + '@verdaccio/core': 8.0.0-next-8.33 + '@verdaccio/url': 13.0.0-next-8.33 debug: 4.4.3(supports-color@10.2.2) express: 4.22.1 express-rate-limit: 5.5.1 - lodash: 4.17.21 + lodash: 4.17.23 lru-cache: 7.18.3 transitivePeerDependencies: - supports-color '@verdaccio/search-indexer@8.0.0-next-8.5': {} - '@verdaccio/signature@8.0.0-next-8.21': + '@verdaccio/signature@8.0.0-next-8.25': dependencies: - '@verdaccio/config': 8.0.0-next-8.29 - '@verdaccio/core': 8.0.0-next-8.29 + '@verdaccio/config': 8.0.0-next-8.33 + '@verdaccio/core': 8.0.0-next-8.33 debug: 4.4.3(supports-color@10.2.2) jsonwebtoken: 9.0.3 transitivePeerDependencies: @@ -12829,10 +11616,10 @@ snapshots: '@verdaccio/streams@10.2.1': {} - '@verdaccio/tarball@13.0.0-next-8.29': + '@verdaccio/tarball@13.0.0-next-8.33': dependencies: - '@verdaccio/core': 8.0.0-next-8.29 - '@verdaccio/url': 13.0.0-next-8.29 + '@verdaccio/core': 8.0.0-next-8.33 + '@verdaccio/url': 13.0.0-next-8.33 debug: 4.4.3(supports-color@10.2.2) gunzip-maybe: 1.4.2 tar-stream: 3.1.7 @@ -12841,250 +11628,80 @@ snapshots: - react-native-b4a - supports-color - '@verdaccio/ui-theme@8.0.0-next-8.29': {} + '@verdaccio/ui-theme@8.0.0-next-8.30': {} - '@verdaccio/url@13.0.0-next-8.29': + '@verdaccio/url@13.0.0-next-8.33': dependencies: - '@verdaccio/core': 8.0.0-next-8.29 + '@verdaccio/core': 8.0.0-next-8.33 debug: 4.4.3(supports-color@10.2.2) validator: 13.15.26 transitivePeerDependencies: - supports-color - '@verdaccio/utils@8.1.0-next-8.29': + '@verdaccio/utils@8.1.0-next-8.33': dependencies: - '@verdaccio/core': 8.0.0-next-8.29 - lodash: 4.17.21 - minimatch: 7.4.6 + '@verdaccio/core': 8.0.0-next-8.33 + lodash: 4.17.23 + minimatch: 7.4.9 - '@vitejs/plugin-basic-ssl@2.1.4(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.4.2)(sass@1.97.3)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': + '@vitejs/plugin-basic-ssl@2.3.0(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(less@4.6.4)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))': dependencies: - vite: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.4.2)(sass@1.97.3)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@24.12.0)(jiti@2.6.1)(less@4.6.4)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) - '@vitest/coverage-v8@4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(jiti@2.6.1)(jsdom@28.1.0)(less@4.4.2)(sass@1.97.3)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': + '@vitest/coverage-v8@4.1.2(vitest@4.1.2)': dependencies: '@bcoe/v8-coverage': 1.0.2 - '@vitest/utils': 4.0.18 - ast-v8-to-istanbul: 0.3.11 + '@vitest/utils': 4.1.2 + ast-v8-to-istanbul: 1.0.0 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 istanbul-reports: 3.2.0 magicast: 0.5.2 obug: 2.1.1 - std-env: 3.10.0 - tinyrainbow: 3.0.3 - vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(jiti@2.6.1)(jsdom@28.1.0)(less@4.4.2)(sass@1.97.3)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + std-env: 4.0.0 + tinyrainbow: 3.1.0 + vitest: 4.1.2(@opentelemetry/api@1.9.1)(@types/node@24.12.0)(@vitest/coverage-v8@4.1.2)(jiti@2.6.1)(jsdom@29.0.1)(less@4.6.4)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) - '@vitest/expect@4.0.18': + '@vitest/expect@4.1.2': dependencies: '@standard-schema/spec': 1.1.0 '@types/chai': 5.2.3 - '@vitest/spy': 4.0.18 - '@vitest/utils': 4.0.18 + '@vitest/spy': 4.1.2 + '@vitest/utils': 4.1.2 chai: 6.2.2 - tinyrainbow: 3.0.3 + tinyrainbow: 3.1.0 - '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.4.2)(sass@1.97.3)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': + '@vitest/mocker@4.1.2(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(less@4.6.4)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))': dependencies: - '@vitest/spy': 4.0.18 + '@vitest/spy': 4.1.2 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.4.2)(sass@1.97.3)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@24.12.0)(jiti@2.6.1)(less@4.6.4)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) - '@vitest/pretty-format@4.0.18': + '@vitest/pretty-format@4.1.2': dependencies: - tinyrainbow: 3.0.3 + tinyrainbow: 3.1.0 - '@vitest/runner@4.0.18': + '@vitest/runner@4.1.2': dependencies: - '@vitest/utils': 4.0.18 + '@vitest/utils': 4.1.2 pathe: 2.0.3 - '@vitest/snapshot@4.0.18': + '@vitest/snapshot@4.1.2': dependencies: - '@vitest/pretty-format': 4.0.18 + '@vitest/pretty-format': 4.1.2 + '@vitest/utils': 4.1.2 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@4.0.18': {} - - '@vitest/utils@4.0.18': - dependencies: - '@vitest/pretty-format': 4.0.18 - tinyrainbow: 3.0.3 - - '@web/browser-logs@0.4.1': - dependencies: - errorstacks: 2.4.1 - - '@web/config-loader@0.3.3': {} - - '@web/dev-server-core@0.7.5(bufferutil@4.1.0)': - dependencies: - '@types/koa': 2.15.0 - '@types/ws': 7.4.7 - '@web/parse5-utils': 2.1.1 - chokidar: 4.0.3 - clone: 2.1.2 - es-module-lexer: 1.7.0 - get-stream: 6.0.1 - is-stream: 2.0.1 - isbinaryfile: 5.0.7 - koa: 2.16.3 - koa-etag: 4.0.0 - koa-send: 5.0.1 - koa-static: 5.0.0 - lru-cache: 8.0.5 - mime-types: 2.1.35 - parse5: 6.0.1 - picomatch: 2.3.1 - ws: 7.5.10(bufferutil@4.1.0) - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - '@web/dev-server-rollup@0.6.4(bufferutil@4.1.0)': - dependencies: - '@rollup/plugin-node-resolve': 15.3.1(rollup@4.57.1) - '@web/dev-server-core': 0.7.5(bufferutil@4.1.0) - nanocolors: 0.2.13 - parse5: 6.0.1 - rollup: 4.57.1 - whatwg-url: 14.2.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - '@web/dev-server@0.4.6(bufferutil@4.1.0)': - dependencies: - '@babel/code-frame': 7.29.0 - '@types/command-line-args': 5.2.3 - '@web/config-loader': 0.3.3 - '@web/dev-server-core': 0.7.5(bufferutil@4.1.0) - '@web/dev-server-rollup': 0.6.4(bufferutil@4.1.0) - camelcase: 6.3.0 - command-line-args: 5.2.1 - command-line-usage: 7.0.3 - debounce: 1.2.1 - deepmerge: 4.3.1 - internal-ip: 6.2.0 - nanocolors: 0.2.13 - open: 8.4.2 - portfinder: 1.0.38 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - '@web/parse5-utils@2.1.1': - dependencies: - '@types/parse5': 6.0.3 - parse5: 6.0.1 - - '@web/test-runner-chrome@0.18.1(bufferutil@4.1.0)': - dependencies: - '@web/test-runner-core': 0.13.4(bufferutil@4.1.0) - '@web/test-runner-coverage-v8': 0.8.0(bufferutil@4.1.0) - chrome-launcher: 0.15.2 - puppeteer-core: 24.37.3(bufferutil@4.1.0) - transitivePeerDependencies: - - bare-abort-controller - - bare-buffer - - bufferutil - - react-native-b4a - - supports-color - - utf-8-validate - - '@web/test-runner-commands@0.9.0(bufferutil@4.1.0)': - dependencies: - '@web/test-runner-core': 0.13.4(bufferutil@4.1.0) - mkdirp: 1.0.4 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - '@web/test-runner-core@0.13.4(bufferutil@4.1.0)': - dependencies: - '@babel/code-frame': 7.29.0 - '@types/babel__code-frame': 7.27.0 - '@types/co-body': 6.1.3 - '@types/convert-source-map': 2.0.3 - '@types/debounce': 1.2.4 - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports': 3.0.4 - '@web/browser-logs': 0.4.1 - '@web/dev-server-core': 0.7.5(bufferutil@4.1.0) - chokidar: 4.0.3 - cli-cursor: 3.1.0 - co-body: 6.2.0 - convert-source-map: 2.0.0 - debounce: 1.2.1 - dependency-graph: 0.11.0 - globby: 11.1.0 - internal-ip: 6.2.0 - istanbul-lib-coverage: 3.2.2 - istanbul-lib-report: 3.0.1 - istanbul-reports: 3.2.0 - log-update: 4.0.0 - nanocolors: 0.2.13 - nanoid: 3.3.11 - open: 8.4.2 - picomatch: 2.3.1 - source-map: 0.7.6 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - '@web/test-runner-coverage-v8@0.8.0(bufferutil@4.1.0)': - dependencies: - '@web/test-runner-core': 0.13.4(bufferutil@4.1.0) - istanbul-lib-coverage: 3.2.2 - lru-cache: 8.0.5 - picomatch: 2.3.1 - v8-to-istanbul: 9.3.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate + '@vitest/spy@4.1.2': {} - '@web/test-runner-mocha@0.9.0(bufferutil@4.1.0)': + '@vitest/utils@4.1.2': dependencies: - '@web/test-runner-core': 0.13.4(bufferutil@4.1.0) - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - '@web/test-runner@0.20.2(bufferutil@4.1.0)': - dependencies: - '@web/browser-logs': 0.4.1 - '@web/config-loader': 0.3.3 - '@web/dev-server': 0.4.6(bufferutil@4.1.0) - '@web/test-runner-chrome': 0.18.1(bufferutil@4.1.0) - '@web/test-runner-commands': 0.9.0(bufferutil@4.1.0) - '@web/test-runner-core': 0.13.4(bufferutil@4.1.0) - '@web/test-runner-mocha': 0.9.0(bufferutil@4.1.0) - camelcase: 6.3.0 - command-line-args: 5.2.1 - command-line-usage: 7.0.3 + '@vitest/pretty-format': 4.1.2 convert-source-map: 2.0.0 - diff: 5.2.2 - globby: 11.1.0 - nanocolors: 0.2.13 - portfinder: 1.0.38 - source-map: 0.7.6 - transitivePeerDependencies: - - bare-abort-controller - - bare-buffer - - bufferutil - - react-native-b4a - - supports-color - - utf-8-validate + tinyrainbow: 3.1.0 '@webassemblyjs/ast@1.14.1': dependencies: @@ -13162,7 +11779,7 @@ snapshots: '@webassemblyjs/ast': 1.14.1 '@xtuc/long': 4.2.2 - '@xmldom/xmldom@0.8.11': {} + '@xmldom/xmldom@0.8.12': {} '@xtuc/ieee754@1.2.0': {} @@ -13191,32 +11808,22 @@ snapshots: mime-types: 3.0.2 negotiator: 1.0.0 - acorn-import-phases@1.0.4(acorn@8.15.0): + acorn-import-phases@1.0.4(acorn@8.16.0): dependencies: - acorn: 8.15.0 + acorn: 8.16.0 - acorn-jsx@5.3.2(acorn@8.15.0): + acorn-jsx@5.3.2(acorn@8.16.0): dependencies: - acorn: 8.15.0 + acorn: 8.16.0 - acorn-walk@8.3.4: - dependencies: - acorn: 8.15.0 - - acorn@8.15.0: {} + acorn@8.16.0: {} adjust-sourcemap-loader@4.0.0: dependencies: loader-utils: 2.0.4 regex-parser: 2.3.1 - adm-zip@0.5.16: {} - - agent-base@4.3.0: - dependencies: - es6-promisify: 5.0.0 - - agent-base@6.0.2(supports-color@10.2.2): + agent-base@6.0.2: dependencies: debug: 4.4.3(supports-color@10.2.2) transitivePeerDependencies: @@ -13224,6 +11831,8 @@ snapshots: agent-base@7.1.4: {} + agent-base@9.0.0: {} + ajv-formats@2.1.1: dependencies: ajv: 8.18.0 @@ -13237,7 +11846,7 @@ snapshots: ajv: 8.18.0 fast-deep-equal: 3.1.3 - ajv@6.12.6: + ajv@6.14.0: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 @@ -13258,43 +11867,35 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - algoliasearch@5.48.1: - dependencies: - '@algolia/abtesting': 1.14.1 - '@algolia/client-abtesting': 5.48.1 - '@algolia/client-analytics': 5.48.1 - '@algolia/client-common': 5.48.1 - '@algolia/client-insights': 5.48.1 - '@algolia/client-personalization': 5.48.1 - '@algolia/client-query-suggestions': 5.48.1 - '@algolia/client-search': 5.48.1 - '@algolia/ingestion': 1.48.1 - '@algolia/monitoring': 1.48.1 - '@algolia/recommend': 5.48.1 - '@algolia/requester-browser-xhr': 5.48.1 - '@algolia/requester-fetch': 5.48.1 - '@algolia/requester-node-http': 5.48.1 + algoliasearch@5.50.0: + dependencies: + '@algolia/abtesting': 1.16.0 + '@algolia/client-abtesting': 5.50.0 + '@algolia/client-analytics': 5.50.0 + '@algolia/client-common': 5.50.0 + '@algolia/client-insights': 5.50.0 + '@algolia/client-personalization': 5.50.0 + '@algolia/client-query-suggestions': 5.50.0 + '@algolia/client-search': 5.50.0 + '@algolia/ingestion': 1.50.0 + '@algolia/monitoring': 1.50.0 + '@algolia/recommend': 5.50.0 + '@algolia/requester-browser-xhr': 5.50.0 + '@algolia/requester-fetch': 5.50.0 + '@algolia/requester-node-http': 5.50.0 ansi-colors@4.1.3: {} - ansi-escapes@4.3.2: - dependencies: - type-fest: 0.21.3 - ansi-escapes@7.3.0: dependencies: environment: 1.1.0 ansi-html-community@0.0.8: {} - ansi-regex@2.1.1: {} - ansi-regex@5.0.1: {} ansi-regex@6.2.2: {} - ansi-styles@2.2.1: {} - ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 @@ -13304,18 +11905,12 @@ snapshots: anymatch@3.1.3: dependencies: normalize-path: 3.0.0 - picomatch: 2.3.1 + picomatch: 2.3.2 apache-md5@1.1.8: {} - arg@4.1.3: {} - argparse@2.0.1: {} - array-back@3.1.0: {} - - array-back@6.2.2: {} - array-buffer-byte-length@1.0.2: dependencies: call-bound: 1.0.4 @@ -13336,16 +11931,8 @@ snapshots: is-string: 1.1.1 math-intrinsics: 1.1.0 - array-union@1.0.2: - dependencies: - array-uniq: 1.0.3 - - array-union@2.1.0: {} - array-union@3.0.1: {} - array-uniq@1.0.3: {} - array.prototype.findlastindex@1.2.6: dependencies: call-bind: 1.0.8 @@ -13380,8 +11967,6 @@ snapshots: get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 - arrify@1.0.1: {} - arrify@2.0.1: {} asn1@0.2.6: @@ -13402,21 +11987,19 @@ snapshots: dependencies: tslib: 2.8.1 - ast-v8-to-istanbul@0.3.11: + ast-v8-to-istanbul@1.0.0: dependencies: '@jridgewell/trace-mapping': 0.3.31 estree-walker: 3.0.3 js-tokens: 10.0.0 - astral-regex@2.0.0: {} - async-each-series@0.1.1: {} async-function@1.0.0: {} async@2.6.4: dependencies: - lodash: 4.17.23 + lodash: 4.18.1 async@3.2.6: {} @@ -13424,13 +12007,13 @@ snapshots: atomic-sleep@1.0.0: {} - autoprefixer@10.4.24(postcss@8.5.6): + autoprefixer@10.4.27(postcss@8.5.8): dependencies: - browserslist: 4.28.1 - caniuse-lite: 1.0.30001770 + browserslist: 4.28.2 + caniuse-lite: 1.0.30001786 fraction.js: 5.3.4 picocolors: 1.1.1 - postcss: 8.5.6 + postcss: 8.5.8 postcss-value-parser: 4.2.0 available-typed-arrays@1.0.7: @@ -13441,19 +12024,20 @@ snapshots: aws4@1.13.2: {} - b4a@1.7.4: {} + b4a@1.8.0: {} - babel-loader@10.0.0(@babel/core@7.29.0)(webpack@5.105.2(esbuild@0.27.3)): + babel-loader@10.1.1(@babel/core@7.29.0)(webpack@5.105.4(esbuild@0.27.3)): dependencies: '@babel/core': 7.29.0 find-up: 5.0.0 - webpack: 5.105.2(esbuild@0.27.3) + optionalDependencies: + webpack: 5.105.4(esbuild@0.27.3) - babel-plugin-polyfill-corejs2@0.4.15(@babel/core@7.29.0): + babel-plugin-polyfill-corejs2@0.4.17(@babel/core@7.29.0): dependencies: '@babel/compat-data': 7.29.0 '@babel/core': 7.29.0 - '@babel/helper-define-polyfill-provider': 0.6.6(@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 @@ -13461,76 +12045,69 @@ snapshots: babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.29.0): dependencies: '@babel/core': 7.29.0 - '@babel/helper-define-polyfill-provider': 0.6.6(@babel/core@7.29.0) - core-js-compat: 3.48.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.0(@babel/core@7.29.0): + babel-plugin-polyfill-corejs3@0.14.2(@babel/core@7.29.0): dependencies: '@babel/core': 7.29.0 - '@babel/helper-define-polyfill-provider': 0.6.6(@babel/core@7.29.0) - core-js-compat: 3.48.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.6(@babel/core@7.29.0): + babel-plugin-polyfill-regenerator@0.6.8(@babel/core@7.29.0): dependencies: '@babel/core': 7.29.0 - '@babel/helper-define-polyfill-provider': 0.6.6(@babel/core@7.29.0) + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.0) transitivePeerDependencies: - supports-color balanced-match@1.0.2: {} - balanced-match@4.0.2: - dependencies: - jackspeak: 4.2.3 + balanced-match@4.0.4: {} bare-events@2.8.2: {} - bare-fs@4.5.4: + bare-fs@4.6.0: dependencies: bare-events: 2.8.2 bare-path: 3.0.0 - bare-stream: 2.7.0(bare-events@2.8.2) - bare-url: 2.3.2 + bare-stream: 2.12.0(bare-events@2.8.2) + bare-url: 2.4.0 fast-fifo: 1.3.2 transitivePeerDependencies: - bare-abort-controller - react-native-b4a - optional: true - bare-os@3.6.2: - optional: true + bare-os@3.8.7: {} bare-path@3.0.0: dependencies: - bare-os: 3.6.2 - optional: true + bare-os: 3.8.7 - bare-stream@2.7.0(bare-events@2.8.2): + bare-stream@2.12.0(bare-events@2.8.2): dependencies: - streamx: 2.23.0 + streamx: 2.25.0 + teex: 1.0.1 optionalDependencies: bare-events: 2.8.2 transitivePeerDependencies: - - bare-abort-controller - react-native-b4a - optional: true - bare-url@2.3.2: + bare-url@2.4.0: dependencies: bare-path: 3.0.0 - optional: true base64-js@1.5.1: {} base64id@2.0.0: {} - baseline-browser-mapping@2.9.19: {} + baseline-browser-mapping@2.10.16: {} - basic-ftp@5.1.0: {} + basic-ftp@5.2.0: {} batch@0.6.1: {} @@ -13548,9 +12125,9 @@ snapshots: domhandler: 5.0.3 htmlparser2: 10.1.0 picocolors: 1.1.1 - postcss: 8.5.6 + postcss: 8.5.8 postcss-media-query-parser: 0.2.3 - postcss-safe-parser: 7.0.1(postcss@8.5.6) + postcss-safe-parser: 7.0.1(postcss@8.5.8) before-after-hook@4.0.0: {} @@ -13566,16 +12143,6 @@ snapshots: binary-extensions@2.3.0: {} - bl@4.1.0: - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 - - blocking-proxy@1.0.1: - dependencies: - minimist: 1.2.8 - body-parser@1.20.4: dependencies: bytes: 3.1.2 @@ -13614,18 +12181,18 @@ snapshots: boolbase@1.0.0: {} - brace-expansion@1.1.12: + brace-expansion@1.1.13: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@2.0.2: + brace-expansion@2.0.3: dependencies: balanced-match: 1.0.2 - brace-expansion@5.0.2: + brace-expansion@5.0.5: dependencies: - balanced-match: 4.0.2 + balanced-match: 4.0.4 braces@3.0.3: dependencies: @@ -13644,7 +12211,7 @@ snapshots: async-each-series: 0.1.1 chalk: 4.1.2 connect-history-api-fallback: 1.6.0 - immutable: 3.8.2 + immutable: 3.8.3 server-destroy: 1.0.1 socket.io-client: 4.8.3(bufferutil@4.1.0)(utf-8-validate@6.0.6) stream-throttle: 0.1.3 @@ -13669,7 +12236,7 @@ snapshots: fresh: 0.5.2 fs-extra: 3.0.1 http-proxy: 1.18.1(debug@4.4.3) - immutable: 3.8.2 + immutable: 3.8.3 micromatch: 4.0.8 opn: 5.3.0 portscanner: 2.2.0 @@ -13693,19 +12260,13 @@ snapshots: dependencies: pako: 0.2.9 - browserslist@4.28.1: + browserslist@4.28.2: dependencies: - baseline-browser-mapping: 2.9.19 - caniuse-lite: 1.0.30001770 - electron-to-chromium: 1.5.286 - node-releases: 2.0.27 - update-browserslist-db: 1.2.3(browserslist@4.28.1) - - browserstack@1.6.1: - dependencies: - https-proxy-agent: 2.2.4 - transitivePeerDependencies: - - supports-color + baseline-browser-mapping: 2.10.16 + caniuse-lite: 1.0.30001786 + electron-to-chromium: 1.5.332 + node-releases: 2.0.37 + update-browserslist-db: 1.2.3(browserslist@4.28.2) bs-recipes@1.3.4: {} @@ -13715,11 +12276,6 @@ snapshots: buffer-from@1.1.2: {} - buffer@5.7.1: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - buffer@6.0.3: dependencies: base64-js: 1.5.1 @@ -13737,24 +12293,18 @@ snapshots: bytestreamjs@2.0.1: {} - cacache@20.0.3: + cacache@20.0.4: dependencies: '@npmcli/fs': 5.0.0 fs-minipass: 3.0.3 - glob: 13.0.3 - lru-cache: 11.2.6 - minipass: 7.1.2 + glob: 13.0.6 + lru-cache: 11.3.2 + minipass: 7.1.3 minipass-collect: 2.0.1 - minipass-flush: 1.0.5 + minipass-flush: 1.0.7 minipass-pipeline: 1.2.4 p-map: 7.0.4 ssri: 13.0.1 - unique-filename: 5.0.0 - - cache-content-type@1.0.1: - dependencies: - mime-types: 2.1.35 - ylru: 1.4.0 cacheable-lookup@6.1.0: {} @@ -13787,28 +12337,12 @@ snapshots: callsites@3.1.0: {} - camelcase@5.3.1: {} - - camelcase@6.3.0: {} - - caniuse-lite@1.0.30001770: {} + caniuse-lite@1.0.30001786: {} caseless@0.12.0: {} chai@6.2.2: {} - chalk-template@0.4.0: - dependencies: - chalk: 4.1.2 - - chalk@1.1.3: - dependencies: - ansi-styles: 2.2.1 - escape-string-regexp: 1.0.5 - has-ansi: 2.0.0 - strip-ansi: 3.0.1 - supports-color: 2.0.0 - chalk@4.1.2: dependencies: ansi-styles: 4.3.0 @@ -13846,31 +12380,16 @@ snapshots: dependencies: readdirp: 5.0.0 - chownr@1.1.4: {} - chownr@3.0.0: {} - chrome-launcher@0.15.2: - dependencies: - '@types/node': 22.19.11 - escape-string-regexp: 4.0.0 - is-wsl: 2.2.0 - lighthouse-logger: 1.4.2 - transitivePeerDependencies: - - supports-color - chrome-trace-event@1.0.4: {} - chromium-bidi@14.0.0(devtools-protocol@0.0.1566079): + chromium-bidi@14.0.0(devtools-protocol@0.0.1581282): dependencies: - devtools-protocol: 0.0.1566079 + devtools-protocol: 0.0.1581282 mitt: 3.0.1 zod: 3.25.76 - cli-cursor@3.1.0: - dependencies: - restore-cursor: 3.1.0 - cli-cursor@5.0.0: dependencies: restore-cursor: 5.1.0 @@ -13881,10 +12400,10 @@ snapshots: cli-spinners@3.4.0: {} - cli-truncate@5.1.1: + cli-truncate@5.2.0: dependencies: - slice-ansi: 7.1.2 - string-width: 8.1.1 + slice-ansi: 8.0.0 + string-width: 8.2.0 cli-width@4.1.0: {} @@ -13892,12 +12411,6 @@ snapshots: dependencies: typanion: 3.14.0 - cliui@6.0.0: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 6.2.0 - cliui@7.0.4: dependencies: string-width: 4.2.3 @@ -13913,7 +12426,7 @@ snapshots: cliui@9.0.1: dependencies: string-width: 7.2.0 - strip-ansi: 7.1.2 + strip-ansi: 7.2.0 wrap-ansi: 9.0.2 clone-deep@4.0.1: @@ -13926,19 +12439,7 @@ snapshots: dependencies: mimic-response: 1.0.1 - clone@2.1.2: {} - - co-body@6.2.0: - dependencies: - '@hapi/bourne': 3.0.0 - inflation: 2.1.0 - qs: 6.15.0 - raw-body: 2.5.3 - type-is: 1.6.18 - - co@4.6.0: {} - - collection-utils@1.0.1: {} + collection-utils@1.0.1: {} color-convert@2.0.1: dependencies: @@ -13954,20 +12455,6 @@ snapshots: dependencies: delayed-stream: 1.0.0 - command-line-args@5.2.1: - dependencies: - array-back: 3.1.0 - find-replace: 3.0.0 - lodash.camelcase: 4.3.0 - typical: 4.0.0 - - command-line-usage@7.0.3: - dependencies: - array-back: 6.2.2 - chalk-template: 0.4.0 - table-layout: 4.1.1 - typical: 7.3.0 - commander@14.0.3: {} commander@2.20.3: {} @@ -14028,8 +12515,9 @@ snapshots: conventional-commits-filter@5.0.0: {} - conventional-commits-parser@6.2.1: + conventional-commits-parser@6.4.0: dependencies: + '@simple-libs/stream-utils': 1.2.0 meow: 13.2.0 convert-source-map@1.9.0: {} @@ -14042,58 +12530,40 @@ snapshots: cookie@0.7.2: {} - cookies@0.9.1: - dependencies: - depd: 2.0.0 - keygrip: 1.1.0 - - copy-anything@2.0.6: + copy-anything@3.0.5: dependencies: - is-what: 3.14.1 + is-what: 4.1.16 - copy-webpack-plugin@13.0.1(webpack@5.105.2(esbuild@0.27.3)): + copy-webpack-plugin@14.0.0(webpack@5.105.4(esbuild@0.27.3)): dependencies: glob-parent: 6.0.2 normalize-path: 3.0.0 schema-utils: 4.3.3 - serialize-javascript: 6.0.2 + serialize-javascript: 7.0.5 tinyglobby: 0.2.15 - webpack: 5.105.2(esbuild@0.27.3) + webpack: 5.105.4(esbuild@0.27.3) - core-js-compat@3.48.0: + core-js-compat@3.49.0: dependencies: - browserslist: 4.28.1 + browserslist: 4.28.2 core-util-is@1.0.2: {} core-util-is@1.0.3: {} - cors@2.8.5: - dependencies: - object-assign: 4.1.1 - vary: 1.1.2 - cors@2.8.6: dependencies: object-assign: 4.1.1 vary: 1.1.2 - cosmiconfig@9.0.0(typescript@5.9.3): + cosmiconfig@9.0.1(typescript@6.0.2): dependencies: env-paths: 2.2.1 import-fresh: 3.3.1 js-yaml: 4.1.1 parse-json: 5.2.0 optionalDependencies: - typescript: 5.9.3 - - create-require@1.1.1: {} - - cross-fetch@3.1.5(encoding@0.1.13): - dependencies: - node-fetch: 2.6.7(encoding@0.1.13) - transitivePeerDependencies: - - encoding + typescript: 6.0.2 cross-fetch@4.1.0(encoding@0.1.13): dependencies: @@ -14107,18 +12577,18 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - css-loader@7.1.3(webpack@5.105.2(esbuild@0.27.3)): + css-loader@7.1.4(webpack@5.105.4(esbuild@0.27.3)): dependencies: - icss-utils: 5.1.0(postcss@8.5.6) - postcss: 8.5.6 - postcss-modules-extract-imports: 3.1.0(postcss@8.5.6) - postcss-modules-local-by-default: 4.2.0(postcss@8.5.6) - postcss-modules-scope: 3.2.1(postcss@8.5.6) - postcss-modules-values: 4.0.0(postcss@8.5.6) + icss-utils: 5.1.0(postcss@8.5.8) + postcss: 8.5.8 + postcss-modules-extract-imports: 3.1.0(postcss@8.5.8) + postcss-modules-local-by-default: 4.2.0(postcss@8.5.8) + postcss-modules-scope: 3.2.1(postcss@8.5.8) + postcss-modules-values: 4.0.0(postcss@8.5.8) postcss-value-parser: 4.2.0 semver: 7.7.4 optionalDependencies: - webpack: 5.105.2(esbuild@0.27.3) + webpack: 5.105.4(esbuild@0.27.3) css-select@6.0.0: dependencies: @@ -14128,22 +12598,15 @@ snapshots: domutils: 3.2.2 nth-check: 2.1.1 - css-tree@3.1.0: + css-tree@3.2.1: dependencies: - mdn-data: 2.12.2 + mdn-data: 2.27.1 source-map-js: 1.2.1 css-what@7.0.0: {} cssesc@3.0.0: {} - cssstyle@6.0.1: - dependencies: - '@asamuzakjp/css-color': 4.1.2 - '@csstools/css-syntax-patches-for-csstree': 1.0.27 - css-tree: 3.1.0 - lru-cache: 11.2.6 - custom-event@1.0.1: {} dashdash@1.14.1: @@ -14157,7 +12620,7 @@ snapshots: data-urls@7.0.0: dependencies: whatwg-mimetype: 5.0.0 - whatwg-url: 16.0.0 + whatwg-url: 16.0.1 transitivePeerDependencies: - '@noble/hashes' @@ -14183,8 +12646,6 @@ snapshots: dayjs@1.11.13: {} - debounce@1.2.1: {} - debug@2.6.9: dependencies: ms: 2.0.0 @@ -14213,16 +12674,12 @@ snapshots: optionalDependencies: supports-color: 10.2.2 - decamelize@1.2.0: {} - decimal.js@10.6.0: {} decompress-response@6.0.0: dependencies: mimic-response: 3.1.0 - deep-equal@1.0.1: {} - deep-is@0.1.4: {} deepmerge@4.3.1: {} @@ -14234,10 +12691,6 @@ snapshots: bundle-name: 4.1.0 default-browser-id: 5.0.1 - default-gateway@6.0.3: - dependencies: - execa: 5.1.1 - defer-to-connect@2.0.1: {} define-data-property@1.1.4: @@ -14246,8 +12699,6 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - define-lazy-prop@2.0.0: {} - define-lazy-prop@3.0.0: {} define-properties@1.2.1: @@ -14256,7 +12707,7 @@ snapshots: has-property-descriptors: 1.0.2 object-keys: 1.1.1 - defu@6.1.4: {} + defu@6.1.7: {} degenerator@5.0.1: dependencies: @@ -14264,26 +12715,12 @@ snapshots: escodegen: 2.1.0 esprima: 4.0.1 - del@2.2.2: - dependencies: - globby: 5.0.0 - is-path-cwd: 1.0.0 - is-path-in-cwd: 1.0.1 - object-assign: 4.1.1 - pify: 2.3.0 - pinkie-promise: 2.0.1 - rimraf: 2.7.1 - delayed-stream@1.0.0: {} - delegates@1.0.0: {} - depd@1.1.2: {} depd@2.0.0: {} - dependency-graph@0.11.0: {} - dependency-graph@1.0.0: {} destroy@1.2.0: {} @@ -14295,20 +12732,10 @@ snapshots: dev-ip@1.0.1: {} - devtools-protocol@0.0.1045489: {} - - devtools-protocol@0.0.1566079: {} + devtools-protocol@0.0.1581282: {} di@0.0.1: {} - diff@4.0.4: {} - - diff@5.2.2: {} - - dir-glob@3.0.1: - dependencies: - path-type: 4.0.0 - dns-packet@5.6.1: dependencies: '@leichtgewicht/ip-codec': 2.0.5 @@ -14366,7 +12793,7 @@ snapshots: easy-extender@2.3.4: dependencies: - lodash: 4.17.23 + lodash: 4.18.1 eazy-logger@4.1.0: dependencies: @@ -14383,11 +12810,9 @@ snapshots: ee-first@1.1.1: {} - ejs@4.0.1: - dependencies: - jake: 10.9.4 + ejs@5.0.1: {} - electron-to-chromium@1.5.286: {} + electron-to-chromium@1.5.332: {} emoji-regex@10.6.0: {} @@ -14423,10 +12848,11 @@ snapshots: engine.io-parser@5.2.3: {} - engine.io@6.6.5(bufferutil@4.1.0)(utf-8-validate@6.0.6): + engine.io@6.6.6(bufferutil@4.1.0)(utf-8-validate@6.0.6): dependencies: '@types/cors': 2.8.19 - '@types/node': 22.19.11 + '@types/node': 22.19.17 + '@types/ws': 8.18.1 accepts: 1.3.8 base64id: 2.0.0 cookie: 0.7.2 @@ -14439,10 +12865,10 @@ snapshots: - supports-color - utf-8-validate - enhanced-resolve@5.19.0: + enhanced-resolve@5.20.1: dependencies: graceful-fs: 4.2.11 - tapable: 2.3.0 + tapable: 2.3.2 ent@2.2.2: dependencies: @@ -14459,12 +12885,10 @@ snapshots: env-paths@2.2.1: {} - envinfo@7.15.0: {} + envinfo@7.21.0: {} environment@1.1.0: {} - err-code@2.0.3: {} - errno@0.1.8: dependencies: prr: 1.0.1 @@ -14474,8 +12898,6 @@ snapshots: dependencies: is-arrayish: 0.2.1 - errorstacks@2.4.1: {} - es-abstract@1.24.1: dependencies: array-buffer-byte-length: 1.0.2 @@ -14537,8 +12959,6 @@ snapshots: es-errors@1.3.0: {} - es-module-lexer@1.7.0: {} - es-module-lexer@2.0.0: {} es-object-atoms@1.1.1: @@ -14562,12 +12982,6 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - es6-promise@4.2.8: {} - - es6-promisify@5.0.0: - dependencies: - es6-promise: 4.2.8 - esbuild-wasm@0.27.3: {} esbuild@0.27.3: @@ -14603,8 +13017,6 @@ snapshots: escape-html@1.0.3: {} - escape-string-regexp@1.0.5: {} - escape-string-regexp@4.0.0: {} escodegen@2.1.0: @@ -14615,33 +13027,29 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@2.6.1)): + eslint-config-prettier@10.1.8(eslint@10.1.0(jiti@2.6.1)): dependencies: - eslint: 9.39.2(jiti@2.6.1) + eslint: 10.1.0(jiti@2.6.1) - eslint-import-resolver-node@0.3.9: + eslint-import-resolver-node@0.3.10: dependencies: debug: 3.2.7 is-core-module: 2.16.1 - resolve: 1.22.11 + resolve: 2.0.0-next.6 transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.6.1)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2))(eslint-import-resolver-node@0.3.10)(eslint@10.1.0(jiti@2.6.1)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - eslint: 9.39.2(jiti@2.6.1) - eslint-import-resolver-node: 0.3.9 + '@typescript-eslint/parser': 8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2) + eslint: 10.1.0(jiti@2.6.1) + eslint-import-resolver-node: 0.3.10 transitivePeerDependencies: - supports-color - eslint-plugin-header@3.1.1(eslint@9.39.2(jiti@2.6.1)): - dependencies: - eslint: 9.39.2(jiti@2.6.1) - - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.1.0(jiti@2.6.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -14650,13 +13058,13 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.39.2(jiti@2.6.1) - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.6.1)) + eslint: 10.1.0(jiti@2.6.1) + eslint-import-resolver-node: 0.3.10 + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2))(eslint-import-resolver-node@0.3.10)(eslint@10.1.0(jiti@2.6.1)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 - minimatch: 3.1.2 + minimatch: 3.1.5 object.fromentries: 2.0.8 object.groupby: 1.0.3 object.values: 1.2.1 @@ -14664,7 +13072,7 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -14675,8 +13083,10 @@ snapshots: esrecurse: 4.3.0 estraverse: 4.3.0 - eslint-scope@8.4.0: + eslint-scope@9.1.2: dependencies: + '@types/esrecurse': 4.3.1 + '@types/estree': 1.0.8 esrecurse: 4.3.0 estraverse: 5.3.0 @@ -14684,28 +13094,27 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.39.2(jiti@2.6.1): + eslint-visitor-keys@5.0.1: {} + + eslint@10.1.0(jiti@2.6.1): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.1.0(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.21.1 - '@eslint/config-helpers': 0.4.2 - '@eslint/core': 0.17.0 - '@eslint/eslintrc': 3.3.3 - '@eslint/js': 9.39.2 - '@eslint/plugin-kit': 0.4.1 + '@eslint/config-array': 0.23.4 + '@eslint/config-helpers': 0.5.4 + '@eslint/core': 1.2.0 + '@eslint/plugin-kit': 0.6.1 '@humanfs/node': 0.16.7 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 '@types/estree': 1.0.8 - ajv: 6.12.6 - chalk: 4.1.2 + ajv: 6.14.0 cross-spawn: 7.0.6 debug: 4.4.3(supports-color@10.2.2) escape-string-regexp: 4.0.0 - eslint-scope: 8.4.0 - eslint-visitor-keys: 4.2.1 - espree: 10.4.0 + eslint-scope: 9.1.2 + eslint-visitor-keys: 5.0.1 + espree: 11.2.0 esquery: 1.7.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -14716,8 +13125,7 @@ snapshots: imurmurhash: 0.1.4 is-glob: 4.0.3 json-stable-stringify-without-jsonify: 1.0.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 + minimatch: 10.2.5 natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: @@ -14727,10 +13135,16 @@ snapshots: espree@10.4.0: dependencies: - acorn: 8.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) eslint-visitor-keys: 4.2.1 + espree@11.2.0: + dependencies: + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) + eslint-visitor-keys: 5.0.1 + esprima@4.0.1: {} esquery@1.7.0: @@ -14777,30 +13191,16 @@ snapshots: dependencies: eventsource-parser: 3.0.6 - execa@5.1.1: - dependencies: - cross-spawn: 7.0.6 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - - exit@0.1.2: {} - expect-type@1.3.0: {} exponential-backoff@3.1.3: {} express-rate-limit@5.5.1: {} - express-rate-limit@8.2.1(express@5.2.1): + express-rate-limit@8.3.2(express@5.2.1): dependencies: express: 5.2.1 - ip-address: 10.0.1 + ip-address: 10.1.0 express@4.22.1: dependencies: @@ -14823,7 +13223,7 @@ snapshots: methods: 1.1.2 on-finished: 2.4.1 parseurl: 1.3.3 - path-to-regexp: 0.1.12 + path-to-regexp: 0.1.13 proxy-addr: 2.0.7 qs: 6.14.2 range-parser: 1.2.1 @@ -14875,7 +13275,7 @@ snapshots: extract-zip@2.0.1: dependencies: - debug: 4.3.4 + debug: 4.4.3(supports-color@10.2.2) get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: @@ -14927,9 +13327,9 @@ snapshots: dependencies: pend: 1.2.0 - fdir@6.5.0(picomatch@4.0.3): + fdir@6.5.0(picomatch@4.0.4): optionalDependencies: - picomatch: 4.0.3 + picomatch: 4.0.4 fetch-blob@3.2.0: dependencies: @@ -14940,10 +13340,6 @@ snapshots: dependencies: flat-cache: 4.0.1 - filelist@1.0.4: - dependencies: - minimatch: 5.1.6 - fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -15000,68 +13396,59 @@ snapshots: common-path-prefix: 3.0.0 pkg-dir: 8.0.0 - find-replace@3.0.0: - dependencies: - array-back: 3.1.0 - find-up-simple@1.0.1: {} - find-up@4.1.0: - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - find-up@5.0.0: dependencies: locate-path: 6.0.0 path-exists: 4.0.0 - firebase@12.8.0: + firebase@12.11.0: dependencies: - '@firebase/ai': 2.7.0(@firebase/app-types@0.9.3)(@firebase/app@0.14.7) - '@firebase/analytics': 0.10.19(@firebase/app@0.14.7) - '@firebase/analytics-compat': 0.2.25(@firebase/app-compat@0.5.7)(@firebase/app@0.14.7) - '@firebase/app': 0.14.7 - '@firebase/app-check': 0.11.0(@firebase/app@0.14.7) - '@firebase/app-check-compat': 0.4.0(@firebase/app-compat@0.5.7)(@firebase/app@0.14.7) - '@firebase/app-compat': 0.5.7 + '@firebase/ai': 2.10.0(@firebase/app-types@0.9.3)(@firebase/app@0.14.10) + '@firebase/analytics': 0.10.21(@firebase/app@0.14.10) + '@firebase/analytics-compat': 0.2.27(@firebase/app-compat@0.5.10)(@firebase/app@0.14.10) + '@firebase/app': 0.14.10 + '@firebase/app-check': 0.11.2(@firebase/app@0.14.10) + '@firebase/app-check-compat': 0.4.2(@firebase/app-compat@0.5.10)(@firebase/app@0.14.10) + '@firebase/app-compat': 0.5.10 '@firebase/app-types': 0.9.3 - '@firebase/auth': 1.12.0(@firebase/app@0.14.7) - '@firebase/auth-compat': 0.6.2(@firebase/app-compat@0.5.7)(@firebase/app-types@0.9.3)(@firebase/app@0.14.7) - '@firebase/data-connect': 0.3.12(@firebase/app@0.14.7) - '@firebase/database': 1.1.0 - '@firebase/database-compat': 2.1.0 - '@firebase/firestore': 4.10.0(@firebase/app@0.14.7) - '@firebase/firestore-compat': 0.4.4(@firebase/app-compat@0.5.7)(@firebase/app-types@0.9.3)(@firebase/app@0.14.7) - '@firebase/functions': 0.13.1(@firebase/app@0.14.7) - '@firebase/functions-compat': 0.4.1(@firebase/app-compat@0.5.7)(@firebase/app@0.14.7) - '@firebase/installations': 0.6.19(@firebase/app@0.14.7) - '@firebase/installations-compat': 0.2.19(@firebase/app-compat@0.5.7)(@firebase/app-types@0.9.3)(@firebase/app@0.14.7) - '@firebase/messaging': 0.12.23(@firebase/app@0.14.7) - '@firebase/messaging-compat': 0.2.23(@firebase/app-compat@0.5.7)(@firebase/app@0.14.7) - '@firebase/performance': 0.7.9(@firebase/app@0.14.7) - '@firebase/performance-compat': 0.2.22(@firebase/app-compat@0.5.7)(@firebase/app@0.14.7) - '@firebase/remote-config': 0.8.0(@firebase/app@0.14.7) - '@firebase/remote-config-compat': 0.2.21(@firebase/app-compat@0.5.7)(@firebase/app@0.14.7) - '@firebase/storage': 0.14.0(@firebase/app@0.14.7) - '@firebase/storage-compat': 0.4.0(@firebase/app-compat@0.5.7)(@firebase/app-types@0.9.3)(@firebase/app@0.14.7) - '@firebase/util': 1.13.0 + '@firebase/auth': 1.12.2(@firebase/app@0.14.10) + '@firebase/auth-compat': 0.6.4(@firebase/app-compat@0.5.10)(@firebase/app-types@0.9.3)(@firebase/app@0.14.10) + '@firebase/data-connect': 0.5.0(@firebase/app@0.14.10) + '@firebase/database': 1.1.2 + '@firebase/database-compat': 2.1.2 + '@firebase/firestore': 4.13.0(@firebase/app@0.14.10) + '@firebase/firestore-compat': 0.4.7(@firebase/app-compat@0.5.10)(@firebase/app-types@0.9.3)(@firebase/app@0.14.10) + '@firebase/functions': 0.13.3(@firebase/app@0.14.10) + '@firebase/functions-compat': 0.4.3(@firebase/app-compat@0.5.10)(@firebase/app@0.14.10) + '@firebase/installations': 0.6.21(@firebase/app@0.14.10) + '@firebase/installations-compat': 0.2.21(@firebase/app-compat@0.5.10)(@firebase/app-types@0.9.3)(@firebase/app@0.14.10) + '@firebase/messaging': 0.12.25(@firebase/app@0.14.10) + '@firebase/messaging-compat': 0.2.25(@firebase/app-compat@0.5.10)(@firebase/app@0.14.10) + '@firebase/performance': 0.7.11(@firebase/app@0.14.10) + '@firebase/performance-compat': 0.2.24(@firebase/app-compat@0.5.10)(@firebase/app@0.14.10) + '@firebase/remote-config': 0.8.2(@firebase/app@0.14.10) + '@firebase/remote-config-compat': 0.2.23(@firebase/app-compat@0.5.10)(@firebase/app@0.14.10) + '@firebase/storage': 0.14.2(@firebase/app@0.14.10) + '@firebase/storage-compat': 0.4.2(@firebase/app-compat@0.5.10)(@firebase/app-types@0.9.3)(@firebase/app@0.14.10) + '@firebase/util': 1.15.0 transitivePeerDependencies: - '@react-native-async-storage/async-storage' flat-cache@4.0.1: dependencies: - flatted: 3.3.3 + flatted: 3.4.2 keyv: 4.5.4 flat@5.0.2: {} - flatted@3.3.3: {} + flatted@3.4.2: {} - folder-hash@4.1.1(supports-color@10.2.2): + folder-hash@4.1.2(supports-color@10.2.2): dependencies: debug: 4.4.0(supports-color@10.2.2) - minimatch: 7.4.6 + minimatch: 7.4.9 transitivePeerDependencies: - supports-color @@ -15082,12 +13469,6 @@ snapshots: form-data-encoder@1.7.2: {} - form-data@2.3.3: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - form-data@4.0.5: dependencies: asynckit: 0.4.0 @@ -15108,8 +13489,6 @@ snapshots: fresh@2.0.0: {} - fs-constants@1.0.0: {} - fs-extra@3.0.1: dependencies: graceful-fs: 4.2.11 @@ -15124,7 +13503,7 @@ snapshots: fs-minipass@3.0.3: dependencies: - minipass: 7.1.2 + minipass: 7.1.3 fs.realpath@1.0.0: {} @@ -15144,18 +13523,17 @@ snapshots: functions-have-names@1.2.3: {} - gaxios@7.1.3(supports-color@10.2.2): + gaxios@7.1.4(supports-color@10.2.2): dependencies: extend: 3.0.2 https-proxy-agent: 7.0.6(supports-color@10.2.2) node-fetch: 3.3.2 - rimraf: 5.0.10 transitivePeerDependencies: - supports-color gcp-metadata@8.1.2(supports-color@10.2.2): dependencies: - gaxios: 7.1.3(supports-color@10.2.2) + gaxios: 7.1.4(supports-color@10.2.2) google-logging-utils: 1.1.3 json-bigint: 1.0.0 transitivePeerDependencies: @@ -15167,7 +13545,7 @@ snapshots: get-caller-file@2.0.5: {} - get-east-asian-width@1.4.0: {} + get-east-asian-width@1.5.0: {} get-intrinsic@1.3.0: dependencies: @@ -15191,7 +13569,7 @@ snapshots: get-stream@5.2.0: dependencies: - pump: 3.0.3 + pump: 3.0.4 get-stream@6.0.1: {} @@ -15201,13 +13579,13 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 - get-tsconfig@4.13.6: + get-tsconfig@4.13.7: dependencies: resolve-pkg-maps: 1.0.0 get-uri@6.0.5: dependencies: - basic-ftp: 5.1.0 + basic-ftp: 5.2.0 data-uri-to-buffer: 6.0.2 debug: 4.4.3(supports-color@10.2.2) transitivePeerDependencies: @@ -15217,14 +13595,6 @@ snapshots: dependencies: assert-plus: 1.0.0 - git-raw-commits@5.0.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.2.1): - dependencies: - '@conventional-changelog/git-client': 1.0.1(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.2.1) - meow: 13.2.0 - transitivePeerDependencies: - - conventional-commits-filter - - conventional-commits-parser - glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -15243,61 +13613,42 @@ snapshots: dependencies: foreground-child: 3.3.1 jackspeak: 3.4.3 - minimatch: 9.0.5 - minipass: 7.1.2 + minimatch: 9.0.9 + minipass: 7.1.3 package-json-from-dist: 1.0.1 path-scurry: 1.11.1 - glob@13.0.3: + glob@13.0.6: dependencies: - minimatch: 10.2.0 - minipass: 7.1.2 - path-scurry: 2.0.1 + minimatch: 10.2.5 + minipass: 7.1.3 + path-scurry: 2.0.2 glob@7.2.3: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 - minimatch: 3.1.2 + minimatch: 3.1.5 once: 1.4.0 path-is-absolute: 1.0.1 globals@14.0.0: {} - globals@17.3.0: {} + globals@17.4.0: {} globalthis@1.0.4: dependencies: define-properties: 1.2.1 gopd: 1.2.0 - globby@11.1.0: - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.3 - ignore: 5.3.2 - merge2: 1.4.1 - slash: 3.0.0 - - globby@5.0.0: - dependencies: - array-union: 1.0.2 - arrify: 1.0.1 - glob: 7.2.3 - object-assign: 4.1.1 - pify: 2.3.0 - pinkie-promise: 2.0.1 - - google-auth-library@10.5.0(supports-color@10.2.2): + google-auth-library@10.6.2(supports-color@10.2.2): dependencies: base64-js: 1.5.1 ecdsa-sig-formatter: 1.0.11 - gaxios: 7.1.3(supports-color@10.2.2) + gaxios: 7.1.4(supports-color@10.2.2) gcp-metadata: 8.1.2(supports-color@10.2.2) google-logging-utils: 1.1.3 - gtoken: 8.0.0(supports-color@10.2.2) jws: 4.0.1 transitivePeerDependencies: - supports-color @@ -15307,7 +13658,7 @@ snapshots: '@grpc/grpc-js': 1.14.3 '@grpc/proto-loader': 0.8.0 duplexify: 4.1.3 - google-auth-library: 10.5.0(supports-color@10.2.2) + google-auth-library: 10.6.2(supports-color@10.2.2) google-logging-utils: 1.1.3 node-fetch: 3.3.2 object-hash: 3.0.0 @@ -15339,25 +13690,18 @@ snapshots: graceful-fs@4.2.11: {} - graphql-tag@2.12.6(graphql@16.12.0): + graphql-tag@2.12.6(graphql@16.13.2): dependencies: - graphql: 16.12.0 + graphql: 16.13.2 tslib: 2.8.1 - graphql@16.12.0: {} + graphql@16.13.2: {} grpc-gcp@1.0.1(protobufjs@7.5.4): dependencies: '@grpc/grpc-js': 1.14.3 protobufjs: 7.5.4 - gtoken@8.0.0(supports-color@10.2.2): - dependencies: - gaxios: 7.1.3(supports-color@10.2.2) - jws: 4.0.1 - transitivePeerDependencies: - - supports-color - gunzip-maybe@1.4.2: dependencies: browserify-zlib: 0.1.4 @@ -15378,17 +13722,6 @@ snapshots: optionalDependencies: uglify-js: 3.19.3 - har-schema@2.0.0: {} - - har-validator@5.1.5: - dependencies: - ajv: 6.12.6 - har-schema: 2.0.0 - - has-ansi@2.0.0: - dependencies: - ansi-regex: 2.1.1 - has-bigints@1.1.0: {} has-flag@4.0.0: {} @@ -15411,11 +13744,11 @@ snapshots: dependencies: function-bind: 1.1.2 - hono@4.11.9: {} + hono@4.12.12: {} hosted-git-info@9.0.2: dependencies: - lru-cache: 11.2.6 + lru-cache: 11.3.2 hpack.js@2.1.6: dependencies: @@ -15426,7 +13759,7 @@ snapshots: html-encoding-sniffer@6.0.0: dependencies: - '@exodus/bytes': 1.14.1 + '@exodus/bytes': 1.15.0 transitivePeerDependencies: - '@noble/hashes' @@ -15441,22 +13774,10 @@ snapshots: domutils: 3.2.2 entities: 7.0.1 - http-assert@1.5.0: - dependencies: - deep-equal: 1.0.1 - http-errors: 1.8.1 - http-cache-semantics@4.2.0: {} http-deceiver@1.2.7: {} - http-errors@1.6.3: - dependencies: - depd: 1.1.2 - inherits: 2.0.3 - setprototypeof: 1.1.0 - statuses: 1.5.0 - http-errors@1.8.1: dependencies: depd: 1.1.2 @@ -15483,15 +13804,7 @@ snapshots: http-parser-js@0.5.10: {} - http-proxy-agent@5.0.0(supports-color@10.2.2): - dependencies: - '@tootallnate/once': 2.0.0 - agent-base: 6.0.2(supports-color@10.2.2) - debug: 4.4.3(supports-color@10.2.2) - transitivePeerDependencies: - - supports-color - - http-proxy-agent@7.0.2: + http-proxy-agent@7.0.2(supports-color@10.2.2): dependencies: agent-base: 7.1.4 debug: 4.4.3(supports-color@10.2.2) @@ -15529,12 +13842,6 @@ snapshots: transitivePeerDependencies: - debug - http-signature@1.2.0: - dependencies: - assert-plus: 1.0.0 - jsprim: 1.4.2 - sshpk: 1.18.0 - http-signature@1.4.0: dependencies: assert-plus: 1.0.0 @@ -15548,29 +13855,27 @@ snapshots: quick-lru: 5.1.1 resolve-alpn: 1.2.1 - https-proxy-agent@2.2.4: + https-proxy-agent@5.0.1: dependencies: - agent-base: 4.3.0 - debug: 3.2.7 + agent-base: 6.0.2 + debug: 4.4.3(supports-color@10.2.2) transitivePeerDependencies: - supports-color - https-proxy-agent@5.0.1(supports-color@10.2.2): + https-proxy-agent@7.0.6(supports-color@10.2.2): dependencies: - agent-base: 6.0.2(supports-color@10.2.2) + agent-base: 7.1.4 debug: 4.4.3(supports-color@10.2.2) transitivePeerDependencies: - supports-color - https-proxy-agent@7.0.6(supports-color@10.2.2): + https-proxy-agent@9.0.0: dependencies: - agent-base: 7.1.4 + agent-base: 9.0.0 debug: 4.4.3(supports-color@10.2.2) transitivePeerDependencies: - supports-color - human-signals@2.1.0: {} - husky@9.1.7: {} hyperdyperid@1.2.0: {} @@ -15587,9 +13892,9 @@ snapshots: dependencies: safer-buffer: 2.1.2 - icss-utils@5.1.0(postcss@8.5.6): + icss-utils@5.1.0(postcss@8.5.8): dependencies: - postcss: 8.5.6 + postcss: 8.5.8 idb@7.1.1: {} @@ -15597,7 +13902,7 @@ snapshots: ignore-walk@8.0.0: dependencies: - minimatch: 10.2.0 + minimatch: 10.2.5 ignore@5.3.2: {} @@ -15606,11 +13911,9 @@ snapshots: image-size@0.5.5: optional: true - immediate@3.0.6: {} + immutable@3.8.3: {} - immutable@3.8.2: {} - - immutable@5.1.4: {} + immutable@5.1.5: {} import-fresh@3.3.1: dependencies: @@ -15619,44 +13922,27 @@ snapshots: imurmurhash@0.1.4: {} - inflation@2.1.0: {} - inflight@1.0.6: dependencies: once: 1.4.0 wrappy: 1.0.2 - inherits@2.0.3: {} - inherits@2.0.4: {} - ini@1.3.8: {} - ini@6.0.0: {} injection-js@2.6.1: dependencies: tslib: 2.8.1 - internal-ip@6.2.0: - dependencies: - default-gateway: 6.0.3 - ipaddr.js: 1.9.1 - is-ip: 3.1.0 - p-event: 4.2.0 - internal-slot@1.1.0: dependencies: es-errors: 1.3.0 hasown: 2.0.2 side-channel: 1.1.0 - ip-address@10.0.1: {} - ip-address@10.1.0: {} - ip-regex@4.3.0: {} - ipaddr.js@1.9.1: {} ipaddr.js@2.3.0: {} @@ -15709,8 +13995,6 @@ snapshots: is-deflate@1.0.0: {} - is-docker@2.2.1: {} - is-docker@3.0.0: {} is-extglob@2.1.1: {} @@ -15723,7 +14007,7 @@ snapshots: is-fullwidth-code-point@5.1.0: dependencies: - get-east-asian-width: 1.4.0 + get-east-asian-width: 1.5.0 is-generator-function@1.1.2: dependencies: @@ -15747,17 +14031,13 @@ snapshots: is-interactive@2.0.0: {} - is-ip@3.1.0: - dependencies: - ip-regex: 4.3.0 - is-map@2.0.3: {} is-module@1.0.0: {} is-negative-zero@2.0.3: {} - is-network-error@1.3.0: {} + is-network-error@1.3.1: {} is-node-process@1.2.0: {} @@ -15772,16 +14052,6 @@ snapshots: is-number@7.0.0: {} - is-path-cwd@1.0.0: {} - - is-path-in-cwd@1.0.1: - dependencies: - is-path-inside: 1.0.1 - - is-path-inside@1.0.1: - dependencies: - path-is-inside: 1.0.2 - is-plain-obj@3.0.0: {} is-plain-object@2.0.4: @@ -15815,8 +14085,6 @@ snapshots: is-stream-ended@0.1.4: {} - is-stream@2.0.1: {} - is-string@1.1.1: dependencies: call-bound: 1.0.4 @@ -15849,14 +14117,10 @@ snapshots: call-bound: 1.0.4 get-intrinsic: 1.3.0 - is-what@3.14.1: {} + is-what@4.1.16: {} is-wsl@1.1.0: {} - is-wsl@2.2.0: - dependencies: - is-docker: 2.2.1 - is-wsl@3.1.1: dependencies: is-inside-container: 1.0.0 @@ -15869,12 +14133,8 @@ snapshots: isbinaryfile@4.0.10: {} - isbinaryfile@5.0.7: {} - isexe@2.0.0: {} - isexe@3.1.5: {} - isexe@4.0.0: {} isobject@3.0.1: {} @@ -15886,7 +14146,7 @@ snapshots: istanbul-lib-instrument@5.2.1: dependencies: '@babel/core': 7.29.0 - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -15896,7 +14156,7 @@ snapshots: istanbul-lib-instrument@6.0.3: dependencies: '@babel/core': 7.29.0 - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 7.7.4 @@ -15928,61 +14188,34 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jackspeak@4.2.3: - dependencies: - '@isaacs/cliui': 9.0.0 - - jake@10.9.4: - dependencies: - async: 3.2.6 - filelist: 1.0.4 - picocolors: 1.1.1 - - jasmine-core@2.8.0: {} - jasmine-core@4.6.1: {} - jasmine-core@5.13.0: {} - - jasmine-core@6.0.0: {} + jasmine-core@6.1.0: {} jasmine-reporters@2.5.2: dependencies: - '@xmldom/xmldom': 0.8.11 + '@xmldom/xmldom': 0.8.12 mkdirp: 1.0.4 jasmine-spec-reporter@7.0.0: dependencies: colors: 1.4.0 - jasmine@2.8.0: - dependencies: - exit: 0.1.2 - glob: 7.2.3 - jasmine-core: 2.8.0 - - jasmine@5.13.0: - dependencies: - glob: 10.5.0 - jasmine-core: 5.13.0 - - jasmine@6.0.0: + jasmine@6.1.0: dependencies: '@jasminejs/reporters': 1.0.0 - glob: 13.0.3 - jasmine-core: 6.0.0 - - jasminewd2@2.2.0: {} + glob: 13.0.6 + jasmine-core: 6.1.0 jest-worker@27.5.1: dependencies: - '@types/node': 22.19.11 + '@types/node': 22.19.17 merge-stream: 2.0.0 supports-color: 8.1.1 jiti@2.6.1: {} - jose@6.1.3: {} + jose@6.2.2: {} js-base64@3.7.8: {} @@ -15996,32 +14229,31 @@ snapshots: jsbn@0.1.1: {} - jsdom@28.1.0: + jsdom@29.0.1: dependencies: - '@acemir/cssom': 0.9.31 - '@asamuzakjp/dom-selector': 6.8.1 + '@asamuzakjp/css-color': 5.1.6 + '@asamuzakjp/dom-selector': 7.0.8 '@bramus/specificity': 2.4.2 - '@exodus/bytes': 1.14.1 - cssstyle: 6.0.1 + '@csstools/css-syntax-patches-for-csstree': 1.1.2(css-tree@3.2.1) + '@exodus/bytes': 1.15.0 + css-tree: 3.2.1 data-urls: 7.0.0 decimal.js: 10.6.0 html-encoding-sniffer: 6.0.0 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6(supports-color@10.2.2) is-potential-custom-element-name: 1.0.1 + lru-cache: 11.3.2 parse5: 8.0.0 saxes: 6.0.0 symbol-tree: 3.2.4 - tough-cookie: 6.0.0 - undici: 7.22.0 + tough-cookie: 6.0.1 + undici: 7.24.6 w3c-xmlserializer: 5.0.0 webidl-conversions: 8.0.1 whatwg-mimetype: 5.0.0 - whatwg-url: 16.0.0 + whatwg-url: 16.0.1 xml-name-validator: 5.0.0 transitivePeerDependencies: - '@noble/hashes' - - supports-color jsesc@3.1.0: {} @@ -16047,6 +14279,8 @@ snapshots: json-stringify-safe@5.0.1: {} + json-with-bigint@3.5.8: {} + json5@1.0.2: dependencies: minimist: 1.2.8 @@ -16078,13 +14312,6 @@ snapshots: ms: 2.1.3 semver: 7.7.4 - jsprim@1.4.2: - dependencies: - assert-plus: 1.0.0 - extsprintf: 1.3.0 - json-schema: 0.4.0 - verror: 1.10.0 - jsprim@2.0.2: dependencies: assert-plus: 1.0.0 @@ -16092,13 +14319,6 @@ snapshots: json-schema: 0.4.0 verror: 1.10.0 - jszip@3.10.1: - dependencies: - lie: 3.3.0 - pako: 1.0.11 - readable-stream: 2.3.8 - setimmediate: 1.0.5 - jwa@2.0.1: dependencies: buffer-equal-constant-time: 1.0.1 @@ -16121,26 +14341,26 @@ snapshots: istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 4.0.1 istanbul-reports: 3.2.0 - minimatch: 3.1.2 + minimatch: 3.1.5 transitivePeerDependencies: - supports-color - karma-jasmine-html-reporter@2.2.0(jasmine-core@5.13.0)(karma-jasmine@5.1.0(karma@6.4.4(bufferutil@4.1.0)))(karma@6.4.4(bufferutil@4.1.0)): + karma-jasmine-html-reporter@2.2.0(jasmine-core@6.1.0)(karma-jasmine@5.1.0(karma@6.4.4(bufferutil@4.1.0)(utf-8-validate@6.0.6)))(karma@6.4.4(bufferutil@4.1.0)(utf-8-validate@6.0.6)): dependencies: - jasmine-core: 5.13.0 - karma: 6.4.4(bufferutil@4.1.0) - karma-jasmine: 5.1.0(karma@6.4.4(bufferutil@4.1.0)) + jasmine-core: 6.1.0 + karma: 6.4.4(bufferutil@4.1.0)(utf-8-validate@6.0.6) + karma-jasmine: 5.1.0(karma@6.4.4(bufferutil@4.1.0)(utf-8-validate@6.0.6)) - karma-jasmine@5.1.0(karma@6.4.4(bufferutil@4.1.0)): + karma-jasmine@5.1.0(karma@6.4.4(bufferutil@4.1.0)(utf-8-validate@6.0.6)): dependencies: jasmine-core: 4.6.1 - karma: 6.4.4(bufferutil@4.1.0) + karma: 6.4.4(bufferutil@4.1.0)(utf-8-validate@6.0.6) karma-source-map-support@1.4.0: dependencies: source-map-support: 0.5.21 - karma@6.4.4(bufferutil@4.1.0): + karma@6.4.4(bufferutil@4.1.0)(utf-8-validate@6.0.6): dependencies: '@colors/colors': 1.5.0 body-parser: 1.20.4 @@ -16153,10 +14373,10 @@ snapshots: graceful-fs: 4.2.11 http-proxy: 1.18.1(debug@4.4.3) isbinaryfile: 4.0.10 - lodash: 4.17.23 + lodash: 4.18.1 log4js: 6.9.1 mime: 2.6.0 - minimatch: 3.1.2 + minimatch: 3.1.5 mkdirp: 0.5.6 qjobs: 1.2.0 range-parser: 1.2.1 @@ -16172,93 +14392,34 @@ snapshots: - supports-color - utf-8-validate - keygrip@1.1.0: - dependencies: - tsscmp: 1.0.6 - keyv@4.5.4: dependencies: json-buffer: 3.0.1 kind-of@6.0.3: {} - koa-compose@4.1.0: {} - - koa-convert@2.0.0: - dependencies: - co: 4.6.0 - koa-compose: 4.1.0 - - koa-etag@4.0.0: - dependencies: - etag: 1.8.1 - - koa-send@5.0.1: - dependencies: - debug: 4.4.3(supports-color@10.2.2) - http-errors: 1.8.1 - resolve-path: 1.4.0 - transitivePeerDependencies: - - supports-color - - koa-static@5.0.0: - dependencies: - debug: 3.2.7 - koa-send: 5.0.1 - transitivePeerDependencies: - - supports-color - - koa@2.16.3: - dependencies: - accepts: 1.3.8 - cache-content-type: 1.0.1 - content-disposition: 0.5.4 - content-type: 1.0.5 - cookies: 0.9.1 - debug: 4.4.3(supports-color@10.2.2) - delegates: 1.0.0 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - fresh: 0.5.2 - http-assert: 1.5.0 - http-errors: 1.8.1 - is-generator-function: 1.1.2 - koa-compose: 4.1.0 - koa-convert: 2.0.0 - on-finished: 2.4.1 - only: 0.0.2 - parseurl: 1.3.3 - statuses: 1.5.0 - type-is: 1.6.18 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - - launch-editor@2.12.0: + launch-editor@2.13.2: dependencies: picocolors: 1.1.1 shell-quote: 1.8.3 - less-loader@12.3.1(less@4.4.2)(webpack@5.105.2(esbuild@0.27.3)): + less-loader@12.3.2(less@4.6.4)(webpack@5.105.4(esbuild@0.27.3)): dependencies: - less: 4.4.2 + less: 4.6.4 optionalDependencies: - webpack: 5.105.2(esbuild@0.27.3) + webpack: 5.105.4(esbuild@0.27.3) - less@4.4.2: + less@4.6.4: dependencies: - copy-anything: 2.0.6 + copy-anything: 3.0.5 parse-node-version: 1.0.1 - tslib: 2.8.1 optionalDependencies: errno: 0.1.8 graceful-fs: 4.2.11 image-size: 0.5.5 make-dir: 2.1.0 mime: 1.6.0 - needle: 3.3.1 + needle: 3.5.0 source-map: 0.6.1 levn@0.4.1: @@ -16266,52 +14427,40 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - license-webpack-plugin@4.0.2(webpack@5.105.2(esbuild@0.27.3)): + license-webpack-plugin@4.0.2(webpack@5.105.4(esbuild@0.27.3)): dependencies: webpack-sources: 3.3.4 optionalDependencies: - webpack: 5.105.2(esbuild@0.27.3) - - lie@3.3.0: - dependencies: - immediate: 3.0.6 - - lighthouse-logger@1.4.2: - dependencies: - debug: 2.6.9 - marky: 1.3.0 - transitivePeerDependencies: - - supports-color + webpack: 5.105.4(esbuild@0.27.3) limiter@1.1.5: {} lines-and-columns@1.2.4: {} - listr2@9.0.5: + listr2@10.2.1: dependencies: - cli-truncate: 5.1.1 - colorette: 2.0.20 + cli-truncate: 5.2.0 eventemitter3: 5.0.4 log-update: 6.1.0 rfdc: 1.4.1 - wrap-ansi: 9.0.2 + wrap-ansi: 10.0.0 - lmdb@3.5.1: + lmdb@3.5.2: dependencies: '@harperfast/extended-iterable': 1.0.3 - msgpackr: 1.11.8 + msgpackr: 1.11.9 node-addon-api: 6.1.0 node-gyp-build-optional-packages: 5.2.2 ordered-binary: 1.6.1 weak-lru-cache: 1.2.2 optionalDependencies: - '@lmdb/lmdb-darwin-arm64': 3.5.1 - '@lmdb/lmdb-darwin-x64': 3.5.1 - '@lmdb/lmdb-linux-arm': 3.5.1 - '@lmdb/lmdb-linux-arm64': 3.5.1 - '@lmdb/lmdb-linux-x64': 3.5.1 - '@lmdb/lmdb-win32-arm64': 3.5.1 - '@lmdb/lmdb-win32-x64': 3.5.1 + '@lmdb/lmdb-darwin-arm64': 3.5.2 + '@lmdb/lmdb-darwin-x64': 3.5.2 + '@lmdb/lmdb-linux-arm': 3.5.2 + '@lmdb/lmdb-linux-arm64': 3.5.2 + '@lmdb/lmdb-linux-x64': 3.5.2 + '@lmdb/lmdb-win32-arm64': 3.5.2 + '@lmdb/lmdb-win32-x64': 3.5.2 optional: true loader-runner@4.3.1: {} @@ -16324,10 +14473,6 @@ snapshots: loader-utils@3.3.1: {} - locate-path@5.0.0: - dependencies: - p-locate: 4.1.0 - locate-path@6.0.0: dependencies: p-locate: 5.0.0 @@ -16354,8 +14499,6 @@ snapshots: lodash.isstring@4.0.1: {} - lodash.merge@4.6.2: {} - lodash.once@4.1.1: {} lodash.snakecase@4.1.1: {} @@ -16364,31 +14507,26 @@ snapshots: lodash@4.17.23: {} + lodash@4.18.1: {} + log-symbols@7.0.1: dependencies: is-unicode-supported: 2.1.0 yoctocolors: 2.1.2 - log-update@4.0.0: - dependencies: - ansi-escapes: 4.3.2 - cli-cursor: 3.1.0 - slice-ansi: 4.0.0 - wrap-ansi: 6.2.0 - log-update@6.1.0: dependencies: ansi-escapes: 7.3.0 cli-cursor: 5.0.0 slice-ansi: 7.1.2 - strip-ansi: 7.1.2 + strip-ansi: 7.2.0 wrap-ansi: 9.0.2 log4js@6.9.1: dependencies: date-format: 4.0.14 debug: 4.4.3(supports-color@10.2.2) - flatted: 3.3.3 + flatted: 3.4.2 rfdc: 1.4.1 streamroller: 3.1.5 transitivePeerDependencies: @@ -16400,7 +14538,7 @@ snapshots: dependencies: graceful-fs: 4.2.11 is-promise: 2.2.2 - lodash: 4.17.23 + lodash: 4.18.1 pify: 3.0.0 steno: 0.4.4 @@ -16408,7 +14546,7 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@11.2.6: {} + lru-cache@11.3.2: {} lru-cache@5.1.1: dependencies: @@ -16416,15 +14554,13 @@ snapshots: lru-cache@7.18.3: {} - lru-cache@8.0.5: {} - magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 magicast@0.5.2: dependencies: - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@babel/types': 7.29.0 source-map-js: 1.2.1 @@ -16438,48 +14574,45 @@ snapshots: dependencies: semver: 7.7.4 - make-error@1.3.6: {} - - make-fetch-happen@15.0.3: + make-fetch-happen@15.0.5: dependencies: + '@gar/promise-retry': 1.0.3 '@npmcli/agent': 4.0.0 - cacache: 20.0.3 + '@npmcli/redact': 4.0.0 + cacache: 20.0.4 http-cache-semantics: 4.2.0 - minipass: 7.1.2 - minipass-fetch: 5.0.1 - minipass-flush: 1.0.5 + minipass: 7.1.3 + minipass-fetch: 5.0.2 + minipass-flush: 1.0.7 minipass-pipeline: 1.2.4 negotiator: 1.0.0 proc-log: 6.1.0 - promise-retry: 2.0.1 ssri: 13.0.1 transitivePeerDependencies: - supports-color - marky@1.3.0: {} - math-intrinsics@1.1.0: {} - mdn-data@2.12.2: {} + mdn-data@2.27.1: {} media-typer@0.3.0: {} media-typer@1.1.0: {} - memfs@4.56.10(tslib@2.8.1): + memfs@4.57.1(tslib@2.8.1): dependencies: - '@jsonjoy.com/fs-core': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-fsa': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node-to-fsa': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-print': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-snapshot': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-core': 4.57.1(tslib@2.8.1) + '@jsonjoy.com/fs-fsa': 4.57.1(tslib@2.8.1) + '@jsonjoy.com/fs-node': 4.57.1(tslib@2.8.1) + '@jsonjoy.com/fs-node-builtins': 4.57.1(tslib@2.8.1) + '@jsonjoy.com/fs-node-to-fsa': 4.57.1(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.57.1(tslib@2.8.1) + '@jsonjoy.com/fs-print': 4.57.1(tslib@2.8.1) + '@jsonjoy.com/fs-snapshot': 4.57.1(tslib@2.8.1) '@jsonjoy.com/json-pack': 1.21.0(tslib@2.8.1) '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) glob-to-regex.js: 1.2.0(tslib@2.8.1) - thingies: 2.5.0(tslib@2.8.1) + thingies: 2.6.0(tslib@2.8.1) tree-dump: 1.1.0(tslib@2.8.1) tslib: 2.8.1 @@ -16498,7 +14631,7 @@ snapshots: micromatch@4.0.8: dependencies: braces: 3.0.3 - picomatch: 2.3.1 + picomatch: 2.3.2 mime-db@1.52.0: {} @@ -16518,61 +14651,55 @@ snapshots: mime@3.0.0: {} - mimic-fn@2.1.0: {} - mimic-function@5.0.1: {} mimic-response@1.0.1: {} mimic-response@3.1.0: {} - mini-css-extract-plugin@2.10.0(webpack@5.105.2(esbuild@0.27.3)): + mini-css-extract-plugin@2.10.2(webpack@5.105.4(esbuild@0.27.3)): dependencies: schema-utils: 4.3.3 - tapable: 2.3.0 - webpack: 5.105.2(esbuild@0.27.3) + tapable: 2.3.2 + webpack: 5.105.4(esbuild@0.27.3) minimalistic-assert@1.0.1: {} - minimatch@10.1.1: - dependencies: - '@isaacs/brace-expansion': 5.0.1 - - minimatch@10.2.0: + minimatch@10.2.5: dependencies: - brace-expansion: 5.0.2 + brace-expansion: 5.0.5 - minimatch@3.1.2: + minimatch@3.1.5: dependencies: - brace-expansion: 1.1.12 + brace-expansion: 1.1.13 - minimatch@5.1.6: + minimatch@7.4.6: dependencies: - brace-expansion: 2.0.2 + brace-expansion: 2.0.3 - minimatch@7.4.6: + minimatch@7.4.9: dependencies: - brace-expansion: 2.0.2 + brace-expansion: 2.0.3 - minimatch@9.0.5: + minimatch@9.0.9: dependencies: - brace-expansion: 2.0.2 + brace-expansion: 2.0.3 minimist@1.2.8: {} minipass-collect@2.0.1: dependencies: - minipass: 7.1.2 + minipass: 7.1.3 - minipass-fetch@5.0.1: + minipass-fetch@5.0.2: dependencies: - minipass: 7.1.2 + minipass: 7.1.3 minipass-sized: 2.0.0 minizlib: 3.1.0 optionalDependencies: - encoding: 0.1.13 + iconv-lite: 0.7.2 - minipass-flush@1.0.5: + minipass-flush@1.0.7: dependencies: minipass: 3.3.6 @@ -16582,24 +14709,22 @@ snapshots: minipass-sized@2.0.0: dependencies: - minipass: 7.1.2 + minipass: 7.1.3 minipass@3.3.6: dependencies: yallist: 4.0.0 - minipass@7.1.2: {} + minipass@7.1.3: {} minizlib@3.1.0: dependencies: - minipass: 7.1.2 + minipass: 7.1.3 mitt@1.2.0: {} mitt@3.0.1: {} - mkdirp-classic@0.5.3: {} - mkdirp@0.5.6: dependencies: minimist: 1.2.8 @@ -16626,7 +14751,7 @@ snapshots: '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.3 optional: true - msgpackr@1.11.8: + msgpackr@1.11.9: optionalDependencies: msgpackr-extract: 3.0.3 optional: true @@ -16636,26 +14761,22 @@ snapshots: dns-packet: 5.6.1 thunky: 1.1.0 - multimatch@7.0.0: + multimatch@8.0.0: dependencies: array-differ: 4.0.0 array-union: 3.0.1 - minimatch: 9.0.5 - - mute-stream@2.0.0: {} + minimatch: 10.2.5 mute-stream@3.0.0: {} - nanocolors@0.2.13: {} - nanoid@3.3.11: {} natural-compare@1.4.0: {} - needle@3.3.1: + needle@3.5.0: dependencies: iconv-lite: 0.6.3 - sax: 1.4.4 + sax: 1.6.0 optional: true negotiator@0.6.3: {} @@ -16666,17 +14787,17 @@ snapshots: neo-async@2.6.2: {} - netmask@2.0.2: {} + netmask@2.1.0: {} - ng-packagr@21.2.0-next.0(@angular/compiler-cli@21.2.0-next.3(@angular/compiler@21.2.0-next.3)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3): + ng-packagr@22.0.0-next.1(@angular/compiler-cli@22.0.0-next.6(@angular/compiler@22.0.0-next.6)(typescript@6.0.2))(tslib@2.8.1)(typescript@6.0.2): dependencies: '@ampproject/remapping': 2.3.0 - '@angular/compiler-cli': 21.2.0-next.3(@angular/compiler@21.2.0-next.3)(typescript@5.9.3) - '@rollup/plugin-json': 6.1.0(rollup@4.57.1) - '@rollup/wasm-node': 4.57.1 + '@angular/compiler-cli': 22.0.0-next.6(@angular/compiler@22.0.0-next.6)(typescript@6.0.2) + '@rollup/plugin-json': 6.1.0(rollup@4.60.0) + '@rollup/wasm-node': 4.60.0 ajv: 8.18.0 ansi-colors: 4.1.3 - browserslist: 4.28.1 + browserslist: 4.28.2 chokidar: 5.0.0 commander: 14.0.3 dependency-graph: 1.0.0 @@ -16684,22 +14805,22 @@ snapshots: find-cache-directory: 6.0.0 injection-js: 2.6.1 jsonc-parser: 3.3.1 - less: 4.4.2 + less: 4.6.4 ora: 9.3.0 piscina: 5.1.4 - postcss: 8.5.6 - rollup-plugin-dts: 6.3.0(rollup@4.57.1)(typescript@5.9.3) + postcss: 8.5.8 + rollup-plugin-dts: 6.4.1(rollup@4.60.0)(typescript@6.0.2) rxjs: 7.8.2 - sass: 1.97.3 + sass: 1.98.0 tinyglobby: 0.2.15 tslib: 2.8.1 - typescript: 5.9.3 + typescript: 6.0.2 optionalDependencies: - rollup: 4.57.1 + rollup: 4.60.0 - nock@14.0.10: + nock@14.0.11: dependencies: - '@mswjs/interceptors': 0.39.8 + '@mswjs/interceptors': 0.41.3 json-stringify-safe: 5.0.1 propagate: 2.0.1 @@ -16711,6 +14832,13 @@ snapshots: node-domexception@1.0.0: {} + node-exports-info@1.6.0: + dependencies: + array.prototype.flatmap: 1.3.3 + es-errors: 1.3.0 + object.entries: 1.1.9 + semver: 6.3.1 + node-fetch-native@1.6.7: {} node-fetch@2.6.7(encoding@0.1.13): @@ -16743,17 +14871,17 @@ snapshots: env-paths: 2.2.1 exponential-backoff: 3.1.3 graceful-fs: 4.2.11 - make-fetch-happen: 15.0.3 + make-fetch-happen: 15.0.5 nopt: 9.0.0 proc-log: 6.1.0 semver: 7.7.4 - tar: 7.5.9 + tar: 7.5.13 tinyglobby: 0.2.15 which: 6.0.1 transitivePeerDependencies: - supports-color - node-releases@2.0.27: {} + node-releases@2.0.37: {} nopt@9.0.0: dependencies: @@ -16780,7 +14908,7 @@ snapshots: semver: 7.7.4 validate-npm-package-name: 7.0.2 - npm-packlist@10.0.3: + npm-packlist@10.0.4: dependencies: ignore-walk: 8.0.0 proc-log: 6.1.0 @@ -16796,25 +14924,19 @@ snapshots: dependencies: '@npmcli/redact': 4.0.0 jsonparse: 1.3.1 - make-fetch-happen: 15.0.3 - minipass: 7.1.2 - minipass-fetch: 5.0.1 + make-fetch-happen: 15.0.5 + minipass: 7.1.3 + minipass-fetch: 5.0.2 minizlib: 3.1.0 npm-package-arg: 13.0.2 proc-log: 6.1.0 transitivePeerDependencies: - supports-color - npm-run-path@4.0.1: - dependencies: - path-key: 3.1.1 - nth-check@2.1.1: dependencies: boolbase: 1.0.0 - oauth-sign@0.9.0: {} - object-assign@4.1.1: {} object-hash@3.0.0: {} @@ -16832,6 +14954,13 @@ snapshots: has-symbols: 1.1.0 object-keys: 1.1.1 + object.entries@1.1.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + object.fromentries@2.0.8: dependencies: call-bind: 1.0.8 @@ -16872,16 +15001,10 @@ snapshots: dependencies: wrappy: 1.0.2 - onetime@5.1.2: - dependencies: - mimic-fn: 2.1.0 - onetime@7.0.0: dependencies: mimic-function: 5.0.1 - only@0.0.2: {} - open@10.2.0: dependencies: default-browser: 5.5.0 @@ -16898,12 +15021,6 @@ snapshots: powershell-utils: 0.1.0 wsl-utils: 0.3.1 - open@8.4.2: - dependencies: - define-lazy-prop: 2.0.0 - is-docker: 2.2.1 - is-wsl: 2.2.0 - opn@5.3.0: dependencies: is-wsl: 1.1.0 @@ -16926,13 +15043,11 @@ snapshots: is-unicode-supported: 2.1.0 log-symbols: 7.0.1 stdin-discarder: 0.3.1 - string-width: 8.1.1 + string-width: 8.2.0 ordered-binary@1.6.1: optional: true - os-tmpdir@1.0.2: {} - outvariant@1.4.3: {} own-keys@1.0.1: @@ -16943,24 +15058,12 @@ snapshots: p-cancelable@2.1.1: {} - p-event@4.2.0: - dependencies: - p-timeout: 3.2.0 - p-finally@1.0.0: {} - p-limit@2.3.0: - dependencies: - p-try: 2.2.0 - p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 - p-locate@4.1.0: - dependencies: - p-limit: 2.3.0 - p-locate@5.0.0: dependencies: p-limit: 3.1.0 @@ -16972,25 +15075,28 @@ snapshots: eventemitter3: 4.0.7 p-timeout: 3.2.0 + p-retry@4.6.2: + dependencies: + '@types/retry': 0.12.0 + retry: 0.13.1 + p-retry@6.2.1: dependencies: '@types/retry': 0.12.2 - is-network-error: 1.3.0 + is-network-error: 1.3.1 retry: 0.13.1 p-timeout@3.2.0: dependencies: p-finally: 1.0.0 - p-try@2.2.0: {} - pac-proxy-agent@7.2.0: dependencies: '@tootallnate/quickjs-emscripten': 0.23.0 agent-base: 7.1.4 debug: 4.4.3(supports-color@10.2.2) get-uri: 6.0.5 - http-proxy-agent: 7.0.2 + http-proxy-agent: 7.0.2(supports-color@10.2.2) https-proxy-agent: 7.0.6(supports-color@10.2.2) pac-resolver: 7.0.1 socks-proxy-agent: 8.0.5 @@ -17000,29 +15106,29 @@ snapshots: pac-resolver@7.0.1: dependencies: degenerator: 5.0.1 - netmask: 2.0.2 + netmask: 2.1.0 package-json-from-dist@1.0.1: {} - pacote@21.3.1: + pacote@21.5.0: dependencies: - '@npmcli/git': 7.0.1 + '@gar/promise-retry': 1.0.3 + '@npmcli/git': 7.0.2 '@npmcli/installed-package-contents': 4.0.0 - '@npmcli/package-json': 7.0.4 + '@npmcli/package-json': 7.0.5 '@npmcli/promise-spawn': 9.0.1 - '@npmcli/run-script': 10.0.3 - cacache: 20.0.3 + '@npmcli/run-script': 10.0.4 + cacache: 20.0.4 fs-minipass: 3.0.3 - minipass: 7.1.2 + minipass: 7.1.3 npm-package-arg: 13.0.2 - npm-packlist: 10.0.3 + npm-packlist: 10.0.4 npm-pick-manifest: 11.0.3 npm-registry-fetch: 19.1.1 proc-log: 6.1.0 - promise-retry: 2.0.1 sigstore: 4.1.0 ssri: 13.0.1 - tar: 7.5.9 + tar: 7.5.13 transitivePeerDependencies: - supports-color @@ -17053,8 +15159,6 @@ snapshots: dependencies: parse5: 8.0.0 - parse5@6.0.1: {} - parse5@8.0.0: dependencies: entities: 6.0.1 @@ -17065,8 +15169,6 @@ snapshots: path-is-absolute@1.0.1: {} - path-is-inside@1.0.2: {} - path-key@3.1.1: {} path-parse@1.0.7: {} @@ -17074,18 +15176,16 @@ snapshots: path-scurry@1.11.1: dependencies: lru-cache: 10.4.3 - minipass: 7.1.2 + minipass: 7.1.3 - path-scurry@2.0.1: + path-scurry@2.0.2: dependencies: - lru-cache: 11.2.6 - minipass: 7.1.2 - - path-to-regexp@0.1.12: {} + lru-cache: 11.3.2 + minipass: 7.1.3 - path-to-regexp@8.3.0: {} + path-to-regexp@0.1.13: {} - path-type@4.0.0: {} + path-to-regexp@8.4.2: {} pathe@1.1.2: {} @@ -17103,23 +15203,15 @@ snapshots: picocolors@1.1.1: {} - picomatch@2.3.1: {} + picomatch@2.3.2: {} - picomatch@4.0.3: {} - - pify@2.3.0: {} + picomatch@4.0.4: {} pify@3.0.0: {} pify@4.0.1: optional: true - pinkie-promise@2.0.1: - dependencies: - pinkie: 2.0.4 - - pinkie@2.0.4: {} - pino-abstract-transport@1.2.0: dependencies: readable-stream: 4.7.0 @@ -17155,7 +15247,7 @@ snapshots: dependencies: find-up-simple: 1.0.1 - pkijs@3.3.3: + pkijs@3.4.0: dependencies: '@noble/hashes': 1.4.0 asn1js: 3.0.7 @@ -17166,13 +15258,6 @@ snapshots: pluralize@8.0.0: {} - portfinder@1.0.38: - dependencies: - async: 3.2.6 - debug: 4.4.3(supports-color@10.2.2) - transitivePeerDependencies: - - supports-color - portscanner@2.2.0: dependencies: async: 2.6.4 @@ -17180,43 +15265,43 @@ snapshots: possible-typed-array-names@1.1.0: {} - postcss-loader@8.2.0(postcss@8.5.6)(typescript@5.9.3)(webpack@5.105.2(esbuild@0.27.3)): + postcss-loader@8.2.1(postcss@8.5.8)(typescript@6.0.2)(webpack@5.105.4(esbuild@0.27.3)): dependencies: - cosmiconfig: 9.0.0(typescript@5.9.3) + cosmiconfig: 9.0.1(typescript@6.0.2) jiti: 2.6.1 - postcss: 8.5.6 + postcss: 8.5.8 semver: 7.7.4 optionalDependencies: - webpack: 5.105.2(esbuild@0.27.3) + webpack: 5.105.4(esbuild@0.27.3) transitivePeerDependencies: - typescript postcss-media-query-parser@0.2.3: {} - postcss-modules-extract-imports@3.1.0(postcss@8.5.6): + postcss-modules-extract-imports@3.1.0(postcss@8.5.8): dependencies: - postcss: 8.5.6 + postcss: 8.5.8 - postcss-modules-local-by-default@4.2.0(postcss@8.5.6): + postcss-modules-local-by-default@4.2.0(postcss@8.5.8): dependencies: - icss-utils: 5.1.0(postcss@8.5.6) - postcss: 8.5.6 + icss-utils: 5.1.0(postcss@8.5.8) + postcss: 8.5.8 postcss-selector-parser: 7.1.1 postcss-value-parser: 4.2.0 - postcss-modules-scope@3.2.1(postcss@8.5.6): + postcss-modules-scope@3.2.1(postcss@8.5.8): dependencies: - postcss: 8.5.6 + postcss: 8.5.8 postcss-selector-parser: 7.1.1 - postcss-modules-values@4.0.0(postcss@8.5.6): + postcss-modules-values@4.0.0(postcss@8.5.8): dependencies: - icss-utils: 5.1.0(postcss@8.5.6) - postcss: 8.5.6 + icss-utils: 5.1.0(postcss@8.5.8) + postcss: 8.5.8 - postcss-safe-parser@7.0.1(postcss@8.5.6): + postcss-safe-parser@7.0.1(postcss@8.5.8): dependencies: - postcss: 8.5.6 + postcss: 8.5.8 postcss-selector-parser@7.1.1: dependencies: @@ -17225,7 +15310,7 @@ snapshots: postcss-value-parser@4.2.0: {} - postcss@8.5.6: + postcss@8.5.8: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 @@ -17249,11 +15334,6 @@ snapshots: progress@2.0.3: {} - promise-retry@2.0.1: - dependencies: - err-code: 2.0.3 - retry: 0.12.0 - propagate@2.0.1: {} proto3-json-serializer@3.0.4: @@ -17272,29 +15352,9 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 22.19.11 + '@types/node': 22.19.17 long: 5.3.2 - protractor@7.0.0: - dependencies: - '@types/q': 0.0.32 - '@types/selenium-webdriver': 3.0.26 - blocking-proxy: 1.0.1 - browserstack: 1.6.1 - chalk: 1.1.3 - glob: 7.2.3 - jasmine: 2.8.0 - jasminewd2: 2.2.0 - q: 1.4.1 - saucelabs: 1.5.0 - selenium-webdriver: 3.6.0 - source-map-support: 0.4.18 - webdriver-js-extender: 2.1.0 - webdriver-manager: 12.1.9 - yargs: 15.4.1 - transitivePeerDependencies: - - supports-color - proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 @@ -17304,7 +15364,7 @@ snapshots: dependencies: agent-base: 7.1.4 debug: 4.4.3(supports-color@10.2.2) - http-proxy-agent: 7.0.2 + http-proxy-agent: 7.0.2(supports-color@10.2.2) https-proxy-agent: 7.0.6(supports-color@10.2.2) lru-cache: 7.18.3 pac-proxy-agent: 7.2.0 @@ -17318,16 +15378,12 @@ snapshots: prr@1.0.1: optional: true - psl@1.15.0: - dependencies: - punycode: 2.3.1 - pump@2.0.1: dependencies: end-of-stream: 1.4.5 once: 1.4.0 - pump@3.0.3: + pump@3.0.4: dependencies: end-of-stream: 1.4.5 once: 1.4.0 @@ -17342,33 +15398,15 @@ snapshots: punycode@2.3.1: {} - puppeteer-core@18.2.1(bufferutil@4.1.0)(encoding@0.1.13): + puppeteer-core@24.40.0(bufferutil@4.1.0)(utf-8-validate@6.0.6): dependencies: - cross-fetch: 3.1.5(encoding@0.1.13) - debug: 4.3.4 - devtools-protocol: 0.0.1045489 - extract-zip: 2.0.1 - https-proxy-agent: 5.0.1(supports-color@10.2.2) - proxy-from-env: 1.1.0 - rimraf: 3.0.2 - tar-fs: 2.1.1 - unbzip2-stream: 1.4.3 - ws: 8.9.0(bufferutil@4.1.0) - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - utf-8-validate - - puppeteer-core@24.37.3(bufferutil@4.1.0): - dependencies: - '@puppeteer/browsers': 2.12.1 - chromium-bidi: 14.0.0(devtools-protocol@0.0.1566079) + '@puppeteer/browsers': 2.13.0 + chromium-bidi: 14.0.0(devtools-protocol@0.0.1581282) debug: 4.4.3(supports-color@10.2.2) - devtools-protocol: 0.0.1566079 - typed-query-selector: 2.12.0 + devtools-protocol: 0.0.1581282 + typed-query-selector: 2.12.1 webdriver-bidi-protocol: 0.4.1 - ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) + ws: 8.20.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) transitivePeerDependencies: - bare-abort-controller - bare-buffer @@ -17377,16 +15415,21 @@ snapshots: - supports-color - utf-8-validate - puppeteer@18.2.1(bufferutil@4.1.0)(encoding@0.1.13): + puppeteer@24.40.0(bufferutil@4.1.0)(typescript@6.0.2)(utf-8-validate@6.0.6): dependencies: - https-proxy-agent: 5.0.1(supports-color@10.2.2) - progress: 2.0.3 - proxy-from-env: 1.1.0 - puppeteer-core: 18.2.1(bufferutil@4.1.0)(encoding@0.1.13) + '@puppeteer/browsers': 2.13.0 + chromium-bidi: 14.0.0(devtools-protocol@0.0.1581282) + cosmiconfig: 9.0.1(typescript@6.0.2) + devtools-protocol: 0.0.1581282 + puppeteer-core: 24.40.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) + typed-query-selector: 2.12.1 transitivePeerDependencies: + - bare-abort-controller + - bare-buffer - bufferutil - - encoding + - react-native-b4a - supports-color + - typescript - utf-8-validate pvtsutils@1.3.6: @@ -17395,14 +15438,8 @@ snapshots: pvutils@1.1.5: {} - q@1.4.1: {} - qjobs@1.2.0: {} - qs@6.14.0: - dependencies: - side-channel: 1.1.0 - qs@6.14.2: dependencies: side-channel: 1.1.0 @@ -17411,8 +15448,6 @@ snapshots: dependencies: side-channel: 1.1.0 - qs@6.5.5: {} - queue-microtask@1.2.3: {} quick-format-unescaped@4.0.4: {} @@ -17427,21 +15462,17 @@ snapshots: cross-fetch: 4.1.0(encoding@0.1.13) is-url: 1.2.4 js-base64: 3.7.8 - lodash: 4.17.23 + lodash: 4.18.1 pako: 1.0.11 pluralize: 8.0.0 readable-stream: 4.5.2 unicode-properties: 1.4.1 urijs: 1.19.11 wordwrap: 1.0.0 - yaml: 2.8.2 + yaml: 2.8.3 transitivePeerDependencies: - encoding - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - range-parser@1.2.1: {} raw-body@2.5.3: @@ -17492,7 +15523,7 @@ snapshots: readdirp@3.6.0: dependencies: - picomatch: 2.3.1 + picomatch: 2.3.2 readdirp@4.1.2: {} @@ -17535,56 +15566,26 @@ snapshots: regenerate: 1.4.2 regenerate-unicode-properties: 10.2.2 regjsgen: 0.8.0 - regjsparser: 0.13.0 + regjsparser: 0.13.1 unicode-match-property-ecmascript: 2.0.0 unicode-match-property-value-ecmascript: 2.2.1 regjsgen@0.8.0: {} - regjsparser@0.13.0: + regjsparser@0.13.1: dependencies: jsesc: 3.1.0 - request@2.88.2: - dependencies: - aws-sign2: 0.7.0 - aws4: 1.13.2 - caseless: 0.12.0 - combined-stream: 1.0.8 - extend: 3.0.2 - forever-agent: 0.6.1 - form-data: 2.3.3 - har-validator: 5.1.5 - http-signature: 1.2.0 - is-typedarray: 1.0.0 - isstream: 0.1.2 - json-stringify-safe: 5.0.1 - mime-types: 2.1.35 - oauth-sign: 0.9.0 - performance-now: 2.1.0 - qs: 6.5.5 - safe-buffer: 5.2.1 - tough-cookie: 2.5.0 - tunnel-agent: 0.6.0 - uuid: 3.4.0 - require-directory@2.1.1: {} require-from-string@2.0.2: {} - require-main-filename@2.0.0: {} - requires-port@1.0.0: {} resolve-alpn@1.2.1: {} resolve-from@4.0.0: {} - resolve-path@1.4.0: - dependencies: - http-errors: 1.6.3 - path-is-absolute: 1.0.1 - resolve-pkg-maps@1.0.0: {} resolve-url-loader@5.0.0: @@ -17592,7 +15593,7 @@ snapshots: adjust-sourcemap-loader: 4.0.0 convert-source-map: 1.9.0 loader-utils: 2.0.4 - postcss: 8.5.6 + postcss: 8.5.8 source-map: 0.6.1 resolve@1.22.11: @@ -17601,10 +15602,19 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + resolve@2.0.0-next.6: + dependencies: + es-errors: 1.3.0 + is-core-module: 2.16.1 + node-exports-info: 1.6.0 + object-keys: 1.1.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + resp-modifier@6.0.2: dependencies: debug: 2.6.9 - minimatch: 3.1.2 + minimatch: 3.1.5 transitivePeerDependencies: - supports-color @@ -17612,11 +15622,6 @@ snapshots: dependencies: lowercase-keys: 2.0.0 - restore-cursor@3.1.0: - dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 - restore-cursor@5.1.0: dependencies: onetime: 7.0.0 @@ -17625,22 +15630,16 @@ snapshots: retry-request@8.0.2(supports-color@10.2.2): dependencies: extend: 3.0.2 - teeny-request: 10.1.0(supports-color@10.2.2) + teeny-request: 10.1.2(supports-color@10.2.2) transitivePeerDependencies: - supports-color - retry@0.12.0: {} - retry@0.13.1: {} reusify@1.1.0: {} rfdc@1.4.1: {} - rimraf@2.7.1: - dependencies: - glob: 7.2.3 - rimraf@3.0.2: dependencies: glob: 7.2.3 @@ -17649,76 +15648,84 @@ snapshots: dependencies: glob: 10.5.0 - rolldown@1.0.0-rc.4: + rolldown@1.0.0-rc.12: dependencies: - '@oxc-project/types': 0.113.0 - '@rolldown/pluginutils': 1.0.0-rc.4 + '@oxc-project/types': 0.122.0 + '@rolldown/pluginutils': 1.0.0-rc.12 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-rc.4 - '@rolldown/binding-darwin-arm64': 1.0.0-rc.4 - '@rolldown/binding-darwin-x64': 1.0.0-rc.4 - '@rolldown/binding-freebsd-x64': 1.0.0-rc.4 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.4 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.4 - '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.4 - '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.4 - '@rolldown/binding-linux-x64-musl': 1.0.0-rc.4 - '@rolldown/binding-openharmony-arm64': 1.0.0-rc.4 - '@rolldown/binding-wasm32-wasi': 1.0.0-rc.4 - '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.4 - '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.4 - - rollup-license-plugin@3.1.0: + '@rolldown/binding-android-arm64': 1.0.0-rc.12 + '@rolldown/binding-darwin-arm64': 1.0.0-rc.12 + '@rolldown/binding-darwin-x64': 1.0.0-rc.12 + '@rolldown/binding-freebsd-x64': 1.0.0-rc.12 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.12 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.12 + '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.12 + '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.12 + '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.12 + '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.12 + '@rolldown/binding-linux-x64-musl': 1.0.0-rc.12 + '@rolldown/binding-openharmony-arm64': 1.0.0-rc.12 + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.12 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.12 + '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.12 + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' + + rollup-license-plugin@3.2.1: dependencies: get-npm-tarball-url: 2.1.0 node-fetch: 3.3.2 semver: 7.7.4 spdx-expression-validate: 2.0.0 - rollup-plugin-dts@6.3.0(rollup@4.57.1)(typescript@5.9.3): + rollup-plugin-dts@6.4.1(rollup@4.60.0)(typescript@6.0.2): dependencies: + '@jridgewell/remapping': 2.3.5 + '@jridgewell/sourcemap-codec': 1.5.5 + convert-source-map: 2.0.0 magic-string: 0.30.21 - rollup: 4.57.1 - typescript: 5.9.3 + rollup: 4.60.0 + typescript: 6.0.2 optionalDependencies: '@babel/code-frame': 7.29.0 - rollup-plugin-sourcemaps2@0.5.4(@types/node@22.19.11)(rollup@4.57.1): + rollup-plugin-sourcemaps2@0.5.6(@types/node@22.19.17)(rollup@4.60.0): dependencies: - '@rollup/pluginutils': 5.2.0(rollup@4.57.1) - rollup: 4.57.1 + '@rollup/pluginutils': 5.3.0(rollup@4.60.0) + rollup: 4.60.0 optionalDependencies: - '@types/node': 22.19.11 + '@types/node': 22.19.17 - rollup@4.57.1: + rollup@4.60.0: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.57.1 - '@rollup/rollup-android-arm64': 4.57.1 - '@rollup/rollup-darwin-arm64': 4.57.1 - '@rollup/rollup-darwin-x64': 4.57.1 - '@rollup/rollup-freebsd-arm64': 4.57.1 - '@rollup/rollup-freebsd-x64': 4.57.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.57.1 - '@rollup/rollup-linux-arm-musleabihf': 4.57.1 - '@rollup/rollup-linux-arm64-gnu': 4.57.1 - '@rollup/rollup-linux-arm64-musl': 4.57.1 - '@rollup/rollup-linux-loong64-gnu': 4.57.1 - '@rollup/rollup-linux-loong64-musl': 4.57.1 - '@rollup/rollup-linux-ppc64-gnu': 4.57.1 - '@rollup/rollup-linux-ppc64-musl': 4.57.1 - '@rollup/rollup-linux-riscv64-gnu': 4.57.1 - '@rollup/rollup-linux-riscv64-musl': 4.57.1 - '@rollup/rollup-linux-s390x-gnu': 4.57.1 - '@rollup/rollup-linux-x64-gnu': 4.57.1 - '@rollup/rollup-linux-x64-musl': 4.57.1 - '@rollup/rollup-openbsd-x64': 4.57.1 - '@rollup/rollup-openharmony-arm64': 4.57.1 - '@rollup/rollup-win32-arm64-msvc': 4.57.1 - '@rollup/rollup-win32-ia32-msvc': 4.57.1 - '@rollup/rollup-win32-x64-gnu': 4.57.1 - '@rollup/rollup-win32-x64-msvc': 4.57.1 + '@rollup/rollup-android-arm-eabi': 4.60.0 + '@rollup/rollup-android-arm64': 4.60.0 + '@rollup/rollup-darwin-arm64': 4.60.0 + '@rollup/rollup-darwin-x64': 4.60.0 + '@rollup/rollup-freebsd-arm64': 4.60.0 + '@rollup/rollup-freebsd-x64': 4.60.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.60.0 + '@rollup/rollup-linux-arm-musleabihf': 4.60.0 + '@rollup/rollup-linux-arm64-gnu': 4.60.0 + '@rollup/rollup-linux-arm64-musl': 4.60.0 + '@rollup/rollup-linux-loong64-gnu': 4.60.0 + '@rollup/rollup-linux-loong64-musl': 4.60.0 + '@rollup/rollup-linux-ppc64-gnu': 4.60.0 + '@rollup/rollup-linux-ppc64-musl': 4.60.0 + '@rollup/rollup-linux-riscv64-gnu': 4.60.0 + '@rollup/rollup-linux-riscv64-musl': 4.60.0 + '@rollup/rollup-linux-s390x-gnu': 4.60.0 + '@rollup/rollup-linux-x64-gnu': 4.60.0 + '@rollup/rollup-linux-x64-musl': 4.60.0 + '@rollup/rollup-openbsd-x64': 4.60.0 + '@rollup/rollup-openharmony-arm64': 4.60.0 + '@rollup/rollup-win32-arm64-msvc': 4.60.0 + '@rollup/rollup-win32-ia32-msvc': 4.60.0 + '@rollup/rollup-win32-x64-gnu': 4.60.0 + '@rollup/rollup-win32-x64-msvc': 4.60.0 fsevents: 2.3.3 router@2.2.0: @@ -17727,7 +15734,7 @@ snapshots: depd: 2.0.0 is-promise: 4.0.0 parseurl: 1.3.3 - path-to-regexp: 8.3.0 + path-to-regexp: 8.4.2 transitivePeerDependencies: - supports-color @@ -17770,28 +15777,23 @@ snapshots: safer-buffer@2.1.2: {} - sass-loader@16.0.7(sass@1.97.3)(webpack@5.105.2(esbuild@0.27.3)): + sass-loader@16.0.7(sass@1.98.0)(webpack@5.105.4(esbuild@0.27.3)): dependencies: neo-async: 2.6.2 optionalDependencies: - sass: 1.97.3 - webpack: 5.105.2(esbuild@0.27.3) + sass: 1.98.0 + webpack: 5.105.4(esbuild@0.27.3) - sass@1.97.3: + sass@1.98.0: dependencies: chokidar: 4.0.3 - immutable: 5.1.4 + immutable: 5.1.5 source-map-js: 1.2.1 optionalDependencies: '@parcel/watcher': 2.5.6 - saucelabs@1.5.0: - dependencies: - https-proxy-agent: 2.2.4 - transitivePeerDependencies: - - supports-color - - sax@1.4.4: {} + sax@1.6.0: + optional: true saxes@6.0.0: dependencies: @@ -17806,26 +15808,18 @@ snapshots: select-hose@2.0.0: {} - selenium-webdriver@3.6.0: - dependencies: - jszip: 3.10.1 - rimraf: 2.7.1 - tmp: 0.0.30 - xml2js: 0.4.23 - selfsigned@5.5.0: dependencies: '@peculiar/x509': 1.14.3 - pkijs: 3.3.3 + pkijs: 3.4.0 - semver@5.7.2: {} + semver@5.7.2: + optional: true semver@6.3.1: {} semver@7.7.2: {} - semver@7.7.3: {} - semver@7.7.4: {} send@0.19.2: @@ -17862,9 +15856,7 @@ snapshots: transitivePeerDependencies: - supports-color - serialize-javascript@6.0.2: - dependencies: - randombytes: 2.1.0 + serialize-javascript@7.0.5: {} serve-index@1.9.2: dependencies: @@ -17898,8 +15890,6 @@ snapshots: server-destroy@1.0.1: {} - set-blocking@2.0.0: {} - set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -17922,10 +15912,6 @@ snapshots: es-errors: 1.3.0 es-object-atoms: 1.1.1 - setimmediate@1.0.5: {} - - setprototypeof@1.1.0: {} - setprototypeof@1.2.0: {} shallow-clone@3.0.1: @@ -17977,23 +15963,20 @@ snapshots: sigstore@4.1.0: dependencies: '@sigstore/bundle': 4.0.0 - '@sigstore/core': 3.1.0 - '@sigstore/protobuf-specs': 0.5.0 - '@sigstore/sign': 4.1.0 - '@sigstore/tuf': 4.0.1 + '@sigstore/core': 3.2.0 + '@sigstore/protobuf-specs': 0.5.1 + '@sigstore/sign': 4.1.1 + '@sigstore/tuf': 4.0.2 '@sigstore/verify': 3.1.0 transitivePeerDependencies: - supports-color - slash@3.0.0: {} - - slice-ansi@4.0.0: + slice-ansi@7.1.2: dependencies: - ansi-styles: 4.3.0 - astral-regex: 2.0.0 - is-fullwidth-code-point: 3.0.0 + ansi-styles: 6.2.3 + is-fullwidth-code-point: 5.1.0 - slice-ansi@7.1.2: + slice-ansi@8.0.0: dependencies: ansi-styles: 6.2.3 is-fullwidth-code-point: 5.1.0 @@ -18014,13 +15997,13 @@ snapshots: '@socket.io/component-emitter': 3.1.2 debug: 4.4.3(supports-color@10.2.2) engine.io-client: 6.6.4(bufferutil@4.1.0)(utf-8-validate@6.0.6) - socket.io-parser: 4.2.5 + socket.io-parser: 4.2.6 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - socket.io-parser@4.2.5: + socket.io-parser@4.2.6: dependencies: '@socket.io/component-emitter': 3.1.2 debug: 4.4.3(supports-color@10.2.2) @@ -18033,9 +16016,9 @@ snapshots: base64id: 2.0.0 cors: 2.8.6 debug: 4.4.3(supports-color@10.2.2) - engine.io: 6.6.5(bufferutil@4.1.0)(utf-8-validate@6.0.6) + engine.io: 6.6.6(bufferutil@4.1.0)(utf-8-validate@6.0.6) socket.io-adapter: 2.5.6(bufferutil@4.1.0)(utf-8-validate@6.0.6) - socket.io-parser: 4.2.5 + socket.io-parser: 4.2.6 transitivePeerDependencies: - bufferutil - supports-color @@ -18070,44 +16053,38 @@ snapshots: source-map-js@1.2.1: {} - source-map-loader@5.0.0(webpack@5.105.2(esbuild@0.27.3)): + source-map-loader@5.0.0(webpack@5.105.4(esbuild@0.27.3)): dependencies: iconv-lite: 0.6.3 source-map-js: 1.2.1 - webpack: 5.105.2(esbuild@0.27.3) - - source-map-support@0.4.18: - dependencies: - source-map: 0.5.7 + webpack: 5.105.4(esbuild@0.27.3) source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 - source-map@0.5.7: {} - source-map@0.6.1: {} source-map@0.7.6: {} - spdx-correct@3.2.0: - dependencies: - spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.22 - spdx-exceptions@2.5.0: {} spdx-expression-parse@3.0.1: dependencies: spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.22 + spdx-license-ids: 3.0.23 + + spdx-expression-parse@4.0.0: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.23 spdx-expression-validate@2.0.0: dependencies: spdx-expression-parse: 3.0.1 - spdx-license-ids@3.0.22: {} + spdx-license-ids@3.0.23: {} spdy-transport@3.0.0: dependencies: @@ -18155,11 +16132,11 @@ snapshots: ssri@10.0.5: dependencies: - minipass: 7.1.2 + minipass: 7.1.3 ssri@13.0.1: dependencies: - minipass: 7.1.2 + minipass: 7.1.3 stack-trace@0.0.10: {} @@ -18173,7 +16150,7 @@ snapshots: statuses@2.0.2: {} - std-env@3.10.0: {} + std-env@4.0.0: {} stdin-discarder@0.3.1: {} @@ -18205,11 +16182,11 @@ snapshots: transitivePeerDependencies: - supports-color - streamx@2.23.0: + streamx@2.25.0: dependencies: events-universal: 1.0.1 fast-fifo: 1.3.2 - text-decoder: 1.2.6 + text-decoder: 1.2.7 transitivePeerDependencies: - bare-abort-controller - react-native-b4a @@ -18226,18 +16203,18 @@ snapshots: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 - strip-ansi: 7.1.2 + strip-ansi: 7.2.0 string-width@7.2.0: dependencies: emoji-regex: 10.6.0 - get-east-asian-width: 1.4.0 - strip-ansi: 7.1.2 + get-east-asian-width: 1.5.0 + strip-ansi: 7.2.0 - string-width@8.1.1: + string-width@8.2.0: dependencies: - get-east-asian-width: 1.4.0 - strip-ansi: 7.1.2 + get-east-asian-width: 1.5.0 + strip-ansi: 7.2.0 string.prototype.trim@1.2.10: dependencies: @@ -18270,30 +16247,22 @@ snapshots: dependencies: safe-buffer: 5.2.1 - strip-ansi@3.0.1: - dependencies: - ansi-regex: 2.1.1 - strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 - strip-ansi@7.1.2: + strip-ansi@7.2.0: dependencies: ansi-regex: 6.2.2 strip-bom@3.0.0: {} - strip-final-newline@2.0.0: {} - strip-json-comments@3.1.1: {} stubs@3.0.0: {} supports-color@10.2.2: {} - supports-color@2.0.0: {} - supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -18306,91 +16275,88 @@ snapshots: symbol-tree@3.2.4: {} - table-layout@4.1.1: - dependencies: - array-back: 6.2.2 - wordwrapjs: 5.1.1 - - tapable@2.3.0: {} - - tar-fs@2.1.1: - dependencies: - chownr: 1.1.4 - mkdirp-classic: 0.5.3 - pump: 3.0.3 - tar-stream: 2.2.0 + tapable@2.3.2: {} - tar-fs@3.1.1: + tar-fs@3.1.2: dependencies: - pump: 3.0.3 - tar-stream: 3.1.7 + pump: 3.0.4 + tar-stream: 3.1.8 optionalDependencies: - bare-fs: 4.5.4 + bare-fs: 4.6.0 bare-path: 3.0.0 transitivePeerDependencies: - bare-abort-controller - bare-buffer - react-native-b4a - tar-stream@2.2.0: + tar-stream@3.1.7: dependencies: - bl: 4.1.0 - end-of-stream: 1.4.5 - fs-constants: 1.0.0 - inherits: 2.0.4 - readable-stream: 3.6.2 + b4a: 1.8.0 + fast-fifo: 1.3.2 + streamx: 2.25.0 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a - tar-stream@3.1.7: + tar-stream@3.1.8: dependencies: - b4a: 1.7.4 + b4a: 1.8.0 + bare-fs: 4.6.0 fast-fifo: 1.3.2 - streamx: 2.23.0 + streamx: 2.25.0 transitivePeerDependencies: - bare-abort-controller + - bare-buffer - react-native-b4a - tar@7.5.9: + tar@7.5.13: dependencies: '@isaacs/fs-minipass': 4.0.1 chownr: 3.0.0 - minipass: 7.1.2 + minipass: 7.1.3 minizlib: 3.1.0 yallist: 5.0.0 - teeny-request@10.1.0(supports-color@10.2.2): + teeny-request@10.1.2(supports-color@10.2.2): dependencies: - http-proxy-agent: 5.0.0(supports-color@10.2.2) - https-proxy-agent: 5.0.1(supports-color@10.2.2) + http-proxy-agent: 7.0.2(supports-color@10.2.2) + https-proxy-agent: 7.0.6(supports-color@10.2.2) node-fetch: 3.3.2 stream-events: 1.0.5 transitivePeerDependencies: - supports-color - terser-webpack-plugin@5.3.16(esbuild@0.27.3)(webpack@5.105.2(esbuild@0.27.3)): + teex@1.0.1: + dependencies: + streamx: 2.25.0 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + + terser-webpack-plugin@5.4.0(esbuild@0.27.3)(webpack@5.105.4(esbuild@0.27.3)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 - serialize-javascript: 6.0.2 - terser: 5.46.0 - webpack: 5.105.2(esbuild@0.27.3) + terser: 5.46.1 + webpack: 5.105.4(esbuild@0.27.3) optionalDependencies: esbuild: 0.27.3 - terser@5.46.0: + terser@5.46.1: dependencies: '@jridgewell/source-map': 0.3.11 - acorn: 8.15.0 + acorn: 8.16.0 commander: 2.20.3 source-map-support: 0.5.21 - text-decoder@1.2.6: + text-decoder@1.2.7: dependencies: - b4a: 1.7.4 + b4a: 1.8.0 transitivePeerDependencies: - react-native-b4a - thingies@2.5.0(tslib@2.8.1): + thingies@2.6.0(tslib@2.8.1): dependencies: tslib: 2.8.1 @@ -18415,30 +16381,26 @@ snapshots: tinybench@2.9.0: {} - tinyexec@1.0.2: {} + tinyexec@1.1.1: {} tinyglobby@0.2.15: dependencies: - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 - tinyrainbow@3.0.3: {} + tinyrainbow@3.1.0: {} tldts-core@6.1.86: {} - tldts-core@7.0.23: {} + tldts-core@7.0.28: {} tldts@6.1.86: dependencies: tldts-core: 6.1.86 - tldts@7.0.23: + tldts@7.0.28: dependencies: - tldts-core: 7.0.23 - - tmp@0.0.30: - dependencies: - os-tmpdir: 1.0.2 + tldts-core: 7.0.28 tmp@0.2.5: {} @@ -18450,25 +16412,16 @@ snapshots: toidentifier@1.0.1: {} - tough-cookie@2.5.0: - dependencies: - psl: 1.15.0 - punycode: 2.3.1 - tough-cookie@5.1.2: dependencies: tldts: 6.1.86 - tough-cookie@6.0.0: + tough-cookie@6.0.1: dependencies: - tldts: 7.0.23 + tldts: 7.0.28 tr46@0.0.3: {} - tr46@5.1.1: - dependencies: - punycode: 2.3.1 - tr46@6.0.0: dependencies: punycode: 2.3.1 @@ -18477,29 +16430,9 @@ snapshots: dependencies: tslib: 2.8.1 - tree-kill@1.2.2: {} - - ts-api-utils@2.4.0(typescript@5.9.3): + ts-api-utils@2.5.0(typescript@6.0.2): dependencies: - typescript: 5.9.3 - - ts-node@10.9.2(@types/node@22.19.11)(typescript@5.9.3): - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.12 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 22.19.11 - acorn: 8.15.0 - acorn-walk: 8.3.4 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.4 - make-error: 1.3.6 - typescript: 5.9.3 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 + typescript: 6.0.2 tsconfig-paths@3.15.0: dependencies: @@ -18512,12 +16445,10 @@ snapshots: tslib@2.8.1: {} - tsscmp@1.0.6: {} - tsx@4.21.0: dependencies: esbuild: 0.27.3 - get-tsconfig: 4.13.6 + get-tsconfig: 4.13.7 optionalDependencies: fsevents: 2.3.3 @@ -18529,7 +16460,7 @@ snapshots: dependencies: '@tufjs/models': 4.1.0 debug: 4.4.3(supports-color@10.2.2) - make-fetch-happen: 15.0.3 + make-fetch-happen: 15.0.5 transitivePeerDependencies: - supports-color @@ -18547,8 +16478,6 @@ snapshots: dependencies: prelude-ls: 1.2.1 - type-fest@0.21.3: {} - type-is@1.6.18: dependencies: media-typer: 0.3.0 @@ -18597,13 +16526,11 @@ snapshots: typed-graphqlify@3.1.6: {} - typed-query-selector@2.12.0: {} + typed-query-selector@2.12.1: {} typescript@5.9.3: {} - typical@4.0.0: {} - - typical@7.3.0: {} + typescript@6.0.2: {} ua-parser-js@0.7.41: {} @@ -18619,21 +16546,16 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 - unbzip2-stream@1.4.3: - dependencies: - buffer: 5.7.1 - through: 2.3.8 - - undici-types@7.22.0: {} + undici-types@7.24.7: {} - undici@6.23.0: {} + undici@6.24.1: {} - undici@7.22.0: {} + undici@7.24.6: {} unenv@1.10.0: dependencies: consola: 3.4.2 - defu: 6.1.4 + defu: 6.1.7 mime: 3.0.0 node-fetch-native: 1.6.7 pathe: 1.1.2 @@ -18659,14 +16581,6 @@ snapshots: pako: 0.2.9 tiny-inflate: 1.0.3 - unique-filename@5.0.0: - dependencies: - unique-slug: 6.0.0 - - unique-slug@6.0.0: - dependencies: - imurmurhash: 0.1.4 - universal-github-app-jwt@2.2.2: {} universal-user-agent@7.0.3: {} @@ -18677,9 +16591,9 @@ snapshots: unpipe@1.0.0: {} - update-browserslist-db@1.2.3(browserslist@4.28.1): + update-browserslist-db@1.2.3(browserslist@4.28.2): dependencies: - browserslist: 4.28.1 + browserslist: 4.28.2 escalade: 3.2.0 picocolors: 1.1.1 @@ -18697,35 +16611,20 @@ snapshots: utils-merge@1.0.1: {} - uuid@3.4.0: {} - uuid@8.3.2: {} - v8-compile-cache-lib@3.0.1: {} - - v8-to-istanbul@9.3.0: - dependencies: - '@jridgewell/trace-mapping': 0.3.31 - '@types/istanbul-lib-coverage': 2.0.6 - convert-source-map: 2.0.0 - - 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: {} validator@13.15.26: {} vary@1.1.2: {} - verdaccio-audit@13.0.0-next-8.29(encoding@0.1.13): + verdaccio-audit@13.0.0-next-8.33(encoding@0.1.13): dependencies: - '@verdaccio/config': 8.0.0-next-8.29 - '@verdaccio/core': 8.0.0-next-8.29 + '@verdaccio/config': 8.0.0-next-8.33 + '@verdaccio/core': 8.0.0-next-8.33 express: 4.22.1 - https-proxy-agent: 5.0.1(supports-color@10.2.2) + https-proxy-agent: 5.0.1 node-fetch: 2.6.7(encoding@0.1.13) transitivePeerDependencies: - encoding @@ -18738,50 +16637,50 @@ snapshots: transitivePeerDependencies: - supports-color - verdaccio-htpasswd@13.0.0-next-8.29: + verdaccio-htpasswd@13.0.0-next-8.33: dependencies: - '@verdaccio/core': 8.0.0-next-8.29 + '@verdaccio/core': 8.0.0-next-8.33 '@verdaccio/file-locking': 13.0.0-next-8.6 apache-md5: 1.1.8 bcryptjs: 2.4.3 debug: 4.4.3(supports-color@10.2.2) - http-errors: 2.0.0 + http-errors: 2.0.1 unix-crypt-td-js: 1.1.4 transitivePeerDependencies: - supports-color - verdaccio@6.2.5(encoding@0.1.13): + verdaccio@6.3.2(encoding@0.1.13): dependencies: - '@cypress/request': 3.0.9 - '@verdaccio/auth': 8.0.0-next-8.29 - '@verdaccio/config': 8.0.0-next-8.29 - '@verdaccio/core': 8.0.0-next-8.29 - '@verdaccio/hooks': 8.0.0-next-8.29 - '@verdaccio/loaders': 8.0.0-next-8.19 + '@cypress/request': 3.0.10 + '@verdaccio/auth': 8.0.0-next-8.33 + '@verdaccio/config': 8.0.0-next-8.33 + '@verdaccio/core': 8.0.0-next-8.33 + '@verdaccio/hooks': 8.0.0-next-8.33 + '@verdaccio/loaders': 8.0.0-next-8.23 '@verdaccio/local-storage-legacy': 11.1.1 - '@verdaccio/logger': 8.0.0-next-8.29 - '@verdaccio/middleware': 8.0.0-next-8.29 + '@verdaccio/logger': 8.0.0-next-8.33 + '@verdaccio/middleware': 8.0.0-next-8.33 '@verdaccio/search-indexer': 8.0.0-next-8.5 - '@verdaccio/signature': 8.0.0-next-8.21 + '@verdaccio/signature': 8.0.0-next-8.25 '@verdaccio/streams': 10.2.1 - '@verdaccio/tarball': 13.0.0-next-8.29 - '@verdaccio/ui-theme': 8.0.0-next-8.29 - '@verdaccio/url': 13.0.0-next-8.29 - '@verdaccio/utils': 8.1.0-next-8.29 + '@verdaccio/tarball': 13.0.0-next-8.33 + '@verdaccio/ui-theme': 8.0.0-next-8.30 + '@verdaccio/url': 13.0.0-next-8.33 + '@verdaccio/utils': 8.1.0-next-8.33 JSONStream: 1.3.5 async: 3.2.6 clipanion: 4.0.0-rc.4 compression: 1.8.1 - cors: 2.8.5 + cors: 2.8.6 debug: 4.4.3(supports-color@10.2.2) - envinfo: 7.15.0 + envinfo: 7.21.0 express: 4.22.1 - lodash: 4.17.21 + lodash: 4.17.23 lru-cache: 7.18.3 mime: 3.0.0 - semver: 7.7.3 - verdaccio-audit: 13.0.0-next-8.29(encoding@0.1.13) - verdaccio-htpasswd: 13.0.0-next-8.29 + semver: 7.7.4 + verdaccio-audit: 13.0.0-next-8.33(encoding@0.1.13) + verdaccio-htpasswd: 13.0.0-next-8.33 transitivePeerDependencies: - bare-abort-controller - encoding @@ -18794,50 +16693,51 @@ snapshots: core-util-is: 1.0.2 extsprintf: 1.3.0 - vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.4.2)(sass@1.97.3)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2): + vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(less@4.6.4)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3): dependencies: esbuild: 0.27.3 - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - postcss: 8.5.6 - rollup: 4.57.1 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + postcss: 8.5.8 + rollup: 4.60.0 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 24.10.9 + '@types/node': 24.12.0 fsevents: 2.3.3 jiti: 2.6.1 - less: 4.4.2 - sass: 1.97.3 - terser: 5.46.0 + less: 4.6.4 + sass: 1.98.0 + terser: 5.46.1 tsx: 4.21.0 - yaml: 2.8.2 - - vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(jiti@2.6.1)(jsdom@28.1.0)(less@4.4.2)(sass@1.97.3)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2): - dependencies: - '@vitest/expect': 4.0.18 - '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.4.2)(sass@1.97.3)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) - '@vitest/pretty-format': 4.0.18 - '@vitest/runner': 4.0.18 - '@vitest/snapshot': 4.0.18 - '@vitest/spy': 4.0.18 - '@vitest/utils': 4.0.18 - es-module-lexer: 1.7.0 + yaml: 2.8.3 + + vitest@4.1.2(@opentelemetry/api@1.9.1)(@types/node@24.12.0)(@vitest/coverage-v8@4.1.2)(jiti@2.6.1)(jsdom@29.0.1)(less@4.6.4)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3): + dependencies: + '@vitest/coverage-v8': 4.1.2(vitest@4.1.2) + '@vitest/expect': 4.1.2 + '@vitest/mocker': 4.1.2(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(less@4.6.4)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + '@vitest/pretty-format': 4.1.2 + '@vitest/runner': 4.1.2 + '@vitest/snapshot': 4.1.2 + '@vitest/spy': 4.1.2 + '@vitest/utils': 4.1.2 + es-module-lexer: 2.0.0 expect-type: 1.3.0 magic-string: 0.30.21 obug: 2.1.1 pathe: 2.0.3 - picomatch: 4.0.3 - std-env: 3.10.0 + picomatch: 4.0.4 + std-env: 4.0.0 tinybench: 2.9.0 - tinyexec: 1.0.2 + tinyexec: 1.1.1 tinyglobby: 0.2.15 - tinyrainbow: 3.0.3 - vite: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.4.2)(sass@1.97.3)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + tinyrainbow: 3.1.0 + vite: 7.3.1(@types/node@24.12.0)(jiti@2.6.1)(less@4.6.4)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) why-is-node-running: 2.3.0 optionalDependencies: - '@opentelemetry/api': 1.9.0 - '@types/node': 24.10.9 - jsdom: 28.1.0 + '@opentelemetry/api': 1.9.1 + '@types/node': 24.12.0 + jsdom: 29.0.1 transitivePeerDependencies: - jiti - less @@ -18875,45 +16775,36 @@ snapshots: webdriver-bidi-protocol@0.4.1: {} - webdriver-js-extender@2.1.0: - dependencies: - '@types/selenium-webdriver': 3.0.26 - selenium-webdriver: 3.6.0 - - webdriver-manager@12.1.9: - dependencies: - adm-zip: 0.5.16 - chalk: 1.1.3 - del: 2.2.2 - glob: 7.2.3 - ini: 1.3.8 - minimist: 1.2.8 - q: 1.4.1 - request: 2.88.2 - rimraf: 2.7.1 - semver: 5.7.2 - xml2js: 0.4.23 - webidl-conversions@3.0.1: {} - webidl-conversions@7.0.0: {} - webidl-conversions@8.0.1: {} - webpack-dev-middleware@7.4.5(tslib@2.8.1)(webpack@5.105.2(esbuild@0.27.3)): + webpack-dev-middleware@7.4.5(tslib@2.8.1)(webpack@5.105.4(esbuild@0.27.3)): dependencies: colorette: 2.0.20 - memfs: 4.56.10(tslib@2.8.1) + memfs: 4.57.1(tslib@2.8.1) + mime-types: 3.0.2 + on-finished: 2.4.1 + range-parser: 1.2.1 + schema-utils: 4.3.3 + optionalDependencies: + webpack: 5.105.4(esbuild@0.27.3) + transitivePeerDependencies: + - tslib + + webpack-dev-middleware@8.0.2(tslib@2.8.1)(webpack@5.105.4(esbuild@0.27.3)): + dependencies: + memfs: 4.57.1(tslib@2.8.1) mime-types: 3.0.2 on-finished: 2.4.1 range-parser: 1.2.1 schema-utils: 4.3.3 optionalDependencies: - webpack: 5.105.2(esbuild@0.27.3) + webpack: 5.105.4(esbuild@0.27.3) transitivePeerDependencies: - tslib - webpack-dev-server@5.2.3(bufferutil@4.1.0)(tslib@2.8.1)(utf-8-validate@6.0.6)(webpack@5.105.2(esbuild@0.27.3)): + webpack-dev-server@5.2.3(bufferutil@4.1.0)(tslib@2.8.1)(utf-8-validate@6.0.6)(webpack@5.105.4(esbuild@0.27.3)): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -18933,7 +16824,7 @@ snapshots: graceful-fs: 4.2.11 http-proxy-middleware: 2.0.9(@types/express@4.17.25) ipaddr.js: 2.3.0 - launch-editor: 2.12.0 + launch-editor: 2.13.2 open: 10.2.0 p-retry: 6.2.1 schema-utils: 4.3.3 @@ -18941,10 +16832,10 @@ snapshots: 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.105.2(esbuild@0.27.3)) - ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) + webpack-dev-middleware: 7.4.5(tslib@2.8.1)(webpack@5.105.4(esbuild@0.27.3)) + ws: 8.20.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) optionalDependencies: - webpack: 5.105.2(esbuild@0.27.3) + webpack: 5.105.4(esbuild@0.27.3) transitivePeerDependencies: - bufferutil - debug @@ -18960,12 +16851,12 @@ snapshots: webpack-sources@3.3.4: {} - webpack-subresource-integrity@5.1.0(webpack@5.105.2(esbuild@0.27.3)): + webpack-subresource-integrity@5.1.0(webpack@5.105.4(esbuild@0.27.3)): dependencies: typed-assert: 1.0.9 - webpack: 5.105.2(esbuild@0.27.3) + webpack: 5.105.4(esbuild@0.27.3) - webpack@5.105.2(esbuild@0.27.3): + webpack@5.105.4(esbuild@0.27.3): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -18973,11 +16864,11 @@ snapshots: '@webassemblyjs/ast': 1.14.1 '@webassemblyjs/wasm-edit': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.15.0 - acorn-import-phases: 1.0.4(acorn@8.15.0) - browserslist: 4.28.1 + acorn: 8.16.0 + acorn-import-phases: 1.0.4(acorn@8.16.0) + browserslist: 4.28.2 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.19.0 + enhanced-resolve: 5.20.1 es-module-lexer: 2.0.0 eslint-scope: 5.1.1 events: 3.3.0 @@ -18988,8 +16879,8 @@ snapshots: mime-types: 2.1.35 neo-async: 2.6.2 schema-utils: 4.3.3 - tapable: 2.3.0 - terser-webpack-plugin: 5.3.16(esbuild@0.27.3)(webpack@5.105.2(esbuild@0.27.3)) + tapable: 2.3.2 + terser-webpack-plugin: 5.4.0(esbuild@0.27.3)(webpack@5.105.4(esbuild@0.27.3)) watchpack: 2.5.1 webpack-sources: 3.3.4 transitivePeerDependencies: @@ -19007,14 +16898,9 @@ snapshots: whatwg-mimetype@5.0.0: {} - whatwg-url@14.2.0: - dependencies: - tr46: 5.1.1 - webidl-conversions: 7.0.0 - - whatwg-url@16.0.0: + whatwg-url@16.0.1: dependencies: - '@exodus/bytes': 1.14.1 + '@exodus/bytes': 1.15.0 tr46: 6.0.0 webidl-conversions: 8.0.1 transitivePeerDependencies: @@ -19056,8 +16942,6 @@ snapshots: is-weakmap: 2.0.2 is-weakset: 2.0.4 - which-module@2.0.1: {} - which-typed-array@1.1.20: dependencies: available-typed-arrays: 1.0.7 @@ -19076,10 +16960,6 @@ snapshots: dependencies: isexe: 2.0.0 - which@6.0.0: - dependencies: - isexe: 3.1.5 - which@6.0.1: dependencies: isexe: 4.0.0 @@ -19095,13 +16975,11 @@ snapshots: wordwrap@1.0.0: {} - wordwrapjs@5.1.1: {} - - wrap-ansi@6.2.0: + wrap-ansi@10.0.0: dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 + ansi-styles: 6.2.3 + string-width: 8.2.0 + strip-ansi: 7.2.0 wrap-ansi@7.0.0: dependencies: @@ -19113,34 +16991,26 @@ snapshots: dependencies: ansi-styles: 6.2.3 string-width: 5.1.2 - strip-ansi: 7.1.2 + strip-ansi: 7.2.0 wrap-ansi@9.0.2: dependencies: ansi-styles: 6.2.3 string-width: 7.2.0 - strip-ansi: 7.1.2 + strip-ansi: 7.2.0 wrappy@1.0.2: {} - ws@7.5.10(bufferutil@4.1.0): - optionalDependencies: - bufferutil: 4.1.0 - ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6): optionalDependencies: bufferutil: 4.1.0 utf-8-validate: 6.0.6 - ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6): + ws@8.20.0(bufferutil@4.1.0)(utf-8-validate@6.0.6): optionalDependencies: bufferutil: 4.1.0 utf-8-validate: 6.0.6 - ws@8.9.0(bufferutil@4.1.0): - optionalDependencies: - bufferutil: 4.1.0 - wsl-utils@0.1.0: dependencies: is-wsl: 3.1.1 @@ -19154,21 +17024,12 @@ snapshots: xml-name-validator@5.0.0: {} - xml2js@0.4.23: - dependencies: - sax: 1.4.4 - xmlbuilder: 11.0.1 - - xmlbuilder@11.0.1: {} - xmlchars@2.2.0: {} xmlhttprequest-ssl@2.1.2: {} xtend@4.0.2: {} - y18n@4.0.3: {} - y18n@5.0.8: {} yallist@3.1.1: {} @@ -19177,12 +17038,7 @@ snapshots: yallist@5.0.0: {} - yaml@2.8.2: {} - - yargs-parser@18.1.3: - dependencies: - camelcase: 5.3.1 - decamelize: 1.2.0 + yaml@2.8.3: {} yargs-parser@20.2.9: {} @@ -19190,20 +17046,6 @@ snapshots: yargs-parser@22.0.0: {} - yargs@15.4.1: - dependencies: - cliui: 6.0.0 - decamelize: 1.2.0 - find-up: 4.1.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - require-main-filename: 2.0.0 - set-blocking: 2.0.0 - string-width: 4.2.3 - which-module: 2.0.1 - y18n: 4.0.3 - yargs-parser: 18.1.3 - yargs@16.2.0: dependencies: cliui: 7.0.4 @@ -19238,17 +17080,11 @@ snapshots: buffer-crc32: 0.2.13 fd-slicer: 1.1.0 - ylru@1.4.0: {} - - yn@3.1.1: {} - yocto-queue@0.1.0: {} - yoctocolors-cjs@2.1.3: {} - yoctocolors@2.1.2: {} - zod-to-json-schema@3.25.1(zod@4.3.6): + zod-to-json-schema@3.25.2(zod@4.3.6): dependencies: zod: 4.3.6 @@ -19256,4 +17092,4 @@ snapshots: zod@4.3.6: {} - zone.js@0.16.0: {} + zone.js@0.16.1: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index ecfbec6f3cb9..a6c57def2129 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,7 +1,6 @@ packages: - . - packages/angular_devkit/architect - - packages/angular_devkit/architect_cli - packages/angular_devkit/core - packages/angular_devkit/build_webpack - packages/angular_devkit/build_angular diff --git a/renovate.json b/renovate.json index 293a1aa46277..6b91ffcea750 100644 --- a/renovate.json +++ b/renovate.json @@ -1,8 +1,7 @@ { "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "baseBranchPatterns": ["main", "21.1.x"], + "baseBranchPatterns": ["main", "21.2.x"], "extends": ["github>angular/dev-infra//renovate-presets/default.json5"], - "ignoreDeps": ["less"], "ignorePaths": ["tests/e2e/assets/**", "tests/schematics/update/packages/**"], "packageRules": [ { diff --git a/scripts/devkit-admin.mts b/scripts/devkit-admin.mts index 0a17df9f45a1..7d8522547100 100644 --- a/scripts/devkit-admin.mts +++ b/scripts/devkit-admin.mts @@ -33,12 +33,16 @@ process.chdir(path.join(scriptDir, '..')); const originalConsole = { ...console }; console.warn = function (...args) { - const [m, ...rest] = args; - originalConsole.warn(styleText(['yellow'], m), ...rest); + if (typeof args[0] === 'string') { + args[0] = styleText(['yellow'], args[0]); + } + originalConsole.warn(...args); }; console.error = function (...args) { - const [m, ...rest] = args; - originalConsole.error(styleText(['red'], m), ...rest); + if (typeof args[0] === 'string') { + args[0] = styleText(['red'], args[0]); + } + originalConsole.error(...args); }; try { @@ -47,6 +51,6 @@ try { process.exitCode = typeof exitCode === 'number' ? exitCode : 0; // eslint-disable-next-line @typescript-eslint/no-explicit-any } catch (err: any) { - console.error(err.stack); + console.error(err.stack ?? err); process.exitCode = 99; } diff --git a/scripts/templates/contributing.ejs b/scripts/templates/contributing.ejs index d0eb7a59cee2..9b5fefd4ae46 100644 --- a/scripts/templates/contributing.ejs +++ b/scripts/templates/contributing.ejs @@ -12,7 +12,7 @@ to follow: - [Coding Rules](#rules) - [Commit Message Guidelines](#commit) - [Signing the CLA](#cla) - - [Updating the Public API](#public-api) + - [Spam Policy](#spam-policy) ## Code of Conduct Help us keep Angular open and inclusive. Please read and follow our [Code of Conduct][coc]. @@ -280,6 +280,9 @@ changes to be accepted, the CLA must be signed. It's a quick process, we promise * For corporations we'll need you to [print, sign and one of scan+email, fax or mail the form][corporate-cla]. +## Spam Policy + +See [Spam Policy](https://github.com/angular/angular/blob/main/contributing-docs/spam.md) for details. [coc]: https://github.com/angular/code-of-conduct/blob/main/CODE_OF_CONDUCT.md [commit-message-format]: https://docs.google.com/document/d/1QrDFcIiPjSLDn3EL15IJygNPiHORgU1_OOAqWjiDU5Y/edit# diff --git a/scripts/validate.mts b/scripts/validate.mts index 70d0f27a31d1..a62ffa16f682 100644 --- a/scripts/validate.mts +++ b/scripts/validate.mts @@ -27,7 +27,7 @@ export default async function (options: { verbose: boolean }) { await templates(); if (execSync(`git status --porcelain`).toString()) { console.error( - 'Running templates updated files... Please run "devkit-admin templates" before submitting a PR.', + 'Running templates updated files... Please run "pnpm admin templates" before submitting a PR.', ); if (!options.verbose) { process.exit(2); diff --git a/tests/BUILD.bazel b/tests/BUILD.bazel index 318bf3b965e4..651eccb6dc43 100644 --- a/tests/BUILD.bazel +++ b/tests/BUILD.bazel @@ -1,6 +1,6 @@ -load("@aspect_bazel_lib//lib:directory_path.bzl", "directory_path") +load("@bazel_lib//lib:directory_path.bzl", "directory_path") +load("@npm//:@rollup/wasm-node/package_json.bzl", rollup = "bin") load("@npm//:defs.bzl", "npm_link_all_packages") -load("@npm//:rollup/package_json.bzl", rollup = "bin") load("//tools:defaults.bzl", "ts_project") load(":e2e.bzl", "e2e_suites") @@ -19,8 +19,6 @@ ts_project( deps = [ "//:node_modules/@types/node", "//:node_modules/fast-glob", - "//packages/angular_devkit/core", - "//packages/angular_devkit/core/node", "//tests/e2e/utils", ], ) @@ -31,7 +29,6 @@ rollup.rollup( srcs = [ "rollup.config.mjs", ":runner", - "//:node_modules/@rollup/plugin-alias", "//:node_modules/@rollup/plugin-commonjs", "//:node_modules/@rollup/plugin-json", "//:node_modules/@rollup/plugin-node-resolve", diff --git a/tests/e2e.bzl b/tests/e2e.bzl index 34ae2452a0fb..02897672a9d3 100644 --- a/tests/e2e.bzl +++ b/tests/e2e.bzl @@ -9,7 +9,6 @@ TESTED_PACKAGES = [ "//packages/angular/ssr:npm_package_archive.tgz", "//packages/angular/pwa:npm_package_archive.tgz", "//packages/angular_devkit/architect:npm_package_archive.tgz", - "//packages/angular_devkit/architect_cli:npm_package_archive.tgz", "//packages/angular_devkit/build_angular:npm_package_archive.tgz", "//packages/angular_devkit/build_webpack:npm_package_archive.tgz", "//packages/angular_devkit/core:npm_package_archive.tgz", diff --git a/tests/e2e/assets/ssr-project-webpack/package.json b/tests/e2e/assets/ssr-project-webpack/package.json index 9d6b1f7338e8..a157b69db1dc 100644 --- a/tests/e2e/assets/ssr-project-webpack/package.json +++ b/tests/e2e/assets/ssr-project-webpack/package.json @@ -14,34 +14,27 @@ }, "private": true, "dependencies": { - "@angular/animations": "^21.0.0-next.0", - "@angular/common": "^21.0.0-next.0", - "@angular/compiler": "^21.0.0-next.0", - "@angular/core": "^21.0.0-next.0", - "@angular/forms": "^21.0.0-next.0", - "@angular/platform-browser": "^21.0.0-next.0", - "@angular/platform-server": "^21.0.0-next.0", - "@angular/router": "^21.0.0-next.0", - "@angular/ssr": "^21.0.0-next.0", + "@angular/animations": "^22.0.0-next.0", + "@angular/common": "^22.0.0-next.0", + "@angular/compiler": "^22.0.0-next.0", + "@angular/core": "^22.0.0-next.0", + "@angular/forms": "^22.0.0-next.0", + "@angular/platform-browser": "^22.0.0-next.0", + "@angular/platform-server": "^22.0.0-next.0", + "@angular/router": "^22.0.0-next.0", + "@angular/ssr": "^22.0.0-next.0", "express": "^4.18.2", "rxjs": "~7.8.0", - "tslib": "^2.3.0", - "zone.js": "~0.15.0" + "tslib": "^2.5.0", + "zone.js": "~0.16.0" }, "devDependencies": { - "@angular-devkit/build-angular": "^21.0.0-next.0", - "@angular/cli": "^21.0.0-next.0", - "@angular/compiler-cli": "^21.0.0-next.0", - "@types/express": "^4.17.17", + "@angular-devkit/build-angular": "^22.0.0-next.0", + "@angular/cli": "^22.0.0-next.0", + "@angular/compiler-cli": "^22.0.0-next.0", + "@types/express": "^4.17.24", "@types/jasmine": "~4.3.0", - "@types/mime": "^3.0.0", "@types/node": "^20.17.19", - "jasmine-core": "~4.6.0", - "karma": "~6.4.0", - "karma-chrome-launcher": "~3.2.0", - "karma-coverage": "~2.2.0", - "karma-jasmine": "~5.1.0", - "karma-jasmine-html-reporter": "~2.1.0", - "typescript": "~5.9.2" + "typescript": "~6.0.2" } } diff --git a/tests/e2e/assets/ssr-project-webpack/tsconfig.json b/tests/e2e/assets/ssr-project-webpack/tsconfig.json index bbc051d01524..5a24f418c6cf 100644 --- a/tests/e2e/assets/ssr-project-webpack/tsconfig.json +++ b/tests/e2e/assets/ssr-project-webpack/tsconfig.json @@ -2,7 +2,6 @@ { "compileOnSave": false, "compilerOptions": { - "baseUrl": "./", "outDir": "./dist/out-tsc", "strict": true, "noImplicitOverride": true, @@ -11,9 +10,8 @@ "noFallthroughCasesInSwitch": true, "sourceMap": true, "declaration": false, - "downlevelIteration": true, "experimentalDecorators": true, - "moduleResolution": "node", + "moduleResolution": "node16", "importHelpers": true, "target": "ES2022", "module": "ES2022", diff --git a/tests/e2e/ng-snapshot/package.json b/tests/e2e/ng-snapshot/package.json index ecbe042008a2..f7b496e28753 100644 --- a/tests/e2e/ng-snapshot/package.json +++ b/tests/e2e/ng-snapshot/package.json @@ -2,21 +2,21 @@ "description": "snapshot versions of Angular for e2e testing", "private": true, "dependencies": { - "@angular/animations": "github:angular/animations-builds#d635ecb45533490f524b25b0ebb3abff583cd521", - "@angular/cdk": "github:angular/cdk-builds#bcf7a881e663346e311d632263ff706c12dd5a19", - "@angular/common": "github:angular/common-builds#626cf079d862e4d797435e3261adc7ef0ef86c76", - "@angular/compiler": "github:angular/compiler-builds#af9ed4524965bc16c5b5a58195608ecee1d04eee", - "@angular/compiler-cli": "github:angular/compiler-cli-builds#ba424022abd478cb5b3fb226f6bd1774651b1d6c", - "@angular/core": "github:angular/core-builds#6136c5d58f41b2a7b83f1b0e8806d56a6f0089bf", - "@angular/forms": "github:angular/forms-builds#eab77793122749910bab47cbb1890430ff05eeeb", - "@angular/language-service": "github:angular/language-service-builds#5e2031816114b96afd9f91f36a7094547d0e0380", - "@angular/localize": "github:angular/localize-builds#668528de3560b11838d2aa860cdf069029bc52d9", - "@angular/material": "github:angular/material-builds#c656d718165fdc46c61233a24299116c5ce22120", - "@angular/material-moment-adapter": "github:angular/material-moment-adapter-builds#897592312717606ad45293a5edb57fca7eb34103", - "@angular/platform-browser": "github:angular/platform-browser-builds#6b722574f3e91440e74514226e3b49c09edd725c", - "@angular/platform-browser-dynamic": "github:angular/platform-browser-dynamic-builds#5fb9cf19ea62a4c3dcb8b95db0f551e0bcfe4a0a", - "@angular/platform-server": "github:angular/platform-server-builds#0a057e0c1f45d6de067ff23621e9ea2c6bdbd4b9", - "@angular/router": "github:angular/router-builds#d65390913af936ef044ca7f48700a641ebc072e5", - "@angular/service-worker": "github:angular/service-worker-builds#1bf1429e0965e9723d23c246d73f9e315c8093ad" + "@angular/animations": "github:angular/animations-builds#20802edfe055db681304d56e5188a0fadae28dce", + "@angular/cdk": "github:angular/cdk-builds#cebd4fb52989b094cbd8a09c7066f122bbdb414d", + "@angular/common": "github:angular/common-builds#7ac27fc48206d910a3ca4b9d0a6eadf8cbbd2d50", + "@angular/compiler": "github:angular/compiler-builds#f9c5c4608313140fee47486b67c5dee51a805286", + "@angular/compiler-cli": "github:angular/compiler-cli-builds#d41b6f7aaaaf9549202611f1ca67093e7375ff80", + "@angular/core": "github:angular/core-builds#2a8277d272d34748ad1c13ecd57596872ddb79ce", + "@angular/forms": "github:angular/forms-builds#616341d5b4f3d502a718006223ff73eafc6c4c3b", + "@angular/language-service": "github:angular/language-service-builds#90856cae8e70b5b40bf94435f8f806e076f01502", + "@angular/localize": "github:angular/localize-builds#3bdb99046a344d23d4e65e79d2e0c3ec73a1220d", + "@angular/material": "github:angular/material-builds#b48994a944ee2b02c280ff063078333749583bcd", + "@angular/material-moment-adapter": "github:angular/material-moment-adapter-builds#7c67d4ea11c343eef33ac8a80df0bd3347e21d62", + "@angular/platform-browser": "github:angular/platform-browser-builds#c2b5db3c833cb22f6dbafb7938c98c823f94b3aa", + "@angular/platform-browser-dynamic": "github:angular/platform-browser-dynamic-builds#2d64e1c5c30fd55b6916668f9ca2338d951aa6bb", + "@angular/platform-server": "github:angular/platform-server-builds#d9053173496151a0c8daacf4db4da5a973831662", + "@angular/router": "github:angular/router-builds#3c273a7758199c1c5285a987e9a4d9982a20cf36", + "@angular/service-worker": "github:angular/service-worker-builds#842dd6d94f1e53b82a9a7810c1e9b48d682653f8" } } diff --git a/tests/e2e/tests/architect_cli/package_execution.ts b/tests/e2e/tests/architect_cli/package_execution.ts deleted file mode 100644 index 60b3964b7521..000000000000 --- a/tests/e2e/tests/architect_cli/package_execution.ts +++ /dev/null @@ -1,22 +0,0 @@ -import * as assert from 'node:assert/strict'; -import { exec } from '../../utils/process'; -import { installPackage, uninstallPackage } from '../../utils/packages'; -import { join } from 'node:path'; - -export default async function () { - // Install CLI package - await installPackage('@angular-devkit/architect-cli'); - - try { - // Run help command - const binPath = join('node_modules', '.bin', 'architect'); - const { stdout } = await exec(binPath, '--help'); - - assert.ok( - stdout.includes('architect [project][:target][:configuration] [options, ...]'), - 'Expected stdout to contain usage information.', - ); - } finally { - await uninstallPackage('@angular-devkit/architect-cli'); - } -} diff --git a/tests/e2e/tests/build/assets.ts b/tests/e2e/tests/build/assets.ts index 93c89b5cad86..0d3c718b270e 100644 --- a/tests/e2e/tests/build/assets.ts +++ b/tests/e2e/tests/build/assets.ts @@ -6,8 +6,6 @@ import { updateJsonFile } from '../../utils/project'; import { expectToFail } from '../../utils/utils'; import { getGlobalVariable } from '../../utils/env'; -const isNodeV22orHigher = Number(process.versions.node.split('.', 1)[0]) >= 22; - export default async function () { // Update the atime and mtime of the original file. // Note: Node.js has different time precision, which may cause mtime-based tests to fail. @@ -28,7 +26,7 @@ export default async function () { await expectToFail(() => expectFileToExist('dist/test-project/browser/.gitkeep')); // Timestamp preservation only supported with application build system on Node.js v22+ - if (isNodeV22orHigher && getGlobalVariable('argv')['esbuild']) { + if (getGlobalVariable('argv')['esbuild']) { const [originalStats, outputStats] = await Promise.all([ stat('public/favicon.ico'), stat('dist/test-project/browser/favicon.ico'), diff --git a/tests/e2e/tests/build/auto-csp.ts b/tests/e2e/tests/build/auto-csp.ts index f9e30efe2de9..10dfa877864f 100644 --- a/tests/e2e/tests/build/auto-csp.ts +++ b/tests/e2e/tests/build/auto-csp.ts @@ -97,7 +97,7 @@ export default async function () { checkFn: async (page) => { const warnMessages: string[] = []; page.on('console', (msg) => { - if (msg.type() === 'warning') { + if (msg.type() === 'warn') { warnMessages.push(msg.text()); } }); diff --git a/tests/e2e/tests/build/server-rendering/express-engine-csp-nonce.ts b/tests/e2e/tests/build/server-rendering/express-engine-csp-nonce.ts index 3d6335b48465..409b141bb48a 100644 --- a/tests/e2e/tests/build/server-rendering/express-engine-csp-nonce.ts +++ b/tests/e2e/tests/build/server-rendering/express-engine-csp-nonce.ts @@ -61,6 +61,7 @@ export default async function () { { ...process.env, 'PORT': String(port), + 'NG_ALLOWED_HOSTS': 'localhost', }, ); diff --git a/tests/e2e/tests/build/server-rendering/express-engine-ngmodule.ts b/tests/e2e/tests/build/server-rendering/express-engine-ngmodule.ts index 92e34f7ca3e8..5eaaa9b0e58b 100644 --- a/tests/e2e/tests/build/server-rendering/express-engine-ngmodule.ts +++ b/tests/e2e/tests/build/server-rendering/express-engine-ngmodule.ts @@ -83,6 +83,7 @@ export default async function () { { ...process.env, 'PORT': String(port), + 'NG_ALLOWED_HOSTS': 'localhost', }, ); diff --git a/tests/e2e/tests/build/server-rendering/express-engine-standalone.ts b/tests/e2e/tests/build/server-rendering/express-engine-standalone.ts index 18920e3a5893..4c8d29d9b770 100644 --- a/tests/e2e/tests/build/server-rendering/express-engine-standalone.ts +++ b/tests/e2e/tests/build/server-rendering/express-engine-standalone.ts @@ -50,6 +50,7 @@ export default async function () { { ...process.env, 'PORT': String(port), + 'NG_ALLOWED_HOSTS': 'localhost', }, ); diff --git a/tests/e2e/tests/build/server-rendering/server-routes-output-mode-server-i18n-base-href.ts b/tests/e2e/tests/build/server-rendering/server-routes-output-mode-server-i18n-base-href.ts index 6d0a45459a16..aa6f7e3426ee 100644 --- a/tests/e2e/tests/build/server-rendering/server-routes-output-mode-server-i18n-base-href.ts +++ b/tests/e2e/tests/build/server-rendering/server-routes-output-mode-server-i18n-base-href.ts @@ -111,6 +111,7 @@ async function spawnServer(): Promise { { ...process.env, 'PORT': String(port), + 'NG_ALLOWED_HOSTS': 'localhost', }, ); diff --git a/tests/e2e/tests/build/server-rendering/server-routes-output-mode-server-i18n-sub-path.ts b/tests/e2e/tests/build/server-rendering/server-routes-output-mode-server-i18n-sub-path.ts index 79fc755c4477..7bc323311b4f 100644 --- a/tests/e2e/tests/build/server-rendering/server-routes-output-mode-server-i18n-sub-path.ts +++ b/tests/e2e/tests/build/server-rendering/server-routes-output-mode-server-i18n-sub-path.ts @@ -146,6 +146,7 @@ async function spawnServer(): Promise { { ...process.env, 'PORT': String(port), + 'NG_ALLOWED_HOSTS': 'localhost', }, ); diff --git a/tests/e2e/tests/build/server-rendering/server-routes-output-mode-server-i18n.ts b/tests/e2e/tests/build/server-rendering/server-routes-output-mode-server-i18n.ts index 994d77343d1e..efbff9871bbc 100644 --- a/tests/e2e/tests/build/server-rendering/server-routes-output-mode-server-i18n.ts +++ b/tests/e2e/tests/build/server-rendering/server-routes-output-mode-server-i18n.ts @@ -122,6 +122,7 @@ async function spawnServer(): Promise { { ...process.env, 'PORT': String(port), + 'NG_ALLOWED_HOSTS': 'localhost', }, ); diff --git a/tests/e2e/tests/build/server-rendering/server-routes-output-mode-server-platform-neutral.ts b/tests/e2e/tests/build/server-rendering/server-routes-output-mode-server-platform-neutral.ts index 130ade10ba9f..dff15d055943 100644 --- a/tests/e2e/tests/build/server-rendering/server-routes-output-mode-server-platform-neutral.ts +++ b/tests/e2e/tests/build/server-rendering/server-routes-output-mode-server-platform-neutral.ts @@ -11,7 +11,6 @@ import { import { updateJsonFile, useSha } from '../../../utils/project'; import { getGlobalVariable } from '../../../utils/env'; import { findFreePort } from '../../../utils/network'; -import { readFile } from 'node:fs/promises'; export default async function () { assert( @@ -96,8 +95,10 @@ export default async function () { await updateJsonFile('angular.json', (json) => { const buildTarget = json['projects']['test-project']['architect']['build']; const options = buildTarget['options']; - options['ssr']['experimentalPlatform'] = 'neutral'; + options['ssr']['platform'] = 'neutral'; options['outputMode'] = 'server'; + options['security'] ??= {}; + options['security']['allowedHosts'] = ['localhost']; }); await noSilentNg('build'); diff --git a/tests/e2e/tests/build/server-rendering/server-routes-output-mode-server.ts b/tests/e2e/tests/build/server-rendering/server-routes-output-mode-server.ts index 5205d20eeb0a..ff72cb8e8df2 100644 --- a/tests/e2e/tests/build/server-rendering/server-routes-output-mode-server.ts +++ b/tests/e2e/tests/build/server-rendering/server-routes-output-mode-server.ts @@ -206,6 +206,7 @@ async function spawnServer(): Promise { { ...process.env, 'PORT': String(port), + 'NG_ALLOWED_HOSTS': 'localhost', }, ); diff --git a/tests/e2e/tests/build/server-rendering/server-routes-output-mode-static-i18n-http-calls.ts b/tests/e2e/tests/build/server-rendering/server-routes-output-mode-static-i18n-http-calls.ts new file mode 100644 index 000000000000..964c7827c23e --- /dev/null +++ b/tests/e2e/tests/build/server-rendering/server-routes-output-mode-static-i18n-http-calls.ts @@ -0,0 +1,137 @@ +import assert, { match } from 'node:assert'; +import { join } from 'node:path'; +import { readFile, writeMultipleFiles } from '../../../utils/fs'; +import { ng, noSilentNg, silentNg } from '../../../utils/process'; +import { getGlobalVariable } from '../../../utils/env'; +import { installWorkspacePackages, uninstallPackage } from '../../../utils/packages'; +import { useSha } from '../../../utils/project'; +import { langTranslations, setupI18nConfig } from '../../i18n/setup'; + +export default async function () { + assert( + getGlobalVariable('argv')['esbuild'], + 'This test should not be called in the Webpack suite.', + ); + + // Setup project + await setupI18nConfig(); + + // Forcibly remove in case another test doesn't clean itself up. + await uninstallPackage('@angular/ssr'); + await ng('add', '@angular/ssr', '--skip-confirmation', '--skip-install'); + await useSha(); + await installWorkspacePackages(); + + await writeMultipleFiles({ + // Add asset + 'public/media.json': JSON.stringify({ dataFromAssets: true }), + // Update component to do an HTTP call to asset and API. + 'src/app/app.ts': ` + import { ChangeDetectorRef, Component, inject } from '@angular/core'; + import { JsonPipe } from '@angular/common'; + import { RouterOutlet } from '@angular/router'; + import { HttpClient } from '@angular/common/http'; + + @Component({ + selector: 'app-root', + imports: [JsonPipe, RouterOutlet], + template: \` +

{{ assetsData | json }}

+

{{ apiData | json }}

+ + \`, + }) + export class App { + assetsData: any; + apiData: any; + private readonly cdr: ChangeDetectorRef = inject(ChangeDetectorRef); + + constructor() { + const http = inject(HttpClient); + + http.get('media.json').toPromise().then((d) => { + this.assetsData = d; + this.cdr.markForCheck(); + }); + + http.get('/api').toPromise().then((d) => { + this.apiData = d; + this.cdr.markForCheck(); + }); + } + } + `, + // Add http client and route + 'src/app/app.config.ts': ` + import { ApplicationConfig } from '@angular/core'; + import { provideRouter } from '@angular/router'; + + import { Home } from './home/home'; + import { provideClientHydration } from '@angular/platform-browser'; + import { provideHttpClient, withFetch } from '@angular/common/http'; + + export const appConfig: ApplicationConfig = { + providers: [ + provideRouter([{ + path: 'home', + component: Home, + }]), + provideClientHydration(), + provideHttpClient(withFetch()), + ], + }; + `, + 'src/server.ts': ` + import { AngularNodeAppEngine, writeResponseToNodeResponse, isMainModule, createNodeRequestHandler } from '@angular/ssr/node'; + import express from 'express'; + import { join } from 'node:path'; + + export function app(): express.Express { + const server = express(); + const browserDistFolder = join(import.meta.dirname, '../browser'); + const angularNodeAppEngine = new AngularNodeAppEngine(); + + server.get('/api', (req, res) => { + res.json({ dataFromAPI: true }) + }); + + server.use(express.static(browserDistFolder, { + maxAge: '1y', + index: 'index.html' + })); + + server.use((req, res, next) => { + angularNodeAppEngine.handle(req) + .then((response) => response ? writeResponseToNodeResponse(response, res) : next()) + .catch(next); + }); + return server; + } + + const server = app(); + + if (isMainModule(import.meta.url)) { + const port = process.env['PORT'] || 4000; + server.listen(port, (error) => { + if (error) { + throw error; + } + console.log(\`Node Express server listening on http://localhost:\${port}\`); + }); + } + + export const reqHandler = createNodeRequestHandler(server); + `, + }); + + await silentNg('generate', 'component', 'home'); + + await noSilentNg('build', '--output-mode=static'); + + for (const { lang, outputPath } of langTranslations) { + const contents = await readFile(join(outputPath, 'home/index.html')); + match(contents, /

{[\S\s]*"dataFromAssets":[\s\S]*true[\S\s]*}<\/p>/); + match(contents, /

{[\S\s]*"dataFromAPI":[\s\S]*true[\S\s]*}<\/p>/); + match(contents, new RegExp(``)); + } +} diff --git a/tests/e2e/tests/build/server-rendering/server-routes-preload-links.ts b/tests/e2e/tests/build/server-rendering/server-routes-preload-links.ts index f1437392492d..fe316e3cd157 100644 --- a/tests/e2e/tests/build/server-rendering/server-routes-preload-links.ts +++ b/tests/e2e/tests/build/server-rendering/server-routes-preload-links.ts @@ -196,6 +196,7 @@ async function spawnServer(): Promise { { ...process.env, 'PORT': String(port), + 'NG_ALLOWED_HOSTS': 'localhost', }, ); diff --git a/tests/e2e/tests/build/ts-paths.ts b/tests/e2e/tests/build/ts-paths.ts index 76ee53e5d2b2..1461aaef2636 100644 --- a/tests/e2e/tests/build/ts-paths.ts +++ b/tests/e2e/tests/build/ts-paths.ts @@ -4,11 +4,11 @@ import { updateTsConfig } from '../../utils/project'; export default async function () { await updateTsConfig((json) => { - json['compilerOptions']['baseUrl'] = './src'; json['compilerOptions']['paths'] = { - '@shared': ['app/shared'], - '@shared/*': ['app/shared/*'], - '@root/*': ['./*'], + '@shared': ['./src/app/shared'], + '@shared/*': ['./src/app/shared/*'], + '@root/*': ['./src/*'], + 'src/*': ['./src/*'], }; }); @@ -23,17 +23,17 @@ export default async function () { await ng('build', '--configuration=development'); await updateTsConfig((json) => { - json['compilerOptions']['paths']['*'] = ['*', 'app/shared/*']; + json['compilerOptions']['paths']['*'] = ['./*', './src/app/shared/*']; }); await appendToFile( 'src/app/app.ts', ` - import { meaning } from 'app/shared/meaning'; + import { meaning } from 'src/app/shared/meaning'; import { meaning as meaning2 } from '@shared'; import { meaning as meaning3 } from '@shared/meaning'; import { meaning as meaning4 } from 'meaning'; - import { meaning as meaning5 } from 'meaning-too'; + import { meaning as meaning5 } from 'src/meaning-too'; // need to use imports otherwise they are ignored and // no error is outputted, even if baseUrl/paths don't work diff --git a/tests/e2e/tests/commands/add/add-material.ts b/tests/e2e/tests/commands/add/add-material.ts index 238e5d94dddb..a7453f035a6f 100644 --- a/tests/e2e/tests/commands/add/add-material.ts +++ b/tests/e2e/tests/commands/add/add-material.ts @@ -1,9 +1,10 @@ import { assertIsError } from '../../../utils/utils'; -import { expectFileToMatch, rimraf } from '../../../utils/fs'; +import { readFile, rimraf } from '../../../utils/fs'; import { getActivePackageManager, uninstallPackage } from '../../../utils/packages'; import { ng } from '../../../utils/process'; import { isPrereleaseCli } from '../../../utils/project'; import { appendFile } from 'node:fs/promises'; +import assert from 'node:assert'; export default async function () { // forcibly remove in case another test doesn't clean itself up @@ -32,7 +33,12 @@ export default async function () { '--verbose', '--skip-confirmation', ); - await expectFileToMatch('package.json', /@angular\/material/); + + const { dependencies } = JSON.parse(await readFile('package.json')); + assert.ok( + dependencies['@angular/material'], + '`@angular/material` was not found added to dependencies', + ); // Clean up existing cdk package // Not doing so can cause adding material to fail if an incompatible cdk is present diff --git a/tests/e2e/tests/jest/aot.ts b/tests/e2e/tests/jest/aot.ts deleted file mode 100644 index b015e2a58757..000000000000 --- a/tests/e2e/tests/jest/aot.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { deleteFile, writeFile } from '../../utils/fs'; -import { updateJsonFile } from '../../utils/project'; -import { applyJestBuilder } from '../../utils/jest'; -import { ng } from '../../utils/process'; - -export default async function (): Promise { - await applyJestBuilder(); - - { - await updateJsonFile('tsconfig.spec.json', (json) => { - return { - ...json, - include: ['src/**/*.spec.ts'], - }; - }); - - await writeFile( - 'src/aot.spec.ts', - ` - import { Component } from '@angular/core'; - - describe('Hello', () => { - it('should *not* contain jit instructions', () => { - @Component({ - template: 'Hello', - }) - class Hello {} - - expect((Hello as any).ɵcmp.template.toString()).not.toContain('jit'); - }); - }); - `.trim(), - ); - - const { stderr } = await ng('test', '--aot'); - - if (!stderr.includes('Ran all test suites.') || stderr.includes('failed')) { - throw new Error(`Components were not transformed using AOT.\STDERR:\n\n${stderr}`); - } - } -} diff --git a/tests/e2e/tests/jest/basic.ts b/tests/e2e/tests/jest/basic.ts deleted file mode 100644 index 2a3b19119edd..000000000000 --- a/tests/e2e/tests/jest/basic.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { applyJestBuilder } from '../../utils/jest'; -import { ng } from '../../utils/process'; - -export default async function (): Promise { - await applyJestBuilder(); - - const { stderr } = await ng('test'); - - if (!stderr.includes('Jest builder is currently EXPERIMENTAL')) { - throw new Error(`No experimental notice in stderr.\nSTDERR:\n\n${stderr}`); - } -} diff --git a/tests/e2e/tests/jest/custom-config.ts b/tests/e2e/tests/jest/custom-config.ts deleted file mode 100644 index 10e481a43fcc..000000000000 --- a/tests/e2e/tests/jest/custom-config.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { deleteFile, writeFile } from '../../utils/fs'; -import { applyJestBuilder } from '../../utils/jest'; -import { ng } from '../../utils/process'; -import { updateJsonFile } from '../../utils/project'; - -export default async function (): Promise { - await applyJestBuilder(); - - { - // Users may incorrectly write a Jest config believing it to be used by Angular. - await writeFile( - 'jest.config.mjs', - ` - export default { - runner: 'does-not-exist', - }; - `.trim(), - ); - - // Should not fail from the above (broken) configuration. Shouldn't use it at all. - const { stderr } = await ng('test'); - - // Should warn that a Jest configuration was found but not used. - if (!stderr.includes('A custom Jest config was found')) { - throw new Error(`No warning about custom Jest config:\nSTDERR:\n\n${stderr}`); - } - if (!stderr.includes('jest.config.mjs')) { - throw new Error(`Warning did not call out 'jest.config.mjs':\nSTDERR:\n\n${stderr}`); - } - - await deleteFile('jest.config.mjs'); - } - - { - // Use `package.json` configuration instead of a `jest.config` file. - await updateJsonFile('package.json', (json) => { - json['jest'] = { - runner: 'does-not-exist', - }; - }); - - // Should not fail from the above (broken) configuration. Shouldn't use it at all. - const { stderr } = await ng('test'); - - // Should warn that a Jest configuration was found but not used. - if (!stderr.includes('A custom Jest config was found')) { - throw new Error(`No warning about custom Jest config:\nSTDERR:\n\n${stderr}`); - } - if (!stderr.includes('package.json')) { - throw new Error(`Warning did not call out 'package.json':\nSTDERR:\n\n${stderr}`); - } - } -} diff --git a/tests/e2e/tests/jest/no-zoneless.ts b/tests/e2e/tests/jest/no-zoneless.ts deleted file mode 100644 index 9a74a0295c4e..000000000000 --- a/tests/e2e/tests/jest/no-zoneless.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { replaceInFile } from '../../utils/fs'; -import { applyJestBuilder } from '../../utils/jest'; -import { installPackage, uninstallPackage } from '../../utils/packages'; -import { ng } from '../../utils/process'; - -export default async function (): Promise { - await applyJestBuilder({ - tsConfig: 'tsconfig.spec.json', - polyfills: ['zone.js', 'zone.js/testing'], - }); - - await replaceInFile( - 'src/app/app.spec.ts', - 'await fixture.whenStable();', - 'fixture.detectChanges();', - ); - - try { - await installPackage('zone.js'); - - const { stderr } = await ng('test'); - - if (!stderr.includes('Jest builder is currently EXPERIMENTAL')) { - throw new Error(`No experimental notice in stderr.\nSTDERR:\n\n${stderr}`); - } - } finally { - await uninstallPackage('zone.js'); - } -} diff --git a/tests/e2e/tests/mcp/projects-sourceroot-resolution.ts b/tests/e2e/tests/mcp/projects-sourceroot-resolution.ts new file mode 100644 index 000000000000..01ebb8c1ca05 --- /dev/null +++ b/tests/e2e/tests/mcp/projects-sourceroot-resolution.ts @@ -0,0 +1,47 @@ +import { exec, ProcessOutput, silentNpm } from '../../utils/process'; +import { updateJsonFile } from '../../utils/project'; +import assert from 'node:assert/strict'; + +const MCP_INSPECTOR_PACKAGE_NAME = '@modelcontextprotocol/inspector-cli'; +const MCP_INSPECTOR_PACKAGE_VERSION = '0.16.2'; +const MCP_INSPECTOR_COMMAND_NAME = 'mcp-inspector-cli'; + +async function runInspector(...args: string[]): Promise { + return exec(MCP_INSPECTOR_COMMAND_NAME, '--cli', 'npx', '--no', '@angular/cli', 'mcp', ...args); +} + +export default async function () { + await silentNpm( + 'install', + '--ignore-scripts', + '-g', + `${MCP_INSPECTOR_PACKAGE_NAME}@${MCP_INSPECTOR_PACKAGE_VERSION}`, + ); + + try { + // 1. Add a sample project with a non-root path to angular.json + await updateJsonFile('angular.json', (workspaceJson) => { + workspaceJson.projects ??= {}; + workspaceJson.projects['sample-lib'] = { + root: 'projects/sample-lib', + sourceRoot: 'projects/sample-lib/src', + projectType: 'library', + }; + }); + + // 2. Call list_projects + const { stdout } = await runInspector('--method', 'tools/call', '--tool-name', 'list_projects'); + + // 3. Verify output + assert.match(stdout, /"name": "sample-lib"/); + // Assert that sourceRoot is NOT duplicated + assert.match(stdout, /"sourceRoot": "projects\/sample-lib\/src"/); + assert.doesNotMatch(stdout, /"sourceRoot": "projects\/sample-lib\/projects\/sample-lib\/src"/); + } finally { + // 4. Cleanup angular.json + await updateJsonFile('angular.json', (workspaceJson) => { + delete workspaceJson.projects['sample-lib']; + }); + await silentNpm('uninstall', '-g', MCP_INSPECTOR_PACKAGE_NAME); + } +} diff --git a/tests/e2e/tests/protractor/test-fails.ts b/tests/e2e/tests/protractor/test-fails.ts deleted file mode 100644 index 5204e29338fa..000000000000 --- a/tests/e2e/tests/protractor/test-fails.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { execAndCaptureError, ng } from '../../utils/process'; -import { updateJsonFile } from '../../utils/project'; - -export default async function () { - // Setup `protractor` builder. - await updateJsonFile('angular.json', (config) => { - config.projects['test-project'].architect['e2e'] = { - builder: '@angular-devkit/build-angular:protractor', - options: { - protractorConfig: '', - }, - }; - }); - - const error = await execAndCaptureError('ng', ['e2e']); - if (!error.message.includes('Protractor has reached end-of-life')) { - throw new Error(`Protractor did not fail with an appropriate message. Got:\n${error.message}`); - } -} diff --git a/tests/e2e/tests/test/test-sourcemap.ts b/tests/e2e/tests/test/test-sourcemap.ts index 6c1cf16cd7b3..5d4e668c54b6 100644 --- a/tests/e2e/tests/test/test-sourcemap.ts +++ b/tests/e2e/tests/test/test-sourcemap.ts @@ -32,7 +32,7 @@ export default async function () { } catch (error) { assertIsError(error); assert.match(error.message, /\(src\/app\/app\.spec\.ts:3:27/); - assert.doesNotMatch(error.message, /_karma_webpack_/); + assert.doesNotMatch(error.message, /webpack/); } // when sourcemaps are 'off' the stacktrace won't point to the spec.ts file. diff --git a/tests/e2e/tests/vitest/library.ts b/tests/e2e/tests/vitest/library.ts index ba1e31dc38f8..0bb989057279 100644 --- a/tests/e2e/tests/vitest/library.ts +++ b/tests/e2e/tests/vitest/library.ts @@ -1,12 +1,9 @@ import assert from 'node:assert/strict'; import { updateJsonFile } from '../../utils/project'; -import { ng, silentNpm } from '../../utils/process'; -import { createDir, writeFile } from '../../utils/fs'; +import { ng } from '../../utils/process'; +import { appendToFile, createDir, writeFile } from '../../utils/fs'; export default async function (): Promise { - // Install Vitest deps - await silentNpm('install', 'vitest@^4.0.8', 'jsdom@^27.1.0', '--save-dev'); - // Generate a library await ng('generate', 'library', 'my-lib', '--test-runner', 'vitest'); @@ -25,17 +22,10 @@ export default async function (): Promise { // 3. Update the component to use SCSS and import the shared file // Rename CSS to SCSS - await ng( - 'generate', - 'component', - 'styled-comp', - '--project=my-lib', - '--style=scss', - '--skip-import', - ); + await ng('generate', 'component', 'styled-comp', '--project=my-lib', '--style=scss'); - await writeFile( - 'projects/my-lib/src/lib/styled-comp/styled-comp.component.scss', + await appendToFile( + 'projects/my-lib/src/lib/styled-comp/styled-comp.scss', ` @use 'vars'; p { color: vars.$primary-color; } diff --git a/tests/e2e/tests/web-test-runner/basic.ts b/tests/e2e/tests/web-test-runner/basic.ts deleted file mode 100644 index 4985f872fb18..000000000000 --- a/tests/e2e/tests/web-test-runner/basic.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { noSilentNg } from '../../utils/process'; -import { applyWtrBuilder } from '../../utils/web-test-runner'; - -export default async function () { - // Temporary disabled due to failure. - return; - - await applyWtrBuilder(); - - const { stderr } = await noSilentNg('test'); - - if (!stderr.includes('Web Test Runner builder is currently EXPERIMENTAL')) { - throw new Error(`No experimental notice in stderr.\nSTDERR:\n\n${stderr}`); - } -} diff --git a/tests/e2e/utils/BUILD.bazel b/tests/e2e/utils/BUILD.bazel index 8082ab9d97c4..dbbda05702cd 100644 --- a/tests/e2e/utils/BUILD.bazel +++ b/tests/e2e/utils/BUILD.bazel @@ -14,13 +14,11 @@ ts_project( "//:node_modules/@types/node", "//:node_modules/@types/semver", "//:node_modules/fast-glob", - "//:node_modules/protractor", "//:node_modules/puppeteer", "//:node_modules/semver", "//:node_modules/verdaccio", "//:node_modules/verdaccio-auth-memory", "//tests:node_modules/@types/tar-stream", "//tests:node_modules/tar-stream", - "//tests:node_modules/tree-kill", ], ) diff --git a/tests/e2e/utils/jest.ts b/tests/e2e/utils/jest.ts deleted file mode 100644 index 5dc1f0efe464..000000000000 --- a/tests/e2e/utils/jest.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { silentNpm } from './process'; -import { updateJsonFile } from './project'; - -/** Updates the `test` builder in the current workspace to use Jest with the given options. */ -export async function applyJestBuilder( - options: {} = { - polyfills: [], - tsConfig: 'tsconfig.spec.json', - }, -): Promise { - await silentNpm('install', 'jest@30.2.0', 'jest-environment-jsdom@30.2.0', '--save-dev'); - - await updateJsonFile('angular.json', (json) => { - const projects = Object.values(json['projects']); - if (projects.length !== 1) { - throw new Error( - `Expected exactly one project but found ${projects.length} projects named ${Object.keys( - json['projects'], - ).join(', ')}`, - ); - } - const project = projects[0]! as any; - - // Update to Jest builder. - const test = project['architect']['test']; - test['builder'] = '@angular-devkit/build-angular:jest'; - test['options'] = options; - }); -} diff --git a/tests/e2e/utils/process.ts b/tests/e2e/utils/process.ts index 91216843086a..102acb0af65a 100644 --- a/tests/e2e/utils/process.ts +++ b/tests/e2e/utils/process.ts @@ -1,9 +1,9 @@ import { spawn, SpawnOptions } from 'node:child_process'; import * as child_process from 'node:child_process'; import { getGlobalVariable, getGlobalVariablesEnv } from './env'; -import treeKill from 'tree-kill'; import { delimiter, join, resolve } from 'node:path'; import { stripVTControlCharacters, styleText } from 'node:util'; +import { assertIsError } from './utils'; interface ExecOptions { silent?: boolean; @@ -255,26 +255,43 @@ export async function waitForAnyProcessOutputToMatch( return matchingProcess; } -export async function killAllProcesses(signal = 'SIGTERM'): Promise { +/** + * Kills a process by PID + * @param pid The PID of the process to kill + * @param signal The signal to send to the process + */ +async function killProcess(pid: number, signal: NodeJS.Signals): Promise { + if (process.platform === 'win32') { + // /T kills child processes, /F forces it + await new Promise((resolve) => { + child_process.exec(`taskkill /pid ${pid} /T /F`, () => resolve()); + }); + } else { + // Use -pid to signal the entire process group + try { + process.kill(-pid, signal); + } catch (error) { + assertIsError(error); + if (error.code !== 'ESRCH') { + throw error; + } + } + } +} + +/** + * Kills all tracked processes + */ +export async function killAllProcesses(signal: NodeJS.Signals = 'SIGTERM'): Promise { const processesToKill: Promise[] = []; while (_processes.length) { const childProc = _processes.pop(); - if (!childProc || childProc.pid === undefined) { + if (!childProc || childProc.pid === undefined || childProc.killed) { continue; } - processesToKill.push( - new Promise((resolve) => { - treeKill(childProc.pid!, signal, () => { - // Ignore all errors. - // This is due to a race condition with the `waitForMatch` logic. - // where promises are resolved on matches and not when the process terminates. - // Also in some cases in windows we get `The operation attempted is not supported`. - resolve(); - }); - }), - ); + processesToKill.push(killProcess(childProc.pid, signal)); } await Promise.all(processesToKill); diff --git a/tests/e2e/utils/puppeteer.ts b/tests/e2e/utils/puppeteer.ts index 647773964ec5..d33411938639 100644 --- a/tests/e2e/utils/puppeteer.ts +++ b/tests/e2e/utils/puppeteer.ts @@ -53,7 +53,10 @@ export async function executeBrowserTest(options: BrowserTestOptions = {}) { } }); page.on('pageerror', (err) => { - errors.push(err.toString()); + const error = `${err}`; + if (!error.includes('Hot Module Replacement is disabled')) { + errors.push(error); + } }); await page.goto(url); diff --git a/tests/e2e/utils/web-test-runner.ts b/tests/e2e/utils/web-test-runner.ts deleted file mode 100644 index da66c623b76e..000000000000 --- a/tests/e2e/utils/web-test-runner.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { silentNpm } from './process'; -import { updateJsonFile } from './project'; - -/** Updates the `test` builder in the current workspace to use Web Test Runner with the given options. */ -export async function applyWtrBuilder(): Promise { - await silentNpm('install', '@web/test-runner', '--save-dev'); - - await updateJsonFile('angular.json', (json) => { - const projects = Object.values(json['projects']); - if (projects.length !== 1) { - throw new Error( - `Expected exactly one project but found ${projects.length} projects named ${Object.keys( - json['projects'], - ).join(', ')}`, - ); - } - const project = projects[0]! as any; - - // Update to Web Test Runner builder. - const test = project['architect']['test']; - test['builder'] = '@angular-devkit/build-angular:web-test-runner'; - }); -} diff --git a/tests/e2e_runner.ts b/tests/e2e_runner.ts index c7a672161b7a..f77d6e367e9b 100644 --- a/tests/e2e_runner.ts +++ b/tests/e2e_runner.ts @@ -1,5 +1,4 @@ import { parseArgs, styleText } from 'node:util'; -import { createConsoleLogger } from '../packages/angular_devkit/core/node'; import glob from 'fast-glob'; import * as path from 'node:path'; import * as fs from 'node:fs'; @@ -110,19 +109,6 @@ if (process.env.CHROME_BIN) { process.env.PATH = process.env.PATH! + delimiter + dirname(process.env.CHROME_BIN!); } -const logger = createConsoleLogger(argv.verbose, process.stdout, process.stderr, { - info: (s) => s, - debug: (s) => s, - warn: (s) => styleText(['bold', 'yellow'], s), - error: (s) => styleText(['bold', 'red'], s), - fatal: (s) => styleText(['bold', 'red'], s), -}); - -const logStack = [logger]; -function lastLogger() { - return logStack.at(-1)!; -} - // Under bazel the compiled file (.js) and types (.d.ts) are available. const SRC_FILE_EXT_RE = /\.js$/; const testGlob = (process.env.TESTBRIDGE_TEST_ONLY ?? argv.glob).replace(/\.ts$/, '.js'); @@ -303,8 +289,7 @@ async function runSteps( printHeader(name, stepIndex, steps.length, type); - // Run the test function with the current file on the logStack. - logStack.push(lastLogger().createChild(absoluteName)); + // Run the test function with the current file. try { await run(absoluteName); } catch (e) { @@ -312,8 +297,6 @@ async function runSteps( console.error(styleText(['red'], `${capsType} "${name}" failed...`)); throw e; - } finally { - logStack.pop(); } console.log('----'); diff --git a/tests/package.json b/tests/package.json index 17660ff2192e..87853142d75c 100644 --- a/tests/package.json +++ b/tests/package.json @@ -2,7 +2,6 @@ "devDependencies": { "@types/tar-stream": "3.1.4", "@angular-devkit/schematics": "workspace:*", - "tar-stream": "3.1.7", - "tree-kill": "1.2.2" + "tar-stream": "3.1.8" } } diff --git a/tools/bazel/npm_package.bzl b/tools/bazel/npm_package.bzl index c6ce650d3971..3e2843f37946 100644 --- a/tools/bazel/npm_package.bzl +++ b/tools/bazel/npm_package.bzl @@ -1,8 +1,8 @@ -load("@aspect_bazel_lib//lib:copy_to_bin.bzl", "copy_to_bin") -load("@aspect_bazel_lib//lib:expand_template.bzl", "expand_template") -load("@aspect_bazel_lib//lib:jq.bzl", "jq") -load("@aspect_bazel_lib//lib:utils.bzl", "to_label") load("@aspect_rules_js//npm:defs.bzl", _npm_package = "npm_package") +load("@bazel_lib//lib:copy_to_bin.bzl", "copy_to_bin") +load("@bazel_lib//lib:expand_template.bzl", "expand_template") +load("@bazel_lib//lib:utils.bzl", "to_label") +load("@jq.bzl//jq:jq.bzl", "jq") load("@rules_pkg//:pkg.bzl", "pkg_tar") load("//tools:link_package_json_to_tarballs.bzl", "link_package_json_to_tarballs") load("//tools:snapshot_repo_filter.bzl", "SNAPSHOT_REPO_JQ_FILTER") diff --git a/tools/defaults.bzl b/tools/defaults.bzl index d301591a32ba..dd706151d169 100644 --- a/tools/defaults.bzl +++ b/tools/defaults.bzl @@ -1,6 +1,6 @@ -load("@aspect_bazel_lib//lib:copy_to_bin.bzl", _copy_to_bin = "copy_to_bin") load("@aspect_rules_jasmine//jasmine:defs.bzl", _jasmine_test = "jasmine_test") load("@aspect_rules_js//js:defs.bzl", _js_binary = "js_binary") +load("@bazel_lib//lib:copy_to_bin.bzl", _copy_to_bin = "copy_to_bin") load("@devinfra//bazel/ts_project:index.bzl", "strict_deps_test") load("@rules_angular//src/ng_examples_db:index.bzl", _ng_examples_db = "ng_examples_db") load("@rules_angular//src/ng_package:index.bzl", _ng_package = "ng_package") @@ -65,9 +65,22 @@ def jasmine_test(data = [], args = [], **kwargs): # we change the `chdir` below to the package directory. relative_to_root = "/".join([".."] * len(native.package_name().split("/"))) + # Chromium browser toolchain + env = kwargs.pop("env", {}) + env.update({ + "CHROME_BIN": "$(CHROME-HEADLESS-SHELL)", + "CHROME_PATH": "$(CHROME-HEADLESS-SHELL)", + "CHROMEDRIVER_BIN": "$(CHROMEDRIVER)", + }) + toolchains = kwargs.pop("toolchains", []) + toolchains = toolchains + ["@rules_browsers//browsers/chromium:toolchain_alias"] + data = data + ["@rules_browsers//browsers/chromium"] + _jasmine_test( node_modules = "//:node_modules", chdir = native.package_name(), + env = env, + toolchains = toolchains, args = [ "--require=%s/node_modules/source-map-support/register.js" % relative_to_root, # Escape so that the `js_binary` launcher triggers Bash expansion. diff --git a/tools/link_package_json_to_tarballs.bzl b/tools/link_package_json_to_tarballs.bzl index b01d64669834..4a31cd194bf7 100644 --- a/tools/link_package_json_to_tarballs.bzl +++ b/tools/link_package_json_to_tarballs.bzl @@ -2,8 +2,8 @@ # # Use of this source code is governed by an MIT-style license that can be # found in the LICENSE file at https://angular.dev/license -load("@aspect_bazel_lib//lib:jq.bzl", "jq") -load("@aspect_bazel_lib//lib:utils.bzl", "to_label") +load("@bazel_lib//lib:utils.bzl", "to_label") +load("@jq.bzl//jq:jq.bzl", "jq") def link_package_json_to_tarballs(name, src, pkg_deps, out): """Substitute tar paths into a package.json file for the packages it depends on. diff --git a/tools/test/BUILD.bazel b/tools/test/BUILD.bazel index 5d210ff7ac50..71ef3e3c2794 100644 --- a/tools/test/BUILD.bazel +++ b/tools/test/BUILD.bazel @@ -1,5 +1,5 @@ -load("@aspect_bazel_lib//lib:jq.bzl", "jq") load("@bazel_skylib//rules:diff_test.bzl", "diff_test") +load("@jq.bzl//jq:jq.bzl", "jq") jq( name = "final_package_json", diff --git a/tools/toolchain_info.bzl b/tools/toolchain_info.bzl index 727a02abcae4..f4bfe56f72d3 100644 --- a/tools/toolchain_info.bzl +++ b/tools/toolchain_info.bzl @@ -3,18 +3,12 @@ # the name can be anything the user wants this is just added to the target to create unique names # the order will match against the order in the TOOLCHAIN_VERSION list. TOOLCHAINS_NAMES = [ - "node20", "node22", "node24", ] # this is the list of toolchains that should be used and are registered with nodejs_register_toolchains in the WORKSPACE file TOOLCHAINS_VERSIONS = [ - select({ - "@bazel_tools//src/conditions:linux_x86_64": "@node20_linux_amd64//:node_toolchain", - "@bazel_tools//src/conditions:darwin": "@node20_darwin_amd64//:node_toolchain", - "@bazel_tools//src/conditions:windows": "@node20_windows_amd64//:node_toolchain", - }), select({ "@bazel_tools//src/conditions:linux_x86_64": "@node22_linux_amd64//:node_toolchain", "@bazel_tools//src/conditions:darwin": "@node22_darwin_amd64//:node_toolchain", diff --git a/tools/toolchains/BUILD.bazel b/tools/toolchains/BUILD.bazel index 5895884b09be..09bb94865046 100644 --- a/tools/toolchains/BUILD.bazel +++ b/tools/toolchains/BUILD.bazel @@ -1,18 +1,6 @@ load("@rules_cc//cc:defs.bzl", "cc_toolchain") load(":dummy_cc_toolchain.bzl", "dummy_cc_toolchain_config") -# This is needed following https://github.com/bazel-contrib/rules_nodejs/pull/3859 -toolchain( - name = "node24_windows_no_exec_toolchain", - exec_compatible_with = [], - target_compatible_with = [ - "@platforms//os:windows", - "@platforms//cpu:x86_64", - ], - toolchain = "@node24_windows_amd64//:toolchain", - toolchain_type = "@rules_nodejs//nodejs:toolchain_type", -) - # This defines a dummy C++ toolchain for Windows. # Without this, the build fails with "Unable to find a CC toolchain using toolchain resolution". dummy_cc_toolchain_config(name = "dummy_cc_toolchain_config")