diff --git a/.bazelrc b/.bazelrc
index 140331e11050..4f79c86cf3b4 100644
--- a/.bazelrc
+++ b/.bazelrc
@@ -52,9 +52,6 @@ build --experimental_remote_merkle_tree_cache
# Ensure that tags applied in BUILDs propagate to actions
common --experimental_allow_tags_propagation
-# Don't check if output files have been modified
-build --noexperimental_check_output_files
-
# Ensure sandboxing is enabled even for exclusive tests
test --incompatible_exclusive_test_sandboxed
diff --git a/.bazelversion b/.bazelversion
index ba7f754d0c33..e8be68404bcb 100644
--- a/.bazelversion
+++ b/.bazelversion
@@ -1 +1 @@
-7.4.0
+7.6.1
diff --git a/.github/shared-actions/windows-bazel-test/action.yml b/.github/shared-actions/windows-bazel-test/action.yml
index 524eb1c3a684..5f4de58a153e 100644
--- a/.github/shared-actions/windows-bazel-test/action.yml
+++ b/.github/shared-actions/windows-bazel-test/action.yml
@@ -18,7 +18,7 @@ runs:
steps:
- name: Initialize WSL
id: init_wsl
- uses: angular/dev-infra/github-actions/setup-wsl@9a3e28a515bf51cd2ecfd5f4d5b17613845e6f44
+ uses: angular/dev-infra/github-actions/setup-wsl@1f047e7dbae43ea969c2cafb53b33207e86b800f
with:
wsl_firewall_interface: 'vEthernet (WSL (Hyper-V firewall))'
diff --git a/.github/workflows/assistant-to-the-branch-manager.yml b/.github/workflows/assistant-to-the-branch-manager.yml
index 0753d9c05b1e..b4cea7c321e4 100644
--- a/.github/workflows/assistant-to-the-branch-manager.yml
+++ b/.github/workflows/assistant-to-the-branch-manager.yml
@@ -16,6 +16,6 @@ jobs:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
persist-credentials: false
- - uses: angular/dev-infra/github-actions/branch-manager@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+ - uses: angular/dev-infra/github-actions/branch-manager@1f047e7dbae43ea969c2cafb53b33207e86b800f
with:
angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }}
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index d988709a535f..4c1da241d6dc 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@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+ uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@1f047e7dbae43ea969c2cafb53b33207e86b800f
- name: Setup Bazel
- uses: angular/dev-infra/github-actions/bazel/setup@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+ uses: angular/dev-infra/github-actions/bazel/setup@1f047e7dbae43ea969c2cafb53b33207e86b800f
- 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@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+ uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@1f047e7dbae43ea969c2cafb53b33207e86b800f
- name: Setup Bazel
- uses: angular/dev-infra/github-actions/bazel/setup@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+ uses: angular/dev-infra/github-actions/bazel/setup@1f047e7dbae43ea969c2cafb53b33207e86b800f
- name: Setup Bazel RBE
- uses: angular/dev-infra/github-actions/bazel/configure-remote@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+ uses: angular/dev-infra/github-actions/bazel/configure-remote@1f047e7dbae43ea969c2cafb53b33207e86b800f
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@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+ uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@1f047e7dbae43ea969c2cafb53b33207e86b800f
- name: Setup Bazel
- uses: angular/dev-infra/github-actions/bazel/setup@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+ uses: angular/dev-infra/github-actions/bazel/setup@1f047e7dbae43ea969c2cafb53b33207e86b800f
- name: Setup Bazel RBE
- uses: angular/dev-infra/github-actions/bazel/configure-remote@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+ uses: angular/dev-infra/github-actions/bazel/configure-remote@1f047e7dbae43ea969c2cafb53b33207e86b800f
with:
google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }}
- name: Install node modules
@@ -81,19 +81,19 @@ jobs:
fail-fast: false
matrix:
os: [ubuntu-latest]
- node: [20, 22]
+ node: [20, 22, 24]
subset: [npm, esbuild]
shard: [0, 1, 2, 3, 4, 5]
runs-on: ${{ matrix.os }}
steps:
- name: Initialize environment
- uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+ uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@1f047e7dbae43ea969c2cafb53b33207e86b800f
- name: Install node modules
run: pnpm install --frozen-lockfile
- name: Setup Bazel
- uses: angular/dev-infra/github-actions/bazel/setup@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+ uses: angular/dev-infra/github-actions/bazel/setup@1f047e7dbae43ea969c2cafb53b33207e86b800f
- name: Setup Bazel RBE
- uses: angular/dev-infra/github-actions/bazel/configure-remote@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+ uses: angular/dev-infra/github-actions/bazel/configure-remote@1f047e7dbae43ea969c2cafb53b33207e86b800f
with:
google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }}
- name: Run CLI E2E tests
@@ -110,11 +110,11 @@ jobs:
runs-on: ${{ matrix.os }}
steps:
- name: Initialize environment
- uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+ uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@1f047e7dbae43ea969c2cafb53b33207e86b800f
- name: Setup Bazel
- uses: angular/dev-infra/github-actions/bazel/setup@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+ uses: angular/dev-infra/github-actions/bazel/setup@1f047e7dbae43ea969c2cafb53b33207e86b800f
- name: Setup Bazel RBE
- uses: angular/dev-infra/github-actions/bazel/configure-remote@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+ uses: angular/dev-infra/github-actions/bazel/configure-remote@1f047e7dbae43ea969c2cafb53b33207e86b800f
with:
allow_windows_rbe: true
google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }}
@@ -138,13 +138,13 @@ jobs:
runs-on: ${{ matrix.os }}
steps:
- name: Initialize environment
- uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+ uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@1f047e7dbae43ea969c2cafb53b33207e86b800f
- name: Install node modules
run: pnpm install --frozen-lockfile
- name: Setup Bazel
- uses: angular/dev-infra/github-actions/bazel/setup@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+ uses: angular/dev-infra/github-actions/bazel/setup@1f047e7dbae43ea969c2cafb53b33207e86b800f
- name: Setup Bazel RBE
- uses: angular/dev-infra/github-actions/bazel/configure-remote@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+ uses: angular/dev-infra/github-actions/bazel/configure-remote@1f047e7dbae43ea969c2cafb53b33207e86b800f
with:
google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }}
- name: Run CLI E2E tests
@@ -152,6 +152,7 @@ jobs:
e2e-snapshots:
needs: test
+ if: github.ref == 'refs/heads/main'
strategy:
fail-fast: false
matrix:
@@ -162,13 +163,13 @@ jobs:
runs-on: ${{ matrix.os }}
steps:
- name: Initialize environment
- uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+ uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@1f047e7dbae43ea969c2cafb53b33207e86b800f
- name: Install node modules
run: pnpm install --frozen-lockfile
- name: Setup Bazel
- uses: angular/dev-infra/github-actions/bazel/setup@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+ uses: angular/dev-infra/github-actions/bazel/setup@1f047e7dbae43ea969c2cafb53b33207e86b800f
- name: Setup Bazel RBE
- uses: angular/dev-infra/github-actions/bazel/configure-remote@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+ uses: angular/dev-infra/github-actions/bazel/configure-remote@1f047e7dbae43ea969c2cafb53b33207e86b800f
with:
google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }}
- name: Run CLI E2E tests
@@ -182,13 +183,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@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+ uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@1f047e7dbae43ea969c2cafb53b33207e86b800f
- name: Install node modules
run: pnpm install --frozen-lockfile
- name: Setup Bazel
- uses: angular/dev-infra/github-actions/bazel/setup@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+ uses: angular/dev-infra/github-actions/bazel/setup@1f047e7dbae43ea969c2cafb53b33207e86b800f
- name: Setup Bazel RBE
- uses: angular/dev-infra/github-actions/bazel/configure-remote@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+ uses: angular/dev-infra/github-actions/bazel/configure-remote@1f047e7dbae43ea969c2cafb53b33207e86b800f
with:
google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }}
- name: Run E2E Browser tests
@@ -218,11 +219,11 @@ jobs:
CIRCLE_BRANCH: ${{ github.ref_name }}
steps:
- name: Initialize environment
- uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+ uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@1f047e7dbae43ea969c2cafb53b33207e86b800f
- name: Install node modules
run: pnpm install --frozen-lockfile
- name: Setup Bazel
- uses: angular/dev-infra/github-actions/bazel/setup@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+ uses: angular/dev-infra/github-actions/bazel/setup@1f047e7dbae43ea969c2cafb53b33207e86b800f
- run: pnpm admin snapshots --verbose
env:
SNAPSHOT_BUILDS_GITHUB_TOKEN: ${{ secrets.SNAPSHOT_BUILDS_GITHUB_TOKEN }}
diff --git a/.github/workflows/dev-infra.yml b/.github/workflows/dev-infra.yml
index 4e7ca92ff208..492ce043519b 100644
--- a/.github/workflows/dev-infra.yml
+++ b/.github/workflows/dev-infra.yml
@@ -13,13 +13,13 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- - uses: angular/dev-infra/github-actions/commit-message-based-labels@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+ - uses: angular/dev-infra/github-actions/pull-request-labeling@3a765b303ce300f607b658abd4eb8a981bc7277f
with:
angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }}
post_approval_changes:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- - uses: angular/dev-infra/github-actions/post-approval-changes@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+ - uses: angular/dev-infra/github-actions/post-approval-changes@1f047e7dbae43ea969c2cafb53b33207e86b800f
with:
angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }}
diff --git a/.github/workflows/feature-requests.yml b/.github/workflows/feature-requests.yml
index 088bf0e9bb56..ed7cd4860d72 100644
--- a/.github/workflows/feature-requests.yml
+++ b/.github/workflows/feature-requests.yml
@@ -16,6 +16,6 @@ jobs:
if: github.repository == 'angular/angular-cli'
runs-on: ubuntu-latest
steps:
- - uses: angular/dev-infra/github-actions/feature-request@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+ - uses: angular/dev-infra/github-actions/feature-request@1f047e7dbae43ea969c2cafb53b33207e86b800f
with:
angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }}
diff --git a/.github/workflows/perf.yml b/.github/workflows/perf.yml
index a21fc698a58e..a763a0848c49 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@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+ uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@1f047e7dbae43ea969c2cafb53b33207e86b800f
- 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@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+ uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@1f047e7dbae43ea969c2cafb53b33207e86b800f
- name: Setup Bazel
- uses: angular/dev-infra/github-actions/bazel/setup@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+ uses: angular/dev-infra/github-actions/bazel/setup@1f047e7dbae43ea969c2cafb53b33207e86b800f
- 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 6e4fddcb8973..504ac1010ab4 100644
--- a/.github/workflows/pr.yml
+++ b/.github/workflows/pr.yml
@@ -34,9 +34,9 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Initialize environment
- uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+ uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@1f047e7dbae43ea969c2cafb53b33207e86b800f
- name: Setup Bazel
- uses: angular/dev-infra/github-actions/bazel/setup@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+ uses: angular/dev-infra/github-actions/bazel/setup@1f047e7dbae43ea969c2cafb53b33207e86b800f
- name: Setup ESLint Caching
uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
with:
@@ -56,7 +56,7 @@ jobs:
- name: Run Validation
run: pnpm admin validate
- name: Check Package Licenses
- uses: angular/dev-infra/github-actions/linting/licenses@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+ uses: angular/dev-infra/github-actions/linting/licenses@1f047e7dbae43ea969c2cafb53b33207e86b800f
- name: Check tooling setup
run: pnpm check-tooling-setup
- name: Check commit message
@@ -72,11 +72,11 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Initialize environment
- uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+ uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@1f047e7dbae43ea969c2cafb53b33207e86b800f
- name: Setup Bazel
- uses: angular/dev-infra/github-actions/bazel/setup@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+ uses: angular/dev-infra/github-actions/bazel/setup@1f047e7dbae43ea969c2cafb53b33207e86b800f
- name: Setup Bazel RBE
- uses: angular/dev-infra/github-actions/bazel/configure-remote@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+ uses: angular/dev-infra/github-actions/bazel/configure-remote@1f047e7dbae43ea969c2cafb53b33207e86b800f
- name: Install node modules
run: pnpm install --frozen-lockfile
- name: Build release targets
@@ -90,14 +90,14 @@ jobs:
test:
needs: build
- runs-on: ubuntu-latest
+ runs-on: ubuntu-latest-16core
steps:
- name: Initialize environment
- uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+ uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@1f047e7dbae43ea969c2cafb53b33207e86b800f
- name: Setup Bazel
- uses: angular/dev-infra/github-actions/bazel/setup@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+ uses: angular/dev-infra/github-actions/bazel/setup@1f047e7dbae43ea969c2cafb53b33207e86b800f
- name: Setup Bazel RBE
- uses: angular/dev-infra/github-actions/bazel/configure-remote@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+ uses: angular/dev-infra/github-actions/bazel/configure-remote@1f047e7dbae43ea969c2cafb53b33207e86b800f
- name: Install node modules
run: pnpm install --frozen-lockfile
- name: Run module and package tests
@@ -117,13 +117,13 @@ jobs:
runs-on: ${{ matrix.os }}
steps:
- name: Initialize environment
- uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+ uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@1f047e7dbae43ea969c2cafb53b33207e86b800f
- name: Install node modules
run: pnpm install --frozen-lockfile
- name: Setup Bazel
- uses: angular/dev-infra/github-actions/bazel/setup@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+ uses: angular/dev-infra/github-actions/bazel/setup@1f047e7dbae43ea969c2cafb53b33207e86b800f
- name: Setup Bazel RBE
- uses: angular/dev-infra/github-actions/bazel/configure-remote@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+ uses: angular/dev-infra/github-actions/bazel/configure-remote@1f047e7dbae43ea969c2cafb53b33207e86b800f
- 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/legacy-cli:e2e.${{ matrix.subset }}_node${{ matrix.node }}
@@ -132,11 +132,11 @@ jobs:
runs-on: windows-2025
steps:
- name: Initialize environment
- uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+ uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@1f047e7dbae43ea969c2cafb53b33207e86b800f
- name: Setup Bazel
- uses: angular/dev-infra/github-actions/bazel/setup@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+ uses: angular/dev-infra/github-actions/bazel/setup@1f047e7dbae43ea969c2cafb53b33207e86b800f
- name: Setup Bazel RBE
- uses: angular/dev-infra/github-actions/bazel/configure-remote@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+ uses: angular/dev-infra/github-actions/bazel/configure-remote@1f047e7dbae43ea969c2cafb53b33207e86b800f
with:
allow_windows_rbe: true
- name: Run CLI E2E tests
@@ -157,13 +157,13 @@ jobs:
runs-on: ${{ matrix.os }}
steps:
- name: Initialize environment
- uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+ uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@1f047e7dbae43ea969c2cafb53b33207e86b800f
- name: Install node modules
run: pnpm install --frozen-lockfile
- name: Setup Bazel
- uses: angular/dev-infra/github-actions/bazel/setup@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+ uses: angular/dev-infra/github-actions/bazel/setup@1f047e7dbae43ea969c2cafb53b33207e86b800f
- name: Setup Bazel RBE
- uses: angular/dev-infra/github-actions/bazel/configure-remote@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+ uses: angular/dev-infra/github-actions/bazel/configure-remote@1f047e7dbae43ea969c2cafb53b33207e86b800f
- 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/legacy-cli:e2e.${{ matrix.subset }}_node${{ matrix.node }}
@@ -180,12 +180,12 @@ jobs:
runs-on: ${{ matrix.os }}
steps:
- name: Initialize environment
- uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+ uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@1f047e7dbae43ea969c2cafb53b33207e86b800f
- name: Install node modules
run: pnpm install --frozen-lockfile
- name: Setup Bazel
- uses: angular/dev-infra/github-actions/bazel/setup@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+ uses: angular/dev-infra/github-actions/bazel/setup@1f047e7dbae43ea969c2cafb53b33207e86b800f
- name: Setup Bazel RBE
- uses: angular/dev-infra/github-actions/bazel/configure-remote@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+ uses: angular/dev-infra/github-actions/bazel/configure-remote@1f047e7dbae43ea969c2cafb53b33207e86b800f
- 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/legacy-cli:e2e.snapshots.${{ matrix.subset }}_node${{ matrix.node }}
diff --git a/.ng-dev/dx-perf-workflows.yml b/.ng-dev/dx-perf-workflows.yml
index 21c8b95acff3..70960ff760db 100644
--- a/.ng-dev/dx-perf-workflows.yml
+++ b/.ng-dev/dx-perf-workflows.yml
@@ -19,24 +19,24 @@ workflows:
prepare:
- bazel clean
workflow:
- - bazel test //packages/ngtools/webpack:webpack_test
+ - bazel test //packages/ngtools/webpack:test
devkit-core-tests:
name: '@angular/devkit/core tests'
prepare:
- bazel clean
workflow:
- - bazel test //packages/angular_devkit/core:core_test
+ - bazel test //packages/angular_devkit/core:test
devkit-core-tests-rerun:
name: '@angular/devkit/core return test'
prepare:
- bazel clean
workflow:
- - bazel test //packages/angular_devkit/core:core_test
+ - bazel test //packages/angular_devkit/core:test
# Add a single line to the beginning of a file to trigger a rebuild/retest
- sed -i '1i // comment' packages/angular_devkit/core/src/workspace/core_spec.ts
- - bazel test //packages/angular_devkit/core:core_test
+ - bazel test //packages/angular_devkit/core:test
cleanup:
# Remove the single line added
- sed -i '1d' packages/angular_devkit/core/src/workspace/core_spec.ts
@@ -46,4 +46,4 @@ workflows:
prepare:
- bazel clean
workflow:
- - bazel test //packages/angular/build:unit_tests
+ - bazel test //packages/angular/build:test
diff --git a/.nvmrc b/.nvmrc
index b8ffd70759fb..fc37597bccdb 100644
--- a/.nvmrc
+++ b/.nvmrc
@@ -1 +1 @@
-22.15.0
+22.17.0
diff --git a/CHANGELOG.md b/CHANGELOG.md
index d24b8782fac5..39208a90f89a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,69 +1,269 @@
-
+
-# 19.2.10 (2025-04-30)
+# 20.0.4 (2025-06-25)
-### @angular/build
+### @schematics/angular
-| Commit | Type | Description |
-| --------------------------------------------------------------------------------------------------- | ---- | -------------------- |
-| [067f1cba0](https://github.com/angular/angular-cli/commit/067f1cba031361f71c79b70af143c53c777e9f7d) | fix | update vite to 6.2.7 |
+| Commit | Type | Description |
+| --------------------------------------------------------------------------------------------------- | ---- | --------------------------- |
+| [2316fe29d](https://github.com/angular/angular-cli/commit/2316fe29de57c593e5ccb8be612d3918b60d9761) | fix | add missing prettier config |
+
+### @angular/ssr
+
+| Commit | Type | Description |
+| --------------------------------------------------------------------------------------------------- | ---- | ---------------------------------------------------------------- |
+| [309742289](https://github.com/angular/angular-cli/commit/30974228988d7ff96741fe0515c35275e8a6bc0a) | fix | avoid preloading unnecessary dynamic bundles |
+| [82691b98f](https://github.com/angular/angular-cli/commit/82691b98fa458febf40a16beb91b24c4b6c519c9) | fix | ensure correct referer header handling in web request conversion |
-
+
-# 17.3.17 (2025-04-30)
+# 20.0.3 (2025-06-18)
-### @angular-devkit/build-angular
+### @schematics/angular
-| Commit | Type | Description |
-| --------------------------------------------------------------------------------------------------- | ---- | -------------------------------------- |
-| [743d85bac](https://github.com/angular/angular-cli/commit/743d85bacce03bcc454574e0ffa9f243ff6631dd) | fix | update http-proxy-middleware to v2.0.8 |
+| Commit | Type | Description |
+| --------------------------------------------------------------------------------------------------- | ---- | --------------------------------------------------------- |
+| [e90a808c0](https://github.com/angular/angular-cli/commit/e90a808c0100beb319bae36ca3b771ee2da89435) | fix | include `main.server.ts` in `tsconfig.files` when present |
+| [5c48b8e0a](https://github.com/angular/angular-cli/commit/5c48b8e0ac38a108740ebb290dc1e666ce390806) | fix | reset module `typeSeparator` when generating applications |
+
+### @angular/build
+
+| Commit | Type | Description |
+| --------------------------------------------------------------------------------------------------- | ---- | ----------------------------------------------------- |
+| [56f426e25](https://github.com/angular/angular-cli/commit/56f426e2548b86c00d4da19b9f7b5cf97dc79104) | fix | include custom bundle name scripts with karma |
+| [dfe3a8b73](https://github.com/angular/angular-cli/commit/dfe3a8b7342dd492e42ec48052612255ba76c09b) | fix | increase worker idle timeout |
+| [e6d27bd5e](https://github.com/angular/angular-cli/commit/e6d27bd5e3fe64f597621e0d5c08060cea64a302) | fix | set scripts option output as classic script for karma |
-
+
-# 20.0.0-next.8 (2025-04-23)
+# 20.0.2 (2025-06-11)
### @schematics/angular
-| Commit | Type | Description |
-| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------ |
-| [0ab1ddf63](https://github.com/angular/angular-cli/commit/0ab1ddf632b7305db28a2f87f5c6b099a44669f6) | feat | generate libraries using TypeScript project references |
+| Commit | Type | Description |
+| --------------------------------------------------------------------------------------------------- | ---- | --------------------------------------------------------------------- |
+| [bf64a0f2d](https://github.com/angular/angular-cli/commit/bf64a0f2dcc2cbd5dc56e575dd337c16f2a3342b) | fix | add `less` as a devDependency when selected as the style preprocessor |
+| [cb258a3e1](https://github.com/angular/angular-cli/commit/cb258a3e1525cda985109692fb88449259119ff2) | fix | correctly detect modules using new file extension format |
### @angular/build
-| Commit | Type | Description |
-| --------------------------------------------------------------------------------------------------- | ---- | -------------------------------------------- |
-| [12def3a2e](https://github.com/angular/angular-cli/commit/12def3a2e907ca8e7d530cea1b39bba90e153144) | feat | add experimental vitest unit-testing support |
+| Commit | Type | Description |
+| --------------------------------------------------------------------------------------------------- | ---- | ---------------------------------------------------------- |
+| [424f1cbbf](https://github.com/angular/angular-cli/commit/424f1cbbfb709b4d6f480e6321ec1a152813cf5c) | fix | do not consider internal Angular files as external imports |
-
+
-# 20.0.0-next.7 (2025-04-23)
+# 20.0.1 (2025-06-04)
-### @schematics/angular
+### @angular/cli
| Commit | Type | Description |
| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------ |
-| [e03f2b899](https://github.com/angular/angular-cli/commit/e03f2b89992cb1e34a57f9cd5beef77674c116b6) | feat | Add global error listeners to new app generation |
-| [672ae14cd](https://github.com/angular/angular-cli/commit/672ae14cd21d02a3b4727e2febd88747b9e4c684) | fix | drop composite in tsconfig |
-| [5e8c6494d](https://github.com/angular/angular-cli/commit/5e8c6494d3eb5a0f61e8b07de4c53233147e9d46) | fix | relative tsconfig paths in references |
+| [0883248cb](https://github.com/angular/angular-cli/commit/0883248cbdebcad09393349a0a5d9487b2a452ae) | fix | improve Node.js version check and error messages |
+
+### @schematics/angular
+
+| Commit | Type | Description |
+| --------------------------------------------------------------------------------------------------- | ---- | ---------------------------------------------------------------------- |
+| [525ddcbd2](https://github.com/angular/angular-cli/commit/525ddcbd290525e4dac2547c352cf6c774d728a2) | fix | only overwrite JSON file if actually changed |
+| [83c820e5a](https://github.com/angular/angular-cli/commit/83c820e5ab55d01662417a51e4cc8d094e409fc6) | fix | remove karma config devkit package usages during application migration |
+| [87266b38a](https://github.com/angular/angular-cli/commit/87266b38a09ce783ac6d18f532ebe1f8ae5954c0) | fix | skip zone.js dependency for zoneless applications |
### @angular/build
-| Commit | Type | Description |
-| --------------------------------------------------------------------------------------------------- | ---- | ---------------------------------------------------------- |
-| [e80963036](https://github.com/angular/angular-cli/commit/e8096303659f4f02ac05fe8f655bb29bc12fda28) | feat | expand browser support policy to widely available Baseline |
-| [566de64cb](https://github.com/angular/angular-cli/commit/566de64cbeebeb532db3c0f4ed1dd607c31dedf1) | fix | use virtual module for Karma TestBed initialization |
+| Commit | Type | Description |
+| --------------------------------------------------------------------------------------------------- | ---- | ----------------------------------------------------- |
+| [e5efdc577](https://github.com/angular/angular-cli/commit/e5efdc577be913870b29173345b8194b87420474) | fix | also disable outputMode in vitest unit-tests |
+| [5814393db](https://github.com/angular/angular-cli/commit/5814393dbb2f9227ce10f1df77a8deee06c7d1c5) | fix | resolve junit karma reporter output to workspace root |
+
+
+
+
+
+# 20.0.0 (2025-05-28)
+
+## Breaking Changes
+
+### @angular/cli
+
+- Node.js v18 is no longer supported with Angular.
+
+ Before updating a project to Angular v20, the Node.js version must be
+ at least 20.11.1. For the full list of supported Node.js versions,
+ see https://angular.dev/reference/versions.
+
+- Node.js versions from 22.0 to 22.10 are no longer supported
+
+### @schematics/angular
+
+- `--server-routing` option has been removed from several schematics. Server routing will be used when using the application builder.
+
+### @angular-devkit/schematics
+
+- The `NodePackageLinkTask` has been removed without a replacement. Create a custom task if needed.
+
+ Note: This does not affect application developers.
+
+### @angular/build
+
+- TypeScript versions less than 5.8 are no longer supported.
+
+### @schematics/angular
+
+| Commit | Type | Description |
+| --------------------------------------------------------------------------------------------------- | ---- | ---------------------------------------------------------------------------------------- |
+| [e03f2b899](https://github.com/angular/angular-cli/commit/e03f2b89992cb1e34a57f9cd5beef77674c116b6) | feat | Add global error listeners to new app generation |
+| [1e137ca84](https://github.com/angular/angular-cli/commit/1e137ca848839402bc214fbccdc04243862d01d0) | feat | add migration to update `moduleResolution` to `bundler` |
+| [26fd4ea73](https://github.com/angular/angular-cli/commit/26fd4ea73ad2a0148ae587d582134c68a0bf4b86) | feat | add migrations for server rendering updates |
+| [5876577af](https://github.com/angular/angular-cli/commit/5876577af163b534846e720b0184558197dce741) | feat | Add prompt for new apps to be zoneless |
+| [fdc6291dd](https://github.com/angular/angular-cli/commit/fdc6291dda4903f418667d415b05367390cf829d) | feat | add update migration to keep previous style guide generation behavior |
+| [093c5a315](https://github.com/angular/angular-cli/commit/093c5a3152c4282d4afb51df40945283cc94d281) | feat | directly use `@angular/build` in new projects |
+| [d6f594fe0](https://github.com/angular/angular-cli/commit/d6f594fe0f8f21d9c0e2abedb5c8433a1aa5c157) | feat | generate applications using TypeScript project references |
+| [0ab1ddf63](https://github.com/angular/angular-cli/commit/0ab1ddf632b7305db28a2f87f5c6b099a44669f6) | feat | generate libraries using TypeScript project references |
+| [18e13e2ce](https://github.com/angular/angular-cli/commit/18e13e2ceed931d29aa5582980c7d6d1f66c9787) | feat | remove `--server-routing` option |
+| [03180fe03](https://github.com/angular/angular-cli/commit/03180fe0358662f8fd3255ad546994da3e3bda9c) | feat | use TypeScript module preserve option for new projects |
+| [86d241629](https://github.com/angular/angular-cli/commit/86d241629ff51f0bb5988e81cac8658b01704d49) | fix | add `@angular/ssr` dependency only when `provideServerRendering` import has been updated |
+| [9e6b9b537](https://github.com/angular/angular-cli/commit/9e6b9b5379d0448578b3bfb6100852dea7febe75) | fix | add type checking of host bindings to strict config |
+| [8654b3fea](https://github.com/angular/angular-cli/commit/8654b3fea4e2ba5af651e6c2a4afddaf6fc42802) | fix | application migration should migrate karma builder package |
+| [c557a19ef](https://github.com/angular/angular-cli/commit/c557a19ef4eed9f2d805bb235d3819c69a1aaef6) | fix | avoid empty polyfill option for new zoneless application |
+| [90615a88b](https://github.com/angular/angular-cli/commit/90615a88b10535d7f0197008b9d48ceac4409c23) | fix | default component templates to not use `.ng.html` extension |
+| [672ae14cd](https://github.com/angular/angular-cli/commit/672ae14cd21d02a3b4727e2febd88747b9e4c684) | fix | drop composite in tsconfig |
+| [da6ef626f](https://github.com/angular/angular-cli/commit/da6ef626f960b187a7862f0caa3d8aed38224ac2) | fix | ensure app-shell schematic consistently uses `withAppShell` |
+| [f126f8d34](https://github.com/angular/angular-cli/commit/f126f8d34b087dd3a916dfb93cd255aac4d6c309) | fix | ensure module discovery checks for an NgModule decorator |
+| [dc2f65999](https://github.com/angular/angular-cli/commit/dc2f65999a64453a26b61c96080b732fdc4147c8) | fix | generate component templates with a `.ng.html` file extension |
+| [23fc8e1e1](https://github.com/angular/angular-cli/commit/23fc8e1e176f23442876b086bff52dd5f35abbc0) | fix | generate components without a `.component` extension/type |
+| [8d715fa94](https://github.com/angular/angular-cli/commit/8d715fa948d432b18d06bcf42eed3a7681383523) | fix | generate directives without a .directive extension/type |
+| [5fc595144](https://github.com/angular/angular-cli/commit/5fc5951440c9306c4349fa3f8dbcb1b584441fe8) | fix | generate guards with a dash type separator |
+| [040282d8f](https://github.com/angular/angular-cli/commit/040282d8fd5838266785997442c4f5a269666cf3) | fix | generate interceptors with a dash type separator |
+| [070d60fb3](https://github.com/angular/angular-cli/commit/070d60fb383bb14d39f969942641253e54980fcf) | fix | generate modules with a dash type separator |
+| [e6083b57b](https://github.com/angular/angular-cli/commit/e6083b57bb5b38db14264253095a9729738d22f2) | fix | generate pipes with a dash type separator |
+| [92e193c0b](https://github.com/angular/angular-cli/commit/92e193c0b9a2b85b68d83c5f378d30fc8d10f13e) | fix | generate resolvers with a dash type separator |
+| [bc0f07b48](https://github.com/angular/angular-cli/commit/bc0f07b484300848ee81c5719c58909b40f99deb) | fix | generate services without a .service extension/type |
+| [ea1143ddd](https://github.com/angular/angular-cli/commit/ea1143ddd801b775828f0b62788f4cce0dd7e9ce) | fix | infer app component name and path in server schematic |
+| [bcc0892a6](https://github.com/angular/angular-cli/commit/bcc0892a65f00e68709e84c380f448a5e0fd05e7) | fix | migrate `provideServerRoutesConfig` to `provideServerRendering` |
+| [5e8c6494d](https://github.com/angular/angular-cli/commit/5e8c6494d3eb5a0f61e8b07de4c53233147e9d46) | fix | relative tsconfig paths in references |
+| [381d35fe4](https://github.com/angular/angular-cli/commit/381d35fe40f062713eac550a12b58c30c1ec33a9) | fix | remove empty `scripts` option value from new applications |
+| [148498c2b](https://github.com/angular/angular-cli/commit/148498c2bcd0feb495dc0aa14b6a4555ac01facb) | fix | Remove experimental from zoneless |
+| [a910fe9ae](https://github.com/angular/angular-cli/commit/a910fe9ae0423146f6509c5b9c45c88415365c9f) | fix | remove explicit `outputPath` option value from generated applications |
+| [901ab60d9](https://github.com/angular/angular-cli/commit/901ab60d9f63fcff17213dbf7fe17e4a46835974) | fix | remove explicit index option from new applications |
+| [be6f13ec1](https://github.com/angular/angular-cli/commit/be6f13ec16f01851d38b900dbfc4df7ccfb94d16) | fix | remove setting files tsconfig field with SSR/Server generation |
+| [661609e3e](https://github.com/angular/angular-cli/commit/661609e3e583198828baf236338db17b6222f4d8) | fix | set explicit type in library schematic |
+| [0f7dc2cd8](https://github.com/angular/angular-cli/commit/0f7dc2cd8f76f928e64e734563a433ff6a0d478c) | fix | skip spec project reference for minimal ng new |
+| [3cf6ab0f7](https://github.com/angular/angular-cli/commit/3cf6ab0f77b23b8717e79b7125ea930cb018ebc5) | fix | support using default browser option when not present |
+| [b13805a77](https://github.com/angular/angular-cli/commit/b13805a77a5654a352a6c6f760965c326977ff14) | fix | use protected for class member |
+
+### @angular/cli
+
+| Commit | Type | Description |
+| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------ |
+| [e513cd4aa](https://github.com/angular/angular-cli/commit/e513cd4aa218e5ab634f05c18b6aa90f223e096c) | fix | add Node.js 24 as supported version |
+| [5e90c1b4e](https://github.com/angular/angular-cli/commit/5e90c1b4ec3f1d05ad00f2f854347a5bf8cb0860) | fix | remove Node.js v18 support |
+| [787e510dc](https://github.com/angular/angular-cli/commit/787e510dccabf30589194fcefdb74a687dfa3945) | fix | update min Node.js support to 20.19, 22.12, and 24.0 |
+| [64732534e](https://github.com/angular/angular-cli/commit/64732534ecb84d702bde2469466a05e765879f9a) | fix | update minimum supported Node.js 22 version to 22.11.0 |
+
+### @angular-devkit/build-angular
+
+| Commit | Type | Description |
+| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------- |
+| [a42e045ba](https://github.com/angular/angular-cli/commit/a42e045bab3bfbeb0bb69c3406fd0a76ae263cdf) | fix | respect i18nDuplicateTranslation option when duplicates exist |
+
+### @angular-devkit/schematics
+
+| Commit | Type | Description |
+| --------------------------------------------------------------------------------------------------- | -------- | --------------------------------------- |
+| [e6be37601](https://github.com/angular/angular-cli/commit/e6be37601d57f884a1ddf2cc1ddecf51819b9f51) | refactor | remove deprecated `NodePackageLinkTask` |
+
+### @angular/build
+
+| Commit | Type | Description |
+| --------------------------------------------------------------------------------------------------- | ---- | -------------------------------------------------------------------------- |
+| [d6ea6b09f](https://github.com/angular/angular-cli/commit/d6ea6b09f182433f859a78d4a4d38a9db521e593) | feat | add experimental vitest browser support to unit-testing |
+| [12def3a2e](https://github.com/angular/angular-cli/commit/12def3a2e907ca8e7d530cea1b39bba90e153144) | feat | add experimental vitest unit-testing support |
+| [c1de63300](https://github.com/angular/angular-cli/commit/c1de633007c423cfd9113cc781b5647e59306146) | feat | allow control of source map sources content for application builds |
+| [31c81e9c6](https://github.com/angular/angular-cli/commit/31c81e9c6859e68d00828b345d996d1aff431b25) | feat | drop support for TypeScript older than 5.8 |
+| [e80963036](https://github.com/angular/angular-cli/commit/e8096303659f4f02ac05fe8f655bb29bc12fda28) | feat | expand browser support policy to widely available Baseline |
+| [3c9172159](https://github.com/angular/angular-cli/commit/3c9172159c72f3c8ea116557ba5bf917a15d2f07) | feat | integrate Chrome automatic workspace folders |
+| [9b682e625](https://github.com/angular/angular-cli/commit/9b682e62519e761477e6266650239bf58026a9f4) | feat | support a default outputPath option for applications |
+| [d067cedf0](https://github.com/angular/angular-cli/commit/d067cedf05051e3a0f237d50306e1e4c881a0328) | feat | support custom resolution conditions with applications |
+| [f4be83119](https://github.com/angular/angular-cli/commit/f4be831197010a17394264bc74b1eb385ba95028) | feat | Support Sass package importers |
+| [f36a27272](https://github.com/angular/angular-cli/commit/f36a27272f3f7e2673d692d73286280f4c6d357a) | fix | allow a default application `browser` option |
+| [f42f5c14c](https://github.com/angular/angular-cli/commit/f42f5c14c0c51d7705bee7b67afc317c45fb9230) | fix | allow component HMR for templates with i18n |
+| [e36bf964a](https://github.com/angular/angular-cli/commit/e36bf964a776b04f6a9193387692274865e1630b) | fix | allow TestBed provider configuration with vitest unit-testing |
+| [769961e4a](https://github.com/angular/angular-cli/commit/769961e4a9a67f88f8fb4b7de80dea67825219f9) | fix | allow vitest-based unit testing to use watch option |
+| [3e24a59a9](https://github.com/angular/angular-cli/commit/3e24a59a9db9f11a80fa616c68be4380c4816ed5) | fix | disable TypeScript `composite` option with Angular compiler |
+| [b155ba1dc](https://github.com/angular/angular-cli/commit/b155ba1dcdbc3c506311e4434c37f1b4c77c7572) | fix | enable unit-test builder watch outside CI |
+| [7bb1f8747](https://github.com/angular/angular-cli/commit/7bb1f87478d441e35b73b920c8bfcd4376a3422d) | fix | enable unit-test reporters option |
+| [05485ede7](https://github.com/angular/angular-cli/commit/05485ede7b472f98120c51f28bd485eeb635bac2) | fix | ensure `com.chrome.devtools.json` is consistently served after initial run |
+| [7877d9a97](https://github.com/angular/angular-cli/commit/7877d9a971dbef5025fdb9a40f49f36e9b42569d) | fix | ensure disabled vitest config loading |
+| [c8c73185a](https://github.com/angular/angular-cli/commit/c8c73185a66c7c7825e30f7fcedbaacc9ca1c593) | fix | ensure matching coverage excludes with karma on Windows |
+| [aec95042b](https://github.com/angular/angular-cli/commit/aec95042b4d690c25645af590788c608b4b353dc) | fix | exclude only source test files with unit-test vitest support |
+| [5bea3de4c](https://github.com/angular/angular-cli/commit/5bea3de4cb2ffa26ad04aced22be3ff11f519f92) | fix | invalidate `com.chrome.devtools.json` if project is moved |
+| [1cd65a08d](https://github.com/angular/angular-cli/commit/1cd65a08d5278134115f33ff0e666aee420faf8a) | fix | perform testing module cleanup when using Vitest |
+| [c51a540ce](https://github.com/angular/angular-cli/commit/c51a540ce4fb191811d2be06a9937f11826b38a5) | fix | provide direct debugging support for unit test builder |
+| [c7f2cb596](https://github.com/angular/angular-cli/commit/c7f2cb59684a264bb4ecab2024d8a8c58efbefa7) | fix | provide vitest globals in unit-test builder |
+| [d2bfc6bd4](https://github.com/angular/angular-cli/commit/d2bfc6bd4eb0892e9eb6205838158142b716d21c) | fix | revert setup unit-test polyfills before TestBed init |
+| [0d40cdecd](https://github.com/angular/angular-cli/commit/0d40cdecd0fdc1b03d2cafcdd5321db0d31b56ee) | fix | setup unit-test polyfills before TestBed init |
+| [fa3dc6387](https://github.com/angular/angular-cli/commit/fa3dc6387db971be265c1c5391c71a23c62df15c) | fix | show unit-test error for missing vitest browser package |
+| [247cd3352](https://github.com/angular/angular-cli/commit/247cd335217d9997995321b4b235c40480adadb3) | fix | show unit-test error for missing vitest package |
+| [eee816f79](https://github.com/angular/angular-cli/commit/eee816f79b4464286dcecc16f53c06be8afd4ccf) | fix | use global unit-test hooks during TestBed init |
+| [566de64cb](https://github.com/angular/angular-cli/commit/566de64cbeebeb532db3c0f4ed1dd607c31dedf1) | fix | use virtual module for Karma TestBed initialization |
+| [52fbffcd7](https://github.com/angular/angular-cli/commit/52fbffcd7bb129720a10e6bf865e4e3a01f939d6) | fix | warn and remove jsdom launcher when used with karma |
+| [5ff6188c4](https://github.com/angular/angular-cli/commit/5ff6188c4330b009201a64a23d0090bfcec0612f) | perf | directly check code for Angular partial linking |
+
+### @angular/pwa
+
+| Commit | Type | Description |
+| --------------------------------------------------------------------------------------------------- | ---- | --------------------------------------------------- |
+| [fa0a06f9f](https://github.com/angular/angular-cli/commit/fa0a06f9f92b28929fc775074245a0b97c3d9adc) | fix | support using default index option when not present |
### @angular/ssr
-| Commit | Type | Description |
-| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------ |
-| [8bfcae4c1](https://github.com/angular/angular-cli/commit/8bfcae4c1ba19c9bbd75ddb1ed61ddbf6fa2b76b) | fix | support `getPrerenderParams` for wildcard routes |
+| Commit | Type | Description |
+| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------------------------------- |
+| [33b9de3eb](https://github.com/angular/angular-cli/commit/33b9de3eb1fa596a4d5a975d05275739f2f7b8ae) | feat | expose `provideServerRendering` and remove `provideServerRouting` |
+| [cdfc50c29](https://github.com/angular/angular-cli/commit/cdfc50c29a2aa6f32d172b505a0ef09e563dfc59) | feat | stabilize `AngularNodeAppEngine`, `AngularAppEngine`, and `provideServerRouting` APIs |
+| [319b8e0c2](https://github.com/angular/angular-cli/commit/319b8e0c2a0cd30ab96576464b4172a1f76a97a6) | fix | manage unhandled errors in zoneless applications |
+| [2d11e8e45](https://github.com/angular/angular-cli/commit/2d11e8e45b29cf879ee72ffbcf438198d73ffaba) | fix | return 302 when redirectTo is a function |
+| [059c10eb4](https://github.com/angular/angular-cli/commit/059c10eb4df72b0d67f73783826e2bbae611ad35) | fix | SSR should work without `@angular/router` |
+| [63428f3f1](https://github.com/angular/angular-cli/commit/63428f3f1e2ffd427011ea8a17b70f8829ae0bdf) | perf | flush headers prior to start rendering the HTML |
+| [280693231](https://github.com/angular/angular-cli/commit/280693231e143aa09f841e3179317573a3576545) | perf | optimize response times by introducing header flushing |
+| [6bd7b9b4a](https://github.com/angular/angular-cli/commit/6bd7b9b4a59240caa4f19185570aec8263d8a0a7) | perf | optimized request handling performance |
+
+### @ngtools/webpack
+
+| Commit | Type | Description |
+| --------------------------------------------------------------------------------------------------- | ---- | --------------------------------------------------------- |
+| [427bd846f](https://github.com/angular/angular-cli/commit/427bd846f552b393cb969472a05488ac11d47e9f) | fix | disable TypeScript composite option with Angular compiler |
+
+
+
+
+
+# 19.2.10 (2025-04-30)
+
+### @angular/build
+
+| Commit | Type | Description |
+| --------------------------------------------------------------------------------------------------- | ---- | -------------------- |
+| [067f1cba0](https://github.com/angular/angular-cli/commit/067f1cba031361f71c79b70af143c53c777e9f7d) | fix | update vite to 6.2.7 |
+
+
+
+
+
+# 17.3.17 (2025-04-30)
+
+### @angular-devkit/build-angular
+
+| Commit | Type | Description |
+| --------------------------------------------------------------------------------------------------- | ---- | -------------------------------------- |
+| [743d85bac](https://github.com/angular/angular-cli/commit/743d85bacce03bcc454574e0ffa9f243ff6631dd) | fix | update http-proxy-middleware to v2.0.8 |
@@ -103,29 +303,6 @@
-
-
-# 20.0.0-next.6 (2025-04-16)
-
-### @schematics/angular
-
-| Commit | Type | Description |
-| --------------------------------------------------------------------------------------------------- | ---- | -------------------------------------------------------------- |
-| [d6f594fe0](https://github.com/angular/angular-cli/commit/d6f594fe0f8f21d9c0e2abedb5c8433a1aa5c157) | feat | generate applications using TypeScript project references |
-| [8654b3fea](https://github.com/angular/angular-cli/commit/8654b3fea4e2ba5af651e6c2a4afddaf6fc42802) | fix | application migration should migrate karma builder package |
-| [be6f13ec1](https://github.com/angular/angular-cli/commit/be6f13ec16f01851d38b900dbfc4df7ccfb94d16) | fix | remove setting files tsconfig field with SSR/Server generation |
-
-### @angular/build
-
-| Commit | Type | Description |
-| --------------------------------------------------------------------------------------------------- | ---- | -------------------------------------------------------------------- |
-| [d5a409a79](https://github.com/angular/angular-cli/commit/d5a409a79da16d368a6c0c588f9c987355ead529) | fix | include `module` value check when adding custom conditions |
-| [95d16dc52](https://github.com/angular/angular-cli/commit/95d16dc52113a1d5f67c95a5f6d82e5e937f299c) | fix | pass `preserveSymlinks` option to Karma esbuild builder |
-| [3d997feb6](https://github.com/angular/angular-cli/commit/3d997feb689b838a9777b7727bf937098c7d5e83) | fix | prevent nested CSS in components |
-| [6e6315d72](https://github.com/angular/angular-cli/commit/6e6315d72686a88f29ec9e7565b463e302fdbed8) | fix | properly resolve transitive external dependencies in vite-dev-server |
-
-
-
# 19.2.8 (2025-04-16)
@@ -141,46 +318,6 @@
-
-
-# 20.0.0-next.5 (2025-04-09)
-
-### @schematics/angular
-
-| Commit | Type | Description |
-| --------------------------------------------------------------------------------------------------- | ---- | --------------------------------------------------------------------- |
-| [fdc6291dd](https://github.com/angular/angular-cli/commit/fdc6291dda4903f418667d415b05367390cf829d) | feat | add update migration to keep previous style guide generation behavior |
-| [90615a88b](https://github.com/angular/angular-cli/commit/90615a88b10535d7f0197008b9d48ceac4409c23) | fix | default component templates to not use `.ng.html` extension |
-| [5fc595144](https://github.com/angular/angular-cli/commit/5fc5951440c9306c4349fa3f8dbcb1b584441fe8) | fix | generate guards with a dash type separator |
-| [040282d8f](https://github.com/angular/angular-cli/commit/040282d8fd5838266785997442c4f5a269666cf3) | fix | generate interceptors with a dash type separator |
-| [070d60fb3](https://github.com/angular/angular-cli/commit/070d60fb383bb14d39f969942641253e54980fcf) | fix | generate modules with a dash type separator |
-| [e6083b57b](https://github.com/angular/angular-cli/commit/e6083b57bb5b38db14264253095a9729738d22f2) | fix | generate pipes with a dash type separator |
-| [92e193c0b](https://github.com/angular/angular-cli/commit/92e193c0b9a2b85b68d83c5f378d30fc8d10f13e) | fix | generate resolvers with a dash type separator |
-| [ea1143ddd](https://github.com/angular/angular-cli/commit/ea1143ddd801b775828f0b62788f4cce0dd7e9ce) | fix | infer app component name and path in server schematic |
-| [661609e3e](https://github.com/angular/angular-cli/commit/661609e3e583198828baf236338db17b6222f4d8) | fix | set explicit type in library schematic |
-
-### @angular/build
-
-| Commit | Type | Description |
-| --------------------------------------------------------------------------------------------------- | ---- | ----------------------------------------------------------- |
-| [3e24a59a9](https://github.com/angular/angular-cli/commit/3e24a59a9db9f11a80fa616c68be4380c4816ed5) | fix | disable TypeScript `composite` option with Angular compiler |
-| [6f913ad5e](https://github.com/angular/angular-cli/commit/6f913ad5e4d8ad9932ef2607851e3b8776e1af3a) | fix | include component test metadata in development builds |
-| [fc0e05fea](https://github.com/angular/angular-cli/commit/fc0e05fea89598204a7e5de494da897c396c4e52) | fix | skip normalization of relative externals |
-
-### @angular/ssr
-
-| Commit | Type | Description |
-| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------ |
-| [319b8e0c2](https://github.com/angular/angular-cli/commit/319b8e0c2a0cd30ab96576464b4172a1f76a97a6) | fix | manage unhandled errors in zoneless applications |
-
-### @ngtools/webpack
-
-| Commit | Type | Description |
-| --------------------------------------------------------------------------------------------------- | ---- | --------------------------------------------------------- |
-| [427bd846f](https://github.com/angular/angular-cli/commit/427bd846f552b393cb969472a05488ac11d47e9f) | fix | disable TypeScript composite option with Angular compiler |
-
-
-
# 19.2.7 (2025-04-09)
@@ -219,32 +356,6 @@
-
-
-# 20.0.0-next.4 (2025-04-02)
-
-### @schematics/angular
-
-| Commit | Type | Description |
-| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------- |
-| [1e137ca84](https://github.com/angular/angular-cli/commit/1e137ca848839402bc214fbccdc04243862d01d0) | feat | add migration to update `moduleResolution` to `bundler` |
-
-### @angular-devkit/schematics
-
-| Commit | Type | Description |
-| --------------------------------------------------------------------------------------------------- | ---- | -------------------------------------------------------------------------- |
-| [4955ee0aa](https://github.com/angular/angular-cli/commit/4955ee0aa31c1021b6369c29a250dd5a9a3f11cd) | fix | properly resolve relative schematics when executed from a nested directory |
-
-### @angular/build
-
-| Commit | Type | Description |
-| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------ |
-| [d067cedf0](https://github.com/angular/angular-cli/commit/d067cedf05051e3a0f237d50306e1e4c881a0328) | feat | support custom resolution conditions with applications |
-| [8a89438be](https://github.com/angular/angular-cli/commit/8a89438bef66e00d9795a5684c2b91dfdc102b3f) | fix | correctly handle `false` value in server option |
-| [52fbffcd7](https://github.com/angular/angular-cli/commit/52fbffcd7bb129720a10e6bf865e4e3a01f939d6) | fix | warn and remove jsdom launcher when used with karma |
-
-
-
# 19.2.6 (2025-04-02)
@@ -288,49 +399,6 @@
-
-
-# 20.0.0-next.3 (2025-03-26)
-
-## Breaking Changes
-
-### @angular/cli
-
-- Node.js versions from 22.0 to 22.10 are no longer supported
-
-### @schematics/angular
-
-| Commit | Type | Description |
-| --------------------------------------------------------------------------------------------------- | ---- | --------------------------------------------------------------------- |
-| [9e6b9b537](https://github.com/angular/angular-cli/commit/9e6b9b5379d0448578b3bfb6100852dea7febe75) | fix | add type checking of host bindings to strict config |
-| [381d35fe4](https://github.com/angular/angular-cli/commit/381d35fe40f062713eac550a12b58c30c1ec33a9) | fix | remove empty `scripts` option value from new applications |
-| [a910fe9ae](https://github.com/angular/angular-cli/commit/a910fe9ae0423146f6509c5b9c45c88415365c9f) | fix | remove explicit `outputPath` option value from generated applications |
-
-### @angular/cli
-
-| Commit | Type | Description |
-| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------ |
-| [64732534e](https://github.com/angular/angular-cli/commit/64732534ecb84d702bde2469466a05e765879f9a) | fix | update minimum supported Node.js 22 version to 22.11.0 |
-
-### @angular/build
-
-| Commit | Type | Description |
-| --------------------------------------------------------------------------------------------------- | ---- | ----------------------------------------------------------------------- |
-| [c1de63300](https://github.com/angular/angular-cli/commit/c1de633007c423cfd9113cc781b5647e59306146) | feat | allow control of source map sources content for application builds |
-| [9b682e625](https://github.com/angular/angular-cli/commit/9b682e62519e761477e6266650239bf58026a9f4) | feat | support a default outputPath option for applications |
-| [156a14e38](https://github.com/angular/angular-cli/commit/156a14e387d83002fa01b33d574a6fbc078dad84) | fix | correct handling of response/request errors |
-| [a8817a3b2](https://github.com/angular/angular-cli/commit/a8817a3b2a9a94bdfcba4bf690e217e7d2d4686c) | fix | handle undefined `getOrCreateAngularServerApp` during error compilation |
-| [bd917d92a](https://github.com/angular/angular-cli/commit/bd917d92a653b1a5ece7ab96adfde8f8d282c34a) | fix | normalize karma asset paths before lookup |
-
-### @angular/ssr
-
-| Commit | Type | Description |
-| --------------------------------------------------------------------------------------------------- | ---- | ----------------------------------------------- |
-| [63428f3f1](https://github.com/angular/angular-cli/commit/63428f3f1e2ffd427011ea8a17b70f8829ae0bdf) | perf | flush headers prior to start rendering the HTML |
-| [6bd7b9b4a](https://github.com/angular/angular-cli/commit/6bd7b9b4a59240caa4f19185570aec8263d8a0a7) | perf | optimized request handling performance |
-
-
-
# 19.2.5 (2025-03-26)
@@ -376,47 +444,6 @@
-
-
-# 20.0.0-next.2 (2025-03-19)
-
-## Breaking Changes
-
-### @schematics/angular
-
-- `--server-routing` option has been removed from several schematics. Server routing will be used when using the application builder.
-
-### @schematics/angular
-
-| Commit | Type | Description |
-| --------------------------------------------------------------------------------------------------- | ---- | ---------------------------------------------------------------------------------------- |
-| [26fd4ea73](https://github.com/angular/angular-cli/commit/26fd4ea73ad2a0148ae587d582134c68a0bf4b86) | feat | add migrations for server rendering updates |
-| [18e13e2ce](https://github.com/angular/angular-cli/commit/18e13e2ceed931d29aa5582980c7d6d1f66c9787) | feat | remove `--server-routing` option |
-| [86d241629](https://github.com/angular/angular-cli/commit/86d241629ff51f0bb5988e81cac8658b01704d49) | fix | add `@angular/ssr` dependency only when `provideServerRendering` import has been updated |
-| [da6ef626f](https://github.com/angular/angular-cli/commit/da6ef626f960b187a7862f0caa3d8aed38224ac2) | fix | ensure app-shell schematic consistently uses `withAppShell` |
-| [f126f8d34](https://github.com/angular/angular-cli/commit/f126f8d34b087dd3a916dfb93cd255aac4d6c309) | fix | ensure module discovery checks for an NgModule decorator |
-| [23fc8e1e1](https://github.com/angular/angular-cli/commit/23fc8e1e176f23442876b086bff52dd5f35abbc0) | fix | generate components without a `.component` extension/type |
-| [8d715fa94](https://github.com/angular/angular-cli/commit/8d715fa948d432b18d06bcf42eed3a7681383523) | fix | generate directives without a .directive extension/type |
-| [bc0f07b48](https://github.com/angular/angular-cli/commit/bc0f07b484300848ee81c5719c58909b40f99deb) | fix | generate services without a .service extension/type |
-| [c0de72317](https://github.com/angular/angular-cli/commit/c0de723173549f62a524b6e6c58c6d80c8054581) | fix | replace `@angular/platform-browser-dynamic` with `@angular/platform-browser` |
-
-### @angular/build
-
-| Commit | Type | Description |
-| --------------------------------------------------------------------------------------------------- | ---- | ---------------------------------------------------- |
-| [f4be83119](https://github.com/angular/angular-cli/commit/f4be831197010a17394264bc74b1eb385ba95028) | feat | Support Sass package importers |
-| [cb2ab43ab](https://github.com/angular/angular-cli/commit/cb2ab43abcf0e3c1a2cc584a326e1eea5eede7a8) | fix | ensure errors for missing component resources |
-| [f780e8beb](https://github.com/angular/angular-cli/commit/f780e8beb3ccea27ef0442d1d3814ec2a668057d) | fix | ensure relative karma stack traces for test failures |
-
-### @angular/ssr
-
-| Commit | Type | Description |
-| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------------------------------- |
-| [33b9de3eb](https://github.com/angular/angular-cli/commit/33b9de3eb1fa596a4d5a975d05275739f2f7b8ae) | feat | expose `provideServerRendering` and remove `provideServerRouting` |
-| [cdfc50c29](https://github.com/angular/angular-cli/commit/cdfc50c29a2aa6f32d172b505a0ef09e563dfc59) | feat | stabilize `AngularNodeAppEngine`, `AngularAppEngine`, and `provideServerRouting` APIs |
-
-
-
# 19.2.4 (2025-03-19)
@@ -472,49 +499,6 @@
-
-
-# 20.0.0-next.1 (2025-03-13)
-
-## Breaking Changes
-
-### @angular/build
-
-- TypeScript versions less than 5.8 are no longer supported.
-
-### @schematics/angular
-
-| Commit | Type | Description |
-| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------- |
-| [03180fe03](https://github.com/angular/angular-cli/commit/03180fe0358662f8fd3255ad546994da3e3bda9c) | feat | use TypeScript module preserve option for new projects |
-| [dc2f65999](https://github.com/angular/angular-cli/commit/dc2f65999a64453a26b61c96080b732fdc4147c8) | fix | generate component templates with a `.ng.html` file extension |
-
-### @angular/cli
-
-| Commit | Type | Description |
-| --------------------------------------------------------------------------------------------------- | ---- | -------------------------------------- |
-| [2d03d8f11](https://github.com/angular/angular-cli/commit/2d03d8f11325cfba72b43f531e4bc27140d45caf) | fix | record analytics for nested schematics |
-
-### @angular/build
-
-| Commit | Type | Description |
-| --------------------------------------------------------------------------------------------------- | ---- | --------------------------------------------------------- |
-| [31c81e9c6](https://github.com/angular/angular-cli/commit/31c81e9c6859e68d00828b345d996d1aff431b25) | feat | drop support for TypeScript older than 5.8 |
-| [3c9172159](https://github.com/angular/angular-cli/commit/3c9172159c72f3c8ea116557ba5bf917a15d2f07) | feat | integrate Chrome automatic workspace folders |
-| [f0dd60be1](https://github.com/angular/angular-cli/commit/f0dd60be1ec72d9c8674471965b11be83083a0f1) | fix | exclude all entrypoints of a library from prebundling |
-| [3e3516785](https://github.com/angular/angular-cli/commit/3e35167855b3eacb9f45948ef75e999956819490) | fix | handle postcss compilation errors gracefully |
-| [5bea3de4c](https://github.com/angular/angular-cli/commit/5bea3de4cb2ffa26ad04aced22be3ff11f519f92) | fix | invalidate `com.chrome.devtools.json` if project is moved |
-| [b100c71cc](https://github.com/angular/angular-cli/commit/b100c71ccd39ff62203f16cbe543ba77b98bbe1d) | fix | provide `extract-i18n` does not respect |
-| [beab546bf](https://github.com/angular/angular-cli/commit/beab546bf2680d568af12e51e948a100098ae3fd) | fix | remove duplicate prebundling warning |
-
-### @angular/ssr
-
-| Commit | Type | Description |
-| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------ |
-| [ee8466de5](https://github.com/angular/angular-cli/commit/ee8466de520c3db08579be376dbd2b98795f50a8) | fix | prevent stream draining if `write` does not return a boolean |
-
-
-
# 19.2.2 (2025-03-12)
@@ -542,58 +526,6 @@
-
-
-# 20.0.0-next.0 (2025-03-05)
-
-## Breaking Changes
-
-### @angular/cli
-
-- Node.js v18 is no longer supported with Angular.
-
- Before updating a project to Angular v20, the Node.js version must be
- at least 20.11.1. For the full list of supported Node.js versions,
- see https://angular.dev/reference/versions.
-
-### @angular-devkit/schematics
-
-- The `NodePackageLinkTask` has been removed without a replacement. Create a custom task if needed.
-
- Note: This does not affect application developers.
-
-### @schematics/angular
-
-| Commit | Type | Description |
-| --------------------------------------------------------------------------------------------------- | ---- | --------------------------------------------- |
-| [093c5a315](https://github.com/angular/angular-cli/commit/093c5a3152c4282d4afb51df40945283cc94d281) | feat | directly use `@angular/build` in new projects |
-
-### @angular/cli
-
-| Commit | Type | Description |
-| --------------------------------------------------------------------------------------------------- | ---- | -------------------------- |
-| [5e90c1b4e](https://github.com/angular/angular-cli/commit/5e90c1b4ec3f1d05ad00f2f854347a5bf8cb0860) | fix | remove Node.js v18 support |
-
-### @angular-devkit/schematics
-
-| Commit | Type | Description |
-| --------------------------------------------------------------------------------------------------- | -------- | --------------------------------------- |
-| [e6be37601](https://github.com/angular/angular-cli/commit/e6be37601d57f884a1ddf2cc1ddecf51819b9f51) | refactor | remove deprecated `NodePackageLinkTask` |
-
-### @angular/build
-
-| Commit | Type | Description |
-| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------- |
-| [c8c73185a](https://github.com/angular/angular-cli/commit/c8c73185a66c7c7825e30f7fcedbaacc9ca1c593) | fix | ensure matching coverage excludes with karma on Windows |
-
-### @angular/ssr
-
-| Commit | Type | Description |
-| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------ |
-| [280693231](https://github.com/angular/angular-cli/commit/280693231e143aa09f841e3179317573a3576545) | perf | optimize response times by introducing header flushing |
-
-
-
# 19.2.1 (2025-03-05)
@@ -1167,7 +1099,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
@@ -3978,7 +3909,6 @@ Alan Agius, Charles Lyding, Doug Parker, Joey Perrott and Piotr Wysocki
```scss
@import 'font-awesome/scss/font-awesome';
```
-
- By default the CLI will use Sass modern API, While not recommended, users can still opt to use legacy API by setting `NG_BUILD_LEGACY_SASS=1`.
- Internally the Angular CLI now always set the TypeScript `target` to `ES2022` and `useDefineForClassFields` to `false` unless the target is set to `ES2022` or later in the TypeScript configuration. To control ECMA version and features use the Browerslist configuration.
@@ -4802,7 +4732,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`
@@ -4813,7 +4742,6 @@ Alan Agius, Charles Lyding and Doug Parker
- `--configuration` cannot be used with `ng run`. Provide the configuration as part of the target. Ex: `ng run project:builder:configuration`.
- Deprecated `ng x18n` and `ng i18n-extract` commands have been removed in favor of `ng extract-i18n`.
- Several changes in the Angular CLI commands and arguments handling.
-
- `ng help` has been removed in favour of the `—-help` option.
- `ng —-version` has been removed in favour of `ng version` and `ng v`.
- Deprecated camel cased arguments are no longer supported. Ex. using `—-sourceMap` instead of `—-source-map` will result in an error.
@@ -4833,7 +4761,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`
@@ -4842,7 +4769,6 @@ Alan Agius, Charles Lyding and Doug Parker
- `.mjsx`
Valid extensions for `styles` are:
-
- `.css`
- `.less`
- `.sass`
@@ -4885,7 +4811,6 @@ Alan Agius, Charles Lyding and Doug Parker
### @ngtools/webpack
- `ivy` namespace has been removed from the public API.
-
- `ivy.AngularWebpackPlugin` -> `AngularWebpackPlugin`
- `ivy.AngularPluginOptions` -> `AngularPluginOptions`
diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock
index 07e9c2b5e90a..3137c9f1d3fc 100644
--- a/MODULE.bazel.lock
+++ b/MODULE.bazel.lock
@@ -1,5 +1,5 @@
{
- "lockFileVersion": 11,
+ "lockFileVersion": 13,
"registryFileHashes": {
"https://bcr.bazel.build/bazel_registry.json": "8a28e4aff06ee60aed2a8c281907fb8bcbf3b753c91fb5a5c57da3215d5b3497",
"https://bcr.bazel.build/modules/abseil-cpp/20210324.2/MODULE.bazel": "7cd0312e064fde87c8d1cd79ba06c876bd23630c83466e9500321be55c96ace2",
@@ -105,1526 +105,6 @@
},
"recordedRepoMappingEntries": []
}
- },
- "@@rules_jvm_external~//:extensions.bzl%maven": {
- "general": {
- "bzlTransitiveDigest": "VW3qd5jCZXYbR9xpSwrhGQ04GCmEIIFPVERY34HHvFE=",
- "usagesDigest": "LrHQqpB5iw7+xvJG0erQ0h4vkSrdvObnMfY7Zbx7qhY=",
- "recordedFileInputs": {
- "@@rules_jvm_external~//rules_jvm_external_deps_install.json": "10442a5ae27d9ff4c2003e5ab71643bf0d8b48dcf968b4173fa274c3232a8c06"
- },
- "recordedDirentsInputs": {},
- "envVariables": {},
- "generatedRepoSpecs": {
- "maven": {
- "bzlFile": "@@rules_jvm_external~//:coursier.bzl",
- "ruleClassName": "coursier_fetch",
- "attributes": {
- "repositories": [
- "{ \"repo_url\": \"https://repo1.maven.org/maven2\" }"
- ],
- "artifacts": [
- "{\"artifact\":\"jsr305\",\"group\":\"com.google.code.findbugs\",\"version\":\"3.0.2\"}",
- "{\"artifact\":\"gson\",\"group\":\"com.google.code.gson\",\"version\":\"2.8.9\"}",
- "{\"artifact\":\"error_prone_annotations\",\"group\":\"com.google.errorprone\",\"version\":\"2.3.2\"}",
- "{\"artifact\":\"j2objc-annotations\",\"group\":\"com.google.j2objc\",\"version\":\"1.3\"}",
- "{\"artifact\":\"guava\",\"group\":\"com.google.guava\",\"version\":\"31.1-jre\"}",
- "{\"artifact\":\"guava-testlib\",\"group\":\"com.google.guava\",\"version\":\"31.1-jre\"}",
- "{\"artifact\":\"truth\",\"group\":\"com.google.truth\",\"version\":\"1.1.2\"}",
- "{\"artifact\":\"junit\",\"group\":\"junit\",\"version\":\"4.13.2\"}",
- "{\"artifact\":\"mockito-core\",\"group\":\"org.mockito\",\"version\":\"4.3.1\"}"
- ],
- "fail_on_missing_checksum": true,
- "fetch_sources": true,
- "fetch_javadoc": false,
- "use_unsafe_shared_cache": false,
- "excluded_artifacts": [],
- "generate_compat_repositories": false,
- "version_conflict_policy": "default",
- "override_targets": {},
- "strict_visibility": false,
- "strict_visibility_value": [
- "@@//visibility:private"
- ],
- "resolve_timeout": 600,
- "jetify": false,
- "jetify_include_list": [
- "*"
- ],
- "use_starlark_android_rules": false,
- "aar_import_bzl_label": "@build_bazel_rules_android//android:rules.bzl",
- "duplicate_version_warning": "warn"
- }
- },
- "unpinned_rules_jvm_external_deps": {
- "bzlFile": "@@rules_jvm_external~//:coursier.bzl",
- "ruleClassName": "coursier_fetch",
- "attributes": {
- "repositories": [
- "{ \"repo_url\": \"https://repo1.maven.org/maven2\" }"
- ],
- "artifacts": [
- "{\"artifact\":\"google-cloud-core\",\"group\":\"com.google.cloud\",\"version\":\"1.93.10\"}",
- "{\"artifact\":\"google-cloud-storage\",\"group\":\"com.google.cloud\",\"version\":\"1.113.4\"}",
- "{\"artifact\":\"gson\",\"group\":\"com.google.code.gson\",\"version\":\"2.9.0\"}",
- "{\"artifact\":\"maven-artifact\",\"group\":\"org.apache.maven\",\"version\":\"3.8.6\"}",
- "{\"artifact\":\"s3\",\"group\":\"software.amazon.awssdk\",\"version\":\"2.17.183\"}"
- ],
- "fail_on_missing_checksum": true,
- "fetch_sources": true,
- "fetch_javadoc": false,
- "use_unsafe_shared_cache": false,
- "excluded_artifacts": [],
- "generate_compat_repositories": false,
- "version_conflict_policy": "default",
- "override_targets": {},
- "strict_visibility": false,
- "strict_visibility_value": [
- "@@//visibility:private"
- ],
- "maven_install_json": "@@rules_jvm_external~//:rules_jvm_external_deps_install.json",
- "resolve_timeout": 600,
- "jetify": false,
- "jetify_include_list": [
- "*"
- ],
- "use_starlark_android_rules": false,
- "aar_import_bzl_label": "@build_bazel_rules_android//android:rules.bzl",
- "duplicate_version_warning": "warn"
- }
- },
- "com_fasterxml_jackson_core_jackson_core_2_11_3": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "78cd0a6b936232e06dd3e38da8a0345348a09cd1ff9c4d844c6ee72c75cfc402",
- "urls": [
- "https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.11.3/jackson-core-2.11.3.jar",
- "https://maven.google.com/com/fasterxml/jackson/core/jackson-core/2.11.3/jackson-core-2.11.3.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.11.3/jackson-core-2.11.3.jar"
- }
- },
- "com_google_api_client_google_api_client_1_30_11": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "ee6f97865cc7de6c7c80955c3f37372cf3887bd75e4fc06f1058a6b4cd9bf4da",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/api-client/google-api-client/1.30.11/google-api-client-1.30.11.jar",
- "https://maven.google.com/com/google/api-client/google-api-client/1.30.11/google-api-client-1.30.11.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/api-client/google-api-client/1.30.11/google-api-client-1.30.11.jar"
- }
- },
- "com_google_api_grpc_proto_google_common_protos_2_0_1": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "5ce71656118618731e34a5d4c61aa3a031be23446dc7de8b5a5e77b66ebcd6ef",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-common-protos/2.0.1/proto-google-common-protos-2.0.1.jar",
- "https://maven.google.com/com/google/api/grpc/proto-google-common-protos/2.0.1/proto-google-common-protos-2.0.1.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/api/grpc/proto-google-common-protos/2.0.1/proto-google-common-protos-2.0.1.jar"
- }
- },
- "com_google_api_grpc_proto_google_iam_v1_1_0_3": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "64cee7383a97e846da8d8e160e6c8fe30561e507260552c59e6ccfc81301fdc8",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-iam-v1/1.0.3/proto-google-iam-v1-1.0.3.jar",
- "https://maven.google.com/com/google/api/grpc/proto-google-iam-v1/1.0.3/proto-google-iam-v1-1.0.3.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/api/grpc/proto-google-iam-v1/1.0.3/proto-google-iam-v1-1.0.3.jar"
- }
- },
- "com_google_api_api_common_1_10_1": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "2a033f24bb620383eda440ad307cb8077cfec1c7eadc684d65216123a1b9613a",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/api/api-common/1.10.1/api-common-1.10.1.jar",
- "https://maven.google.com/com/google/api/api-common/1.10.1/api-common-1.10.1.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/api/api-common/1.10.1/api-common-1.10.1.jar"
- }
- },
- "com_google_api_gax_httpjson_0_77_0": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "fd4dae47fa016d3b26e8d90b67ddc6c23c4c06e8bcdf085c70310ab7ef324bd6",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/api/gax-httpjson/0.77.0/gax-httpjson-0.77.0.jar",
- "https://maven.google.com/com/google/api/gax-httpjson/0.77.0/gax-httpjson-0.77.0.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/api/gax-httpjson/0.77.0/gax-httpjson-0.77.0.jar"
- }
- },
- "com_google_api_gax_1_60_0": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "02f37d4ff1a7b8d71dff8064cf9568aa4f4b61bcc4485085d16130f32afa5a79",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/api/gax/1.60.0/gax-1.60.0.jar",
- "https://maven.google.com/com/google/api/gax/1.60.0/gax-1.60.0.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/api/gax/1.60.0/gax-1.60.0.jar"
- }
- },
- "com_google_apis_google_api_services_storage_v1_rev20200927_1_30_10": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "52d26a9d105f8d8a0850807285f307a76cea8f3e0cdb2be4d3b15b1adfa77351",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/apis/google-api-services-storage/v1-rev20200927-1.30.10/google-api-services-storage-v1-rev20200927-1.30.10.jar",
- "https://maven.google.com/com/google/apis/google-api-services-storage/v1-rev20200927-1.30.10/google-api-services-storage-v1-rev20200927-1.30.10.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/apis/google-api-services-storage/v1-rev20200927-1.30.10/google-api-services-storage-v1-rev20200927-1.30.10.jar"
- }
- },
- "com_google_auth_google_auth_library_credentials_0_22_0": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "42c76031276de5b520909e9faf88c5b3c9a722d69ee9cfdafedb1c52c355dfc5",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/auth/google-auth-library-credentials/0.22.0/google-auth-library-credentials-0.22.0.jar",
- "https://maven.google.com/com/google/auth/google-auth-library-credentials/0.22.0/google-auth-library-credentials-0.22.0.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/auth/google-auth-library-credentials/0.22.0/google-auth-library-credentials-0.22.0.jar"
- }
- },
- "com_google_auth_google_auth_library_oauth2_http_0_22_0": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "1722d895c42dc42ea1d1f392ddbec1fbb28f7a979022c3a6c29acc39cc777ad1",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/auth/google-auth-library-oauth2-http/0.22.0/google-auth-library-oauth2-http-0.22.0.jar",
- "https://maven.google.com/com/google/auth/google-auth-library-oauth2-http/0.22.0/google-auth-library-oauth2-http-0.22.0.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/auth/google-auth-library-oauth2-http/0.22.0/google-auth-library-oauth2-http-0.22.0.jar"
- }
- },
- "com_google_auto_value_auto_value_annotations_1_7_4": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "fedd59b0b4986c342f6ab2d182f2a4ee9fceb2c7e2d5bdc4dc764c92394a23d3",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/auto/value/auto-value-annotations/1.7.4/auto-value-annotations-1.7.4.jar",
- "https://maven.google.com/com/google/auto/value/auto-value-annotations/1.7.4/auto-value-annotations-1.7.4.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/auto/value/auto-value-annotations/1.7.4/auto-value-annotations-1.7.4.jar"
- }
- },
- "com_google_cloud_google_cloud_core_http_1_93_10": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "81ac67c14c7c4244d2b7db2607ad352416aca8d3bb2adf338964e8fea25b1b3c",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-core-http/1.93.10/google-cloud-core-http-1.93.10.jar",
- "https://maven.google.com/com/google/cloud/google-cloud-core-http/1.93.10/google-cloud-core-http-1.93.10.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/cloud/google-cloud-core-http/1.93.10/google-cloud-core-http-1.93.10.jar"
- }
- },
- "com_google_cloud_google_cloud_core_1_93_10": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "832d74eca66f4601e162a8460d6f59f50d1d23f93c18b02654423b6b0d67c6ea",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-core/1.93.10/google-cloud-core-1.93.10.jar",
- "https://maven.google.com/com/google/cloud/google-cloud-core/1.93.10/google-cloud-core-1.93.10.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/cloud/google-cloud-core/1.93.10/google-cloud-core-1.93.10.jar"
- }
- },
- "com_google_cloud_google_cloud_storage_1_113_4": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "796833e9bdab80c40bbc820e65087eb8f28c6bfbca194d2e3e00d98cb5bc55d6",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-storage/1.113.4/google-cloud-storage-1.113.4.jar",
- "https://maven.google.com/com/google/cloud/google-cloud-storage/1.113.4/google-cloud-storage-1.113.4.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/cloud/google-cloud-storage/1.113.4/google-cloud-storage-1.113.4.jar"
- }
- },
- "com_google_code_findbugs_jsr305_3_0_2": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "766ad2a0783f2687962c8ad74ceecc38a28b9f72a2d085ee438b7813e928d0c7",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar",
- "https://maven.google.com/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar"
- }
- },
- "com_google_code_gson_gson_2_9_0": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "c96d60551331a196dac54b745aa642cd078ef89b6f267146b705f2c2cbef052d",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/code/gson/gson/2.9.0/gson-2.9.0.jar",
- "https://maven.google.com/com/google/code/gson/gson/2.9.0/gson-2.9.0.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.9.0/gson-2.9.0.jar"
- }
- },
- "com_google_errorprone_error_prone_annotations_2_4_0": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "5f2a0648230a662e8be049df308d583d7369f13af683e44ddf5829b6d741a228",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/errorprone/error_prone_annotations/2.4.0/error_prone_annotations-2.4.0.jar",
- "https://maven.google.com/com/google/errorprone/error_prone_annotations/2.4.0/error_prone_annotations-2.4.0.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/errorprone/error_prone_annotations/2.4.0/error_prone_annotations-2.4.0.jar"
- }
- },
- "com_google_guava_failureaccess_1_0_1": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "a171ee4c734dd2da837e4b16be9df4661afab72a41adaf31eb84dfdaf936ca26",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar",
- "https://maven.google.com/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar"
- }
- },
- "com_google_guava_guava_30_0_android": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "3345c82c2cc70a0053e8db9031edc6d71625ef0dea6a2c8f5ebd6cb76d2bf843",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/guava/guava/30.0-android/guava-30.0-android.jar",
- "https://maven.google.com/com/google/guava/guava/30.0-android/guava-30.0-android.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/guava/guava/30.0-android/guava-30.0-android.jar"
- }
- },
- "com_google_guava_listenablefuture_9999_0_empty_to_avoid_conflict_with_guava": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "b372a037d4230aa57fbeffdef30fd6123f9c0c2db85d0aced00c91b974f33f99",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar",
- "https://maven.google.com/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar"
- }
- },
- "com_google_http_client_google_http_client_appengine_1_38_0": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "f97b495fd97ac3a3d59099eb2b55025f4948230da15a076f189b9cff37c6b4d2",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/http-client/google-http-client-appengine/1.38.0/google-http-client-appengine-1.38.0.jar",
- "https://maven.google.com/com/google/http-client/google-http-client-appengine/1.38.0/google-http-client-appengine-1.38.0.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/http-client/google-http-client-appengine/1.38.0/google-http-client-appengine-1.38.0.jar"
- }
- },
- "com_google_http_client_google_http_client_jackson2_1_38_0": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "e6504a82425fcc2168a4ca4175138ddcc085168daed8cdedb86d8f6fdc296e1e",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/http-client/google-http-client-jackson2/1.38.0/google-http-client-jackson2-1.38.0.jar",
- "https://maven.google.com/com/google/http-client/google-http-client-jackson2/1.38.0/google-http-client-jackson2-1.38.0.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/http-client/google-http-client-jackson2/1.38.0/google-http-client-jackson2-1.38.0.jar"
- }
- },
- "com_google_http_client_google_http_client_1_38_0": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "411f4a42519b6b78bdc0fcfdf74c9edcef0ee97afa4a667abe04045a508d6302",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/http-client/google-http-client/1.38.0/google-http-client-1.38.0.jar",
- "https://maven.google.com/com/google/http-client/google-http-client/1.38.0/google-http-client-1.38.0.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/http-client/google-http-client/1.38.0/google-http-client-1.38.0.jar"
- }
- },
- "com_google_j2objc_j2objc_annotations_1_3": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "21af30c92267bd6122c0e0b4d20cccb6641a37eaf956c6540ec471d584e64a7b",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar",
- "https://maven.google.com/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar"
- }
- },
- "com_google_oauth_client_google_oauth_client_1_31_1": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "4ed4e2948251dbda66ce251bd7f3b32cd8570055e5cdb165a3c7aea8f43da0ff",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/oauth-client/google-oauth-client/1.31.1/google-oauth-client-1.31.1.jar",
- "https://maven.google.com/com/google/oauth-client/google-oauth-client/1.31.1/google-oauth-client-1.31.1.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/oauth-client/google-oauth-client/1.31.1/google-oauth-client-1.31.1.jar"
- }
- },
- "com_google_protobuf_protobuf_java_util_3_13_0": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "d9de66b8c9445905dfa7064f6d5213d47ce88a20d34e21d83c4a94a229e14e62",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java-util/3.13.0/protobuf-java-util-3.13.0.jar",
- "https://maven.google.com/com/google/protobuf/protobuf-java-util/3.13.0/protobuf-java-util-3.13.0.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/protobuf/protobuf-java-util/3.13.0/protobuf-java-util-3.13.0.jar"
- }
- },
- "com_google_protobuf_protobuf_java_3_13_0": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "97d5b2758408690c0dc276238707492a0b6a4d71206311b6c442cdc26c5973ff",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java/3.13.0/protobuf-java-3.13.0.jar",
- "https://maven.google.com/com/google/protobuf/protobuf-java/3.13.0/protobuf-java-3.13.0.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/protobuf/protobuf-java/3.13.0/protobuf-java-3.13.0.jar"
- }
- },
- "com_typesafe_netty_netty_reactive_streams_http_2_0_5": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "b39224751ad936758176e9d994230380ade5e9079e7c8ad778e3995779bcf303",
- "urls": [
- "https://repo1.maven.org/maven2/com/typesafe/netty/netty-reactive-streams-http/2.0.5/netty-reactive-streams-http-2.0.5.jar",
- "https://maven.google.com/com/typesafe/netty/netty-reactive-streams-http/2.0.5/netty-reactive-streams-http-2.0.5.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/typesafe/netty/netty-reactive-streams-http/2.0.5/netty-reactive-streams-http-2.0.5.jar"
- }
- },
- "com_typesafe_netty_netty_reactive_streams_2_0_5": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "f949849fc8ee75fde468ba3a35df2e04577fa31a2940b83b2a7dc9d14dac13d6",
- "urls": [
- "https://repo1.maven.org/maven2/com/typesafe/netty/netty-reactive-streams/2.0.5/netty-reactive-streams-2.0.5.jar",
- "https://maven.google.com/com/typesafe/netty/netty-reactive-streams/2.0.5/netty-reactive-streams-2.0.5.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/typesafe/netty/netty-reactive-streams/2.0.5/netty-reactive-streams-2.0.5.jar"
- }
- },
- "commons_codec_commons_codec_1_11": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "e599d5318e97aa48f42136a2927e6dfa4e8881dff0e6c8e3109ddbbff51d7b7d",
- "urls": [
- "https://repo1.maven.org/maven2/commons-codec/commons-codec/1.11/commons-codec-1.11.jar",
- "https://maven.google.com/commons-codec/commons-codec/1.11/commons-codec-1.11.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/commons-codec/commons-codec/1.11/commons-codec-1.11.jar"
- }
- },
- "commons_logging_commons_logging_1_2": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "daddea1ea0be0f56978ab3006b8ac92834afeefbd9b7e4e6316fca57df0fa636",
- "urls": [
- "https://repo1.maven.org/maven2/commons-logging/commons-logging/1.2/commons-logging-1.2.jar",
- "https://maven.google.com/commons-logging/commons-logging/1.2/commons-logging-1.2.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/commons-logging/commons-logging/1.2/commons-logging-1.2.jar"
- }
- },
- "io_grpc_grpc_context_1_33_1": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "99b8aea2b614fe0e61c3676e681259dc43c2de7f64620998e1a8435eb2976496",
- "urls": [
- "https://repo1.maven.org/maven2/io/grpc/grpc-context/1.33.1/grpc-context-1.33.1.jar",
- "https://maven.google.com/io/grpc/grpc-context/1.33.1/grpc-context-1.33.1.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/io/grpc/grpc-context/1.33.1/grpc-context-1.33.1.jar"
- }
- },
- "io_netty_netty_buffer_4_1_72_Final": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "568ff7cd9d8e2284ec980730c88924f686642929f8f219a74518b4e64755f3a1",
- "urls": [
- "https://repo1.maven.org/maven2/io/netty/netty-buffer/4.1.72.Final/netty-buffer-4.1.72.Final.jar",
- "https://maven.google.com/io/netty/netty-buffer/4.1.72.Final/netty-buffer-4.1.72.Final.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/io/netty/netty-buffer/4.1.72.Final/netty-buffer-4.1.72.Final.jar"
- }
- },
- "io_netty_netty_codec_http2_4_1_72_Final": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "c89a70500f59e8563e720aaa808263a514bd9e2bd91ba84eab8c2ccb45f234b2",
- "urls": [
- "https://repo1.maven.org/maven2/io/netty/netty-codec-http2/4.1.72.Final/netty-codec-http2-4.1.72.Final.jar",
- "https://maven.google.com/io/netty/netty-codec-http2/4.1.72.Final/netty-codec-http2-4.1.72.Final.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/io/netty/netty-codec-http2/4.1.72.Final/netty-codec-http2-4.1.72.Final.jar"
- }
- },
- "io_netty_netty_codec_http_4_1_72_Final": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "fa6fec88010bfaf6a7415b5364671b6b18ffb6b35a986ab97b423fd8c3a0174b",
- "urls": [
- "https://repo1.maven.org/maven2/io/netty/netty-codec-http/4.1.72.Final/netty-codec-http-4.1.72.Final.jar",
- "https://maven.google.com/io/netty/netty-codec-http/4.1.72.Final/netty-codec-http-4.1.72.Final.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/io/netty/netty-codec-http/4.1.72.Final/netty-codec-http-4.1.72.Final.jar"
- }
- },
- "io_netty_netty_codec_4_1_72_Final": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "5d8591ca271a1e9c224e8de3873aa9936acb581ee0db514e7dc18523df36d16c",
- "urls": [
- "https://repo1.maven.org/maven2/io/netty/netty-codec/4.1.72.Final/netty-codec-4.1.72.Final.jar",
- "https://maven.google.com/io/netty/netty-codec/4.1.72.Final/netty-codec-4.1.72.Final.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/io/netty/netty-codec/4.1.72.Final/netty-codec-4.1.72.Final.jar"
- }
- },
- "io_netty_netty_common_4_1_72_Final": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "8adb4c291260ceb2859a68c49f0adeed36bf49587608e2b81ecff6aaf06025e9",
- "urls": [
- "https://repo1.maven.org/maven2/io/netty/netty-common/4.1.72.Final/netty-common-4.1.72.Final.jar",
- "https://maven.google.com/io/netty/netty-common/4.1.72.Final/netty-common-4.1.72.Final.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/io/netty/netty-common/4.1.72.Final/netty-common-4.1.72.Final.jar"
- }
- },
- "io_netty_netty_handler_4_1_72_Final": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "9cb6012af7e06361d738ac4e3bdc49a158f8cf87d9dee0f2744056b7d99c28d5",
- "urls": [
- "https://repo1.maven.org/maven2/io/netty/netty-handler/4.1.72.Final/netty-handler-4.1.72.Final.jar",
- "https://maven.google.com/io/netty/netty-handler/4.1.72.Final/netty-handler-4.1.72.Final.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/io/netty/netty-handler/4.1.72.Final/netty-handler-4.1.72.Final.jar"
- }
- },
- "io_netty_netty_resolver_4_1_72_Final": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "6474598aab7cc9d8d6cfa06c05bd1b19adbf7f8451dbdd73070b33a6c60b1b90",
- "urls": [
- "https://repo1.maven.org/maven2/io/netty/netty-resolver/4.1.72.Final/netty-resolver-4.1.72.Final.jar",
- "https://maven.google.com/io/netty/netty-resolver/4.1.72.Final/netty-resolver-4.1.72.Final.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/io/netty/netty-resolver/4.1.72.Final/netty-resolver-4.1.72.Final.jar"
- }
- },
- "io_netty_netty_tcnative_classes_2_0_46_Final": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "d3ec888dcc4ac7915bf88b417c5e04fd354f4311032a748a6882df09347eed9a",
- "urls": [
- "https://repo1.maven.org/maven2/io/netty/netty-tcnative-classes/2.0.46.Final/netty-tcnative-classes-2.0.46.Final.jar",
- "https://maven.google.com/io/netty/netty-tcnative-classes/2.0.46.Final/netty-tcnative-classes-2.0.46.Final.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/io/netty/netty-tcnative-classes/2.0.46.Final/netty-tcnative-classes-2.0.46.Final.jar"
- }
- },
- "io_netty_netty_transport_classes_epoll_4_1_72_Final": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "e1528a9751c1285aa7beaf3a1eb0597151716426ce38598ac9bc0891209b9e68",
- "urls": [
- "https://repo1.maven.org/maven2/io/netty/netty-transport-classes-epoll/4.1.72.Final/netty-transport-classes-epoll-4.1.72.Final.jar",
- "https://maven.google.com/io/netty/netty-transport-classes-epoll/4.1.72.Final/netty-transport-classes-epoll-4.1.72.Final.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/io/netty/netty-transport-classes-epoll/4.1.72.Final/netty-transport-classes-epoll-4.1.72.Final.jar"
- }
- },
- "io_netty_netty_transport_native_unix_common_4_1_72_Final": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "6f8f1cc29b5a234eeee9439a63eb3f03a5994aa540ff555cb0b2c88cefaf6877",
- "urls": [
- "https://repo1.maven.org/maven2/io/netty/netty-transport-native-unix-common/4.1.72.Final/netty-transport-native-unix-common-4.1.72.Final.jar",
- "https://maven.google.com/io/netty/netty-transport-native-unix-common/4.1.72.Final/netty-transport-native-unix-common-4.1.72.Final.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/io/netty/netty-transport-native-unix-common/4.1.72.Final/netty-transport-native-unix-common-4.1.72.Final.jar"
- }
- },
- "io_netty_netty_transport_4_1_72_Final": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "c5fb68e9a65b6e8a516adfcb9fa323479ee7b4d9449d8a529d2ecab3d3711d5a",
- "urls": [
- "https://repo1.maven.org/maven2/io/netty/netty-transport/4.1.72.Final/netty-transport-4.1.72.Final.jar",
- "https://maven.google.com/io/netty/netty-transport/4.1.72.Final/netty-transport-4.1.72.Final.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/io/netty/netty-transport/4.1.72.Final/netty-transport-4.1.72.Final.jar"
- }
- },
- "io_opencensus_opencensus_api_0_24_0": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "f561b1cc2673844288e596ddf5bb6596868a8472fd2cb8993953fc5c034b2352",
- "urls": [
- "https://repo1.maven.org/maven2/io/opencensus/opencensus-api/0.24.0/opencensus-api-0.24.0.jar",
- "https://maven.google.com/io/opencensus/opencensus-api/0.24.0/opencensus-api-0.24.0.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/io/opencensus/opencensus-api/0.24.0/opencensus-api-0.24.0.jar"
- }
- },
- "io_opencensus_opencensus_contrib_http_util_0_24_0": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "7155273bbb1ed3d477ea33cf19d7bbc0b285ff395f43b29ae576722cf247000f",
- "urls": [
- "https://repo1.maven.org/maven2/io/opencensus/opencensus-contrib-http-util/0.24.0/opencensus-contrib-http-util-0.24.0.jar",
- "https://maven.google.com/io/opencensus/opencensus-contrib-http-util/0.24.0/opencensus-contrib-http-util-0.24.0.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/io/opencensus/opencensus-contrib-http-util/0.24.0/opencensus-contrib-http-util-0.24.0.jar"
- }
- },
- "javax_annotation_javax_annotation_api_1_3_2": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "e04ba5195bcd555dc95650f7cc614d151e4bcd52d29a10b8aa2197f3ab89ab9b",
- "urls": [
- "https://repo1.maven.org/maven2/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar",
- "https://maven.google.com/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar"
- }
- },
- "org_apache_commons_commons_lang3_3_8_1": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "dac807f65b07698ff39b1b07bfef3d87ae3fd46d91bbf8a2bc02b2a831616f68",
- "urls": [
- "https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.8.1/commons-lang3-3.8.1.jar",
- "https://maven.google.com/org/apache/commons/commons-lang3/3.8.1/commons-lang3-3.8.1.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.8.1/commons-lang3-3.8.1.jar"
- }
- },
- "org_apache_httpcomponents_httpclient_4_5_13": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "6fe9026a566c6a5001608cf3fc32196641f6c1e5e1986d1037ccdbd5f31ef743",
- "urls": [
- "https://repo1.maven.org/maven2/org/apache/httpcomponents/httpclient/4.5.13/httpclient-4.5.13.jar",
- "https://maven.google.com/org/apache/httpcomponents/httpclient/4.5.13/httpclient-4.5.13.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/org/apache/httpcomponents/httpclient/4.5.13/httpclient-4.5.13.jar"
- }
- },
- "org_apache_httpcomponents_httpcore_4_4_13": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "e06e89d40943245fcfa39ec537cdbfce3762aecde8f9c597780d2b00c2b43424",
- "urls": [
- "https://repo1.maven.org/maven2/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13.jar",
- "https://maven.google.com/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13.jar"
- }
- },
- "org_apache_maven_maven_artifact_3_8_6": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "de22a4c6f54fe31276a823b1bbd3adfd6823529e732f431b5eff0852c2b9252b",
- "urls": [
- "https://repo1.maven.org/maven2/org/apache/maven/maven-artifact/3.8.6/maven-artifact-3.8.6.jar",
- "https://maven.google.com/org/apache/maven/maven-artifact/3.8.6/maven-artifact-3.8.6.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/org/apache/maven/maven-artifact/3.8.6/maven-artifact-3.8.6.jar"
- }
- },
- "org_checkerframework_checker_compat_qual_2_5_5": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "11d134b245e9cacc474514d2d66b5b8618f8039a1465cdc55bbc0b34e0008b7a",
- "urls": [
- "https://repo1.maven.org/maven2/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5.jar",
- "https://maven.google.com/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5.jar"
- }
- },
- "org_codehaus_plexus_plexus_utils_3_3_1": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "4b570fcdbe5a894f249d2eb9b929358a9c88c3e548d227a80010461930222f2a",
- "urls": [
- "https://repo1.maven.org/maven2/org/codehaus/plexus/plexus-utils/3.3.1/plexus-utils-3.3.1.jar",
- "https://maven.google.com/org/codehaus/plexus/plexus-utils/3.3.1/plexus-utils-3.3.1.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/org/codehaus/plexus/plexus-utils/3.3.1/plexus-utils-3.3.1.jar"
- }
- },
- "org_reactivestreams_reactive_streams_1_0_3": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "1dee0481072d19c929b623e155e14d2f6085dc011529a0a0dbefc84cf571d865",
- "urls": [
- "https://repo1.maven.org/maven2/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3.jar",
- "https://maven.google.com/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3.jar"
- }
- },
- "org_slf4j_slf4j_api_1_7_30": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "cdba07964d1bb40a0761485c6b1e8c2f8fd9eb1d19c53928ac0d7f9510105c57",
- "urls": [
- "https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.30/slf4j-api-1.7.30.jar",
- "https://maven.google.com/org/slf4j/slf4j-api/1.7.30/slf4j-api-1.7.30.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.30/slf4j-api-1.7.30.jar"
- }
- },
- "org_threeten_threetenbp_1_5_0": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "dcf9c0f940739f2a825cd8626ff27113459a2f6eb18797c7152f93fff69c264f",
- "urls": [
- "https://repo1.maven.org/maven2/org/threeten/threetenbp/1.5.0/threetenbp-1.5.0.jar",
- "https://maven.google.com/org/threeten/threetenbp/1.5.0/threetenbp-1.5.0.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/org/threeten/threetenbp/1.5.0/threetenbp-1.5.0.jar"
- }
- },
- "software_amazon_awssdk_annotations_2_17_183": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "8e4d72361ca805a0bd8bbd9017cd7ff77c8d170f2dd469c7d52d5653330bb3fd",
- "urls": [
- "https://repo1.maven.org/maven2/software/amazon/awssdk/annotations/2.17.183/annotations-2.17.183.jar",
- "https://maven.google.com/software/amazon/awssdk/annotations/2.17.183/annotations-2.17.183.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/awssdk/annotations/2.17.183/annotations-2.17.183.jar"
- }
- },
- "software_amazon_awssdk_apache_client_2_17_183": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "78ceae502fce6a97bbe5ff8f6a010a52ab7ea3ae66cb1a4122e18185fce45022",
- "urls": [
- "https://repo1.maven.org/maven2/software/amazon/awssdk/apache-client/2.17.183/apache-client-2.17.183.jar",
- "https://maven.google.com/software/amazon/awssdk/apache-client/2.17.183/apache-client-2.17.183.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/awssdk/apache-client/2.17.183/apache-client-2.17.183.jar"
- }
- },
- "software_amazon_awssdk_arns_2_17_183": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "659a185e191d66c71de81209490e66abeaccae208ea7b2831a738670823447aa",
- "urls": [
- "https://repo1.maven.org/maven2/software/amazon/awssdk/arns/2.17.183/arns-2.17.183.jar",
- "https://maven.google.com/software/amazon/awssdk/arns/2.17.183/arns-2.17.183.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/awssdk/arns/2.17.183/arns-2.17.183.jar"
- }
- },
- "software_amazon_awssdk_auth_2_17_183": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "8820c6636e5c14efc29399fb5565ce50212b0c1f4ed720a025a2c402d54e0978",
- "urls": [
- "https://repo1.maven.org/maven2/software/amazon/awssdk/auth/2.17.183/auth-2.17.183.jar",
- "https://maven.google.com/software/amazon/awssdk/auth/2.17.183/auth-2.17.183.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/awssdk/auth/2.17.183/auth-2.17.183.jar"
- }
- },
- "software_amazon_awssdk_aws_core_2_17_183": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "bccbdbea689a665a702ff19828662d87fb7fe81529df13f02ef1e4c474ea9f93",
- "urls": [
- "https://repo1.maven.org/maven2/software/amazon/awssdk/aws-core/2.17.183/aws-core-2.17.183.jar",
- "https://maven.google.com/software/amazon/awssdk/aws-core/2.17.183/aws-core-2.17.183.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/awssdk/aws-core/2.17.183/aws-core-2.17.183.jar"
- }
- },
- "software_amazon_awssdk_aws_query_protocol_2_17_183": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "4dace03c76f80f3dec920cb3dedb2a95984c4366ef4fda728660cb90bed74848",
- "urls": [
- "https://repo1.maven.org/maven2/software/amazon/awssdk/aws-query-protocol/2.17.183/aws-query-protocol-2.17.183.jar",
- "https://maven.google.com/software/amazon/awssdk/aws-query-protocol/2.17.183/aws-query-protocol-2.17.183.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/awssdk/aws-query-protocol/2.17.183/aws-query-protocol-2.17.183.jar"
- }
- },
- "software_amazon_awssdk_aws_xml_protocol_2_17_183": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "566bba05d49256fa6994efd68fa625ae05a62ea45ee74bb9130d20ea20988363",
- "urls": [
- "https://repo1.maven.org/maven2/software/amazon/awssdk/aws-xml-protocol/2.17.183/aws-xml-protocol-2.17.183.jar",
- "https://maven.google.com/software/amazon/awssdk/aws-xml-protocol/2.17.183/aws-xml-protocol-2.17.183.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/awssdk/aws-xml-protocol/2.17.183/aws-xml-protocol-2.17.183.jar"
- }
- },
- "software_amazon_awssdk_http_client_spi_2_17_183": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "fe7120f175df9e47ebcc5d946d7f40110faf2ba0a30364f3b935d5b8a5a6c3c6",
- "urls": [
- "https://repo1.maven.org/maven2/software/amazon/awssdk/http-client-spi/2.17.183/http-client-spi-2.17.183.jar",
- "https://maven.google.com/software/amazon/awssdk/http-client-spi/2.17.183/http-client-spi-2.17.183.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/awssdk/http-client-spi/2.17.183/http-client-spi-2.17.183.jar"
- }
- },
- "software_amazon_awssdk_json_utils_2_17_183": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "51ab7f550adc06afcb49f5270cdf690f1bfaaee243abaa5d978095e2a1e4e1a5",
- "urls": [
- "https://repo1.maven.org/maven2/software/amazon/awssdk/json-utils/2.17.183/json-utils-2.17.183.jar",
- "https://maven.google.com/software/amazon/awssdk/json-utils/2.17.183/json-utils-2.17.183.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/awssdk/json-utils/2.17.183/json-utils-2.17.183.jar"
- }
- },
- "software_amazon_awssdk_metrics_spi_2_17_183": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "08a11dc8c4ba464beafbcc7ac05b8c724c1ccb93da99482e82a68540ac704e4a",
- "urls": [
- "https://repo1.maven.org/maven2/software/amazon/awssdk/metrics-spi/2.17.183/metrics-spi-2.17.183.jar",
- "https://maven.google.com/software/amazon/awssdk/metrics-spi/2.17.183/metrics-spi-2.17.183.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/awssdk/metrics-spi/2.17.183/metrics-spi-2.17.183.jar"
- }
- },
- "software_amazon_awssdk_netty_nio_client_2_17_183": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "a6d356f364c56d7b90006b0b7e503b8630010993a5587ce42e74b10b8dca2238",
- "urls": [
- "https://repo1.maven.org/maven2/software/amazon/awssdk/netty-nio-client/2.17.183/netty-nio-client-2.17.183.jar",
- "https://maven.google.com/software/amazon/awssdk/netty-nio-client/2.17.183/netty-nio-client-2.17.183.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/awssdk/netty-nio-client/2.17.183/netty-nio-client-2.17.183.jar"
- }
- },
- "software_amazon_awssdk_profiles_2_17_183": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "78833b32fde3f1c5320373b9ea955c1bbc28f2c904010791c4784e610193ee56",
- "urls": [
- "https://repo1.maven.org/maven2/software/amazon/awssdk/profiles/2.17.183/profiles-2.17.183.jar",
- "https://maven.google.com/software/amazon/awssdk/profiles/2.17.183/profiles-2.17.183.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/awssdk/profiles/2.17.183/profiles-2.17.183.jar"
- }
- },
- "software_amazon_awssdk_protocol_core_2_17_183": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "10e7c4faa1f05e2d73055d0390dbd0bb6450e2e6cb85beda051b1e4693c826ce",
- "urls": [
- "https://repo1.maven.org/maven2/software/amazon/awssdk/protocol-core/2.17.183/protocol-core-2.17.183.jar",
- "https://maven.google.com/software/amazon/awssdk/protocol-core/2.17.183/protocol-core-2.17.183.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/awssdk/protocol-core/2.17.183/protocol-core-2.17.183.jar"
- }
- },
- "software_amazon_awssdk_regions_2_17_183": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "d3079395f3ffc07d04ffcce16fca29fb5968197f6e9ea3dbff6be297102b40a5",
- "urls": [
- "https://repo1.maven.org/maven2/software/amazon/awssdk/regions/2.17.183/regions-2.17.183.jar",
- "https://maven.google.com/software/amazon/awssdk/regions/2.17.183/regions-2.17.183.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/awssdk/regions/2.17.183/regions-2.17.183.jar"
- }
- },
- "software_amazon_awssdk_s3_2_17_183": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "ab073b91107a9e4ed9f030314077d137fe627e055ad895fabb036980a050e360",
- "urls": [
- "https://repo1.maven.org/maven2/software/amazon/awssdk/s3/2.17.183/s3-2.17.183.jar",
- "https://maven.google.com/software/amazon/awssdk/s3/2.17.183/s3-2.17.183.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/awssdk/s3/2.17.183/s3-2.17.183.jar"
- }
- },
- "software_amazon_awssdk_sdk_core_2_17_183": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "677e9cc90fdd82c1f40f97b99cb115b13ad6c3f58beeeab1c061af6954d64c77",
- "urls": [
- "https://repo1.maven.org/maven2/software/amazon/awssdk/sdk-core/2.17.183/sdk-core-2.17.183.jar",
- "https://maven.google.com/software/amazon/awssdk/sdk-core/2.17.183/sdk-core-2.17.183.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/awssdk/sdk-core/2.17.183/sdk-core-2.17.183.jar"
- }
- },
- "software_amazon_awssdk_third_party_jackson_core_2_17_183": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "1bc27c9960993c20e1ab058012dd1ae04c875eec9f0f08f2b2ca41e578dee9a4",
- "urls": [
- "https://repo1.maven.org/maven2/software/amazon/awssdk/third-party-jackson-core/2.17.183/third-party-jackson-core-2.17.183.jar",
- "https://maven.google.com/software/amazon/awssdk/third-party-jackson-core/2.17.183/third-party-jackson-core-2.17.183.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/awssdk/third-party-jackson-core/2.17.183/third-party-jackson-core-2.17.183.jar"
- }
- },
- "software_amazon_awssdk_utils_2_17_183": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "7bd849bb5aa71bfdf6b849643736ecab3a7b3f204795804eefe5754104231ec6",
- "urls": [
- "https://repo1.maven.org/maven2/software/amazon/awssdk/utils/2.17.183/utils-2.17.183.jar",
- "https://maven.google.com/software/amazon/awssdk/utils/2.17.183/utils-2.17.183.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/awssdk/utils/2.17.183/utils-2.17.183.jar"
- }
- },
- "software_amazon_eventstream_eventstream_1_0_1": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "0c37d8e696117f02c302191b8110b0d0eb20fa412fce34c3a269ec73c16ce822",
- "urls": [
- "https://repo1.maven.org/maven2/software/amazon/eventstream/eventstream/1.0.1/eventstream-1.0.1.jar",
- "https://maven.google.com/software/amazon/eventstream/eventstream/1.0.1/eventstream-1.0.1.jar"
- ],
- "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/eventstream/eventstream/1.0.1/eventstream-1.0.1.jar"
- }
- },
- "rules_jvm_external_deps": {
- "bzlFile": "@@rules_jvm_external~//:coursier.bzl",
- "ruleClassName": "pinned_coursier_fetch",
- "attributes": {
- "repositories": [
- "{ \"repo_url\": \"https://repo1.maven.org/maven2\" }"
- ],
- "artifacts": [
- "{\"artifact\":\"google-cloud-core\",\"group\":\"com.google.cloud\",\"version\":\"1.93.10\"}",
- "{\"artifact\":\"google-cloud-storage\",\"group\":\"com.google.cloud\",\"version\":\"1.113.4\"}",
- "{\"artifact\":\"gson\",\"group\":\"com.google.code.gson\",\"version\":\"2.9.0\"}",
- "{\"artifact\":\"maven-artifact\",\"group\":\"org.apache.maven\",\"version\":\"3.8.6\"}",
- "{\"artifact\":\"s3\",\"group\":\"software.amazon.awssdk\",\"version\":\"2.17.183\"}"
- ],
- "fetch_sources": true,
- "fetch_javadoc": false,
- "generate_compat_repositories": false,
- "maven_install_json": "@@rules_jvm_external~//:rules_jvm_external_deps_install.json",
- "override_targets": {},
- "strict_visibility": false,
- "strict_visibility_value": [
- "@@//visibility:private"
- ],
- "jetify": false,
- "jetify_include_list": [
- "*"
- ],
- "additional_netrc_lines": [],
- "fail_if_repin_required": false,
- "use_starlark_android_rules": false,
- "aar_import_bzl_label": "@build_bazel_rules_android//android:rules.bzl",
- "duplicate_version_warning": "warn"
- }
- }
- },
- "recordedRepoMappingEntries": [
- [
- "rules_jvm_external~",
- "bazel_tools",
- "bazel_tools"
- ],
- [
- "rules_jvm_external~",
- "rules_jvm_external",
- "rules_jvm_external~"
- ]
- ]
- }
- },
- "@@rules_jvm_external~//:non-module-deps.bzl%non_module_deps": {
- "general": {
- "bzlTransitiveDigest": "ZOivBbbZUakRexeLO/N26oX4Bcph6HHnqNmfxt7yoCc=",
- "usagesDigest": "Ccxo9D2Jf1yAMLB2+zS+9MGgnKIFhxCAxFkSqwdK/3c=",
- "recordedFileInputs": {},
- "recordedDirentsInputs": {},
- "envVariables": {},
- "generatedRepoSpecs": {
- "io_bazel_rules_kotlin": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_archive",
- "attributes": {
- "sha256": "946747acdbeae799b085d12b240ec346f775ac65236dfcf18aa0cd7300f6de78",
- "urls": [
- "https://github.com/bazelbuild/rules_kotlin/releases/download/v1.7.0-RC-2/rules_kotlin_release.tgz"
- ]
- }
- }
- },
- "recordedRepoMappingEntries": [
- [
- "rules_jvm_external~",
- "bazel_tools",
- "bazel_tools"
- ]
- ]
- }
- },
- "@@rules_python~//python/extensions:python.bzl%python": {
- "general": {
- "bzlTransitiveDigest": "lbXqTyC4ahBb81TIrIp+2d3sWnlurVNqSeAaLJknLUs=",
- "usagesDigest": "1Y6kbygksx7wAtDStFoHnR90xr8Yeq00I91YcLMbxMI=",
- "recordedFileInputs": {},
- "recordedDirentsInputs": {},
- "envVariables": {},
- "generatedRepoSpecs": {
- "pythons_hub": {
- "bzlFile": "@@rules_python~//python/extensions/private:interpreter_hub.bzl",
- "ruleClassName": "hub_repo",
- "attributes": {
- "toolchains": []
- }
- }
- },
- "recordedRepoMappingEntries": [
- [
- "rules_python~",
- "bazel_tools",
- "bazel_tools"
- ],
- [
- "rules_python~",
- "rules_python",
- "rules_python~"
- ]
- ]
- }
- },
- "@@rules_python~//python/extensions/private:internal_deps.bzl%internal_deps": {
- "general": {
- "bzlTransitiveDigest": "b6FMQSdoZ1QOssw14AW8bWDn2BvywI4FVkLbO2nTMsE=",
- "usagesDigest": "KPNj8wxzOk7dXY9StqZ91MCKEIJSEnAyV0Q/dGFP5sw=",
- "recordedFileInputs": {},
- "recordedDirentsInputs": {},
- "envVariables": {},
- "generatedRepoSpecs": {
- "pypi__build": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_archive",
- "attributes": {
- "url": "https://files.pythonhosted.org/packages/03/97/f58c723ff036a8d8b4d3115377c0a37ed05c1f68dd9a0d66dab5e82c5c1c/build-0.9.0-py3-none-any.whl",
- "sha256": "38a7a2b7a0bdc61a42a0a67509d88c71ecfc37b393baba770fae34e20929ff69",
- "type": "zip",
- "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n"
- }
- },
- "pypi__click": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_archive",
- "attributes": {
- "url": "https://files.pythonhosted.org/packages/76/0a/b6c5f311e32aeb3b406e03c079ade51e905ea630fc19d1262a46249c1c86/click-8.0.1-py3-none-any.whl",
- "sha256": "fba402a4a47334742d782209a7c79bc448911afe1149d07bdabdf480b3e2f4b6",
- "type": "zip",
- "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n"
- }
- },
- "pypi__colorama": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_archive",
- "attributes": {
- "url": "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl",
- "sha256": "4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6",
- "type": "zip",
- "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n"
- }
- },
- "pypi__installer": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_archive",
- "attributes": {
- "url": "https://files.pythonhosted.org/packages/e5/ca/1172b6638d52f2d6caa2dd262ec4c811ba59eee96d54a7701930726bce18/installer-0.7.0-py3-none-any.whl",
- "sha256": "05d1933f0a5ba7d8d6296bb6d5018e7c94fa473ceb10cf198a92ccea19c27b53",
- "type": "zip",
- "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n"
- }
- },
- "pypi__packaging": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_archive",
- "attributes": {
- "url": "https://files.pythonhosted.org/packages/8f/7b/42582927d281d7cb035609cd3a543ffac89b74f3f4ee8e1c50914bcb57eb/packaging-22.0-py3-none-any.whl",
- "sha256": "957e2148ba0e1a3b282772e791ef1d8083648bc131c8ab0c1feba110ce1146c3",
- "type": "zip",
- "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n"
- }
- },
- "pypi__pep517": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_archive",
- "attributes": {
- "url": "https://files.pythonhosted.org/packages/ee/2f/ef63e64e9429111e73d3d6cbee80591672d16f2725e648ebc52096f3d323/pep517-0.13.0-py3-none-any.whl",
- "sha256": "4ba4446d80aed5b5eac6509ade100bff3e7943a8489de249654a5ae9b33ee35b",
- "type": "zip",
- "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n"
- }
- },
- "pypi__pip": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_archive",
- "attributes": {
- "url": "https://files.pythonhosted.org/packages/09/bd/2410905c76ee14c62baf69e3f4aa780226c1bbfc9485731ad018e35b0cb5/pip-22.3.1-py3-none-any.whl",
- "sha256": "908c78e6bc29b676ede1c4d57981d490cb892eb45cd8c214ab6298125119e077",
- "type": "zip",
- "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n"
- }
- },
- "pypi__pip_tools": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_archive",
- "attributes": {
- "url": "https://files.pythonhosted.org/packages/5e/e8/f6d7d1847c7351048da870417724ace5c4506e816b38db02f4d7c675c189/pip_tools-6.12.1-py3-none-any.whl",
- "sha256": "f0c0c0ec57b58250afce458e2e6058b1f30a4263db895b7d72fd6311bf1dc6f7",
- "type": "zip",
- "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n"
- }
- },
- "pypi__setuptools": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_archive",
- "attributes": {
- "url": "https://files.pythonhosted.org/packages/7c/5b/3d92b9f0f7ca1645cba48c080b54fe7d8b1033a4e5720091d1631c4266db/setuptools-60.10.0-py3-none-any.whl",
- "sha256": "782ef48d58982ddb49920c11a0c5c9c0b02e7d7d1c2ad0aa44e1a1e133051c96",
- "type": "zip",
- "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n"
- }
- },
- "pypi__tomli": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_archive",
- "attributes": {
- "url": "https://files.pythonhosted.org/packages/97/75/10a9ebee3fd790d20926a90a2547f0bf78f371b2f13aa822c759680ca7b9/tomli-2.0.1-py3-none-any.whl",
- "sha256": "939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc",
- "type": "zip",
- "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n"
- }
- },
- "pypi__wheel": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_archive",
- "attributes": {
- "url": "https://files.pythonhosted.org/packages/bd/7c/d38a0b30ce22fc26ed7dbc087c6d00851fb3395e9d0dac40bec1f905030c/wheel-0.38.4-py3-none-any.whl",
- "sha256": "b60533f3f5d530e971d6737ca6d58681ee434818fab630c83a734bb10c083ce8",
- "type": "zip",
- "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n"
- }
- },
- "pypi__importlib_metadata": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_archive",
- "attributes": {
- "url": "https://files.pythonhosted.org/packages/d7/31/74dcb59a601b95fce3b0334e8fc9db758f78e43075f22aeb3677dfb19f4c/importlib_metadata-1.4.0-py2.py3-none-any.whl",
- "sha256": "bdd9b7c397c273bcc9a11d6629a38487cd07154fa255a467bf704cd2c258e359",
- "type": "zip",
- "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n"
- }
- },
- "pypi__zipp": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_archive",
- "attributes": {
- "url": "https://files.pythonhosted.org/packages/f4/50/cc72c5bcd48f6e98219fc4a88a5227e9e28b81637a99c49feba1d51f4d50/zipp-1.0.0-py2.py3-none-any.whl",
- "sha256": "8dda78f06bd1674bd8720df8a50bb47b6e1233c503a4eed8e7810686bde37656",
- "type": "zip",
- "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n"
- }
- },
- "pypi__more_itertools": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_archive",
- "attributes": {
- "url": "https://files.pythonhosted.org/packages/bd/3f/c4b3dbd315e248f84c388bd4a72b131a29f123ecacc37ffb2b3834546e42/more_itertools-8.13.0-py3-none-any.whl",
- "sha256": "c5122bffc5f104d37c1626b8615b511f3427aa5389b94d61e5ef8236bfbc3ddb",
- "type": "zip",
- "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n"
- }
- },
- "pypi__coverage_cp38_aarch64-apple-darwin": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_archive",
- "attributes": {
- "build_file_content": "\nfilegroup(\n name = \"coverage\",\n srcs = [\"coverage/__main__.py\"],\n data = glob([\"coverage/*.py\", \"coverage/**/*.py\", \"coverage/*.so\"]),\n visibility = [\"//visibility:public\"],\n)\n ",
- "patch_args": [
- "-p1"
- ],
- "patches": [
- "@@rules_python~//python/private:coverage.patch"
- ],
- "sha256": "2198ea6fc548de52adc826f62cb18554caedfb1d26548c1b7c88d8f7faa8f6ba",
- "type": "zip",
- "urls": [
- "https://files.pythonhosted.org/packages/07/82/79fa21ceca9a9b091eb3c67e27eb648dade27b2c9e1eb23af47232a2a365/coverage-6.5.0-cp38-cp38-macosx_11_0_arm64.whl"
- ]
- }
- },
- "pypi__coverage_cp38_aarch64-unknown-linux-gnu": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_archive",
- "attributes": {
- "build_file_content": "\nfilegroup(\n name = \"coverage\",\n srcs = [\"coverage/__main__.py\"],\n data = glob([\"coverage/*.py\", \"coverage/**/*.py\", \"coverage/*.so\"]),\n visibility = [\"//visibility:public\"],\n)\n ",
- "patch_args": [
- "-p1"
- ],
- "patches": [
- "@@rules_python~//python/private:coverage.patch"
- ],
- "sha256": "6c4459b3de97b75e3bd6b7d4b7f0db13f17f504f3d13e2a7c623786289dd670e",
- "type": "zip",
- "urls": [
- "https://files.pythonhosted.org/packages/40/3b/cd68cb278c4966df00158811ec1e357b9a7d132790c240fc65da57e10013/coverage-6.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl"
- ]
- }
- },
- "pypi__coverage_cp38_x86_64-apple-darwin": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_archive",
- "attributes": {
- "build_file_content": "\nfilegroup(\n name = \"coverage\",\n srcs = [\"coverage/__main__.py\"],\n data = glob([\"coverage/*.py\", \"coverage/**/*.py\", \"coverage/*.so\"]),\n visibility = [\"//visibility:public\"],\n)\n ",
- "patch_args": [
- "-p1"
- ],
- "patches": [
- "@@rules_python~//python/private:coverage.patch"
- ],
- "sha256": "d900bb429fdfd7f511f868cedd03a6bbb142f3f9118c09b99ef8dc9bf9643c3c",
- "type": "zip",
- "urls": [
- "https://files.pythonhosted.org/packages/05/63/a789b462075395d34f8152229dccf92b25ca73eac05b3f6cd75fa5017095/coverage-6.5.0-cp38-cp38-macosx_10_9_x86_64.whl"
- ]
- }
- },
- "pypi__coverage_cp38_x86_64-unknown-linux-gnu": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_archive",
- "attributes": {
- "build_file_content": "\nfilegroup(\n name = \"coverage\",\n srcs = [\"coverage/__main__.py\"],\n data = glob([\"coverage/*.py\", \"coverage/**/*.py\", \"coverage/*.so\"]),\n visibility = [\"//visibility:public\"],\n)\n ",
- "patch_args": [
- "-p1"
- ],
- "patches": [
- "@@rules_python~//python/private:coverage.patch"
- ],
- "sha256": "6b07130585d54fe8dff3d97b93b0e20290de974dc8177c320aeaf23459219c0b",
- "type": "zip",
- "urls": [
- "https://files.pythonhosted.org/packages/bd/a0/e263b115808226fdb2658f1887808c06ac3f1b579ef5dda02309e0d54459/coverage-6.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl"
- ]
- }
- },
- "pypi__coverage_cp39_aarch64-apple-darwin": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_archive",
- "attributes": {
- "build_file_content": "\nfilegroup(\n name = \"coverage\",\n srcs = [\"coverage/__main__.py\"],\n data = glob([\"coverage/*.py\", \"coverage/**/*.py\", \"coverage/*.so\"]),\n visibility = [\"//visibility:public\"],\n)\n ",
- "patch_args": [
- "-p1"
- ],
- "patches": [
- "@@rules_python~//python/private:coverage.patch"
- ],
- "sha256": "95203854f974e07af96358c0b261f1048d8e1083f2de9b1c565e1be4a3a48cfc",
- "type": "zip",
- "urls": [
- "https://files.pythonhosted.org/packages/63/e9/f23e8664ec4032d7802a1cf920853196bcbdce7b56408e3efe1b2da08f3c/coverage-6.5.0-cp39-cp39-macosx_11_0_arm64.whl"
- ]
- }
- },
- "pypi__coverage_cp39_aarch64-unknown-linux-gnu": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_archive",
- "attributes": {
- "build_file_content": "\nfilegroup(\n name = \"coverage\",\n srcs = [\"coverage/__main__.py\"],\n data = glob([\"coverage/*.py\", \"coverage/**/*.py\", \"coverage/*.so\"]),\n visibility = [\"//visibility:public\"],\n)\n ",
- "patch_args": [
- "-p1"
- ],
- "patches": [
- "@@rules_python~//python/private:coverage.patch"
- ],
- "sha256": "b9023e237f4c02ff739581ef35969c3739445fb059b060ca51771e69101efffe",
- "type": "zip",
- "urls": [
- "https://files.pythonhosted.org/packages/18/95/27f80dcd8273171b781a19d109aeaed7f13d78ef6d1e2f7134a5826fd1b4/coverage-6.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl"
- ]
- }
- },
- "pypi__coverage_cp39_x86_64-apple-darwin": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_archive",
- "attributes": {
- "build_file_content": "\nfilegroup(\n name = \"coverage\",\n srcs = [\"coverage/__main__.py\"],\n data = glob([\"coverage/*.py\", \"coverage/**/*.py\", \"coverage/*.so\"]),\n visibility = [\"//visibility:public\"],\n)\n ",
- "patch_args": [
- "-p1"
- ],
- "patches": [
- "@@rules_python~//python/private:coverage.patch"
- ],
- "sha256": "633713d70ad6bfc49b34ead4060531658dc6dfc9b3eb7d8a716d5873377ab745",
- "type": "zip",
- "urls": [
- "https://files.pythonhosted.org/packages/ea/52/c08080405329326a7ff16c0dfdb4feefaa8edd7446413df67386fe1bbfe0/coverage-6.5.0-cp39-cp39-macosx_10_9_x86_64.whl"
- ]
- }
- },
- "pypi__coverage_cp39_x86_64-unknown-linux-gnu": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_archive",
- "attributes": {
- "build_file_content": "\nfilegroup(\n name = \"coverage\",\n srcs = [\"coverage/__main__.py\"],\n data = glob([\"coverage/*.py\", \"coverage/**/*.py\", \"coverage/*.so\"]),\n visibility = [\"//visibility:public\"],\n)\n ",
- "patch_args": [
- "-p1"
- ],
- "patches": [
- "@@rules_python~//python/private:coverage.patch"
- ],
- "sha256": "8f830ed581b45b82451a40faabb89c84e1a998124ee4212d440e9c6cf70083e5",
- "type": "zip",
- "urls": [
- "https://files.pythonhosted.org/packages/6b/f2/919f0fdc93d3991ca074894402074d847be8ac1e1d78e7e9e1c371b69a6f/coverage-6.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl"
- ]
- }
- },
- "pypi__coverage_cp310_aarch64-apple-darwin": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_archive",
- "attributes": {
- "build_file_content": "\nfilegroup(\n name = \"coverage\",\n srcs = [\"coverage/__main__.py\"],\n data = glob([\"coverage/*.py\", \"coverage/**/*.py\", \"coverage/*.so\"]),\n visibility = [\"//visibility:public\"],\n)\n ",
- "patch_args": [
- "-p1"
- ],
- "patches": [
- "@@rules_python~//python/private:coverage.patch"
- ],
- "sha256": "784f53ebc9f3fd0e2a3f6a78b2be1bd1f5575d7863e10c6e12504f240fd06660",
- "type": "zip",
- "urls": [
- "https://files.pythonhosted.org/packages/89/a2/cbf599e50bb4be416e0408c4cf523c354c51d7da39935461a9687e039481/coverage-6.5.0-cp310-cp310-macosx_11_0_arm64.whl"
- ]
- }
- },
- "pypi__coverage_cp310_aarch64-unknown-linux-gnu": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_archive",
- "attributes": {
- "build_file_content": "\nfilegroup(\n name = \"coverage\",\n srcs = [\"coverage/__main__.py\"],\n data = glob([\"coverage/*.py\", \"coverage/**/*.py\", \"coverage/*.so\"]),\n visibility = [\"//visibility:public\"],\n)\n ",
- "patch_args": [
- "-p1"
- ],
- "patches": [
- "@@rules_python~//python/private:coverage.patch"
- ],
- "sha256": "b4a5be1748d538a710f87542f22c2cad22f80545a847ad91ce45e77417293eb4",
- "type": "zip",
- "urls": [
- "https://files.pythonhosted.org/packages/15/b0/3639d84ee8a900da0cf6450ab46e22517e4688b6cec0ba8ab6f8166103a2/coverage-6.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl"
- ]
- }
- },
- "pypi__coverage_cp310_x86_64-apple-darwin": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_archive",
- "attributes": {
- "build_file_content": "\nfilegroup(\n name = \"coverage\",\n srcs = [\"coverage/__main__.py\"],\n data = glob([\"coverage/*.py\", \"coverage/**/*.py\", \"coverage/*.so\"]),\n visibility = [\"//visibility:public\"],\n)\n ",
- "patch_args": [
- "-p1"
- ],
- "patches": [
- "@@rules_python~//python/private:coverage.patch"
- ],
- "sha256": "ef8674b0ee8cc11e2d574e3e2998aea5df5ab242e012286824ea3c6970580e53",
- "type": "zip",
- "urls": [
- "https://files.pythonhosted.org/packages/c4/8d/5ec7d08f4601d2d792563fe31db5e9322c306848fec1e65ec8885927f739/coverage-6.5.0-cp310-cp310-macosx_10_9_x86_64.whl"
- ]
- }
- },
- "pypi__coverage_cp310_x86_64-unknown-linux-gnu": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_archive",
- "attributes": {
- "build_file_content": "\nfilegroup(\n name = \"coverage\",\n srcs = [\"coverage/__main__.py\"],\n data = glob([\"coverage/*.py\", \"coverage/**/*.py\", \"coverage/*.so\"]),\n visibility = [\"//visibility:public\"],\n)\n ",
- "patch_args": [
- "-p1"
- ],
- "patches": [
- "@@rules_python~//python/private:coverage.patch"
- ],
- "sha256": "af4fffaffc4067232253715065e30c5a7ec6faac36f8fc8d6f64263b15f74db0",
- "type": "zip",
- "urls": [
- "https://files.pythonhosted.org/packages/3c/7d/d5211ea782b193ab8064b06dc0cc042cf1a4ca9c93a530071459172c550f/coverage-6.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl"
- ]
- }
- },
- "pypi__coverage_cp311_aarch64-unknown-linux-gnu": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_archive",
- "attributes": {
- "build_file_content": "\nfilegroup(\n name = \"coverage\",\n srcs = [\"coverage/__main__.py\"],\n data = glob([\"coverage/*.py\", \"coverage/**/*.py\", \"coverage/*.so\"]),\n visibility = [\"//visibility:public\"],\n)\n ",
- "patch_args": [
- "-p1"
- ],
- "patches": [
- "@@rules_python~//python/private:coverage.patch"
- ],
- "sha256": "c4ed2820d919351f4167e52425e096af41bfabacb1857186c1ea32ff9983ed75",
- "type": "zip",
- "urls": [
- "https://files.pythonhosted.org/packages/36/f3/5cbd79cf4cd059c80b59104aca33b8d05af4ad5bf5b1547645ecee716378/coverage-6.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl"
- ]
- }
- },
- "pypi__coverage_cp311_x86_64-apple-darwin": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_archive",
- "attributes": {
- "build_file_content": "\nfilegroup(\n name = \"coverage\",\n srcs = [\"coverage/__main__.py\"],\n data = glob([\"coverage/*.py\", \"coverage/**/*.py\", \"coverage/*.so\"]),\n visibility = [\"//visibility:public\"],\n)\n ",
- "patch_args": [
- "-p1"
- ],
- "patches": [
- "@@rules_python~//python/private:coverage.patch"
- ],
- "sha256": "4a5375e28c5191ac38cca59b38edd33ef4cc914732c916f2929029b4bfb50795",
- "type": "zip",
- "urls": [
- "https://files.pythonhosted.org/packages/50/cf/455930004231fa87efe8be06d13512f34e070ddfee8b8bf5a050cdc47ab3/coverage-6.5.0-cp311-cp311-macosx_10_9_x86_64.whl"
- ]
- }
- },
- "pypi__coverage_cp311_x86_64-unknown-linux-gnu": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_archive",
- "attributes": {
- "build_file_content": "\nfilegroup(\n name = \"coverage\",\n srcs = [\"coverage/__main__.py\"],\n data = glob([\"coverage/*.py\", \"coverage/**/*.py\", \"coverage/*.so\"]),\n visibility = [\"//visibility:public\"],\n)\n ",
- "patch_args": [
- "-p1"
- ],
- "patches": [
- "@@rules_python~//python/private:coverage.patch"
- ],
- "sha256": "a8fb6cf131ac4070c9c5a3e21de0f7dc5a0fbe8bc77c9456ced896c12fcdad91",
- "type": "zip",
- "urls": [
- "https://files.pythonhosted.org/packages/6a/63/8e82513b7e4a1b8d887b4e85c1c2b6c9b754a581b187c0b084f3330ac479/coverage-6.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl"
- ]
- }
- }
- },
- "recordedRepoMappingEntries": [
- [
- "rules_python~",
- "bazel_skylib",
- "bazel_skylib~"
- ],
- [
- "rules_python~",
- "bazel_tools",
- "bazel_tools"
- ],
- [
- "rules_python~",
- "rules_python",
- "rules_python~"
- ]
- ]
- }
}
}
}
diff --git a/WORKSPACE b/WORKSPACE
index 61026d7b4e4b..43e3d5fc851c 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -1,7 +1,5 @@
workspace(name = "angular_cli")
-DEFAULT_NODE_VERSION = "20.11.1"
-
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive", "http_file")
http_archive(
@@ -61,58 +59,72 @@ rules_pkg_dependencies()
# Setup the Node.js toolchain
load("@rules_nodejs//nodejs:repositories.bzl", "nodejs_register_toolchains")
-NODE_20_REPO = {
- "20.11.1-darwin_arm64": ("node-v20.11.1-darwin-arm64.tar.gz", "node-v20.11.1-darwin-arm64", "e0065c61f340e85106a99c4b54746c5cee09d59b08c5712f67f99e92aa44995d"),
- "20.11.1-darwin_amd64": ("node-v20.11.1-darwin-x64.tar.gz", "node-v20.11.1-darwin-x64", "c52e7fb0709dbe63a4cbe08ac8af3479188692937a7bd8e776e0eedfa33bb848"),
- "20.11.1-linux_arm64": ("node-v20.11.1-linux-arm64.tar.xz", "node-v20.11.1-linux-arm64", "c957f29eb4e341903520caf362534f0acd1db7be79c502ae8e283994eed07fe1"),
- "20.11.1-linux_ppc64le": ("node-v20.11.1-linux-ppc64le.tar.xz", "node-v20.11.1-linux-ppc64le", "51343cacf5cdf5c4b5e93e919d19dd373d6ef43d5f2c666eae299f26e31d08b5"),
- "20.11.1-linux_s390x": ("node-v20.11.1-linux-s390x.tar.xz", "node-v20.11.1-linux-s390x", "b32616b705cd0ddbb230b95c693e3d7a37becc2ced9bcadea8dc824cceed6be0"),
- "20.11.1-linux_amd64": ("node-v20.11.1-linux-x64.tar.xz", "node-v20.11.1-linux-x64", "d8dab549b09672b03356aa2257699f3de3b58c96e74eb26a8b495fbdc9cf6fbe"),
- "20.11.1-windows_amd64": ("node-v20.11.1-win-x64.zip", "node-v20.11.1-win-x64", "bc032628d77d206ffa7f133518a6225a9c5d6d9210ead30d67e294ff37044bda"),
+# Set the default nodejs toolchain to the latest supported major version
+
+NODE_24_VERSION = "24.0.0"
+
+NODE_24_REPO = {
+ "24.0.0-darwin_arm64": ("node-v24.0.0-darwin-arm64.tar.gz", "node-v24.0.0-darwin-arm64", "194e2f3dd3ec8c2adcaa713ed40f44c5ca38467880e160974ceac1659be60121"),
+ "24.0.0-darwin_amd64": ("node-v24.0.0-darwin-x64.tar.gz", "node-v24.0.0-darwin-x64", "f716b3ce14a7e37a6cbf97c9de10d444d7da07ef833cd8da81dd944d111e6a4a"),
+ "24.0.0-linux_arm64": ("node-v24.0.0-linux-arm64.tar.xz", "node-v24.0.0-linux-arm64", "d40ec7ffe0b82b02dce94208c84351424099bd70fa3a42b65c46d95322305040"),
+ "24.0.0-linux_ppc64le": ("node-v24.0.0-linux-ppc64le.tar.xz", "node-v24.0.0-linux-ppc64le", "cfa0e8d51a2f9a446f1bfb81cdf4c7e95336ad622e2aa230e3fa1d093c63d77d"),
+ "24.0.0-linux_s390x": ("node-v24.0.0-linux-s390x.tar.xz", "node-v24.0.0-linux-s390x", "e37a04c7ee05416ec1234fd3255e05b6b81287eb0424a57441c8b69f0a155021"),
+ "24.0.0-linux_amd64": ("node-v24.0.0-linux-x64.tar.xz", "node-v24.0.0-linux-x64", "59b8af617dccd7f9f68cc8451b2aee1e86d6bd5cb92cd51dd6216a31b707efd7"),
+ "24.0.0-windows_amd64": ("node-v24.0.0-win-x64.zip", "node-v24.0.0-win-x64", "3d0fff80c87bb9a8d7f49f2f27832aa34a1477d137af46f5b14df5498be81304"),
}
-# Set the default nodejs toolchain to the latest supported major version
nodejs_register_toolchains(
name = "nodejs",
- # The below can be removed once @rules_nodejs/nodejs is updated to latest which contains https://github.com/bazelbuild/rules_nodejs/pull/3701
- node_repositories = NODE_20_REPO,
- node_version = DEFAULT_NODE_VERSION,
+ node_repositories = NODE_24_REPO,
+ node_version = NODE_24_VERSION,
)
nodejs_register_toolchains(
name = "node20",
- # The below can be removed once @rules_nodejs/nodejs is updated to latest which contains https://github.com/bazelbuild/rules_nodejs/pull/3701
- node_repositories = NODE_20_REPO,
- node_version = "20.11.1",
+ node_repositories = {
+ "20.19.0-darwin_arm64": ("node-v20.19.0-darwin-arm64.tar.gz", "node-v20.19.0-darwin-arm64", "c016cd1975a264a29dc1b07c6fbe60d5df0a0c2beb4113c0450e3d998d1a0d9c"),
+ "20.19.0-darwin_amd64": ("node-v20.19.0-darwin-x64.tar.gz", "node-v20.19.0-darwin-x64", "a8554af97d6491fdbdabe63d3a1cfb9571228d25a3ad9aed2df856facb131b20"),
+ "20.19.0-linux_arm64": ("node-v20.19.0-linux-arm64.tar.xz", "node-v20.19.0-linux-arm64", "dbe339e55eb393955a213e6b872066880bb9feceaa494f4d44c7aac205ec2ab9"),
+ "20.19.0-linux_ppc64le": ("node-v20.19.0-linux-ppc64le.tar.xz", "node-v20.19.0-linux-ppc64le", "84937108f005679e60b486ed8e801cebfe923f02b76d8e710463d32f82181f65"),
+ "20.19.0-linux_s390x": ("node-v20.19.0-linux-s390x.tar.xz", "node-v20.19.0-linux-s390x", "11f8ee99d792a83bba7b29911e0229dd6cd5e88987d7416346067db1cc76d89a"),
+ "20.19.0-linux_amd64": ("node-v20.19.0-linux-x64.tar.xz", "node-v20.19.0-linux-x64", "b4e336584d62abefad31baecff7af167268be9bb7dd11f1297112e6eed3ca0d5"),
+ "20.19.0-windows_amd64": ("node-v20.19.0-win-x64.zip", "node-v20.19.0-win-x64", "be72284c7bc62de07d5a9fd0ae196879842c085f11f7f2b60bf8864c0c9d6a4f"),
+ },
+ node_version = "20.19.0",
)
nodejs_register_toolchains(
name = "node22",
- # The below can be removed once @rules_nodejs/nodejs is updated to latest which contains https://github.com/bazelbuild/rules_nodejs/pull/3701
node_repositories = {
- "22.11.0-darwin_arm64": ("node-v22.11.0-darwin-arm64.tar.gz", "node-v22.11.0-darwin-arm64", "2e89afe6f4e3aa6c7e21c560d8a0453d84807e97850bbb819b998531a22bdfde"),
- "22.11.0-darwin_amd64": ("node-v22.11.0-darwin-x64.tar.gz", "node-v22.11.0-darwin-x64", "668d30b9512137b5f5baeef6c1bb4c46efff9a761ba990a034fb6b28b9da2465"),
- "22.11.0-linux_arm64": ("node-v22.11.0-linux-arm64.tar.xz", "node-v22.11.0-linux-arm64", "6031d04b98f59ff0f7cb98566f65b115ecd893d3b7870821171708cdbaf7ae6e"),
- "22.11.0-linux_ppc64le": ("node-v22.11.0-linux-ppc64le.tar.xz", "node-v22.11.0-linux-ppc64le", "d1d49d7d611b104b6d616e18ac439479d8296aa20e3741432de0e85f4735a81e"),
- "22.11.0-linux_s390x": ("node-v22.11.0-linux-s390x.tar.xz", "node-v22.11.0-linux-s390x", "f474ed77d6b13d66d07589aee1c2b9175be4c1b165483e608ac1674643064a99"),
- "22.11.0-linux_amd64": ("node-v22.11.0-linux-x64.tar.xz", "node-v22.11.0-linux-x64", "83bf07dd343002a26211cf1fcd46a9d9534219aad42ee02847816940bf610a72"),
- "22.11.0-windows_amd64": ("node-v22.11.0-win-x64.zip", "node-v22.11.0-win-x64", "905373a059aecaf7f48c1ce10ffbd5334457ca00f678747f19db5ea7d256c236"),
+ "22.12.0-darwin_arm64": ("node-v22.12.0-darwin-arm64.tar.gz", "node-v22.12.0-darwin-arm64", "293dcc6c2408da21562d135b0412525e381bb6fe150d688edb58fe850d0f3e13"),
+ "22.12.0-darwin_amd64": ("node-v22.12.0-darwin-x64.tar.gz", "node-v22.12.0-darwin-x64", "52bc25dd026db7247c3c00439afdb83e95087248267f02d6c1a7250d1f896173"),
+ "22.12.0-linux_arm64": ("node-v22.12.0-linux-arm64.tar.xz", "node-v22.12.0-linux-arm64", "8cfd5a8b9afae5a2e0bd86b0148ca31d2589c0ea669c2d0b11c132e35d90ed68"),
+ "22.12.0-linux_ppc64le": ("node-v22.12.0-linux-ppc64le.tar.xz", "node-v22.12.0-linux-ppc64le", "199a606ba1ee86cce6d6b369c71f9d00873d2836a6662592afc3b6a5923e2004"),
+ "22.12.0-linux_s390x": ("node-v22.12.0-linux-s390x.tar.xz", "node-v22.12.0-linux-s390x", "9b517f8006eb4b451d40c461cbe64f93c6455566dbe2613387ab02412bc06d35"),
+ "22.12.0-linux_amd64": ("node-v22.12.0-linux-x64.tar.xz", "node-v22.12.0-linux-x64", "22982235e1b71fa8850f82edd09cdae7e3f32df1764a9ec298c72d25ef2c164f"),
+ "22.12.0-windows_amd64": ("node-v22.12.0-win-x64.zip", "node-v22.12.0-win-x64", "2b8f2256382f97ad51e29ff71f702961af466c4616393f767455501e6aece9b8"),
},
- node_version = "22.11.0",
+ node_version = "22.12.0",
+)
+
+nodejs_register_toolchains(
+ name = "node24",
+ node_repositories = NODE_24_REPO,
+ node_version = NODE_24_VERSION,
)
load("@aspect_rules_js//js:toolchains.bzl", "rules_js_register_toolchains")
rules_js_register_toolchains(
- node_repositories = NODE_20_REPO,
- node_version = DEFAULT_NODE_VERSION,
+ node_repositories = NODE_24_REPO,
+ node_version = NODE_24_VERSION,
)
http_archive(
name = "aspect_bazel_lib",
- sha256 = "2be8a5df0b20b0ed37604b050da01dbf7ad45ad44768c0d478b64779b9f58412",
- strip_prefix = "bazel-lib-2.15.3",
- url = "https://github.com/aspect-build/bazel-lib/releases/download/v2.15.3/bazel-lib-v2.15.3.tar.gz",
+ sha256 = "fc8fe1be58ae39f84a8613d554534760c7f0819d407afcc98bbcbd990523bfed",
+ strip_prefix = "bazel-lib-2.16.0",
+ url = "https://github.com/aspect-build/bazel-lib/releases/download/v2.16.0/bazel-lib-v2.16.0.tar.gz",
)
load("@aspect_bazel_lib//lib:repositories.bzl", "aspect_bazel_lib_dependencies", "aspect_bazel_lib_register_toolchains")
@@ -184,18 +196,17 @@ npm_repositories()
http_archive(
name = "aspect_rules_ts",
- sha256 = "56858e1e4380948e2d5aca5ab2e96fc5ed788652a4a3b7036e8e4b6f019e63bd",
- strip_prefix = "rules_ts-3.5.3",
- url = "https://github.com/aspect-build/rules_ts/releases/download/v3.5.3/rules_ts-v3.5.3.tar.gz",
+ sha256 = "6b15ac1c69f2c0f1282e41ab469fd63cd40eb2e2d83075e19b68a6a76669773f",
+ strip_prefix = "rules_ts-3.6.0",
+ url = "https://github.com/aspect-build/rules_ts/releases/download/v3.6.0/rules_ts-v3.6.0.tar.gz",
)
load("@aspect_rules_ts//ts:repositories.bzl", "rules_ts_dependencies")
rules_ts_dependencies(
- # ts_version_from = "//:package.json",
- # Obtained by: curl --silent https://registry.npmjs.org/typescript/5.7.2 | jq -r '.dist.integrity'
- ts_integrity = "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==",
- ts_version = "5.7.2",
+ # Obtained by: curl --silent https://registry.npmjs.org/typescript/5.8.3 | jq -r '.dist.integrity'
+ ts_integrity = "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==",
+ ts_version_from = "//:package.json",
)
http_file(
@@ -219,7 +230,7 @@ load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository")
git_repository(
name = "devinfra",
- commit = "46b594244e02f9c26b67f22d1756bae31230e517",
+ commit = "91da94a75421120404f1f4a3232e9db971812761",
remote = "https://github.com/angular/dev-infra.git",
)
@@ -262,7 +273,7 @@ esbuild_register_toolchains(
git_repository(
name = "rules_angular",
- commit = "755e5c7c967d38158a4e5defacd2e2e34090e54d",
+ commit = "652e5b0ef9be65ca738e11d5d01424b64344b466",
remote = "https://github.com/devversion/rules_angular.git",
)
diff --git a/constants.bzl b/constants.bzl
index 4c42bcb8dbb9..a80292ab7c1c 100644
--- a/constants.bzl
+++ b/constants.bzl
@@ -1,12 +1,12 @@
# Engine versions to stamp in a release package.json
-RELEASE_ENGINES_NODE = "^20.11.1 || >=22.11.0"
+RELEASE_ENGINES_NODE = "^20.19.0 || ^22.12.0 || >=24.0.0"
RELEASE_ENGINES_NPM = "^6.11.0 || ^7.5.6 || >=8.0.0"
RELEASE_ENGINES_YARN = ">= 1.13.0"
-NG_PACKAGR_VERSION = "^20.0.0-next.0"
-ANGULAR_FW_VERSION = "^20.0.0-next.0"
-ANGULAR_FW_PEER_DEP = "^20.0.0 || ^20.0.0-next.0"
-NG_PACKAGR_PEER_DEP = "^20.0.0 || ^20.0.0-next.0"
+NG_PACKAGR_VERSION = "^20.0.0"
+ANGULAR_FW_VERSION = "^20.0.0"
+ANGULAR_FW_PEER_DEP = "^20.0.0"
+NG_PACKAGR_PEER_DEP = "^20.0.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
diff --git a/docs/DEVELOPER.md b/docs/DEVELOPER.md
index 640e83447ae8..bd0c9bdf1ee3 100644
--- a/docs/DEVELOPER.md
+++ b/docs/DEVELOPER.md
@@ -7,7 +7,7 @@ To get started locally, follow these instructions:
1. If you haven't done it already, [make a fork of this repo](https://github.com/angular/angular-cli/fork).
2. If you are on Windows, see [the extra steps needed for contributing on Windows](#windows)
3. Clone to your local computer using `git`.
-4. Make sure that you have Node `v20.18.1` or higher installed. See instructions [here](https://nodejs.org/en/download/).
+4. Make sure that you have Node `v20.19.0` or higher installed. See instructions [here](https://nodejs.org/en/download/).
5. Install `pnpm`.
- You can install pnpm by running `npm i -g pnpm@9`.
- See detailed instructions [here](https://pnpm.io/installation).
diff --git a/goldens/public-api/angular/build/index.api.md b/goldens/public-api/angular/build/index.api.md
index 6c0c2f19145b..aa9ac693864e 100644
--- a/goldens/public-api/angular/build/index.api.md
+++ b/goldens/public-api/angular/build/index.api.md
@@ -25,7 +25,7 @@ export type ApplicationBuilderOptions = {
appShell?: boolean;
assets?: AssetPattern[];
baseHref?: string;
- browser: string;
+ browser?: string;
budgets?: Budget[];
clearScreen?: boolean;
conditions?: string[];
@@ -158,6 +158,7 @@ export function executeNgPackagrBuilder(options: NgPackagrBuilderOptions, contex
export type ExtractI18nBuilderOptions = {
buildTarget?: string;
format?: Format;
+ i18nDuplicateTranslation?: I18NDuplicateTranslation;
outFile?: string;
outputPath?: string;
progress?: boolean;
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 9208d1ad56a1..cb46b4458351 100644
--- a/goldens/public-api/angular_devkit/build_angular/index.api.md
+++ b/goldens/public-api/angular_devkit/build_angular/index.api.md
@@ -191,6 +191,7 @@ export type ExecutionTransformer = (input: T) => T | Promise;
export type ExtractI18nBuilderOptions = {
buildTarget?: string;
format?: Format;
+ i18nDuplicateTranslation?: I18NDuplicateTranslation;
outFile?: string;
outputPath?: string;
progress?: boolean;
diff --git a/goldens/public-api/angular_devkit/core/index.api.md b/goldens/public-api/angular_devkit/core/index.api.md
index 3dd0c8d848bb..748faf2bbeb4 100644
--- a/goldens/public-api/angular_devkit/core/index.api.md
+++ b/goldens/public-api/angular_devkit/core/index.api.md
@@ -554,11 +554,11 @@ function oneLine(strings: TemplateStringsArray, ...values: any[]): string;
function parseJsonPointer(pointer: JsonPointer): string[];
// @public (undocumented)
-export class PartiallyOrderedSet implements Set {
+export class PartiallyOrderedSet {
// (undocumented)
[Symbol.iterator](): IterableIterator;
// (undocumented)
- get [Symbol.toStringTag](): 'Set';
+ get [Symbol.toStringTag](): 'PartiallyOrderedSet';
// (undocumented)
add(item: T, deps?: Set | T[]): this;
// (undocumented)
@@ -567,15 +567,15 @@ export class PartiallyOrderedSet implements Set {
clear(): void;
// (undocumented)
delete(item: T): boolean;
- entries(): SetIterator<[T, T]>;
+ entries(): IterableIterator<[T, T]>;
// (undocumented)
forEach(callbackfn: (value: T, value2: T, set: PartiallyOrderedSet) => void, thisArg?: any): void;
// (undocumented)
has(item: T): boolean;
- keys(): SetIterator;
+ keys(): IterableIterator;
// (undocumented)
get size(): number;
- values(): SetIterator;
+ values(): IterableIterator;
}
// @public
diff --git a/modules/testing/builder/BUILD.bazel b/modules/testing/builder/BUILD.bazel
index 9814ad27811d..154f494af35f 100644
--- a/modules/testing/builder/BUILD.bazel
+++ b/modules/testing/builder/BUILD.bazel
@@ -45,6 +45,6 @@ ts_project(
)
jasmine_test(
- name = "unit_test",
+ name = "test",
data = [":unit_test_lib"],
)
diff --git a/modules/testing/builder/package.json b/modules/testing/builder/package.json
index 50e0cbc98b7b..b76d212f1296 100644
--- a/modules/testing/builder/package.json
+++ b/modules/testing/builder/package.json
@@ -5,6 +5,6 @@
"@angular/ssr": "workspace:*",
"@angular-devkit/build-angular": "workspace:*",
"rxjs": "7.8.2",
- "vitest": "3.1.2"
+ "vitest": "3.1.3"
}
}
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 7ad5e58e8efc..1cf153a1da81 100644
--- a/modules/testing/builder/projects/hello-world-app/karma.conf.js
+++ b/modules/testing/builder/projects/hello-world-app/karma.conf.js
@@ -47,7 +47,7 @@ module.exports = function(config) {
base: 'ChromeHeadless',
flags: [
'--disable-gpu',
- ...(process.env.CHROME_NO_SANDBOX === '1' ? ['--no-sandbox'] : []),
+ '--no-sandbox'
],
},
},
diff --git a/modules/testing/builder/src/builder-harness.ts b/modules/testing/builder/src/builder-harness.ts
index ecee882739d8..092206698f83 100644
--- a/modules/testing/builder/src/builder-harness.ts
+++ b/modules/testing/builder/src/builder-harness.ts
@@ -115,6 +115,10 @@ export class BuilderHarness {
return join(getSystemPath(this.host.root()), path);
}
+ resetProjectMetadata(): void {
+ this.projectMetadata = DEFAULT_PROJECT_METADATA;
+ }
+
useProject(name: string, metadata: Record = {}): this {
if (!name) {
throw new Error('Project name cannot be an empty string.');
diff --git a/modules/testing/builder/src/jasmine-helpers.ts b/modules/testing/builder/src/jasmine-helpers.ts
index b204d507bab8..15045a2f56d5 100644
--- a/modules/testing/builder/src/jasmine-helpers.ts
+++ b/modules/testing/builder/src/jasmine-helpers.ts
@@ -37,7 +37,11 @@ export function describeBuilder(
});
describe(options.name || builderHandler.name, () => {
- beforeEach(() => host.initialize().toPromise());
+ beforeEach(async () => {
+ harness.resetProjectMetadata();
+
+ await host.initialize().toPromise();
+ });
afterEach(() => host.restore().toPromise());
diff --git a/package.json b/package.json
index 1475df4bda0f..63b32aee21e6 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "@angular/devkit-repo",
- "version": "20.0.0-next.8",
+ "version": "20.0.4",
"private": true,
"description": "Software Development Kit for Angular",
"keywords": [
@@ -32,9 +32,9 @@
"type": "git",
"url": "https://github.com/angular/angular-cli.git"
},
- "packageManager": "pnpm@9.15.6",
+ "packageManager": "pnpm@9.15.9",
"engines": {
- "node": "^20.11.1 || >=22.11.0",
+ "node": "^20.19.0 || ^22.12.0 || >=24.0.0",
"npm": "Please use pnpm instead of NPM to install dependencies",
"yarn": "Please use pnpm instead of Yarn to install dependencies",
"pnpm": "^9.15.6"
@@ -46,25 +46,25 @@
},
"homepage": "https://github.com/angular/angular-cli",
"devDependencies": {
- "@angular/animations": "20.0.0-next.9",
- "@angular/cdk": "20.0.0-next.8",
- "@angular/common": "20.0.0-next.9",
- "@angular/compiler": "20.0.0-next.9",
- "@angular/compiler-cli": "20.0.0-next.9",
- "@angular/core": "20.0.0-next.9",
- "@angular/forms": "20.0.0-next.9",
- "@angular/localize": "20.0.0-next.9",
- "@angular/material": "20.0.0-next.8",
- "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#1a12d97905f4af88ccc0b582864907729d23e23e",
- "@angular/platform-browser": "20.0.0-next.9",
- "@angular/platform-server": "20.0.0-next.9",
- "@angular/router": "20.0.0-next.9",
- "@angular/service-worker": "20.0.0-next.9",
+ "@angular/animations": "20.0.0",
+ "@angular/cdk": "20.0.0-rc.2",
+ "@angular/common": "20.0.0",
+ "@angular/compiler": "20.0.0",
+ "@angular/compiler-cli": "20.0.0",
+ "@angular/core": "20.0.0",
+ "@angular/forms": "20.0.0",
+ "@angular/localize": "20.0.0",
+ "@angular/material": "20.0.0-rc.2",
+ "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#aa535e2d49ecfb0fbd230b192cb97c3d193ca3ee",
+ "@angular/platform-browser": "20.0.0",
+ "@angular/platform-server": "20.0.0",
+ "@angular/router": "20.0.0",
+ "@angular/service-worker": "20.0.0",
"@bazel/bazelisk": "1.26.0",
- "@bazel/buildifier": "8.0.3",
- "@eslint/compat": "1.2.8",
+ "@bazel/buildifier": "8.2.0",
+ "@eslint/compat": "1.2.9",
"@eslint/eslintrc": "3.3.1",
- "@eslint/js": "9.25.1",
+ "@eslint/js": "9.26.0",
"@rollup/plugin-alias": "^5.1.1",
"@rollup/plugin-commonjs": "^28.0.0",
"@rollup/plugin-json": "^6.1.0",
@@ -94,21 +94,21 @@
"@types/yargs": "^17.0.20",
"@types/yargs-parser": "^21.0.0",
"@types/yarnpkg__lockfile": "^1.1.5",
- "@typescript-eslint/eslint-plugin": "8.31.1",
- "@typescript-eslint/parser": "8.31.1",
+ "@typescript-eslint/eslint-plugin": "8.32.1",
+ "@typescript-eslint/parser": "8.32.1",
"ajv": "8.17.1",
"ansi-colors": "4.1.3",
- "beasties": "0.3.3",
+ "beasties": "0.3.4",
"buffer": "6.0.3",
- "esbuild": "0.25.3",
- "esbuild-wasm": "0.25.3",
- "eslint": "9.25.1",
- "eslint-config-prettier": "10.1.2",
+ "esbuild": "0.25.5",
+ "esbuild-wasm": "0.25.5",
+ "eslint": "9.26.0",
+ "eslint-config-prettier": "10.1.5",
"eslint-plugin-header": "3.1.1",
"eslint-plugin-import": "2.31.0",
"express": "5.1.0",
"fast-glob": "3.3.3",
- "globals": "16.0.0",
+ "globals": "16.1.0",
"http-proxy": "^1.18.1",
"http-proxy-middleware": "3.0.5",
"husky": "9.1.7",
@@ -122,7 +122,7 @@
"karma-jasmine": "~5.1.0",
"karma-jasmine-html-reporter": "~2.1.0",
"karma-source-map-support": "1.4.0",
- "listr2": "8.3.2",
+ "listr2": "8.3.3",
"lodash": "^4.17.21",
"npm": "^11.0.0",
"magic-string": "0.30.17",
@@ -131,17 +131,17 @@
"prettier": "^3.0.0",
"protractor": "~7.0.0",
"puppeteer": "18.2.1",
- "quicktype-core": "23.1.1",
- "rollup": "4.40.1",
+ "quicktype-core": "23.1.4",
+ "rollup": "4.40.2",
"rollup-license-plugin": "~3.0.1",
- "semver": "7.7.1",
- "shelljs": "^0.9.0",
+ "semver": "7.7.2",
+ "shelljs": "^0.10.0",
"source-map-support": "0.5.21",
"tar": "^7.0.0",
"ts-node": "^10.9.1",
"tslib": "2.8.1",
"typescript": "5.8.3",
- "undici": "7.8.0",
+ "undici": "7.9.0",
"unenv": "^1.10.0",
"verdaccio": "6.1.2",
"verdaccio-auth-memory": "^10.0.0",
diff --git a/packages/angular/build/BUILD.bazel b/packages/angular/build/BUILD.bazel
index de157d169bbb..8762ac9e3880 100644
--- a/packages/angular/build/BUILD.bazel
+++ b/packages/angular/build/BUILD.bazel
@@ -162,7 +162,7 @@ ts_project(
)
jasmine_test(
- name = "unit_tests",
+ name = "test",
data = [":unit_test_lib"],
)
diff --git a/packages/angular/build/package.json b/packages/angular/build/package.json
index 730bbca1a23c..1bafb9b63681 100644
--- a/packages/angular/build/package.json
+++ b/packages/angular/build/package.json
@@ -20,43 +20,43 @@
"dependencies": {
"@ampproject/remapping": "2.3.0",
"@angular-devkit/architect": "workspace:0.0.0-EXPERIMENTAL-PLACEHOLDER",
- "@babel/core": "7.26.10",
- "@babel/helper-annotate-as-pure": "7.25.9",
+ "@babel/core": "7.27.1",
+ "@babel/helper-annotate-as-pure": "7.27.1",
"@babel/helper-split-export-declaration": "7.24.7",
- "@inquirer/confirm": "5.1.9",
+ "@inquirer/confirm": "5.1.10",
"@vitejs/plugin-basic-ssl": "2.0.0",
- "beasties": "0.3.3",
+ "beasties": "0.3.4",
"browserslist": "^4.23.0",
- "esbuild": "0.25.3",
+ "esbuild": "0.25.5",
"https-proxy-agent": "7.0.6",
"istanbul-lib-instrument": "6.0.3",
"jsonc-parser": "3.3.1",
- "listr2": "8.3.2",
+ "listr2": "8.3.3",
"magic-string": "0.30.17",
"mrmime": "2.0.1",
"parse5-html-rewriting-stream": "7.1.0",
"picomatch": "4.0.2",
- "piscina": "4.9.2",
- "rollup": "4.40.1",
- "sass": "1.87.0",
- "semver": "7.7.1",
+ "piscina": "5.1.1",
+ "rollup": "4.40.2",
+ "sass": "1.88.0",
+ "semver": "7.7.2",
"source-map-support": "0.5.21",
"tinyglobby": "0.2.13",
- "vite": "6.3.4",
+ "vite": "6.3.5",
"watchpack": "2.4.2"
},
"optionalDependencies": {
- "lmdb": "3.2.6"
+ "lmdb": "3.3.0"
},
"devDependencies": {
"@angular/ssr": "workspace:*",
"@angular-devkit/core": "workspace:*",
"jsdom": "26.1.0",
"less": "4.3.0",
- "ng-packagr": "20.0.0-next.8",
+ "ng-packagr": "20.0.0",
"postcss": "8.5.3",
"rxjs": "7.8.2",
- "vitest": "3.1.2"
+ "vitest": "3.1.3"
},
"peerDependencies": {
"@angular/core": "0.0.0-ANGULAR-FW-PEER-DEP",
diff --git a/packages/angular/build/src/builders/application/execute-build.ts b/packages/angular/build/src/builders/application/execute-build.ts
index 72a07d8b8307..0654cd965558 100644
--- a/packages/angular/build/src/builders/application/execute-build.ts
+++ b/packages/angular/build/src/builders/application/execute-build.ts
@@ -285,8 +285,10 @@ export async function executeBuild(
i18nOptions.hasDefinedSourceLocale ? i18nOptions.sourceLocale : undefined,
);
- executionResult.addErrors(result.errors);
- executionResult.addWarnings(result.warnings);
+ // Deduplicate and add errors and warnings
+ executionResult.addErrors([...new Set(result.errors)]);
+ executionResult.addWarnings([...new Set(result.warnings)]);
+
executionResult.addPrerenderedRoutes(result.prerenderedRoutes);
executionResult.outputFiles.push(...result.additionalOutputFiles);
executionResult.assetFiles.push(...result.additionalAssets);
diff --git a/packages/angular/build/src/builders/application/i18n.ts b/packages/angular/build/src/builders/application/i18n.ts
index 478a8893ca10..ae37efa674e4 100644
--- a/packages/angular/build/src/builders/application/i18n.ts
+++ b/packages/angular/build/src/builders/application/i18n.ts
@@ -140,6 +140,30 @@ export async function inlineI18n(
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.`,
+ );
+ }
+ 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;
}
diff --git a/packages/angular/build/src/builders/application/options.ts b/packages/angular/build/src/builders/application/options.ts
index 60b240eb9d74..c3b13699a06e 100644
--- a/packages/angular/build/src/builders/application/options.ts
+++ b/packages/angular/build/src/builders/application/options.ts
@@ -177,7 +177,12 @@ export async function normalizeOptions(
i18nOptions.flatOutput = true;
}
- const entryPoints = normalizeEntryPoints(workspaceRoot, options.browser, options.entryPoints);
+ const entryPoints = normalizeEntryPoints(
+ workspaceRoot,
+ projectSourceRoot,
+ options.browser,
+ options.entryPoints,
+ );
const tsconfig = path.join(workspaceRoot, options.tsConfig);
const optimizationOptions = normalizeOptimization(options.optimization);
const sourcemapOptions = normalizeSourceMaps(options.sourceMap ?? false);
@@ -545,26 +550,25 @@ async function getTailwindConfig(
*/
function normalizeEntryPoints(
workspaceRoot: string,
+ projectSourceRoot: string,
browser: string | undefined,
- entryPoints: Set | Map = new Set(),
+ entryPoints: Set | Map | undefined,
): Record {
if (browser === '') {
throw new Error('`browser` option cannot be an empty string.');
}
// `browser` and `entryPoints` are mutually exclusive.
- if (browser && entryPoints.size > 0) {
+ if (browser && entryPoints) {
throw new Error('Only one of `browser` or `entryPoints` may be provided.');
}
- if (!browser && entryPoints.size === 0) {
- // Schema should normally reject this case, but programmatic usages of the builder might make this mistake.
- throw new Error('Either `browser` or at least one `entryPoints` value must be provided.');
- }
- // Schema types force `browser` to always be provided, but it may be omitted when the builder is invoked programmatically.
if (browser) {
// Use `browser` alone.
return { 'main': path.join(workspaceRoot, browser) };
+ } else if (!entryPoints) {
+ // Default browser entry if no explicit entry points
+ return { 'main': path.join(projectSourceRoot, 'main.ts') };
} else if (entryPoints instanceof Map) {
return Object.fromEntries(
Array.from(entryPoints.entries(), ([name, entryPoint]) => {
diff --git a/packages/angular/build/src/builders/application/schema.json b/packages/angular/build/src/builders/application/schema.json
index 934bfe9390f4..ef4cbb75b82a 100644
--- a/packages/angular/build/src/builders/application/schema.json
+++ b/packages/angular/build/src/builders/application/schema.json
@@ -616,7 +616,7 @@
}
},
"additionalProperties": false,
- "required": ["browser", "tsConfig"],
+ "required": ["tsConfig"],
"definitions": {
"assetPattern": {
"oneOf": [
diff --git a/packages/angular/build/src/builders/application/tests/options/browser_spec.ts b/packages/angular/build/src/builders/application/tests/options/browser_spec.ts
index 7a795fdb0883..9fe3cd00536a 100644
--- a/packages/angular/build/src/builders/application/tests/options/browser_spec.ts
+++ b/packages/angular/build/src/builders/application/tests/options/browser_spec.ts
@@ -42,6 +42,49 @@ describeBuilder(buildApplication, APPLICATION_BUILDER_INFO, (harness) => {
harness.expectFile('dist/browser/main.js').content.toContain('console.log("main")');
});
+ it('defaults to use `src/main.ts` if not present', async () => {
+ harness.useTarget('build', {
+ ...BASE_OPTIONS,
+ browser: undefined,
+ });
+
+ const { result } = await harness.executeOnce();
+
+ expect(result?.success).toBe(true);
+
+ harness.expectFile('dist/browser/main.js').toExist();
+ harness.expectFile('dist/browser/index.html').toExist();
+ });
+
+ it('uses project source root in default if `browser` not present', async () => {
+ harness.useProject('test', {
+ root: '.',
+ sourceRoot: 'source',
+ cli: {
+ cache: {
+ enabled: false,
+ },
+ },
+ });
+ harness.useTarget('build', {
+ ...BASE_OPTIONS,
+ browser: undefined,
+ index: false,
+ });
+
+ // Update app for a `source/main.ts` file based on the above changed `sourceRoot`
+ await harness.writeFile('source/main.ts', `console.log('main');`);
+ await harness.modifyFile('src/tsconfig.app.json', (content) =>
+ content.replace('main.ts', '../source/main.ts'),
+ );
+
+ const { result } = await harness.executeOnce();
+
+ expect(result?.success).toBe(true);
+
+ harness.expectFile('dist/browser/main.js').content.toContain('console.log("main")');
+ });
+
it('fails and shows an error when file does not exist', async () => {
harness.useTarget('build', {
...BASE_OPTIONS,
diff --git a/packages/angular/build/src/builders/dev-server/vite-server.ts b/packages/angular/build/src/builders/dev-server/vite-server.ts
index b09775c4a312..7dbafe80f8f4 100644
--- a/packages/angular/build/src/builders/dev-server/vite-server.ts
+++ b/packages/angular/build/src/builders/dev-server/vite-server.ts
@@ -158,14 +158,15 @@ export async function* serveWithVite(
process.setSourceMapsEnabled(true);
}
+ const componentsHmrCanBeUsed =
+ browserOptions.aot && serverOptions.liveReload && serverOptions.hmr;
+
// Enable to support link-based component style hot reloading (`NG_HMR_CSTYLES=1` can be used to enable)
- browserOptions.externalRuntimeStyles =
- serverOptions.liveReload && serverOptions.hmr && useComponentStyleHmr;
+ browserOptions.externalRuntimeStyles = componentsHmrCanBeUsed && useComponentStyleHmr;
// Enable to support component template hot replacement (`NG_HMR_TEMPLATE=0` can be used to disable selectively)
// This will also replace file-based/inline styles as code if external runtime styles are not enabled.
- browserOptions.templateUpdates =
- serverOptions.liveReload && serverOptions.hmr && useComponentTemplateHmr;
+ browserOptions.templateUpdates = componentsHmrCanBeUsed && useComponentTemplateHmr;
browserOptions.incrementalResults = true;
// Setup the prebundling transformer that will be shared across Vite prebundling requests
diff --git a/packages/angular/build/src/builders/extract-i18n/builder.ts b/packages/angular/build/src/builders/extract-i18n/builder.ts
index 5e44c31fa516..15b0156f749b 100644
--- a/packages/angular/build/src/builders/extract-i18n/builder.ts
+++ b/packages/angular/build/src/builders/extract-i18n/builder.ts
@@ -90,16 +90,23 @@ export async function execute(
return path.relative(from, to);
},
};
+ const duplicateTranslationBehavior = normalizedOptions.i18nOptions.duplicateTranslationBehavior;
const diagnostics = checkDuplicateMessages(
// eslint-disable-next-line @typescript-eslint/no-explicit-any
checkFileSystem as any,
extractionResult.messages,
- normalizedOptions.i18nOptions.i18nDuplicateTranslation || 'warning',
+ duplicateTranslationBehavior,
// eslint-disable-next-line @typescript-eslint/no-explicit-any
extractionResult.basePath as any,
);
- if (diagnostics.messages.length > 0) {
- context.logger.warn(diagnostics.formatDiagnostics(''));
+ if (diagnostics.messages.length > 0 && duplicateTranslationBehavior !== 'ignore') {
+ if (duplicateTranslationBehavior === 'error') {
+ context.logger.error(`Extraction Failed: ${diagnostics.formatDiagnostics('')}`);
+
+ return { success: false };
+ } else {
+ context.logger.warn(diagnostics.formatDiagnostics(''));
+ }
}
// Serialize all extracted messages
diff --git a/packages/angular/build/src/builders/extract-i18n/options.ts b/packages/angular/build/src/builders/extract-i18n/options.ts
index 24be86ee7c8f..2904a466bd60 100644
--- a/packages/angular/build/src/builders/extract-i18n/options.ts
+++ b/packages/angular/build/src/builders/extract-i18n/options.ts
@@ -6,10 +6,11 @@
* found in the LICENSE file at https://angular.dev/license
*/
+import { type DiagnosticHandlingStrategy } from '@angular/localize/tools';
import { BuilderContext, targetFromTargetString } from '@angular-devkit/architect';
import { fail } from 'node:assert';
import path from 'node:path';
-import { createI18nOptions } from '../../utils/i18n-options';
+import { type I18nOptions, createI18nOptions } from '../../utils/i18n-options';
import { Schema as ExtractI18nOptions, Format } from './schema';
export type NormalizedExtractI18nOptions = Awaited>;
@@ -36,7 +37,12 @@ export async function normalizeOptions(
// Target specifier defaults to the current project's build target with no specified configuration
const buildTargetSpecifier = options.buildTarget ?? ':';
const buildTarget = targetFromTargetString(buildTargetSpecifier, projectName, 'build');
- const i18nOptions = createI18nOptions(projectMetadata, /** inline */ false, context.logger);
+ const i18nOptions: I18nOptions & {
+ duplicateTranslationBehavior: DiagnosticHandlingStrategy;
+ } = {
+ ...createI18nOptions(projectMetadata, /** inline */ false, context.logger),
+ duplicateTranslationBehavior: options.i18nDuplicateTranslation || 'warning',
+ };
// Normalize xliff format extensions
let format = options.format;
diff --git a/packages/angular/build/src/builders/extract-i18n/schema.json b/packages/angular/build/src/builders/extract-i18n/schema.json
index 9ab939b0e938..08a118ad7d5e 100644
--- a/packages/angular/build/src/builders/extract-i18n/schema.json
+++ b/packages/angular/build/src/builders/extract-i18n/schema.json
@@ -27,6 +27,11 @@
"outFile": {
"type": "string",
"description": "Name of the file to output."
+ },
+ "i18nDuplicateTranslation": {
+ "type": "string",
+ "description": "How to handle duplicate translations.",
+ "enum": ["error", "warning", "ignore"]
}
},
"additionalProperties": false
diff --git a/packages/angular/build/src/builders/karma/application_builder.ts b/packages/angular/build/src/builders/karma/application_builder.ts
index c73dbbe7fbe6..d33469a45ef6 100644
--- a/packages/angular/build/src/builders/karma/application_builder.ts
+++ b/packages/angular/build/src/builders/karma/application_builder.ts
@@ -86,7 +86,7 @@ class AngularAssetsMiddleware {
switch (file.origin) {
case 'disk':
- this.serveFile(file.inputPath, undefined, res);
+ this.serveFile(file.inputPath, undefined, res, undefined, undefined, /* doNotCache */ true);
break;
case 'memory':
// Include pathname to help with Content-Type headers.
@@ -119,6 +119,7 @@ class AngularPolyfillsPlugin {
static createPlugin(
polyfillsFile: FilePattern,
jasmineCleanupFiles: FilePattern,
+ scriptsFiles: FilePattern[],
): InlinePluginDef {
return {
// This has to be a "reporter" because reporters run _after_ frameworks
@@ -166,6 +167,9 @@ class AngularPolyfillsPlugin {
}
}
+ // Add "scripts" option files as classic scripts
+ files.unshift(...scriptsFiles);
+
// Add browser sourcemap support as a classic script
files.unshift({
pattern: localResolve('source-map-support/browser-source-map-support.js'),
@@ -488,17 +492,28 @@ async function initializeApplication(
karmaOptions.basePath = outputPath;
- karmaOptions.files ??= [];
+ const scriptsFiles: FilePattern[] = [];
if (options.scripts?.length) {
- // This should be more granular to support named bundles.
- // However, it replicates the behavior of the Karma Webpack-based builder.
- karmaOptions.files.push({
- pattern: `scripts.js`,
- watched: false,
- type: 'js',
- });
+ const outputScripts = new Set();
+ for (const scriptEntry of options.scripts) {
+ const outputName =
+ typeof scriptEntry === 'string'
+ ? 'scripts.js'
+ : `${scriptEntry.bundleName ?? 'scripts'}.js`;
+
+ if (outputScripts.has(outputName)) {
+ continue;
+ }
+ outputScripts.add(outputName);
+ scriptsFiles.push({
+ pattern: `${outputPath}/${outputName}`,
+ watched: false,
+ type: 'js',
+ });
+ }
}
+ karmaOptions.files ??= [];
karmaOptions.files.push(
// Serve global setup script.
{ pattern: `${mainName}.js`, type: 'module', watched: false },
@@ -572,11 +587,40 @@ async function initializeApplication(
parsedKarmaConfig.middleware.push(AngularAssetsMiddleware.NAME);
parsedKarmaConfig.plugins.push(
- AngularPolyfillsPlugin.createPlugin(polyfillsFile, jasmineCleanupFiles),
+ AngularPolyfillsPlugin.createPlugin(polyfillsFile, jasmineCleanupFiles, scriptsFiles),
);
parsedKarmaConfig.reporters ??= [];
parsedKarmaConfig.reporters.push(AngularPolyfillsPlugin.NAME);
+ // Adjust karma junit reporter outDir location to maintain previous (devkit) behavior
+ // The base path for the reporter was previously the workspace root.
+ // To keep the files in the same location, the reporter's output directory is adjusted
+ // to be relative to the workspace root when using junit.
+ if (parsedKarmaConfig.reporters?.some((reporter) => reporter === 'junit')) {
+ if ('junitReporter' in parsedKarmaConfig) {
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ const junitReporterOptions = (parsedKarmaConfig as any)['junitReporter'] as {
+ outputDir?: unknown;
+ };
+ if (junitReporterOptions.outputDir == undefined) {
+ junitReporterOptions.outputDir = context.workspaceRoot;
+ } else if (
+ typeof junitReporterOptions.outputDir === 'string' &&
+ !path.isAbsolute(junitReporterOptions.outputDir)
+ ) {
+ junitReporterOptions.outputDir = path.join(
+ context.workspaceRoot,
+ junitReporterOptions.outputDir,
+ );
+ }
+ } else {
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ (parsedKarmaConfig as any)['junitReporter'] = {
+ outputDir: context.workspaceRoot,
+ };
+ }
+ }
+
// When using code-coverage, auto-add karma-coverage.
// This was done as part of the karma plugin for webpack.
if (
diff --git a/packages/angular/build/src/builders/karma/tests/behavior/rebuilds_spec.ts b/packages/angular/build/src/builders/karma/tests/behavior/rebuilds_spec.ts
index e740b7adfcd6..6ec02c2c28f1 100644
--- a/packages/angular/build/src/builders/karma/tests/behavior/rebuilds_spec.ts
+++ b/packages/angular/build/src/builders/karma/tests/behavior/rebuilds_spec.ts
@@ -10,6 +10,7 @@ import { concatMap, count, debounceTime, distinctUntilChanged, take, timeout } f
import { execute } from '../../index';
import { BASE_OPTIONS, KARMA_BUILDER_INFO, describeKarmaBuilder } from '../setup';
import { BuilderOutput } from '@angular-devkit/architect';
+import { randomBytes } from 'node:crypto';
describeKarmaBuilder(execute, KARMA_BUILDER_INFO, (harness, setupTarget) => {
describe('Behavior: "Rebuilds"', () => {
@@ -68,5 +69,59 @@ describeKarmaBuilder(execute, KARMA_BUILDER_INFO, (harness, setupTarget) => {
expect(buildCount).toBe(expectedSequence.length);
});
+
+ it('correctly serves binary assets on rebuilds', async () => {
+ await harness.writeFiles({
+ './src/random.bin': randomBytes(1024),
+ './src/app/app.component.spec.ts': `
+ describe('AppComponent', () => {
+ it('should fetch binary file with correct size', async () => {
+ const resp = await fetch('/random.bin');
+ const data = await resp.arrayBuffer();
+ expect(data.byteLength).toBe(1024);
+ });
+ });`,
+ });
+
+ harness.useTarget('test', {
+ ...BASE_OPTIONS,
+ watch: true,
+ assets: ['src/random.bin'],
+ });
+
+ interface OutputCheck {
+ (result: BuilderOutput | undefined): Promise;
+ }
+
+ const expectedSequence: OutputCheck[] = [
+ async (result) => {
+ // Karma run should succeed.
+ expect(result?.success).withContext('Initial test run should succeed').toBeTrue();
+ // Modify test file to trigger a rebuild
+ await harness.appendToFile(
+ 'src/app/app.component.spec.ts',
+ `\n;console.log('modified');`,
+ );
+ },
+ async (result) => {
+ expect(result?.success).withContext('Test should succeed again').toBeTrue();
+ },
+ ];
+
+ const buildCount = await harness
+ .execute({ outputLogsOnFailure: true })
+ .pipe(
+ timeout(60000),
+ debounceTime(500),
+ concatMap(async ({ result }, index) => {
+ await expectedSequence[index](result);
+ }),
+ take(expectedSequence.length),
+ count(),
+ )
+ .toPromise();
+
+ expect(buildCount).toBe(expectedSequence.length);
+ });
});
});
diff --git a/packages/angular/build/src/builders/unit-test/builder.ts b/packages/angular/build/src/builders/unit-test/builder.ts
index 2ba2f140e8bb..84b41f1a280a 100644
--- a/packages/angular/build/src/builders/unit-test/builder.ts
+++ b/packages/angular/build/src/builders/unit-test/builder.ts
@@ -12,6 +12,7 @@ import { randomUUID } from 'node:crypto';
import { createRequire } from 'node:module';
import path from 'node:path';
import { createVirtualModulePlugin } from '../../tools/esbuild/virtual-module-plugin';
+import { assertIsError } from '../../utils/error';
import { loadEsmModule } from '../../utils/load-esm';
import { buildApplicationInternal } from '../application';
import type {
@@ -31,6 +32,7 @@ export type { UnitTestOptions };
/**
* @experimental Direct usage of this function is considered experimental.
*/
+// eslint-disable-next-line max-lines-per-function
export async function* execute(
options: UnitTestOptions,
context: BuilderContext,
@@ -84,7 +86,22 @@ export async function* execute(
const entryPoints = getTestEntrypoints(testFiles, { projectSourceRoot, workspaceRoot });
entryPoints.set('init-testbed', 'angular:test-bed-init');
- const { startVitest } = await loadEsmModule('vitest/node');
+ let vitestNodeModule;
+ try {
+ vitestNodeModule = await loadEsmModule('vitest/node');
+ } catch (error: unknown) {
+ assertIsError(error);
+ if (error.code !== 'ERR_MODULE_NOT_FOUND') {
+ throw error;
+ }
+
+ context.logger.error(
+ 'The `vitest` package was not found. Please install the package and rerun the test command.',
+ );
+
+ return;
+ }
+ const { startVitest } = vitestNodeModule;
// Setup test file build options based on application build target options
const buildTargetOptions = (await context.validateOptions(
@@ -100,10 +117,12 @@ export async function* execute(
const buildOptions: ApplicationBuilderInternalOptions = {
...buildTargetOptions,
watch: normalizedOptions.watch,
+ incrementalResults: normalizedOptions.watch,
outputPath,
index: false,
browser: undefined,
server: undefined,
+ outputMode: undefined,
localize: false,
budgets: [],
serviceWorker: false,
@@ -124,9 +143,27 @@ export async function* execute(
loadContent: async () => {
const contents: string[] = [
// Initialize the Angular testing environment
- `import { getTestBed } from '@angular/core/testing';`,
+ `import { NgModule } from '@angular/core';`,
+ `import { getTestBed, ɵgetCleanupHook as getCleanupHook } from '@angular/core/testing';`,
`import { BrowserTestingModule, platformBrowserTesting } from '@angular/platform-browser/testing';`,
- `getTestBed().initTestEnvironment(BrowserTestingModule, platformBrowserTesting(), {`,
+ '',
+ normalizedOptions.providersFile
+ ? `import providers from './${path
+ .relative(projectSourceRoot, normalizedOptions.providersFile)
+ .replace(/.[mc]?ts$/, '')
+ .replace(/\\/g, '/')}'`
+ : 'const providers = [];',
+ '',
+ // Same as https://github.com/angular/angular/blob/05a03d3f975771bb59c7eefd37c01fa127ee2229/packages/core/testing/src/test_hooks.ts#L21-L29
+ `beforeEach(getCleanupHook(false));`,
+ `afterEach(getCleanupHook(true));`,
+ '',
+ `@NgModule({`,
+ ` providers,`,
+ `})`,
+ `export class TestModule {}`,
+ '',
+ `getTestBed().initTestEnvironment([BrowserTestingModule, TestModule], platformBrowserTesting(), {`,
` errorOnUnknownElements: true,`,
` errorOnUnknownProperties: true,`,
'});',
@@ -144,73 +181,102 @@ export async function* execute(
let instance: import('vitest/node').Vitest | undefined;
// Setup vitest browser options if configured
- let browser: import('vitest/node').BrowserConfigOptions | undefined;
- if (normalizedOptions.browsers) {
- const provider = findBrowserProvider(projectSourceRoot);
- if (!provider) {
- context.logger.error(
- 'The "browsers" option requires either "playwright" or "webdriverio" to be installed within the project.' +
- ' Please install one of these packages and rerun the test command.',
- );
-
- return { success: false };
- }
+ const { browser, errors } = setupBrowserConfiguration(
+ normalizedOptions.browsers,
+ normalizedOptions.debug,
+ projectSourceRoot,
+ );
+ if (errors?.length) {
+ errors.forEach((error) => context.logger.error(error));
- browser = {
- enabled: true,
- provider,
- instances: normalizedOptions.browsers.map((browserName) => ({
- browser: browserName,
- })),
- };
+ return { success: false };
}
- for await (const result of buildApplicationInternal(buildOptions, context, extensions)) {
- if (result.kind === ResultKind.Failure) {
- continue;
- } else if (result.kind !== ResultKind.Full) {
- assert.fail('A full build result is required from the application builder.');
- }
-
- assert(result.files, 'Builder did not provide result files.');
-
- await writeTestFiles(result.files, outputPath);
-
- const setupFiles = ['init-testbed.js'];
- if (buildTargetOptions?.polyfills?.length) {
- setupFiles.push('polyfills.js');
- }
-
- instance ??= await startVitest('test', undefined /* cliFilters */, undefined /* options */, {
- test: {
- root: outputPath,
- setupFiles,
- // Use `jsdom` if no browsers are explicitly configured.
- // `node` is effectively no "environment" and the default.
- environment: browser ? 'node' : 'jsdom',
- watch: normalizedOptions.watch,
- browser,
- coverage: {
- enabled: normalizedOptions.codeCoverage,
- exclude: normalizedOptions.codeCoverageExclude,
- excludeAfterRemap: true,
+ // Add setup file entries for TestBed initialization and project polyfills
+ const setupFiles = ['init-testbed.js'];
+ if (buildTargetOptions?.polyfills?.length) {
+ setupFiles.push('polyfills.js');
+ }
+ const debugOptions = normalizedOptions.debug
+ ? {
+ inspectBrk: true,
+ isolate: false,
+ fileParallelism: false,
+ }
+ : {};
+
+ try {
+ for await (const result of buildApplicationInternal(buildOptions, context, extensions)) {
+ if (result.kind === ResultKind.Failure) {
+ continue;
+ } else if (result.kind !== ResultKind.Full && result.kind !== ResultKind.Incremental) {
+ assert.fail(
+ 'A full and/or incremental build result is required from the application builder.',
+ );
+ }
+ assert(result.files, 'Builder did not provide result files.');
+
+ await writeTestFiles(result.files, outputPath);
+
+ instance ??= await startVitest(
+ 'test',
+ undefined /* cliFilters */,
+ {
+ // Disable configuration file resolution/loading
+ config: false,
+ },
+ {
+ test: {
+ root: outputPath,
+ globals: true,
+ setupFiles,
+ // Use `jsdom` if no browsers are explicitly configured.
+ // `node` is effectively no "environment" and the default.
+ environment: browser ? 'node' : 'jsdom',
+ watch: normalizedOptions.watch,
+ browser,
+ reporters: normalizedOptions.reporters ?? ['default'],
+ coverage: {
+ enabled: normalizedOptions.codeCoverage,
+ excludeAfterRemap: true,
+ },
+ ...debugOptions,
+ },
+ plugins: [
+ {
+ name: 'angular-coverage-exclude',
+ configureVitest(context) {
+ // Adjust coverage excludes to not include the otherwise automatically inserted included unit tests.
+ // Vite does this as a convenience but is problematic for the bundling strategy employed by the
+ // builder's test setup. To workaround this, the excludes are adjusted here to only automatically
+ // exclude the TypeScript source test files.
+ context.project.config.coverage.exclude = [
+ ...(normalizedOptions.codeCoverageExclude ?? []),
+ '**/*.{test,spec}.?(c|m)ts',
+ ];
+ },
+ },
+ ],
},
- },
- });
+ );
- // Check if all the tests pass to calculate the result
- const testModules = instance.state.getTestModules();
+ // Check if all the tests pass to calculate the result
+ const testModules = instance.state.getTestModules();
- yield { success: testModules.every((testModule) => testModule.ok()) };
+ yield { success: testModules.every((testModule) => testModule.ok()) };
+ }
+ } finally {
+ if (normalizedOptions.watch) {
+ // Vitest will automatically close if not using watch mode
+ await instance?.close();
+ }
}
}
function findBrowserProvider(
- projectSourceRoot: string,
+ projectResolver: NodeJS.RequireResolve,
): import('vitest/node').BrowserBuiltinProvider | undefined {
- const projectResolver = createRequire(projectSourceRoot + '/').resolve;
-
- // These must be installed in the project to be used
+ // One of these must be installed in the project to use browser testing
const vitestBuiltinProviders = ['playwright', 'webdriverio'] as const;
for (const providerName of vitestBuiltinProviders) {
@@ -221,3 +287,58 @@ function findBrowserProvider(
} catch {}
}
}
+
+function setupBrowserConfiguration(
+ browsers: string[] | undefined,
+ debug: boolean,
+ projectSourceRoot: string,
+): { browser?: import('vitest/node').BrowserConfigOptions; errors?: string[] } {
+ if (browsers === undefined) {
+ return {};
+ }
+
+ const projectResolver = createRequire(projectSourceRoot + '/').resolve;
+ let errors: string[] | undefined;
+
+ try {
+ projectResolver('@vitest/browser');
+ } catch {
+ errors ??= [];
+ errors.push(
+ 'The "browsers" option requires the "@vitest/browser" package to be installed within the project.' +
+ ' Please install this package and rerun the test command.',
+ );
+ }
+
+ const provider = findBrowserProvider(projectResolver);
+ if (!provider) {
+ errors ??= [];
+ errors.push(
+ 'The "browsers" option requires either "playwright" or "webdriverio" to be installed within the project.' +
+ ' Please install one of these packages and rerun the test command.',
+ );
+ }
+
+ // Vitest current requires the playwright browser provider to use the inspect-brk option used by "debug"
+ if (debug && provider !== 'playwright') {
+ errors ??= [];
+ errors.push(
+ 'Debugging browser mode tests currently requires the use of "playwright".' +
+ ' Please install this package and rerun the test command.',
+ );
+ }
+
+ if (errors) {
+ return { errors };
+ }
+
+ const browser = {
+ enabled: true,
+ provider,
+ instances: browsers.map((browserName) => ({
+ browser: browserName,
+ })),
+ };
+
+ return { browser };
+}
diff --git a/packages/angular/build/src/builders/unit-test/karma-bridge.ts b/packages/angular/build/src/builders/unit-test/karma-bridge.ts
index 1080e8ade73e..6bc57de36e3e 100644
--- a/packages/angular/build/src/builders/unit-test/karma-bridge.ts
+++ b/packages/angular/build/src/builders/unit-test/karma-bridge.ts
@@ -15,6 +15,12 @@ export async function useKarmaBuilder(
context: BuilderContext,
unitTestOptions: NormalizedUnitTestOptions,
): Promise> {
+ if (unitTestOptions.debug) {
+ context.logger.warn(
+ 'The "karma" test runner does not support the "debug" option. The option will be ignored.',
+ );
+ }
+
const buildTargetOptions = (await context.validateOptions(
await context.getTargetOptions(unitTestOptions.buildTarget),
await context.getBuilderNameForTarget(unitTestOptions.buildTarget),
diff --git a/packages/angular/build/src/builders/unit-test/options.ts b/packages/angular/build/src/builders/unit-test/options.ts
index 2cd09a3b03e9..7f1413051f91 100644
--- a/packages/angular/build/src/builders/unit-test/options.ts
+++ b/packages/angular/build/src/builders/unit-test/options.ts
@@ -10,6 +10,7 @@ import { type BuilderContext, targetFromTargetString } from '@angular-devkit/arc
import path from 'node:path';
import { normalizeCacheOptions } from '../../utils/normalize-cache';
import { getProjectRootPaths } from '../../utils/project-metadata';
+import { isTTY } from '../../utils/tty';
import type { Schema as UnitTestOptions } from './schema';
export type NormalizedUnitTestOptions = Awaited>;
@@ -50,22 +51,8 @@ export async function normalizeOptions(
tsConfig,
reporters,
browsers,
- // TODO: Implement watch support
- watch: false,
+ watch: options.watch ?? isTTY(),
+ debug: options.debug ?? false,
+ providersFile: options.providersFile && path.join(workspaceRoot, options.providersFile),
};
}
-
-/**
- * Normalize a directory path string.
- * Currently only removes a trailing slash if present.
- * @param path A path string.
- * @returns A normalized path string.
- */
-function normalizeDirectoryPath(path: string): string {
- const last = path[path.length - 1];
- if (last === '/' || last === '\\') {
- return path.slice(0, -1);
- }
-
- return path;
-}
diff --git a/packages/angular/build/src/builders/unit-test/schema.json b/packages/angular/build/src/builders/unit-test/schema.json
index 223aa149bcdf..764a751a0e95 100644
--- a/packages/angular/build/src/builders/unit-test/schema.json
+++ b/packages/angular/build/src/builders/unit-test/schema.json
@@ -46,6 +46,11 @@
"type": "boolean",
"description": "Run build when files change."
},
+ "debug": {
+ "type": "boolean",
+ "description": "Initialize the test runner to support using the Node Inspector for test debugging.",
+ "default": false
+ },
"codeCoverage": {
"type": "boolean",
"description": "Output a code coverage report.",
@@ -65,6 +70,11 @@
"items": {
"type": "string"
}
+ },
+ "providersFile": {
+ "type": "string",
+ "description": "TypeScript file that exports an array of Angular providers to use during test execution. The array must be a default export.",
+ "minLength": 1
}
},
"additionalProperties": false,
diff --git a/packages/angular/build/src/tools/angular/compilation/aot-compilation.ts b/packages/angular/build/src/tools/angular/compilation/aot-compilation.ts
index adb8988e875b..a340d602577e 100644
--- a/packages/angular/build/src/tools/angular/compilation/aot-compilation.ts
+++ b/packages/angular/build/src/tools/angular/compilation/aot-compilation.ts
@@ -161,10 +161,7 @@ export class AotCompilation extends AngularCompilation {
);
const updateText = angularCompiler.emitHmrUpdateModule(node);
// If compiler cannot generate an update for the component, prevent template updates.
- // Also prevent template updates if $localize is directly present which also currently
- // prevents a template update at runtime.
- // TODO: Support localized template update modules and remove this check.
- if (updateText === null || updateText.includes('$localize')) {
+ if (updateText === null) {
// Build is needed if a template cannot be updated
templateUpdates = undefined;
break;
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 72131901ae94..f56e6c6c3119 100644
--- a/packages/angular/build/src/tools/esbuild/angular/compiler-plugin.ts
+++ b/packages/angular/build/src/tools/esbuild/angular/compiler-plugin.ts
@@ -35,6 +35,13 @@ export interface CompilerPluginOptions {
sourcemap: boolean | 'external';
tsconfig: string;
jit?: boolean;
+
+ /**
+ * Include class metadata and JIT information in built code.
+ * The Angular TestBed APIs require additional metadata for the Angular aspects of the application
+ * such as Components, Modules, Pipes, etc.
+ * TestBed may also leverage JIT capabilities during testing (e.g., overrideComponent).
+ */
includeTestMetadata?: boolean;
advancedOptimizations?: boolean;
@@ -89,7 +96,7 @@ export function createCompilerPlugin(
sourcemap: !!pluginOptions.sourcemap,
thirdPartySourcemaps: pluginOptions.thirdPartySourcemaps,
advancedOptimizations: pluginOptions.advancedOptimizations,
- jit: pluginOptions.jit,
+ jit: pluginOptions.jit || pluginOptions.includeTestMetadata,
},
maxWorkers,
cacheStore?.createCache('jstransformer'),
@@ -718,6 +725,7 @@ function createCompilerOptionsTransformer(
externalRuntimeStyles: pluginOptions.externalRuntimeStyles,
_enableHmr: !!pluginOptions.templateUpdates,
supportTestBed: !!pluginOptions.includeTestMetadata,
+ supportJitMode: !!pluginOptions.includeTestMetadata,
};
};
}
diff --git a/packages/angular/build/src/tools/esbuild/bundler-context.ts b/packages/angular/build/src/tools/esbuild/bundler-context.ts
index a551ae4defba..864ca2c6fdd9 100644
--- a/packages/angular/build/src/tools/esbuild/bundler-context.ts
+++ b/packages/angular/build/src/tools/esbuild/bundler-context.ts
@@ -18,6 +18,7 @@ import {
context,
} from 'esbuild';
import assert from 'node:assert';
+import { builtinModules } from 'node:module';
import { basename, extname, join, relative } from 'node:path';
import { LoadResultCache, MemoryLoadResultCache } from './load-result-cache';
import { SERVER_GENERATED_EXTERNALS, convertOutputFile } from './utils';
@@ -260,10 +261,12 @@ export class BundlerContext {
if (this.incremental) {
// Add input files except virtual angular files which do not exist on disk
for (const input of Object.keys(result.metafile.inputs)) {
- if (!isInternalAngularFile(input)) {
- // input file paths are always relative to the workspace root
- this.watchFiles.add(join(this.workspaceRoot, input));
+ if (isInternalAngularFile(input) || isInternalBundlerFile(input)) {
+ continue;
}
+
+ // Input file paths are always relative to the workspace root
+ this.watchFiles.add(join(this.workspaceRoot, input));
}
}
@@ -363,6 +366,7 @@ export class BundlerContext {
if (
!external ||
SERVER_GENERATED_EXTERNALS.has(path) ||
+ isInternalAngularFile(path) ||
(kind !== 'import-statement' && kind !== 'dynamic-import' && kind !== 'require-call')
) {
continue;
@@ -478,3 +482,20 @@ export class BundlerContext {
function isInternalAngularFile(file: string) {
return file.startsWith('angular:');
}
+
+function isInternalBundlerFile(file: string) {
+ // Bundler virtual files such as "" or ""
+ if (file[0] === '<' && file.at(-1) === '>') {
+ return true;
+ }
+
+ const DISABLED_BUILTIN = '(disabled):';
+
+ // Disabled node builtins such as "/some/path/(disabled):fs"
+ const disabledIndex = file.indexOf(DISABLED_BUILTIN);
+ if (disabledIndex >= 0) {
+ return builtinModules.includes(file.slice(disabledIndex + DISABLED_BUILTIN.length));
+ }
+
+ return false;
+}
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 a453b335032d..9caa2ca5da45 100644
--- a/packages/angular/build/src/tools/esbuild/i18n-inliner-worker.ts
+++ b/packages/angular/build/src/tools/esbuild/i18n-inliner-worker.ts
@@ -16,7 +16,7 @@ import { loadEsmModule } from '../../utils/load-esm';
/**
* The options passed to the inliner for each file request
*/
-interface InlineRequest {
+interface InlineFileRequest {
/**
* The filename that should be processed. The data for the file is provided to the Worker
* during Worker initialization.
@@ -34,6 +34,31 @@ interface InlineRequest {
translation?: Record;
}
+/**
+ * The options passed to the inliner for each code request
+ */
+interface InlineCodeRequest {
+ /**
+ * The code that should be processed.
+ */
+ code: string;
+
+ /**
+ * The filename to use in error and warning messages for the provided code.
+ */
+ filename: string;
+
+ /**
+ * The locale specifier that should be used during the inlining process of the file.
+ */
+ locale: string;
+
+ /**
+ * The translation messages for the locale that should be used during the inlining process of the file.
+ */
+ translation?: Record;
+}
+
// Extract the application files and common options used for inline requests from the Worker context
// TODO: Evaluate overall performance difference of passing translations here as well
const { files, missingTranslation, shouldOptimize } = (workerData || {}) as {
@@ -47,9 +72,9 @@ const { files, missingTranslation, shouldOptimize } = (workerData || {}) as {
* This function is the main entry for the Worker's action that is called by the worker pool.
*
* @param request An InlineRequest object representing the options for inlining
- * @returns An array containing the inlined file and optional map content.
+ * @returns An object containing the inlined file and optional map content.
*/
-export default async function inlineLocale(request: InlineRequest) {
+export default async function inlineFile(request: InlineFileRequest) {
const data = files.get(request.filename);
assert(data !== undefined, `Invalid inline request for file '${request.filename}'.`);
@@ -70,6 +95,22 @@ export default async function inlineLocale(request: InlineRequest) {
};
}
+/**
+ * Inlines the provided locale and translation into JavaScript code that contains `$localize` usage.
+ * This function is a secondary entry primarily for use with component HMR update modules.
+ *
+ * @param request An InlineRequest object representing the options for inlining
+ * @returns An object containing the inlined code.
+ */
+export async function inlineCode(request: InlineCodeRequest) {
+ const result = await transformWithBabel(request.code, undefined, request);
+
+ return {
+ output: result.code,
+ messages: result.diagnostics.messages,
+ };
+}
+
/**
* A Type representing the localize tools module.
*/
@@ -138,7 +179,7 @@ async function createI18nPlugins(locale: string, translation: Record | undefined,
+ templateCode: string,
+ templateId: string,
+ ): Promise<{ code: string; errors: string[]; warnings: string[] }> {
+ const hasLocalize = templateCode.includes(LOCALIZE_KEYWORD);
+
+ if (!hasLocalize) {
+ return {
+ code: templateCode,
+ errors: [],
+ warnings: [],
+ };
+ }
+
+ const { output, messages } = await this.#workerPool.run(
+ { code: templateCode, filename: templateId, locale, translation },
+ { name: 'inlineCode' },
+ );
+
+ const errors: string[] = [];
+ const warnings: string[] = [];
+ for (const message of messages) {
+ if (message.type === 'error') {
+ errors.push(message.message);
+ } else {
+ warnings.push(message.message);
+ }
+ }
+
+ return {
+ code: output,
+ errors,
+ warnings,
+ };
+ }
+
/**
* Stops all active transformation tasks and shuts down all workers.
* @returns A void promise that resolves when closing is complete.
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 3d7c8d2ca126..8fa551b38ba2 100644
--- a/packages/angular/build/src/tools/esbuild/javascript-transformer-worker.ts
+++ b/packages/angular/build/src/tools/esbuild/javascript-transformer-worker.ts
@@ -27,6 +27,14 @@ interface JavaScriptTransformRequest {
const textDecoder = new TextDecoder();
const textEncoder = new TextEncoder();
+/**
+ * The function name prefix for all Angular partial compilation functions.
+ * Used to determine if linking of a JavaScript file is required.
+ * If any additional declarations are added or otherwise changed in the linker,
+ * the names MUST begin with this prefix.
+ */
+const LINKER_DECLARATION_PREFIX = 'ɵɵngDeclare';
+
export default async function transformJavaScript(
request: JavaScriptTransformRequest,
): Promise {
@@ -46,11 +54,6 @@ let linkerPluginCreator:
| typeof import('@angular/compiler-cli/linker/babel').createEs2015LinkerPlugin
| undefined;
-/**
- * Cached instance of the compiler-cli linker's needsLinking function.
- */
-let needsLinking: typeof import('@angular/compiler-cli/linker').needsLinking | undefined;
-
async function transformWithBabel(
filename: string,
data: string,
@@ -125,17 +128,10 @@ async function requiresLinking(path: string, source: string): Promise {
return false;
}
- if (!needsLinking) {
- // Load ESM `@angular/compiler-cli/linker` using the TypeScript dynamic import workaround.
- // Once TypeScript provides support for keeping the dynamic import this workaround can be
- // changed to a direct dynamic import.
- const linkerModule = await loadEsmModule(
- '@angular/compiler-cli/linker',
- );
- needsLinking = linkerModule.needsLinking;
- }
-
- return needsLinking(path, source);
+ // Check if the source code includes one of the declaration functions.
+ // There is a low chance of a false positive but the names are fairly unique
+ // and the result would be an unnecessary no-op additional plugin pass.
+ return source.includes(LINKER_DECLARATION_PREFIX);
}
async function createLinkerPlugin(options: Omit) {
diff --git a/packages/angular/build/src/tools/esbuild/javascript-transformer.ts b/packages/angular/build/src/tools/esbuild/javascript-transformer.ts
index 8e2d8e31ab8f..b728a0f599e2 100644
--- a/packages/angular/build/src/tools/esbuild/javascript-transformer.ts
+++ b/packages/angular/build/src/tools/esbuild/javascript-transformer.ts
@@ -56,6 +56,10 @@ export class JavaScriptTransformer {
}
#ensureWorkerPool(): WorkerPool {
+ if (this.#workerPool) {
+ return this.#workerPool;
+ }
+
const workerPoolOptions: WorkerPoolOptions = {
filename: require.resolve('./javascript-transformer-worker'),
maxThreads: this.maxThreads,
@@ -67,7 +71,7 @@ export class JavaScriptTransformer {
workerPoolOptions.execArgv = filteredExecArgv;
}
- this.#workerPool ??= new WorkerPool(workerPoolOptions);
+ this.#workerPool = new WorkerPool(workerPoolOptions);
return this.#workerPool;
}
diff --git a/packages/angular/build/src/utils/i18n-options.ts b/packages/angular/build/src/utils/i18n-options.ts
index 53e5aca4d540..822683bef03d 100644
--- a/packages/angular/build/src/utils/i18n-options.ts
+++ b/packages/angular/build/src/utils/i18n-options.ts
@@ -6,7 +6,6 @@
* found in the LICENSE file at https://angular.dev/license
*/
-import { DiagnosticHandlingStrategy } from '@angular/localize/tools';
import path from 'node:path';
import type { TranslationLoader } from './load-translations';
@@ -29,7 +28,6 @@ export interface I18nOptions {
flatOutput?: boolean;
readonly shouldInline: boolean;
hasDefinedSourceLocale?: boolean;
- i18nDuplicateTranslation?: DiagnosticHandlingStrategy;
}
function normalizeTranslationFileOption(
diff --git a/packages/angular/build/src/utils/load-proxy-config.ts b/packages/angular/build/src/utils/load-proxy-config.ts
index b0882187d0c2..e590ee9efc6c 100644
--- a/packages/angular/build/src/utils/load-proxy-config.ts
+++ b/packages/angular/build/src/utils/load-proxy-config.ts
@@ -53,8 +53,7 @@ export async function loadProxyConfiguration(
// Load the ESM configuration file using the TypeScript dynamic import workaround.
// Once TypeScript provides support for keeping the dynamic import this workaround can be
// changed to a direct dynamic import.
- proxyConfiguration = (await loadEsmModule<{ default: unknown }>(pathToFileURL(proxyPath)))
- .default;
+ proxyConfiguration = await loadEsmModule<{ default: unknown }>(pathToFileURL(proxyPath));
break;
case '.cjs':
proxyConfiguration = require(proxyPath);
@@ -67,12 +66,11 @@ export async function loadProxyConfiguration(
break;
} catch (e) {
assertIsError(e);
- if (e.code === 'ERR_REQUIRE_ESM') {
+ if (e.code === 'ERR_REQUIRE_ESM' || e.code === 'ERR_REQUIRE_ASYNC_MODULE') {
// Load the ESM configuration file using the TypeScript dynamic import workaround.
// Once TypeScript provides support for keeping the dynamic import this workaround can be
// changed to a direct dynamic import.
- proxyConfiguration = (await loadEsmModule<{ default: unknown }>(pathToFileURL(proxyPath)))
- .default;
+ proxyConfiguration = await loadEsmModule<{ default: unknown }>(pathToFileURL(proxyPath));
break;
}
@@ -80,6 +78,10 @@ export async function loadProxyConfiguration(
}
}
+ if ('default' in proxyConfiguration) {
+ proxyConfiguration = proxyConfiguration.default;
+ }
+
return normalizeProxyConfiguration(proxyConfiguration);
}
diff --git a/packages/angular/build/src/utils/server-rendering/manifest.ts b/packages/angular/build/src/utils/server-rendering/manifest.ts
index 4d1459e221c2..2dfad0ff2dfb 100644
--- a/packages/angular/build/src/utils/server-rendering/manifest.ts
+++ b/packages/angular/build/src/utils/server-rendering/manifest.ts
@@ -201,34 +201,22 @@ function generateLazyLoadedFilesMappings(
metafile: Metafile,
initialFiles: Set,
publicPath = '',
-): Record {
- const entryPointToBundles: Record = {};
+): Record {
+ const entryPointToBundles: Record = {};
for (const [fileName, { entryPoint, exports, imports }] of Object.entries(metafile.outputs)) {
// Skip files that don't have an entryPoint, no exports, or are not .js
if (!entryPoint || exports?.length < 1 || !fileName.endsWith('.js')) {
continue;
}
- const importedPaths: FilesMapping[] = [
- {
- path: `${publicPath}${fileName}`,
- dynamicImport: false,
- },
- ];
+ const importedPaths: string[] = [`${publicPath}${fileName}`];
for (const { kind, external, path } of imports) {
- if (
- external ||
- initialFiles.has(path) ||
- (kind !== 'dynamic-import' && kind !== 'import-statement')
- ) {
+ if (external || initialFiles.has(path) || kind !== 'import-statement') {
continue;
}
- importedPaths.push({
- path: `${publicPath}${path}`,
- dynamicImport: kind === 'dynamic-import',
- });
+ importedPaths.push(`${publicPath}${path}`);
}
entryPointToBundles[entryPoint] = importedPaths;
diff --git a/packages/angular/build/src/utils/worker-pool.ts b/packages/angular/build/src/utils/worker-pool.ts
index ca35f7edb46b..78db4302ef1a 100644
--- a/packages/angular/build/src/utils/worker-pool.ts
+++ b/packages/angular/build/src/utils/worker-pool.ts
@@ -15,10 +15,10 @@ export class WorkerPool extends Piscina {
constructor(options: WorkerPoolOptions) {
const piscinaOptions: WorkerPoolOptions = {
minThreads: 1,
- idleTimeout: 1000,
+ idleTimeout: 4_000,
// Web containers do not support transferable objects with receiveOnMessagePort which
// is used when the Atomics based wait loop is enable.
- useAtomics: !process.versions.webcontainer,
+ atomics: process.versions.webcontainer ? 'disabled' : 'sync',
recordTiming: false,
...options,
};
diff --git a/packages/angular/cli/BUILD.bazel b/packages/angular/cli/BUILD.bazel
index efa8d5f601f0..e06af1316a27 100644
--- a/packages/angular/cli/BUILD.bazel
+++ b/packages/angular/cli/BUILD.bazel
@@ -117,7 +117,7 @@ ts_project(
)
jasmine_test(
- name = "angular-cli_test",
+ name = "test",
data = [":angular-cli_test_lib"],
)
diff --git a/packages/angular/cli/bin/bootstrap.js b/packages/angular/cli/bin/bootstrap.js
index 1282f906aef2..18d1ed73160c 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. The cache does not work
-// well with Bazel's hermeticity requirements.
-if (!process.env['RUNFILES']) {
+// Skip if running inside Bazel via a 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']) {
try {
const { enableCompileCache } = require('node:module');
diff --git a/packages/angular/cli/bin/ng.js b/packages/angular/cli/bin/ng.js
index 392578c684cb..e0f5eb36a2ef 100755
--- a/packages/angular/cli/bin/ng.js
+++ b/packages/angular/cli/bin/ng.js
@@ -31,7 +31,6 @@ try {
}
const rawCommandName = process.argv[2];
-
if (rawCommandName === '--get-yargs-completions' || rawCommandName === 'completion') {
// Skip Node.js supported checks when running ng completion.
// A warning at this stage could cause a broken source action (`source <(ng completion script)`) when in the shell init script.
@@ -43,8 +42,9 @@ 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.
-var version = process.versions.node.split('.').map((part) => Number(part));
-if (version[0] % 2 === 1) {
+const [major, minor] = process.versions.node.split('.', 2).map((part) => Number(part));
+
+if (major % 2 === 1) {
// Allow new odd numbered releases with a warning (currently v17+)
console.warn(
'Node.js version ' +
@@ -55,13 +55,13 @@ if (version[0] % 2 === 1) {
);
require('./bootstrap');
-} else if (version[0] < 20 || (version[0] === 20 && version[1] < 11)) {
- // Error and exit if less than 20.11
+} else if (major < 20 || (major === 20 && minor < 19) || (major === 22 && minor < 12)) {
+ // Error and exit if less than 20.19 or 22.12
console.error(
'Node.js version ' +
process.version +
' detected.\n' +
- 'The Angular CLI requires a minimum Node.js version of v20.11.\n\n' +
+ 'The Angular CLI requires a minimum Node.js version of v20.19 or v22.12.\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 a2566853dfc7..ac7591e43630 100644
--- a/packages/angular/cli/lib/cli/index.ts
+++ b/packages/angular/cli/lib/cli/index.ts
@@ -16,7 +16,7 @@ import { writeErrorToLogFile } from '../../src/utilities/log-file';
export { VERSION } from '../../src/utilities/version';
-const MIN_NODEJS_VERSION = [20, 11] as const;
+const MIN_NODEJS_VERSION = [20, 19] as const;
/* eslint-disable no-console */
export default async function (options: { cliArgs: string[] }) {
diff --git a/packages/angular/cli/package.json b/packages/angular/cli/package.json
index 5493ad2531ab..93ba24f0306e 100644
--- a/packages/angular/cli/package.json
+++ b/packages/angular/cli/package.json
@@ -25,18 +25,18 @@
"@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.5.0",
- "@listr2/prompt-adapter-inquirer": "2.0.21",
+ "@inquirer/prompts": "7.5.1",
+ "@listr2/prompt-adapter-inquirer": "2.0.22",
"@schematics/angular": "workspace:0.0.0-PLACEHOLDER",
"@yarnpkg/lockfile": "1.1.0",
"ini": "5.0.0",
"jsonc-parser": "3.3.1",
- "listr2": "8.3.2",
+ "listr2": "8.3.3",
"npm-package-arg": "12.0.2",
"npm-pick-manifest": "10.0.0",
- "pacote": "20.0.0",
+ "pacote": "21.0.0",
"resolve": "1.22.10",
- "semver": "7.7.1",
+ "semver": "7.7.2",
"yargs": "17.7.2"
},
"ng-update": {
diff --git a/packages/angular/cli/src/command-builder/command-module.ts b/packages/angular/cli/src/command-builder/command-module.ts
index a97815eec027..91fc088b5714 100644
--- a/packages/angular/cli/src/command-builder/command-module.ts
+++ b/packages/angular/cli/src/command-builder/command-module.ts
@@ -9,12 +9,14 @@
import { logging, schema } from '@angular-devkit/core';
import { readFileSync } from 'node:fs';
import * as path from 'node:path';
-import yargs, {
+import yargs from 'yargs';
+import type {
ArgumentsCamelCase,
Argv,
CamelCaseKey,
CommandModule as YargsCommandModule,
-} from 'yargs';
+ // Resolution mode is required due to CamelCaseKey missing from esm types
+} from 'yargs' with { 'resolution-mode': 'require' };
import { Parser as yargsParser } from 'yargs/helpers';
import { getAnalyticsUserId } from '../analytics/analytics';
import { AnalyticsCollector } from '../analytics/analytics-collector';
diff --git a/packages/angular/cli/src/command-builder/command-runner.ts b/packages/angular/cli/src/command-builder/command-runner.ts
index 2ad2c07b1eeb..45d6ec50ae5a 100644
--- a/packages/angular/cli/src/command-builder/command-runner.ts
+++ b/packages/angular/cli/src/command-builder/command-runner.ts
@@ -138,7 +138,7 @@ export async function runCommand(args: string[], logger: logging.Logger): Promis
: // Unknown exception, re-throw.
err;
})
- .wrap(yargs.terminalWidth())
+ .wrap(localYargs.terminalWidth())
.parseAsync();
return +(process.exitCode ?? 0);
diff --git a/packages/angular/cli/src/command-builder/utilities/json-schema.ts b/packages/angular/cli/src/command-builder/utilities/json-schema.ts
index a46b06646197..84af5f2d3641 100644
--- a/packages/angular/cli/src/command-builder/utilities/json-schema.ts
+++ b/packages/angular/cli/src/command-builder/utilities/json-schema.ts
@@ -7,12 +7,12 @@
*/
import { json, strings } from '@angular-devkit/core';
-import yargs, { Arguments, Argv, PositionalOptions, Options as YargsOptions } from 'yargs';
+import type { Arguments, Argv, PositionalOptions, Options as YargsOptions } from 'yargs';
/**
* An option description.
*/
-export interface Option extends yargs.Options {
+export interface Option extends YargsOptions {
/**
* The name of the option.
*/
diff --git a/packages/angular/cli/src/commands/version/cli.ts b/packages/angular/cli/src/commands/version/cli.ts
index 4fe53b6596ba..80f3f87d2e92 100644
--- a/packages/angular/cli/src/commands/version/cli.ts
+++ b/packages/angular/cli/src/commands/version/cli.ts
@@ -23,7 +23,7 @@ interface PartialPackageInfo {
/**
* Major versions of Node.js that are officially supported by Angular.
*/
-const SUPPORTED_NODE_MAJORS = [20, 22];
+const SUPPORTED_NODE_MAJORS = [20, 22, 24];
const PACKAGE_PATTERNS = [
/^@angular\/.*/,
diff --git a/packages/angular/cli/src/typings.ts b/packages/angular/cli/src/typings.d.ts
similarity index 100%
rename from packages/angular/cli/src/typings.ts
rename to packages/angular/cli/src/typings.d.ts
diff --git a/packages/angular/pwa/BUILD.bazel b/packages/angular/pwa/BUILD.bazel
index 4fc36b05adc6..6072cdd88d51 100644
--- a/packages/angular/pwa/BUILD.bazel
+++ b/packages/angular/pwa/BUILD.bazel
@@ -58,7 +58,7 @@ ts_project(
)
jasmine_test(
- name = "pwa_test",
+ name = "test",
data = [":pwa_test_lib"],
)
diff --git a/packages/angular/pwa/README.md b/packages/angular/pwa/README.md
index c7ecbdaa99af..26eeb00620a9 100644
--- a/packages/angular/pwa/README.md
+++ b/packages/angular/pwa/README.md
@@ -13,9 +13,7 @@ Executing the command mentioned above will perform the following actions:
1. Adds [`@angular/service-worker`](https://npmjs.com/@angular/service-worker) as a dependency to your project.
1. Enables service worker builds in the Angular CLI.
1. Imports and registers the service worker in the application module.
-1. Updates the `index.html` file:
- - Includes a link to add the [manifest.webmanifest](https://developer.mozilla.org/en-US/docs/Web/Manifest) file.
- - Adds a meta tag for `theme-color`.
+1. Updates the `index.html` file to inlclude a link to add the [manifest.webmanifest](https://developer.mozilla.org/en-US/docs/Web/Manifest) file.
1. Installs icon files to support the installed Progressive Web App (PWA).
1. Creates the service worker configuration file called `ngsw-config.json`, specifying caching behaviors and other settings.
diff --git a/packages/angular/pwa/pwa/files/assets/manifest.webmanifest b/packages/angular/pwa/pwa/files/assets/manifest.webmanifest
index f8c1e3960511..efa364291a63 100644
--- a/packages/angular/pwa/pwa/files/assets/manifest.webmanifest
+++ b/packages/angular/pwa/pwa/files/assets/manifest.webmanifest
@@ -1,8 +1,6 @@
{
"name": "<%= title %>",
"short_name": "<%= title %>",
- "theme_color": "#1976d2",
- "background_color": "#fafafa",
"display": "standalone",
"scope": "./",
"start_url": "./",
diff --git a/packages/angular/pwa/pwa/index.ts b/packages/angular/pwa/pwa/index.ts
index 28b0bc864522..c316ed581695 100644
--- a/packages/angular/pwa/pwa/index.ts
+++ b/packages/angular/pwa/pwa/index.ts
@@ -45,7 +45,6 @@ function updateIndexFile(path: string): Rule {
rewriter.on('endTag', (endTag) => {
if (endTag.tagName === 'head') {
rewriter.emitRaw(' \n');
- rewriter.emitRaw(' \n');
} else if (endTag.tagName === 'body' && needsNoScript) {
rewriter.emitRaw(
' \n',
@@ -110,9 +109,12 @@ export default function (options: PwaOptions): Rule {
// Find all index.html files in build targets
const indexFiles = new Set();
+ let checkForDefaultIndex = false;
for (const target of buildTargets) {
if (typeof target.options?.index === 'string') {
indexFiles.add(target.options.index);
+ } else if (target.options?.index === undefined) {
+ checkForDefaultIndex = true;
}
if (!target.configurations) {
@@ -122,6 +124,8 @@ export default function (options: PwaOptions): Rule {
for (const options of Object.values(target.configurations)) {
if (typeof options?.index === 'string') {
indexFiles.add(options.index);
+ } else if (options?.index === undefined) {
+ checkForDefaultIndex = true;
}
}
}
@@ -129,6 +133,14 @@ export default function (options: PwaOptions): Rule {
// Setup sources for the assets files to add to the project
const sourcePath = project.sourceRoot ?? posix.join(project.root, 'src');
+ // Check for a default index file if a configuration path allows for a default usage
+ if (checkForDefaultIndex) {
+ const defaultIndexFile = posix.join(sourcePath, 'index.html');
+ if (host.exists(defaultIndexFile)) {
+ indexFiles.add(defaultIndexFile);
+ }
+ }
+
// Setup service worker schematic options
const { title, ...swOptions } = options;
diff --git a/packages/angular/pwa/pwa/index_spec.ts b/packages/angular/pwa/pwa/index_spec.ts
index 37677894b446..42d698ce8f8f 100644
--- a/packages/angular/pwa/pwa/index_spec.ts
+++ b/packages/angular/pwa/pwa/index_spec.ts
@@ -112,7 +112,6 @@ describe('PWA Schematic', () => {
const content = tree.readContent('projects/bar/src/index.html');
expect(content).toMatch(//);
- expect(content).toMatch(//);
expect(content).toMatch(
/