From 02cb7fc6ee843f6007a664cc6765e96711507441 Mon Sep 17 00:00:00 2001
From: Jan Martin <jan.krems@gmail.com>
Date: Wed, 30 Apr 2025 13:01:35 -0700
Subject: [PATCH 001/138] release: cut the v20.0.0-next.9 release

---
 CHANGELOG.md | 28 ++++++++++++++++++++++++++++
 package.json |  2 +-
 2 files changed, 29 insertions(+), 1 deletion(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index d24b8782fac5..d242ff94b916 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,31 @@
+<a name="20.0.0-next.9"></a>
+
+# 20.0.0-next.9 (2025-04-30)
+
+### @schematics/angular
+
+| Commit                                                                                              | Type | Description                                              |
+| --------------------------------------------------------------------------------------------------- | ---- | -------------------------------------------------------- |
+| [5876577af](https://github.com/angular/angular-cli/commit/5876577af163b534846e720b0184558197dce741) | feat | Add prompt for new apps to be zoneless                   |
+| [c557a19ef](https://github.com/angular/angular-cli/commit/c557a19ef4eed9f2d805bb235d3819c69a1aaef6) | fix  | avoid empty polyfill option for new zoneless application |
+| [148498c2b](https://github.com/angular/angular-cli/commit/148498c2bcd0feb495dc0aa14b6a4555ac01facb) | fix  | Remove experimental from zoneless                        |
+| [0f7dc2cd8](https://github.com/angular/angular-cli/commit/0f7dc2cd8f76f928e64e734563a433ff6a0d478c) | fix  | skip spec project reference for minimal ng new           |
+
+### @angular/build
+
+| Commit                                                                                              | Type | Description                                                                |
+| --------------------------------------------------------------------------------------------------- | ---- | -------------------------------------------------------------------------- |
+| [d6ea6b09f](https://github.com/angular/angular-cli/commit/d6ea6b09f182433f859a78d4a4d38a9db521e593) | feat | add experimental vitest browser support to unit-testing                    |
+| [05485ede7](https://github.com/angular/angular-cli/commit/05485ede7b472f98120c51f28bd485eeb635bac2) | fix  | ensure `com.chrome.devtools.json` is consistently served after initial run |
+
+### @angular/ssr
+
+| Commit                                                                                              | Type | Description                              |
+| --------------------------------------------------------------------------------------------------- | ---- | ---------------------------------------- |
+| [2d11e8e45](https://github.com/angular/angular-cli/commit/2d11e8e45b29cf879ee72ffbcf438198d73ffaba) | fix  | return 302 when redirectTo is a function |
+
+<!-- CHANGELOG SPLIT MARKER -->
+
 <a name="19.2.10"></a>
 
 # 19.2.10 (2025-04-30)
diff --git a/package.json b/package.json
index 1475df4bda0f..3add85fadf87 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@angular/devkit-repo",
-  "version": "20.0.0-next.8",
+  "version": "20.0.0-next.9",
   "private": true,
   "description": "Software Development Kit for Angular",
   "keywords": [

From 8c5e5e6a146591ac0527d30f7885579b243feae9 Mon Sep 17 00:00:00 2001
From: Charles Lyding <19598772+clydin@users.noreply.github.com>
Date: Wed, 30 Apr 2025 11:45:32 -0400
Subject: [PATCH 002/138] refactor(@angular-devkit/schematics): add explicit
 return types to functions

To support the eventual use of the TypeScript `isolatedDeclarations`
option, explicit return types have been added to functions throughout
the `@angular-devkit/schematics` package code.

(cherry picked from commit 2027d1b3dbd69e1744c4a0066a66cd3763a01176)
---
 .../schematics/src/engine/engine.ts           |  8 +++----
 .../schematics/src/engine/schematic.ts        |  4 ++--
 .../schematics/src/sink/host.ts               |  2 +-
 .../schematics/src/tree/action.ts             | 22 +++++++++----------
 .../schematics/src/tree/entry.ts              |  8 +++----
 .../schematics/src/tree/host-tree.ts          | 10 ++++-----
 .../schematics/src/tree/null.ts               |  8 +++----
 .../schematics/src/tree/recorder.ts           |  4 ++--
 .../schematics/src/tree/scoped.ts             |  2 +-
 .../schematics/src/tree/static.ts             | 10 ++++++---
 10 files changed, 41 insertions(+), 37 deletions(-)

diff --git a/packages/angular_devkit/schematics/src/engine/engine.ts b/packages/angular_devkit/schematics/src/engine/engine.ts
index 033ecc5a383d..8d0ba84ed8ca 100644
--- a/packages/angular_devkit/schematics/src/engine/engine.ts
+++ b/packages/angular_devkit/schematics/src/engine/engine.ts
@@ -90,10 +90,10 @@ export class CollectionImpl<CollectionT extends object, SchematicT extends objec
     public readonly baseDescriptions?: Array<CollectionDescription<CollectionT>>,
   ) {}
 
-  get description() {
+  get description(): CollectionDescription<CollectionT> {
     return this._description;
   }
-  get name() {
+  get name(): string {
     return this.description.name || '<unknown>';
   }
 
@@ -183,10 +183,10 @@ export class SchematicEngine<CollectionT extends object, SchematicT extends obje
     protected _workflow?: Workflow,
   ) {}
 
-  get workflow() {
+  get workflow(): Workflow | null {
     return this._workflow || null;
   }
-  get defaultMergeStrategy() {
+  get defaultMergeStrategy(): MergeStrategy {
     return this._host.defaultMergeStrategy || MergeStrategy.Default;
   }
 
diff --git a/packages/angular_devkit/schematics/src/engine/schematic.ts b/packages/angular_devkit/schematics/src/engine/schematic.ts
index 9754a96af53b..bf99bbf63493 100644
--- a/packages/angular_devkit/schematics/src/engine/schematic.ts
+++ b/packages/angular_devkit/schematics/src/engine/schematic.ts
@@ -41,10 +41,10 @@ export class SchematicImpl<CollectionT extends object, SchematicT extends object
     }
   }
 
-  get description() {
+  get description(): SchematicDescription<CollectionT, SchematicT> {
     return this._description;
   }
-  get collection() {
+  get collection(): Collection<CollectionT, SchematicT> {
     return this._collection;
   }
 
diff --git a/packages/angular_devkit/schematics/src/sink/host.ts b/packages/angular_devkit/schematics/src/sink/host.ts
index 489addec1083..a2e3a4b34a14 100644
--- a/packages/angular_devkit/schematics/src/sink/host.ts
+++ b/packages/angular_devkit/schematics/src/sink/host.ts
@@ -86,7 +86,7 @@ export class HostSink extends SimpleSinkBase {
     return EMPTY;
   }
 
-  _done() {
+  _done(): Observable<void> {
     // Really commit everything to the actual filesystem.
     return concatObservables(
       observableFrom([...this._filesToDelete.values()]).pipe(
diff --git a/packages/angular_devkit/schematics/src/tree/action.ts b/packages/angular_devkit/schematics/src/tree/action.ts
index 495d1db2e510..2f5f5e38e900 100644
--- a/packages/angular_devkit/schematics/src/tree/action.ts
+++ b/packages/angular_devkit/schematics/src/tree/action.ts
@@ -27,7 +27,7 @@ let _id = 1;
 export class ActionList implements Iterable<Action> {
   private _actions: Action[] = [];
 
-  protected _action(action: Partial<Action>) {
+  protected _action(action: Partial<Action>): void {
     this._actions.push({
       ...(action as Action),
       id: _id++,
@@ -35,20 +35,20 @@ export class ActionList implements Iterable<Action> {
     });
   }
 
-  create(path: Path, content: Buffer) {
+  create(path: Path, content: Buffer): void {
     this._action({ kind: 'c', path, content });
   }
-  overwrite(path: Path, content: Buffer) {
+  overwrite(path: Path, content: Buffer): void {
     this._action({ kind: 'o', path, content });
   }
-  rename(path: Path, to: Path) {
+  rename(path: Path, to: Path): void {
     this._action({ kind: 'r', path, to });
   }
-  delete(path: Path) {
+  delete(path: Path): void {
     this._action({ kind: 'd', path });
   }
 
-  optimize() {
+  optimize(): void {
     const toCreate = new Map<Path, Buffer>();
     const toRename = new Map<Path, Path>();
     const toOverwrite = new Map<Path, Buffer>();
@@ -122,13 +122,13 @@ export class ActionList implements Iterable<Action> {
     });
   }
 
-  push(action: Action) {
+  push(action: Action): void {
     this._actions.push(action);
   }
-  get(i: number) {
+  get(i: number): Action {
     return this._actions[i];
   }
-  has(action: Action) {
+  has(action: Action): boolean {
     for (let i = 0; i < this._actions.length; i++) {
       const a = this._actions[i];
       if (a.id == action.id) {
@@ -144,10 +144,10 @@ export class ActionList implements Iterable<Action> {
   find(predicate: (value: Action) => boolean): Action | null {
     return this._actions.find(predicate) || null;
   }
-  forEach(fn: (value: Action, index: number, array: Action[]) => void, thisArg?: {}) {
+  forEach(fn: (value: Action, index: number, array: Action[]) => void, thisArg?: {}): void {
     this._actions.forEach(fn, thisArg);
   }
-  get length() {
+  get length(): number {
     return this._actions.length;
   }
   [Symbol.iterator](): IterableIterator<Action> {
diff --git a/packages/angular_devkit/schematics/src/tree/entry.ts b/packages/angular_devkit/schematics/src/tree/entry.ts
index 15eeac8d003e..fc2f898d437b 100644
--- a/packages/angular_devkit/schematics/src/tree/entry.ts
+++ b/packages/angular_devkit/schematics/src/tree/entry.ts
@@ -15,10 +15,10 @@ export class SimpleFileEntry implements FileEntry {
     private _content: Buffer,
   ) {}
 
-  get path() {
+  get path(): Path {
     return this._path;
   }
-  get content() {
+  get content(): Buffer {
     return this._content;
   }
 }
@@ -31,10 +31,10 @@ export class LazyFileEntry implements FileEntry {
     private _load: (path?: Path) => Buffer,
   ) {}
 
-  get path() {
+  get path(): Path {
     return this._path;
   }
-  get content() {
+  get content(): Buffer {
     return this._content || (this._content = this._load(this._path));
   }
 }
diff --git a/packages/angular_devkit/schematics/src/tree/host-tree.ts b/packages/angular_devkit/schematics/src/tree/host-tree.ts
index d2d7852630e5..6f5e55970543 100644
--- a/packages/angular_devkit/schematics/src/tree/host-tree.ts
+++ b/packages/angular_devkit/schematics/src/tree/host-tree.ts
@@ -107,7 +107,7 @@ export class HostTree implements Tree {
 
   private _dirCache = new Map<Path, HostDirEntry>();
 
-  [TreeSymbol]() {
+  [TreeSymbol](): this {
     return this;
   }
 
@@ -132,19 +132,19 @@ export class HostTree implements Tree {
     return normalize('/' + path);
   }
 
-  protected _willCreate(path: Path) {
+  protected _willCreate(path: Path): boolean {
     return this._record.willCreate(path);
   }
 
-  protected _willOverwrite(path: Path) {
+  protected _willOverwrite(path: Path): boolean {
     return this._record.willOverwrite(path);
   }
 
-  protected _willDelete(path: Path) {
+  protected _willDelete(path: Path): boolean {
     return this._record.willDelete(path);
   }
 
-  protected _willRename(path: Path) {
+  protected _willRename(path: Path): boolean {
     return this._record.willRename(path);
   }
 
diff --git a/packages/angular_devkit/schematics/src/tree/null.ts b/packages/angular_devkit/schematics/src/tree/null.ts
index df88209b5b9d..2a772a8fbceb 100644
--- a/packages/angular_devkit/schematics/src/tree/null.ts
+++ b/packages/angular_devkit/schematics/src/tree/null.ts
@@ -43,11 +43,11 @@ export class NullTreeDirEntry implements DirEntry {
     return null;
   }
 
-  visit() {}
+  visit(): void {}
 }
 
 export class NullTree implements Tree {
-  [TreeSymbol]() {
+  [TreeSymbol](): this {
     return this;
   }
 
@@ -74,10 +74,10 @@ export class NullTree implements Tree {
   get(_path: string) {
     return null;
   }
-  getDir(path: string) {
+  getDir(path: string): NullTreeDirEntry {
     return new NullTreeDirEntry(normalize('/' + path));
   }
-  visit() {}
+  visit(): void {}
 
   // Change content of host files.
   beginUpdate(path: string): never {
diff --git a/packages/angular_devkit/schematics/src/tree/recorder.ts b/packages/angular_devkit/schematics/src/tree/recorder.ts
index a6a0b6e7d70f..2bf13504deee 100644
--- a/packages/angular_devkit/schematics/src/tree/recorder.ts
+++ b/packages/angular_devkit/schematics/src/tree/recorder.ts
@@ -59,11 +59,11 @@ export class UpdateRecorderBase implements UpdateRecorder {
     return new UpdateRecorderBase(entry.content, entry.path);
   }
 
-  get path() {
+  get path(): string {
     return this._path;
   }
 
-  protected _assertIndex(index: number) {
+  protected _assertIndex(index: number): void {
     if (index < 0 || index > this.content.original.length) {
       throw new IndexOutOfBoundException(index, 0, this.content.original.length);
     }
diff --git a/packages/angular_devkit/schematics/src/tree/scoped.ts b/packages/angular_devkit/schematics/src/tree/scoped.ts
index 1f7dbc01fc65..b8cdbc09d23a 100644
--- a/packages/angular_devkit/schematics/src/tree/scoped.ts
+++ b/packages/angular_devkit/schematics/src/tree/scoped.ts
@@ -197,7 +197,7 @@ export class ScopedTree implements Tree {
     return scopedActions;
   }
 
-  [TreeSymbol]() {
+  [TreeSymbol](): this {
     return this;
   }
 
diff --git a/packages/angular_devkit/schematics/src/tree/static.ts b/packages/angular_devkit/schematics/src/tree/static.ts
index 9057221653d5..f4a7ce1b8618 100644
--- a/packages/angular_devkit/schematics/src/tree/static.ts
+++ b/packages/angular_devkit/schematics/src/tree/static.ts
@@ -10,15 +10,19 @@ import { SchematicsException } from '../exception/exception';
 import { FilterHostTree, HostTree } from './host-tree';
 import { FilePredicate, MergeStrategy, Tree } from './interface';
 
-export function empty() {
+export function empty(): HostTree {
   return new HostTree();
 }
 
-export function branch(tree: Tree) {
+export function branch(tree: Tree): Tree {
   return tree.branch();
 }
 
-export function merge(tree: Tree, other: Tree, strategy: MergeStrategy = MergeStrategy.Default) {
+export function merge(
+  tree: Tree,
+  other: Tree,
+  strategy: MergeStrategy = MergeStrategy.Default,
+): Tree {
   tree.merge(other, strategy);
 
   return tree;

From 209c8a7177c523c8a88c10fbd430aa22223d1c8f Mon Sep 17 00:00:00 2001
From: Angular Robot <angular-robot@google.com>
Date: Thu, 1 May 2025 13:10:46 +0000
Subject: [PATCH 003/138] build: update angular

(cherry picked from commit fa7371f1b0454e46659aa471e334b6e2239db6c3)
---
 package.json                                  |  4 +--
 pnpm-lock.yaml                                | 24 +++++++-------
 tests/legacy-cli/e2e/ng-snapshot/package.json | 32 +++++++++----------
 3 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/package.json b/package.json
index 3add85fadf87..2e1567d3a5af 100644
--- a/package.json
+++ b/package.json
@@ -47,14 +47,14 @@
   "homepage": "https://github.com/angular/angular-cli",
   "devDependencies": {
     "@angular/animations": "20.0.0-next.9",
-    "@angular/cdk": "20.0.0-next.8",
+    "@angular/cdk": "20.0.0-next.10",
     "@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/material": "20.0.0-next.10",
     "@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",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 189d5f9a97bd..d1b873728920 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -18,8 +18,8 @@ importers:
         specifier: 20.0.0-next.9
         version: 20.0.0-next.9(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))
       '@angular/cdk':
-        specifier: 20.0.0-next.8
-        version: 20.0.0-next.8(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
+        specifier: 20.0.0-next.10
+        version: 20.0.0-next.10(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
       '@angular/common':
         specifier: 20.0.0-next.9
         version: 20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
@@ -39,8 +39,8 @@ importers:
         specifier: 20.0.0-next.9
         version: 20.0.0-next.9(@angular/compiler-cli@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(typescript@5.8.3))(@angular/compiler@20.0.0-next.9)
       '@angular/material':
-        specifier: 20.0.0-next.8
-        version: 20.0.0-next.8(toykhwqb6vnza6rhnhkooutfpa)
+        specifier: 20.0.0-next.10
+        version: 20.0.0-next.10(xotmywbppgelv3sapeuqfwdbqe)
       '@angular/ng-dev':
         specifier: https://github.com/angular/dev-infra-private-ng-dev-builds.git#1a12d97905f4af88ccc0b582864907729d23e23e
         version: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/1a12d97905f4af88ccc0b582864907729d23e23e(encoding@0.1.13)
@@ -911,8 +911,8 @@ packages:
       '@angular/common': 20.0.0-next.9
       '@angular/core': 20.0.0-next.9
 
-  '@angular/cdk@20.0.0-next.8':
-    resolution: {integrity: sha512-QDI5TOdnfzBXrhbmv68NV0PqqikpEDHaiVkt742XB3XY9MjgVNH0D9fdQucn+vzfEhWs9lABuxXY/IBdI7iqaQ==}
+  '@angular/cdk@20.0.0-next.10':
+    resolution: {integrity: sha512-z72vwZnryFydG4lqElMXEP6ywdlq2kA+uA8pIH2vdneR7iyM3TdGfgeVqFB/S8JOoq0AeQ3A9K5l1Gm0dPDRgw==}
     peerDependencies:
       '@angular/common': ^20.0.0-0 || ^20.1.0-0 || ^20.2.0-0 || ^20.3.0-0 || ^21.0.0-0
       '@angular/core': ^20.0.0-0 || ^20.1.0-0 || ^20.2.0-0 || ^20.3.0-0 || ^21.0.0-0
@@ -965,10 +965,10 @@ packages:
       '@angular/compiler': 20.0.0-next.9
       '@angular/compiler-cli': 20.0.0-next.9
 
-  '@angular/material@20.0.0-next.8':
-    resolution: {integrity: sha512-KNUTlYILituqHptwgWn7YVzWJ26LybJF48XfJKEb2EhMIyz1Hkw9LkE8AZTvspCqaX3nJSqURcN5vmeXfWy9tw==}
+  '@angular/material@20.0.0-next.10':
+    resolution: {integrity: sha512-V8YU1uSaHVd0LZAV4wSd3RbQ/tV+HSuTtu+RiJ8z7OEfdIt44NOIqQ1AzSHhiCTz8+BS61TDKrbDNUDJP2KX/g==}
     peerDependencies:
-      '@angular/cdk': 20.0.0-next.8
+      '@angular/cdk': 20.0.0-next.10
       '@angular/common': ^20.0.0-0 || ^20.1.0-0 || ^20.2.0-0 || ^20.3.0-0 || ^21.0.0-0
       '@angular/core': ^20.0.0-0 || ^20.1.0-0 || ^20.2.0-0 || ^20.3.0-0 || ^21.0.0-0
       '@angular/forms': ^20.0.0-0 || ^20.1.0-0 || ^20.2.0-0 || ^20.3.0-0 || ^21.0.0-0
@@ -8283,7 +8283,7 @@ snapshots:
       '@angular/core': 20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0)
       tslib: 2.8.1
 
-  '@angular/cdk@20.0.0-next.8(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)':
+  '@angular/cdk@20.0.0-next.10(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)':
     dependencies:
       '@angular/common': 20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
       '@angular/core': 20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0)
@@ -8343,9 +8343,9 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@angular/material@20.0.0-next.8(toykhwqb6vnza6rhnhkooutfpa)':
+  '@angular/material@20.0.0-next.10(xotmywbppgelv3sapeuqfwdbqe)':
     dependencies:
-      '@angular/cdk': 20.0.0-next.8(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
+      '@angular/cdk': 20.0.0-next.10(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
       '@angular/common': 20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
       '@angular/core': 20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0)
       '@angular/forms': 20.0.0-next.9(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(@angular/platform-browser@20.0.0-next.9(@angular/animations@20.0.0-next.9(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0)))(rxjs@7.8.2)
diff --git a/tests/legacy-cli/e2e/ng-snapshot/package.json b/tests/legacy-cli/e2e/ng-snapshot/package.json
index 7bab43a46922..1a431d409fd2 100644
--- a/tests/legacy-cli/e2e/ng-snapshot/package.json
+++ b/tests/legacy-cli/e2e/ng-snapshot/package.json
@@ -2,21 +2,21 @@
   "description": "snapshot versions of Angular for e2e testing",
   "private": true,
   "dependencies": {
-    "@angular/animations": "github:angular/animations-builds#8c7cfe5de32963f3ca4849e0ac0b257e5fcad968",
-    "@angular/cdk": "github:angular/cdk-builds#9500b84652d34db69e545a1b24b2728ea86f0328",
-    "@angular/common": "github:angular/common-builds#54f70aabf2a52d8fe6fa8c1ed58904ef4e961f18",
-    "@angular/compiler": "github:angular/compiler-builds#78737e3daac1f14c1414b214c6c5b70f0737f7a8",
-    "@angular/compiler-cli": "github:angular/compiler-cli-builds#c6ad0a6c2534b51de4bb772d651f624535a6a0e0",
-    "@angular/core": "github:angular/core-builds#f646318bb5610265ad60850935196d166b1b7f87",
-    "@angular/forms": "github:angular/forms-builds#718a5a850ceb7f830371faca3edbae3807b72598",
-    "@angular/language-service": "github:angular/language-service-builds#84e7ead0a8c0f48c6a47d1e13c4d3d88697f0c98",
-    "@angular/localize": "github:angular/localize-builds#98ba220bc3f0c46c58946354cac2264ca8f120a1",
-    "@angular/material": "github:angular/material-builds#d3a1861bac291dbaf690c26410039040ff87cb4d",
-    "@angular/material-moment-adapter": "github:angular/material-moment-adapter-builds#852e876e854c4e7300b4fae3b6d92a53bb405dc4",
-    "@angular/platform-browser": "github:angular/platform-browser-builds#cb20b664273e89b661e3a1f0a8f47daae0b8505d",
-    "@angular/platform-browser-dynamic": "github:angular/platform-browser-dynamic-builds#0e04f42da81191558a80322714cfc6c03c277bba",
-    "@angular/platform-server": "github:angular/platform-server-builds#8bb910a8c0c1f5a30a1151728689b3123138d835",
-    "@angular/router": "github:angular/router-builds#478122be7bf6b0da1eb5da500991f0be4568d4fa",
-    "@angular/service-worker": "github:angular/service-worker-builds#677c72c47d89d5b5a302c2bbb733cbbdc05d2a08"
+    "@angular/animations": "github:angular/animations-builds#70437044e5b0074540409cad255ca4d91d79c1c8",
+    "@angular/cdk": "github:angular/cdk-builds#de1fc05b3b4733424a66af748e1fd44080309210",
+    "@angular/common": "github:angular/common-builds#e8786a46ae79af50c9c83b5a8dd315a43ea70283",
+    "@angular/compiler": "github:angular/compiler-builds#ca24fe76322efbbf2a6a1cab12904216f8f1bc95",
+    "@angular/compiler-cli": "github:angular/compiler-cli-builds#21561eac90bf45a6a0bd4ac0de8980d233fe0ccd",
+    "@angular/core": "github:angular/core-builds#7516ead7d16f69723ec9bdbe766ece9943a2effc",
+    "@angular/forms": "github:angular/forms-builds#b0a6b04487795becd45e872495d00fa45e2be5ed",
+    "@angular/language-service": "github:angular/language-service-builds#83ece439ea89c113e8cfe674429fd5725bc82171",
+    "@angular/localize": "github:angular/localize-builds#88881809ac51de44c9e6b029efe6891fa21667e3",
+    "@angular/material": "github:angular/material-builds#51bd2a0636c33560241803ac2f8e63f53881eca8",
+    "@angular/material-moment-adapter": "github:angular/material-moment-adapter-builds#215db3851ebf3092a48095567aec5e56ae8dec7f",
+    "@angular/platform-browser": "github:angular/platform-browser-builds#e8ad977073bbdfef5d750c48f2cd809e2f7e265e",
+    "@angular/platform-browser-dynamic": "github:angular/platform-browser-dynamic-builds#09535955b2db12ad3873987ca1c9d776c52a5fa5",
+    "@angular/platform-server": "github:angular/platform-server-builds#dde837a59a472f69607e9883e7c4214e5e4f73ae",
+    "@angular/router": "github:angular/router-builds#d769500262d4428c8d8fce21c30f58a4bab7a3d9",
+    "@angular/service-worker": "github:angular/service-worker-builds#024b948b4057385977e7be9eeb8d13ea7657d1b1"
   }
 }

From 2b28ecd1aefc6baf0ad07409554dd1c3df0e48e0 Mon Sep 17 00:00:00 2001
From: Angular Robot <angular-robot@google.com>
Date: Thu, 1 May 2025 16:03:49 +0000
Subject: [PATCH 004/138] build: update all non-major dependencies

(cherry picked from commit 8d471e51b74929810d2ee61bd2dc9f72371c69fb)
---
 package.json                                  |    6 +-
 packages/angular/build/package.json           |    6 +-
 .../angular_devkit/build_angular/package.json |   22 +-
 pnpm-lock.yaml                                | 1301 +++++++++--------
 4 files changed, 741 insertions(+), 594 deletions(-)

diff --git a/package.json b/package.json
index 2e1567d3a5af..a3decf640660 100644
--- a/package.json
+++ b/package.json
@@ -61,8 +61,8 @@
     "@angular/router": "20.0.0-next.9",
     "@angular/service-worker": "20.0.0-next.9",
     "@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",
     "@rollup/plugin-alias": "^5.1.1",
@@ -131,7 +131,7 @@
     "prettier": "^3.0.0",
     "protractor": "~7.0.0",
     "puppeteer": "18.2.1",
-    "quicktype-core": "23.1.1",
+    "quicktype-core": "23.1.3",
     "rollup": "4.40.1",
     "rollup-license-plugin": "~3.0.1",
     "semver": "7.7.1",
diff --git a/packages/angular/build/package.json b/packages/angular/build/package.json
index 730bbca1a23c..55c90305eb2a 100644
--- a/packages/angular/build/package.json
+++ b/packages/angular/build/package.json
@@ -20,8 +20,8 @@
   "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",
     "@vitejs/plugin-basic-ssl": "2.0.0",
@@ -53,7 +53,7 @@
     "@angular-devkit/core": "workspace:*",
     "jsdom": "26.1.0",
     "less": "4.3.0",
-    "ng-packagr": "20.0.0-next.8",
+    "ng-packagr": "20.0.0-rc.0",
     "postcss": "8.5.3",
     "rxjs": "7.8.2",
     "vitest": "3.1.2"
diff --git a/packages/angular_devkit/build_angular/package.json b/packages/angular_devkit/build_angular/package.json
index 2044233f2578..d2fcd3e41ac9 100644
--- a/packages/angular_devkit/build_angular/package.json
+++ b/packages/angular_devkit/build_angular/package.json
@@ -11,15 +11,15 @@
     "@angular-devkit/build-webpack": "workspace:0.0.0-EXPERIMENTAL-PLACEHOLDER",
     "@angular-devkit/core": "workspace:0.0.0-PLACEHOLDER",
     "@angular/build": "workspace:0.0.0-PLACEHOLDER",
-    "@babel/core": "7.26.10",
-    "@babel/generator": "7.27.0",
-    "@babel/helper-annotate-as-pure": "7.25.9",
+    "@babel/core": "7.27.1",
+    "@babel/generator": "7.27.1",
+    "@babel/helper-annotate-as-pure": "7.27.1",
     "@babel/helper-split-export-declaration": "7.24.7",
-    "@babel/plugin-transform-async-generator-functions": "7.26.8",
-    "@babel/plugin-transform-async-to-generator": "7.25.9",
-    "@babel/plugin-transform-runtime": "7.26.10",
-    "@babel/preset-env": "7.26.9",
-    "@babel/runtime": "7.27.0",
+    "@babel/plugin-transform-async-generator-functions": "7.27.1",
+    "@babel/plugin-transform-async-to-generator": "7.27.1",
+    "@babel/plugin-transform-runtime": "7.27.1",
+    "@babel/preset-env": "7.27.1",
+    "@babel/runtime": "7.27.1",
     "@discoveryjs/json-ext": "0.6.3",
     "@ngtools/webpack": "workspace:0.0.0-PLACEHOLDER",
     "@vitejs/plugin-basic-ssl": "2.0.0",
@@ -36,11 +36,11 @@
     "jsonc-parser": "3.3.1",
     "karma-source-map-support": "1.4.0",
     "less": "4.3.0",
-    "less-loader": "12.2.0",
+    "less-loader": "12.3.0",
     "license-webpack-plugin": "4.0.2",
     "loader-utils": "3.3.1",
     "mini-css-extract-plugin": "2.9.2",
-    "open": "10.1.1",
+    "open": "10.1.2",
     "ora": "5.4.1",
     "picomatch": "4.0.2",
     "piscina": "4.9.2",
@@ -69,7 +69,7 @@
     "@angular/ssr": "workspace:*",
     "@web/test-runner": "0.20.1",
     "browser-sync": "3.0.4",
-    "ng-packagr": "20.0.0-next.8",
+    "ng-packagr": "20.0.0-rc.0",
     "undici": "7.8.0"
   },
   "peerDependencies": {
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index d1b873728920..ce3b306958de 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -60,11 +60,11 @@ importers:
         specifier: 1.26.0
         version: 1.26.0
       '@bazel/buildifier':
-        specifier: 8.0.3
-        version: 8.0.3
+        specifier: 8.2.0
+        version: 8.2.0
       '@eslint/compat':
-        specifier: 1.2.8
-        version: 1.2.8(eslint@9.25.1(jiti@1.21.7))
+        specifier: 1.2.9
+        version: 1.2.9(eslint@9.25.1(jiti@1.21.7))
       '@eslint/eslintrc':
         specifier: 3.3.1
         version: 3.3.1
@@ -264,8 +264,8 @@ importers:
         specifier: 18.2.1
         version: 18.2.1(encoding@0.1.13)
       quicktype-core:
-        specifier: 23.1.1
-        version: 23.1.1(encoding@0.1.13)
+        specifier: 23.1.3
+        version: 23.1.3(encoding@0.1.13)
       rollup:
         specifier: 4.40.1
         version: 4.40.1
@@ -353,11 +353,11 @@ importers:
         specifier: workspace:0.0.0-EXPERIMENTAL-PLACEHOLDER
         version: link:../../angular_devkit/architect
       '@babel/core':
-        specifier: 7.26.10
-        version: 7.26.10
+        specifier: 7.27.1
+        version: 7.27.1
       '@babel/helper-annotate-as-pure':
-        specifier: 7.25.9
-        version: 7.25.9
+        specifier: 7.27.1
+        version: 7.27.1
       '@babel/helper-split-export-declaration':
         specifier: 7.24.7
         version: 7.24.7
@@ -442,8 +442,8 @@ importers:
         specifier: 4.3.0
         version: 4.3.0
       ng-packagr:
-        specifier: 20.0.0-next.8
-        version: 20.0.0-next.8(@angular/compiler-cli@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(typescript@5.8.3))(tslib@2.8.1)(typescript@5.8.3)
+        specifier: 20.0.0-rc.0
+        version: 20.0.0-rc.0(@angular/compiler-cli@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(typescript@5.8.3))(tslib@2.8.1)(typescript@5.8.3)
       postcss:
         specifier: 8.5.3
         version: 8.5.3
@@ -597,32 +597,32 @@ importers:
         specifier: workspace:*
         version: link:../../angular/build
       '@babel/core':
-        specifier: 7.26.10
-        version: 7.26.10
+        specifier: 7.27.1
+        version: 7.27.1
       '@babel/generator':
-        specifier: 7.27.0
-        version: 7.27.0
+        specifier: 7.27.1
+        version: 7.27.1
       '@babel/helper-annotate-as-pure':
-        specifier: 7.25.9
-        version: 7.25.9
+        specifier: 7.27.1
+        version: 7.27.1
       '@babel/helper-split-export-declaration':
         specifier: 7.24.7
         version: 7.24.7
       '@babel/plugin-transform-async-generator-functions':
-        specifier: 7.26.8
-        version: 7.26.8(@babel/core@7.26.10)
+        specifier: 7.27.1
+        version: 7.27.1(@babel/core@7.27.1)
       '@babel/plugin-transform-async-to-generator':
-        specifier: 7.25.9
-        version: 7.25.9(@babel/core@7.26.10)
+        specifier: 7.27.1
+        version: 7.27.1(@babel/core@7.27.1)
       '@babel/plugin-transform-runtime':
-        specifier: 7.26.10
-        version: 7.26.10(@babel/core@7.26.10)
+        specifier: 7.27.1
+        version: 7.27.1(@babel/core@7.27.1)
       '@babel/preset-env':
-        specifier: 7.26.9
-        version: 7.26.9(@babel/core@7.26.10)
+        specifier: 7.27.1
+        version: 7.27.1(@babel/core@7.27.1)
       '@babel/runtime':
-        specifier: 7.27.0
-        version: 7.27.0
+        specifier: 7.27.1
+        version: 7.27.1
       '@discoveryjs/json-ext':
         specifier: 0.6.3
         version: 0.6.3
@@ -640,7 +640,7 @@ importers:
         version: 10.4.21(postcss@8.5.3)
       babel-loader:
         specifier: 10.0.0
-        version: 10.0.0(@babel/core@7.26.10)(webpack@5.99.7(esbuild@0.25.3))
+        version: 10.0.0(@babel/core@7.27.1)(webpack@5.99.7(esbuild@0.25.3))
       browserslist:
         specifier: ^4.21.5
         version: 4.24.4
@@ -672,8 +672,8 @@ importers:
         specifier: 4.3.0
         version: 4.3.0
       less-loader:
-        specifier: 12.2.0
-        version: 12.2.0(less@4.3.0)(webpack@5.99.7(esbuild@0.25.3))
+        specifier: 12.3.0
+        version: 12.3.0(less@4.3.0)(webpack@5.99.7(esbuild@0.25.3))
       license-webpack-plugin:
         specifier: 4.0.2
         version: 4.0.2(webpack@5.99.7(esbuild@0.25.3))
@@ -684,8 +684,8 @@ importers:
         specifier: 2.9.2
         version: 2.9.2(webpack@5.99.7(esbuild@0.25.3))
       open:
-        specifier: 10.1.1
-        version: 10.1.1
+        specifier: 10.1.2
+        version: 10.1.2
       ora:
         specifier: 5.4.1
         version: 5.4.1
@@ -761,8 +761,8 @@ importers:
         specifier: 3.0.4
         version: 3.0.4
       ng-packagr:
-        specifier: 20.0.0-next.8
-        version: 20.0.0-next.8(@angular/compiler-cli@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(typescript@5.8.3))(tslib@2.8.1)(typescript@5.8.3)
+        specifier: 20.0.0-rc.0
+        version: 20.0.0-rc.0(@angular/compiler-cli@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(typescript@5.8.3))(tslib@2.8.1)(typescript@5.8.3)
       undici:
         specifier: 7.8.0
         version: 7.8.0
@@ -1025,28 +1025,44 @@ packages:
     resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==}
     engines: {node: '>=6.9.0'}
 
+  '@babel/code-frame@7.27.1':
+    resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==}
+    engines: {node: '>=6.9.0'}
+
   '@babel/compat-data@7.26.8':
     resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==}
     engines: {node: '>=6.9.0'}
 
+  '@babel/compat-data@7.27.1':
+    resolution: {integrity: sha512-Q+E+rd/yBzNQhXkG+zQnF58e4zoZfBedaxwzPmicKsiK3nt8iJYrSrDbjwFFDGC4f+rPafqRaPH6TsDoSvMf7A==}
+    engines: {node: '>=6.9.0'}
+
   '@babel/core@7.26.10':
     resolution: {integrity: sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/generator@7.27.0':
-    resolution: {integrity: sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==}
+  '@babel/core@7.27.1':
+    resolution: {integrity: sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/helper-annotate-as-pure@7.25.9':
-    resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==}
+  '@babel/generator@7.27.1':
+    resolution: {integrity: sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-annotate-as-pure@7.27.1':
+    resolution: {integrity: sha512-WnuuDILl9oOBbKnb4L+DyODx7iC47XfzmNCpTttFsSp6hTG7XZxu60+4IO+2/hPfcGOoKbFiwoI/+zwARbNQow==}
     engines: {node: '>=6.9.0'}
 
   '@babel/helper-compilation-targets@7.27.0':
     resolution: {integrity: sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/helper-create-class-features-plugin@7.27.0':
-    resolution: {integrity: sha512-vSGCvMecvFCd/BdpGlhpXYNhhC4ccxyvQWpbGL4CWbvfEoLFWUZuSuf7s9Aw70flgQF+6vptvgK2IfOnKlRmBg==}
+  '@babel/helper-compilation-targets@7.27.1':
+    resolution: {integrity: sha512-2YaDd/Rd9E598B5+WIc8wJPmWETiiJXFYVE60oX8FDohv7rAUU3CQj+A1MgeEmcsk2+dQuEjIe/GDvig0SqL4g==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-create-class-features-plugin@7.27.1':
+    resolution: {integrity: sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0
@@ -1057,47 +1073,63 @@ packages:
     peerDependencies:
       '@babel/core': ^7.0.0
 
+  '@babel/helper-create-regexp-features-plugin@7.27.1':
+    resolution: {integrity: sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+
   '@babel/helper-define-polyfill-provider@0.6.4':
     resolution: {integrity: sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw==}
     peerDependencies:
       '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
 
-  '@babel/helper-member-expression-to-functions@7.25.9':
-    resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==}
+  '@babel/helper-member-expression-to-functions@7.27.1':
+    resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==}
     engines: {node: '>=6.9.0'}
 
   '@babel/helper-module-imports@7.25.9':
     resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==}
     engines: {node: '>=6.9.0'}
 
+  '@babel/helper-module-imports@7.27.1':
+    resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==}
+    engines: {node: '>=6.9.0'}
+
   '@babel/helper-module-transforms@7.26.0':
     resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0
 
-  '@babel/helper-optimise-call-expression@7.25.9':
-    resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==}
+  '@babel/helper-module-transforms@7.27.1':
+    resolution: {integrity: sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+
+  '@babel/helper-optimise-call-expression@7.27.1':
+    resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/helper-plugin-utils@7.26.5':
-    resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==}
+  '@babel/helper-plugin-utils@7.27.1':
+    resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/helper-remap-async-to-generator@7.25.9':
-    resolution: {integrity: sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==}
+  '@babel/helper-remap-async-to-generator@7.27.1':
+    resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0
 
-  '@babel/helper-replace-supers@7.26.5':
-    resolution: {integrity: sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==}
+  '@babel/helper-replace-supers@7.27.1':
+    resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0
 
-  '@babel/helper-skip-transparent-expression-wrappers@7.25.9':
-    resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==}
+  '@babel/helper-skip-transparent-expression-wrappers@7.27.1':
+    resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==}
     engines: {node: '>=6.9.0'}
 
   '@babel/helper-split-export-declaration@7.24.7':
@@ -1108,53 +1140,74 @@ packages:
     resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==}
     engines: {node: '>=6.9.0'}
 
+  '@babel/helper-string-parser@7.27.1':
+    resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==}
+    engines: {node: '>=6.9.0'}
+
   '@babel/helper-validator-identifier@7.25.9':
     resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==}
     engines: {node: '>=6.9.0'}
 
+  '@babel/helper-validator-identifier@7.27.1':
+    resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==}
+    engines: {node: '>=6.9.0'}
+
   '@babel/helper-validator-option@7.25.9':
     resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/helper-wrap-function@7.25.9':
-    resolution: {integrity: sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==}
+  '@babel/helper-validator-option@7.27.1':
+    resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-wrap-function@7.27.1':
+    resolution: {integrity: sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==}
     engines: {node: '>=6.9.0'}
 
   '@babel/helpers@7.27.0':
     resolution: {integrity: sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==}
     engines: {node: '>=6.9.0'}
 
+  '@babel/helpers@7.27.1':
+    resolution: {integrity: sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==}
+    engines: {node: '>=6.9.0'}
+
   '@babel/parser@7.27.0':
     resolution: {integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==}
     engines: {node: '>=6.0.0'}
     hasBin: true
 
-  '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9':
-    resolution: {integrity: sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==}
+  '@babel/parser@7.27.1':
+    resolution: {integrity: sha512-I0dZ3ZpCrJ1c04OqlNsQcKiZlsrXf/kkE4FXzID9rIOYICsAbA8mMDzhW/luRNAHdCNt7os/u8wenklZDlUVUQ==}
+    engines: {node: '>=6.0.0'}
+    hasBin: true
+
+  '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1':
+    resolution: {integrity: sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0
 
-  '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9':
-    resolution: {integrity: sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==}
+  '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1':
+    resolution: {integrity: sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0
 
-  '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9':
-    resolution: {integrity: sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==}
+  '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1':
+    resolution: {integrity: sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0
 
-  '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9':
-    resolution: {integrity: sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==}
+  '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1':
+    resolution: {integrity: sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.13.0
 
-  '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9':
-    resolution: {integrity: sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==}
+  '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1':
+    resolution: {integrity: sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0
@@ -1165,14 +1218,14 @@ packages:
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/plugin-syntax-import-assertions@7.26.0':
-    resolution: {integrity: sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==}
+  '@babel/plugin-syntax-import-assertions@7.27.1':
+    resolution: {integrity: sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/plugin-syntax-import-attributes@7.26.0':
-    resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==}
+  '@babel/plugin-syntax-import-attributes@7.27.1':
+    resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
@@ -1183,314 +1236,314 @@ packages:
     peerDependencies:
       '@babel/core': ^7.0.0
 
-  '@babel/plugin-transform-arrow-functions@7.25.9':
-    resolution: {integrity: sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==}
+  '@babel/plugin-transform-arrow-functions@7.27.1':
+    resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/plugin-transform-async-generator-functions@7.26.8':
-    resolution: {integrity: sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==}
+  '@babel/plugin-transform-async-generator-functions@7.27.1':
+    resolution: {integrity: sha512-eST9RrwlpaoJBDHShc+DS2SG4ATTi2MYNb4OxYkf3n+7eb49LWpnS+HSpVfW4x927qQwgk8A2hGNVaajAEw0EA==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/plugin-transform-async-to-generator@7.25.9':
-    resolution: {integrity: sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==}
+  '@babel/plugin-transform-async-to-generator@7.27.1':
+    resolution: {integrity: sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/plugin-transform-block-scoped-functions@7.26.5':
-    resolution: {integrity: sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==}
+  '@babel/plugin-transform-block-scoped-functions@7.27.1':
+    resolution: {integrity: sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/plugin-transform-block-scoping@7.27.0':
-    resolution: {integrity: sha512-u1jGphZ8uDI2Pj/HJj6YQ6XQLZCNjOlprjxB5SVz6rq2T6SwAR+CdrWK0CP7F+9rDVMXdB0+r6Am5G5aobOjAQ==}
+  '@babel/plugin-transform-block-scoping@7.27.1':
+    resolution: {integrity: sha512-QEcFlMl9nGTgh1rn2nIeU5bkfb9BAjaQcWbiP4LvKxUot52ABcTkpcyJ7f2Q2U2RuQ84BNLgts3jRme2dTx6Fw==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/plugin-transform-class-properties@7.25.9':
-    resolution: {integrity: sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==}
+  '@babel/plugin-transform-class-properties@7.27.1':
+    resolution: {integrity: sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/plugin-transform-class-static-block@7.26.0':
-    resolution: {integrity: sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==}
+  '@babel/plugin-transform-class-static-block@7.27.1':
+    resolution: {integrity: sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.12.0
 
-  '@babel/plugin-transform-classes@7.25.9':
-    resolution: {integrity: sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==}
+  '@babel/plugin-transform-classes@7.27.1':
+    resolution: {integrity: sha512-7iLhfFAubmpeJe/Wo2TVuDrykh/zlWXLzPNdL0Jqn/Xu8R3QQ8h9ff8FQoISZOsw74/HFqFI7NX63HN7QFIHKA==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/plugin-transform-computed-properties@7.25.9':
-    resolution: {integrity: sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==}
+  '@babel/plugin-transform-computed-properties@7.27.1':
+    resolution: {integrity: sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/plugin-transform-destructuring@7.25.9':
-    resolution: {integrity: sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==}
+  '@babel/plugin-transform-destructuring@7.27.1':
+    resolution: {integrity: sha512-ttDCqhfvpE9emVkXbPD8vyxxh4TWYACVybGkDj+oReOGwnp066ITEivDlLwe0b1R0+evJ13IXQuLNB5w1fhC5Q==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/plugin-transform-dotall-regex@7.25.9':
-    resolution: {integrity: sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==}
+  '@babel/plugin-transform-dotall-regex@7.27.1':
+    resolution: {integrity: sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/plugin-transform-duplicate-keys@7.25.9':
-    resolution: {integrity: sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==}
+  '@babel/plugin-transform-duplicate-keys@7.27.1':
+    resolution: {integrity: sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9':
-    resolution: {integrity: sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==}
+  '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1':
+    resolution: {integrity: sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0
 
-  '@babel/plugin-transform-dynamic-import@7.25.9':
-    resolution: {integrity: sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==}
+  '@babel/plugin-transform-dynamic-import@7.27.1':
+    resolution: {integrity: sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/plugin-transform-exponentiation-operator@7.26.3':
-    resolution: {integrity: sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==}
+  '@babel/plugin-transform-exponentiation-operator@7.27.1':
+    resolution: {integrity: sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/plugin-transform-export-namespace-from@7.25.9':
-    resolution: {integrity: sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==}
+  '@babel/plugin-transform-export-namespace-from@7.27.1':
+    resolution: {integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/plugin-transform-for-of@7.26.9':
-    resolution: {integrity: sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg==}
+  '@babel/plugin-transform-for-of@7.27.1':
+    resolution: {integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/plugin-transform-function-name@7.25.9':
-    resolution: {integrity: sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==}
+  '@babel/plugin-transform-function-name@7.27.1':
+    resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/plugin-transform-json-strings@7.25.9':
-    resolution: {integrity: sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==}
+  '@babel/plugin-transform-json-strings@7.27.1':
+    resolution: {integrity: sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/plugin-transform-literals@7.25.9':
-    resolution: {integrity: sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==}
+  '@babel/plugin-transform-literals@7.27.1':
+    resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/plugin-transform-logical-assignment-operators@7.25.9':
-    resolution: {integrity: sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==}
+  '@babel/plugin-transform-logical-assignment-operators@7.27.1':
+    resolution: {integrity: sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/plugin-transform-member-expression-literals@7.25.9':
-    resolution: {integrity: sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==}
+  '@babel/plugin-transform-member-expression-literals@7.27.1':
+    resolution: {integrity: sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/plugin-transform-modules-amd@7.25.9':
-    resolution: {integrity: sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==}
+  '@babel/plugin-transform-modules-amd@7.27.1':
+    resolution: {integrity: sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/plugin-transform-modules-commonjs@7.26.3':
-    resolution: {integrity: sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==}
+  '@babel/plugin-transform-modules-commonjs@7.27.1':
+    resolution: {integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/plugin-transform-modules-systemjs@7.25.9':
-    resolution: {integrity: sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==}
+  '@babel/plugin-transform-modules-systemjs@7.27.1':
+    resolution: {integrity: sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/plugin-transform-modules-umd@7.25.9':
-    resolution: {integrity: sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==}
+  '@babel/plugin-transform-modules-umd@7.27.1':
+    resolution: {integrity: sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/plugin-transform-named-capturing-groups-regex@7.25.9':
-    resolution: {integrity: sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==}
+  '@babel/plugin-transform-named-capturing-groups-regex@7.27.1':
+    resolution: {integrity: sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0
 
-  '@babel/plugin-transform-new-target@7.25.9':
-    resolution: {integrity: sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==}
+  '@babel/plugin-transform-new-target@7.27.1':
+    resolution: {integrity: sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/plugin-transform-nullish-coalescing-operator@7.26.6':
-    resolution: {integrity: sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==}
+  '@babel/plugin-transform-nullish-coalescing-operator@7.27.1':
+    resolution: {integrity: sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/plugin-transform-numeric-separator@7.25.9':
-    resolution: {integrity: sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==}
+  '@babel/plugin-transform-numeric-separator@7.27.1':
+    resolution: {integrity: sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/plugin-transform-object-rest-spread@7.25.9':
-    resolution: {integrity: sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==}
+  '@babel/plugin-transform-object-rest-spread@7.27.1':
+    resolution: {integrity: sha512-/sSliVc9gHE20/7D5qsdGlq7RG5NCDTWsAhyqzGuq174EtWJoGzIu1BQ7G56eDsTcy1jseBZwv50olSdXOlGuA==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/plugin-transform-object-super@7.25.9':
-    resolution: {integrity: sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==}
+  '@babel/plugin-transform-object-super@7.27.1':
+    resolution: {integrity: sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/plugin-transform-optional-catch-binding@7.25.9':
-    resolution: {integrity: sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==}
+  '@babel/plugin-transform-optional-catch-binding@7.27.1':
+    resolution: {integrity: sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/plugin-transform-optional-chaining@7.25.9':
-    resolution: {integrity: sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==}
+  '@babel/plugin-transform-optional-chaining@7.27.1':
+    resolution: {integrity: sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/plugin-transform-parameters@7.25.9':
-    resolution: {integrity: sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==}
+  '@babel/plugin-transform-parameters@7.27.1':
+    resolution: {integrity: sha512-018KRk76HWKeZ5l4oTj2zPpSh+NbGdt0st5S6x0pga6HgrjBOJb24mMDHorFopOOd6YHkLgOZ+zaCjZGPO4aKg==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/plugin-transform-private-methods@7.25.9':
-    resolution: {integrity: sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==}
+  '@babel/plugin-transform-private-methods@7.27.1':
+    resolution: {integrity: sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/plugin-transform-private-property-in-object@7.25.9':
-    resolution: {integrity: sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==}
+  '@babel/plugin-transform-private-property-in-object@7.27.1':
+    resolution: {integrity: sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/plugin-transform-property-literals@7.25.9':
-    resolution: {integrity: sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==}
+  '@babel/plugin-transform-property-literals@7.27.1':
+    resolution: {integrity: sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/plugin-transform-regenerator@7.27.0':
-    resolution: {integrity: sha512-LX/vCajUJQDqE7Aum/ELUMZAY19+cDpghxrnyt5I1tV6X5PyC86AOoWXWFYFeIvauyeSA6/ktn4tQVn/3ZifsA==}
+  '@babel/plugin-transform-regenerator@7.27.1':
+    resolution: {integrity: sha512-B19lbbL7PMrKr52BNPjCqg1IyNUIjTcxKj8uX9zHO+PmWN93s19NDr/f69mIkEp2x9nmDJ08a7lgHaTTzvW7mw==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/plugin-transform-regexp-modifiers@7.26.0':
-    resolution: {integrity: sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==}
+  '@babel/plugin-transform-regexp-modifiers@7.27.1':
+    resolution: {integrity: sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0
 
-  '@babel/plugin-transform-reserved-words@7.25.9':
-    resolution: {integrity: sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==}
+  '@babel/plugin-transform-reserved-words@7.27.1':
+    resolution: {integrity: sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/plugin-transform-runtime@7.26.10':
-    resolution: {integrity: sha512-NWaL2qG6HRpONTnj4JvDU6th4jYeZOJgu3QhmFTCihib0ermtOJqktA5BduGm3suhhVe9EMP9c9+mfJ/I9slqw==}
+  '@babel/plugin-transform-runtime@7.27.1':
+    resolution: {integrity: sha512-TqGF3desVsTcp3WrJGj4HfKokfCXCLcHpt4PJF0D8/iT6LPd9RS82Upw3KPeyr6B22Lfd3DO8MVrmp0oRkUDdw==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/plugin-transform-shorthand-properties@7.25.9':
-    resolution: {integrity: sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==}
+  '@babel/plugin-transform-shorthand-properties@7.27.1':
+    resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/plugin-transform-spread@7.25.9':
-    resolution: {integrity: sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==}
+  '@babel/plugin-transform-spread@7.27.1':
+    resolution: {integrity: sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/plugin-transform-sticky-regex@7.25.9':
-    resolution: {integrity: sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==}
+  '@babel/plugin-transform-sticky-regex@7.27.1':
+    resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/plugin-transform-template-literals@7.26.8':
-    resolution: {integrity: sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==}
+  '@babel/plugin-transform-template-literals@7.27.1':
+    resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/plugin-transform-typeof-symbol@7.27.0':
-    resolution: {integrity: sha512-+LLkxA9rKJpNoGsbLnAgOCdESl73vwYn+V6b+5wHbrE7OGKVDPHIQvbFSzqE6rwqaCw2RE+zdJrlLkcf8YOA0w==}
+  '@babel/plugin-transform-typeof-symbol@7.27.1':
+    resolution: {integrity: sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/plugin-transform-unicode-escapes@7.25.9':
-    resolution: {integrity: sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==}
+  '@babel/plugin-transform-unicode-escapes@7.27.1':
+    resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/plugin-transform-unicode-property-regex@7.25.9':
-    resolution: {integrity: sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==}
+  '@babel/plugin-transform-unicode-property-regex@7.27.1':
+    resolution: {integrity: sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/plugin-transform-unicode-regex@7.25.9':
-    resolution: {integrity: sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==}
+  '@babel/plugin-transform-unicode-regex@7.27.1':
+    resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/plugin-transform-unicode-sets-regex@7.25.9':
-    resolution: {integrity: sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==}
+  '@babel/plugin-transform-unicode-sets-regex@7.27.1':
+    resolution: {integrity: sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0
 
-  '@babel/preset-env@7.26.9':
-    resolution: {integrity: sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==}
+  '@babel/preset-env@7.27.1':
+    resolution: {integrity: sha512-TZ5USxFpLgKDpdEt8YWBR7p6g+bZo6sHaXLqP2BY/U0acaoI8FTVflcYCr/v94twM1C5IWFdZ/hscq9WjUeLXA==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
@@ -1500,28 +1553,40 @@ packages:
     peerDependencies:
       '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0
 
-  '@babel/runtime@7.27.0':
-    resolution: {integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==}
+  '@babel/runtime@7.27.1':
+    resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==}
     engines: {node: '>=6.9.0'}
 
   '@babel/template@7.27.0':
     resolution: {integrity: sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==}
     engines: {node: '>=6.9.0'}
 
+  '@babel/template@7.27.1':
+    resolution: {integrity: sha512-Fyo3ghWMqkHHpHQCoBs2VnYjR4iWFFjguTDEqA5WgZDOrFesVjMhMM2FSqTKSoUSDO1VQtavj8NFpdRBEvJTtg==}
+    engines: {node: '>=6.9.0'}
+
   '@babel/traverse@7.27.0':
     resolution: {integrity: sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==}
     engines: {node: '>=6.9.0'}
 
+  '@babel/traverse@7.27.1':
+    resolution: {integrity: sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==}
+    engines: {node: '>=6.9.0'}
+
   '@babel/types@7.27.0':
     resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==}
     engines: {node: '>=6.9.0'}
 
+  '@babel/types@7.27.1':
+    resolution: {integrity: sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==}
+    engines: {node: '>=6.9.0'}
+
   '@bazel/bazelisk@1.26.0':
     resolution: {integrity: sha512-bTNcHdGyEQ9r7SczEYUa0gkEQhJo1ld2BjXI8fWBvsUeoHi03QpUs2HZgDbjjrpQFQqG2ZbO7ihZvH8MjhUTHw==}
     hasBin: true
 
-  '@bazel/buildifier@8.0.3':
-    resolution: {integrity: sha512-X4BbSHDZrvXaldGKW0AkBMC0HPOosJyPykE8Z5LpGBCmCdgIhRJHtAjBOG21NRmZpwI8fc7A1rhhSOJ7UGmbFg==}
+  '@bazel/buildifier@8.2.0':
+    resolution: {integrity: sha512-GKiCBXi8RcOH8Gc2zkeHJl30GGayplWVW/eMx9v1M2g53Iz2+CmacVW+LB5rIrZsLWiolaK9BFVWXRQol4Wt0Q==}
     hasBin: true
 
   '@colors/colors@1.5.0':
@@ -1728,8 +1793,8 @@ packages:
     resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==}
     engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
 
-  '@eslint/compat@1.2.8':
-    resolution: {integrity: sha512-LqCYHdWL/QqKIJuZ/ucMAv8d4luKGs4oCPgpt8mWztQAtPrHfXKQ/XAUc8ljCHAfJCn6SvkpTcGt5Tsh8saowA==}
+  '@eslint/compat@1.2.9':
+    resolution: {integrity: sha512-gCdSY54n7k+driCadyMNv8JSPzYLeDVM/ikZRtvtROBpRdFSkS8W9A82MqsaY7lZuwL0wiapgD0NT1xT0hyJsA==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     peerDependencies:
       eslint: ^9.10.0
@@ -5658,8 +5723,8 @@ packages:
   launch-editor@2.10.0:
     resolution: {integrity: sha512-D7dBRJo/qcGX9xlvt/6wUYzQxjh5G1RvZPgPv8vi4KRU99DVQL/oW7tnVOCCTm2HGeo3C5HvGE5Yrh6UBoZ0vA==}
 
-  less-loader@12.2.0:
-    resolution: {integrity: sha512-MYUxjSQSBUQmowc0l5nPieOYwMzGPUaTzB6inNW/bdPEG9zOL3eAAD1Qw5ZxSPk7we5dMojHwNODYMV1hq4EVg==}
+  less-loader@12.3.0:
+    resolution: {integrity: sha512-0M6+uYulvYIWs52y0LqN4+QM9TqWAohYSNTo4htE8Z7Cn3G/qQMEmktfHmyJT23k+20kU9zHH2wrfFXkxNLtVw==}
     engines: {node: '>= 18.12.0'}
     peerDependencies:
       '@rspack/core': 0.x || 1.x
@@ -6065,8 +6130,8 @@ packages:
     resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==}
     engines: {node: '>= 0.4.0'}
 
-  ng-packagr@20.0.0-next.8:
-    resolution: {integrity: sha512-jmvpjZ0YTW54zc5bRLI+i2SULrx8SxSccpa6lR8PlCPj/6hRbOwWz5YpDbhhDJRzflb1TXB7M29z/Ux18ghe+g==}
+  ng-packagr@20.0.0-rc.0:
+    resolution: {integrity: sha512-XxyqxmF229CYlqqdw2G7WLp2BSacMr0swSiLM7qJBu0jPJFAMmGOfvxOMD542suCekYRaFzzQ+WRpSLftEjV5A==}
     engines: {node: ^20.11.1 || >=22.11.0}
     hasBin: true
     peerDependencies:
@@ -6328,8 +6393,8 @@ packages:
   only@0.0.2:
     resolution: {integrity: sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==}
 
-  open@10.1.1:
-    resolution: {integrity: sha512-zy1wx4+P3PfhXSEPJNtZmJXfhkkIaxU1VauWIrDZw1O7uJRDRJtKr9n3Ic4NgbA16KyOxOXO2ng9gYwCdXuSXA==}
+  open@10.1.2:
+    resolution: {integrity: sha512-cxN6aIDPz6rm8hbebcP7vrQNhvRcveZoJU72Y7vskh4oIm+BZwBECnx5nTmrlres1Qapvx27Qo1Auukpf8PKXw==}
     engines: {node: '>=18'}
 
   open@8.4.2:
@@ -6755,8 +6820,8 @@ packages:
   quick-format-unescaped@4.0.4:
     resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==}
 
-  quicktype-core@23.1.1:
-    resolution: {integrity: sha512-YhbUh6dXr+yTNl9Jgh85r6t9xkztIqPsgs3hI10r/ULsG3Fo15UgXgSFS6CIQ/PU76ptCBM9x+1a39i5+nwpqw==}
+  quicktype-core@23.1.3:
+    resolution: {integrity: sha512-0wL9YYx6SvfI3sd7e+mr1Ha514CXnOKdNJgHSiccMqoHfGumrChmVkQhD81HQHztdLQq1k+HMmACzFgfDJJLAA==}
 
   randombytes@2.1.0:
     resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==}
@@ -6818,12 +6883,6 @@ packages:
   regenerate@1.4.2:
     resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==}
 
-  regenerator-runtime@0.14.1:
-    resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
-
-  regenerator-transform@0.15.2:
-    resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==}
-
   regex-parser@2.3.1:
     resolution: {integrity: sha512-yXLRqatcCuKtVHsWrNg0JL3l1zGfdXeEvDa0bdu4tCDQw0RpMDZsqbkyRTUnKMR0tXF627V2oEWjBEaEdqTwtQ==}
 
@@ -8416,13 +8475,21 @@ snapshots:
       js-tokens: 4.0.0
       picocolors: 1.1.1
 
+  '@babel/code-frame@7.27.1':
+    dependencies:
+      '@babel/helper-validator-identifier': 7.27.1
+      js-tokens: 4.0.0
+      picocolors: 1.1.1
+
   '@babel/compat-data@7.26.8': {}
 
+  '@babel/compat-data@7.27.1': {}
+
   '@babel/core@7.26.10':
     dependencies:
       '@ampproject/remapping': 2.3.0
       '@babel/code-frame': 7.26.2
-      '@babel/generator': 7.27.0
+      '@babel/generator': 7.27.1
       '@babel/helper-compilation-targets': 7.27.0
       '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10)
       '@babel/helpers': 7.27.0
@@ -8438,17 +8505,37 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@babel/generator@7.27.0':
+  '@babel/core@7.27.1':
     dependencies:
-      '@babel/parser': 7.27.0
-      '@babel/types': 7.27.0
+      '@ampproject/remapping': 2.3.0
+      '@babel/code-frame': 7.27.1
+      '@babel/generator': 7.27.1
+      '@babel/helper-compilation-targets': 7.27.1
+      '@babel/helper-module-transforms': 7.27.1(@babel/core@7.27.1)
+      '@babel/helpers': 7.27.1
+      '@babel/parser': 7.27.1
+      '@babel/template': 7.27.1
+      '@babel/traverse': 7.27.1
+      '@babel/types': 7.27.1
+      convert-source-map: 2.0.0
+      debug: 4.4.0(supports-color@10.0.0)
+      gensync: 1.0.0-beta.2
+      json5: 2.2.3
+      semver: 6.3.1
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/generator@7.27.1':
+    dependencies:
+      '@babel/parser': 7.27.1
+      '@babel/types': 7.27.1
       '@jridgewell/gen-mapping': 0.3.8
       '@jridgewell/trace-mapping': 0.3.25
       jsesc: 3.1.0
 
-  '@babel/helper-annotate-as-pure@7.25.9':
+  '@babel/helper-annotate-as-pure@7.27.1':
     dependencies:
-      '@babel/types': 7.27.0
+      '@babel/types': 7.27.1
 
   '@babel/helper-compilation-targets@7.27.0':
     dependencies:
@@ -8458,41 +8545,56 @@ snapshots:
       lru-cache: 5.1.1
       semver: 6.3.1
 
-  '@babel/helper-create-class-features-plugin@7.27.0(@babel/core@7.26.10)':
+  '@babel/helper-compilation-targets@7.27.1':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-annotate-as-pure': 7.25.9
-      '@babel/helper-member-expression-to-functions': 7.25.9
-      '@babel/helper-optimise-call-expression': 7.25.9
-      '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.10)
-      '@babel/helper-skip-transparent-expression-wrappers': 7.25.9
-      '@babel/traverse': 7.27.0
+      '@babel/compat-data': 7.27.1
+      '@babel/helper-validator-option': 7.27.1
+      browserslist: 4.24.4
+      lru-cache: 5.1.1
+      semver: 6.3.1
+
+  '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.27.1)':
+    dependencies:
+      '@babel/core': 7.27.1
+      '@babel/helper-annotate-as-pure': 7.27.1
+      '@babel/helper-member-expression-to-functions': 7.27.1
+      '@babel/helper-optimise-call-expression': 7.27.1
+      '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.1)
+      '@babel/helper-skip-transparent-expression-wrappers': 7.27.1
+      '@babel/traverse': 7.27.1
       semver: 6.3.1
     transitivePeerDependencies:
       - supports-color
 
-  '@babel/helper-create-regexp-features-plugin@7.27.0(@babel/core@7.26.10)':
+  '@babel/helper-create-regexp-features-plugin@7.27.0(@babel/core@7.27.1)':
     dependencies:
-      '@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
       regexpu-core: 6.2.0
       semver: 6.3.1
 
-  '@babel/helper-define-polyfill-provider@0.6.4(@babel/core@7.26.10)':
+  '@babel/helper-create-regexp-features-plugin@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
+      '@babel/core': 7.27.1
+      '@babel/helper-annotate-as-pure': 7.27.1
+      regexpu-core: 6.2.0
+      semver: 6.3.1
+
+  '@babel/helper-define-polyfill-provider@0.6.4(@babel/core@7.27.1)':
+    dependencies:
+      '@babel/core': 7.27.1
       '@babel/helper-compilation-targets': 7.27.0
-      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/helper-plugin-utils': 7.27.1
       debug: 4.4.0(supports-color@10.0.0)
       lodash.debounce: 4.0.8
       resolve: 1.22.10
     transitivePeerDependencies:
       - supports-color
 
-  '@babel/helper-member-expression-to-functions@7.25.9':
+  '@babel/helper-member-expression-to-functions@7.27.1':
     dependencies:
-      '@babel/traverse': 7.27.0
-      '@babel/types': 7.27.0
+      '@babel/traverse': 7.27.1
+      '@babel/types': 7.27.1
     transitivePeerDependencies:
       - supports-color
 
@@ -8503,6 +8605,13 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
+  '@babel/helper-module-imports@7.27.1':
+    dependencies:
+      '@babel/traverse': 7.27.1
+      '@babel/types': 7.27.1
+    transitivePeerDependencies:
+      - supports-color
+
   '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.10)':
     dependencies:
       '@babel/core': 7.26.10
@@ -8512,34 +8621,43 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@babel/helper-optimise-call-expression@7.25.9':
+  '@babel/helper-module-transforms@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/types': 7.27.0
+      '@babel/core': 7.27.1
+      '@babel/helper-module-imports': 7.27.1
+      '@babel/helper-validator-identifier': 7.27.1
+      '@babel/traverse': 7.27.1
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/helper-optimise-call-expression@7.27.1':
+    dependencies:
+      '@babel/types': 7.27.1
 
-  '@babel/helper-plugin-utils@7.26.5': {}
+  '@babel/helper-plugin-utils@7.27.1': {}
 
-  '@babel/helper-remap-async-to-generator@7.25.9(@babel/core@7.26.10)':
+  '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-annotate-as-pure': 7.25.9
-      '@babel/helper-wrap-function': 7.25.9
-      '@babel/traverse': 7.27.0
+      '@babel/core': 7.27.1
+      '@babel/helper-annotate-as-pure': 7.27.1
+      '@babel/helper-wrap-function': 7.27.1
+      '@babel/traverse': 7.27.1
     transitivePeerDependencies:
       - supports-color
 
-  '@babel/helper-replace-supers@7.26.5(@babel/core@7.26.10)':
+  '@babel/helper-replace-supers@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-member-expression-to-functions': 7.25.9
-      '@babel/helper-optimise-call-expression': 7.25.9
-      '@babel/traverse': 7.27.0
+      '@babel/core': 7.27.1
+      '@babel/helper-member-expression-to-functions': 7.27.1
+      '@babel/helper-optimise-call-expression': 7.27.1
+      '@babel/traverse': 7.27.1
     transitivePeerDependencies:
       - supports-color
 
-  '@babel/helper-skip-transparent-expression-wrappers@7.25.9':
+  '@babel/helper-skip-transparent-expression-wrappers@7.27.1':
     dependencies:
-      '@babel/traverse': 7.27.0
-      '@babel/types': 7.27.0
+      '@babel/traverse': 7.27.1
+      '@babel/types': 7.27.1
     transitivePeerDependencies:
       - supports-color
 
@@ -8549,15 +8667,21 @@ snapshots:
 
   '@babel/helper-string-parser@7.25.9': {}
 
+  '@babel/helper-string-parser@7.27.1': {}
+
   '@babel/helper-validator-identifier@7.25.9': {}
 
+  '@babel/helper-validator-identifier@7.27.1': {}
+
   '@babel/helper-validator-option@7.25.9': {}
 
-  '@babel/helper-wrap-function@7.25.9':
+  '@babel/helper-validator-option@7.27.1': {}
+
+  '@babel/helper-wrap-function@7.27.1':
     dependencies:
-      '@babel/template': 7.27.0
-      '@babel/traverse': 7.27.0
-      '@babel/types': 7.27.0
+      '@babel/template': 7.27.1
+      '@babel/traverse': 7.27.1
+      '@babel/types': 7.27.1
     transitivePeerDependencies:
       - supports-color
 
@@ -8566,481 +8690,487 @@ snapshots:
       '@babel/template': 7.27.0
       '@babel/types': 7.27.0
 
+  '@babel/helpers@7.27.1':
+    dependencies:
+      '@babel/template': 7.27.1
+      '@babel/types': 7.27.1
+
   '@babel/parser@7.27.0':
     dependencies:
       '@babel/types': 7.27.0
 
-  '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9(@babel/core@7.26.10)':
+  '@babel/parser@7.27.1':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-plugin-utils': 7.26.5
-      '@babel/traverse': 7.27.0
+      '@babel/types': 7.27.1
+
+  '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1(@babel/core@7.27.1)':
+    dependencies:
+      '@babel/core': 7.27.1
+      '@babel/helper-plugin-utils': 7.27.1
+      '@babel/traverse': 7.27.1
     transitivePeerDependencies:
       - supports-color
 
-  '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9(@babel/core@7.26.10)':
+  '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/core': 7.27.1
+      '@babel/helper-plugin-utils': 7.27.1
 
-  '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9(@babel/core@7.26.10)':
+  '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/core': 7.27.1
+      '@babel/helper-plugin-utils': 7.27.1
 
-  '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9(@babel/core@7.26.10)':
+  '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-plugin-utils': 7.26.5
-      '@babel/helper-skip-transparent-expression-wrappers': 7.25.9
-      '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.10)
+      '@babel/core': 7.27.1
+      '@babel/helper-plugin-utils': 7.27.1
+      '@babel/helper-skip-transparent-expression-wrappers': 7.27.1
+      '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.27.1)
     transitivePeerDependencies:
       - supports-color
 
-  '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9(@babel/core@7.26.10)':
+  '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-plugin-utils': 7.26.5
-      '@babel/traverse': 7.27.0
+      '@babel/core': 7.27.1
+      '@babel/helper-plugin-utils': 7.27.1
+      '@babel/traverse': 7.27.1
     transitivePeerDependencies:
       - supports-color
 
-  '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.10)':
+  '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
+      '@babel/core': 7.27.1
 
-  '@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.26.10)':
+  '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/core': 7.27.1
+      '@babel/helper-plugin-utils': 7.27.1
 
-  '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.10)':
+  '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/core': 7.27.1
+      '@babel/helper-plugin-utils': 7.27.1
 
-  '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.26.10)':
+  '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10)
-      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/core': 7.27.1
+      '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.27.1)
+      '@babel/helper-plugin-utils': 7.27.1
 
-  '@babel/plugin-transform-arrow-functions@7.25.9(@babel/core@7.26.10)':
+  '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/core': 7.27.1
+      '@babel/helper-plugin-utils': 7.27.1
 
-  '@babel/plugin-transform-async-generator-functions@7.26.8(@babel/core@7.26.10)':
+  '@babel/plugin-transform-async-generator-functions@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-plugin-utils': 7.26.5
-      '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.10)
-      '@babel/traverse': 7.27.0
+      '@babel/core': 7.27.1
+      '@babel/helper-plugin-utils': 7.27.1
+      '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.27.1)
+      '@babel/traverse': 7.27.1
     transitivePeerDependencies:
       - supports-color
 
-  '@babel/plugin-transform-async-to-generator@7.25.9(@babel/core@7.26.10)':
+  '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-module-imports': 7.25.9
-      '@babel/helper-plugin-utils': 7.26.5
-      '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.10)
+      '@babel/core': 7.27.1
+      '@babel/helper-module-imports': 7.27.1
+      '@babel/helper-plugin-utils': 7.27.1
+      '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.27.1)
     transitivePeerDependencies:
       - supports-color
 
-  '@babel/plugin-transform-block-scoped-functions@7.26.5(@babel/core@7.26.10)':
+  '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/core': 7.27.1
+      '@babel/helper-plugin-utils': 7.27.1
 
-  '@babel/plugin-transform-block-scoping@7.27.0(@babel/core@7.26.10)':
+  '@babel/plugin-transform-block-scoping@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/core': 7.27.1
+      '@babel/helper-plugin-utils': 7.27.1
 
-  '@babel/plugin-transform-class-properties@7.25.9(@babel/core@7.26.10)':
+  '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10)
-      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/core': 7.27.1
+      '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.1)
+      '@babel/helper-plugin-utils': 7.27.1
     transitivePeerDependencies:
       - supports-color
 
-  '@babel/plugin-transform-class-static-block@7.26.0(@babel/core@7.26.10)':
+  '@babel/plugin-transform-class-static-block@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10)
-      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/core': 7.27.1
+      '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.1)
+      '@babel/helper-plugin-utils': 7.27.1
     transitivePeerDependencies:
       - supports-color
 
-  '@babel/plugin-transform-classes@7.25.9(@babel/core@7.26.10)':
+  '@babel/plugin-transform-classes@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-annotate-as-pure': 7.25.9
-      '@babel/helper-compilation-targets': 7.27.0
-      '@babel/helper-plugin-utils': 7.26.5
-      '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.10)
-      '@babel/traverse': 7.27.0
+      '@babel/core': 7.27.1
+      '@babel/helper-annotate-as-pure': 7.27.1
+      '@babel/helper-compilation-targets': 7.27.1
+      '@babel/helper-plugin-utils': 7.27.1
+      '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.1)
+      '@babel/traverse': 7.27.1
       globals: 11.12.0
     transitivePeerDependencies:
       - supports-color
 
-  '@babel/plugin-transform-computed-properties@7.25.9(@babel/core@7.26.10)':
+  '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-plugin-utils': 7.26.5
-      '@babel/template': 7.27.0
+      '@babel/core': 7.27.1
+      '@babel/helper-plugin-utils': 7.27.1
+      '@babel/template': 7.27.1
 
-  '@babel/plugin-transform-destructuring@7.25.9(@babel/core@7.26.10)':
+  '@babel/plugin-transform-destructuring@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/core': 7.27.1
+      '@babel/helper-plugin-utils': 7.27.1
 
-  '@babel/plugin-transform-dotall-regex@7.25.9(@babel/core@7.26.10)':
+  '@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10)
-      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/core': 7.27.1
+      '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.1)
+      '@babel/helper-plugin-utils': 7.27.1
 
-  '@babel/plugin-transform-duplicate-keys@7.25.9(@babel/core@7.26.10)':
+  '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/core': 7.27.1
+      '@babel/helper-plugin-utils': 7.27.1
 
-  '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9(@babel/core@7.26.10)':
+  '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10)
-      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/core': 7.27.1
+      '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.1)
+      '@babel/helper-plugin-utils': 7.27.1
 
-  '@babel/plugin-transform-dynamic-import@7.25.9(@babel/core@7.26.10)':
+  '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/core': 7.27.1
+      '@babel/helper-plugin-utils': 7.27.1
 
-  '@babel/plugin-transform-exponentiation-operator@7.26.3(@babel/core@7.26.10)':
+  '@babel/plugin-transform-exponentiation-operator@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/core': 7.27.1
+      '@babel/helper-plugin-utils': 7.27.1
 
-  '@babel/plugin-transform-export-namespace-from@7.25.9(@babel/core@7.26.10)':
+  '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/core': 7.27.1
+      '@babel/helper-plugin-utils': 7.27.1
 
-  '@babel/plugin-transform-for-of@7.26.9(@babel/core@7.26.10)':
+  '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-plugin-utils': 7.26.5
-      '@babel/helper-skip-transparent-expression-wrappers': 7.25.9
+      '@babel/core': 7.27.1
+      '@babel/helper-plugin-utils': 7.27.1
+      '@babel/helper-skip-transparent-expression-wrappers': 7.27.1
     transitivePeerDependencies:
       - supports-color
 
-  '@babel/plugin-transform-function-name@7.25.9(@babel/core@7.26.10)':
+  '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-compilation-targets': 7.27.0
-      '@babel/helper-plugin-utils': 7.26.5
-      '@babel/traverse': 7.27.0
+      '@babel/core': 7.27.1
+      '@babel/helper-compilation-targets': 7.27.1
+      '@babel/helper-plugin-utils': 7.27.1
+      '@babel/traverse': 7.27.1
     transitivePeerDependencies:
       - supports-color
 
-  '@babel/plugin-transform-json-strings@7.25.9(@babel/core@7.26.10)':
+  '@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/core': 7.27.1
+      '@babel/helper-plugin-utils': 7.27.1
 
-  '@babel/plugin-transform-literals@7.25.9(@babel/core@7.26.10)':
+  '@babel/plugin-transform-literals@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/core': 7.27.1
+      '@babel/helper-plugin-utils': 7.27.1
 
-  '@babel/plugin-transform-logical-assignment-operators@7.25.9(@babel/core@7.26.10)':
+  '@babel/plugin-transform-logical-assignment-operators@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/core': 7.27.1
+      '@babel/helper-plugin-utils': 7.27.1
 
-  '@babel/plugin-transform-member-expression-literals@7.25.9(@babel/core@7.26.10)':
+  '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/core': 7.27.1
+      '@babel/helper-plugin-utils': 7.27.1
 
-  '@babel/plugin-transform-modules-amd@7.25.9(@babel/core@7.26.10)':
+  '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10)
-      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/core': 7.27.1
+      '@babel/helper-module-transforms': 7.27.1(@babel/core@7.27.1)
+      '@babel/helper-plugin-utils': 7.27.1
     transitivePeerDependencies:
       - supports-color
 
-  '@babel/plugin-transform-modules-commonjs@7.26.3(@babel/core@7.26.10)':
+  '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10)
-      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/core': 7.27.1
+      '@babel/helper-module-transforms': 7.27.1(@babel/core@7.27.1)
+      '@babel/helper-plugin-utils': 7.27.1
     transitivePeerDependencies:
       - supports-color
 
-  '@babel/plugin-transform-modules-systemjs@7.25.9(@babel/core@7.26.10)':
+  '@babel/plugin-transform-modules-systemjs@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10)
-      '@babel/helper-plugin-utils': 7.26.5
-      '@babel/helper-validator-identifier': 7.25.9
-      '@babel/traverse': 7.27.0
+      '@babel/core': 7.27.1
+      '@babel/helper-module-transforms': 7.27.1(@babel/core@7.27.1)
+      '@babel/helper-plugin-utils': 7.27.1
+      '@babel/helper-validator-identifier': 7.27.1
+      '@babel/traverse': 7.27.1
     transitivePeerDependencies:
       - supports-color
 
-  '@babel/plugin-transform-modules-umd@7.25.9(@babel/core@7.26.10)':
+  '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10)
-      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/core': 7.27.1
+      '@babel/helper-module-transforms': 7.27.1(@babel/core@7.27.1)
+      '@babel/helper-plugin-utils': 7.27.1
     transitivePeerDependencies:
       - supports-color
 
-  '@babel/plugin-transform-named-capturing-groups-regex@7.25.9(@babel/core@7.26.10)':
+  '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10)
-      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/core': 7.27.1
+      '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.1)
+      '@babel/helper-plugin-utils': 7.27.1
 
-  '@babel/plugin-transform-new-target@7.25.9(@babel/core@7.26.10)':
+  '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/core': 7.27.1
+      '@babel/helper-plugin-utils': 7.27.1
 
-  '@babel/plugin-transform-nullish-coalescing-operator@7.26.6(@babel/core@7.26.10)':
+  '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/core': 7.27.1
+      '@babel/helper-plugin-utils': 7.27.1
 
-  '@babel/plugin-transform-numeric-separator@7.25.9(@babel/core@7.26.10)':
+  '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/core': 7.27.1
+      '@babel/helper-plugin-utils': 7.27.1
 
-  '@babel/plugin-transform-object-rest-spread@7.25.9(@babel/core@7.26.10)':
+  '@babel/plugin-transform-object-rest-spread@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-compilation-targets': 7.27.0
-      '@babel/helper-plugin-utils': 7.26.5
-      '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.10)
+      '@babel/core': 7.27.1
+      '@babel/helper-compilation-targets': 7.27.1
+      '@babel/helper-plugin-utils': 7.27.1
+      '@babel/plugin-transform-parameters': 7.27.1(@babel/core@7.27.1)
 
-  '@babel/plugin-transform-object-super@7.25.9(@babel/core@7.26.10)':
+  '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-plugin-utils': 7.26.5
-      '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.10)
+      '@babel/core': 7.27.1
+      '@babel/helper-plugin-utils': 7.27.1
+      '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.1)
     transitivePeerDependencies:
       - supports-color
 
-  '@babel/plugin-transform-optional-catch-binding@7.25.9(@babel/core@7.26.10)':
+  '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/core': 7.27.1
+      '@babel/helper-plugin-utils': 7.27.1
 
-  '@babel/plugin-transform-optional-chaining@7.25.9(@babel/core@7.26.10)':
+  '@babel/plugin-transform-optional-chaining@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-plugin-utils': 7.26.5
-      '@babel/helper-skip-transparent-expression-wrappers': 7.25.9
+      '@babel/core': 7.27.1
+      '@babel/helper-plugin-utils': 7.27.1
+      '@babel/helper-skip-transparent-expression-wrappers': 7.27.1
     transitivePeerDependencies:
       - supports-color
 
-  '@babel/plugin-transform-parameters@7.25.9(@babel/core@7.26.10)':
+  '@babel/plugin-transform-parameters@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/core': 7.27.1
+      '@babel/helper-plugin-utils': 7.27.1
 
-  '@babel/plugin-transform-private-methods@7.25.9(@babel/core@7.26.10)':
+  '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10)
-      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/core': 7.27.1
+      '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.1)
+      '@babel/helper-plugin-utils': 7.27.1
     transitivePeerDependencies:
       - supports-color
 
-  '@babel/plugin-transform-private-property-in-object@7.25.9(@babel/core@7.26.10)':
+  '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-annotate-as-pure': 7.25.9
-      '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10)
-      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/core': 7.27.1
+      '@babel/helper-annotate-as-pure': 7.27.1
+      '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.1)
+      '@babel/helper-plugin-utils': 7.27.1
     transitivePeerDependencies:
       - supports-color
 
-  '@babel/plugin-transform-property-literals@7.25.9(@babel/core@7.26.10)':
+  '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/core': 7.27.1
+      '@babel/helper-plugin-utils': 7.27.1
 
-  '@babel/plugin-transform-regenerator@7.27.0(@babel/core@7.26.10)':
+  '@babel/plugin-transform-regenerator@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-plugin-utils': 7.26.5
-      regenerator-transform: 0.15.2
+      '@babel/core': 7.27.1
+      '@babel/helper-plugin-utils': 7.27.1
 
-  '@babel/plugin-transform-regexp-modifiers@7.26.0(@babel/core@7.26.10)':
+  '@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10)
-      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/core': 7.27.1
+      '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.1)
+      '@babel/helper-plugin-utils': 7.27.1
 
-  '@babel/plugin-transform-reserved-words@7.25.9(@babel/core@7.26.10)':
+  '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/core': 7.27.1
+      '@babel/helper-plugin-utils': 7.27.1
 
-  '@babel/plugin-transform-runtime@7.26.10(@babel/core@7.26.10)':
+  '@babel/plugin-transform-runtime@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-module-imports': 7.25.9
-      '@babel/helper-plugin-utils': 7.26.5
-      babel-plugin-polyfill-corejs2: 0.4.13(@babel/core@7.26.10)
-      babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.26.10)
-      babel-plugin-polyfill-regenerator: 0.6.4(@babel/core@7.26.10)
+      '@babel/core': 7.27.1
+      '@babel/helper-module-imports': 7.27.1
+      '@babel/helper-plugin-utils': 7.27.1
+      babel-plugin-polyfill-corejs2: 0.4.13(@babel/core@7.27.1)
+      babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.27.1)
+      babel-plugin-polyfill-regenerator: 0.6.4(@babel/core@7.27.1)
       semver: 6.3.1
     transitivePeerDependencies:
       - supports-color
 
-  '@babel/plugin-transform-shorthand-properties@7.25.9(@babel/core@7.26.10)':
+  '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/core': 7.27.1
+      '@babel/helper-plugin-utils': 7.27.1
 
-  '@babel/plugin-transform-spread@7.25.9(@babel/core@7.26.10)':
+  '@babel/plugin-transform-spread@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-plugin-utils': 7.26.5
-      '@babel/helper-skip-transparent-expression-wrappers': 7.25.9
+      '@babel/core': 7.27.1
+      '@babel/helper-plugin-utils': 7.27.1
+      '@babel/helper-skip-transparent-expression-wrappers': 7.27.1
     transitivePeerDependencies:
       - supports-color
 
-  '@babel/plugin-transform-sticky-regex@7.25.9(@babel/core@7.26.10)':
-    dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-plugin-utils': 7.26.5
-
-  '@babel/plugin-transform-template-literals@7.26.8(@babel/core@7.26.10)':
-    dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-plugin-utils': 7.26.5
-
-  '@babel/plugin-transform-typeof-symbol@7.27.0(@babel/core@7.26.10)':
-    dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-plugin-utils': 7.26.5
-
-  '@babel/plugin-transform-unicode-escapes@7.25.9(@babel/core@7.26.10)':
-    dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-plugin-utils': 7.26.5
-
-  '@babel/plugin-transform-unicode-property-regex@7.25.9(@babel/core@7.26.10)':
-    dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10)
-      '@babel/helper-plugin-utils': 7.26.5
-
-  '@babel/plugin-transform-unicode-regex@7.25.9(@babel/core@7.26.10)':
-    dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10)
-      '@babel/helper-plugin-utils': 7.26.5
-
-  '@babel/plugin-transform-unicode-sets-regex@7.25.9(@babel/core@7.26.10)':
-    dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10)
-      '@babel/helper-plugin-utils': 7.26.5
-
-  '@babel/preset-env@7.26.9(@babel/core@7.26.10)':
-    dependencies:
-      '@babel/compat-data': 7.26.8
-      '@babel/core': 7.26.10
-      '@babel/helper-compilation-targets': 7.27.0
-      '@babel/helper-plugin-utils': 7.26.5
-      '@babel/helper-validator-option': 7.25.9
-      '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.9(@babel/core@7.26.10)
-      '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.9(@babel/core@7.26.10)
-      '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.9(@babel/core@7.26.10)
-      '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.25.9(@babel/core@7.26.10)
-      '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.9(@babel/core@7.26.10)
-      '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.10)
-      '@babel/plugin-syntax-import-assertions': 7.26.0(@babel/core@7.26.10)
-      '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.10)
-      '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.26.10)
-      '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.26.10)
-      '@babel/plugin-transform-async-generator-functions': 7.26.8(@babel/core@7.26.10)
-      '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.26.10)
-      '@babel/plugin-transform-block-scoped-functions': 7.26.5(@babel/core@7.26.10)
-      '@babel/plugin-transform-block-scoping': 7.27.0(@babel/core@7.26.10)
-      '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.26.10)
-      '@babel/plugin-transform-class-static-block': 7.26.0(@babel/core@7.26.10)
-      '@babel/plugin-transform-classes': 7.25.9(@babel/core@7.26.10)
-      '@babel/plugin-transform-computed-properties': 7.25.9(@babel/core@7.26.10)
-      '@babel/plugin-transform-destructuring': 7.25.9(@babel/core@7.26.10)
-      '@babel/plugin-transform-dotall-regex': 7.25.9(@babel/core@7.26.10)
-      '@babel/plugin-transform-duplicate-keys': 7.25.9(@babel/core@7.26.10)
-      '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.10)
-      '@babel/plugin-transform-dynamic-import': 7.25.9(@babel/core@7.26.10)
-      '@babel/plugin-transform-exponentiation-operator': 7.26.3(@babel/core@7.26.10)
-      '@babel/plugin-transform-export-namespace-from': 7.25.9(@babel/core@7.26.10)
-      '@babel/plugin-transform-for-of': 7.26.9(@babel/core@7.26.10)
-      '@babel/plugin-transform-function-name': 7.25.9(@babel/core@7.26.10)
-      '@babel/plugin-transform-json-strings': 7.25.9(@babel/core@7.26.10)
-      '@babel/plugin-transform-literals': 7.25.9(@babel/core@7.26.10)
-      '@babel/plugin-transform-logical-assignment-operators': 7.25.9(@babel/core@7.26.10)
-      '@babel/plugin-transform-member-expression-literals': 7.25.9(@babel/core@7.26.10)
-      '@babel/plugin-transform-modules-amd': 7.25.9(@babel/core@7.26.10)
-      '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.10)
-      '@babel/plugin-transform-modules-systemjs': 7.25.9(@babel/core@7.26.10)
-      '@babel/plugin-transform-modules-umd': 7.25.9(@babel/core@7.26.10)
-      '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.10)
-      '@babel/plugin-transform-new-target': 7.25.9(@babel/core@7.26.10)
-      '@babel/plugin-transform-nullish-coalescing-operator': 7.26.6(@babel/core@7.26.10)
-      '@babel/plugin-transform-numeric-separator': 7.25.9(@babel/core@7.26.10)
-      '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.26.10)
-      '@babel/plugin-transform-object-super': 7.25.9(@babel/core@7.26.10)
-      '@babel/plugin-transform-optional-catch-binding': 7.25.9(@babel/core@7.26.10)
-      '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.10)
-      '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.10)
-      '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.26.10)
-      '@babel/plugin-transform-private-property-in-object': 7.25.9(@babel/core@7.26.10)
-      '@babel/plugin-transform-property-literals': 7.25.9(@babel/core@7.26.10)
-      '@babel/plugin-transform-regenerator': 7.27.0(@babel/core@7.26.10)
-      '@babel/plugin-transform-regexp-modifiers': 7.26.0(@babel/core@7.26.10)
-      '@babel/plugin-transform-reserved-words': 7.25.9(@babel/core@7.26.10)
-      '@babel/plugin-transform-shorthand-properties': 7.25.9(@babel/core@7.26.10)
-      '@babel/plugin-transform-spread': 7.25.9(@babel/core@7.26.10)
-      '@babel/plugin-transform-sticky-regex': 7.25.9(@babel/core@7.26.10)
-      '@babel/plugin-transform-template-literals': 7.26.8(@babel/core@7.26.10)
-      '@babel/plugin-transform-typeof-symbol': 7.27.0(@babel/core@7.26.10)
-      '@babel/plugin-transform-unicode-escapes': 7.25.9(@babel/core@7.26.10)
-      '@babel/plugin-transform-unicode-property-regex': 7.25.9(@babel/core@7.26.10)
-      '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.26.10)
-      '@babel/plugin-transform-unicode-sets-regex': 7.25.9(@babel/core@7.26.10)
-      '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.26.10)
-      babel-plugin-polyfill-corejs2: 0.4.13(@babel/core@7.26.10)
-      babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.26.10)
-      babel-plugin-polyfill-regenerator: 0.6.4(@babel/core@7.26.10)
+  '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.27.1)':
+    dependencies:
+      '@babel/core': 7.27.1
+      '@babel/helper-plugin-utils': 7.27.1
+
+  '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.27.1)':
+    dependencies:
+      '@babel/core': 7.27.1
+      '@babel/helper-plugin-utils': 7.27.1
+
+  '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.27.1)':
+    dependencies:
+      '@babel/core': 7.27.1
+      '@babel/helper-plugin-utils': 7.27.1
+
+  '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.27.1)':
+    dependencies:
+      '@babel/core': 7.27.1
+      '@babel/helper-plugin-utils': 7.27.1
+
+  '@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.27.1)':
+    dependencies:
+      '@babel/core': 7.27.1
+      '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.1)
+      '@babel/helper-plugin-utils': 7.27.1
+
+  '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.27.1)':
+    dependencies:
+      '@babel/core': 7.27.1
+      '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.1)
+      '@babel/helper-plugin-utils': 7.27.1
+
+  '@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.27.1)':
+    dependencies:
+      '@babel/core': 7.27.1
+      '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.1)
+      '@babel/helper-plugin-utils': 7.27.1
+
+  '@babel/preset-env@7.27.1(@babel/core@7.27.1)':
+    dependencies:
+      '@babel/compat-data': 7.27.1
+      '@babel/core': 7.27.1
+      '@babel/helper-compilation-targets': 7.27.1
+      '@babel/helper-plugin-utils': 7.27.1
+      '@babel/helper-validator-option': 7.27.1
+      '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.27.1)
+      '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.27.1)
+      '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-transform-async-generator-functions': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-transform-block-scoping': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-transform-class-static-block': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-transform-classes': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-transform-destructuring': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-transform-dotall-regex': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-transform-exponentiation-operator': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-transform-json-strings': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-transform-logical-assignment-operators': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-transform-modules-systemjs': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-transform-object-rest-spread': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-transform-parameters': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-transform-regenerator': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-transform-regexp-modifiers': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-transform-unicode-property-regex': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-transform-unicode-sets-regex': 7.27.1(@babel/core@7.27.1)
+      '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.27.1)
+      babel-plugin-polyfill-corejs2: 0.4.13(@babel/core@7.27.1)
+      babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.27.1)
+      babel-plugin-polyfill-regenerator: 0.6.4(@babel/core@7.27.1)
       core-js-compat: 3.41.0
       semver: 6.3.1
     transitivePeerDependencies:
       - supports-color
 
-  '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.26.10)':
+  '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/core': 7.27.1
+      '@babel/helper-plugin-utils': 7.27.1
       '@babel/types': 7.27.0
       esutils: 2.0.3
 
-  '@babel/runtime@7.27.0':
-    dependencies:
-      regenerator-runtime: 0.14.1
+  '@babel/runtime@7.27.1': {}
 
   '@babel/template@7.27.0':
     dependencies:
@@ -9048,10 +9178,16 @@ snapshots:
       '@babel/parser': 7.27.0
       '@babel/types': 7.27.0
 
+  '@babel/template@7.27.1':
+    dependencies:
+      '@babel/code-frame': 7.27.1
+      '@babel/parser': 7.27.1
+      '@babel/types': 7.27.1
+
   '@babel/traverse@7.27.0':
     dependencies:
       '@babel/code-frame': 7.26.2
-      '@babel/generator': 7.27.0
+      '@babel/generator': 7.27.1
       '@babel/parser': 7.27.0
       '@babel/template': 7.27.0
       '@babel/types': 7.27.0
@@ -9060,14 +9196,31 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
+  '@babel/traverse@7.27.1':
+    dependencies:
+      '@babel/code-frame': 7.27.1
+      '@babel/generator': 7.27.1
+      '@babel/parser': 7.27.1
+      '@babel/template': 7.27.1
+      '@babel/types': 7.27.1
+      debug: 4.4.0(supports-color@10.0.0)
+      globals: 11.12.0
+    transitivePeerDependencies:
+      - supports-color
+
   '@babel/types@7.27.0':
     dependencies:
       '@babel/helper-string-parser': 7.25.9
       '@babel/helper-validator-identifier': 7.25.9
 
+  '@babel/types@7.27.1':
+    dependencies:
+      '@babel/helper-string-parser': 7.27.1
+      '@babel/helper-validator-identifier': 7.27.1
+
   '@bazel/bazelisk@1.26.0': {}
 
-  '@bazel/buildifier@8.0.3': {}
+  '@bazel/buildifier@8.2.0': {}
 
   '@colors/colors@1.5.0': {}
 
@@ -9200,7 +9353,7 @@ snapshots:
 
   '@eslint-community/regexpp@4.12.1': {}
 
-  '@eslint/compat@1.2.8(eslint@9.25.1(jiti@1.21.7))':
+  '@eslint/compat@1.2.9(eslint@9.25.1(jiti@1.21.7))':
     optionalDependencies:
       eslint: 9.25.1(jiti@1.21.7)
 
@@ -11207,33 +11360,33 @@ snapshots:
 
   b4a@1.6.7: {}
 
-  babel-loader@10.0.0(@babel/core@7.26.10)(webpack@5.99.7(esbuild@0.25.3)):
+  babel-loader@10.0.0(@babel/core@7.27.1)(webpack@5.99.7(esbuild@0.25.3)):
     dependencies:
-      '@babel/core': 7.26.10
+      '@babel/core': 7.27.1
       find-up: 5.0.0
       webpack: 5.99.7(esbuild@0.25.3)
 
-  babel-plugin-polyfill-corejs2@0.4.13(@babel/core@7.26.10):
+  babel-plugin-polyfill-corejs2@0.4.13(@babel/core@7.27.1):
     dependencies:
       '@babel/compat-data': 7.26.8
-      '@babel/core': 7.26.10
-      '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.26.10)
+      '@babel/core': 7.27.1
+      '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.27.1)
       semver: 6.3.1
     transitivePeerDependencies:
       - supports-color
 
-  babel-plugin-polyfill-corejs3@0.11.1(@babel/core@7.26.10):
+  babel-plugin-polyfill-corejs3@0.11.1(@babel/core@7.27.1):
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.26.10)
+      '@babel/core': 7.27.1
+      '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.27.1)
       core-js-compat: 3.41.0
     transitivePeerDependencies:
       - supports-color
 
-  babel-plugin-polyfill-regenerator@0.6.4(@babel/core@7.26.10):
+  babel-plugin-polyfill-regenerator@0.6.4(@babel/core@7.27.1):
     dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.26.10)
+      '@babel/core': 7.27.1
+      '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.27.1)
     transitivePeerDependencies:
       - supports-color
 
@@ -13473,7 +13626,7 @@ snapshots:
 
   istanbul-lib-instrument@5.2.1:
     dependencies:
-      '@babel/core': 7.26.10
+      '@babel/core': 7.27.1
       '@babel/parser': 7.27.0
       '@istanbuljs/schema': 0.1.3
       istanbul-lib-coverage: 3.2.2
@@ -13483,7 +13636,7 @@ snapshots:
 
   istanbul-lib-instrument@6.0.3:
     dependencies:
-      '@babel/core': 7.26.10
+      '@babel/core': 7.27.1
       '@babel/parser': 7.27.0
       '@istanbuljs/schema': 0.1.3
       istanbul-lib-coverage: 3.2.2
@@ -13820,7 +13973,7 @@ snapshots:
       picocolors: 1.1.1
       shell-quote: 1.8.2
 
-  less-loader@12.2.0(less@4.3.0)(webpack@5.99.7(esbuild@0.25.3)):
+  less-loader@12.3.0(less@4.3.0)(webpack@5.99.7(esbuild@0.25.3)):
     dependencies:
       less: 4.3.0
     optionalDependencies:
@@ -14212,7 +14365,7 @@ snapshots:
 
   netmask@2.0.2: {}
 
-  ng-packagr@20.0.0-next.8(@angular/compiler-cli@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(typescript@5.8.3))(tslib@2.8.1)(typescript@5.8.3):
+  ng-packagr@20.0.0-rc.0(@angular/compiler-cli@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(typescript@5.8.3))(tslib@2.8.1)(typescript@5.8.3):
     dependencies:
       '@ampproject/remapping': 2.3.0
       '@angular/compiler-cli': 20.0.0-next.9(@angular/compiler@20.0.0-next.9)(typescript@5.8.3)
@@ -14427,7 +14580,7 @@ snapshots:
 
   only@0.0.2: {}
 
-  open@10.1.1:
+  open@10.1.2:
     dependencies:
       default-browser: 5.2.1
       define-lazy-prop: 3.0.0
@@ -14919,7 +15072,7 @@ snapshots:
 
   quick-format-unescaped@4.0.4: {}
 
-  quicktype-core@23.1.1(encoding@0.1.13):
+  quicktype-core@23.1.3(encoding@0.1.13):
     dependencies:
       '@glideapps/ts-necessities': 2.2.3
       browser-or-node: 3.0.0
@@ -15021,12 +15174,6 @@ snapshots:
 
   regenerate@1.4.2: {}
 
-  regenerator-runtime@0.14.1: {}
-
-  regenerator-transform@0.15.2:
-    dependencies:
-      '@babel/runtime': 7.27.0
-
   regex-parser@2.3.1: {}
 
   regexp.prototype.flags@1.5.4:
@@ -16435,7 +16582,7 @@ snapshots:
       http-proxy-middleware: 2.0.9(@types/express@4.17.21)
       ipaddr.js: 2.2.0
       launch-editor: 2.10.0
-      open: 10.1.1
+      open: 10.1.2
       p-retry: 6.2.1
       schema-utils: 4.3.2
       selfsigned: 2.4.1

From 7bb1f87478d441e35b73b920c8bfcd4376a3422d Mon Sep 17 00:00:00 2001
From: Charles Lyding <19598772+clydin@users.noreply.github.com>
Date: Thu, 1 May 2025 10:35:19 -0400
Subject: [PATCH 005/138] fix(@angular/build): enable unit-test reporters
 option

The `unit-test` builder's `reporters` option will now pass through the
values to the underlying unit-test runner. This allows customization of
the reporters used when executing tests.
The `unit-test` builder is currently considered experimental.

(cherry picked from commit 457b447a1ac4daf65a5f9d85d77b4182421ebccc)
---
 packages/angular/build/src/builders/unit-test/builder.ts | 1 +
 1 file changed, 1 insertion(+)

diff --git a/packages/angular/build/src/builders/unit-test/builder.ts b/packages/angular/build/src/builders/unit-test/builder.ts
index 2ba2f140e8bb..7e630553a30e 100644
--- a/packages/angular/build/src/builders/unit-test/builder.ts
+++ b/packages/angular/build/src/builders/unit-test/builder.ts
@@ -190,6 +190,7 @@ export async function* execute(
         environment: browser ? 'node' : 'jsdom',
         watch: normalizedOptions.watch,
         browser,
+        reporters: normalizedOptions.reporters ?? ['default'],
         coverage: {
           enabled: normalizedOptions.codeCoverage,
           exclude: normalizedOptions.codeCoverageExclude,

From 0aea13e783795b5584f0dd18fc2b1f84bab883f9 Mon Sep 17 00:00:00 2001
From: Jan Martin <jan.krems@gmail.com>
Date: Thu, 1 May 2025 09:44:35 -0700
Subject: [PATCH 006/138] refactor(@angular-devkit/core): don't use concrete
 type as interface

(cherry picked from commit 7ee4458d92d4a53c9909b8e9f3fae383de23dc20)
---
 goldens/public-api/angular_devkit/core/index.api.md         | 4 ++--
 .../angular_devkit/core/src/utils/partially-ordered-set.ts  | 6 +++---
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/goldens/public-api/angular_devkit/core/index.api.md b/goldens/public-api/angular_devkit/core/index.api.md
index 3dd0c8d848bb..61747760e753 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<T> implements Set<T> {
+export class PartiallyOrderedSet<T> {
     // (undocumented)
     [Symbol.iterator](): IterableIterator<T, undefined, unknown>;
     // (undocumented)
-    get [Symbol.toStringTag](): 'Set';
+    get [Symbol.toStringTag](): 'PartiallyOrderedSet';
     // (undocumented)
     add(item: T, deps?: Set<T> | T[]): this;
     // (undocumented)
diff --git a/packages/angular_devkit/core/src/utils/partially-ordered-set.ts b/packages/angular_devkit/core/src/utils/partially-ordered-set.ts
index 0defba38e01b..9aa37f467ba6 100644
--- a/packages/angular_devkit/core/src/utils/partially-ordered-set.ts
+++ b/packages/angular_devkit/core/src/utils/partially-ordered-set.ts
@@ -19,7 +19,7 @@ export class CircularDependencyFoundException extends BaseException {
   }
 }
 
-export class PartiallyOrderedSet<T> implements Set<T> {
+export class PartiallyOrderedSet<T> {
   private _items = new Map<T, Set<T>>();
 
   protected _checkCircularDependencies(item: T, deps: Set<T>): void {
@@ -161,7 +161,7 @@ export class PartiallyOrderedSet<T> implements Set<T> {
     return undefined;
   }
 
-  get [Symbol.toStringTag](): 'Set' {
-    return 'Set';
+  get [Symbol.toStringTag](): 'PartiallyOrderedSet' {
+    return 'PartiallyOrderedSet';
   }
 }

From a6a0b41cdc4f1e92fd64c04d4bcd29ec34495d87 Mon Sep 17 00:00:00 2001
From: Angular Robot <angular-robot@google.com>
Date: Thu, 1 May 2025 06:03:20 +0000
Subject: [PATCH 007/138] build: update rules_angular digest to 3ba9d67

(cherry picked from commit 6e9a0549269809e0b799ddf4649f5a958a3abb2a)
---
 WORKSPACE | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/WORKSPACE b/WORKSPACE
index 61026d7b4e4b..62b9f1c1e01e 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -262,7 +262,7 @@ esbuild_register_toolchains(
 
 git_repository(
     name = "rules_angular",
-    commit = "755e5c7c967d38158a4e5defacd2e2e34090e54d",
+    commit = "3ba9d6790055543de2125e11967d3b5a7c7b314d",
     remote = "https://github.com/devversion/rules_angular.git",
 )
 

From 901ab60d9f63fcff17213dbf7fe17e4a46835974 Mon Sep 17 00:00:00 2001
From: Charles Lyding <19598772+clydin@users.noreply.github.com>
Date: Mon, 28 Apr 2025 17:46:52 -0400
Subject: [PATCH 008/138] fix(@schematics/angular): remove explicit index
 option from new applications

With the index option now defaulting to `<project_source_root>/index.html`
for the `application` build system, the explicit value present in new
applications is no longer required. This removal further reduces the size
of the `angular.json` file for new projects.

(cherry picked from commit b1afa31a7996eec4750aff8c19a247bb6a03d06a)
---
 packages/schematics/angular/application/index.ts               | 1 -
 packages/schematics/angular/application/index_spec.ts          | 3 +--
 tests/legacy-cli/e2e/initialize/500-create-project.ts          | 1 +
 tests/legacy-cli/e2e/tests/build/jit-ngmodule.ts               | 1 +
 .../e2e/tests/build/prerender/discover-routes-ngmodule.ts      | 1 +
 tests/legacy-cli/e2e/tests/build/rebuild-dot-dirname.ts        | 1 +
 tests/legacy-cli/e2e/tests/build/relative-sourcemap.ts         | 1 +
 .../tests/build/server-rendering/express-engine-ngmodule.ts    | 1 +
 8 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/packages/schematics/angular/application/index.ts b/packages/schematics/angular/application/index.ts
index 5e9f379aed5e..825f98c04158 100644
--- a/packages/schematics/angular/application/index.ts
+++ b/packages/schematics/angular/application/index.ts
@@ -256,7 +256,6 @@ function addAppToWorkspaceFile(
         builder: Builders.BuildApplication,
         defaultConfiguration: 'production',
         options: {
-          index: `${sourceRoot}/index.html`,
           browser: `${sourceRoot}/main.ts`,
           polyfills: options.zoneless ? undefined : ['zone.js'],
           tsConfig: `${projectRoot}tsconfig.app.json`,
diff --git a/packages/schematics/angular/application/index_spec.ts b/packages/schematics/angular/application/index_spec.ts
index 0607a20b766e..458f91d6eef0 100644
--- a/packages/schematics/angular/application/index_spec.ts
+++ b/packages/schematics/angular/application/index_spec.ts
@@ -330,7 +330,7 @@ describe('Application Schematic', () => {
       const prj = config.projects.foo;
       expect(prj.root).toEqual('');
       const buildOpt = prj.architect.build.options;
-      expect(buildOpt.index).toEqual('src/index.html');
+      expect(buildOpt.index).toBeUndefined();
       expect(buildOpt.browser).toEqual('src/main.ts');
       expect(buildOpt.assets).toEqual([{ 'glob': '**/*', 'input': 'public' }]);
       expect(buildOpt.polyfills).toEqual(['zone.js']);
@@ -421,7 +421,6 @@ describe('Application Schematic', () => {
       const project = config.projects.foo;
       expect(project.root).toEqual('foo');
       const buildOpt = project.architect.build.options;
-      expect(buildOpt.index).toEqual('foo/src/index.html');
       expect(buildOpt.browser).toEqual('foo/src/main.ts');
       expect(buildOpt.polyfills).toEqual(['zone.js']);
       expect(buildOpt.tsConfig).toEqual('foo/tsconfig.app.json');
diff --git a/tests/legacy-cli/e2e/initialize/500-create-project.ts b/tests/legacy-cli/e2e/initialize/500-create-project.ts
index d641365b9276..837f54efbcde 100644
--- a/tests/legacy-cli/e2e/initialize/500-create-project.ts
+++ b/tests/legacy-cli/e2e/initialize/500-create-project.ts
@@ -35,6 +35,7 @@ export default async function () {
           main: build.options.browser,
           browser: undefined,
           outputPath: 'dist/test-project/browser',
+          index: 'src/index.html',
         };
 
         build.configurations.development = {
diff --git a/tests/legacy-cli/e2e/tests/build/jit-ngmodule.ts b/tests/legacy-cli/e2e/tests/build/jit-ngmodule.ts
index 8ce44ea32386..910f8993a16d 100644
--- a/tests/legacy-cli/e2e/tests/build/jit-ngmodule.ts
+++ b/tests/legacy-cli/e2e/tests/build/jit-ngmodule.ts
@@ -24,6 +24,7 @@ export default async function () {
         browser: undefined,
         buildOptimizer: false,
         outputPath: 'dist/test-project-two',
+        index: 'src/index.html',
       };
 
       build.configurations.development = {
diff --git a/tests/legacy-cli/e2e/tests/build/prerender/discover-routes-ngmodule.ts b/tests/legacy-cli/e2e/tests/build/prerender/discover-routes-ngmodule.ts
index cc79e32f9185..9d4843e00f7d 100644
--- a/tests/legacy-cli/e2e/tests/build/prerender/discover-routes-ngmodule.ts
+++ b/tests/legacy-cli/e2e/tests/build/prerender/discover-routes-ngmodule.ts
@@ -19,6 +19,7 @@ export default async function () {
         ...build.options,
         main: build.options.browser,
         browser: undefined,
+        index: 'src/index.html',
       };
 
       build.configurations.development = {
diff --git a/tests/legacy-cli/e2e/tests/build/rebuild-dot-dirname.ts b/tests/legacy-cli/e2e/tests/build/rebuild-dot-dirname.ts
index ca6ab8ad2886..ed5f12ed94c1 100644
--- a/tests/legacy-cli/e2e/tests/build/rebuild-dot-dirname.ts
+++ b/tests/legacy-cli/e2e/tests/build/rebuild-dot-dirname.ts
@@ -34,6 +34,7 @@ export default async function () {
           main: build.options.browser,
           browser: undefined,
           outputPath: 'dist/subdirectory-test-project',
+          index: 'src/index.html',
         };
 
         build.configurations.development = {
diff --git a/tests/legacy-cli/e2e/tests/build/relative-sourcemap.ts b/tests/legacy-cli/e2e/tests/build/relative-sourcemap.ts
index 789b52748796..11b2cccd082b 100644
--- a/tests/legacy-cli/e2e/tests/build/relative-sourcemap.ts
+++ b/tests/legacy-cli/e2e/tests/build/relative-sourcemap.ts
@@ -19,6 +19,7 @@ export default async function () {
         main: build.options.browser,
         browser: undefined,
         outputPath: 'dist/secondary-project',
+        index: 'src/index.html',
       };
 
       build.configurations.development = {
diff --git a/tests/legacy-cli/e2e/tests/build/server-rendering/express-engine-ngmodule.ts b/tests/legacy-cli/e2e/tests/build/server-rendering/express-engine-ngmodule.ts
index 2fa393de929f..f05d2182bbd2 100644
--- a/tests/legacy-cli/e2e/tests/build/server-rendering/express-engine-ngmodule.ts
+++ b/tests/legacy-cli/e2e/tests/build/server-rendering/express-engine-ngmodule.ts
@@ -32,6 +32,7 @@ export default async function () {
         ...build.options,
         main: build.options.browser,
         browser: undefined,
+        index: 'src/index.html',
       };
 
       build.configurations.development = {

From fa0a06f9f92b28929fc775074245a0b97c3d9adc Mon Sep 17 00:00:00 2001
From: Charles Lyding <19598772+clydin@users.noreply.github.com>
Date: Mon, 28 Apr 2025 20:37:11 -0400
Subject: [PATCH 009/138] fix(@angular/pwa): support using default index option
 when not present

The `@angular/pwa` add schematic now attempts to discover a default index
option value if a configuration usage path within the build target is
possible. The default value as per the `application` build system is
`<project_source_root>/index.html`.

(cherry picked from commit 8129483b1908ef3f8a2160ec9e25bf424a59406c)
---
 packages/angular/pwa/pwa/index.ts | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/packages/angular/pwa/pwa/index.ts b/packages/angular/pwa/pwa/index.ts
index 28b0bc864522..f78095b7a564 100644
--- a/packages/angular/pwa/pwa/index.ts
+++ b/packages/angular/pwa/pwa/index.ts
@@ -110,9 +110,12 @@ export default function (options: PwaOptions): Rule {
 
     // Find all index.html files in build targets
     const indexFiles = new Set<string>();
+    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 +125,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 +134,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;
 

From 1cd65a08d5278134115f33ff0e666aee420faf8a Mon Sep 17 00:00:00 2001
From: Alan Agius <17563226+alan-agius4@users.noreply.github.com>
Date: Mon, 28 Apr 2025 10:05:22 +0000
Subject: [PATCH 010/138] fix(@angular/build): perform testing module cleanup
 when using Vitest

Ensure proper cleanup of the Angular testing module when running tests with Vitest.

Closes: #30186
(cherry picked from commit 8e0b14fd0704eb4ad2e49f836462dc1a186b28c2)
---
 packages/angular/build/src/builders/unit-test/builder.ts | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/packages/angular/build/src/builders/unit-test/builder.ts b/packages/angular/build/src/builders/unit-test/builder.ts
index 7e630553a30e..9eb1a552bdd6 100644
--- a/packages/angular/build/src/builders/unit-test/builder.ts
+++ b/packages/angular/build/src/builders/unit-test/builder.ts
@@ -124,8 +124,14 @@ export async function* execute(
     loadContent: async () => {
       const contents: string[] = [
         // Initialize the Angular testing environment
-        `import { getTestBed } from '@angular/core/testing';`,
+        `import { getTestBed, ɵgetCleanupHook as getCleanupHook } from '@angular/core/testing';`,
         `import { BrowserTestingModule, platformBrowserTesting } from '@angular/platform-browser/testing';`,
+        `import { beforeEach, afterEach } from 'vitest';`,
+        '',
+        // Same as https://github.com/angular/angular/blob/05a03d3f975771bb59c7eefd37c01fa127ee2229/packages/core/testing/src/test_hooks.ts#L21-L29
+        `beforeEach(getCleanupHook(false));`,
+        `afterEach(getCleanupHook(true));`,
+        '',
         `getTestBed().initTestEnvironment(BrowserTestingModule, platformBrowserTesting(), {`,
         `  errorOnUnknownElements: true,`,
         `  errorOnUnknownProperties: true,`,

From c8ceecaa48f7581167c1bbdb545579da84806f32 Mon Sep 17 00:00:00 2001
From: Paul Gschwendtner <paulgschwendtner@gmail.com>
Date: Wed, 30 Apr 2025 17:28:06 +0000
Subject: [PATCH 011/138] ci: try simplify windows test preparation with bazel
 7

Simplifies the windows symlink script and fixes potential issues related
to concurrency that might have caused "module not find" errors at test
execution later.

(cherry picked from commit 71832ead0ae30dadef26d8ca4163e9f66121924b)
---
 .bazelrc                                     |    3 -
 .bazelversion                                |    2 +-
 MODULE.bazel.lock                            | 1522 +-----------------
 scripts/windows-testing/convert-symlinks.mjs |  125 +-
 4 files changed, 44 insertions(+), 1608 deletions(-)

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..93c8ddab9fef 100644
--- a/.bazelversion
+++ b/.bazelversion
@@ -1 +1 @@
-7.4.0
+7.6.0
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/scripts/windows-testing/convert-symlinks.mjs b/scripts/windows-testing/convert-symlinks.mjs
index 554b42fc7f15..168e4adba19e 100644
--- a/scripts/windows-testing/convert-symlinks.mjs
+++ b/scripts/windows-testing/convert-symlinks.mjs
@@ -26,97 +26,64 @@ const skipDirectories = [
   '_windows_amd64/bin/nodejs/node_modules',
 ];
 
-const workspaceRootPaths = [/.*\.runfiles\/_main\//, /^.*-fastbuild\/bin\//];
-
-// Copying can be parallelized and doesn't cause any WSL flakiness (no exe is invoked).
-const parallelCopyTasks = [];
+// Dereferencing can be parallelized and doesn't cause any WSL flakiness (no exe is invoked).
+const dereferenceFns = [];
+// Re-linking can be parallelized, but should only be in batched. WSL exe is involved and it can be flaky.
+// Note: Relinking should not happen during removing & copying of dereference tasks.
+const relinkFns = [];
 
 async function transformDir(p) {
-  // We perform all command executions in parallel here to speed up.
-  // Note that we can't parallelize for the full recursive directory,
-  // as WSL and its interop would otherwise end up with some flaky errors.
-  // See: https://github.com/microsoft/WSL/issues/8677.
-  const tasks = [];
   // We explore directories after all files were checked at this level.
   const directoriesToVisit = [];
 
   for (const file of await fs.readdir(p, { withFileTypes: true })) {
     const subPath = path.join(p, file.name);
-
     if (skipDirectories.some((d) => subPath.endsWith(d))) {
       continue;
     }
 
     if (file.isSymbolicLink()) {
-      // Allow for parallel processing of directory entries.
-      tasks.push(
-        (async () => {
-          let target = '';
-          try {
-            target = await fs.realpath(subPath);
-          } catch (e) {
-            if (debug) {
-              console.error('Skipping', subPath);
-            }
-            return;
-          }
-
-          await fs.rm(subPath);
-
-          const subPathId = relativizeForSimilarWorkspacePaths(subPath);
-          const targetPathId = relativizeForSimilarWorkspacePaths(target);
-          const isSelfLink = subPathId === targetPathId;
+      let realTarget = '';
+      let linkTarget = '';
+
+      try {
+        realTarget = await fs.realpath(subPath);
+        linkTarget = await fs.readlink(subPath);
+      } catch (e) {
+        throw new Error(`Skipping; cannot dereference & read link: ${subPath}: ${e}`);
+      }
 
-          // This is an actual file that needs to be copied. Copy contents.
-          //   - the target path is equivalent to the link. This is a self-link from `.runfiles` to `bin/`.
-          //   - the target path is outside any of our workspace roots.
-          if (isSelfLink || targetPathId.startsWith('..')) {
-            parallelCopyTasks.push(exec(`cp -Rf ${target} ${subPath}`));
-            return;
-          }
+      // Transform relative links but preserve them.
+      // This is needed for pnpm.
+      if (!path.isAbsolute(linkTarget)) {
+        relinkFns.push(async () => {
+          const wslSubPath = path.relative(rootDir, subPath).replace(/\//g, '\\');
+          const linkTargetWindowsPath = linkTarget.replace(/\//g, '\\');
 
-          const relativeSubPath = relativizeToRoot(subPath);
-          const targetAtDestination = path.relative(path.dirname(subPathId), targetPathId);
-          const targetAtDestinationWindowsPath = targetAtDestination.replace(/\//g, '\\');
-
-          const wslSubPath = relativeSubPath.replace(/\//g, '\\');
-
-          if (debug) {
-            console.log({
-              targetAtDestination,
-              subPath,
-              relativeSubPath,
-              target,
-              targetPathId,
-              subPathId,
-            });
-          }
+          await fs.unlink(subPath);
 
-          if ((await fs.stat(target)).isDirectory()) {
+          if ((await fs.stat(realTarget)).isDirectory()) {
             // This is a symlink to a directory, create a dir junction.
             // Re-create this symlink on the Windows FS using the Windows mklink command.
-            await exec(
-              `${cmdPath} /c mklink /d "${wslSubPath}" "${targetAtDestinationWindowsPath}"`,
-            );
+            await exec(`${cmdPath} /c mklink /d "${wslSubPath}" "${linkTargetWindowsPath}"`);
           } else {
             // This is a symlink to a file, create a file junction.
             // Re-create this symlink on the Windows FS using the Windows mklink command.
-            await exec(`${cmdPath} /c mklink "${wslSubPath}" "${targetAtDestinationWindowsPath}"`);
+            await exec(`${cmdPath} /c mklink "${wslSubPath}" "${linkTargetWindowsPath}"`);
           }
-        })(),
-      );
+        });
+      } else {
+        dereferenceFns.push(async () => {
+          await fs.unlink(subPath);
+          await fs.cp(realTarget, subPath, { recursive: true });
+        });
+      }
     } else if (file.isDirectory()) {
       directoriesToVisit.push(subPath);
     }
   }
 
-  // Wait for all commands/tasks to complete, executed in parallel.
-  await Promise.all(tasks);
-
-  // Descend into other directories, sequentially to avoid WSL interop errors.
-  for (const d of directoriesToVisit) {
-    await transformDir(d);
-  }
+  await Promise.all(directoriesToVisit.map((d) => transformDir(d)));
 }
 
 function exec(cmd, maxRetries = 2) {
@@ -143,27 +110,19 @@ function exec(cmd, maxRetries = 2) {
   });
 }
 
-function relativizeForSimilarWorkspacePaths(p) {
-  const workspaceRootMatch = workspaceRootPaths.find((r) => r.test(p));
-  if (workspaceRootMatch !== undefined) {
-    return p.replace(workspaceRootMatch, '');
-  }
+try {
+  await transformDir(rootDir);
 
-  return path.relative(rootDir, p);
-}
+  // Dereference first.
+  await Promise.all(dereferenceFns.map((fn) => fn()));
 
-function relativizeToRoot(p) {
-  const res = path.relative(rootDir, p);
-  if (!res.startsWith('..')) {
-    return res;
+  // Re-link symlinks to work inside Windows.
+  // This is done in batches to avoid flakiness due to WSL
+  // See: https://github.com/microsoft/WSL/issues/8677.
+  const batchSize = 100;
+  for (let i = 0; i < relinkFns.length; i += batchSize) {
+    await Promise.all(relinkFns.slice(i, i + batchSize).map((fn) => fn()));
   }
-
-  throw new Error('Could not relativize to root: ' + p);
-}
-
-try {
-  await transformDir(rootDir);
-  await Promise.all(parallelCopyTasks);
 } catch (err) {
   console.error('Could not convert symlinks:', err);
   process.exitCode = 1;

From ba844ae16922961cef306553e49ce91b856f94d2 Mon Sep 17 00:00:00 2001
From: Charles Lyding <19598772+clydin@users.noreply.github.com>
Date: Thu, 1 May 2025 12:53:38 -0400
Subject: [PATCH 012/138] fix(@angular/build): avoid internal karma request
 cache for assets

The internal karma common middleware that handles requests converts
the to be cached data into a string when stored. This can lead to invalid data
when the cached string is then sent in a followup request if the original content
was not intended to be a string. To avoid this  problem, asset files are now
explicitly not cached by karma's middleware.
Ref: https://github.com/karma-runner/karma/blob/84f85e7016efc2266fa6b3465f494a3fa151c85c/lib/middleware/common.js#L72

(cherry picked from commit 90d1db3df9a915a78c287ecc008837e5f8301279)
---
 .../src/builders/karma/application_builder.ts |  2 +-
 .../karma/tests/behavior/rebuilds_spec.ts     | 55 +++++++++++++++++++
 2 files changed, 56 insertions(+), 1 deletion(-)

diff --git a/packages/angular/build/src/builders/karma/application_builder.ts b/packages/angular/build/src/builders/karma/application_builder.ts
index c73dbbe7fbe6..fc92ed59dbc0 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.
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<void>;
+      }
+
+      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);
+    });
   });
 });

From 22ba07444192872278c7508b4af084fd39f9b3bd Mon Sep 17 00:00:00 2001
From: Youri Tomassen <gretch552@gmail.com>
Date: Fri, 2 May 2025 15:54:37 +0200
Subject: [PATCH 013/138] perf(@angular/build): fix unnecessary esbuild
 rebuilds

When using esbuild, Angular sets up a custom file watcher using esbuilds metafile inputs. Esbuild will generate <define:KEY> entries see https://esbuild.github.io/try/#YgAwLjI1LjMALS1kZWZpbmU6Rk9PPSd7fScgLS1tZXRhZmlsZSAtLWJ1bmRsZQBlAGVudHJ5LmpzAGNvbnNvbGUubG9nKEZPTyk. After the build is finished, the file watcher will notice that the <define:KEY> entries no longer exist on the file system and trigger a rebuild even though no files have changed.
This change, fixes the above issue by filtering files starting with `<define:`.

(cherry picked from commit f73e3a3b7d8fadbc370bb2c565357af3be935227)
---
 .../build/src/tools/esbuild/bundler-context.ts       | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/packages/angular/build/src/tools/esbuild/bundler-context.ts b/packages/angular/build/src/tools/esbuild/bundler-context.ts
index a551ae4defba..0d6b3d59ceaf 100644
--- a/packages/angular/build/src/tools/esbuild/bundler-context.ts
+++ b/packages/angular/build/src/tools/esbuild/bundler-context.ts
@@ -245,7 +245,7 @@ export class BundlerContext {
         // When incremental always add any files from the load result cache
         if (this.#loadCache) {
           for (const file of this.#loadCache.watchFiles) {
-            if (!isInternalAngularFile(file)) {
+            if (!isInternalAngularFileOrEsBuildDefine(file)) {
               // watch files are fully resolved paths
               this.watchFiles.add(file);
             }
@@ -260,7 +260,7 @@ 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)) {
+        if (!isInternalAngularFileOrEsBuildDefine(input)) {
           // input file paths are always relative to the workspace root
           this.watchFiles.add(join(this.workspaceRoot, input));
         }
@@ -417,12 +417,12 @@ export class BundlerContext {
   #addErrorsToWatch(result: BuildFailure | BuildResult): void {
     for (const error of result.errors) {
       let file = error.location?.file;
-      if (file && !isInternalAngularFile(file)) {
+      if (file && !isInternalAngularFileOrEsBuildDefine(file)) {
         this.watchFiles.add(join(this.workspaceRoot, file));
       }
       for (const note of error.notes) {
         file = note.location?.file;
-        if (file && !isInternalAngularFile(file)) {
+        if (file && !isInternalAngularFileOrEsBuildDefine(file)) {
           this.watchFiles.add(join(this.workspaceRoot, file));
         }
       }
@@ -475,6 +475,6 @@ export class BundlerContext {
   }
 }
 
-function isInternalAngularFile(file: string) {
-  return file.startsWith('angular:');
+function isInternalAngularFileOrEsBuildDefine(file: string) {
+  return file.startsWith('angular:') || file.startsWith('<define:');
 }

From ce0349054f96397d9a55f8bbdfb463c3dbb396c5 Mon Sep 17 00:00:00 2001
From: Paul Gschwendtner <paulgschwendtner@gmail.com>
Date: Sat, 3 May 2025 08:00:36 +0000
Subject: [PATCH 014/138] build: improve stability of windows jobs further
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

With the recent commit to rework the convert symlink script, we
addressed the high flakiness of module resolution errors due to
broken/missing symlinks. Though, this commit introduces a new source of
flakiness that we tried to avoid in the past— running too many WSL exe's
at the same time. We fix this by reducing the batch size and adding
another retry for safety.

In addition, the patch branch uses an older NodeJS version where
`fs.cp` seems to have issues when the source files are readonly— so we
fix that by just invoking the shell's `cp` command. That one works

(cherry picked from commit 7170f406b2b540a62ecc99df0c50f35f7106f590)
---
 scripts/windows-testing/convert-symlinks.mjs | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/scripts/windows-testing/convert-symlinks.mjs b/scripts/windows-testing/convert-symlinks.mjs
index 168e4adba19e..a170e350dae2 100644
--- a/scripts/windows-testing/convert-symlinks.mjs
+++ b/scripts/windows-testing/convert-symlinks.mjs
@@ -75,7 +75,8 @@ async function transformDir(p) {
       } else {
         dereferenceFns.push(async () => {
           await fs.unlink(subPath);
-          await fs.cp(realTarget, subPath, { recursive: true });
+          // Note: NodeJS `fs.cp` can have issues when sources are readonly.
+          await exec(`cp -R ${realTarget} ${subPath}`);
         });
       }
     } else if (file.isDirectory()) {
@@ -86,7 +87,7 @@ async function transformDir(p) {
   await Promise.all(directoriesToVisit.map((d) => transformDir(d)));
 }
 
-function exec(cmd, maxRetries = 2) {
+function exec(cmd, maxRetries = 3) {
   return new Promise((resolve, reject) => {
     childProcess.exec(cmd, { cwd: rootDir }, (error) => {
       if (error !== null) {
@@ -119,7 +120,7 @@ try {
   // Re-link symlinks to work inside Windows.
   // This is done in batches to avoid flakiness due to WSL
   // See: https://github.com/microsoft/WSL/issues/8677.
-  const batchSize = 100;
+  const batchSize = 75;
   for (let i = 0; i < relinkFns.length; i += batchSize) {
     await Promise.all(relinkFns.slice(i, i + batchSize).map((fn) => fn()));
   }

From 3fb0e3e1f6d1b680f00ff4a449ea8d935267febd Mon Sep 17 00:00:00 2001
From: Alan Agius <17563226+alan-agius4@users.noreply.github.com>
Date: Mon, 5 May 2025 12:46:43 +0000
Subject: [PATCH 015/138] refactor: update `Piscina` to version 5

Update code to reflect changes.

(cherry picked from commit 0f742543fd6736b0ee38efffad07de1fc6c84cce)
---
 packages/angular/build/package.json              |  2 +-
 packages/angular/build/src/utils/worker-pool.ts  |  2 +-
 .../angular_devkit/build_angular/package.json    |  2 +-
 pnpm-lock.yaml                                   | 16 ++++++++++++----
 4 files changed, 15 insertions(+), 7 deletions(-)

diff --git a/packages/angular/build/package.json b/packages/angular/build/package.json
index 55c90305eb2a..f7614b10f331 100644
--- a/packages/angular/build/package.json
+++ b/packages/angular/build/package.json
@@ -36,7 +36,7 @@
     "mrmime": "2.0.1",
     "parse5-html-rewriting-stream": "7.1.0",
     "picomatch": "4.0.2",
-    "piscina": "4.9.2",
+    "piscina": "5.0.0",
     "rollup": "4.40.1",
     "sass": "1.87.0",
     "semver": "7.7.1",
diff --git a/packages/angular/build/src/utils/worker-pool.ts b/packages/angular/build/src/utils/worker-pool.ts
index ca35f7edb46b..3a4b3def27cb 100644
--- a/packages/angular/build/src/utils/worker-pool.ts
+++ b/packages/angular/build/src/utils/worker-pool.ts
@@ -18,7 +18,7 @@ export class WorkerPool extends Piscina {
       idleTimeout: 1000,
       // 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_devkit/build_angular/package.json b/packages/angular_devkit/build_angular/package.json
index d2fcd3e41ac9..b5c4a62b6bf9 100644
--- a/packages/angular_devkit/build_angular/package.json
+++ b/packages/angular_devkit/build_angular/package.json
@@ -43,7 +43,7 @@
     "open": "10.1.2",
     "ora": "5.4.1",
     "picomatch": "4.0.2",
-    "piscina": "4.9.2",
+    "piscina": "5.0.0",
     "postcss": "8.5.3",
     "postcss-loader": "8.1.1",
     "resolve-url-loader": "5.0.0",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index ce3b306958de..8cba64c6c378 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -401,8 +401,8 @@ importers:
         specifier: 4.0.2
         version: 4.0.2
       piscina:
-        specifier: 4.9.2
-        version: 4.9.2
+        specifier: 5.0.0
+        version: 5.0.0
       rollup:
         specifier: 4.40.1
         version: 4.40.1
@@ -693,8 +693,8 @@ importers:
         specifier: 4.0.2
         version: 4.0.2
       piscina:
-        specifier: 4.9.2
-        version: 4.9.2
+        specifier: 5.0.0
+        version: 5.0.0
       postcss:
         specifier: 8.5.3
         version: 8.5.3
@@ -6621,6 +6621,10 @@ packages:
   piscina@4.9.2:
     resolution: {integrity: sha512-Fq0FERJWFEUpB4eSY59wSNwXD4RYqR+nR/WiEVcZW8IWfVBxJJafcgTEZDQo8k3w0sUarJ8RyVbbUF4GQ2LGbQ==}
 
+  piscina@5.0.0:
+    resolution: {integrity: sha512-R+arufwL7sZvGjAhSMK3TfH55YdGOqhpKXkcwQJr432AAnJX/xxX19PA4QisrmJ+BTTfZVggaz6HexbkQq1l1Q==}
+    engines: {node: '>=18.x'}
+
   pkg-dir@4.2.0:
     resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==}
     engines: {node: '>=8'}
@@ -14834,6 +14838,10 @@ snapshots:
     optionalDependencies:
       '@napi-rs/nice': 1.0.1
 
+  piscina@5.0.0:
+    optionalDependencies:
+      '@napi-rs/nice': 1.0.1
+
   pkg-dir@4.2.0:
     dependencies:
       find-up: 4.1.0

From f3eee8e3c80066f242a2808c5d31b0c84ff50d1c Mon Sep 17 00:00:00 2001
From: Angular Robot <angular-robot@google.com>
Date: Mon, 5 May 2025 13:11:04 +0000
Subject: [PATCH 016/138] build: update all non-major dependencies

(cherry picked from commit e0d3fbe710237e123c6700435df2a7dd62b288fa)
---
 package.json                        |   4 +-
 packages/angular/build/package.json |   2 +-
 pnpm-lock.yaml                      | 186 ++++++++++++++++++----------
 3 files changed, 126 insertions(+), 66 deletions(-)

diff --git a/package.json b/package.json
index a3decf640660..d66041764a60 100644
--- a/package.json
+++ b/package.json
@@ -64,7 +64,7 @@
     "@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",
@@ -102,7 +102,7 @@
     "buffer": "6.0.3",
     "esbuild": "0.25.3",
     "esbuild-wasm": "0.25.3",
-    "eslint": "9.25.1",
+    "eslint": "9.26.0",
     "eslint-config-prettier": "10.1.2",
     "eslint-plugin-header": "3.1.1",
     "eslint-plugin-import": "2.31.0",
diff --git a/packages/angular/build/package.json b/packages/angular/build/package.json
index f7614b10f331..fb3643b72adc 100644
--- a/packages/angular/build/package.json
+++ b/packages/angular/build/package.json
@@ -42,7 +42,7 @@
     "semver": "7.7.1",
     "source-map-support": "0.5.21",
     "tinyglobby": "0.2.13",
-    "vite": "6.3.4",
+    "vite": "6.3.5",
     "watchpack": "2.4.2"
   },
   "optionalDependencies": {
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 8cba64c6c378..f151533e66db 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -64,13 +64,13 @@ importers:
         version: 8.2.0
       '@eslint/compat':
         specifier: 1.2.9
-        version: 1.2.9(eslint@9.25.1(jiti@1.21.7))
+        version: 1.2.9(eslint@9.26.0(jiti@1.21.7))
       '@eslint/eslintrc':
         specifier: 3.3.1
         version: 3.3.1
       '@eslint/js':
-        specifier: 9.25.1
-        version: 9.25.1
+        specifier: 9.26.0
+        version: 9.26.0
       '@rollup/plugin-alias':
         specifier: ^5.1.1
         version: 5.1.1(rollup@4.40.1)
@@ -85,7 +85,7 @@ importers:
         version: 16.0.1(rollup@4.40.1)
       '@stylistic/eslint-plugin':
         specifier: ^4.0.0
-        version: 4.2.0(eslint@9.25.1(jiti@1.21.7))(typescript@5.8.3)
+        version: 4.2.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
       '@types/babel__core':
         specifier: 7.20.5
         version: 7.20.5
@@ -160,10 +160,10 @@ importers:
         version: 1.1.9
       '@typescript-eslint/eslint-plugin':
         specifier: 8.31.1
-        version: 8.31.1(@typescript-eslint/parser@8.31.1(eslint@9.25.1(jiti@1.21.7))(typescript@5.8.3))(eslint@9.25.1(jiti@1.21.7))(typescript@5.8.3)
+        version: 8.31.1(@typescript-eslint/parser@8.31.1(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
       '@typescript-eslint/parser':
         specifier: 8.31.1
-        version: 8.31.1(eslint@9.25.1(jiti@1.21.7))(typescript@5.8.3)
+        version: 8.31.1(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
       ajv:
         specifier: 8.17.1
         version: 8.17.1
@@ -183,17 +183,17 @@ importers:
         specifier: 0.25.3
         version: 0.25.3
       eslint:
-        specifier: 9.25.1
-        version: 9.25.1(jiti@1.21.7)
+        specifier: 9.26.0
+        version: 9.26.0(jiti@1.21.7)
       eslint-config-prettier:
         specifier: 10.1.2
-        version: 10.1.2(eslint@9.25.1(jiti@1.21.7))
+        version: 10.1.2(eslint@9.26.0(jiti@1.21.7))
       eslint-plugin-header:
         specifier: 3.1.1
-        version: 3.1.1(eslint@9.25.1(jiti@1.21.7))
+        version: 3.1.1(eslint@9.26.0(jiti@1.21.7))
       eslint-plugin-import:
         specifier: 2.31.0
-        version: 2.31.0(@typescript-eslint/parser@8.31.1(eslint@9.25.1(jiti@1.21.7))(typescript@5.8.3))(eslint@9.25.1(jiti@1.21.7))
+        version: 2.31.0(@typescript-eslint/parser@8.31.1(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.26.0(jiti@1.21.7))
       express:
         specifier: 5.1.0
         version: 5.1.0
@@ -366,7 +366,7 @@ importers:
         version: 5.1.9(@types/node@20.17.32)
       '@vitejs/plugin-basic-ssl':
         specifier: 2.0.0
-        version: 2.0.0(vite@6.3.4(@types/node@20.17.32)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1))
+        version: 2.0.0(vite@6.3.5(@types/node@20.17.32)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1))
       beasties:
         specifier: 0.3.3
         version: 0.3.3
@@ -419,8 +419,8 @@ importers:
         specifier: 0.2.13
         version: 0.2.13
       vite:
-        specifier: 6.3.4
-        version: 6.3.4(@types/node@20.17.32)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1)
+        specifier: 6.3.5
+        version: 6.3.5(@types/node@20.17.32)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1)
       watchpack:
         specifier: 2.4.2
         version: 2.4.2
@@ -631,7 +631,7 @@ importers:
         version: link:../../ngtools/webpack
       '@vitejs/plugin-basic-ssl':
         specifier: 2.0.0
-        version: 2.0.0(vite@6.3.4(@types/node@20.17.32)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1))
+        version: 2.0.0(vite@6.3.5(@types/node@20.17.32)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1))
       ansi-colors:
         specifier: 4.1.3
         version: 4.1.3
@@ -1818,8 +1818,8 @@ packages:
     resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
-  '@eslint/js@9.25.1':
-    resolution: {integrity: sha512-dEIwmjntEx8u3Uvv+kr3PDeeArL8Hw07H9kyYxCjnM9pBjfEhk6uLXSchxxzgiwtRhhzVzqmUSDFBOi1TuZ7qg==}
+  '@eslint/js@9.26.0':
+    resolution: {integrity: sha512-I9XlJawFdSMvWjDt6wksMCrgns5ggLNfFwFvnShsleWruvXM514Qxk8V246efTw+eo9JABvVz+u3q2RiAowKxQ==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
   '@eslint/object-schema@2.1.6':
@@ -2109,6 +2109,10 @@ packages:
   '@mdn/browser-compat-data@6.0.9':
     resolution: {integrity: sha512-IA/ER+n8ugvJakp4WRdTXVSvtU+QJEQbfdgLVbLcL6AaFDOeuAXUR1AzS7YsgZ7AZsfUVfYLhXJX8ubGJQ+SFA==}
 
+  '@modelcontextprotocol/sdk@1.11.0':
+    resolution: {integrity: sha512-k/1pb70eD638anoi0e8wUGAlbMJXyvdV4p62Ko+EZ7eBe1xMx8Uhak1R5DgfoofsK5IBBnRwsYGTaLZl+6/+RQ==}
+    engines: {node: '>=18'}
+
   '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3':
     resolution: {integrity: sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==}
     cpu: [arm64]
@@ -4538,8 +4542,8 @@ packages:
     resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
-  eslint@9.25.1:
-    resolution: {integrity: sha512-E6Mtz9oGQWDCpV12319d59n4tx9zOTXSTmc8BLVxBx+G/0RdM5MvEEJLU9c0+aleoePYYgVTOsRblx433qmhWQ==}
+  eslint@9.26.0:
+    resolution: {integrity: sha512-Hx0MOjPh6uK9oq9nVsATZKE/Wlbai7KFjfCuw9UHaguDW3x+HF0O5nIi3ud39TWgrTjTO5nHxmL3R1eANinWHQ==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     hasBin: true
     peerDependencies:
@@ -4604,6 +4608,14 @@ packages:
     resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
     engines: {node: '>=0.8.x'}
 
+  eventsource-parser@3.0.1:
+    resolution: {integrity: sha512-VARTJ9CYeuQYb0pZEPbzi740OWFgpHe7AYJ2WFZVnUDUQp5Dk2yJUgF36YsZ81cOyxT0QxmXD2EQpapAouzWVA==}
+    engines: {node: '>=18.0.0'}
+
+  eventsource@3.0.6:
+    resolution: {integrity: sha512-l19WpE2m9hSuyP06+FbuUUf1G+R0SFLrtQfbRb9PRr+oimOfxQhgGCbVaXg5IvZyyTThJsxh6L/srkMiCeBPDA==}
+    engines: {node: '>=18.0.0'}
+
   execa@1.0.0:
     resolution: {integrity: sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==}
     engines: {node: '>=6'}
@@ -4626,6 +4638,12 @@ packages:
   express-rate-limit@5.5.1:
     resolution: {integrity: sha512-MTjE2eIbHv5DyfuFz4zLYWxpqVhEhkTiwFGuB74Q9CSou2WHO52nlE5y3Zlg6SIsiYUIPj6ifFxnkPz6O3sIUg==}
 
+  express-rate-limit@7.5.0:
+    resolution: {integrity: sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==}
+    engines: {node: '>= 16'}
+    peerDependencies:
+      express: ^4.11 || 5 || ^5.0.0-beta.1
+
   express@4.21.2:
     resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==}
     engines: {node: '>= 0.10.0'}
@@ -6625,6 +6643,10 @@ packages:
     resolution: {integrity: sha512-R+arufwL7sZvGjAhSMK3TfH55YdGOqhpKXkcwQJr432AAnJX/xxX19PA4QisrmJ+BTTfZVggaz6HexbkQq1l1Q==}
     engines: {node: '>=18.x'}
 
+  pkce-challenge@5.0.0:
+    resolution: {integrity: sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==}
+    engines: {node: '>=16.20.0'}
+
   pkg-dir@4.2.0:
     resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==}
     engines: {node: '>=8'}
@@ -7931,8 +7953,8 @@ packages:
       yaml:
         optional: true
 
-  vite@6.3.4:
-    resolution: {integrity: sha512-BiReIiMS2fyFqbqNT/Qqt4CVITDU9M9vE+DKcVAsB+ZV0wvTKd+3hMbkpxz1b+NmEDMegpVbisKiAZOnvO92Sw==}
+  vite@6.3.5:
+    resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==}
     engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
     hasBin: true
     peerDependencies:
@@ -8327,6 +8349,11 @@ packages:
     resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==}
     engines: {node: '>=18'}
 
+  zod-to-json-schema@3.24.5:
+    resolution: {integrity: sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==}
+    peerDependencies:
+      zod: ^3.24.1
+
   zod@3.24.3:
     resolution: {integrity: sha512-HhY1oqzWCQWuUqvBFnsyrtZRhyPeR7SUGv+C4+MsisMuVfSPx8HpwWqH8tRahSlt6M3PiFAcoeFhZAqIXTxoSg==}
 
@@ -9350,16 +9377,16 @@ snapshots:
   '@esbuild/win32-x64@0.25.3':
     optional: true
 
-  '@eslint-community/eslint-utils@4.6.1(eslint@9.25.1(jiti@1.21.7))':
+  '@eslint-community/eslint-utils@4.6.1(eslint@9.26.0(jiti@1.21.7))':
     dependencies:
-      eslint: 9.25.1(jiti@1.21.7)
+      eslint: 9.26.0(jiti@1.21.7)
       eslint-visitor-keys: 3.4.3
 
   '@eslint-community/regexpp@4.12.1': {}
 
-  '@eslint/compat@1.2.9(eslint@9.25.1(jiti@1.21.7))':
+  '@eslint/compat@1.2.9(eslint@9.26.0(jiti@1.21.7))':
     optionalDependencies:
-      eslint: 9.25.1(jiti@1.21.7)
+      eslint: 9.26.0(jiti@1.21.7)
 
   '@eslint/config-array@0.20.0':
     dependencies:
@@ -9389,7 +9416,7 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@eslint/js@9.25.1': {}
+  '@eslint/js@9.26.0': {}
 
   '@eslint/object-schema@2.1.6': {}
 
@@ -9692,6 +9719,21 @@ snapshots:
 
   '@mdn/browser-compat-data@6.0.9': {}
 
+  '@modelcontextprotocol/sdk@1.11.0':
+    dependencies:
+      content-type: 1.0.5
+      cors: 2.8.5
+      cross-spawn: 7.0.6
+      eventsource: 3.0.6
+      express: 5.1.0
+      express-rate-limit: 7.5.0(express@5.1.0)
+      pkce-challenge: 5.0.0
+      raw-body: 3.0.0
+      zod: 3.24.3
+      zod-to-json-schema: 3.24.5(zod@3.24.3)
+    transitivePeerDependencies:
+      - supports-color
+
   '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3':
     optional: true
 
@@ -10184,10 +10226,10 @@ snapshots:
 
   '@socket.io/component-emitter@3.1.2': {}
 
-  '@stylistic/eslint-plugin@4.2.0(eslint@9.25.1(jiti@1.21.7))(typescript@5.8.3)':
+  '@stylistic/eslint-plugin@4.2.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)':
     dependencies:
-      '@typescript-eslint/utils': 8.31.0(eslint@9.25.1(jiti@1.21.7))(typescript@5.8.3)
-      eslint: 9.25.1(jiti@1.21.7)
+      '@typescript-eslint/utils': 8.31.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
+      eslint: 9.26.0(jiti@1.21.7)
       eslint-visitor-keys: 4.2.0
       espree: 10.3.0
       estraverse: 5.3.0
@@ -10577,15 +10619,15 @@ snapshots:
       '@types/node': 20.17.32
     optional: true
 
-  '@typescript-eslint/eslint-plugin@8.31.1(@typescript-eslint/parser@8.31.1(eslint@9.25.1(jiti@1.21.7))(typescript@5.8.3))(eslint@9.25.1(jiti@1.21.7))(typescript@5.8.3)':
+  '@typescript-eslint/eslint-plugin@8.31.1(@typescript-eslint/parser@8.31.1(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)':
     dependencies:
       '@eslint-community/regexpp': 4.12.1
-      '@typescript-eslint/parser': 8.31.1(eslint@9.25.1(jiti@1.21.7))(typescript@5.8.3)
+      '@typescript-eslint/parser': 8.31.1(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
       '@typescript-eslint/scope-manager': 8.31.1
-      '@typescript-eslint/type-utils': 8.31.1(eslint@9.25.1(jiti@1.21.7))(typescript@5.8.3)
-      '@typescript-eslint/utils': 8.31.1(eslint@9.25.1(jiti@1.21.7))(typescript@5.8.3)
+      '@typescript-eslint/type-utils': 8.31.1(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
+      '@typescript-eslint/utils': 8.31.1(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
       '@typescript-eslint/visitor-keys': 8.31.1
-      eslint: 9.25.1(jiti@1.21.7)
+      eslint: 9.26.0(jiti@1.21.7)
       graphemer: 1.4.0
       ignore: 5.3.2
       natural-compare: 1.4.0
@@ -10594,14 +10636,14 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@typescript-eslint/parser@8.31.1(eslint@9.25.1(jiti@1.21.7))(typescript@5.8.3)':
+  '@typescript-eslint/parser@8.31.1(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)':
     dependencies:
       '@typescript-eslint/scope-manager': 8.31.1
       '@typescript-eslint/types': 8.31.1
       '@typescript-eslint/typescript-estree': 8.31.1(typescript@5.8.3)
       '@typescript-eslint/visitor-keys': 8.31.1
       debug: 4.4.0(supports-color@10.0.0)
-      eslint: 9.25.1(jiti@1.21.7)
+      eslint: 9.26.0(jiti@1.21.7)
       typescript: 5.8.3
     transitivePeerDependencies:
       - supports-color
@@ -10616,12 +10658,12 @@ snapshots:
       '@typescript-eslint/types': 8.31.1
       '@typescript-eslint/visitor-keys': 8.31.1
 
-  '@typescript-eslint/type-utils@8.31.1(eslint@9.25.1(jiti@1.21.7))(typescript@5.8.3)':
+  '@typescript-eslint/type-utils@8.31.1(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)':
     dependencies:
       '@typescript-eslint/typescript-estree': 8.31.1(typescript@5.8.3)
-      '@typescript-eslint/utils': 8.31.1(eslint@9.25.1(jiti@1.21.7))(typescript@5.8.3)
+      '@typescript-eslint/utils': 8.31.1(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
       debug: 4.4.0(supports-color@10.0.0)
-      eslint: 9.25.1(jiti@1.21.7)
+      eslint: 9.26.0(jiti@1.21.7)
       ts-api-utils: 2.1.0(typescript@5.8.3)
       typescript: 5.8.3
     transitivePeerDependencies:
@@ -10659,24 +10701,24 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@typescript-eslint/utils@8.31.0(eslint@9.25.1(jiti@1.21.7))(typescript@5.8.3)':
+  '@typescript-eslint/utils@8.31.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)':
     dependencies:
-      '@eslint-community/eslint-utils': 4.6.1(eslint@9.25.1(jiti@1.21.7))
+      '@eslint-community/eslint-utils': 4.6.1(eslint@9.26.0(jiti@1.21.7))
       '@typescript-eslint/scope-manager': 8.31.0
       '@typescript-eslint/types': 8.31.0
       '@typescript-eslint/typescript-estree': 8.31.0(typescript@5.8.3)
-      eslint: 9.25.1(jiti@1.21.7)
+      eslint: 9.26.0(jiti@1.21.7)
       typescript: 5.8.3
     transitivePeerDependencies:
       - supports-color
 
-  '@typescript-eslint/utils@8.31.1(eslint@9.25.1(jiti@1.21.7))(typescript@5.8.3)':
+  '@typescript-eslint/utils@8.31.1(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)':
     dependencies:
-      '@eslint-community/eslint-utils': 4.6.1(eslint@9.25.1(jiti@1.21.7))
+      '@eslint-community/eslint-utils': 4.6.1(eslint@9.26.0(jiti@1.21.7))
       '@typescript-eslint/scope-manager': 8.31.1
       '@typescript-eslint/types': 8.31.1
       '@typescript-eslint/typescript-estree': 8.31.1(typescript@5.8.3)
-      eslint: 9.25.1(jiti@1.21.7)
+      eslint: 9.26.0(jiti@1.21.7)
       typescript: 5.8.3
     transitivePeerDependencies:
       - supports-color
@@ -10838,9 +10880,9 @@ snapshots:
       minimatch: 7.4.6
       semver: 7.7.1
 
-  '@vitejs/plugin-basic-ssl@2.0.0(vite@6.3.4(@types/node@20.17.32)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1))':
+  '@vitejs/plugin-basic-ssl@2.0.0(vite@6.3.5(@types/node@20.17.32)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1))':
     dependencies:
-      vite: 6.3.4(@types/node@20.17.32)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1)
+      vite: 6.3.5(@types/node@20.17.32)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1)
 
   '@vitest/expect@3.1.2':
     dependencies:
@@ -12462,9 +12504,9 @@ snapshots:
     optionalDependencies:
       source-map: 0.6.1
 
-  eslint-config-prettier@10.1.2(eslint@9.25.1(jiti@1.21.7)):
+  eslint-config-prettier@10.1.2(eslint@9.26.0(jiti@1.21.7)):
     dependencies:
-      eslint: 9.25.1(jiti@1.21.7)
+      eslint: 9.26.0(jiti@1.21.7)
 
   eslint-import-resolver-node@0.3.9:
     dependencies:
@@ -12474,21 +12516,21 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  eslint-module-utils@2.12.0(@typescript-eslint/parser@8.31.1(eslint@9.25.1(jiti@1.21.7))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.25.1(jiti@1.21.7)):
+  eslint-module-utils@2.12.0(@typescript-eslint/parser@8.31.1(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.26.0(jiti@1.21.7)):
     dependencies:
       debug: 3.2.7
     optionalDependencies:
-      '@typescript-eslint/parser': 8.31.1(eslint@9.25.1(jiti@1.21.7))(typescript@5.8.3)
-      eslint: 9.25.1(jiti@1.21.7)
+      '@typescript-eslint/parser': 8.31.1(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
+      eslint: 9.26.0(jiti@1.21.7)
       eslint-import-resolver-node: 0.3.9
     transitivePeerDependencies:
       - supports-color
 
-  eslint-plugin-header@3.1.1(eslint@9.25.1(jiti@1.21.7)):
+  eslint-plugin-header@3.1.1(eslint@9.26.0(jiti@1.21.7)):
     dependencies:
-      eslint: 9.25.1(jiti@1.21.7)
+      eslint: 9.26.0(jiti@1.21.7)
 
-  eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.31.1(eslint@9.25.1(jiti@1.21.7))(typescript@5.8.3))(eslint@9.25.1(jiti@1.21.7)):
+  eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.31.1(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.26.0(jiti@1.21.7)):
     dependencies:
       '@rtsao/scc': 1.1.0
       array-includes: 3.1.8
@@ -12497,9 +12539,9 @@ snapshots:
       array.prototype.flatmap: 1.3.3
       debug: 3.2.7
       doctrine: 2.1.0
-      eslint: 9.25.1(jiti@1.21.7)
+      eslint: 9.26.0(jiti@1.21.7)
       eslint-import-resolver-node: 0.3.9
-      eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.31.1(eslint@9.25.1(jiti@1.21.7))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.25.1(jiti@1.21.7))
+      eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.31.1(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.26.0(jiti@1.21.7))
       hasown: 2.0.2
       is-core-module: 2.16.1
       is-glob: 4.0.3
@@ -12511,7 +12553,7 @@ snapshots:
       string.prototype.trimend: 1.0.9
       tsconfig-paths: 3.15.0
     optionalDependencies:
-      '@typescript-eslint/parser': 8.31.1(eslint@9.25.1(jiti@1.21.7))(typescript@5.8.3)
+      '@typescript-eslint/parser': 8.31.1(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
     transitivePeerDependencies:
       - eslint-import-resolver-typescript
       - eslint-import-resolver-webpack
@@ -12531,19 +12573,20 @@ snapshots:
 
   eslint-visitor-keys@4.2.0: {}
 
-  eslint@9.25.1(jiti@1.21.7):
+  eslint@9.26.0(jiti@1.21.7):
     dependencies:
-      '@eslint-community/eslint-utils': 4.6.1(eslint@9.25.1(jiti@1.21.7))
+      '@eslint-community/eslint-utils': 4.6.1(eslint@9.26.0(jiti@1.21.7))
       '@eslint-community/regexpp': 4.12.1
       '@eslint/config-array': 0.20.0
       '@eslint/config-helpers': 0.2.1
       '@eslint/core': 0.13.0
       '@eslint/eslintrc': 3.3.1
-      '@eslint/js': 9.25.1
+      '@eslint/js': 9.26.0
       '@eslint/plugin-kit': 0.2.8
       '@humanfs/node': 0.16.6
       '@humanwhocodes/module-importer': 1.0.1
       '@humanwhocodes/retry': 0.4.2
+      '@modelcontextprotocol/sdk': 1.11.0
       '@types/estree': 1.0.7
       '@types/json-schema': 7.0.15
       ajv: 6.12.6
@@ -12568,6 +12611,7 @@ snapshots:
       minimatch: 3.1.2
       natural-compare: 1.4.0
       optionator: 0.9.4
+      zod: 3.24.3
     optionalDependencies:
       jiti: 1.21.7
     transitivePeerDependencies:
@@ -12613,6 +12657,12 @@ snapshots:
 
   events@3.3.0: {}
 
+  eventsource-parser@3.0.1: {}
+
+  eventsource@3.0.6:
+    dependencies:
+      eventsource-parser: 3.0.1
+
   execa@1.0.0:
     dependencies:
       cross-spawn: 6.0.6
@@ -12643,6 +12693,10 @@ snapshots:
 
   express-rate-limit@5.5.1: {}
 
+  express-rate-limit@7.5.0(express@5.1.0):
+    dependencies:
+      express: 5.1.0
+
   express@4.21.2:
     dependencies:
       accepts: 1.3.8
@@ -14842,6 +14896,8 @@ snapshots:
     optionalDependencies:
       '@napi-rs/nice': 1.0.1
 
+  pkce-challenge@5.0.0: {}
+
   pkg-dir@4.2.0:
     dependencies:
       find-up: 4.1.0
@@ -16420,7 +16476,7 @@ snapshots:
       debug: 4.4.0(supports-color@10.0.0)
       es-module-lexer: 1.7.0
       pathe: 2.0.3
-      vite: 6.3.4(@types/node@20.17.32)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1)
+      vite: 6.3.5(@types/node@20.17.32)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1)
     transitivePeerDependencies:
       - '@types/node'
       - jiti
@@ -16452,7 +16508,7 @@ snapshots:
       terser: 5.39.0
       yaml: 2.7.1
 
-  vite@6.3.4(@types/node@20.17.32)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1):
+  vite@6.3.5(@types/node@20.17.32)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1):
     dependencies:
       esbuild: 0.25.3
       fdir: 6.4.4(picomatch@4.0.2)
@@ -16862,6 +16918,10 @@ snapshots:
 
   yoctocolors-cjs@2.1.2: {}
 
+  zod-to-json-schema@3.24.5(zod@3.24.3):
+    dependencies:
+      zod: 3.24.3
+
   zod@3.24.3: {}
 
   zone.js@0.15.0: {}

From 0866a576bc51867195a79e970646f4d672530ad4 Mon Sep 17 00:00:00 2001
From: Angular Robot <angular-robot@google.com>
Date: Mon, 5 May 2025 14:03:14 +0000
Subject: [PATCH 017/138] build: lock file maintenance

(cherry picked from commit cc99b06ed22a6dcc0095983498789619bb8f21ae)
---
 pnpm-lock.yaml | 551 ++++++++++++++-----------------------------------
 1 file changed, 155 insertions(+), 396 deletions(-)

diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index f151533e66db..67a5ba1608e1 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -214,10 +214,10 @@ importers:
         version: 9.1.7
       jasmine:
         specifier: ~5.7.0
-        version: 5.7.0
+        version: 5.7.1
       jasmine-core:
         specifier: ~5.7.0
-        version: 5.7.0
+        version: 5.7.1
       jasmine-reporters:
         specifier: ^2.5.2
         version: 2.5.2
@@ -238,7 +238,7 @@ importers:
         version: 5.1.0(karma@6.4.4)
       karma-jasmine-html-reporter:
         specifier: ~2.1.0
-        version: 2.1.0(jasmine-core@5.7.0)(karma-jasmine@5.1.0(karma@6.4.4))(karma@6.4.4)
+        version: 2.1.0(jasmine-core@5.7.1)(karma-jasmine@5.1.0(karma@6.4.4))(karma@6.4.4)
       karma-source-map-support:
         specifier: 1.4.0
         version: 1.4.0
@@ -372,7 +372,7 @@ importers:
         version: 0.3.3
       browserslist:
         specifier: ^4.23.0
-        version: 4.24.4
+        version: 4.24.5
       esbuild:
         specifier: 0.25.3
         version: 0.25.3
@@ -643,7 +643,7 @@ importers:
         version: 10.0.0(@babel/core@7.27.1)(webpack@5.99.7(esbuild@0.25.3))
       browserslist:
         specifier: ^4.21.5
-        version: 4.24.4
+        version: 4.24.5
       copy-webpack-plugin:
         specifier: 13.0.0
         version: 13.0.0(webpack@5.99.7(esbuild@0.25.3))
@@ -1018,21 +1018,13 @@ packages:
       '@angular/core': 20.0.0-next.9
       rxjs: ^6.5.3 || ^7.4.0
 
-  '@asamuzakjp/css-color@3.1.5':
-    resolution: {integrity: sha512-w7AmVyTTiU41fNLsFDf+gA2Dwtbx2EJtn2pbJNAGSRAg50loXy1uLXA3hEpD8+eydcomTurw09tq5/AyceCaGg==}
-
-  '@babel/code-frame@7.26.2':
-    resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==}
-    engines: {node: '>=6.9.0'}
+  '@asamuzakjp/css-color@3.1.7':
+    resolution: {integrity: sha512-Ok5fYhtwdyJQmU1PpEv6Si7Y+A4cYb8yNM9oiIJC9TzXPMuN9fvdonKJqcnz9TbFqV6bQ8z0giRq0iaOpGZV2g==}
 
   '@babel/code-frame@7.27.1':
     resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/compat-data@7.26.8':
-    resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==}
-    engines: {node: '>=6.9.0'}
-
   '@babel/compat-data@7.27.1':
     resolution: {integrity: sha512-Q+E+rd/yBzNQhXkG+zQnF58e4zoZfBedaxwzPmicKsiK3nt8iJYrSrDbjwFFDGC4f+rPafqRaPH6TsDoSvMf7A==}
     engines: {node: '>=6.9.0'}
@@ -1053,10 +1045,6 @@ packages:
     resolution: {integrity: sha512-WnuuDILl9oOBbKnb4L+DyODx7iC47XfzmNCpTttFsSp6hTG7XZxu60+4IO+2/hPfcGOoKbFiwoI/+zwARbNQow==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/helper-compilation-targets@7.27.0':
-    resolution: {integrity: sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==}
-    engines: {node: '>=6.9.0'}
-
   '@babel/helper-compilation-targets@7.27.1':
     resolution: {integrity: sha512-2YaDd/Rd9E598B5+WIc8wJPmWETiiJXFYVE60oX8FDohv7rAUU3CQj+A1MgeEmcsk2+dQuEjIe/GDvig0SqL4g==}
     engines: {node: '>=6.9.0'}
@@ -1067,12 +1055,6 @@ packages:
     peerDependencies:
       '@babel/core': ^7.0.0
 
-  '@babel/helper-create-regexp-features-plugin@7.27.0':
-    resolution: {integrity: sha512-fO8l08T76v48BhpNRW/nQ0MxfnSdoSKUJBMjubOAYffsVuGG5qOfMq7N6Es7UJvi7Y8goXXo07EfcHZXDPuELQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0
-
   '@babel/helper-create-regexp-features-plugin@7.27.1':
     resolution: {integrity: sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==}
     engines: {node: '>=6.9.0'}
@@ -1088,20 +1070,10 @@ packages:
     resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/helper-module-imports@7.25.9':
-    resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==}
-    engines: {node: '>=6.9.0'}
-
   '@babel/helper-module-imports@7.27.1':
     resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/helper-module-transforms@7.26.0':
-    resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0
-
   '@babel/helper-module-transforms@7.27.1':
     resolution: {integrity: sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g==}
     engines: {node: '>=6.9.0'}
@@ -1136,26 +1108,14 @@ packages:
     resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/helper-string-parser@7.25.9':
-    resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==}
-    engines: {node: '>=6.9.0'}
-
   '@babel/helper-string-parser@7.27.1':
     resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/helper-validator-identifier@7.25.9':
-    resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==}
-    engines: {node: '>=6.9.0'}
-
   '@babel/helper-validator-identifier@7.27.1':
     resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/helper-validator-option@7.25.9':
-    resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==}
-    engines: {node: '>=6.9.0'}
-
   '@babel/helper-validator-option@7.27.1':
     resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==}
     engines: {node: '>=6.9.0'}
@@ -1164,19 +1124,10 @@ packages:
     resolution: {integrity: sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/helpers@7.27.0':
-    resolution: {integrity: sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==}
-    engines: {node: '>=6.9.0'}
-
   '@babel/helpers@7.27.1':
     resolution: {integrity: sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/parser@7.27.0':
-    resolution: {integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==}
-    engines: {node: '>=6.0.0'}
-    hasBin: true
-
   '@babel/parser@7.27.1':
     resolution: {integrity: sha512-I0dZ3ZpCrJ1c04OqlNsQcKiZlsrXf/kkE4FXzID9rIOYICsAbA8mMDzhW/luRNAHdCNt7os/u8wenklZDlUVUQ==}
     engines: {node: '>=6.0.0'}
@@ -1557,26 +1508,14 @@ packages:
     resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/template@7.27.0':
-    resolution: {integrity: sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==}
-    engines: {node: '>=6.9.0'}
-
   '@babel/template@7.27.1':
     resolution: {integrity: sha512-Fyo3ghWMqkHHpHQCoBs2VnYjR4iWFFjguTDEqA5WgZDOrFesVjMhMM2FSqTKSoUSDO1VQtavj8NFpdRBEvJTtg==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/traverse@7.27.0':
-    resolution: {integrity: sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==}
-    engines: {node: '>=6.9.0'}
-
   '@babel/traverse@7.27.1':
     resolution: {integrity: sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/types@7.27.0':
-    resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==}
-    engines: {node: '>=6.9.0'}
-
   '@babel/types@7.27.1':
     resolution: {integrity: sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==}
     engines: {node: '>=6.9.0'}
@@ -1783,8 +1722,8 @@ packages:
     cpu: [x64]
     os: [win32]
 
-  '@eslint-community/eslint-utils@4.6.1':
-    resolution: {integrity: sha512-KTsJMmobmbrFLe3LDh0PC2FXpcSYJt/MLjlkh/9LEnmKYLSYmT/0EW9JWANjeoemiuZrmogti0tW5Ch+qNUYDw==}
+  '@eslint-community/eslint-utils@4.7.0':
+    resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     peerDependencies:
       eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
@@ -1806,8 +1745,8 @@ packages:
     resolution: {integrity: sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
-  '@eslint/config-helpers@0.2.1':
-    resolution: {integrity: sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==}
+  '@eslint/config-helpers@0.2.2':
+    resolution: {integrity: sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
   '@eslint/core@0.13.0':
@@ -2061,8 +2000,8 @@ packages:
     peerDependencies:
       tslib: '2'
 
-  '@jsonjoy.com/util@1.5.0':
-    resolution: {integrity: sha512-ojoNsrIuPI9g6o8UxhraZQSyF2ByJanAY4cTFbc8Mf2AXEF4aQRGY1dJxyJpuyav8r9FGflEt/Ff3u5Nt6YMPA==}
+  '@jsonjoy.com/util@1.6.0':
+    resolution: {integrity: sha512-sw/RMbehRhN68WRtcKCpQOPfnH6lLP4GJfqzi3iYej8tnzpZUDr6UkZYJjcjjC0FWEJOJbyM3PTIwxucUmDG2A==}
     engines: {node: '>=10.0'}
     peerDependencies:
       tslib: '2'
@@ -2106,8 +2045,8 @@ packages:
     cpu: [x64]
     os: [win32]
 
-  '@mdn/browser-compat-data@6.0.9':
-    resolution: {integrity: sha512-IA/ER+n8ugvJakp4WRdTXVSvtU+QJEQbfdgLVbLcL6AaFDOeuAXUR1AzS7YsgZ7AZsfUVfYLhXJX8ubGJQ+SFA==}
+  '@mdn/browser-compat-data@6.0.11':
+    resolution: {integrity: sha512-vcLCW2dvKfHGV4t/lkocstKvu15hfaMaAEaGTzL4wZ6ZWmI2aHbrFcO/LkK34jkFPjKXm3GHLm5h35u5WD4d9w==}
 
   '@modelcontextprotocol/sdk@1.11.0':
     resolution: {integrity: sha512-k/1pb70eD638anoi0e8wUGAlbMJXyvdV4p62Ko+EZ7eBe1xMx8Uhak1R5DgfoofsK5IBBnRwsYGTaLZl+6/+RQ==}
@@ -2284,8 +2223,8 @@ packages:
     resolution: {integrity: sha512-/bNJhjc+o6qL+Dwz/bqfTQClkEO5nTQ1ZEcdCkAQjhkZMHIh22LPG7fNh1enJP1NKWDqYiiABnjFCY7E0zHYtQ==}
     engines: {node: ^18.17.0 || >=20.5.0}
 
-  '@npmcli/redact@3.2.0':
-    resolution: {integrity: sha512-NyJXHoZwJE0iUsCDTclXf1bWHJTsshtnp5xUN6F2vY+OLJv6d2cNc4Do6fKNkmPToB0GzoffxRh405ibTwG+Og==}
+  '@npmcli/redact@3.2.1':
+    resolution: {integrity: sha512-VW+1SW5CkP1aSegFQx7/AawdzM6b4UP6R3QET192ON4IAP6iK++IG6Ztg+bkoeGN8lh/prOzT+ZkNgWQrAXLNQ==}
     engines: {node: ^18.17.0 || >=20.5.0}
 
   '@npmcli/run-script@9.1.0':
@@ -2490,8 +2429,8 @@ packages:
   '@protobufjs/utf8@1.1.0':
     resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==}
 
-  '@puppeteer/browsers@2.10.2':
-    resolution: {integrity: sha512-i4Ez+s9oRWQbNjtI/3+jxr7OH508mjAKvza0ekPJem0ZtmsYHP3B5dq62+IaBHKaGCOuqJxXzvFLUhJvQ6jtsQ==}
+  '@puppeteer/browsers@2.10.3':
+    resolution: {integrity: sha512-iPpnFpX25gKIVsHsqVjHV+/GzW36xPgsscWkCnrrETndcdxNsXLdCrTwhkCJNR/FGWr122dJUBeyV4niz/j3TA==}
     engines: {node: '>=18'}
     hasBin: true
 
@@ -3015,10 +2954,6 @@ packages:
       eslint: ^8.57.0 || ^9.0.0
       typescript: 5.8.3
 
-  '@typescript-eslint/scope-manager@8.31.0':
-    resolution: {integrity: sha512-knO8UyF78Nt8O/B64i7TlGXod69ko7z6vJD9uhSlm0qkAbGeRUSudcm0+K/4CrRjrpiHfBCjMWlc08Vav1xwcw==}
-    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
-
   '@typescript-eslint/scope-manager@8.31.1':
     resolution: {integrity: sha512-BMNLOElPxrtNQMIsFHE+3P0Yf1z0dJqV9zLdDxN/xLlWMlXK/ApEsVEKzpizg9oal8bAT5Sc7+ocal7AC1HCVw==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -3030,33 +2965,16 @@ packages:
       eslint: ^8.57.0 || ^9.0.0
       typescript: 5.8.3
 
-  '@typescript-eslint/types@8.31.0':
-    resolution: {integrity: sha512-Ch8oSjVyYyJxPQk8pMiP2FFGYatqXQfQIaMp+TpuuLlDachRWpUAeEu1u9B/v/8LToehUIWyiKcA/w5hUFRKuQ==}
-    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
-
   '@typescript-eslint/types@8.31.1':
     resolution: {integrity: sha512-SfepaEFUDQYRoA70DD9GtytljBePSj17qPxFHA/h3eg6lPTqGJ5mWOtbXCk1YrVU1cTJRd14nhaXWFu0l2troQ==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
-  '@typescript-eslint/typescript-estree@8.31.0':
-    resolution: {integrity: sha512-xLmgn4Yl46xi6aDSZ9KkyfhhtnYI15/CvHbpOy/eR5NWhK/BK8wc709KKwhAR0m4ZKRP7h07bm4BWUYOCuRpQQ==}
-    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
-    peerDependencies:
-      typescript: 5.8.3
-
   '@typescript-eslint/typescript-estree@8.31.1':
     resolution: {integrity: sha512-kaA0ueLe2v7KunYOyWYtlf/QhhZb7+qh4Yw6Ni5kgukMIG+iP773tjgBiLWIXYumWCwEq3nLW+TUywEp8uEeag==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     peerDependencies:
       typescript: 5.8.3
 
-  '@typescript-eslint/utils@8.31.0':
-    resolution: {integrity: sha512-qi6uPLt9cjTFxAb1zGNgTob4x9ur7xC6mHQJ8GwEzGMGE9tYniublmJaowOJ9V2jUzxrltTPfdG2nKlWsq0+Ww==}
-    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
-    peerDependencies:
-      eslint: ^8.57.0 || ^9.0.0
-      typescript: 5.8.3
-
   '@typescript-eslint/utils@8.31.1':
     resolution: {integrity: sha512-2DSI4SNfF5T4oRveQ4nUrSjUqjMND0nLq9rEkz0gfGr3tg0S5KB6DhwR+WZPCjzkZl3cH+4x2ce3EsL50FubjQ==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -3064,10 +2982,6 @@ packages:
       eslint: ^8.57.0 || ^9.0.0
       typescript: 5.8.3
 
-  '@typescript-eslint/visitor-keys@8.31.0':
-    resolution: {integrity: sha512-QcGHmlRHWOl93o64ZUMNewCdwKGU6WItOU52H0djgNmn1EOrhVudrDzXz4OycCRSCPwFCDrE2iIt5vmuUdHxuQ==}
-    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
-
   '@typescript-eslint/visitor-keys@8.31.1':
     resolution: {integrity: sha512-I+/rgqOVBn6f0o7NDTmAPWWC6NuqhV174lfYvAm9fUaWeiefLdux9/YI3/nLugEn9L8fcSi0XmpKi/r5u0nmpw==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -3170,6 +3084,9 @@ packages:
   '@vitest/pretty-format@3.1.2':
     resolution: {integrity: sha512-R0xAiHuWeDjTSB3kQ3OQpT8Rx3yhdOAIm/JM4axXxnG7Q/fS8XUwggv/A4xzbQA+drYRjzkMnpYnOGAc4oeq8w==}
 
+  '@vitest/pretty-format@3.1.3':
+    resolution: {integrity: sha512-i6FDiBeJUGLDKADw2Gb01UtUNb12yyXAqC/mmRWuYl+m/U9GS7s8us5ONmGkGpUUo7/iAYzI2ePVfOZTYvUifA==}
+
   '@vitest/runner@3.1.2':
     resolution: {integrity: sha512-bhLib9l4xb4sUMPXnThbnhX2Yi8OutBMA8Yahxa7yavQsFDtwY/jrUZwpKp2XH9DhRFJIeytlyGpXCqZ65nR+g==}
 
@@ -3567,8 +3484,8 @@ packages:
   bare-events@2.5.4:
     resolution: {integrity: sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==}
 
-  bare-fs@4.1.3:
-    resolution: {integrity: sha512-OeEZYIg+2qepaWLyphaOXHAHKo3xkM8y3BeGAvHdMN8GNWvEAU1Yw6rYpGzu/wDDbKxgEjVeVDpgGhDzaeMpjg==}
+  bare-fs@4.1.4:
+    resolution: {integrity: sha512-r8+26Voz8dGX3AYpJdFb1ZPaUSM8XOLCZvy+YGpRTmwPHIxA7Z3Jov/oMPtV7hfRQbOnH8qGlLTzQAbgtdNN0Q==}
     engines: {bare: '>=1.16.0'}
     peerDependencies:
       bare-buffer: '*'
@@ -3687,8 +3604,8 @@ packages:
   browserify-zlib@0.1.4:
     resolution: {integrity: sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==}
 
-  browserslist@4.24.4:
-    resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==}
+  browserslist@4.24.5:
+    resolution: {integrity: sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==}
     engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
     hasBin: true
 
@@ -3757,8 +3674,8 @@ packages:
     resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
     engines: {node: '>=10'}
 
-  caniuse-lite@1.0.30001715:
-    resolution: {integrity: sha512-7ptkFGMm2OAOgvZpwgA4yjQ5SQbrNVGdRjzH0pBdy1Fasvcr+KAeECmbCAECzTuDuoX0FCY8KzUxjf9+9kfZEw==}
+  caniuse-lite@1.0.30001717:
+    resolution: {integrity: sha512-auPpttCq6BDEG8ZAuHJIplGw6GODhjw+/11e7IjpnYCxZcW/ONgPs0KVBJ0d1bY3e2+7PRe5RCLyP+PfwVgkYw==}
 
   caseless@0.12.0:
     resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==}
@@ -3995,8 +3912,8 @@ packages:
     peerDependencies:
       webpack: ^5.1.0
 
-  core-js-compat@3.41.0:
-    resolution: {integrity: sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==}
+  core-js-compat@3.42.0:
+    resolution: {integrity: sha512-bQasjMfyDGyaeWKBIu33lHh9qlSR0MFE/Nmc6nMjf/iU9b3rSMdAYz1Baxrv4lPdGUsTqZudHA4jIGSJy0SWZQ==}
 
   core-js@3.40.0:
     resolution: {integrity: sha512-7vsMc/Lty6AGnn7uFpYT56QesI5D2Y/UkgKounk87OP9Z2H9Z8kj6jzcSGAxFmUtDOS0ntK6lbQz+Nsa0Jj6mQ==}
@@ -4259,8 +4176,8 @@ packages:
   devtools-protocol@0.0.1045489:
     resolution: {integrity: sha512-D+PTmWulkuQW4D1NTiCRCFxF7pQPn0hgp4YyX4wAQ6xYXKOadSWPR3ENGDQ47MW/Ewc9v2rpC/UEEGahgBYpSQ==}
 
-  devtools-protocol@0.0.1425554:
-    resolution: {integrity: sha512-uRfxR6Nlzdzt0ihVIkV+sLztKgs7rgquY/Mhcv1YNCWDh5IZgl5mnn2aeEnW5stYTE0wwiF4RYVz8eMEpV1SEw==}
+  devtools-protocol@0.0.1439962:
+    resolution: {integrity: sha512-jJF48UdryzKiWhJ1bLKr7BFWUQCEIT5uCNbDLqkQJBtkFxYzILJH44WN0PDKMIlGDN7Utb8vyUY85C3w4R/t2g==}
 
   di@0.0.1:
     resolution: {integrity: sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==}
@@ -4331,8 +4248,8 @@ packages:
   ee-first@1.1.1:
     resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
 
-  electron-to-chromium@1.5.143:
-    resolution: {integrity: sha512-QqklJMOFBMqe46k8iIOwA9l2hz57V2OKMmP5eSWcUvwx+mASAsbU+wkF1pHjn9ZVSBPrsYWr4/W/95y5SwYg2g==}
+  electron-to-chromium@1.5.149:
+    resolution: {integrity: sha512-UyiO82eb9dVOx8YO3ajDf9jz2kKyt98DEITRdeLPstOEuTlLzDA4Gyq5K9he71TQziU5jUVu2OAu5N48HmQiyQ==}
 
   emoji-regex@10.4.0:
     resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==}
@@ -5536,8 +5453,8 @@ packages:
   jasmine-core@4.6.1:
     resolution: {integrity: sha512-VYz/BjjmC3klLJlLwA4Kw8ytk0zDSmbbDLNs794VnWmkcCB7I9aAL/D48VNQtmITyPvea2C3jdUMfc3kAoy0PQ==}
 
-  jasmine-core@5.7.0:
-    resolution: {integrity: sha512-EnUzZBHxS1Ofq+FPWs16rs2YC9o6Hb3buKJQDlkhJBDx+Bm5wNF+J1gUS06dWuW2ozaQ3oNIA1SESX9M5LopOQ==}
+  jasmine-core@5.7.1:
+    resolution: {integrity: sha512-QnurrtpKsPoixxG2R3d1xP0St/2kcX5oTZyDyQJMY+Vzi/HUlu1kGm+2V8Tz+9lV991leB1l0xcsyz40s9xOOw==}
 
   jasmine-reporters@2.5.2:
     resolution: {integrity: sha512-qdewRUuFOSiWhiyWZX8Yx3YNQ9JG51ntBEO4ekLQRpktxFTwUHy24a86zD/Oi2BRTKksEdfWQZcQFqzjqIkPig==}
@@ -5549,8 +5466,8 @@ packages:
     resolution: {integrity: sha512-KbdGQTf5jbZgltoHs31XGiChAPumMSY64OZMWLNYnEnMfG5uwGBhffePwuskexjT+/Jea/gU3qAU8344hNohSw==}
     hasBin: true
 
-  jasmine@5.7.0:
-    resolution: {integrity: sha512-pifsdoSBgOlAbw1Tg1Vm4LxXEzDv6a+dTzHUaI9aYYqdP+PiMFgz2Mce/7TBfvuP9kshl0yZn7+G0/G1n+yExw==}
+  jasmine@5.7.1:
+    resolution: {integrity: sha512-E/4fkRNy/9ALz6z3Z3/tYXFAohoznVy7In9FWutG2fqBSkILJHFzbgZtHJUw5UrL3jgUQ4sdGYOVZ5KpSXYjGw==}
     hasBin: true
 
   jasminewd2@2.2.0:
@@ -5930,8 +5847,8 @@ packages:
     resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==}
     engines: {node: '>= 0.8'}
 
-  memfs@4.17.0:
-    resolution: {integrity: sha512-4eirfZ7thblFmqFjywlTmuWVSvccHAJbn1r8qQLzmTO11qcqpohOjmY2mFce6x7x7WtskzRqApPD0hv+Oa74jg==}
+  memfs@4.17.1:
+    resolution: {integrity: sha512-thuTRd7F4m4dReCIy7vv4eNYnU6XI/tHMLSMMHLiortw/Y0QxqKtinG523U2aerzwYWGi606oBP4oMPy4+edag==}
     engines: {node: '>= 4.0.0'}
 
   merge-descriptors@1.0.3:
@@ -6659,8 +6576,8 @@ packages:
     resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==}
     engines: {node: '>=4'}
 
-  portfinder@1.0.36:
-    resolution: {integrity: sha512-gMKUzCoP+feA7t45moaSx7UniU7PgGN3hA8acAB+3Qn7/js0/lJ07fYZlxt9riE9S3myyxDCyAFzSrLlta0c9g==}
+  portfinder@1.0.37:
+    resolution: {integrity: sha512-yuGIEjDAYnnOex9ddMnKZEMFE0CcGo6zbfzDklkmT1m5z734ss6JMzN9rNB3+RR7iS+F10D4/BVIaXOyh8PQKw==}
     engines: {node: '>= 10.12'}
 
   portscanner@2.2.0:
@@ -6807,8 +6724,8 @@ packages:
     resolution: {integrity: sha512-MRtTAZfQTluz3U2oU/X2VqVWPcR1+94nbA2V6ZrSZRVEwLqZ8eclZ551qGFQD/vD2PYqHJwWOW/fpC721uznVw==}
     engines: {node: '>=14.1.0'}
 
-  puppeteer-core@24.7.2:
-    resolution: {integrity: sha512-P9pZyTmJqKODFCnkZgemCpoFA4LbAa8+NumHVQKyP5X9IgdNS1ZnAnIh1sMAwhF8/xEUGf7jt+qmNLlKieFw1Q==}
+  puppeteer-core@24.8.0:
+    resolution: {integrity: sha512-tDf2YKIo5kM5r0vOzT52+PTgN0bBZOA4OFgQaqYyfarrcXLLJ92wi/lSMe44hd+F+gk0gw9QsAzyRW8v6ra93w==}
     engines: {node: '>=18'}
 
   puppeteer@18.2.1:
@@ -7913,46 +7830,6 @@ packages:
     engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
     hasBin: true
 
-  vite@6.3.3:
-    resolution: {integrity: sha512-5nXH+QsELbFKhsEfWLkHrvgRpTdGJzqOZ+utSdmPTvwHmvU6ITTm3xx+mRusihkcI8GeC7lCDyn3kDtiki9scw==}
-    engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
-    hasBin: true
-    peerDependencies:
-      '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0
-      jiti: '>=1.21.0'
-      less: '*'
-      lightningcss: ^1.21.0
-      sass: '*'
-      sass-embedded: '*'
-      stylus: '*'
-      sugarss: '*'
-      terser: ^5.16.0
-      tsx: ^4.8.1
-      yaml: ^2.4.2
-    peerDependenciesMeta:
-      '@types/node':
-        optional: true
-      jiti:
-        optional: true
-      less:
-        optional: true
-      lightningcss:
-        optional: true
-      sass:
-        optional: true
-      sass-embedded:
-        optional: true
-      stylus:
-        optional: true
-      sugarss:
-        optional: true
-      terser:
-        optional: true
-      tsx:
-        optional: true
-      yaml:
-        optional: true
-
   vite@6.3.5:
     resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==}
     engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
@@ -8042,8 +7919,8 @@ packages:
   weak-lru-cache@1.2.2:
     resolution: {integrity: sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==}
 
-  web-features@2.34.1:
-    resolution: {integrity: sha512-iCBDD79mpBQfocenp3dpkyhVoO5WLKJoncDcO+Rhygk2jESbktE7PBWPTDwtvZv/1Jm2tpxe0iwg9DPJyCbV8w==}
+  web-features@2.34.2:
+    resolution: {integrity: sha512-OhPNkoNZYxfykP82LwJmpAXZHiO6eojkj9ZgDKB/u16i1rtoSZSzdgXjjTZI/gtTpZo5nuZNyDAZcNESJNylDg==}
 
   web-streams-polyfill@3.3.3:
     resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==}
@@ -8233,8 +8110,8 @@ packages:
       utf-8-validate:
         optional: true
 
-  ws@8.18.1:
-    resolution: {integrity: sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==}
+  ws@8.18.2:
+    resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==}
     engines: {node: '>=10.0.0'}
     peerDependencies:
       bufferutil: ^4.0.1
@@ -8354,8 +8231,8 @@ packages:
     peerDependencies:
       zod: ^3.24.1
 
-  zod@3.24.3:
-    resolution: {integrity: sha512-HhY1oqzWCQWuUqvBFnsyrtZRhyPeR7SUGv+C4+MsisMuVfSPx8HpwWqH8tRahSlt6M3PiFAcoeFhZAqIXTxoSg==}
+  zod@3.24.4:
+    resolution: {integrity: sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg==}
 
   zone.js@0.15.0:
     resolution: {integrity: sha512-9oxn0IIjbCZkJ67L+LkhYWRyAy7axphb3VgE2MBDlOqnmHMPWGYMxJxBYFueFq/JGY2GMwS0rU+UCLunEmy5UA==}
@@ -8492,7 +8369,7 @@ snapshots:
       rxjs: 7.8.2
       tslib: 2.8.1
 
-  '@asamuzakjp/css-color@3.1.5':
+  '@asamuzakjp/css-color@3.1.7':
     dependencies:
       '@csstools/css-calc': 2.1.3(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
       '@csstools/css-color-parser': 3.0.9(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
@@ -8500,34 +8377,26 @@ snapshots:
       '@csstools/css-tokenizer': 3.0.3
       lru-cache: 10.4.3
 
-  '@babel/code-frame@7.26.2':
-    dependencies:
-      '@babel/helper-validator-identifier': 7.25.9
-      js-tokens: 4.0.0
-      picocolors: 1.1.1
-
   '@babel/code-frame@7.27.1':
     dependencies:
       '@babel/helper-validator-identifier': 7.27.1
       js-tokens: 4.0.0
       picocolors: 1.1.1
 
-  '@babel/compat-data@7.26.8': {}
-
   '@babel/compat-data@7.27.1': {}
 
   '@babel/core@7.26.10':
     dependencies:
       '@ampproject/remapping': 2.3.0
-      '@babel/code-frame': 7.26.2
+      '@babel/code-frame': 7.27.1
       '@babel/generator': 7.27.1
-      '@babel/helper-compilation-targets': 7.27.0
-      '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10)
-      '@babel/helpers': 7.27.0
-      '@babel/parser': 7.27.0
-      '@babel/template': 7.27.0
-      '@babel/traverse': 7.27.0
-      '@babel/types': 7.27.0
+      '@babel/helper-compilation-targets': 7.27.1
+      '@babel/helper-module-transforms': 7.27.1(@babel/core@7.26.10)
+      '@babel/helpers': 7.27.1
+      '@babel/parser': 7.27.1
+      '@babel/template': 7.27.1
+      '@babel/traverse': 7.27.1
+      '@babel/types': 7.27.1
       convert-source-map: 2.0.0
       debug: 4.4.0(supports-color@10.0.0)
       gensync: 1.0.0-beta.2
@@ -8568,19 +8437,11 @@ snapshots:
     dependencies:
       '@babel/types': 7.27.1
 
-  '@babel/helper-compilation-targets@7.27.0':
-    dependencies:
-      '@babel/compat-data': 7.26.8
-      '@babel/helper-validator-option': 7.25.9
-      browserslist: 4.24.4
-      lru-cache: 5.1.1
-      semver: 6.3.1
-
   '@babel/helper-compilation-targets@7.27.1':
     dependencies:
       '@babel/compat-data': 7.27.1
       '@babel/helper-validator-option': 7.27.1
-      browserslist: 4.24.4
+      browserslist: 4.24.5
       lru-cache: 5.1.1
       semver: 6.3.1
 
@@ -8597,13 +8458,6 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@babel/helper-create-regexp-features-plugin@7.27.0(@babel/core@7.27.1)':
-    dependencies:
-      '@babel/core': 7.27.1
-      '@babel/helper-annotate-as-pure': 7.27.1
-      regexpu-core: 6.2.0
-      semver: 6.3.1
-
   '@babel/helper-create-regexp-features-plugin@7.27.1(@babel/core@7.27.1)':
     dependencies:
       '@babel/core': 7.27.1
@@ -8614,7 +8468,7 @@ snapshots:
   '@babel/helper-define-polyfill-provider@0.6.4(@babel/core@7.27.1)':
     dependencies:
       '@babel/core': 7.27.1
-      '@babel/helper-compilation-targets': 7.27.0
+      '@babel/helper-compilation-targets': 7.27.1
       '@babel/helper-plugin-utils': 7.27.1
       debug: 4.4.0(supports-color@10.0.0)
       lodash.debounce: 4.0.8
@@ -8629,13 +8483,6 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@babel/helper-module-imports@7.25.9':
-    dependencies:
-      '@babel/traverse': 7.27.0
-      '@babel/types': 7.27.0
-    transitivePeerDependencies:
-      - supports-color
-
   '@babel/helper-module-imports@7.27.1':
     dependencies:
       '@babel/traverse': 7.27.1
@@ -8643,12 +8490,12 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.10)':
+  '@babel/helper-module-transforms@7.27.1(@babel/core@7.26.10)':
     dependencies:
       '@babel/core': 7.26.10
-      '@babel/helper-module-imports': 7.25.9
-      '@babel/helper-validator-identifier': 7.25.9
-      '@babel/traverse': 7.27.0
+      '@babel/helper-module-imports': 7.27.1
+      '@babel/helper-validator-identifier': 7.27.1
+      '@babel/traverse': 7.27.1
     transitivePeerDependencies:
       - supports-color
 
@@ -8694,18 +8541,12 @@ snapshots:
 
   '@babel/helper-split-export-declaration@7.24.7':
     dependencies:
-      '@babel/types': 7.27.0
-
-  '@babel/helper-string-parser@7.25.9': {}
+      '@babel/types': 7.27.1
 
   '@babel/helper-string-parser@7.27.1': {}
 
-  '@babel/helper-validator-identifier@7.25.9': {}
-
   '@babel/helper-validator-identifier@7.27.1': {}
 
-  '@babel/helper-validator-option@7.25.9': {}
-
   '@babel/helper-validator-option@7.27.1': {}
 
   '@babel/helper-wrap-function@7.27.1':
@@ -8716,20 +8557,11 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@babel/helpers@7.27.0':
-    dependencies:
-      '@babel/template': 7.27.0
-      '@babel/types': 7.27.0
-
   '@babel/helpers@7.27.1':
     dependencies:
       '@babel/template': 7.27.1
       '@babel/types': 7.27.1
 
-  '@babel/parser@7.27.0':
-    dependencies:
-      '@babel/types': 7.27.0
-
   '@babel/parser@7.27.1':
     dependencies:
       '@babel/types': 7.27.1
@@ -8786,7 +8618,7 @@ snapshots:
   '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.27.1)':
     dependencies:
       '@babel/core': 7.27.1
-      '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.27.1)
+      '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.1)
       '@babel/helper-plugin-utils': 7.27.1
 
   '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.27.1)':
@@ -9189,7 +9021,7 @@ snapshots:
       babel-plugin-polyfill-corejs2: 0.4.13(@babel/core@7.27.1)
       babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.27.1)
       babel-plugin-polyfill-regenerator: 0.6.4(@babel/core@7.27.1)
-      core-js-compat: 3.41.0
+      core-js-compat: 3.42.0
       semver: 6.3.1
     transitivePeerDependencies:
       - supports-color
@@ -9198,35 +9030,17 @@ snapshots:
     dependencies:
       '@babel/core': 7.27.1
       '@babel/helper-plugin-utils': 7.27.1
-      '@babel/types': 7.27.0
+      '@babel/types': 7.27.1
       esutils: 2.0.3
 
   '@babel/runtime@7.27.1': {}
 
-  '@babel/template@7.27.0':
-    dependencies:
-      '@babel/code-frame': 7.26.2
-      '@babel/parser': 7.27.0
-      '@babel/types': 7.27.0
-
   '@babel/template@7.27.1':
     dependencies:
       '@babel/code-frame': 7.27.1
       '@babel/parser': 7.27.1
       '@babel/types': 7.27.1
 
-  '@babel/traverse@7.27.0':
-    dependencies:
-      '@babel/code-frame': 7.26.2
-      '@babel/generator': 7.27.1
-      '@babel/parser': 7.27.0
-      '@babel/template': 7.27.0
-      '@babel/types': 7.27.0
-      debug: 4.4.0(supports-color@10.0.0)
-      globals: 11.12.0
-    transitivePeerDependencies:
-      - supports-color
-
   '@babel/traverse@7.27.1':
     dependencies:
       '@babel/code-frame': 7.27.1
@@ -9239,11 +9053,6 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@babel/types@7.27.0':
-    dependencies:
-      '@babel/helper-string-parser': 7.25.9
-      '@babel/helper-validator-identifier': 7.25.9
-
   '@babel/types@7.27.1':
     dependencies:
       '@babel/helper-string-parser': 7.27.1
@@ -9377,7 +9186,7 @@ snapshots:
   '@esbuild/win32-x64@0.25.3':
     optional: true
 
-  '@eslint-community/eslint-utils@4.6.1(eslint@9.26.0(jiti@1.21.7))':
+  '@eslint-community/eslint-utils@4.7.0(eslint@9.26.0(jiti@1.21.7))':
     dependencies:
       eslint: 9.26.0(jiti@1.21.7)
       eslint-visitor-keys: 3.4.3
@@ -9396,7 +9205,7 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@eslint/config-helpers@0.2.1': {}
+  '@eslint/config-helpers@0.2.2': {}
 
   '@eslint/core@0.13.0':
     dependencies:
@@ -9683,12 +9492,12 @@ snapshots:
   '@jsonjoy.com/json-pack@1.2.0(tslib@2.8.1)':
     dependencies:
       '@jsonjoy.com/base64': 1.1.2(tslib@2.8.1)
-      '@jsonjoy.com/util': 1.5.0(tslib@2.8.1)
+      '@jsonjoy.com/util': 1.6.0(tslib@2.8.1)
       hyperdyperid: 1.2.0
       thingies: 1.21.0(tslib@2.8.1)
       tslib: 2.8.1
 
-  '@jsonjoy.com/util@1.5.0(tslib@2.8.1)':
+  '@jsonjoy.com/util@1.6.0(tslib@2.8.1)':
     dependencies:
       tslib: 2.8.1
 
@@ -9717,7 +9526,7 @@ snapshots:
   '@lmdb/lmdb-win32-x64@3.2.6':
     optional: true
 
-  '@mdn/browser-compat-data@6.0.9': {}
+  '@mdn/browser-compat-data@6.0.11': {}
 
   '@modelcontextprotocol/sdk@1.11.0':
     dependencies:
@@ -9729,8 +9538,8 @@ snapshots:
       express-rate-limit: 7.5.0(express@5.1.0)
       pkce-challenge: 5.0.0
       raw-body: 3.0.0
-      zod: 3.24.3
-      zod-to-json-schema: 3.24.5(zod@3.24.3)
+      zod: 3.24.4
+      zod-to-json-schema: 3.24.5(zod@3.24.4)
     transitivePeerDependencies:
       - supports-color
 
@@ -9878,7 +9687,7 @@ snapshots:
     dependencies:
       which: 5.0.0
 
-  '@npmcli/redact@3.2.0': {}
+  '@npmcli/redact@3.2.1': {}
 
   '@npmcli/run-script@9.1.0':
     dependencies:
@@ -10061,7 +9870,7 @@ snapshots:
 
   '@protobufjs/utf8@1.1.0': {}
 
-  '@puppeteer/browsers@2.10.2':
+  '@puppeteer/browsers@2.10.3':
     dependencies:
       debug: 4.4.0(supports-color@10.0.0)
       extract-zip: 2.0.1
@@ -10228,7 +10037,7 @@ snapshots:
 
   '@stylistic/eslint-plugin@4.2.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)':
     dependencies:
-      '@typescript-eslint/utils': 8.31.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
+      '@typescript-eslint/utils': 8.31.1(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
       eslint: 9.26.0(jiti@1.21.7)
       eslint-visitor-keys: 4.2.0
       espree: 10.3.0
@@ -10265,24 +10074,24 @@ snapshots:
 
   '@types/babel__core@7.20.5':
     dependencies:
-      '@babel/parser': 7.27.0
-      '@babel/types': 7.27.0
+      '@babel/parser': 7.27.1
+      '@babel/types': 7.27.1
       '@types/babel__generator': 7.27.0
       '@types/babel__template': 7.4.4
       '@types/babel__traverse': 7.20.7
 
   '@types/babel__generator@7.27.0':
     dependencies:
-      '@babel/types': 7.27.0
+      '@babel/types': 7.27.1
 
   '@types/babel__template@7.4.4':
     dependencies:
-      '@babel/parser': 7.27.0
-      '@babel/types': 7.27.0
+      '@babel/parser': 7.27.1
+      '@babel/types': 7.27.1
 
   '@types/babel__traverse@7.20.7':
     dependencies:
-      '@babel/types': 7.27.0
+      '@babel/types': 7.27.1
 
   '@types/big.js@6.2.2': {}
 
@@ -10648,11 +10457,6 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@typescript-eslint/scope-manager@8.31.0':
-    dependencies:
-      '@typescript-eslint/types': 8.31.0
-      '@typescript-eslint/visitor-keys': 8.31.0
-
   '@typescript-eslint/scope-manager@8.31.1':
     dependencies:
       '@typescript-eslint/types': 8.31.1
@@ -10669,24 +10473,8 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@typescript-eslint/types@8.31.0': {}
-
   '@typescript-eslint/types@8.31.1': {}
 
-  '@typescript-eslint/typescript-estree@8.31.0(typescript@5.8.3)':
-    dependencies:
-      '@typescript-eslint/types': 8.31.0
-      '@typescript-eslint/visitor-keys': 8.31.0
-      debug: 4.4.0(supports-color@10.0.0)
-      fast-glob: 3.3.3
-      is-glob: 4.0.3
-      minimatch: 9.0.5
-      semver: 7.7.1
-      ts-api-utils: 2.1.0(typescript@5.8.3)
-      typescript: 5.8.3
-    transitivePeerDependencies:
-      - supports-color
-
   '@typescript-eslint/typescript-estree@8.31.1(typescript@5.8.3)':
     dependencies:
       '@typescript-eslint/types': 8.31.1
@@ -10701,20 +10489,9 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@typescript-eslint/utils@8.31.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)':
-    dependencies:
-      '@eslint-community/eslint-utils': 4.6.1(eslint@9.26.0(jiti@1.21.7))
-      '@typescript-eslint/scope-manager': 8.31.0
-      '@typescript-eslint/types': 8.31.0
-      '@typescript-eslint/typescript-estree': 8.31.0(typescript@5.8.3)
-      eslint: 9.26.0(jiti@1.21.7)
-      typescript: 5.8.3
-    transitivePeerDependencies:
-      - supports-color
-
   '@typescript-eslint/utils@8.31.1(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)':
     dependencies:
-      '@eslint-community/eslint-utils': 4.6.1(eslint@9.26.0(jiti@1.21.7))
+      '@eslint-community/eslint-utils': 4.7.0(eslint@9.26.0(jiti@1.21.7))
       '@typescript-eslint/scope-manager': 8.31.1
       '@typescript-eslint/types': 8.31.1
       '@typescript-eslint/typescript-estree': 8.31.1(typescript@5.8.3)
@@ -10723,11 +10500,6 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@typescript-eslint/visitor-keys@8.31.0':
-    dependencies:
-      '@typescript-eslint/types': 8.31.0
-      eslint-visitor-keys: 4.2.0
-
   '@typescript-eslint/visitor-keys@8.31.1':
     dependencies:
       '@typescript-eslint/types': 8.31.1
@@ -10891,18 +10663,22 @@ snapshots:
       chai: 5.2.0
       tinyrainbow: 2.0.0
 
-  '@vitest/mocker@3.1.2(vite@6.3.3(@types/node@20.17.32)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1))':
+  '@vitest/mocker@3.1.2(vite@6.3.5(@types/node@20.17.32)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1))':
     dependencies:
       '@vitest/spy': 3.1.2
       estree-walker: 3.0.3
       magic-string: 0.30.17
     optionalDependencies:
-      vite: 6.3.3(@types/node@20.17.32)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1)
+      vite: 6.3.5(@types/node@20.17.32)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1)
 
   '@vitest/pretty-format@3.1.2':
     dependencies:
       tinyrainbow: 2.0.0
 
+  '@vitest/pretty-format@3.1.3':
+    dependencies:
+      tinyrainbow: 2.0.0
+
   '@vitest/runner@3.1.2':
     dependencies:
       '@vitest/utils': 3.1.2
@@ -10970,7 +10746,7 @@ snapshots:
 
   '@web/dev-server@0.4.6':
     dependencies:
-      '@babel/code-frame': 7.26.2
+      '@babel/code-frame': 7.27.1
       '@types/command-line-args': 5.2.3
       '@web/config-loader': 0.3.3
       '@web/dev-server-core': 0.7.5
@@ -10983,7 +10759,7 @@ snapshots:
       internal-ip: 6.2.0
       nanocolors: 0.2.13
       open: 8.4.2
-      portfinder: 1.0.36
+      portfinder: 1.0.37
     transitivePeerDependencies:
       - bufferutil
       - supports-color
@@ -10999,7 +10775,7 @@ snapshots:
       '@web/test-runner-core': 0.13.4
       '@web/test-runner-coverage-v8': 0.8.0
       chrome-launcher: 0.15.2
-      puppeteer-core: 24.7.2
+      puppeteer-core: 24.8.0
     transitivePeerDependencies:
       - bare-buffer
       - bufferutil
@@ -11017,7 +10793,7 @@ snapshots:
 
   '@web/test-runner-core@0.13.4':
     dependencies:
-      '@babel/code-frame': 7.26.2
+      '@babel/code-frame': 7.27.1
       '@types/babel__code-frame': 7.0.6
       '@types/co-body': 6.1.3
       '@types/convert-source-map': 2.0.3
@@ -11084,7 +10860,7 @@ snapshots:
       diff: 5.2.0
       globby: 11.1.0
       nanocolors: 0.2.13
-      portfinder: 1.0.36
+      portfinder: 1.0.37
       source-map: 0.7.4
     transitivePeerDependencies:
       - bare-buffer
@@ -11388,8 +11164,8 @@ snapshots:
 
   autoprefixer@10.4.21(postcss@8.5.3):
     dependencies:
-      browserslist: 4.24.4
-      caniuse-lite: 1.0.30001715
+      browserslist: 4.24.5
+      caniuse-lite: 1.0.30001717
       fraction.js: 4.3.7
       normalize-range: 0.1.2
       picocolors: 1.1.1
@@ -11414,7 +11190,7 @@ snapshots:
 
   babel-plugin-polyfill-corejs2@0.4.13(@babel/core@7.27.1):
     dependencies:
-      '@babel/compat-data': 7.26.8
+      '@babel/compat-data': 7.27.1
       '@babel/core': 7.27.1
       '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.27.1)
       semver: 6.3.1
@@ -11425,7 +11201,7 @@ snapshots:
     dependencies:
       '@babel/core': 7.27.1
       '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.27.1)
-      core-js-compat: 3.41.0
+      core-js-compat: 3.42.0
     transitivePeerDependencies:
       - supports-color
 
@@ -11441,7 +11217,7 @@ snapshots:
   bare-events@2.5.4:
     optional: true
 
-  bare-fs@4.1.3:
+  bare-fs@4.1.4:
     dependencies:
       bare-events: 2.5.4
       bare-path: 3.0.0
@@ -11469,8 +11245,8 @@ snapshots:
 
   baseline-browser-mapping@2.3.0:
     dependencies:
-      '@mdn/browser-compat-data': 6.0.9
-      web-features: 2.34.1
+      '@mdn/browser-compat-data': 6.0.11
+      web-features: 2.34.2
 
   basic-ftp@5.0.5: {}
 
@@ -11626,12 +11402,12 @@ snapshots:
     dependencies:
       pako: 0.2.9
 
-  browserslist@4.24.4:
+  browserslist@4.24.5:
     dependencies:
-      caniuse-lite: 1.0.30001715
-      electron-to-chromium: 1.5.143
+      caniuse-lite: 1.0.30001717
+      electron-to-chromium: 1.5.149
       node-releases: 2.0.19
-      update-browserslist-db: 1.1.3(browserslist@4.24.4)
+      update-browserslist-db: 1.1.3(browserslist@4.24.5)
 
   browserstack@1.6.1:
     dependencies:
@@ -11708,7 +11484,7 @@ snapshots:
 
   camelcase@6.3.0: {}
 
-  caniuse-lite@1.0.30001715: {}
+  caniuse-lite@1.0.30001717: {}
 
   caseless@0.12.0: {}
 
@@ -11784,11 +11560,11 @@ snapshots:
 
   chrome-trace-event@1.0.4: {}
 
-  chromium-bidi@4.1.1(devtools-protocol@0.0.1425554):
+  chromium-bidi@4.1.1(devtools-protocol@0.0.1439962):
     dependencies:
-      devtools-protocol: 0.0.1425554
+      devtools-protocol: 0.0.1439962
       mitt: 3.0.1
-      zod: 3.24.3
+      zod: 3.24.4
 
   cli-cursor@3.1.0:
     dependencies:
@@ -11967,9 +11743,9 @@ snapshots:
       tinyglobby: 0.2.13
       webpack: 5.99.7(esbuild@0.25.3)
 
-  core-js-compat@3.41.0:
+  core-js-compat@3.42.0:
     dependencies:
-      browserslist: 4.24.4
+      browserslist: 4.24.5
 
   core-js@3.40.0: {}
 
@@ -12046,7 +11822,7 @@ snapshots:
 
   cssstyle@4.3.1:
     dependencies:
-      '@asamuzakjp/css-color': 3.1.5
+      '@asamuzakjp/css-color': 3.1.7
       rrweb-cssom: 0.8.0
 
   custom-event@1.0.1: {}
@@ -12197,7 +11973,7 @@ snapshots:
 
   devtools-protocol@0.0.1045489: {}
 
-  devtools-protocol@0.0.1425554: {}
+  devtools-protocol@0.0.1439962: {}
 
   di@0.0.1: {}
 
@@ -12283,7 +12059,7 @@ snapshots:
 
   ee-first@1.1.1: {}
 
-  electron-to-chromium@1.5.143: {}
+  electron-to-chromium@1.5.149: {}
 
   emoji-regex@10.4.0: {}
 
@@ -12575,10 +12351,10 @@ snapshots:
 
   eslint@9.26.0(jiti@1.21.7):
     dependencies:
-      '@eslint-community/eslint-utils': 4.6.1(eslint@9.26.0(jiti@1.21.7))
+      '@eslint-community/eslint-utils': 4.7.0(eslint@9.26.0(jiti@1.21.7))
       '@eslint-community/regexpp': 4.12.1
       '@eslint/config-array': 0.20.0
-      '@eslint/config-helpers': 0.2.1
+      '@eslint/config-helpers': 0.2.2
       '@eslint/core': 0.13.0
       '@eslint/eslintrc': 3.3.1
       '@eslint/js': 9.26.0
@@ -12611,7 +12387,7 @@ snapshots:
       minimatch: 3.1.2
       natural-compare: 1.4.0
       optionator: 0.9.4
-      zod: 3.24.3
+      zod: 3.24.4
     optionalDependencies:
       jiti: 1.21.7
     transitivePeerDependencies:
@@ -12775,7 +12551,7 @@ snapshots:
 
   extract-zip@2.0.1:
     dependencies:
-      debug: 4.4.0(supports-color@10.0.0)
+      debug: 4.3.4
       get-stream: 5.2.0
       yauzl: 2.10.0
     optionalDependencies:
@@ -13685,7 +13461,7 @@ snapshots:
   istanbul-lib-instrument@5.2.1:
     dependencies:
       '@babel/core': 7.27.1
-      '@babel/parser': 7.27.0
+      '@babel/parser': 7.27.1
       '@istanbuljs/schema': 0.1.3
       istanbul-lib-coverage: 3.2.2
       semver: 6.3.1
@@ -13695,7 +13471,7 @@ snapshots:
   istanbul-lib-instrument@6.0.3:
     dependencies:
       '@babel/core': 7.27.1
-      '@babel/parser': 7.27.0
+      '@babel/parser': 7.27.1
       '@istanbuljs/schema': 0.1.3
       istanbul-lib-coverage: 3.2.2
       semver: 7.7.1
@@ -13731,7 +13507,7 @@ snapshots:
 
   jasmine-core@4.6.1: {}
 
-  jasmine-core@5.7.0: {}
+  jasmine-core@5.7.1: {}
 
   jasmine-reporters@2.5.2:
     dependencies:
@@ -13748,10 +13524,10 @@ snapshots:
       glob: 7.2.3
       jasmine-core: 2.8.0
 
-  jasmine@5.7.0:
+  jasmine@5.7.1:
     dependencies:
       glob: 10.4.5
-      jasmine-core: 5.7.0
+      jasmine-core: 5.7.1
 
   jasminewd2@2.2.0: {}
 
@@ -13795,7 +13571,7 @@ snapshots:
       whatwg-encoding: 3.1.1
       whatwg-mimetype: 4.0.0
       whatwg-url: 14.2.0
-      ws: 8.18.1
+      ws: 8.18.2
       xml-name-validator: 5.0.0
     transitivePeerDependencies:
       - bufferutil
@@ -13915,9 +13691,9 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  karma-jasmine-html-reporter@2.1.0(jasmine-core@5.7.0)(karma-jasmine@5.1.0(karma@6.4.4))(karma@6.4.4):
+  karma-jasmine-html-reporter@2.1.0(jasmine-core@5.7.1)(karma-jasmine@5.1.0(karma@6.4.4))(karma@6.4.4):
     dependencies:
-      jasmine-core: 5.7.0
+      jasmine-core: 5.7.1
       karma: 6.4.4
       karma-jasmine: 5.1.0(karma@6.4.4)
 
@@ -14246,10 +14022,10 @@ snapshots:
 
   media-typer@1.1.0: {}
 
-  memfs@4.17.0:
+  memfs@4.17.1:
     dependencies:
       '@jsonjoy.com/json-pack': 1.2.0(tslib@2.8.1)
-      '@jsonjoy.com/util': 1.5.0(tslib@2.8.1)
+      '@jsonjoy.com/util': 1.6.0(tslib@2.8.1)
       tree-dump: 1.0.2(tslib@2.8.1)
       tslib: 2.8.1
 
@@ -14431,7 +14207,7 @@ snapshots:
       '@rollup/wasm-node': 4.40.1
       ajv: 8.17.1
       ansi-colors: 4.1.3
-      browserslist: 4.24.4
+      browserslist: 4.24.5
       chokidar: 4.0.3
       commander: 13.1.0
       dependency-graph: 1.0.0
@@ -14544,7 +14320,7 @@ snapshots:
 
   npm-registry-fetch@18.0.2:
     dependencies:
-      '@npmcli/redact': 3.2.0
+      '@npmcli/redact': 3.2.1
       jsonparse: 1.3.1
       make-fetch-happen: 14.0.3
       minipass: 7.1.2
@@ -14780,7 +14556,7 @@ snapshots:
 
   parse-json@5.2.0:
     dependencies:
-      '@babel/code-frame': 7.26.2
+      '@babel/code-frame': 7.27.1
       error-ex: 1.3.2
       json-parse-even-better-errors: 2.3.1
       lines-and-columns: 1.2.4
@@ -14906,7 +14682,7 @@ snapshots:
 
   pluralize@8.0.0: {}
 
-  portfinder@1.0.36:
+  portfinder@1.0.37:
     dependencies:
       async: 3.2.6
       debug: 4.4.0(supports-color@10.0.0)
@@ -15092,14 +14868,14 @@ snapshots:
       - supports-color
       - utf-8-validate
 
-  puppeteer-core@24.7.2:
+  puppeteer-core@24.8.0:
     dependencies:
-      '@puppeteer/browsers': 2.10.2
-      chromium-bidi: 4.1.1(devtools-protocol@0.0.1425554)
+      '@puppeteer/browsers': 2.10.3
+      chromium-bidi: 4.1.1(devtools-protocol@0.0.1439962)
       debug: 4.4.0(supports-color@10.0.0)
-      devtools-protocol: 0.0.1425554
+      devtools-protocol: 0.0.1439962
       typed-query-selector: 2.12.0
-      ws: 8.18.1
+      ws: 8.18.2
     transitivePeerDependencies:
       - bare-buffer
       - bufferutil
@@ -15370,7 +15146,7 @@ snapshots:
       rollup: 4.40.1
       typescript: 5.8.3
     optionalDependencies:
-      '@babel/code-frame': 7.26.2
+      '@babel/code-frame': 7.27.1
 
   rollup-plugin-sourcemaps2@0.5.1(@types/node@20.17.32)(rollup@4.40.1):
     dependencies:
@@ -16027,7 +15803,7 @@ snapshots:
       pump: 3.0.2
       tar-stream: 3.1.7
     optionalDependencies:
-      bare-fs: 4.1.3
+      bare-fs: 4.1.4
       bare-path: 3.0.0
     transitivePeerDependencies:
       - bare-buffer
@@ -16357,9 +16133,9 @@ snapshots:
 
   unpipe@1.0.0: {}
 
-  update-browserslist-db@1.1.3(browserslist@4.24.4):
+  update-browserslist-db@1.1.3(browserslist@4.24.5):
     dependencies:
-      browserslist: 4.24.4
+      browserslist: 4.24.5
       escalade: 3.2.0
       picocolors: 1.1.1
 
@@ -16491,23 +16267,6 @@ snapshots:
       - tsx
       - yaml
 
-  vite@6.3.3(@types/node@20.17.32)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1):
-    dependencies:
-      esbuild: 0.25.3
-      fdir: 6.4.4(picomatch@4.0.2)
-      picomatch: 4.0.2
-      postcss: 8.5.3
-      rollup: 4.40.1
-      tinyglobby: 0.2.13
-    optionalDependencies:
-      '@types/node': 20.17.32
-      fsevents: 2.3.3
-      jiti: 1.21.7
-      less: 4.3.0
-      sass: 1.87.0
-      terser: 5.39.0
-      yaml: 2.7.1
-
   vite@6.3.5(@types/node@20.17.32)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1):
     dependencies:
       esbuild: 0.25.3
@@ -16528,8 +16287,8 @@ snapshots:
   vitest@3.1.2(@types/node@20.17.32)(jiti@1.21.7)(jsdom@26.1.0)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1):
     dependencies:
       '@vitest/expect': 3.1.2
-      '@vitest/mocker': 3.1.2(vite@6.3.3(@types/node@20.17.32)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1))
-      '@vitest/pretty-format': 3.1.2
+      '@vitest/mocker': 3.1.2(vite@6.3.5(@types/node@20.17.32)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1))
+      '@vitest/pretty-format': 3.1.3
       '@vitest/runner': 3.1.2
       '@vitest/snapshot': 3.1.2
       '@vitest/spy': 3.1.2
@@ -16545,7 +16304,7 @@ snapshots:
       tinyglobby: 0.2.13
       tinypool: 1.0.2
       tinyrainbow: 2.0.0
-      vite: 6.3.3(@types/node@20.17.32)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1)
+      vite: 6.3.5(@types/node@20.17.32)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1)
       vite-node: 3.1.2(@types/node@20.17.32)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1)
       why-is-node-running: 2.3.0
     optionalDependencies:
@@ -16587,7 +16346,7 @@ snapshots:
   weak-lru-cache@1.2.2:
     optional: true
 
-  web-features@2.34.1: {}
+  web-features@2.34.2: {}
 
   web-streams-polyfill@3.3.3: {}
 
@@ -16617,7 +16376,7 @@ snapshots:
   webpack-dev-middleware@7.4.2(webpack@5.99.7(esbuild@0.25.3)):
     dependencies:
       colorette: 2.0.20
-      memfs: 4.17.0
+      memfs: 4.17.1
       mime-types: 2.1.35
       on-finished: 2.4.1
       range-parser: 1.2.1
@@ -16654,7 +16413,7 @@ snapshots:
       sockjs: 0.3.24
       spdy: 4.0.2
       webpack-dev-middleware: 7.4.2(webpack@5.99.7(esbuild@0.25.3))
-      ws: 8.18.1
+      ws: 8.18.2
     optionalDependencies:
       webpack: 5.99.7(esbuild@0.25.3)
     transitivePeerDependencies:
@@ -16685,7 +16444,7 @@ snapshots:
       '@webassemblyjs/wasm-edit': 1.14.1
       '@webassemblyjs/wasm-parser': 1.14.1
       acorn: 8.14.1
-      browserslist: 4.24.4
+      browserslist: 4.24.5
       chrome-trace-event: 1.0.4
       enhanced-resolve: 5.18.1
       es-module-lexer: 1.7.0
@@ -16829,7 +16588,7 @@ snapshots:
 
   ws@8.17.1: {}
 
-  ws@8.18.1: {}
+  ws@8.18.2: {}
 
   ws@8.9.0: {}
 
@@ -16918,10 +16677,10 @@ snapshots:
 
   yoctocolors-cjs@2.1.2: {}
 
-  zod-to-json-schema@3.24.5(zod@3.24.3):
+  zod-to-json-schema@3.24.5(zod@3.24.4):
     dependencies:
-      zod: 3.24.3
+      zod: 3.24.4
 
-  zod@3.24.3: {}
+  zod@3.24.4: {}
 
   zone.js@0.15.0: {}

From f36a27272f3f7e2673d692d73286280f4c6d357a Mon Sep 17 00:00:00 2001
From: Charles Lyding <19598772+clydin@users.noreply.github.com>
Date: Sun, 4 May 2025 19:22:52 -0400
Subject: [PATCH 018/138] fix(@angular/build): allow a default application
 `browser` option

The application build system's `browser` option is now considered optional.
If not present, the value will be an `main.ts` file within the configured
project source root (`sourceRoot`). This change allows the removal of the
`browser` option from any project that uses the default generated value.

(cherry picked from commit c560d440d5a74852fe269809a1f5c1cd45c7a363)
---
 goldens/public-api/angular/build/index.api.md |  2 +-
 .../build/src/builders/application/options.ts | 20 +++++----
 .../src/builders/application/schema.json      |  2 +-
 .../application/tests/options/browser_spec.ts | 43 +++++++++++++++++++
 4 files changed, 57 insertions(+), 10 deletions(-)

diff --git a/goldens/public-api/angular/build/index.api.md b/goldens/public-api/angular/build/index.api.md
index 6c0c2f19145b..31576f664e36 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[];
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<string> | Map<string, string> = new Set(),
+  entryPoints: Set<string> | Map<string, string> | undefined,
 ): Record<string, string> {
   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,

From f42f5c14c0c51d7705bee7b67afc317c45fb9230 Mon Sep 17 00:00:00 2001
From: Charles Lyding <19598772+clydin@users.noreply.github.com>
Date: Mon, 5 May 2025 11:42:47 -0400
Subject: [PATCH 019/138] fix(@angular/build): allow component HMR for
 templates with i18n

When using the development server with the `application` build system
and HMR has been enabled (default), component templates with i18n are
now eligible to be hot reloaded. If translations exist within the template,
they will also be translated assuming a matching translation is available.
Changing the content of an i18n block may result in a missing translation
warning/error. The development server continues to only support a single
enabled locale.

(cherry picked from commit 49898e27345bcf4c95d8e0ead32bc4c4ae22ee33)
---
 .../src/builders/application/execute-build.ts |  6 ++-
 .../build/src/builders/application/i18n.ts    | 24 +++++++++
 .../angular/compilation/aot-compilation.ts    |  5 +-
 .../src/tools/esbuild/i18n-inliner-worker.ts  | 49 +++++++++++++++++--
 .../build/src/tools/esbuild/i18n-inliner.ts   | 38 ++++++++++++++
 5 files changed, 112 insertions(+), 10 deletions(-)

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/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/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<string, unknown>;
 }
 
+/**
+ * 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<string, unknown>;
+}
+
 // 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<string, unk
 async function transformWithBabel(
   code: string,
   map: SourceMapInput | undefined,
-  options: InlineRequest,
+  options: InlineFileRequest,
 ) {
   let ast;
   try {
diff --git a/packages/angular/build/src/tools/esbuild/i18n-inliner.ts b/packages/angular/build/src/tools/esbuild/i18n-inliner.ts
index e2fac79709b7..365fbb300953 100644
--- a/packages/angular/build/src/tools/esbuild/i18n-inliner.ts
+++ b/packages/angular/build/src/tools/esbuild/i18n-inliner.ts
@@ -209,6 +209,44 @@ export class I18nInliner {
     };
   }
 
+  async inlineTemplateUpdate(
+    locale: string,
+    translation: Record<string, unknown> | 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.

From ffaf8aa194ccb4b541c4c5291da5a58c86635f1d Mon Sep 17 00:00:00 2001
From: Charles Lyding <19598772+clydin@users.noreply.github.com>
Date: Mon, 5 May 2025 14:11:23 -0400
Subject: [PATCH 020/138] fix(@angular/build): avoid attempting to watch
 bundler internal files

The internal bundler (`esbuild`) may use virtual files to represent added
content to the output files. This includes names such as `<define:???>` and
`<runtime>` to reference object define values and runtime code, respectively.
It may also use paths that end with `(disabled):<node_builtin_name>` where
`<node_builtin_name>` is one of Node.js' builtin modules. All these cases
are now handled by the file watching system and will not be attempted to
be watched. Previously these virtual files would be considered removed by
the file watching system as they do not actually exist on the file system.

(cherry picked from commit 27f7007ca3b1f5c2fb802b0ad37dce463171ec8e)
---
 .../src/tools/esbuild/bundler-context.ts      | 36 ++++++++++++++-----
 1 file changed, 28 insertions(+), 8 deletions(-)

diff --git a/packages/angular/build/src/tools/esbuild/bundler-context.ts b/packages/angular/build/src/tools/esbuild/bundler-context.ts
index 0d6b3d59ceaf..9b722e41640e 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';
@@ -245,7 +246,7 @@ export class BundlerContext {
         // When incremental always add any files from the load result cache
         if (this.#loadCache) {
           for (const file of this.#loadCache.watchFiles) {
-            if (!isInternalAngularFileOrEsBuildDefine(file)) {
+            if (!isInternalAngularFile(file)) {
               // watch files are fully resolved paths
               this.watchFiles.add(file);
             }
@@ -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 (!isInternalAngularFileOrEsBuildDefine(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));
       }
     }
 
@@ -417,12 +420,12 @@ export class BundlerContext {
   #addErrorsToWatch(result: BuildFailure | BuildResult): void {
     for (const error of result.errors) {
       let file = error.location?.file;
-      if (file && !isInternalAngularFileOrEsBuildDefine(file)) {
+      if (file && !isInternalAngularFile(file)) {
         this.watchFiles.add(join(this.workspaceRoot, file));
       }
       for (const note of error.notes) {
         file = note.location?.file;
-        if (file && !isInternalAngularFileOrEsBuildDefine(file)) {
+        if (file && !isInternalAngularFile(file)) {
           this.watchFiles.add(join(this.workspaceRoot, file));
         }
       }
@@ -475,6 +478,23 @@ export class BundlerContext {
   }
 }
 
-function isInternalAngularFileOrEsBuildDefine(file: string) {
-  return file.startsWith('angular:') || file.startsWith('<define:');
+function isInternalAngularFile(file: string) {
+  return file.startsWith('angular:');
+}
+
+function isInternalBundlerFile(file: string) {
+  // Bundler virtual files such as "<define:???>" or "<runtime>"
+  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;
 }

From 888d0b2ad7eebc07ffcba3d6606766471bc25e19 Mon Sep 17 00:00:00 2001
From: Angular Robot <angular-robot@google.com>
Date: Tue, 6 May 2025 09:04:50 +0000
Subject: [PATCH 021/138] build: update all non-major dependencies

(cherry picked from commit 68764c4db900d296573a1ae2703391cd7de9f822)
---
 modules/testing/builder/package.json          |   2 +-
 package.json                                  |  12 +-
 packages/angular/build/package.json           |  10 +-
 packages/angular/cli/package.json             |   4 +-
 .../angular_devkit/build_angular/package.json |   4 +-
 pnpm-lock.yaml                                | 880 ++++++++++--------
 6 files changed, 488 insertions(+), 424 deletions(-)

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/package.json b/package.json
index d66041764a60..dcbcb9578f07 100644
--- a/package.json
+++ b/package.json
@@ -94,14 +94,14 @@
     "@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.0",
+    "@typescript-eslint/parser": "8.32.0",
     "ajv": "8.17.1",
     "ansi-colors": "4.1.3",
     "beasties": "0.3.3",
     "buffer": "6.0.3",
-    "esbuild": "0.25.3",
-    "esbuild-wasm": "0.25.3",
+    "esbuild": "0.25.4",
+    "esbuild-wasm": "0.25.4",
     "eslint": "9.26.0",
     "eslint-config-prettier": "10.1.2",
     "eslint-plugin-header": "3.1.1",
@@ -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",
@@ -132,7 +132,7 @@
     "protractor": "~7.0.0",
     "puppeteer": "18.2.1",
     "quicktype-core": "23.1.3",
-    "rollup": "4.40.1",
+    "rollup": "4.40.2",
     "rollup-license-plugin": "~3.0.1",
     "semver": "7.7.1",
     "shelljs": "^0.9.0",
diff --git a/packages/angular/build/package.json b/packages/angular/build/package.json
index fb3643b72adc..d1064d8000ed 100644
--- a/packages/angular/build/package.json
+++ b/packages/angular/build/package.json
@@ -27,17 +27,17 @@
     "@vitejs/plugin-basic-ssl": "2.0.0",
     "beasties": "0.3.3",
     "browserslist": "^4.23.0",
-    "esbuild": "0.25.3",
+    "esbuild": "0.25.4",
     "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": "5.0.0",
-    "rollup": "4.40.1",
+    "rollup": "4.40.2",
     "sass": "1.87.0",
     "semver": "7.7.1",
     "source-map-support": "0.5.21",
@@ -46,7 +46,7 @@
     "watchpack": "2.4.2"
   },
   "optionalDependencies": {
-    "lmdb": "3.2.6"
+    "lmdb": "3.3.0"
   },
   "devDependencies": {
     "@angular/ssr": "workspace:*",
@@ -56,7 +56,7 @@
     "ng-packagr": "20.0.0-rc.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/cli/package.json b/packages/angular/cli/package.json
index 5493ad2531ab..abee2e8b2a96 100644
--- a/packages/angular/cli/package.json
+++ b/packages/angular/cli/package.json
@@ -26,12 +26,12 @@
     "@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",
+    "@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",
diff --git a/packages/angular_devkit/build_angular/package.json b/packages/angular_devkit/build_angular/package.json
index b5c4a62b6bf9..b5440ed5c939 100644
--- a/packages/angular_devkit/build_angular/package.json
+++ b/packages/angular_devkit/build_angular/package.json
@@ -29,7 +29,7 @@
     "browserslist": "^4.21.5",
     "copy-webpack-plugin": "13.0.0",
     "css-loader": "7.1.2",
-    "esbuild-wasm": "0.25.3",
+    "esbuild-wasm": "0.25.4",
     "fast-glob": "3.3.3",
     "http-proxy-middleware": "3.0.5",
     "istanbul-lib-instrument": "6.0.3",
@@ -63,7 +63,7 @@
     "webpack-subresource-integrity": "5.1.0"
   },
   "optionalDependencies": {
-    "esbuild": "0.25.3"
+    "esbuild": "0.25.4"
   },
   "devDependencies": {
     "@angular/ssr": "workspace:*",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 67a5ba1608e1..3f85326a2cc5 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -73,16 +73,16 @@ importers:
         version: 9.26.0
       '@rollup/plugin-alias':
         specifier: ^5.1.1
-        version: 5.1.1(rollup@4.40.1)
+        version: 5.1.1(rollup@4.40.2)
       '@rollup/plugin-commonjs':
         specifier: ^28.0.0
-        version: 28.0.3(rollup@4.40.1)
+        version: 28.0.3(rollup@4.40.2)
       '@rollup/plugin-json':
         specifier: ^6.1.0
-        version: 6.1.0(rollup@4.40.1)
+        version: 6.1.0(rollup@4.40.2)
       '@rollup/plugin-node-resolve':
         specifier: 16.0.1
-        version: 16.0.1(rollup@4.40.1)
+        version: 16.0.1(rollup@4.40.2)
       '@stylistic/eslint-plugin':
         specifier: ^4.0.0
         version: 4.2.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
@@ -159,11 +159,11 @@ importers:
         specifier: ^1.1.5
         version: 1.1.9
       '@typescript-eslint/eslint-plugin':
-        specifier: 8.31.1
-        version: 8.31.1(@typescript-eslint/parser@8.31.1(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
+        specifier: 8.32.0
+        version: 8.32.0(@typescript-eslint/parser@8.32.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
       '@typescript-eslint/parser':
-        specifier: 8.31.1
-        version: 8.31.1(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
+        specifier: 8.32.0
+        version: 8.32.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
       ajv:
         specifier: 8.17.1
         version: 8.17.1
@@ -177,11 +177,11 @@ importers:
         specifier: 6.0.3
         version: 6.0.3
       esbuild:
-        specifier: 0.25.3
-        version: 0.25.3
+        specifier: 0.25.4
+        version: 0.25.4
       esbuild-wasm:
-        specifier: 0.25.3
-        version: 0.25.3
+        specifier: 0.25.4
+        version: 0.25.4
       eslint:
         specifier: 9.26.0
         version: 9.26.0(jiti@1.21.7)
@@ -193,7 +193,7 @@ importers:
         version: 3.1.1(eslint@9.26.0(jiti@1.21.7))
       eslint-plugin-import:
         specifier: 2.31.0
-        version: 2.31.0(@typescript-eslint/parser@8.31.1(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.26.0(jiti@1.21.7))
+        version: 2.31.0(@typescript-eslint/parser@8.32.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.26.0(jiti@1.21.7))
       express:
         specifier: 5.1.0
         version: 5.1.0
@@ -243,8 +243,8 @@ importers:
         specifier: 1.4.0
         version: 1.4.0
       listr2:
-        specifier: 8.3.2
-        version: 8.3.2
+        specifier: 8.3.3
+        version: 8.3.3
       lodash:
         specifier: ^4.17.21
         version: 4.17.21
@@ -267,17 +267,17 @@ importers:
         specifier: 23.1.3
         version: 23.1.3(encoding@0.1.13)
       rollup:
-        specifier: 4.40.1
-        version: 4.40.1
+        specifier: 4.40.2
+        version: 4.40.2
       rollup-license-plugin:
         specifier: ~3.0.1
         version: 3.0.2
       rollup-plugin-dts:
         specifier: 6.2.1
-        version: 6.2.1(rollup@4.40.1)(typescript@5.8.3)
+        version: 6.2.1(rollup@4.40.2)(typescript@5.8.3)
       rollup-plugin-sourcemaps2:
         specifier: 0.5.1
-        version: 0.5.1(@types/node@20.17.32)(rollup@4.40.1)
+        version: 0.5.1(@types/node@20.17.32)(rollup@4.40.2)
       semver:
         specifier: 7.7.1
         version: 7.7.1
@@ -341,8 +341,8 @@ importers:
         specifier: 7.8.2
         version: 7.8.2
       vitest:
-        specifier: 3.1.2
-        version: 3.1.2(@types/node@20.17.32)(jiti@1.21.7)(jsdom@26.1.0)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1)
+        specifier: 3.1.3
+        version: 3.1.3(@types/node@20.17.32)(jiti@1.21.7)(jsdom@26.1.0)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1)
 
   packages/angular/build:
     dependencies:
@@ -374,8 +374,8 @@ importers:
         specifier: ^4.23.0
         version: 4.24.5
       esbuild:
-        specifier: 0.25.3
-        version: 0.25.3
+        specifier: 0.25.4
+        version: 0.25.4
       https-proxy-agent:
         specifier: 7.0.6
         version: 7.0.6(supports-color@10.0.0)
@@ -386,8 +386,8 @@ importers:
         specifier: 3.3.1
         version: 3.3.1
       listr2:
-        specifier: 8.3.2
-        version: 8.3.2
+        specifier: 8.3.3
+        version: 8.3.3
       magic-string:
         specifier: 0.30.17
         version: 0.30.17
@@ -404,8 +404,8 @@ importers:
         specifier: 5.0.0
         version: 5.0.0
       rollup:
-        specifier: 4.40.1
-        version: 4.40.1
+        specifier: 4.40.2
+        version: 4.40.2
       sass:
         specifier: 1.87.0
         version: 1.87.0
@@ -426,8 +426,8 @@ importers:
         version: 2.4.2
     optionalDependencies:
       lmdb:
-        specifier: 3.2.6
-        version: 3.2.6
+        specifier: 3.3.0
+        version: 3.3.0
     devDependencies:
       '@angular-devkit/core':
         specifier: workspace:*
@@ -451,8 +451,8 @@ importers:
         specifier: 7.8.2
         version: 7.8.2
       vitest:
-        specifier: 3.1.2
-        version: 3.1.2(@types/node@20.17.32)(jiti@1.21.7)(jsdom@26.1.0)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1)
+        specifier: 3.1.3
+        version: 3.1.3(@types/node@20.17.32)(jiti@1.21.7)(jsdom@26.1.0)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1)
 
   packages/angular/cli:
     dependencies:
@@ -469,8 +469,8 @@ importers:
         specifier: 7.5.0
         version: 7.5.0(@types/node@20.17.32)
       '@listr2/prompt-adapter-inquirer':
-        specifier: 2.0.21
-        version: 2.0.21(@inquirer/prompts@7.5.0(@types/node@20.17.32))
+        specifier: 2.0.22
+        version: 2.0.22(@inquirer/prompts@7.5.0(@types/node@20.17.32))
       '@schematics/angular':
         specifier: workspace:0.0.0-PLACEHOLDER
         version: link:../../schematics/angular
@@ -484,8 +484,8 @@ importers:
         specifier: 3.3.1
         version: 3.3.1
       listr2:
-        specifier: 8.3.2
-        version: 8.3.2
+        specifier: 8.3.3
+        version: 8.3.3
       npm-package-arg:
         specifier: 12.0.2
         version: 12.0.2
@@ -640,19 +640,19 @@ importers:
         version: 10.4.21(postcss@8.5.3)
       babel-loader:
         specifier: 10.0.0
-        version: 10.0.0(@babel/core@7.27.1)(webpack@5.99.7(esbuild@0.25.3))
+        version: 10.0.0(@babel/core@7.27.1)(webpack@5.99.7(esbuild@0.25.4))
       browserslist:
         specifier: ^4.21.5
         version: 4.24.5
       copy-webpack-plugin:
         specifier: 13.0.0
-        version: 13.0.0(webpack@5.99.7(esbuild@0.25.3))
+        version: 13.0.0(webpack@5.99.7(esbuild@0.25.4))
       css-loader:
         specifier: 7.1.2
-        version: 7.1.2(webpack@5.99.7(esbuild@0.25.3))
+        version: 7.1.2(webpack@5.99.7(esbuild@0.25.4))
       esbuild-wasm:
-        specifier: 0.25.3
-        version: 0.25.3
+        specifier: 0.25.4
+        version: 0.25.4
       fast-glob:
         specifier: 3.3.3
         version: 3.3.3
@@ -673,16 +673,16 @@ importers:
         version: 4.3.0
       less-loader:
         specifier: 12.3.0
-        version: 12.3.0(less@4.3.0)(webpack@5.99.7(esbuild@0.25.3))
+        version: 12.3.0(less@4.3.0)(webpack@5.99.7(esbuild@0.25.4))
       license-webpack-plugin:
         specifier: 4.0.2
-        version: 4.0.2(webpack@5.99.7(esbuild@0.25.3))
+        version: 4.0.2(webpack@5.99.7(esbuild@0.25.4))
       loader-utils:
         specifier: 3.3.1
         version: 3.3.1
       mini-css-extract-plugin:
         specifier: 2.9.2
-        version: 2.9.2(webpack@5.99.7(esbuild@0.25.3))
+        version: 2.9.2(webpack@5.99.7(esbuild@0.25.4))
       open:
         specifier: 10.1.2
         version: 10.1.2
@@ -700,7 +700,7 @@ importers:
         version: 8.5.3
       postcss-loader:
         specifier: 8.1.1
-        version: 8.1.1(postcss@8.5.3)(typescript@5.8.3)(webpack@5.99.7(esbuild@0.25.3))
+        version: 8.1.1(postcss@8.5.3)(typescript@5.8.3)(webpack@5.99.7(esbuild@0.25.4))
       resolve-url-loader:
         specifier: 5.0.0
         version: 5.0.0
@@ -712,13 +712,13 @@ importers:
         version: 1.87.0
       sass-loader:
         specifier: 16.0.5
-        version: 16.0.5(sass@1.87.0)(webpack@5.99.7(esbuild@0.25.3))
+        version: 16.0.5(sass@1.87.0)(webpack@5.99.7(esbuild@0.25.4))
       semver:
         specifier: 7.7.1
         version: 7.7.1
       source-map-loader:
         specifier: 5.0.0
-        version: 5.0.0(webpack@5.99.7(esbuild@0.25.3))
+        version: 5.0.0(webpack@5.99.7(esbuild@0.25.4))
       source-map-support:
         specifier: 0.5.21
         version: 0.5.21
@@ -733,23 +733,23 @@ importers:
         version: 2.8.1
       webpack:
         specifier: 5.99.7
-        version: 5.99.7(esbuild@0.25.3)
+        version: 5.99.7(esbuild@0.25.4)
       webpack-dev-middleware:
         specifier: 7.4.2
-        version: 7.4.2(webpack@5.99.7(esbuild@0.25.3))
+        version: 7.4.2(webpack@5.99.7(esbuild@0.25.4))
       webpack-dev-server:
         specifier: 5.2.1
-        version: 5.2.1(webpack@5.99.7(esbuild@0.25.3))
+        version: 5.2.1(webpack@5.99.7(esbuild@0.25.4))
       webpack-merge:
         specifier: 6.0.1
         version: 6.0.1
       webpack-subresource-integrity:
         specifier: 5.1.0
-        version: 5.1.0(webpack@5.99.7(esbuild@0.25.3))
+        version: 5.1.0(webpack@5.99.7(esbuild@0.25.4))
     optionalDependencies:
       esbuild:
-        specifier: 0.25.3
-        version: 0.25.3
+        specifier: 0.25.4
+        version: 0.25.4
     devDependencies:
       '@angular/ssr':
         specifier: workspace:*
@@ -784,10 +784,10 @@ importers:
         version: link:../../ngtools/webpack
       webpack:
         specifier: 5.99.7
-        version: 5.99.7(esbuild@0.25.3)
+        version: 5.99.7(esbuild@0.25.4)
       webpack-dev-server:
         specifier: 5.2.1
-        version: 5.2.1(webpack@5.99.7(esbuild@0.25.3))
+        version: 5.2.1(webpack@5.99.7(esbuild@0.25.4))
 
   packages/angular_devkit/core:
     dependencies:
@@ -866,7 +866,7 @@ importers:
         version: 5.8.3
       webpack:
         specifier: 5.99.7
-        version: 5.99.7(esbuild@0.25.3)
+        version: 5.99.7(esbuild@0.25.4)
 
   packages/schematics/angular:
     dependencies:
@@ -1572,152 +1572,152 @@ packages:
     resolution: {integrity: sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==}
     engines: {node: '>=14.17.0'}
 
-  '@esbuild/aix-ppc64@0.25.3':
-    resolution: {integrity: sha512-W8bFfPA8DowP8l//sxjJLSLkD8iEjMc7cBVyP+u4cEv9sM7mdUCkgsj+t0n/BWPFtv7WWCN5Yzj0N6FJNUUqBQ==}
+  '@esbuild/aix-ppc64@0.25.4':
+    resolution: {integrity: sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==}
     engines: {node: '>=18'}
     cpu: [ppc64]
     os: [aix]
 
-  '@esbuild/android-arm64@0.25.3':
-    resolution: {integrity: sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ==}
+  '@esbuild/android-arm64@0.25.4':
+    resolution: {integrity: sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==}
     engines: {node: '>=18'}
     cpu: [arm64]
     os: [android]
 
-  '@esbuild/android-arm@0.25.3':
-    resolution: {integrity: sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A==}
+  '@esbuild/android-arm@0.25.4':
+    resolution: {integrity: sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==}
     engines: {node: '>=18'}
     cpu: [arm]
     os: [android]
 
-  '@esbuild/android-x64@0.25.3':
-    resolution: {integrity: sha512-ogtTpYHT/g1GWS/zKM0cc/tIebFjm1F9Aw1boQ2Y0eUQ+J89d0jFY//s9ei9jVIlkYi8AfOjiixcLJSGNSOAdQ==}
+  '@esbuild/android-x64@0.25.4':
+    resolution: {integrity: sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==}
     engines: {node: '>=18'}
     cpu: [x64]
     os: [android]
 
-  '@esbuild/darwin-arm64@0.25.3':
-    resolution: {integrity: sha512-eESK5yfPNTqpAmDfFWNsOhmIOaQA59tAcF/EfYvo5/QWQCzXn5iUSOnqt3ra3UdzBv073ykTtmeLJZGt3HhA+w==}
+  '@esbuild/darwin-arm64@0.25.4':
+    resolution: {integrity: sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==}
     engines: {node: '>=18'}
     cpu: [arm64]
     os: [darwin]
 
-  '@esbuild/darwin-x64@0.25.3':
-    resolution: {integrity: sha512-Kd8glo7sIZtwOLcPbW0yLpKmBNWMANZhrC1r6K++uDR2zyzb6AeOYtI6udbtabmQpFaxJ8uduXMAo1gs5ozz8A==}
+  '@esbuild/darwin-x64@0.25.4':
+    resolution: {integrity: sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==}
     engines: {node: '>=18'}
     cpu: [x64]
     os: [darwin]
 
-  '@esbuild/freebsd-arm64@0.25.3':
-    resolution: {integrity: sha512-EJiyS70BYybOBpJth3M0KLOus0n+RRMKTYzhYhFeMwp7e/RaajXvP+BWlmEXNk6uk+KAu46j/kaQzr6au+JcIw==}
+  '@esbuild/freebsd-arm64@0.25.4':
+    resolution: {integrity: sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==}
     engines: {node: '>=18'}
     cpu: [arm64]
     os: [freebsd]
 
-  '@esbuild/freebsd-x64@0.25.3':
-    resolution: {integrity: sha512-Q+wSjaLpGxYf7zC0kL0nDlhsfuFkoN+EXrx2KSB33RhinWzejOd6AvgmP5JbkgXKmjhmpfgKZq24pneodYqE8Q==}
+  '@esbuild/freebsd-x64@0.25.4':
+    resolution: {integrity: sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==}
     engines: {node: '>=18'}
     cpu: [x64]
     os: [freebsd]
 
-  '@esbuild/linux-arm64@0.25.3':
-    resolution: {integrity: sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A==}
+  '@esbuild/linux-arm64@0.25.4':
+    resolution: {integrity: sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==}
     engines: {node: '>=18'}
     cpu: [arm64]
     os: [linux]
 
-  '@esbuild/linux-arm@0.25.3':
-    resolution: {integrity: sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ==}
+  '@esbuild/linux-arm@0.25.4':
+    resolution: {integrity: sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==}
     engines: {node: '>=18'}
     cpu: [arm]
     os: [linux]
 
-  '@esbuild/linux-ia32@0.25.3':
-    resolution: {integrity: sha512-yplPOpczHOO4jTYKmuYuANI3WhvIPSVANGcNUeMlxH4twz/TeXuzEP41tGKNGWJjuMhotpGabeFYGAOU2ummBw==}
+  '@esbuild/linux-ia32@0.25.4':
+    resolution: {integrity: sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==}
     engines: {node: '>=18'}
     cpu: [ia32]
     os: [linux]
 
-  '@esbuild/linux-loong64@0.25.3':
-    resolution: {integrity: sha512-P4BLP5/fjyihmXCELRGrLd793q/lBtKMQl8ARGpDxgzgIKJDRJ/u4r1A/HgpBpKpKZelGct2PGI4T+axcedf6g==}
+  '@esbuild/linux-loong64@0.25.4':
+    resolution: {integrity: sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==}
     engines: {node: '>=18'}
     cpu: [loong64]
     os: [linux]
 
-  '@esbuild/linux-mips64el@0.25.3':
-    resolution: {integrity: sha512-eRAOV2ODpu6P5divMEMa26RRqb2yUoYsuQQOuFUexUoQndm4MdpXXDBbUoKIc0iPa4aCO7gIhtnYomkn2x+bag==}
+  '@esbuild/linux-mips64el@0.25.4':
+    resolution: {integrity: sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==}
     engines: {node: '>=18'}
     cpu: [mips64el]
     os: [linux]
 
-  '@esbuild/linux-ppc64@0.25.3':
-    resolution: {integrity: sha512-ZC4jV2p7VbzTlnl8nZKLcBkfzIf4Yad1SJM4ZMKYnJqZFD4rTI+pBG65u8ev4jk3/MPwY9DvGn50wi3uhdaghg==}
+  '@esbuild/linux-ppc64@0.25.4':
+    resolution: {integrity: sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==}
     engines: {node: '>=18'}
     cpu: [ppc64]
     os: [linux]
 
-  '@esbuild/linux-riscv64@0.25.3':
-    resolution: {integrity: sha512-LDDODcFzNtECTrUUbVCs6j9/bDVqy7DDRsuIXJg6so+mFksgwG7ZVnTruYi5V+z3eE5y+BJZw7VvUadkbfg7QA==}
+  '@esbuild/linux-riscv64@0.25.4':
+    resolution: {integrity: sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==}
     engines: {node: '>=18'}
     cpu: [riscv64]
     os: [linux]
 
-  '@esbuild/linux-s390x@0.25.3':
-    resolution: {integrity: sha512-s+w/NOY2k0yC2p9SLen+ymflgcpRkvwwa02fqmAwhBRI3SC12uiS10edHHXlVWwfAagYSY5UpmT/zISXPMW3tQ==}
+  '@esbuild/linux-s390x@0.25.4':
+    resolution: {integrity: sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==}
     engines: {node: '>=18'}
     cpu: [s390x]
     os: [linux]
 
-  '@esbuild/linux-x64@0.25.3':
-    resolution: {integrity: sha512-nQHDz4pXjSDC6UfOE1Fw9Q8d6GCAd9KdvMZpfVGWSJztYCarRgSDfOVBY5xwhQXseiyxapkiSJi/5/ja8mRFFA==}
+  '@esbuild/linux-x64@0.25.4':
+    resolution: {integrity: sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==}
     engines: {node: '>=18'}
     cpu: [x64]
     os: [linux]
 
-  '@esbuild/netbsd-arm64@0.25.3':
-    resolution: {integrity: sha512-1QaLtOWq0mzK6tzzp0jRN3eccmN3hezey7mhLnzC6oNlJoUJz4nym5ZD7mDnS/LZQgkrhEbEiTn515lPeLpgWA==}
+  '@esbuild/netbsd-arm64@0.25.4':
+    resolution: {integrity: sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==}
     engines: {node: '>=18'}
     cpu: [arm64]
     os: [netbsd]
 
-  '@esbuild/netbsd-x64@0.25.3':
-    resolution: {integrity: sha512-i5Hm68HXHdgv8wkrt+10Bc50zM0/eonPb/a/OFVfB6Qvpiirco5gBA5bz7S2SHuU+Y4LWn/zehzNX14Sp4r27g==}
+  '@esbuild/netbsd-x64@0.25.4':
+    resolution: {integrity: sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==}
     engines: {node: '>=18'}
     cpu: [x64]
     os: [netbsd]
 
-  '@esbuild/openbsd-arm64@0.25.3':
-    resolution: {integrity: sha512-zGAVApJEYTbOC6H/3QBr2mq3upG/LBEXr85/pTtKiv2IXcgKV0RT0QA/hSXZqSvLEpXeIxah7LczB4lkiYhTAQ==}
+  '@esbuild/openbsd-arm64@0.25.4':
+    resolution: {integrity: sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==}
     engines: {node: '>=18'}
     cpu: [arm64]
     os: [openbsd]
 
-  '@esbuild/openbsd-x64@0.25.3':
-    resolution: {integrity: sha512-fpqctI45NnCIDKBH5AXQBsD0NDPbEFczK98hk/aa6HJxbl+UtLkJV2+Bvy5hLSLk3LHmqt0NTkKNso1A9y1a4w==}
+  '@esbuild/openbsd-x64@0.25.4':
+    resolution: {integrity: sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==}
     engines: {node: '>=18'}
     cpu: [x64]
     os: [openbsd]
 
-  '@esbuild/sunos-x64@0.25.3':
-    resolution: {integrity: sha512-ROJhm7d8bk9dMCUZjkS8fgzsPAZEjtRJqCAmVgB0gMrvG7hfmPmz9k1rwO4jSiblFjYmNvbECL9uhaPzONMfgA==}
+  '@esbuild/sunos-x64@0.25.4':
+    resolution: {integrity: sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==}
     engines: {node: '>=18'}
     cpu: [x64]
     os: [sunos]
 
-  '@esbuild/win32-arm64@0.25.3':
-    resolution: {integrity: sha512-YWcow8peiHpNBiIXHwaswPnAXLsLVygFwCB3A7Bh5jRkIBFWHGmNQ48AlX4xDvQNoMZlPYzjVOQDYEzWCqufMQ==}
+  '@esbuild/win32-arm64@0.25.4':
+    resolution: {integrity: sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==}
     engines: {node: '>=18'}
     cpu: [arm64]
     os: [win32]
 
-  '@esbuild/win32-ia32@0.25.3':
-    resolution: {integrity: sha512-qspTZOIGoXVS4DpNqUYUs9UxVb04khS1Degaw/MnfMe7goQ3lTfQ13Vw4qY/Nj0979BGvMRpAYbs/BAxEvU8ew==}
+  '@esbuild/win32-ia32@0.25.4':
+    resolution: {integrity: sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==}
     engines: {node: '>=18'}
     cpu: [ia32]
     os: [win32]
 
-  '@esbuild/win32-x64@0.25.3':
-    resolution: {integrity: sha512-ICgUR+kPimx0vvRzf+N/7L7tVSQeE3BYY+NhHRHXS1kBuPO7z2+7ea2HbhDyZdTephgvNvKrlDDKUexuCVBVvg==}
+  '@esbuild/win32-x64@0.25.4':
+    resolution: {integrity: sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==}
     engines: {node: '>=18'}
     cpu: [x64]
     os: [win32]
@@ -2009,39 +2009,44 @@ packages:
   '@leichtgewicht/ip-codec@2.0.5':
     resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==}
 
-  '@listr2/prompt-adapter-inquirer@2.0.21':
-    resolution: {integrity: sha512-can62OlOPusZwYfKfd0SV6znsSFbiuJw/lvvRSAAdzqUCTE/Vn8FydLGAfEvGbDALdfqvazSj6tnVJKQxj9iXw==}
+  '@listr2/prompt-adapter-inquirer@2.0.22':
+    resolution: {integrity: sha512-hV36ZoY+xKL6pYOt1nPNnkciFkn89KZwqLhAFzJvYysAvL5uBQdiADZx/8bIDXIukzzwG0QlPYolgMzQUtKgpQ==}
     engines: {node: '>=18.0.0'}
     peerDependencies:
       '@inquirer/prompts': '>= 3 < 8'
 
-  '@lmdb/lmdb-darwin-arm64@3.2.6':
-    resolution: {integrity: sha512-yF/ih9EJJZc72psFQbwnn8mExIWfTnzWJg+N02hnpXtDPETYLmQswIMBn7+V88lfCaFrMozJsUvcEQIkEPU0Gg==}
+  '@lmdb/lmdb-darwin-arm64@3.3.0':
+    resolution: {integrity: sha512-LipbQobyEfQtu8WixasaFUZZ+JCGlho4OWwWIQ5ol0rB1RKkcZvypu7sS1CBvofBGVAa3vbOh8IOGQMrbmL5dg==}
     cpu: [arm64]
     os: [darwin]
 
-  '@lmdb/lmdb-darwin-x64@3.2.6':
-    resolution: {integrity: sha512-5BbCumsFLbCi586Bb1lTWQFkekdQUw8/t8cy++Uq251cl3hbDIGEwD9HAwh8H6IS2F6QA9KdKmO136LmipRNkg==}
+  '@lmdb/lmdb-darwin-x64@3.3.0':
+    resolution: {integrity: sha512-yA+9P+ZeA3vg76BLXWeUomIAjxfmSmR2eg8fueHXDg5Xe1Xmkl9JCKuHXUhtJ+mMVcH12d5k4kJBLbyXTadfGQ==}
     cpu: [x64]
     os: [darwin]
 
-  '@lmdb/lmdb-linux-arm64@3.2.6':
-    resolution: {integrity: sha512-l5VmJamJ3nyMmeD1ANBQCQqy7do1ESaJQfKPSm2IG9/ADZryptTyCj8N6QaYgIWewqNUrcbdMkJajRQAt5Qjfg==}
+  '@lmdb/lmdb-linux-arm64@3.3.0':
+    resolution: {integrity: sha512-OeWvSgjXXZ/zmtLqqL78I3910F6UYpUubmsUU+iBHo6nTtjkpXms95rJtGrjkWQqwswKBD7xSMplbYC4LEsiPA==}
     cpu: [arm64]
     os: [linux]
 
-  '@lmdb/lmdb-linux-arm@3.2.6':
-    resolution: {integrity: sha512-+6XgLpMb7HBoWxXj+bLbiiB4s0mRRcDPElnRS3LpWRzdYSe+gFk5MT/4RrVNqd2MESUDmb53NUXw1+BP69bjiQ==}
+  '@lmdb/lmdb-linux-arm@3.3.0':
+    resolution: {integrity: sha512-EDYrW9kle+8wI19JCj/PhRnGoCN9bked5cdOPdo1wdgH/HzjgoLPFTn9DHlZccgTEVhp3O+bpWXdN/rWySVvjw==}
     cpu: [arm]
     os: [linux]
 
-  '@lmdb/lmdb-linux-x64@3.2.6':
-    resolution: {integrity: sha512-nDYT8qN9si5+onHYYaI4DiauDMx24OAiuZAUsEqrDy+ja/3EbpXPX/VAkMV8AEaQhy3xc4dRC+KcYIvOFefJ4Q==}
+  '@lmdb/lmdb-linux-x64@3.3.0':
+    resolution: {integrity: sha512-wDd02mt5ScX4+xd6g78zKBr6ojpgCJCTrllCAabjgap5FzuETqOqaQfKhO+tJuGWv/J5q+GIds6uY7rNFueOxg==}
     cpu: [x64]
     os: [linux]
 
-  '@lmdb/lmdb-win32-x64@3.2.6':
-    resolution: {integrity: sha512-XlqVtILonQnG+9fH2N3Aytria7P/1fwDgDhl29rde96uH2sLB8CHORIf2PfuLVzFQJ7Uqp8py9AYwr3ZUCFfWg==}
+  '@lmdb/lmdb-win32-arm64@3.3.0':
+    resolution: {integrity: sha512-COotWhHJgzXULLiEjOgWQwqig6PoA+6ji6W+sDl6M1HhMXWIymEVHGs0edsVSNtsNSCAWMxJgR3asv6FNX/2EA==}
+    cpu: [arm64]
+    os: [win32]
+
+  '@lmdb/lmdb-win32-x64@3.3.0':
+    resolution: {integrity: sha512-kqUgQH+l8HDbkAapx+aoko7Ez4X4DqkIraOqY/k0QY5EN/iialVlFpBUXh4wFXzirdmEVjbIUMrceUh0Kh8LeA==}
     cpu: [x64]
     os: [win32]
 
@@ -2488,103 +2493,103 @@ packages:
       rollup:
         optional: true
 
-  '@rollup/rollup-android-arm-eabi@4.40.1':
-    resolution: {integrity: sha512-kxz0YeeCrRUHz3zyqvd7n+TVRlNyTifBsmnmNPtk3hQURUyG9eAB+usz6DAwagMusjx/zb3AjvDUvhFGDAexGw==}
+  '@rollup/rollup-android-arm-eabi@4.40.2':
+    resolution: {integrity: sha512-JkdNEq+DFxZfUwxvB58tHMHBHVgX23ew41g1OQinthJ+ryhdRk67O31S7sYw8u2lTjHUPFxwar07BBt1KHp/hg==}
     cpu: [arm]
     os: [android]
 
-  '@rollup/rollup-android-arm64@4.40.1':
-    resolution: {integrity: sha512-PPkxTOisoNC6TpnDKatjKkjRMsdaWIhyuMkA4UsBXT9WEZY4uHezBTjs6Vl4PbqQQeu6oION1w2voYZv9yquCw==}
+  '@rollup/rollup-android-arm64@4.40.2':
+    resolution: {integrity: sha512-13unNoZ8NzUmnndhPTkWPWbX3vtHodYmy+I9kuLxN+F+l+x3LdVF7UCu8TWVMt1POHLh6oDHhnOA04n8oJZhBw==}
     cpu: [arm64]
     os: [android]
 
-  '@rollup/rollup-darwin-arm64@4.40.1':
-    resolution: {integrity: sha512-VWXGISWFY18v/0JyNUy4A46KCFCb9NVsH+1100XP31lud+TzlezBbz24CYzbnA4x6w4hx+NYCXDfnvDVO6lcAA==}
+  '@rollup/rollup-darwin-arm64@4.40.2':
+    resolution: {integrity: sha512-Gzf1Hn2Aoe8VZzevHostPX23U7N5+4D36WJNHK88NZHCJr7aVMG4fadqkIf72eqVPGjGc0HJHNuUaUcxiR+N/w==}
     cpu: [arm64]
     os: [darwin]
 
-  '@rollup/rollup-darwin-x64@4.40.1':
-    resolution: {integrity: sha512-nIwkXafAI1/QCS7pxSpv/ZtFW6TXcNUEHAIA9EIyw5OzxJZQ1YDrX+CL6JAIQgZ33CInl1R6mHet9Y/UZTg2Bw==}
+  '@rollup/rollup-darwin-x64@4.40.2':
+    resolution: {integrity: sha512-47N4hxa01a4x6XnJoskMKTS8XZ0CZMd8YTbINbi+w03A2w4j1RTlnGHOz/P0+Bg1LaVL6ufZyNprSg+fW5nYQQ==}
     cpu: [x64]
     os: [darwin]
 
-  '@rollup/rollup-freebsd-arm64@4.40.1':
-    resolution: {integrity: sha512-BdrLJ2mHTrIYdaS2I99mriyJfGGenSaP+UwGi1kB9BLOCu9SR8ZpbkmmalKIALnRw24kM7qCN0IOm6L0S44iWw==}
+  '@rollup/rollup-freebsd-arm64@4.40.2':
+    resolution: {integrity: sha512-8t6aL4MD+rXSHHZUR1z19+9OFJ2rl1wGKvckN47XFRVO+QL/dUSpKA2SLRo4vMg7ELA8pzGpC+W9OEd1Z/ZqoQ==}
     cpu: [arm64]
     os: [freebsd]
 
-  '@rollup/rollup-freebsd-x64@4.40.1':
-    resolution: {integrity: sha512-VXeo/puqvCG8JBPNZXZf5Dqq7BzElNJzHRRw3vjBE27WujdzuOPecDPc/+1DcdcTptNBep3861jNq0mYkT8Z6Q==}
+  '@rollup/rollup-freebsd-x64@4.40.2':
+    resolution: {integrity: sha512-C+AyHBzfpsOEYRFjztcYUFsH4S7UsE9cDtHCtma5BK8+ydOZYgMmWg1d/4KBytQspJCld8ZIujFMAdKG1xyr4Q==}
     cpu: [x64]
     os: [freebsd]
 
-  '@rollup/rollup-linux-arm-gnueabihf@4.40.1':
-    resolution: {integrity: sha512-ehSKrewwsESPt1TgSE/na9nIhWCosfGSFqv7vwEtjyAqZcvbGIg4JAcV7ZEh2tfj/IlfBeZjgOXm35iOOjadcg==}
+  '@rollup/rollup-linux-arm-gnueabihf@4.40.2':
+    resolution: {integrity: sha512-de6TFZYIvJwRNjmW3+gaXiZ2DaWL5D5yGmSYzkdzjBDS3W+B9JQ48oZEsmMvemqjtAFzE16DIBLqd6IQQRuG9Q==}
     cpu: [arm]
     os: [linux]
 
-  '@rollup/rollup-linux-arm-musleabihf@4.40.1':
-    resolution: {integrity: sha512-m39iO/aaurh5FVIu/F4/Zsl8xppd76S4qoID8E+dSRQvTyZTOI2gVk3T4oqzfq1PtcvOfAVlwLMK3KRQMaR8lg==}
+  '@rollup/rollup-linux-arm-musleabihf@4.40.2':
+    resolution: {integrity: sha512-urjaEZubdIkacKc930hUDOfQPysezKla/O9qV+O89enqsqUmQm8Xj8O/vh0gHg4LYfv7Y7UsE3QjzLQzDYN1qg==}
     cpu: [arm]
     os: [linux]
 
-  '@rollup/rollup-linux-arm64-gnu@4.40.1':
-    resolution: {integrity: sha512-Y+GHnGaku4aVLSgrT0uWe2o2Rq8te9hi+MwqGF9r9ORgXhmHK5Q71N757u0F8yU1OIwUIFy6YiJtKjtyktk5hg==}
+  '@rollup/rollup-linux-arm64-gnu@4.40.2':
+    resolution: {integrity: sha512-KlE8IC0HFOC33taNt1zR8qNlBYHj31qGT1UqWqtvR/+NuCVhfufAq9fxO8BMFC22Wu0rxOwGVWxtCMvZVLmhQg==}
     cpu: [arm64]
     os: [linux]
 
-  '@rollup/rollup-linux-arm64-musl@4.40.1':
-    resolution: {integrity: sha512-jEwjn3jCA+tQGswK3aEWcD09/7M5wGwc6+flhva7dsQNRZZTe30vkalgIzV4tjkopsTS9Jd7Y1Bsj6a4lzz8gQ==}
+  '@rollup/rollup-linux-arm64-musl@4.40.2':
+    resolution: {integrity: sha512-j8CgxvfM0kbnhu4XgjnCWJQyyBOeBI1Zq91Z850aUddUmPeQvuAy6OiMdPS46gNFgy8gN1xkYyLgwLYZG3rBOg==}
     cpu: [arm64]
     os: [linux]
 
-  '@rollup/rollup-linux-loongarch64-gnu@4.40.1':
-    resolution: {integrity: sha512-ySyWikVhNzv+BV/IDCsrraOAZ3UaC8SZB67FZlqVwXwnFhPihOso9rPOxzZbjp81suB1O2Topw+6Ug3JNegejQ==}
+  '@rollup/rollup-linux-loongarch64-gnu@4.40.2':
+    resolution: {integrity: sha512-Ybc/1qUampKuRF4tQXc7G7QY9YRyeVSykfK36Y5Qc5dmrIxwFhrOzqaVTNoZygqZ1ZieSWTibfFhQ5qK8jpWxw==}
     cpu: [loong64]
     os: [linux]
 
-  '@rollup/rollup-linux-powerpc64le-gnu@4.40.1':
-    resolution: {integrity: sha512-BvvA64QxZlh7WZWqDPPdt0GH4bznuL6uOO1pmgPnnv86rpUpc8ZxgZwcEgXvo02GRIZX1hQ0j0pAnhwkhwPqWg==}
+  '@rollup/rollup-linux-powerpc64le-gnu@4.40.2':
+    resolution: {integrity: sha512-3FCIrnrt03CCsZqSYAOW/k9n625pjpuMzVfeI+ZBUSDT3MVIFDSPfSUgIl9FqUftxcUXInvFah79hE1c9abD+Q==}
     cpu: [ppc64]
     os: [linux]
 
-  '@rollup/rollup-linux-riscv64-gnu@4.40.1':
-    resolution: {integrity: sha512-EQSP+8+1VuSulm9RKSMKitTav89fKbHymTf25n5+Yr6gAPZxYWpj3DzAsQqoaHAk9YX2lwEyAf9S4W8F4l3VBQ==}
+  '@rollup/rollup-linux-riscv64-gnu@4.40.2':
+    resolution: {integrity: sha512-QNU7BFHEvHMp2ESSY3SozIkBPaPBDTsfVNGx3Xhv+TdvWXFGOSH2NJvhD1zKAT6AyuuErJgbdvaJhYVhVqrWTg==}
     cpu: [riscv64]
     os: [linux]
 
-  '@rollup/rollup-linux-riscv64-musl@4.40.1':
-    resolution: {integrity: sha512-n/vQ4xRZXKuIpqukkMXZt9RWdl+2zgGNx7Uda8NtmLJ06NL8jiHxUawbwC+hdSq1rrw/9CghCpEONor+l1e2gA==}
+  '@rollup/rollup-linux-riscv64-musl@4.40.2':
+    resolution: {integrity: sha512-5W6vNYkhgfh7URiXTO1E9a0cy4fSgfE4+Hl5agb/U1sa0kjOLMLC1wObxwKxecE17j0URxuTrYZZME4/VH57Hg==}
     cpu: [riscv64]
     os: [linux]
 
-  '@rollup/rollup-linux-s390x-gnu@4.40.1':
-    resolution: {integrity: sha512-h8d28xzYb98fMQKUz0w2fMc1XuGzLLjdyxVIbhbil4ELfk5/orZlSTpF/xdI9C8K0I8lCkq+1En2RJsawZekkg==}
+  '@rollup/rollup-linux-s390x-gnu@4.40.2':
+    resolution: {integrity: sha512-B7LKIz+0+p348JoAL4X/YxGx9zOx3sR+o6Hj15Y3aaApNfAshK8+mWZEf759DXfRLeL2vg5LYJBB7DdcleYCoQ==}
     cpu: [s390x]
     os: [linux]
 
-  '@rollup/rollup-linux-x64-gnu@4.40.1':
-    resolution: {integrity: sha512-XiK5z70PEFEFqcNj3/zRSz/qX4bp4QIraTy9QjwJAb/Z8GM7kVUsD0Uk8maIPeTyPCP03ChdI+VVmJriKYbRHQ==}
+  '@rollup/rollup-linux-x64-gnu@4.40.2':
+    resolution: {integrity: sha512-lG7Xa+BmBNwpjmVUbmyKxdQJ3Q6whHjMjzQplOs5Z+Gj7mxPtWakGHqzMqNER68G67kmCX9qX57aRsW5V0VOng==}
     cpu: [x64]
     os: [linux]
 
-  '@rollup/rollup-linux-x64-musl@4.40.1':
-    resolution: {integrity: sha512-2BRORitq5rQ4Da9blVovzNCMaUlyKrzMSvkVR0D4qPuOy/+pMCrh1d7o01RATwVy+6Fa1WBw+da7QPeLWU/1mQ==}
+  '@rollup/rollup-linux-x64-musl@4.40.2':
+    resolution: {integrity: sha512-tD46wKHd+KJvsmije4bUskNuvWKFcTOIM9tZ/RrmIvcXnbi0YK/cKS9FzFtAm7Oxi2EhV5N2OpfFB348vSQRXA==}
     cpu: [x64]
     os: [linux]
 
-  '@rollup/rollup-win32-arm64-msvc@4.40.1':
-    resolution: {integrity: sha512-b2bcNm9Kbde03H+q+Jjw9tSfhYkzrDUf2d5MAd1bOJuVplXvFhWz7tRtWvD8/ORZi7qSCy0idW6tf2HgxSXQSg==}
+  '@rollup/rollup-win32-arm64-msvc@4.40.2':
+    resolution: {integrity: sha512-Bjv/HG8RRWLNkXwQQemdsWw4Mg+IJ29LK+bJPW2SCzPKOUaMmPEppQlu/Fqk1d7+DX3V7JbFdbkh/NMmurT6Pg==}
     cpu: [arm64]
     os: [win32]
 
-  '@rollup/rollup-win32-ia32-msvc@4.40.1':
-    resolution: {integrity: sha512-DfcogW8N7Zg7llVEfpqWMZcaErKfsj9VvmfSyRjCyo4BI3wPEfrzTtJkZG6gKP/Z92wFm6rz2aDO7/JfiR/whA==}
+  '@rollup/rollup-win32-ia32-msvc@4.40.2':
+    resolution: {integrity: sha512-dt1llVSGEsGKvzeIO76HToiYPNPYPkmjhMHhP00T9S4rDern8P2ZWvWAQUEJ+R1UdMWJ/42i/QqJ2WV765GZcA==}
     cpu: [ia32]
     os: [win32]
 
-  '@rollup/rollup-win32-x64-msvc@4.40.1':
-    resolution: {integrity: sha512-ECyOuDeH3C1I8jH2MK1RtBJW+YPMvSfT0a5NN0nHfQYnDSJ6tUiZH3gzwVP5/Kfh/+Tt7tpWVF9LXNTnhTJ3kA==}
+  '@rollup/rollup-win32-x64-msvc@4.40.2':
+    resolution: {integrity: sha512-bwspbWB04XJpeElvsp+DCylKfF4trJDa2Y9Go8O6A7YLX2LIKGcNK/CYImJN6ZP4DcuOHB4Utl3iCbnR62DudA==}
     cpu: [x64]
     os: [win32]
 
@@ -2939,16 +2944,16 @@ packages:
   '@types/yauzl@2.10.3':
     resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==}
 
-  '@typescript-eslint/eslint-plugin@8.31.1':
-    resolution: {integrity: sha512-oUlH4h1ABavI4F0Xnl8/fOtML/eu8nI2A1nYd+f+55XI0BLu+RIqKoCiZKNo6DtqZBEQm5aNKA20G3Z5w3R6GQ==}
+  '@typescript-eslint/eslint-plugin@8.32.0':
+    resolution: {integrity: sha512-/jU9ettcntkBFmWUzzGgsClEi2ZFiikMX5eEQsmxIAWMOn4H3D4rvHssstmAHGVvrYnaMqdWWWg0b5M6IN/MTQ==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     peerDependencies:
       '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0
       eslint: ^8.57.0 || ^9.0.0
       typescript: 5.8.3
 
-  '@typescript-eslint/parser@8.31.1':
-    resolution: {integrity: sha512-oU/OtYVydhXnumd0BobL9rkJg7wFJ9bFFPmSmB/bf/XWN85hlViji59ko6bSKBXyseT9V8l+CN1nwmlbiN0G7Q==}
+  '@typescript-eslint/parser@8.32.0':
+    resolution: {integrity: sha512-B2MdzyWxCE2+SqiZHAjPphft+/2x2FlO9YBx7eKE1BCb+rqBlQdhtAEhzIEdozHd55DXPmxBdpMygFJjfjjA9A==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     peerDependencies:
       eslint: ^8.57.0 || ^9.0.0
@@ -2958,8 +2963,12 @@ packages:
     resolution: {integrity: sha512-BMNLOElPxrtNQMIsFHE+3P0Yf1z0dJqV9zLdDxN/xLlWMlXK/ApEsVEKzpizg9oal8bAT5Sc7+ocal7AC1HCVw==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
-  '@typescript-eslint/type-utils@8.31.1':
-    resolution: {integrity: sha512-fNaT/m9n0+dpSp8G/iOQ05GoHYXbxw81x+yvr7TArTuZuCA6VVKbqWYVZrV5dVagpDTtj/O8k5HBEE/p/HM5LA==}
+  '@typescript-eslint/scope-manager@8.32.0':
+    resolution: {integrity: sha512-jc/4IxGNedXkmG4mx4nJTILb6TMjL66D41vyeaPWvDUmeYQzF3lKtN15WsAeTr65ce4mPxwopPSo1yUUAWw0hQ==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  '@typescript-eslint/type-utils@8.32.0':
+    resolution: {integrity: sha512-t2vouuYQKEKSLtJaa5bB4jHeha2HJczQ6E5IXPDPgIty9EqcJxpr1QHQ86YyIPwDwxvUmLfP2YADQ5ZY4qddZg==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     peerDependencies:
       eslint: ^8.57.0 || ^9.0.0
@@ -2969,12 +2978,22 @@ packages:
     resolution: {integrity: sha512-SfepaEFUDQYRoA70DD9GtytljBePSj17qPxFHA/h3eg6lPTqGJ5mWOtbXCk1YrVU1cTJRd14nhaXWFu0l2troQ==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
+  '@typescript-eslint/types@8.32.0':
+    resolution: {integrity: sha512-O5Id6tGadAZEMThM6L9HmVf5hQUXNSxLVKeGJYWNhhVseps/0LddMkp7//VDkzwJ69lPL0UmZdcZwggj9akJaA==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
   '@typescript-eslint/typescript-estree@8.31.1':
     resolution: {integrity: sha512-kaA0ueLe2v7KunYOyWYtlf/QhhZb7+qh4Yw6Ni5kgukMIG+iP773tjgBiLWIXYumWCwEq3nLW+TUywEp8uEeag==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     peerDependencies:
       typescript: 5.8.3
 
+  '@typescript-eslint/typescript-estree@8.32.0':
+    resolution: {integrity: sha512-pU9VD7anSCOIoBFnhTGfOzlVFQIA1XXiQpH/CezqOBaDppRwTglJzCC6fUQGpfwey4T183NKhF1/mfatYmjRqQ==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    peerDependencies:
+      typescript: 5.8.3
+
   '@typescript-eslint/utils@8.31.1':
     resolution: {integrity: sha512-2DSI4SNfF5T4oRveQ4nUrSjUqjMND0nLq9rEkz0gfGr3tg0S5KB6DhwR+WZPCjzkZl3cH+4x2ce3EsL50FubjQ==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -2982,10 +3001,21 @@ packages:
       eslint: ^8.57.0 || ^9.0.0
       typescript: 5.8.3
 
+  '@typescript-eslint/utils@8.32.0':
+    resolution: {integrity: sha512-8S9hXau6nQ/sYVtC3D6ISIDoJzS1NsCK+gluVhLN2YkBPX+/1wkwyUiDKnxRh15579WoOIyVWnoyIf3yGI9REw==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    peerDependencies:
+      eslint: ^8.57.0 || ^9.0.0
+      typescript: 5.8.3
+
   '@typescript-eslint/visitor-keys@8.31.1':
     resolution: {integrity: sha512-I+/rgqOVBn6f0o7NDTmAPWWC6NuqhV174lfYvAm9fUaWeiefLdux9/YI3/nLugEn9L8fcSi0XmpKi/r5u0nmpw==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
+  '@typescript-eslint/visitor-keys@8.32.0':
+    resolution: {integrity: sha512-1rYQTCLFFzOI5Nl0c8LUpJT8HxpwVRn9E4CkMsYfuN6ctmQqExjSTzzSk0Tz2apmXy7WU6/6fyaZVVA/thPN+w==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
   '@verdaccio/auth@8.0.0-next-8.15':
     resolution: {integrity: sha512-vAfzGOHbPcPXMCI90jqm/qSZ1OUBnOGzudZA3+YtherncdwADekvXbdJlZVclcfmZ0sRbfVG5Xpf88aETiwfcw==}
     engines: {node: '>=18'}
@@ -3067,11 +3097,11 @@ packages:
     peerDependencies:
       vite: ^6.0.0
 
-  '@vitest/expect@3.1.2':
-    resolution: {integrity: sha512-O8hJgr+zREopCAqWl3uCVaOdqJwZ9qaDwUP7vy3Xigad0phZe9APxKhPcDNqYYi0rX5oMvwJMSCAXY2afqeTSA==}
+  '@vitest/expect@3.1.3':
+    resolution: {integrity: sha512-7FTQQuuLKmN1Ig/h+h/GO+44Q1IlglPlR2es4ab7Yvfx+Uk5xsv+Ykk+MEt/M2Yn/xGmzaLKxGw2lgy2bwuYqg==}
 
-  '@vitest/mocker@3.1.2':
-    resolution: {integrity: sha512-kOtd6K2lc7SQ0mBqYv/wdGedlqPdM/B38paPY+OwJ1XiNi44w3Fpog82UfOibmHaV9Wod18A09I9SCKLyDMqgw==}
+  '@vitest/mocker@3.1.3':
+    resolution: {integrity: sha512-PJbLjonJK82uCWHjzgBJZuR7zmAOrSvKk1QBxrennDIgtH4uK0TB1PvYmc0XBCigxxtiAVPfWtAdy4lpz8SQGQ==}
     peerDependencies:
       msw: ^2.4.9
       vite: ^5.0.0 || ^6.0.0
@@ -3081,23 +3111,20 @@ packages:
       vite:
         optional: true
 
-  '@vitest/pretty-format@3.1.2':
-    resolution: {integrity: sha512-R0xAiHuWeDjTSB3kQ3OQpT8Rx3yhdOAIm/JM4axXxnG7Q/fS8XUwggv/A4xzbQA+drYRjzkMnpYnOGAc4oeq8w==}
-
   '@vitest/pretty-format@3.1.3':
     resolution: {integrity: sha512-i6FDiBeJUGLDKADw2Gb01UtUNb12yyXAqC/mmRWuYl+m/U9GS7s8us5ONmGkGpUUo7/iAYzI2ePVfOZTYvUifA==}
 
-  '@vitest/runner@3.1.2':
-    resolution: {integrity: sha512-bhLib9l4xb4sUMPXnThbnhX2Yi8OutBMA8Yahxa7yavQsFDtwY/jrUZwpKp2XH9DhRFJIeytlyGpXCqZ65nR+g==}
+  '@vitest/runner@3.1.3':
+    resolution: {integrity: sha512-Tae+ogtlNfFei5DggOsSUvkIaSuVywujMj6HzR97AHK6XK8i3BuVyIifWAm/sE3a15lF5RH9yQIrbXYuo0IFyA==}
 
-  '@vitest/snapshot@3.1.2':
-    resolution: {integrity: sha512-Q1qkpazSF/p4ApZg1vfZSQ5Yw6OCQxVMVrLjslbLFA1hMDrT2uxtqMaw8Tc/jy5DLka1sNs1Y7rBcftMiaSH/Q==}
+  '@vitest/snapshot@3.1.3':
+    resolution: {integrity: sha512-XVa5OPNTYUsyqG9skuUkFzAeFnEzDp8hQu7kZ0N25B1+6KjGm4hWLtURyBbsIAOekfWQ7Wuz/N/XXzgYO3deWQ==}
 
-  '@vitest/spy@3.1.2':
-    resolution: {integrity: sha512-OEc5fSXMws6sHVe4kOFyDSj/+4MSwst0ib4un0DlcYgQvRuYQ0+M2HyqGaauUMnjq87tmUaMNDxKQx7wNfVqPA==}
+  '@vitest/spy@3.1.3':
+    resolution: {integrity: sha512-x6w+ctOEmEXdWaa6TO4ilb7l9DxPR5bwEb6hILKuxfU1NqWT2mpJD9NJN7t3OTfxmVlOMrvtoFJGdgyzZ605lQ==}
 
-  '@vitest/utils@3.1.2':
-    resolution: {integrity: sha512-5GGd0ytZ7BH3H6JTj9Kw7Prn1Nbg0wZVrIvou+UWxm54d+WoXXgAgjFJ8wn3LdagWLFSEfpPeyYrByZaGEZHLg==}
+  '@vitest/utils@3.1.3':
+    resolution: {integrity: sha512-2Ltrpht4OmHO9+c/nmHtF09HWiyWdworqnHIwjfvDyWjuwKbdkcS9AnhsDn+8E2RM4x++foD1/tNuLPVvWG1Rg==}
 
   '@web/browser-logs@0.4.1':
     resolution: {integrity: sha512-ypmMG+72ERm+LvP+loj9A64MTXvWMXHUOu773cPO4L1SV/VWg6xA9Pv7vkvkXQX+ItJtCJt+KQ+U6ui2HhSFUw==}
@@ -4368,13 +4395,13 @@ packages:
   es6-promisify@5.0.0:
     resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==}
 
-  esbuild-wasm@0.25.3:
-    resolution: {integrity: sha512-60mFpAU4iQMVIP9tSd5EEbxZUDsqSKAjAJ7r1OK073lG/ctnVidThvbcU+M2B55jMFntCFJlqksubXMpYIcbfg==}
+  esbuild-wasm@0.25.4:
+    resolution: {integrity: sha512-2HlCS6rNvKWaSKhWaG/YIyRsTsL3gUrMP2ToZMBIjw9LM7vVcIs+rz8kE2vExvTJgvM8OKPqNpcHawY/BQc/qQ==}
     engines: {node: '>=18'}
     hasBin: true
 
-  esbuild@0.25.3:
-    resolution: {integrity: sha512-qKA6Pvai73+M2FtftpNKRxJ78GIjmFXFxd/1DVBqGo/qNhLSfv+G12n9pNoWdytJC8U00TrViOwpjT0zgqQS8Q==}
+  esbuild@0.25.4:
+    resolution: {integrity: sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==}
     engines: {node: '>=18'}
     hasBin: true
 
@@ -5700,12 +5727,12 @@ packages:
   lines-and-columns@1.2.4:
     resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
 
-  listr2@8.3.2:
-    resolution: {integrity: sha512-vsBzcU4oE+v0lj4FhVLzr9dBTv4/fHIa57l+GCwovP8MoFNZJTOhGU8PXd4v2VJCbECAaijBiHntiekFMLvo0g==}
+  listr2@8.3.3:
+    resolution: {integrity: sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==}
     engines: {node: '>=18.0.0'}
 
-  lmdb@3.2.6:
-    resolution: {integrity: sha512-SuHqzPl7mYStna8WRotY8XX/EUZBjjv3QyKIByeCLFfC9uXT/OIHByEcA07PzbMfQAM0KYJtLgtpMRlIe5dErQ==}
+  lmdb@3.3.0:
+    resolution: {integrity: sha512-MgJocUI6QEiSXQBFWLeyo1R7eQj8Rke5dlPxX0KFwli8/bsCxpM/KbXO5y0qmV/5llQ3wpneDWcTYxa+4vn8iQ==}
     hasBin: true
 
   loader-runner@4.3.0:
@@ -6942,8 +6969,8 @@ packages:
       '@types/node':
         optional: true
 
-  rollup@4.40.1:
-    resolution: {integrity: sha512-C5VvvgCCyfyotVITIAv+4efVytl5F7wt+/I2i9q9GZcEXW9BP52YYOXC58igUi+LFZVHukErIIqQSWwv/M3WRw==}
+  rollup@4.40.2:
+    resolution: {integrity: sha512-tfUOg6DTP4rhQ3VjOO6B4wyrJnGOX85requAXvqYTHsOgb2TFJdZ3aWpT8W2kPoypSGP7dZUyzxJ9ee4buM5Fg==}
     engines: {node: '>=18.0.0', npm: '>=8.0.0'}
     hasBin: true
 
@@ -7825,8 +7852,8 @@ packages:
     resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==}
     engines: {'0': node >=0.6.0}
 
-  vite-node@3.1.2:
-    resolution: {integrity: sha512-/8iMryv46J3aK13iUXsei5G/A3CUlW4665THCPS+K8xAaqrVWiGB4RfXMQXCLjpK9P2eK//BczrVkn5JLAk6DA==}
+  vite-node@3.1.3:
+    resolution: {integrity: sha512-uHV4plJ2IxCl4u1up1FQRrqclylKAogbtBfOTwcuJ28xFi+89PZ57BRh+naIRvH70HPwxy5QHYzg1OrEaC7AbA==}
     engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
     hasBin: true
 
@@ -7870,16 +7897,16 @@ packages:
       yaml:
         optional: true
 
-  vitest@3.1.2:
-    resolution: {integrity: sha512-WaxpJe092ID1C0mr+LH9MmNrhfzi8I65EX/NRU/Ld016KqQNRgxSOlGNP1hHN+a/F8L15Mh8klwaF77zR3GeDQ==}
+  vitest@3.1.3:
+    resolution: {integrity: sha512-188iM4hAHQ0km23TN/adso1q5hhwKqUpv+Sd6p5sOuh6FhQnRNW3IsiIpvxqahtBabsJ2SLZgmGSpcYK4wQYJw==}
     engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
     hasBin: true
     peerDependencies:
       '@edge-runtime/vm': '*'
       '@types/debug': ^4.1.12
       '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0
-      '@vitest/browser': 3.1.2
-      '@vitest/ui': 3.1.2
+      '@vitest/browser': 3.1.3
+      '@vitest/ui': 3.1.3
       happy-dom: '*'
       jsdom: '*'
     peerDependenciesMeta:
@@ -9111,79 +9138,79 @@ snapshots:
 
   '@discoveryjs/json-ext@0.6.3': {}
 
-  '@esbuild/aix-ppc64@0.25.3':
+  '@esbuild/aix-ppc64@0.25.4':
     optional: true
 
-  '@esbuild/android-arm64@0.25.3':
+  '@esbuild/android-arm64@0.25.4':
     optional: true
 
-  '@esbuild/android-arm@0.25.3':
+  '@esbuild/android-arm@0.25.4':
     optional: true
 
-  '@esbuild/android-x64@0.25.3':
+  '@esbuild/android-x64@0.25.4':
     optional: true
 
-  '@esbuild/darwin-arm64@0.25.3':
+  '@esbuild/darwin-arm64@0.25.4':
     optional: true
 
-  '@esbuild/darwin-x64@0.25.3':
+  '@esbuild/darwin-x64@0.25.4':
     optional: true
 
-  '@esbuild/freebsd-arm64@0.25.3':
+  '@esbuild/freebsd-arm64@0.25.4':
     optional: true
 
-  '@esbuild/freebsd-x64@0.25.3':
+  '@esbuild/freebsd-x64@0.25.4':
     optional: true
 
-  '@esbuild/linux-arm64@0.25.3':
+  '@esbuild/linux-arm64@0.25.4':
     optional: true
 
-  '@esbuild/linux-arm@0.25.3':
+  '@esbuild/linux-arm@0.25.4':
     optional: true
 
-  '@esbuild/linux-ia32@0.25.3':
+  '@esbuild/linux-ia32@0.25.4':
     optional: true
 
-  '@esbuild/linux-loong64@0.25.3':
+  '@esbuild/linux-loong64@0.25.4':
     optional: true
 
-  '@esbuild/linux-mips64el@0.25.3':
+  '@esbuild/linux-mips64el@0.25.4':
     optional: true
 
-  '@esbuild/linux-ppc64@0.25.3':
+  '@esbuild/linux-ppc64@0.25.4':
     optional: true
 
-  '@esbuild/linux-riscv64@0.25.3':
+  '@esbuild/linux-riscv64@0.25.4':
     optional: true
 
-  '@esbuild/linux-s390x@0.25.3':
+  '@esbuild/linux-s390x@0.25.4':
     optional: true
 
-  '@esbuild/linux-x64@0.25.3':
+  '@esbuild/linux-x64@0.25.4':
     optional: true
 
-  '@esbuild/netbsd-arm64@0.25.3':
+  '@esbuild/netbsd-arm64@0.25.4':
     optional: true
 
-  '@esbuild/netbsd-x64@0.25.3':
+  '@esbuild/netbsd-x64@0.25.4':
     optional: true
 
-  '@esbuild/openbsd-arm64@0.25.3':
+  '@esbuild/openbsd-arm64@0.25.4':
     optional: true
 
-  '@esbuild/openbsd-x64@0.25.3':
+  '@esbuild/openbsd-x64@0.25.4':
     optional: true
 
-  '@esbuild/sunos-x64@0.25.3':
+  '@esbuild/sunos-x64@0.25.4':
     optional: true
 
-  '@esbuild/win32-arm64@0.25.3':
+  '@esbuild/win32-arm64@0.25.4':
     optional: true
 
-  '@esbuild/win32-ia32@0.25.3':
+  '@esbuild/win32-ia32@0.25.4':
     optional: true
 
-  '@esbuild/win32-x64@0.25.3':
+  '@esbuild/win32-x64@0.25.4':
     optional: true
 
   '@eslint-community/eslint-utils@4.7.0(eslint@9.26.0(jiti@1.21.7))':
@@ -9503,27 +9530,30 @@ snapshots:
 
   '@leichtgewicht/ip-codec@2.0.5': {}
 
-  '@listr2/prompt-adapter-inquirer@2.0.21(@inquirer/prompts@7.5.0(@types/node@20.17.32))':
+  '@listr2/prompt-adapter-inquirer@2.0.22(@inquirer/prompts@7.5.0(@types/node@20.17.32))':
     dependencies:
       '@inquirer/prompts': 7.5.0(@types/node@20.17.32)
       '@inquirer/type': 1.5.5
 
-  '@lmdb/lmdb-darwin-arm64@3.2.6':
+  '@lmdb/lmdb-darwin-arm64@3.3.0':
+    optional: true
+
+  '@lmdb/lmdb-darwin-x64@3.3.0':
     optional: true
 
-  '@lmdb/lmdb-darwin-x64@3.2.6':
+  '@lmdb/lmdb-linux-arm64@3.3.0':
     optional: true
 
-  '@lmdb/lmdb-linux-arm64@3.2.6':
+  '@lmdb/lmdb-linux-arm@3.3.0':
     optional: true
 
-  '@lmdb/lmdb-linux-arm@3.2.6':
+  '@lmdb/lmdb-linux-x64@3.3.0':
     optional: true
 
-  '@lmdb/lmdb-linux-x64@3.2.6':
+  '@lmdb/lmdb-win32-arm64@3.3.0':
     optional: true
 
-  '@lmdb/lmdb-win32-x64@3.2.6':
+  '@lmdb/lmdb-win32-x64@3.3.0':
     optional: true
 
   '@mdn/browser-compat-data@6.0.11': {}
@@ -9883,13 +9913,13 @@ snapshots:
       - bare-buffer
       - supports-color
 
-  '@rollup/plugin-alias@5.1.1(rollup@4.40.1)':
+  '@rollup/plugin-alias@5.1.1(rollup@4.40.2)':
     optionalDependencies:
-      rollup: 4.40.1
+      rollup: 4.40.2
 
-  '@rollup/plugin-commonjs@28.0.3(rollup@4.40.1)':
+  '@rollup/plugin-commonjs@28.0.3(rollup@4.40.2)':
     dependencies:
-      '@rollup/pluginutils': 5.1.4(rollup@4.40.1)
+      '@rollup/pluginutils': 5.1.4(rollup@4.40.2)
       commondir: 1.0.1
       estree-walker: 2.0.2
       fdir: 6.4.4(picomatch@4.0.2)
@@ -9897,100 +9927,100 @@ snapshots:
       magic-string: 0.30.17
       picomatch: 4.0.2
     optionalDependencies:
-      rollup: 4.40.1
+      rollup: 4.40.2
 
-  '@rollup/plugin-json@6.1.0(rollup@4.40.1)':
+  '@rollup/plugin-json@6.1.0(rollup@4.40.2)':
     dependencies:
-      '@rollup/pluginutils': 5.1.4(rollup@4.40.1)
+      '@rollup/pluginutils': 5.1.4(rollup@4.40.2)
     optionalDependencies:
-      rollup: 4.40.1
+      rollup: 4.40.2
 
-  '@rollup/plugin-node-resolve@15.3.1(rollup@4.40.1)':
+  '@rollup/plugin-node-resolve@15.3.1(rollup@4.40.2)':
     dependencies:
-      '@rollup/pluginutils': 5.1.4(rollup@4.40.1)
+      '@rollup/pluginutils': 5.1.4(rollup@4.40.2)
       '@types/resolve': 1.20.2
       deepmerge: 4.3.1
       is-module: 1.0.0
       resolve: 1.22.10
     optionalDependencies:
-      rollup: 4.40.1
+      rollup: 4.40.2
 
-  '@rollup/plugin-node-resolve@16.0.1(rollup@4.40.1)':
+  '@rollup/plugin-node-resolve@16.0.1(rollup@4.40.2)':
     dependencies:
-      '@rollup/pluginutils': 5.1.4(rollup@4.40.1)
+      '@rollup/pluginutils': 5.1.4(rollup@4.40.2)
       '@types/resolve': 1.20.2
       deepmerge: 4.3.1
       is-module: 1.0.0
       resolve: 1.22.10
     optionalDependencies:
-      rollup: 4.40.1
+      rollup: 4.40.2
 
-  '@rollup/pluginutils@5.1.4(rollup@4.40.1)':
+  '@rollup/pluginutils@5.1.4(rollup@4.40.2)':
     dependencies:
       '@types/estree': 1.0.7
       estree-walker: 2.0.2
       picomatch: 4.0.2
     optionalDependencies:
-      rollup: 4.40.1
+      rollup: 4.40.2
 
-  '@rollup/rollup-android-arm-eabi@4.40.1':
+  '@rollup/rollup-android-arm-eabi@4.40.2':
     optional: true
 
-  '@rollup/rollup-android-arm64@4.40.1':
+  '@rollup/rollup-android-arm64@4.40.2':
     optional: true
 
-  '@rollup/rollup-darwin-arm64@4.40.1':
+  '@rollup/rollup-darwin-arm64@4.40.2':
     optional: true
 
-  '@rollup/rollup-darwin-x64@4.40.1':
+  '@rollup/rollup-darwin-x64@4.40.2':
     optional: true
 
-  '@rollup/rollup-freebsd-arm64@4.40.1':
+  '@rollup/rollup-freebsd-arm64@4.40.2':
     optional: true
 
-  '@rollup/rollup-freebsd-x64@4.40.1':
+  '@rollup/rollup-freebsd-x64@4.40.2':
     optional: true
 
-  '@rollup/rollup-linux-arm-gnueabihf@4.40.1':
+  '@rollup/rollup-linux-arm-gnueabihf@4.40.2':
     optional: true
 
-  '@rollup/rollup-linux-arm-musleabihf@4.40.1':
+  '@rollup/rollup-linux-arm-musleabihf@4.40.2':
     optional: true
 
-  '@rollup/rollup-linux-arm64-gnu@4.40.1':
+  '@rollup/rollup-linux-arm64-gnu@4.40.2':
     optional: true
 
-  '@rollup/rollup-linux-arm64-musl@4.40.1':
+  '@rollup/rollup-linux-arm64-musl@4.40.2':
     optional: true
 
-  '@rollup/rollup-linux-loongarch64-gnu@4.40.1':
+  '@rollup/rollup-linux-loongarch64-gnu@4.40.2':
     optional: true
 
-  '@rollup/rollup-linux-powerpc64le-gnu@4.40.1':
+  '@rollup/rollup-linux-powerpc64le-gnu@4.40.2':
     optional: true
 
-  '@rollup/rollup-linux-riscv64-gnu@4.40.1':
+  '@rollup/rollup-linux-riscv64-gnu@4.40.2':
     optional: true
 
-  '@rollup/rollup-linux-riscv64-musl@4.40.1':
+  '@rollup/rollup-linux-riscv64-musl@4.40.2':
     optional: true
 
-  '@rollup/rollup-linux-s390x-gnu@4.40.1':
+  '@rollup/rollup-linux-s390x-gnu@4.40.2':
     optional: true
 
-  '@rollup/rollup-linux-x64-gnu@4.40.1':
+  '@rollup/rollup-linux-x64-gnu@4.40.2':
     optional: true
 
-  '@rollup/rollup-linux-x64-musl@4.40.1':
+  '@rollup/rollup-linux-x64-musl@4.40.2':
     optional: true
 
-  '@rollup/rollup-win32-arm64-msvc@4.40.1':
+  '@rollup/rollup-win32-arm64-msvc@4.40.2':
     optional: true
 
-  '@rollup/rollup-win32-ia32-msvc@4.40.1':
+  '@rollup/rollup-win32-ia32-msvc@4.40.2':
     optional: true
 
-  '@rollup/rollup-win32-x64-msvc@4.40.1':
+  '@rollup/rollup-win32-x64-msvc@4.40.2':
     optional: true
 
   '@rollup/wasm-node@4.40.1':
@@ -10428,14 +10458,14 @@ snapshots:
       '@types/node': 20.17.32
     optional: true
 
-  '@typescript-eslint/eslint-plugin@8.31.1(@typescript-eslint/parser@8.31.1(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)':
+  '@typescript-eslint/eslint-plugin@8.32.0(@typescript-eslint/parser@8.32.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)':
     dependencies:
       '@eslint-community/regexpp': 4.12.1
-      '@typescript-eslint/parser': 8.31.1(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
-      '@typescript-eslint/scope-manager': 8.31.1
-      '@typescript-eslint/type-utils': 8.31.1(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
-      '@typescript-eslint/utils': 8.31.1(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
-      '@typescript-eslint/visitor-keys': 8.31.1
+      '@typescript-eslint/parser': 8.32.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
+      '@typescript-eslint/scope-manager': 8.32.0
+      '@typescript-eslint/type-utils': 8.32.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
+      '@typescript-eslint/utils': 8.32.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
+      '@typescript-eslint/visitor-keys': 8.32.0
       eslint: 9.26.0(jiti@1.21.7)
       graphemer: 1.4.0
       ignore: 5.3.2
@@ -10445,12 +10475,12 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@typescript-eslint/parser@8.31.1(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)':
+  '@typescript-eslint/parser@8.32.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)':
     dependencies:
-      '@typescript-eslint/scope-manager': 8.31.1
-      '@typescript-eslint/types': 8.31.1
-      '@typescript-eslint/typescript-estree': 8.31.1(typescript@5.8.3)
-      '@typescript-eslint/visitor-keys': 8.31.1
+      '@typescript-eslint/scope-manager': 8.32.0
+      '@typescript-eslint/types': 8.32.0
+      '@typescript-eslint/typescript-estree': 8.32.0(typescript@5.8.3)
+      '@typescript-eslint/visitor-keys': 8.32.0
       debug: 4.4.0(supports-color@10.0.0)
       eslint: 9.26.0(jiti@1.21.7)
       typescript: 5.8.3
@@ -10462,10 +10492,15 @@ snapshots:
       '@typescript-eslint/types': 8.31.1
       '@typescript-eslint/visitor-keys': 8.31.1
 
-  '@typescript-eslint/type-utils@8.31.1(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)':
+  '@typescript-eslint/scope-manager@8.32.0':
     dependencies:
-      '@typescript-eslint/typescript-estree': 8.31.1(typescript@5.8.3)
-      '@typescript-eslint/utils': 8.31.1(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
+      '@typescript-eslint/types': 8.32.0
+      '@typescript-eslint/visitor-keys': 8.32.0
+
+  '@typescript-eslint/type-utils@8.32.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)':
+    dependencies:
+      '@typescript-eslint/typescript-estree': 8.32.0(typescript@5.8.3)
+      '@typescript-eslint/utils': 8.32.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
       debug: 4.4.0(supports-color@10.0.0)
       eslint: 9.26.0(jiti@1.21.7)
       ts-api-utils: 2.1.0(typescript@5.8.3)
@@ -10475,6 +10510,8 @@ snapshots:
 
   '@typescript-eslint/types@8.31.1': {}
 
+  '@typescript-eslint/types@8.32.0': {}
+
   '@typescript-eslint/typescript-estree@8.31.1(typescript@5.8.3)':
     dependencies:
       '@typescript-eslint/types': 8.31.1
@@ -10489,6 +10526,20 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
+  '@typescript-eslint/typescript-estree@8.32.0(typescript@5.8.3)':
+    dependencies:
+      '@typescript-eslint/types': 8.32.0
+      '@typescript-eslint/visitor-keys': 8.32.0
+      debug: 4.4.0(supports-color@10.0.0)
+      fast-glob: 3.3.3
+      is-glob: 4.0.3
+      minimatch: 9.0.5
+      semver: 7.7.1
+      ts-api-utils: 2.1.0(typescript@5.8.3)
+      typescript: 5.8.3
+    transitivePeerDependencies:
+      - supports-color
+
   '@typescript-eslint/utils@8.31.1(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)':
     dependencies:
       '@eslint-community/eslint-utils': 4.7.0(eslint@9.26.0(jiti@1.21.7))
@@ -10500,11 +10551,27 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
+  '@typescript-eslint/utils@8.32.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)':
+    dependencies:
+      '@eslint-community/eslint-utils': 4.7.0(eslint@9.26.0(jiti@1.21.7))
+      '@typescript-eslint/scope-manager': 8.32.0
+      '@typescript-eslint/types': 8.32.0
+      '@typescript-eslint/typescript-estree': 8.32.0(typescript@5.8.3)
+      eslint: 9.26.0(jiti@1.21.7)
+      typescript: 5.8.3
+    transitivePeerDependencies:
+      - supports-color
+
   '@typescript-eslint/visitor-keys@8.31.1':
     dependencies:
       '@typescript-eslint/types': 8.31.1
       eslint-visitor-keys: 4.2.0
 
+  '@typescript-eslint/visitor-keys@8.32.0':
+    dependencies:
+      '@typescript-eslint/types': 8.32.0
+      eslint-visitor-keys: 4.2.0
+
   '@verdaccio/auth@8.0.0-next-8.15':
     dependencies:
       '@verdaccio/config': 8.0.0-next-8.15
@@ -10656,47 +10723,43 @@ snapshots:
     dependencies:
       vite: 6.3.5(@types/node@20.17.32)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1)
 
-  '@vitest/expect@3.1.2':
+  '@vitest/expect@3.1.3':
     dependencies:
-      '@vitest/spy': 3.1.2
-      '@vitest/utils': 3.1.2
+      '@vitest/spy': 3.1.3
+      '@vitest/utils': 3.1.3
       chai: 5.2.0
       tinyrainbow: 2.0.0
 
-  '@vitest/mocker@3.1.2(vite@6.3.5(@types/node@20.17.32)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1))':
+  '@vitest/mocker@3.1.3(vite@6.3.5(@types/node@20.17.32)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1))':
     dependencies:
-      '@vitest/spy': 3.1.2
+      '@vitest/spy': 3.1.3
       estree-walker: 3.0.3
       magic-string: 0.30.17
     optionalDependencies:
       vite: 6.3.5(@types/node@20.17.32)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1)
 
-  '@vitest/pretty-format@3.1.2':
-    dependencies:
-      tinyrainbow: 2.0.0
-
   '@vitest/pretty-format@3.1.3':
     dependencies:
       tinyrainbow: 2.0.0
 
-  '@vitest/runner@3.1.2':
+  '@vitest/runner@3.1.3':
     dependencies:
-      '@vitest/utils': 3.1.2
+      '@vitest/utils': 3.1.3
       pathe: 2.0.3
 
-  '@vitest/snapshot@3.1.2':
+  '@vitest/snapshot@3.1.3':
     dependencies:
-      '@vitest/pretty-format': 3.1.2
+      '@vitest/pretty-format': 3.1.3
       magic-string: 0.30.17
       pathe: 2.0.3
 
-  '@vitest/spy@3.1.2':
+  '@vitest/spy@3.1.3':
     dependencies:
       tinyspy: 3.0.2
 
-  '@vitest/utils@3.1.2':
+  '@vitest/utils@3.1.3':
     dependencies:
-      '@vitest/pretty-format': 3.1.2
+      '@vitest/pretty-format': 3.1.3
       loupe: 3.1.3
       tinyrainbow: 2.0.0
 
@@ -10733,11 +10796,11 @@ snapshots:
 
   '@web/dev-server-rollup@0.6.4':
     dependencies:
-      '@rollup/plugin-node-resolve': 15.3.1(rollup@4.40.1)
+      '@rollup/plugin-node-resolve': 15.3.1(rollup@4.40.2)
       '@web/dev-server-core': 0.7.5
       nanocolors: 0.2.13
       parse5: 6.0.1
-      rollup: 4.40.1
+      rollup: 4.40.2
       whatwg-url: 14.2.0
     transitivePeerDependencies:
       - bufferutil
@@ -11182,11 +11245,11 @@ snapshots:
 
   b4a@1.6.7: {}
 
-  babel-loader@10.0.0(@babel/core@7.27.1)(webpack@5.99.7(esbuild@0.25.3)):
+  babel-loader@10.0.0(@babel/core@7.27.1)(webpack@5.99.7(esbuild@0.25.4)):
     dependencies:
       '@babel/core': 7.27.1
       find-up: 5.0.0
-      webpack: 5.99.7(esbuild@0.25.3)
+      webpack: 5.99.7(esbuild@0.25.4)
 
   babel-plugin-polyfill-corejs2@0.4.13(@babel/core@7.27.1):
     dependencies:
@@ -11734,14 +11797,14 @@ snapshots:
     dependencies:
       is-what: 3.14.1
 
-  copy-webpack-plugin@13.0.0(webpack@5.99.7(esbuild@0.25.3)):
+  copy-webpack-plugin@13.0.0(webpack@5.99.7(esbuild@0.25.4)):
     dependencies:
       glob-parent: 6.0.2
       normalize-path: 3.0.0
       schema-utils: 4.3.2
       serialize-javascript: 6.0.2
       tinyglobby: 0.2.13
-      webpack: 5.99.7(esbuild@0.25.3)
+      webpack: 5.99.7(esbuild@0.25.4)
 
   core-js-compat@3.42.0:
     dependencies:
@@ -11795,7 +11858,7 @@ snapshots:
       shebang-command: 2.0.0
       which: 2.0.2
 
-  css-loader@7.1.2(webpack@5.99.7(esbuild@0.25.3)):
+  css-loader@7.1.2(webpack@5.99.7(esbuild@0.25.4)):
     dependencies:
       icss-utils: 5.1.0(postcss@8.5.3)
       postcss: 8.5.3
@@ -11806,7 +11869,7 @@ snapshots:
       postcss-value-parser: 4.2.0
       semver: 7.7.1
     optionalDependencies:
-      webpack: 5.99.7(esbuild@0.25.3)
+      webpack: 5.99.7(esbuild@0.25.4)
 
   css-select@5.1.0:
     dependencies:
@@ -12234,35 +12297,35 @@ snapshots:
     dependencies:
       es6-promise: 4.2.8
 
-  esbuild-wasm@0.25.3: {}
+  esbuild-wasm@0.25.4: {}
 
-  esbuild@0.25.3:
+  esbuild@0.25.4:
     optionalDependencies:
-      '@esbuild/aix-ppc64': 0.25.3
-      '@esbuild/android-arm': 0.25.3
-      '@esbuild/android-arm64': 0.25.3
-      '@esbuild/android-x64': 0.25.3
-      '@esbuild/darwin-arm64': 0.25.3
-      '@esbuild/darwin-x64': 0.25.3
-      '@esbuild/freebsd-arm64': 0.25.3
-      '@esbuild/freebsd-x64': 0.25.3
-      '@esbuild/linux-arm': 0.25.3
-      '@esbuild/linux-arm64': 0.25.3
-      '@esbuild/linux-ia32': 0.25.3
-      '@esbuild/linux-loong64': 0.25.3
-      '@esbuild/linux-mips64el': 0.25.3
-      '@esbuild/linux-ppc64': 0.25.3
-      '@esbuild/linux-riscv64': 0.25.3
-      '@esbuild/linux-s390x': 0.25.3
-      '@esbuild/linux-x64': 0.25.3
-      '@esbuild/netbsd-arm64': 0.25.3
-      '@esbuild/netbsd-x64': 0.25.3
-      '@esbuild/openbsd-arm64': 0.25.3
-      '@esbuild/openbsd-x64': 0.25.3
-      '@esbuild/sunos-x64': 0.25.3
-      '@esbuild/win32-arm64': 0.25.3
-      '@esbuild/win32-ia32': 0.25.3
-      '@esbuild/win32-x64': 0.25.3
+      '@esbuild/aix-ppc64': 0.25.4
+      '@esbuild/android-arm': 0.25.4
+      '@esbuild/android-arm64': 0.25.4
+      '@esbuild/android-x64': 0.25.4
+      '@esbuild/darwin-arm64': 0.25.4
+      '@esbuild/darwin-x64': 0.25.4
+      '@esbuild/freebsd-arm64': 0.25.4
+      '@esbuild/freebsd-x64': 0.25.4
+      '@esbuild/linux-arm': 0.25.4
+      '@esbuild/linux-arm64': 0.25.4
+      '@esbuild/linux-ia32': 0.25.4
+      '@esbuild/linux-loong64': 0.25.4
+      '@esbuild/linux-mips64el': 0.25.4
+      '@esbuild/linux-ppc64': 0.25.4
+      '@esbuild/linux-riscv64': 0.25.4
+      '@esbuild/linux-s390x': 0.25.4
+      '@esbuild/linux-x64': 0.25.4
+      '@esbuild/netbsd-arm64': 0.25.4
+      '@esbuild/netbsd-x64': 0.25.4
+      '@esbuild/openbsd-arm64': 0.25.4
+      '@esbuild/openbsd-x64': 0.25.4
+      '@esbuild/sunos-x64': 0.25.4
+      '@esbuild/win32-arm64': 0.25.4
+      '@esbuild/win32-ia32': 0.25.4
+      '@esbuild/win32-x64': 0.25.4
 
   escalade@3.2.0: {}
 
@@ -12292,11 +12355,11 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  eslint-module-utils@2.12.0(@typescript-eslint/parser@8.31.1(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.26.0(jiti@1.21.7)):
+  eslint-module-utils@2.12.0(@typescript-eslint/parser@8.32.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.26.0(jiti@1.21.7)):
     dependencies:
       debug: 3.2.7
     optionalDependencies:
-      '@typescript-eslint/parser': 8.31.1(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
+      '@typescript-eslint/parser': 8.32.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
       eslint: 9.26.0(jiti@1.21.7)
       eslint-import-resolver-node: 0.3.9
     transitivePeerDependencies:
@@ -12306,7 +12369,7 @@ snapshots:
     dependencies:
       eslint: 9.26.0(jiti@1.21.7)
 
-  eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.31.1(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.26.0(jiti@1.21.7)):
+  eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.32.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.26.0(jiti@1.21.7)):
     dependencies:
       '@rtsao/scc': 1.1.0
       array-includes: 3.1.8
@@ -12317,7 +12380,7 @@ snapshots:
       doctrine: 2.1.0
       eslint: 9.26.0(jiti@1.21.7)
       eslint-import-resolver-node: 0.3.9
-      eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.31.1(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.26.0(jiti@1.21.7))
+      eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.32.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.26.0(jiti@1.21.7))
       hasown: 2.0.2
       is-core-module: 2.16.1
       is-glob: 4.0.3
@@ -12329,7 +12392,7 @@ snapshots:
       string.prototype.trimend: 1.0.9
       tsconfig-paths: 3.15.0
     optionalDependencies:
-      '@typescript-eslint/parser': 8.31.1(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
+      '@typescript-eslint/parser': 8.32.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
     transitivePeerDependencies:
       - eslint-import-resolver-typescript
       - eslint-import-resolver-webpack
@@ -12551,7 +12614,7 @@ snapshots:
 
   extract-zip@2.0.1:
     dependencies:
-      debug: 4.3.4
+      debug: 4.4.0(supports-color@10.0.0)
       get-stream: 5.2.0
       yauzl: 2.10.0
     optionalDependencies:
@@ -13807,11 +13870,11 @@ snapshots:
       picocolors: 1.1.1
       shell-quote: 1.8.2
 
-  less-loader@12.3.0(less@4.3.0)(webpack@5.99.7(esbuild@0.25.3)):
+  less-loader@12.3.0(less@4.3.0)(webpack@5.99.7(esbuild@0.25.4)):
     dependencies:
       less: 4.3.0
     optionalDependencies:
-      webpack: 5.99.7(esbuild@0.25.3)
+      webpack: 5.99.7(esbuild@0.25.4)
 
   less@4.3.0:
     dependencies:
@@ -13832,11 +13895,11 @@ snapshots:
       prelude-ls: 1.2.1
       type-check: 0.4.0
 
-  license-webpack-plugin@4.0.2(webpack@5.99.7(esbuild@0.25.3)):
+  license-webpack-plugin@4.0.2(webpack@5.99.7(esbuild@0.25.4)):
     dependencies:
       webpack-sources: 3.2.3
     optionalDependencies:
-      webpack: 5.99.7(esbuild@0.25.3)
+      webpack: 5.99.7(esbuild@0.25.4)
 
   lie@3.3.0:
     dependencies:
@@ -13853,7 +13916,7 @@ snapshots:
 
   lines-and-columns@1.2.4: {}
 
-  listr2@8.3.2:
+  listr2@8.3.3:
     dependencies:
       cli-truncate: 4.0.0
       colorette: 2.0.20
@@ -13862,7 +13925,7 @@ snapshots:
       rfdc: 1.4.1
       wrap-ansi: 9.0.0
 
-  lmdb@3.2.6:
+  lmdb@3.3.0:
     dependencies:
       msgpackr: 1.11.2
       node-addon-api: 6.1.0
@@ -13870,12 +13933,13 @@ snapshots:
       ordered-binary: 1.5.3
       weak-lru-cache: 1.2.2
     optionalDependencies:
-      '@lmdb/lmdb-darwin-arm64': 3.2.6
-      '@lmdb/lmdb-darwin-x64': 3.2.6
-      '@lmdb/lmdb-linux-arm': 3.2.6
-      '@lmdb/lmdb-linux-arm64': 3.2.6
-      '@lmdb/lmdb-linux-x64': 3.2.6
-      '@lmdb/lmdb-win32-x64': 3.2.6
+      '@lmdb/lmdb-darwin-arm64': 3.3.0
+      '@lmdb/lmdb-darwin-x64': 3.3.0
+      '@lmdb/lmdb-linux-arm': 3.3.0
+      '@lmdb/lmdb-linux-arm64': 3.3.0
+      '@lmdb/lmdb-linux-x64': 3.3.0
+      '@lmdb/lmdb-win32-arm64': 3.3.0
+      '@lmdb/lmdb-win32-x64': 3.3.0
     optional: true
 
   loader-runner@4.3.0: {}
@@ -14066,11 +14130,11 @@ snapshots:
 
   mimic-function@5.0.1: {}
 
-  mini-css-extract-plugin@2.9.2(webpack@5.99.7(esbuild@0.25.3)):
+  mini-css-extract-plugin@2.9.2(webpack@5.99.7(esbuild@0.25.4)):
     dependencies:
       schema-utils: 4.3.2
       tapable: 2.2.1
-      webpack: 5.99.7(esbuild@0.25.3)
+      webpack: 5.99.7(esbuild@0.25.4)
 
   minimalistic-assert@1.0.1: {}
 
@@ -14203,7 +14267,7 @@ snapshots:
     dependencies:
       '@ampproject/remapping': 2.3.0
       '@angular/compiler-cli': 20.0.0-next.9(@angular/compiler@20.0.0-next.9)(typescript@5.8.3)
-      '@rollup/plugin-json': 6.1.0(rollup@4.40.1)
+      '@rollup/plugin-json': 6.1.0(rollup@4.40.2)
       '@rollup/wasm-node': 4.40.1
       ajv: 8.17.1
       ansi-colors: 4.1.3
@@ -14211,7 +14275,7 @@ snapshots:
       chokidar: 4.0.3
       commander: 13.1.0
       dependency-graph: 1.0.0
-      esbuild: 0.25.3
+      esbuild: 0.25.4
       find-cache-dir: 3.3.2
       injection-js: 2.5.0
       jsonc-parser: 3.3.1
@@ -14219,14 +14283,14 @@ snapshots:
       ora: 5.4.1
       piscina: 4.9.2
       postcss: 8.5.3
-      rollup-plugin-dts: 6.2.1(rollup@4.40.1)(typescript@5.8.3)
+      rollup-plugin-dts: 6.2.1(rollup@4.40.2)(typescript@5.8.3)
       rxjs: 7.8.2
       sass: 1.87.0
       tinyglobby: 0.2.13
       tslib: 2.8.1
       typescript: 5.8.3
     optionalDependencies:
-      rollup: 4.40.1
+      rollup: 4.40.2
 
   nice-try@1.0.5: {}
 
@@ -14696,14 +14760,14 @@ snapshots:
 
   possible-typed-array-names@1.1.0: {}
 
-  postcss-loader@8.1.1(postcss@8.5.3)(typescript@5.8.3)(webpack@5.99.7(esbuild@0.25.3)):
+  postcss-loader@8.1.1(postcss@8.5.3)(typescript@5.8.3)(webpack@5.99.7(esbuild@0.25.4)):
     dependencies:
       cosmiconfig: 9.0.0(typescript@5.8.3)
       jiti: 1.21.7
       postcss: 8.5.3
       semver: 7.7.1
     optionalDependencies:
-      webpack: 5.99.7(esbuild@0.25.3)
+      webpack: 5.99.7(esbuild@0.25.4)
     transitivePeerDependencies:
       - typescript
 
@@ -15140,45 +15204,45 @@ snapshots:
       node-fetch: 3.3.2
       spdx-expression-validate: 2.0.0
 
-  rollup-plugin-dts@6.2.1(rollup@4.40.1)(typescript@5.8.3):
+  rollup-plugin-dts@6.2.1(rollup@4.40.2)(typescript@5.8.3):
     dependencies:
       magic-string: 0.30.17
-      rollup: 4.40.1
+      rollup: 4.40.2
       typescript: 5.8.3
     optionalDependencies:
       '@babel/code-frame': 7.27.1
 
-  rollup-plugin-sourcemaps2@0.5.1(@types/node@20.17.32)(rollup@4.40.1):
+  rollup-plugin-sourcemaps2@0.5.1(@types/node@20.17.32)(rollup@4.40.2):
     dependencies:
-      '@rollup/pluginutils': 5.1.4(rollup@4.40.1)
-      rollup: 4.40.1
+      '@rollup/pluginutils': 5.1.4(rollup@4.40.2)
+      rollup: 4.40.2
     optionalDependencies:
       '@types/node': 20.17.32
 
-  rollup@4.40.1:
+  rollup@4.40.2:
     dependencies:
       '@types/estree': 1.0.7
     optionalDependencies:
-      '@rollup/rollup-android-arm-eabi': 4.40.1
-      '@rollup/rollup-android-arm64': 4.40.1
-      '@rollup/rollup-darwin-arm64': 4.40.1
-      '@rollup/rollup-darwin-x64': 4.40.1
-      '@rollup/rollup-freebsd-arm64': 4.40.1
-      '@rollup/rollup-freebsd-x64': 4.40.1
-      '@rollup/rollup-linux-arm-gnueabihf': 4.40.1
-      '@rollup/rollup-linux-arm-musleabihf': 4.40.1
-      '@rollup/rollup-linux-arm64-gnu': 4.40.1
-      '@rollup/rollup-linux-arm64-musl': 4.40.1
-      '@rollup/rollup-linux-loongarch64-gnu': 4.40.1
-      '@rollup/rollup-linux-powerpc64le-gnu': 4.40.1
-      '@rollup/rollup-linux-riscv64-gnu': 4.40.1
-      '@rollup/rollup-linux-riscv64-musl': 4.40.1
-      '@rollup/rollup-linux-s390x-gnu': 4.40.1
-      '@rollup/rollup-linux-x64-gnu': 4.40.1
-      '@rollup/rollup-linux-x64-musl': 4.40.1
-      '@rollup/rollup-win32-arm64-msvc': 4.40.1
-      '@rollup/rollup-win32-ia32-msvc': 4.40.1
-      '@rollup/rollup-win32-x64-msvc': 4.40.1
+      '@rollup/rollup-android-arm-eabi': 4.40.2
+      '@rollup/rollup-android-arm64': 4.40.2
+      '@rollup/rollup-darwin-arm64': 4.40.2
+      '@rollup/rollup-darwin-x64': 4.40.2
+      '@rollup/rollup-freebsd-arm64': 4.40.2
+      '@rollup/rollup-freebsd-x64': 4.40.2
+      '@rollup/rollup-linux-arm-gnueabihf': 4.40.2
+      '@rollup/rollup-linux-arm-musleabihf': 4.40.2
+      '@rollup/rollup-linux-arm64-gnu': 4.40.2
+      '@rollup/rollup-linux-arm64-musl': 4.40.2
+      '@rollup/rollup-linux-loongarch64-gnu': 4.40.2
+      '@rollup/rollup-linux-powerpc64le-gnu': 4.40.2
+      '@rollup/rollup-linux-riscv64-gnu': 4.40.2
+      '@rollup/rollup-linux-riscv64-musl': 4.40.2
+      '@rollup/rollup-linux-s390x-gnu': 4.40.2
+      '@rollup/rollup-linux-x64-gnu': 4.40.2
+      '@rollup/rollup-linux-x64-musl': 4.40.2
+      '@rollup/rollup-win32-arm64-msvc': 4.40.2
+      '@rollup/rollup-win32-ia32-msvc': 4.40.2
+      '@rollup/rollup-win32-x64-msvc': 4.40.2
       fsevents: 2.3.3
 
   router@2.2.0:
@@ -15232,12 +15296,12 @@ snapshots:
 
   safer-buffer@2.1.2: {}
 
-  sass-loader@16.0.5(sass@1.87.0)(webpack@5.99.7(esbuild@0.25.3)):
+  sass-loader@16.0.5(sass@1.87.0)(webpack@5.99.7(esbuild@0.25.4)):
     dependencies:
       neo-async: 2.6.2
     optionalDependencies:
       sass: 1.87.0
-      webpack: 5.99.7(esbuild@0.25.3)
+      webpack: 5.99.7(esbuild@0.25.4)
 
   sass@1.87.0:
     dependencies:
@@ -15566,11 +15630,11 @@ snapshots:
 
   source-map-js@1.2.1: {}
 
-  source-map-loader@5.0.0(webpack@5.99.7(esbuild@0.25.3)):
+  source-map-loader@5.0.0(webpack@5.99.7(esbuild@0.25.4)):
     dependencies:
       iconv-lite: 0.6.3
       source-map-js: 1.2.1
-      webpack: 5.99.7(esbuild@0.25.3)
+      webpack: 5.99.7(esbuild@0.25.4)
 
   source-map-support@0.4.18:
     dependencies:
@@ -15851,16 +15915,16 @@ snapshots:
       - encoding
       - supports-color
 
-  terser-webpack-plugin@5.3.14(esbuild@0.25.3)(webpack@5.99.7(esbuild@0.25.3)):
+  terser-webpack-plugin@5.3.14(esbuild@0.25.4)(webpack@5.99.7(esbuild@0.25.4)):
     dependencies:
       '@jridgewell/trace-mapping': 0.3.25
       jest-worker: 27.5.1
       schema-utils: 4.3.2
       serialize-javascript: 6.0.2
       terser: 5.39.0
-      webpack: 5.99.7(esbuild@0.25.3)
+      webpack: 5.99.7(esbuild@0.25.4)
     optionalDependencies:
-      esbuild: 0.25.3
+      esbuild: 0.25.4
 
   terser@5.39.0:
     dependencies:
@@ -16246,7 +16310,7 @@ snapshots:
       core-util-is: 1.0.2
       extsprintf: 1.3.0
 
-  vite-node@3.1.2(@types/node@20.17.32)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1):
+  vite-node@3.1.3(@types/node@20.17.32)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1):
     dependencies:
       cac: 6.7.14
       debug: 4.4.0(supports-color@10.0.0)
@@ -16269,11 +16333,11 @@ snapshots:
 
   vite@6.3.5(@types/node@20.17.32)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1):
     dependencies:
-      esbuild: 0.25.3
+      esbuild: 0.25.4
       fdir: 6.4.4(picomatch@4.0.2)
       picomatch: 4.0.2
       postcss: 8.5.3
-      rollup: 4.40.1
+      rollup: 4.40.2
       tinyglobby: 0.2.13
     optionalDependencies:
       '@types/node': 20.17.32
@@ -16284,15 +16348,15 @@ snapshots:
       terser: 5.39.0
       yaml: 2.7.1
 
-  vitest@3.1.2(@types/node@20.17.32)(jiti@1.21.7)(jsdom@26.1.0)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1):
+  vitest@3.1.3(@types/node@20.17.32)(jiti@1.21.7)(jsdom@26.1.0)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1):
     dependencies:
-      '@vitest/expect': 3.1.2
-      '@vitest/mocker': 3.1.2(vite@6.3.5(@types/node@20.17.32)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1))
+      '@vitest/expect': 3.1.3
+      '@vitest/mocker': 3.1.3(vite@6.3.5(@types/node@20.17.32)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1))
       '@vitest/pretty-format': 3.1.3
-      '@vitest/runner': 3.1.2
-      '@vitest/snapshot': 3.1.2
-      '@vitest/spy': 3.1.2
-      '@vitest/utils': 3.1.2
+      '@vitest/runner': 3.1.3
+      '@vitest/snapshot': 3.1.3
+      '@vitest/spy': 3.1.3
+      '@vitest/utils': 3.1.3
       chai: 5.2.0
       debug: 4.4.0(supports-color@10.0.0)
       expect-type: 1.2.1
@@ -16305,7 +16369,7 @@ snapshots:
       tinypool: 1.0.2
       tinyrainbow: 2.0.0
       vite: 6.3.5(@types/node@20.17.32)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1)
-      vite-node: 3.1.2(@types/node@20.17.32)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1)
+      vite-node: 3.1.3(@types/node@20.17.32)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1)
       why-is-node-running: 2.3.0
     optionalDependencies:
       '@types/node': 20.17.32
@@ -16373,7 +16437,7 @@ snapshots:
 
   webidl-conversions@7.0.0: {}
 
-  webpack-dev-middleware@7.4.2(webpack@5.99.7(esbuild@0.25.3)):
+  webpack-dev-middleware@7.4.2(webpack@5.99.7(esbuild@0.25.4)):
     dependencies:
       colorette: 2.0.20
       memfs: 4.17.1
@@ -16382,9 +16446,9 @@ snapshots:
       range-parser: 1.2.1
       schema-utils: 4.3.2
     optionalDependencies:
-      webpack: 5.99.7(esbuild@0.25.3)
+      webpack: 5.99.7(esbuild@0.25.4)
 
-  webpack-dev-server@5.2.1(webpack@5.99.7(esbuild@0.25.3)):
+  webpack-dev-server@5.2.1(webpack@5.99.7(esbuild@0.25.4)):
     dependencies:
       '@types/bonjour': 3.5.13
       '@types/connect-history-api-fallback': 1.5.4
@@ -16412,10 +16476,10 @@ snapshots:
       serve-index: 1.9.1
       sockjs: 0.3.24
       spdy: 4.0.2
-      webpack-dev-middleware: 7.4.2(webpack@5.99.7(esbuild@0.25.3))
+      webpack-dev-middleware: 7.4.2(webpack@5.99.7(esbuild@0.25.4))
       ws: 8.18.2
     optionalDependencies:
-      webpack: 5.99.7(esbuild@0.25.3)
+      webpack: 5.99.7(esbuild@0.25.4)
     transitivePeerDependencies:
       - bufferutil
       - debug
@@ -16430,12 +16494,12 @@ snapshots:
 
   webpack-sources@3.2.3: {}
 
-  webpack-subresource-integrity@5.1.0(webpack@5.99.7(esbuild@0.25.3)):
+  webpack-subresource-integrity@5.1.0(webpack@5.99.7(esbuild@0.25.4)):
     dependencies:
       typed-assert: 1.0.9
-      webpack: 5.99.7(esbuild@0.25.3)
+      webpack: 5.99.7(esbuild@0.25.4)
 
-  webpack@5.99.7(esbuild@0.25.3):
+  webpack@5.99.7(esbuild@0.25.4):
     dependencies:
       '@types/eslint-scope': 3.7.7
       '@types/estree': 1.0.7
@@ -16458,7 +16522,7 @@ snapshots:
       neo-async: 2.6.2
       schema-utils: 4.3.2
       tapable: 2.2.1
-      terser-webpack-plugin: 5.3.14(esbuild@0.25.3)(webpack@5.99.7(esbuild@0.25.3))
+      terser-webpack-plugin: 5.3.14(esbuild@0.25.4)(webpack@5.99.7(esbuild@0.25.4))
       watchpack: 2.4.2
       webpack-sources: 3.2.3
     transitivePeerDependencies:

From 635999d4ef6045c50526193f1ead3dd4542a225b Mon Sep 17 00:00:00 2001
From: Alan Agius <17563226+alan-agius4@users.noreply.github.com>
Date: Tue, 6 May 2025 08:47:41 +0000
Subject: [PATCH 022/138] fix(@angular-devkit/build-angular): correctly set
 i18n subPath in webpack browser builder

The `subPath` option was not being properly applied when using the webpack-based browser builder.

Closes #30247

(cherry picked from commit b5432b71585d58d86815974cc773fc5e0e5fa8ff)
---
 .../build_angular/src/utils/process-bundle.ts | 10 ++-
 .../e2e/tests/i18n/ivy-localize-sub-path.ts   | 73 +++++++++++++++++++
 2 files changed, 79 insertions(+), 4 deletions(-)
 create mode 100644 tests/legacy-cli/e2e/tests/i18n/ivy-localize-sub-path.ts

diff --git a/packages/angular_devkit/build_angular/src/utils/process-bundle.ts b/packages/angular_devkit/build_angular/src/utils/process-bundle.ts
index f1f76a966e9e..ebd6f5e511ca 100644
--- a/packages/angular_devkit/build_angular/src/utils/process-bundle.ts
+++ b/packages/angular_devkit/build_angular/src/utils/process-bundle.ts
@@ -192,10 +192,10 @@ export async function inlineLocales(options: InlineOptions) {
     if (!transformResult || !transformResult.code) {
       throw new Error(`Unknown error occurred processing bundle for "${options.filename}".`);
     }
-
+    const subPath = i18n.locales[locale].subPath;
     const outputPath = path.join(
       options.outputPath,
-      i18n.flatOutput ? '' : locale,
+      i18n.flatOutput ? '' : subPath,
       options.filename,
     );
     await fs.writeFile(outputPath, transformResult.code);
@@ -284,9 +284,10 @@ async function inlineLocalesDirect(ast: ParseResult, options: InlineOptions) {
       source: string;
       map: { file: string; sourceRoot?: string };
     };
+    const subPath = i18n.locales[locale].subPath;
     const outputPath = path.join(
       options.outputPath,
-      i18n.flatOutput ? '' : locale,
+      i18n.flatOutput ? '' : subPath,
       options.filename,
     );
     await fs.writeFile(outputPath, outputCode);
@@ -309,9 +310,10 @@ async function inlineCopyOnly(options: InlineOptions) {
   }
 
   for (const locale of i18n.inlineLocales) {
+    const subPath = i18n.locales[locale].subPath;
     const outputPath = path.join(
       options.outputPath,
-      i18n.flatOutput ? '' : locale,
+      i18n.flatOutput ? '' : subPath,
       options.filename,
     );
     await fs.writeFile(outputPath, options.code);
diff --git a/tests/legacy-cli/e2e/tests/i18n/ivy-localize-sub-path.ts b/tests/legacy-cli/e2e/tests/i18n/ivy-localize-sub-path.ts
new file mode 100644
index 000000000000..d6640534c45f
--- /dev/null
+++ b/tests/legacy-cli/e2e/tests/i18n/ivy-localize-sub-path.ts
@@ -0,0 +1,73 @@
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.dev/license
+ */
+
+import { join } from 'node:path';
+import { expectFileToMatch } from '../../utils/fs';
+import { ng } from '../../utils/process';
+import { updateJsonFile } from '../../utils/project';
+import { baseDir, baseHrefs, externalServer, langTranslations, setupI18nConfig } from './setup';
+
+export default async function () {
+  // Setup i18n tests and config.
+  await setupI18nConfig();
+
+  const URL_SUB_PATH: Record<string, string> = {
+    'en-US': '',
+    'fr': 'fr',
+    'de': 'deutsche',
+  };
+
+  // Update angular.json
+  await updateJsonFile('angular.json', (workspaceJson) => {
+    const appProject = workspaceJson.projects['test-project'];
+    const i18n: Record<string, any> = appProject.i18n;
+
+    i18n.sourceLocale = {
+      subPath: URL_SUB_PATH['en-US'],
+    };
+
+    i18n.locales['fr'] = {
+      translation: i18n.locales['fr'],
+      subPath: URL_SUB_PATH['fr'],
+    };
+
+    i18n.locales['de'] = {
+      translation: i18n.locales['de'],
+      subPath: URL_SUB_PATH['de'],
+    };
+  });
+
+  // Build each locale and verify the output.
+  await ng('build');
+  for (const { lang } of langTranslations) {
+    const subPath = URL_SUB_PATH[lang];
+    const baseHref = subPath ? `/${subPath}/` : '/';
+    const outputPath = join(baseDir, subPath);
+
+    // Verify the HTML lang attribute is present
+    await expectFileToMatch(`${outputPath}/index.html`, `lang="${lang}"`);
+
+    // Verify the HTML base HREF attribute is present
+    await expectFileToMatch(`${outputPath}/index.html`, `href="${baseHref}"`);
+
+    // Execute Application E2E tests for a production build without dev server
+    const { server, port, url } = await externalServer(outputPath, baseHref);
+
+    try {
+      await ng(
+        'e2e',
+        `--port=${port}`,
+        `--configuration=${lang}`,
+        '--dev-server-target=',
+        `--base-url=${url}`,
+      );
+    } finally {
+      server.close();
+    }
+  }
+}

From 2c4ed32019689c62b662db0e2aef1c78d10da5cb Mon Sep 17 00:00:00 2001
From: Angular Robot <angular-robot@google.com>
Date: Tue, 6 May 2025 05:03:15 +0000
Subject: [PATCH 023/138] build: update rules_angular digest to 42d4791

(cherry picked from commit 4ca2ce5f277e638c39226535238bc3c65ef4ee83)
---
 WORKSPACE | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/WORKSPACE b/WORKSPACE
index 62b9f1c1e01e..740dfc3ef610 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -262,7 +262,7 @@ esbuild_register_toolchains(
 
 git_repository(
     name = "rules_angular",
-    commit = "3ba9d6790055543de2125e11967d3b5a7c7b314d",
+    commit = "42d4791c1c2cd8b21deaf960443dd883033fdedf",
     remote = "https://github.com/devversion/rules_angular.git",
 )
 

From 69a3a1930c138803ea618cf8fdc67bc6b4eb9a4c Mon Sep 17 00:00:00 2001
From: Angular Robot <angular-robot@google.com>
Date: Tue, 6 May 2025 11:04:04 +0000
Subject: [PATCH 024/138] build: update angular

---
 .../assistant-to-the-branch-manager.yml       |  2 +-
 .github/workflows/ci.yml                      | 50 +++++++++----------
 .github/workflows/dev-infra.yml               |  4 +-
 .github/workflows/feature-requests.yml        |  2 +-
 .github/workflows/perf.yml                    |  6 +--
 .github/workflows/pr.yml                      | 42 ++++++++--------
 package.json                                  |  2 +-
 pnpm-lock.yaml                                | 20 ++++----
 tests/legacy-cli/e2e/ng-snapshot/package.json | 32 ++++++------
 9 files changed, 80 insertions(+), 80 deletions(-)

diff --git a/.github/workflows/assistant-to-the-branch-manager.yml b/.github/workflows/assistant-to-the-branch-manager.yml
index 0753d9c05b1e..f305499de0f9 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@b3df5e35ff652de75d22d1f68f3887696f3b49a2
         with:
           angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }}
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index d988709a535f..c499a3b621ec 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@b3df5e35ff652de75d22d1f68f3887696f3b49a2
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+        uses: angular/dev-infra/github-actions/bazel/setup@b3df5e35ff652de75d22d1f68f3887696f3b49a2
       - 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@b3df5e35ff652de75d22d1f68f3887696f3b49a2
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+        uses: angular/dev-infra/github-actions/bazel/setup@b3df5e35ff652de75d22d1f68f3887696f3b49a2
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@b3df5e35ff652de75d22d1f68f3887696f3b49a2
         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@b3df5e35ff652de75d22d1f68f3887696f3b49a2
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+        uses: angular/dev-infra/github-actions/bazel/setup@b3df5e35ff652de75d22d1f68f3887696f3b49a2
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@b3df5e35ff652de75d22d1f68f3887696f3b49a2
         with:
           google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }}
       - name: Install node modules
@@ -87,13 +87,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@b3df5e35ff652de75d22d1f68f3887696f3b49a2
       - 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@b3df5e35ff652de75d22d1f68f3887696f3b49a2
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@b3df5e35ff652de75d22d1f68f3887696f3b49a2
         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@b3df5e35ff652de75d22d1f68f3887696f3b49a2
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+        uses: angular/dev-infra/github-actions/bazel/setup@b3df5e35ff652de75d22d1f68f3887696f3b49a2
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@b3df5e35ff652de75d22d1f68f3887696f3b49a2
         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@b3df5e35ff652de75d22d1f68f3887696f3b49a2
       - 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@b3df5e35ff652de75d22d1f68f3887696f3b49a2
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@b3df5e35ff652de75d22d1f68f3887696f3b49a2
         with:
           google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }}
       - name: Run CLI E2E tests
@@ -162,13 +162,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@b3df5e35ff652de75d22d1f68f3887696f3b49a2
       - 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@b3df5e35ff652de75d22d1f68f3887696f3b49a2
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@b3df5e35ff652de75d22d1f68f3887696f3b49a2
         with:
           google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }}
       - name: Run CLI E2E tests
@@ -182,13 +182,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@b3df5e35ff652de75d22d1f68f3887696f3b49a2
       - 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@b3df5e35ff652de75d22d1f68f3887696f3b49a2
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@b3df5e35ff652de75d22d1f68f3887696f3b49a2
         with:
           google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }}
       - name: Run E2E Browser tests
@@ -218,11 +218,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@b3df5e35ff652de75d22d1f68f3887696f3b49a2
       - 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@b3df5e35ff652de75d22d1f68f3887696f3b49a2
       - 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..bf72d29ecc14 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/commit-message-based-labels@b3df5e35ff652de75d22d1f68f3887696f3b49a2
         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@b3df5e35ff652de75d22d1f68f3887696f3b49a2
         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..52833a93d9a5 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@b3df5e35ff652de75d22d1f68f3887696f3b49a2
         with:
           angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }}
diff --git a/.github/workflows/perf.yml b/.github/workflows/perf.yml
index a21fc698a58e..e37635990911 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@b3df5e35ff652de75d22d1f68f3887696f3b49a2
       - 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@b3df5e35ff652de75d22d1f68f3887696f3b49a2
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+        uses: angular/dev-infra/github-actions/bazel/setup@b3df5e35ff652de75d22d1f68f3887696f3b49a2
       - 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..2b94e9a49de7 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@b3df5e35ff652de75d22d1f68f3887696f3b49a2
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+        uses: angular/dev-infra/github-actions/bazel/setup@b3df5e35ff652de75d22d1f68f3887696f3b49a2
       - 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@b3df5e35ff652de75d22d1f68f3887696f3b49a2
       - 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@b3df5e35ff652de75d22d1f68f3887696f3b49a2
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+        uses: angular/dev-infra/github-actions/bazel/setup@b3df5e35ff652de75d22d1f68f3887696f3b49a2
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@b3df5e35ff652de75d22d1f68f3887696f3b49a2
       - name: Install node modules
         run: pnpm install --frozen-lockfile
       - name: Build release targets
@@ -93,11 +93,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@b3df5e35ff652de75d22d1f68f3887696f3b49a2
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+        uses: angular/dev-infra/github-actions/bazel/setup@b3df5e35ff652de75d22d1f68f3887696f3b49a2
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@b3df5e35ff652de75d22d1f68f3887696f3b49a2
       - 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@b3df5e35ff652de75d22d1f68f3887696f3b49a2
       - 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@b3df5e35ff652de75d22d1f68f3887696f3b49a2
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@b3df5e35ff652de75d22d1f68f3887696f3b49a2
       - 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@b3df5e35ff652de75d22d1f68f3887696f3b49a2
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+        uses: angular/dev-infra/github-actions/bazel/setup@b3df5e35ff652de75d22d1f68f3887696f3b49a2
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@b3df5e35ff652de75d22d1f68f3887696f3b49a2
         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@b3df5e35ff652de75d22d1f68f3887696f3b49a2
       - 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@b3df5e35ff652de75d22d1f68f3887696f3b49a2
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@b3df5e35ff652de75d22d1f68f3887696f3b49a2
       - 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@b3df5e35ff652de75d22d1f68f3887696f3b49a2
       - 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@b3df5e35ff652de75d22d1f68f3887696f3b49a2
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@b3df5e35ff652de75d22d1f68f3887696f3b49a2
       - 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/package.json b/package.json
index dcbcb9578f07..e67b65420777 100644
--- a/package.json
+++ b/package.json
@@ -55,7 +55,7 @@
     "@angular/forms": "20.0.0-next.9",
     "@angular/localize": "20.0.0-next.9",
     "@angular/material": "20.0.0-next.10",
-    "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#1a12d97905f4af88ccc0b582864907729d23e23e",
+    "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#873988f86d59c491504c0994687339362d4a88c8",
     "@angular/platform-browser": "20.0.0-next.9",
     "@angular/platform-server": "20.0.0-next.9",
     "@angular/router": "20.0.0-next.9",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 3f85326a2cc5..7c9cdc3ad9e2 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -42,8 +42,8 @@ importers:
         specifier: 20.0.0-next.10
         version: 20.0.0-next.10(xotmywbppgelv3sapeuqfwdbqe)
       '@angular/ng-dev':
-        specifier: https://github.com/angular/dev-infra-private-ng-dev-builds.git#1a12d97905f4af88ccc0b582864907729d23e23e
-        version: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/1a12d97905f4af88ccc0b582864907729d23e23e(encoding@0.1.13)
+        specifier: https://github.com/angular/dev-infra-private-ng-dev-builds.git#873988f86d59c491504c0994687339362d4a88c8
+        version: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/873988f86d59c491504c0994687339362d4a88c8(encoding@0.1.13)
       '@angular/platform-browser':
         specifier: 20.0.0-next.9
         version: 20.0.0-next.9(@angular/animations@20.0.0-next.9(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))
@@ -975,9 +975,9 @@ packages:
       '@angular/platform-browser': ^20.0.0-0 || ^20.1.0-0 || ^20.2.0-0 || ^20.3.0-0 || ^21.0.0-0
       rxjs: ^6.5.3 || ^7.4.0
 
-  '@angular/ng-dev@https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/1a12d97905f4af88ccc0b582864907729d23e23e':
-    resolution: {tarball: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/1a12d97905f4af88ccc0b582864907729d23e23e}
-    version: 0.0.0-a4538b2474d3c551f0217c3d1f5f3a99cf4f8eb7
+  '@angular/ng-dev@https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/873988f86d59c491504c0994687339362d4a88c8':
+    resolution: {tarball: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/873988f86d59c491504c0994687339362d4a88c8}
+    version: 0.0.0-b3df5e35ff652de75d22d1f68f3887696f3b49a2
     hasBin: true
 
   '@angular/platform-browser@20.0.0-next.9':
@@ -1788,8 +1788,8 @@ packages:
     resolution: {integrity: sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g==}
     engines: {node: '>=14'}
 
-  '@google-cloud/spanner@7.19.1':
-    resolution: {integrity: sha512-a7WlM4T3g5hslSBxQpsCxlH2IGgeVVEnDP5/v51kNlKv/W5PhBMqaHanodkUjbjegsQNlWAkqLClzIwtldfSXg==}
+  '@google-cloud/spanner@7.21.0':
+    resolution: {integrity: sha512-SrlHgXmSaEbGhdimxcB0FgNsW9J931JBBveoGW43clQHVNcDJuKRoG+240inbSRZoW8JIwwEHToXYU5YGO3VGg==}
     engines: {node: '>=14.0.0'}
 
   '@grpc/grpc-js@1.13.3':
@@ -8347,9 +8347,9 @@ snapshots:
       rxjs: 7.8.2
       tslib: 2.8.1
 
-  '@angular/ng-dev@https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/1a12d97905f4af88ccc0b582864907729d23e23e(encoding@0.1.13)':
+  '@angular/ng-dev@https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/873988f86d59c491504c0994687339362d4a88c8(encoding@0.1.13)':
     dependencies:
-      '@google-cloud/spanner': 7.19.1(encoding@0.1.13)(supports-color@10.0.0)
+      '@google-cloud/spanner': 7.21.0(encoding@0.1.13)(supports-color@10.0.0)
       '@octokit/rest': 21.1.1
       '@types/semver': 7.7.0
       '@types/supports-color': 10.0.0
@@ -9284,7 +9284,7 @@ snapshots:
 
   '@google-cloud/promisify@4.0.0': {}
 
-  '@google-cloud/spanner@7.19.1(encoding@0.1.13)(supports-color@10.0.0)':
+  '@google-cloud/spanner@7.21.0(encoding@0.1.13)(supports-color@10.0.0)':
     dependencies:
       '@google-cloud/common': 5.0.2(encoding@0.1.13)(supports-color@10.0.0)
       '@google-cloud/precise-date': 4.0.0
diff --git a/tests/legacy-cli/e2e/ng-snapshot/package.json b/tests/legacy-cli/e2e/ng-snapshot/package.json
index 1a431d409fd2..ce294bdfbc9e 100644
--- a/tests/legacy-cli/e2e/ng-snapshot/package.json
+++ b/tests/legacy-cli/e2e/ng-snapshot/package.json
@@ -2,21 +2,21 @@
   "description": "snapshot versions of Angular for e2e testing",
   "private": true,
   "dependencies": {
-    "@angular/animations": "github:angular/animations-builds#70437044e5b0074540409cad255ca4d91d79c1c8",
-    "@angular/cdk": "github:angular/cdk-builds#de1fc05b3b4733424a66af748e1fd44080309210",
-    "@angular/common": "github:angular/common-builds#e8786a46ae79af50c9c83b5a8dd315a43ea70283",
-    "@angular/compiler": "github:angular/compiler-builds#ca24fe76322efbbf2a6a1cab12904216f8f1bc95",
-    "@angular/compiler-cli": "github:angular/compiler-cli-builds#21561eac90bf45a6a0bd4ac0de8980d233fe0ccd",
-    "@angular/core": "github:angular/core-builds#7516ead7d16f69723ec9bdbe766ece9943a2effc",
-    "@angular/forms": "github:angular/forms-builds#b0a6b04487795becd45e872495d00fa45e2be5ed",
-    "@angular/language-service": "github:angular/language-service-builds#83ece439ea89c113e8cfe674429fd5725bc82171",
-    "@angular/localize": "github:angular/localize-builds#88881809ac51de44c9e6b029efe6891fa21667e3",
-    "@angular/material": "github:angular/material-builds#51bd2a0636c33560241803ac2f8e63f53881eca8",
-    "@angular/material-moment-adapter": "github:angular/material-moment-adapter-builds#215db3851ebf3092a48095567aec5e56ae8dec7f",
-    "@angular/platform-browser": "github:angular/platform-browser-builds#e8ad977073bbdfef5d750c48f2cd809e2f7e265e",
-    "@angular/platform-browser-dynamic": "github:angular/platform-browser-dynamic-builds#09535955b2db12ad3873987ca1c9d776c52a5fa5",
-    "@angular/platform-server": "github:angular/platform-server-builds#dde837a59a472f69607e9883e7c4214e5e4f73ae",
-    "@angular/router": "github:angular/router-builds#d769500262d4428c8d8fce21c30f58a4bab7a3d9",
-    "@angular/service-worker": "github:angular/service-worker-builds#024b948b4057385977e7be9eeb8d13ea7657d1b1"
+    "@angular/animations": "github:angular/animations-builds#f07ca93fee0e94fcf4e8f6c7d1ebd1383993f18a",
+    "@angular/cdk": "github:angular/cdk-builds#8defccd7d5561062aaf230f89e79453e88e7e483",
+    "@angular/common": "github:angular/common-builds#44e0f788200cca797c2f7b07f20ead8f05dbc60c",
+    "@angular/compiler": "github:angular/compiler-builds#fff8c6e3178184c1b0fcb22a976d76b9a3aa90bd",
+    "@angular/compiler-cli": "github:angular/compiler-cli-builds#40828b0210af450b5ce54a1e01d03138f4c74157",
+    "@angular/core": "github:angular/core-builds#91ca48d98e521ad95c09e37ef9858d48c1b4da81",
+    "@angular/forms": "github:angular/forms-builds#9ee0d37d2c25baa10801942dcfa813ba1edeb193",
+    "@angular/language-service": "github:angular/language-service-builds#8014a86465157bb7272111d88348390c6dbb9cc3",
+    "@angular/localize": "github:angular/localize-builds#4db181e10db88d8051f00c76eb30dfd2b37e1e18",
+    "@angular/material": "github:angular/material-builds#5a2b3507bb272515b63b0bfe3ba0a7c400fefea5",
+    "@angular/material-moment-adapter": "github:angular/material-moment-adapter-builds#f1823c404904324c374ffc59e676729fbae8ec67",
+    "@angular/platform-browser": "github:angular/platform-browser-builds#39d142b597203db5cd3da03afc09e106e58be388",
+    "@angular/platform-browser-dynamic": "github:angular/platform-browser-dynamic-builds#98a5f272e2663abea3701f5ae504e971d09099e8",
+    "@angular/platform-server": "github:angular/platform-server-builds#3dfec326325068ccee0528082cb8e44ebf7a471d",
+    "@angular/router": "github:angular/router-builds#a017829831963890ca3d7cbb815c272b504d161c",
+    "@angular/service-worker": "github:angular/service-worker-builds#a18823d2181048f3aec3758862f683647d45e204"
   }
 }

From e513cd4aa218e5ab634f05c18b6aa90f223e096c Mon Sep 17 00:00:00 2001
From: Alan Agius <17563226+alan-agius4@users.noreply.github.com>
Date: Tue, 6 May 2025 16:51:47 +0000
Subject: [PATCH 025/138] fix(@angular/cli): add Node.js 24 as supported
 version

Node.js 24 has been released https://nodejs.org/en/about/previous-releases

(cherry picked from commit ed928410d5b4bcc9277279323c323625a2720df2)
---
 constants.bzl                                    | 2 +-
 packages/angular/cli/src/commands/version/cli.ts | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/constants.bzl b/constants.bzl
index 4c42bcb8dbb9..cb33e793ed8c 100644
--- a/constants.bzl
+++ b/constants.bzl
@@ -1,5 +1,5 @@
 # Engine versions to stamp in a release package.json
-RELEASE_ENGINES_NODE = "^20.11.1 || >=22.11.0"
+RELEASE_ENGINES_NODE = "^20.11.1 || ^22.11.0 || >=24.0.0"
 RELEASE_ENGINES_NPM = "^6.11.0 || ^7.5.6 || >=8.0.0"
 RELEASE_ENGINES_YARN = ">= 1.13.0"
 
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\/.*/,

From a51b85f47f3b9e10e6e6a2ac8692fa905dcfeb7f Mon Sep 17 00:00:00 2001
From: Alan Agius <17563226+alan-agius4@users.noreply.github.com>
Date: Wed, 7 May 2025 06:35:39 +0000
Subject: [PATCH 026/138] build: update all non-major dependencies

Closes #30260 as a pr takeover

(cherry picked from commit d354381f26a5e250c6db7c46045d312e6e47411a)
---
 WORKSPACE                                     |   6 +-
 .../angular_devkit/build_angular/package.json |   4 +-
 .../angular_devkit/build_webpack/package.json |   2 +-
 packages/ngtools/webpack/package.json         |   2 +-
 packages/ngtools/webpack/src/ivy/loader.ts    |  11 +-
 pnpm-lock.yaml                                | 147 ++++++++++--------
 6 files changed, 96 insertions(+), 76 deletions(-)

diff --git a/WORKSPACE b/WORKSPACE
index 740dfc3ef610..1a0cd8aa81e5 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -110,9 +110,9 @@ rules_js_register_toolchains(
 
 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")
diff --git a/packages/angular_devkit/build_angular/package.json b/packages/angular_devkit/build_angular/package.json
index b5440ed5c939..feb1dce8875c 100644
--- a/packages/angular_devkit/build_angular/package.json
+++ b/packages/angular_devkit/build_angular/package.json
@@ -18,7 +18,7 @@
     "@babel/plugin-transform-async-generator-functions": "7.27.1",
     "@babel/plugin-transform-async-to-generator": "7.27.1",
     "@babel/plugin-transform-runtime": "7.27.1",
-    "@babel/preset-env": "7.27.1",
+    "@babel/preset-env": "7.27.2",
     "@babel/runtime": "7.27.1",
     "@discoveryjs/json-ext": "0.6.3",
     "@ngtools/webpack": "workspace:0.0.0-PLACEHOLDER",
@@ -56,7 +56,7 @@
     "terser": "5.39.0",
     "tree-kill": "1.2.2",
     "tslib": "2.8.1",
-    "webpack": "5.99.7",
+    "webpack": "5.99.8",
     "webpack-dev-middleware": "7.4.2",
     "webpack-dev-server": "5.2.1",
     "webpack-merge": "6.0.1",
diff --git a/packages/angular_devkit/build_webpack/package.json b/packages/angular_devkit/build_webpack/package.json
index 2aef21b4ddf5..95fb10657e1d 100644
--- a/packages/angular_devkit/build_webpack/package.json
+++ b/packages/angular_devkit/build_webpack/package.json
@@ -22,7 +22,7 @@
   "devDependencies": {
     "@angular-devkit/core": "workspace:0.0.0-PLACEHOLDER",
     "@ngtools/webpack": "workspace:0.0.0-PLACEHOLDER",
-    "webpack": "5.99.7",
+    "webpack": "5.99.8",
     "webpack-dev-server": "5.2.1"
   },
   "peerDependencies": {
diff --git a/packages/ngtools/webpack/package.json b/packages/ngtools/webpack/package.json
index c94a6b1f11b4..20dc65e038bd 100644
--- a/packages/ngtools/webpack/package.json
+++ b/packages/ngtools/webpack/package.json
@@ -30,6 +30,6 @@
     "@angular/compiler": "20.0.0-next.9",
     "@angular/compiler-cli": "20.0.0-next.9",
     "typescript": "5.8.3",
-    "webpack": "5.99.7"
+    "webpack": "5.99.8"
   }
 }
diff --git a/packages/ngtools/webpack/src/ivy/loader.ts b/packages/ngtools/webpack/src/ivy/loader.ts
index 685d086ea466..79a511fcee06 100644
--- a/packages/ngtools/webpack/src/ivy/loader.ts
+++ b/packages/ngtools/webpack/src/ivy/loader.ts
@@ -10,6 +10,10 @@ import * as path from 'node:path';
 import type { LoaderContext } from 'webpack';
 import { AngularPluginSymbol, FileEmitterCollection } from './symbol';
 
+type SourceMap = NonNullable<
+  Exclude<Parameters<LoaderContext<unknown>['callback']>[2], string | undefined>
+>;
+
 const JS_FILE_REGEXP = /\.[cm]?js$/;
 
 export function angularWebpackLoader(
@@ -59,13 +63,10 @@ export function angularWebpackLoader(
       result.dependencies.forEach((dependency) => this.addDependency(dependency));
 
       let resultContent = result.content || '';
-      let resultMap;
+      let resultMap: SourceMap | undefined;
       if (result.map) {
         resultContent = resultContent.replace(/^\/\/# sourceMappingURL=[^\r\n]*/gm, '');
-        resultMap = JSON.parse(result.map) as Exclude<
-          Parameters<typeof callback>[2],
-          string | undefined
-        >;
+        resultMap = JSON.parse(result.map) as SourceMap;
         resultMap.sources = resultMap.sources.map((source: string) =>
           path.join(path.dirname(this.resourcePath), source),
         );
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 7c9cdc3ad9e2..2c7682d3910f 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -618,8 +618,8 @@ importers:
         specifier: 7.27.1
         version: 7.27.1(@babel/core@7.27.1)
       '@babel/preset-env':
-        specifier: 7.27.1
-        version: 7.27.1(@babel/core@7.27.1)
+        specifier: 7.27.2
+        version: 7.27.2(@babel/core@7.27.1)
       '@babel/runtime':
         specifier: 7.27.1
         version: 7.27.1
@@ -640,16 +640,16 @@ importers:
         version: 10.4.21(postcss@8.5.3)
       babel-loader:
         specifier: 10.0.0
-        version: 10.0.0(@babel/core@7.27.1)(webpack@5.99.7(esbuild@0.25.4))
+        version: 10.0.0(@babel/core@7.27.1)(webpack@5.99.8(esbuild@0.25.4))
       browserslist:
         specifier: ^4.21.5
         version: 4.24.5
       copy-webpack-plugin:
         specifier: 13.0.0
-        version: 13.0.0(webpack@5.99.7(esbuild@0.25.4))
+        version: 13.0.0(webpack@5.99.8(esbuild@0.25.4))
       css-loader:
         specifier: 7.1.2
-        version: 7.1.2(webpack@5.99.7(esbuild@0.25.4))
+        version: 7.1.2(webpack@5.99.8(esbuild@0.25.4))
       esbuild-wasm:
         specifier: 0.25.4
         version: 0.25.4
@@ -673,16 +673,16 @@ importers:
         version: 4.3.0
       less-loader:
         specifier: 12.3.0
-        version: 12.3.0(less@4.3.0)(webpack@5.99.7(esbuild@0.25.4))
+        version: 12.3.0(less@4.3.0)(webpack@5.99.8(esbuild@0.25.4))
       license-webpack-plugin:
         specifier: 4.0.2
-        version: 4.0.2(webpack@5.99.7(esbuild@0.25.4))
+        version: 4.0.2(webpack@5.99.8(esbuild@0.25.4))
       loader-utils:
         specifier: 3.3.1
         version: 3.3.1
       mini-css-extract-plugin:
         specifier: 2.9.2
-        version: 2.9.2(webpack@5.99.7(esbuild@0.25.4))
+        version: 2.9.2(webpack@5.99.8(esbuild@0.25.4))
       open:
         specifier: 10.1.2
         version: 10.1.2
@@ -700,7 +700,7 @@ importers:
         version: 8.5.3
       postcss-loader:
         specifier: 8.1.1
-        version: 8.1.1(postcss@8.5.3)(typescript@5.8.3)(webpack@5.99.7(esbuild@0.25.4))
+        version: 8.1.1(postcss@8.5.3)(typescript@5.8.3)(webpack@5.99.8(esbuild@0.25.4))
       resolve-url-loader:
         specifier: 5.0.0
         version: 5.0.0
@@ -712,13 +712,13 @@ importers:
         version: 1.87.0
       sass-loader:
         specifier: 16.0.5
-        version: 16.0.5(sass@1.87.0)(webpack@5.99.7(esbuild@0.25.4))
+        version: 16.0.5(sass@1.87.0)(webpack@5.99.8(esbuild@0.25.4))
       semver:
         specifier: 7.7.1
         version: 7.7.1
       source-map-loader:
         specifier: 5.0.0
-        version: 5.0.0(webpack@5.99.7(esbuild@0.25.4))
+        version: 5.0.0(webpack@5.99.8(esbuild@0.25.4))
       source-map-support:
         specifier: 0.5.21
         version: 0.5.21
@@ -732,20 +732,20 @@ importers:
         specifier: 2.8.1
         version: 2.8.1
       webpack:
-        specifier: 5.99.7
-        version: 5.99.7(esbuild@0.25.4)
+        specifier: 5.99.8
+        version: 5.99.8(esbuild@0.25.4)
       webpack-dev-middleware:
         specifier: 7.4.2
-        version: 7.4.2(webpack@5.99.7(esbuild@0.25.4))
+        version: 7.4.2(webpack@5.99.8(esbuild@0.25.4))
       webpack-dev-server:
         specifier: 5.2.1
-        version: 5.2.1(webpack@5.99.7(esbuild@0.25.4))
+        version: 5.2.1(webpack@5.99.8(esbuild@0.25.4))
       webpack-merge:
         specifier: 6.0.1
         version: 6.0.1
       webpack-subresource-integrity:
         specifier: 5.1.0
-        version: 5.1.0(webpack@5.99.7(esbuild@0.25.4))
+        version: 5.1.0(webpack@5.99.8(esbuild@0.25.4))
     optionalDependencies:
       esbuild:
         specifier: 0.25.4
@@ -783,11 +783,11 @@ importers:
         specifier: workspace:0.0.0-PLACEHOLDER
         version: link:../../ngtools/webpack
       webpack:
-        specifier: 5.99.7
-        version: 5.99.7(esbuild@0.25.4)
+        specifier: 5.99.8
+        version: 5.99.8(esbuild@0.25.4)
       webpack-dev-server:
         specifier: 5.2.1
-        version: 5.2.1(webpack@5.99.7(esbuild@0.25.4))
+        version: 5.2.1(webpack@5.99.8(esbuild@0.25.4))
 
   packages/angular_devkit/core:
     dependencies:
@@ -865,8 +865,8 @@ importers:
         specifier: 5.8.3
         version: 5.8.3
       webpack:
-        specifier: 5.99.7
-        version: 5.99.7(esbuild@0.25.4)
+        specifier: 5.99.8
+        version: 5.99.8(esbuild@0.25.4)
 
   packages/schematics/angular:
     dependencies:
@@ -1029,6 +1029,10 @@ packages:
     resolution: {integrity: sha512-Q+E+rd/yBzNQhXkG+zQnF58e4zoZfBedaxwzPmicKsiK3nt8iJYrSrDbjwFFDGC4f+rPafqRaPH6TsDoSvMf7A==}
     engines: {node: '>=6.9.0'}
 
+  '@babel/compat-data@7.27.2':
+    resolution: {integrity: sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ==}
+    engines: {node: '>=6.9.0'}
+
   '@babel/core@7.26.10':
     resolution: {integrity: sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==}
     engines: {node: '>=6.9.0'}
@@ -1049,6 +1053,10 @@ packages:
     resolution: {integrity: sha512-2YaDd/Rd9E598B5+WIc8wJPmWETiiJXFYVE60oX8FDohv7rAUU3CQj+A1MgeEmcsk2+dQuEjIe/GDvig0SqL4g==}
     engines: {node: '>=6.9.0'}
 
+  '@babel/helper-compilation-targets@7.27.2':
+    resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==}
+    engines: {node: '>=6.9.0'}
+
   '@babel/helper-create-class-features-plugin@7.27.1':
     resolution: {integrity: sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==}
     engines: {node: '>=6.9.0'}
@@ -1367,8 +1375,8 @@ packages:
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/plugin-transform-object-rest-spread@7.27.1':
-    resolution: {integrity: sha512-/sSliVc9gHE20/7D5qsdGlq7RG5NCDTWsAhyqzGuq174EtWJoGzIu1BQ7G56eDsTcy1jseBZwv50olSdXOlGuA==}
+  '@babel/plugin-transform-object-rest-spread@7.27.2':
+    resolution: {integrity: sha512-AIUHD7xJ1mCrj3uPozvtngY3s0xpv7Nu7DoUSnzNY6Xam1Cy4rUznR//pvMHOhQ4AvbCexhbqXCtpxGHOGOO6g==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
@@ -1493,8 +1501,8 @@ packages:
     peerDependencies:
       '@babel/core': ^7.0.0
 
-  '@babel/preset-env@7.27.1':
-    resolution: {integrity: sha512-TZ5USxFpLgKDpdEt8YWBR7p6g+bZo6sHaXLqP2BY/U0acaoI8FTVflcYCr/v94twM1C5IWFdZ/hscq9WjUeLXA==}
+  '@babel/preset-env@7.27.2':
+    resolution: {integrity: sha512-Ma4zSuYSlGNRlCLO+EAzLnCmJK2vdstgv+n7aUP+/IKZrOfWHOJVdSJtuub8RzHTj3ahD37k5OKJWvzf16TQyQ==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
@@ -8009,8 +8017,8 @@ packages:
       html-webpack-plugin:
         optional: true
 
-  webpack@5.99.7:
-    resolution: {integrity: sha512-CNqKBRMQjwcmKR0idID5va1qlhrqVUKpovi+Ec79ksW8ux7iS1+A6VqzfZXgVYCFRKl7XL5ap3ZoMpwBJxcg0w==}
+  webpack@5.99.8:
+    resolution: {integrity: sha512-lQ3CPiSTpfOnrEGeXDwoq5hIGzSjmwD72GdfVzF7CQAI7t47rJG9eDWvcEkEn3CUQymAElVvDg3YNTlCYj+qUQ==}
     engines: {node: '>=10.13.0'}
     hasBin: true
     peerDependencies:
@@ -8412,6 +8420,8 @@ snapshots:
 
   '@babel/compat-data@7.27.1': {}
 
+  '@babel/compat-data@7.27.2': {}
+
   '@babel/core@7.26.10':
     dependencies:
       '@ampproject/remapping': 2.3.0
@@ -8472,6 +8482,14 @@ snapshots:
       lru-cache: 5.1.1
       semver: 6.3.1
 
+  '@babel/helper-compilation-targets@7.27.2':
+    dependencies:
+      '@babel/compat-data': 7.27.2
+      '@babel/helper-validator-option': 7.27.1
+      browserslist: 4.24.5
+      lru-cache: 5.1.1
+      semver: 6.3.1
+
   '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.27.1)':
     dependencies:
       '@babel/core': 7.27.1
@@ -8701,7 +8719,7 @@ snapshots:
     dependencies:
       '@babel/core': 7.27.1
       '@babel/helper-annotate-as-pure': 7.27.1
-      '@babel/helper-compilation-targets': 7.27.1
+      '@babel/helper-compilation-targets': 7.27.2
       '@babel/helper-plugin-utils': 7.27.1
       '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.1)
       '@babel/traverse': 7.27.1
@@ -8763,7 +8781,7 @@ snapshots:
   '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.27.1)':
     dependencies:
       '@babel/core': 7.27.1
-      '@babel/helper-compilation-targets': 7.27.1
+      '@babel/helper-compilation-targets': 7.27.2
       '@babel/helper-plugin-utils': 7.27.1
       '@babel/traverse': 7.27.1
     transitivePeerDependencies:
@@ -8844,11 +8862,12 @@ snapshots:
       '@babel/core': 7.27.1
       '@babel/helper-plugin-utils': 7.27.1
 
-  '@babel/plugin-transform-object-rest-spread@7.27.1(@babel/core@7.27.1)':
+  '@babel/plugin-transform-object-rest-spread@7.27.2(@babel/core@7.27.1)':
     dependencies:
       '@babel/core': 7.27.1
-      '@babel/helper-compilation-targets': 7.27.1
+      '@babel/helper-compilation-targets': 7.27.2
       '@babel/helper-plugin-utils': 7.27.1
+      '@babel/plugin-transform-destructuring': 7.27.1(@babel/core@7.27.1)
       '@babel/plugin-transform-parameters': 7.27.1(@babel/core@7.27.1)
 
   '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.27.1)':
@@ -8978,11 +8997,11 @@ snapshots:
       '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.1)
       '@babel/helper-plugin-utils': 7.27.1
 
-  '@babel/preset-env@7.27.1(@babel/core@7.27.1)':
+  '@babel/preset-env@7.27.2(@babel/core@7.27.1)':
     dependencies:
-      '@babel/compat-data': 7.27.1
+      '@babel/compat-data': 7.27.2
       '@babel/core': 7.27.1
-      '@babel/helper-compilation-targets': 7.27.1
+      '@babel/helper-compilation-targets': 7.27.2
       '@babel/helper-plugin-utils': 7.27.1
       '@babel/helper-validator-option': 7.27.1
       '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.27.1(@babel/core@7.27.1)
@@ -9024,7 +9043,7 @@ snapshots:
       '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.27.1)
       '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.27.1)
       '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.27.1)
-      '@babel/plugin-transform-object-rest-spread': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-transform-object-rest-spread': 7.27.2(@babel/core@7.27.1)
       '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.27.1)
       '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.27.1)
       '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.27.1)
@@ -11245,11 +11264,11 @@ snapshots:
 
   b4a@1.6.7: {}
 
-  babel-loader@10.0.0(@babel/core@7.27.1)(webpack@5.99.7(esbuild@0.25.4)):
+  babel-loader@10.0.0(@babel/core@7.27.1)(webpack@5.99.8(esbuild@0.25.4)):
     dependencies:
       '@babel/core': 7.27.1
       find-up: 5.0.0
-      webpack: 5.99.7(esbuild@0.25.4)
+      webpack: 5.99.8(esbuild@0.25.4)
 
   babel-plugin-polyfill-corejs2@0.4.13(@babel/core@7.27.1):
     dependencies:
@@ -11797,14 +11816,14 @@ snapshots:
     dependencies:
       is-what: 3.14.1
 
-  copy-webpack-plugin@13.0.0(webpack@5.99.7(esbuild@0.25.4)):
+  copy-webpack-plugin@13.0.0(webpack@5.99.8(esbuild@0.25.4)):
     dependencies:
       glob-parent: 6.0.2
       normalize-path: 3.0.0
       schema-utils: 4.3.2
       serialize-javascript: 6.0.2
       tinyglobby: 0.2.13
-      webpack: 5.99.7(esbuild@0.25.4)
+      webpack: 5.99.8(esbuild@0.25.4)
 
   core-js-compat@3.42.0:
     dependencies:
@@ -11858,7 +11877,7 @@ snapshots:
       shebang-command: 2.0.0
       which: 2.0.2
 
-  css-loader@7.1.2(webpack@5.99.7(esbuild@0.25.4)):
+  css-loader@7.1.2(webpack@5.99.8(esbuild@0.25.4)):
     dependencies:
       icss-utils: 5.1.0(postcss@8.5.3)
       postcss: 8.5.3
@@ -11869,7 +11888,7 @@ snapshots:
       postcss-value-parser: 4.2.0
       semver: 7.7.1
     optionalDependencies:
-      webpack: 5.99.7(esbuild@0.25.4)
+      webpack: 5.99.8(esbuild@0.25.4)
 
   css-select@5.1.0:
     dependencies:
@@ -13870,11 +13889,11 @@ snapshots:
       picocolors: 1.1.1
       shell-quote: 1.8.2
 
-  less-loader@12.3.0(less@4.3.0)(webpack@5.99.7(esbuild@0.25.4)):
+  less-loader@12.3.0(less@4.3.0)(webpack@5.99.8(esbuild@0.25.4)):
     dependencies:
       less: 4.3.0
     optionalDependencies:
-      webpack: 5.99.7(esbuild@0.25.4)
+      webpack: 5.99.8(esbuild@0.25.4)
 
   less@4.3.0:
     dependencies:
@@ -13895,11 +13914,11 @@ snapshots:
       prelude-ls: 1.2.1
       type-check: 0.4.0
 
-  license-webpack-plugin@4.0.2(webpack@5.99.7(esbuild@0.25.4)):
+  license-webpack-plugin@4.0.2(webpack@5.99.8(esbuild@0.25.4)):
     dependencies:
       webpack-sources: 3.2.3
     optionalDependencies:
-      webpack: 5.99.7(esbuild@0.25.4)
+      webpack: 5.99.8(esbuild@0.25.4)
 
   lie@3.3.0:
     dependencies:
@@ -14130,11 +14149,11 @@ snapshots:
 
   mimic-function@5.0.1: {}
 
-  mini-css-extract-plugin@2.9.2(webpack@5.99.7(esbuild@0.25.4)):
+  mini-css-extract-plugin@2.9.2(webpack@5.99.8(esbuild@0.25.4)):
     dependencies:
       schema-utils: 4.3.2
       tapable: 2.2.1
-      webpack: 5.99.7(esbuild@0.25.4)
+      webpack: 5.99.8(esbuild@0.25.4)
 
   minimalistic-assert@1.0.1: {}
 
@@ -14760,14 +14779,14 @@ snapshots:
 
   possible-typed-array-names@1.1.0: {}
 
-  postcss-loader@8.1.1(postcss@8.5.3)(typescript@5.8.3)(webpack@5.99.7(esbuild@0.25.4)):
+  postcss-loader@8.1.1(postcss@8.5.3)(typescript@5.8.3)(webpack@5.99.8(esbuild@0.25.4)):
     dependencies:
       cosmiconfig: 9.0.0(typescript@5.8.3)
       jiti: 1.21.7
       postcss: 8.5.3
       semver: 7.7.1
     optionalDependencies:
-      webpack: 5.99.7(esbuild@0.25.4)
+      webpack: 5.99.8(esbuild@0.25.4)
     transitivePeerDependencies:
       - typescript
 
@@ -15296,12 +15315,12 @@ snapshots:
 
   safer-buffer@2.1.2: {}
 
-  sass-loader@16.0.5(sass@1.87.0)(webpack@5.99.7(esbuild@0.25.4)):
+  sass-loader@16.0.5(sass@1.87.0)(webpack@5.99.8(esbuild@0.25.4)):
     dependencies:
       neo-async: 2.6.2
     optionalDependencies:
       sass: 1.87.0
-      webpack: 5.99.7(esbuild@0.25.4)
+      webpack: 5.99.8(esbuild@0.25.4)
 
   sass@1.87.0:
     dependencies:
@@ -15630,11 +15649,11 @@ snapshots:
 
   source-map-js@1.2.1: {}
 
-  source-map-loader@5.0.0(webpack@5.99.7(esbuild@0.25.4)):
+  source-map-loader@5.0.0(webpack@5.99.8(esbuild@0.25.4)):
     dependencies:
       iconv-lite: 0.6.3
       source-map-js: 1.2.1
-      webpack: 5.99.7(esbuild@0.25.4)
+      webpack: 5.99.8(esbuild@0.25.4)
 
   source-map-support@0.4.18:
     dependencies:
@@ -15915,14 +15934,14 @@ snapshots:
       - encoding
       - supports-color
 
-  terser-webpack-plugin@5.3.14(esbuild@0.25.4)(webpack@5.99.7(esbuild@0.25.4)):
+  terser-webpack-plugin@5.3.14(esbuild@0.25.4)(webpack@5.99.8(esbuild@0.25.4)):
     dependencies:
       '@jridgewell/trace-mapping': 0.3.25
       jest-worker: 27.5.1
       schema-utils: 4.3.2
       serialize-javascript: 6.0.2
       terser: 5.39.0
-      webpack: 5.99.7(esbuild@0.25.4)
+      webpack: 5.99.8(esbuild@0.25.4)
     optionalDependencies:
       esbuild: 0.25.4
 
@@ -16437,7 +16456,7 @@ snapshots:
 
   webidl-conversions@7.0.0: {}
 
-  webpack-dev-middleware@7.4.2(webpack@5.99.7(esbuild@0.25.4)):
+  webpack-dev-middleware@7.4.2(webpack@5.99.8(esbuild@0.25.4)):
     dependencies:
       colorette: 2.0.20
       memfs: 4.17.1
@@ -16446,9 +16465,9 @@ snapshots:
       range-parser: 1.2.1
       schema-utils: 4.3.2
     optionalDependencies:
-      webpack: 5.99.7(esbuild@0.25.4)
+      webpack: 5.99.8(esbuild@0.25.4)
 
-  webpack-dev-server@5.2.1(webpack@5.99.7(esbuild@0.25.4)):
+  webpack-dev-server@5.2.1(webpack@5.99.8(esbuild@0.25.4)):
     dependencies:
       '@types/bonjour': 3.5.13
       '@types/connect-history-api-fallback': 1.5.4
@@ -16476,10 +16495,10 @@ snapshots:
       serve-index: 1.9.1
       sockjs: 0.3.24
       spdy: 4.0.2
-      webpack-dev-middleware: 7.4.2(webpack@5.99.7(esbuild@0.25.4))
+      webpack-dev-middleware: 7.4.2(webpack@5.99.8(esbuild@0.25.4))
       ws: 8.18.2
     optionalDependencies:
-      webpack: 5.99.7(esbuild@0.25.4)
+      webpack: 5.99.8(esbuild@0.25.4)
     transitivePeerDependencies:
       - bufferutil
       - debug
@@ -16494,12 +16513,12 @@ snapshots:
 
   webpack-sources@3.2.3: {}
 
-  webpack-subresource-integrity@5.1.0(webpack@5.99.7(esbuild@0.25.4)):
+  webpack-subresource-integrity@5.1.0(webpack@5.99.8(esbuild@0.25.4)):
     dependencies:
       typed-assert: 1.0.9
-      webpack: 5.99.7(esbuild@0.25.4)
+      webpack: 5.99.8(esbuild@0.25.4)
 
-  webpack@5.99.7(esbuild@0.25.4):
+  webpack@5.99.8(esbuild@0.25.4):
     dependencies:
       '@types/eslint-scope': 3.7.7
       '@types/estree': 1.0.7
@@ -16522,7 +16541,7 @@ snapshots:
       neo-async: 2.6.2
       schema-utils: 4.3.2
       tapable: 2.2.1
-      terser-webpack-plugin: 5.3.14(esbuild@0.25.4)(webpack@5.99.7(esbuild@0.25.4))
+      terser-webpack-plugin: 5.3.14(esbuild@0.25.4)(webpack@5.99.8(esbuild@0.25.4))
       watchpack: 2.4.2
       webpack-sources: 3.2.3
     transitivePeerDependencies:

From 7bba1ce2f5f90640bafb1637c470b9617d00a034 Mon Sep 17 00:00:00 2001
From: Angular Robot <angular-robot@google.com>
Date: Wed, 7 May 2025 10:04:30 +0000
Subject: [PATCH 027/138] build: update angular

(cherry picked from commit 24453e771e1adf0e6f9847776f30e7ad4e0bacc1)
---
 .../assistant-to-the-branch-manager.yml       |  2 +-
 .github/workflows/ci.yml                      | 50 +++++++++----------
 .github/workflows/dev-infra.yml               |  4 +-
 .github/workflows/feature-requests.yml        |  2 +-
 .github/workflows/perf.yml                    |  6 +--
 .github/workflows/pr.yml                      | 42 ++++++++--------
 package.json                                  |  2 +-
 pnpm-lock.yaml                                | 12 ++---
 tests/legacy-cli/e2e/ng-snapshot/package.json | 32 ++++++------
 9 files changed, 76 insertions(+), 76 deletions(-)

diff --git a/.github/workflows/assistant-to-the-branch-manager.yml b/.github/workflows/assistant-to-the-branch-manager.yml
index f305499de0f9..a46a76f2f4de 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@b3df5e35ff652de75d22d1f68f3887696f3b49a2
+      - uses: angular/dev-infra/github-actions/branch-manager@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
         with:
           angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }}
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index c499a3b621ec..a0ec69c967be 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@b3df5e35ff652de75d22d1f68f3887696f3b49a2
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@b3df5e35ff652de75d22d1f68f3887696f3b49a2
+        uses: angular/dev-infra/github-actions/bazel/setup@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
       - 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@b3df5e35ff652de75d22d1f68f3887696f3b49a2
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@b3df5e35ff652de75d22d1f68f3887696f3b49a2
+        uses: angular/dev-infra/github-actions/bazel/setup@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@b3df5e35ff652de75d22d1f68f3887696f3b49a2
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
         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@b3df5e35ff652de75d22d1f68f3887696f3b49a2
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@b3df5e35ff652de75d22d1f68f3887696f3b49a2
+        uses: angular/dev-infra/github-actions/bazel/setup@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@b3df5e35ff652de75d22d1f68f3887696f3b49a2
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
         with:
           google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }}
       - name: Install node modules
@@ -87,13 +87,13 @@ jobs:
     runs-on: ${{ matrix.os }}
     steps:
       - name: Initialize environment
-        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@b3df5e35ff652de75d22d1f68f3887696f3b49a2
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
       - name: Install node modules
         run: pnpm install --frozen-lockfile
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@b3df5e35ff652de75d22d1f68f3887696f3b49a2
+        uses: angular/dev-infra/github-actions/bazel/setup@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@b3df5e35ff652de75d22d1f68f3887696f3b49a2
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
         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@b3df5e35ff652de75d22d1f68f3887696f3b49a2
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@b3df5e35ff652de75d22d1f68f3887696f3b49a2
+        uses: angular/dev-infra/github-actions/bazel/setup@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@b3df5e35ff652de75d22d1f68f3887696f3b49a2
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
         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@b3df5e35ff652de75d22d1f68f3887696f3b49a2
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
       - name: Install node modules
         run: pnpm install --frozen-lockfile
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@b3df5e35ff652de75d22d1f68f3887696f3b49a2
+        uses: angular/dev-infra/github-actions/bazel/setup@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@b3df5e35ff652de75d22d1f68f3887696f3b49a2
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
         with:
           google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }}
       - name: Run CLI E2E tests
@@ -162,13 +162,13 @@ jobs:
     runs-on: ${{ matrix.os }}
     steps:
       - name: Initialize environment
-        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@b3df5e35ff652de75d22d1f68f3887696f3b49a2
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
       - name: Install node modules
         run: pnpm install --frozen-lockfile
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@b3df5e35ff652de75d22d1f68f3887696f3b49a2
+        uses: angular/dev-infra/github-actions/bazel/setup@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@b3df5e35ff652de75d22d1f68f3887696f3b49a2
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
         with:
           google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }}
       - name: Run CLI E2E tests
@@ -182,13 +182,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@b3df5e35ff652de75d22d1f68f3887696f3b49a2
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
       - name: Install node modules
         run: pnpm install --frozen-lockfile
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@b3df5e35ff652de75d22d1f68f3887696f3b49a2
+        uses: angular/dev-infra/github-actions/bazel/setup@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@b3df5e35ff652de75d22d1f68f3887696f3b49a2
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
         with:
           google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }}
       - name: Run E2E Browser tests
@@ -218,11 +218,11 @@ jobs:
       CIRCLE_BRANCH: ${{ github.ref_name }}
     steps:
       - name: Initialize environment
-        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@b3df5e35ff652de75d22d1f68f3887696f3b49a2
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
       - name: Install node modules
         run: pnpm install --frozen-lockfile
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@b3df5e35ff652de75d22d1f68f3887696f3b49a2
+        uses: angular/dev-infra/github-actions/bazel/setup@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
       - 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 bf72d29ecc14..a4c41ecb1d2c 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@b3df5e35ff652de75d22d1f68f3887696f3b49a2
+      - uses: angular/dev-infra/github-actions/commit-message-based-labels@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
         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@b3df5e35ff652de75d22d1f68f3887696f3b49a2
+      - uses: angular/dev-infra/github-actions/post-approval-changes@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
         with:
           angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }}
diff --git a/.github/workflows/feature-requests.yml b/.github/workflows/feature-requests.yml
index 52833a93d9a5..5f48097b7975 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@b3df5e35ff652de75d22d1f68f3887696f3b49a2
+      - uses: angular/dev-infra/github-actions/feature-request@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
         with:
           angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }}
diff --git a/.github/workflows/perf.yml b/.github/workflows/perf.yml
index e37635990911..5fbcbf75894c 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@b3df5e35ff652de75d22d1f68f3887696f3b49a2
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
       - 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@b3df5e35ff652de75d22d1f68f3887696f3b49a2
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@b3df5e35ff652de75d22d1f68f3887696f3b49a2
+        uses: angular/dev-infra/github-actions/bazel/setup@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
       - 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 2b94e9a49de7..e38b513ff426 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@b3df5e35ff652de75d22d1f68f3887696f3b49a2
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@b3df5e35ff652de75d22d1f68f3887696f3b49a2
+        uses: angular/dev-infra/github-actions/bazel/setup@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
       - 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@b3df5e35ff652de75d22d1f68f3887696f3b49a2
+        uses: angular/dev-infra/github-actions/linting/licenses@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
       - 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@b3df5e35ff652de75d22d1f68f3887696f3b49a2
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@b3df5e35ff652de75d22d1f68f3887696f3b49a2
+        uses: angular/dev-infra/github-actions/bazel/setup@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@b3df5e35ff652de75d22d1f68f3887696f3b49a2
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
       - name: Install node modules
         run: pnpm install --frozen-lockfile
       - name: Build release targets
@@ -93,11 +93,11 @@ jobs:
     runs-on: ubuntu-latest
     steps:
       - name: Initialize environment
-        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@b3df5e35ff652de75d22d1f68f3887696f3b49a2
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@b3df5e35ff652de75d22d1f68f3887696f3b49a2
+        uses: angular/dev-infra/github-actions/bazel/setup@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@b3df5e35ff652de75d22d1f68f3887696f3b49a2
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
       - 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@b3df5e35ff652de75d22d1f68f3887696f3b49a2
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
       - name: Install node modules
         run: pnpm install --frozen-lockfile
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@b3df5e35ff652de75d22d1f68f3887696f3b49a2
+        uses: angular/dev-infra/github-actions/bazel/setup@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@b3df5e35ff652de75d22d1f68f3887696f3b49a2
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
       - 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@b3df5e35ff652de75d22d1f68f3887696f3b49a2
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@b3df5e35ff652de75d22d1f68f3887696f3b49a2
+        uses: angular/dev-infra/github-actions/bazel/setup@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@b3df5e35ff652de75d22d1f68f3887696f3b49a2
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
         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@b3df5e35ff652de75d22d1f68f3887696f3b49a2
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
       - name: Install node modules
         run: pnpm install --frozen-lockfile
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@b3df5e35ff652de75d22d1f68f3887696f3b49a2
+        uses: angular/dev-infra/github-actions/bazel/setup@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@b3df5e35ff652de75d22d1f68f3887696f3b49a2
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
       - 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@b3df5e35ff652de75d22d1f68f3887696f3b49a2
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
       - name: Install node modules
         run: pnpm install --frozen-lockfile
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@b3df5e35ff652de75d22d1f68f3887696f3b49a2
+        uses: angular/dev-infra/github-actions/bazel/setup@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@b3df5e35ff652de75d22d1f68f3887696f3b49a2
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
       - 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/package.json b/package.json
index e67b65420777..325c140ae11e 100644
--- a/package.json
+++ b/package.json
@@ -55,7 +55,7 @@
     "@angular/forms": "20.0.0-next.9",
     "@angular/localize": "20.0.0-next.9",
     "@angular/material": "20.0.0-next.10",
-    "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#873988f86d59c491504c0994687339362d4a88c8",
+    "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#1125d8dbec5e787d9579e5b218b60a3be64c50fa",
     "@angular/platform-browser": "20.0.0-next.9",
     "@angular/platform-server": "20.0.0-next.9",
     "@angular/router": "20.0.0-next.9",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 2c7682d3910f..2f3b16f1303e 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -42,8 +42,8 @@ importers:
         specifier: 20.0.0-next.10
         version: 20.0.0-next.10(xotmywbppgelv3sapeuqfwdbqe)
       '@angular/ng-dev':
-        specifier: https://github.com/angular/dev-infra-private-ng-dev-builds.git#873988f86d59c491504c0994687339362d4a88c8
-        version: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/873988f86d59c491504c0994687339362d4a88c8(encoding@0.1.13)
+        specifier: https://github.com/angular/dev-infra-private-ng-dev-builds.git#1125d8dbec5e787d9579e5b218b60a3be64c50fa
+        version: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/1125d8dbec5e787d9579e5b218b60a3be64c50fa(encoding@0.1.13)
       '@angular/platform-browser':
         specifier: 20.0.0-next.9
         version: 20.0.0-next.9(@angular/animations@20.0.0-next.9(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))
@@ -975,9 +975,9 @@ packages:
       '@angular/platform-browser': ^20.0.0-0 || ^20.1.0-0 || ^20.2.0-0 || ^20.3.0-0 || ^21.0.0-0
       rxjs: ^6.5.3 || ^7.4.0
 
-  '@angular/ng-dev@https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/873988f86d59c491504c0994687339362d4a88c8':
-    resolution: {tarball: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/873988f86d59c491504c0994687339362d4a88c8}
-    version: 0.0.0-b3df5e35ff652de75d22d1f68f3887696f3b49a2
+  '@angular/ng-dev@https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/1125d8dbec5e787d9579e5b218b60a3be64c50fa':
+    resolution: {tarball: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/1125d8dbec5e787d9579e5b218b60a3be64c50fa}
+    version: 0.0.0-2c7bab7971084f3f1f6f72735099a9591ee5ebcb
     hasBin: true
 
   '@angular/platform-browser@20.0.0-next.9':
@@ -8355,7 +8355,7 @@ snapshots:
       rxjs: 7.8.2
       tslib: 2.8.1
 
-  '@angular/ng-dev@https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/873988f86d59c491504c0994687339362d4a88c8(encoding@0.1.13)':
+  '@angular/ng-dev@https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/1125d8dbec5e787d9579e5b218b60a3be64c50fa(encoding@0.1.13)':
     dependencies:
       '@google-cloud/spanner': 7.21.0(encoding@0.1.13)(supports-color@10.0.0)
       '@octokit/rest': 21.1.1
diff --git a/tests/legacy-cli/e2e/ng-snapshot/package.json b/tests/legacy-cli/e2e/ng-snapshot/package.json
index ce294bdfbc9e..b66330c9835d 100644
--- a/tests/legacy-cli/e2e/ng-snapshot/package.json
+++ b/tests/legacy-cli/e2e/ng-snapshot/package.json
@@ -2,21 +2,21 @@
   "description": "snapshot versions of Angular for e2e testing",
   "private": true,
   "dependencies": {
-    "@angular/animations": "github:angular/animations-builds#f07ca93fee0e94fcf4e8f6c7d1ebd1383993f18a",
-    "@angular/cdk": "github:angular/cdk-builds#8defccd7d5561062aaf230f89e79453e88e7e483",
-    "@angular/common": "github:angular/common-builds#44e0f788200cca797c2f7b07f20ead8f05dbc60c",
-    "@angular/compiler": "github:angular/compiler-builds#fff8c6e3178184c1b0fcb22a976d76b9a3aa90bd",
-    "@angular/compiler-cli": "github:angular/compiler-cli-builds#40828b0210af450b5ce54a1e01d03138f4c74157",
-    "@angular/core": "github:angular/core-builds#91ca48d98e521ad95c09e37ef9858d48c1b4da81",
-    "@angular/forms": "github:angular/forms-builds#9ee0d37d2c25baa10801942dcfa813ba1edeb193",
-    "@angular/language-service": "github:angular/language-service-builds#8014a86465157bb7272111d88348390c6dbb9cc3",
-    "@angular/localize": "github:angular/localize-builds#4db181e10db88d8051f00c76eb30dfd2b37e1e18",
-    "@angular/material": "github:angular/material-builds#5a2b3507bb272515b63b0bfe3ba0a7c400fefea5",
-    "@angular/material-moment-adapter": "github:angular/material-moment-adapter-builds#f1823c404904324c374ffc59e676729fbae8ec67",
-    "@angular/platform-browser": "github:angular/platform-browser-builds#39d142b597203db5cd3da03afc09e106e58be388",
-    "@angular/platform-browser-dynamic": "github:angular/platform-browser-dynamic-builds#98a5f272e2663abea3701f5ae504e971d09099e8",
-    "@angular/platform-server": "github:angular/platform-server-builds#3dfec326325068ccee0528082cb8e44ebf7a471d",
-    "@angular/router": "github:angular/router-builds#a017829831963890ca3d7cbb815c272b504d161c",
-    "@angular/service-worker": "github:angular/service-worker-builds#a18823d2181048f3aec3758862f683647d45e204"
+    "@angular/animations": "github:angular/animations-builds#d45d183a7862ed31228028a557cf28f2a919ad31",
+    "@angular/cdk": "github:angular/cdk-builds#1cb6c8ce50ec6c85ccfd865d961857a38716422d",
+    "@angular/common": "github:angular/common-builds#3a864e7851a8db81bc308149f7ebcb12f8a2f3de",
+    "@angular/compiler": "github:angular/compiler-builds#eba2a6d9cedb4e2b4324b0f7aa17b657120fbbaa",
+    "@angular/compiler-cli": "github:angular/compiler-cli-builds#97435f625b722fc5f05d56a5e1fa1b685a21c2f6",
+    "@angular/core": "github:angular/core-builds#5564ed93bb02afb234a47101a461401e1c86ba0e",
+    "@angular/forms": "github:angular/forms-builds#c4b3b1e47acfaf5866fbbd8429876f6347b37bd4",
+    "@angular/language-service": "github:angular/language-service-builds#8353535cbda057f52774653f380cd7122c94cc15",
+    "@angular/localize": "github:angular/localize-builds#9d7f4a23d1fb0c277085632d46d88b96c52f4396",
+    "@angular/material": "github:angular/material-builds#ef46fceae4f1b9cae2d3a8b45f652ffaccbf749e",
+    "@angular/material-moment-adapter": "github:angular/material-moment-adapter-builds#1db1d24bdbca33e4017e9b16b0a914f3eb2e2171",
+    "@angular/platform-browser": "github:angular/platform-browser-builds#0eebb01962f236bac9e55a521da424a1f2ce68de",
+    "@angular/platform-browser-dynamic": "github:angular/platform-browser-dynamic-builds#43610d0e7a39fcbb05f250b8f8f11df639b1ebdb",
+    "@angular/platform-server": "github:angular/platform-server-builds#ccdb4fb12c9a77a63f7dc235897608dd77474dec",
+    "@angular/router": "github:angular/router-builds#f7eb4edff552fe724c24740789dc0d88e7db020a",
+    "@angular/service-worker": "github:angular/service-worker-builds#d9b9d72a93b4f7c51ec1e8bf181bf6ceb2d37a4a"
   }
 }

From 5afac2891a691ea56a8d9b8aa1b49141a3276738 Mon Sep 17 00:00:00 2001
From: Jan Martin <jan.krems@gmail.com>
Date: Wed, 7 May 2025 07:55:07 -0700
Subject: [PATCH 028/138] refactor(@angular-devkit/core): use more precise
 iterator typings

Since this class isn't a "real" `Set`, we can't promise that our
iterators are true `SetIterator<T>`s.

(cherry picked from commit 16ae68a87ad64e1796be487cd6e52d7f87ea43aa)
---
 goldens/public-api/angular_devkit/core/index.api.md         | 6 +++---
 .../angular_devkit/core/src/utils/partially-ordered-set.ts  | 6 +++---
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/goldens/public-api/angular_devkit/core/index.api.md b/goldens/public-api/angular_devkit/core/index.api.md
index 61747760e753..748faf2bbeb4 100644
--- a/goldens/public-api/angular_devkit/core/index.api.md
+++ b/goldens/public-api/angular_devkit/core/index.api.md
@@ -567,15 +567,15 @@ export class PartiallyOrderedSet<T> {
     clear(): void;
     // (undocumented)
     delete(item: T): boolean;
-    entries(): SetIterator<[T, T]>;
+    entries(): IterableIterator<[T, T]>;
     // (undocumented)
     forEach(callbackfn: (value: T, value2: T, set: PartiallyOrderedSet<T>) => void, thisArg?: any): void;
     // (undocumented)
     has(item: T): boolean;
-    keys(): SetIterator<T>;
+    keys(): IterableIterator<T>;
     // (undocumented)
     get size(): number;
-    values(): SetIterator<T>;
+    values(): IterableIterator<T>;
 }
 
 // @public
diff --git a/packages/angular_devkit/core/src/utils/partially-ordered-set.ts b/packages/angular_devkit/core/src/utils/partially-ordered-set.ts
index 9aa37f467ba6..297210c6ff89 100644
--- a/packages/angular_devkit/core/src/utils/partially-ordered-set.ts
+++ b/packages/angular_devkit/core/src/utils/partially-ordered-set.ts
@@ -51,7 +51,7 @@ export class PartiallyOrderedSet<T> {
   /**
    * Returns an iterable of [v,v] pairs for every value `v` in the set.
    */
-  *entries(): SetIterator<[T, T]> {
+  *entries(): IterableIterator<[T, T]> {
     for (const item of this) {
       yield [item, item];
     }
@@ -60,14 +60,14 @@ export class PartiallyOrderedSet<T> {
   /**
    * Despite its name, returns an iterable of the values in the set,
    */
-  keys(): SetIterator<T> {
+  keys(): IterableIterator<T> {
     return this.values();
   }
 
   /**
    * Returns an iterable of values in the set.
    */
-  values(): SetIterator<T> {
+  values(): IterableIterator<T> {
     return this[Symbol.iterator]();
   }
 

From a3e35ee2306a4ae82706b9fa31bac39f3caa826d Mon Sep 17 00:00:00 2001
From: Angular Robot <angular-robot@google.com>
Date: Wed, 7 May 2025 16:05:03 +0000
Subject: [PATCH 029/138] build: lock file maintenance

(cherry picked from commit 1469f133a94c06976fcdcc2c4ac7de080f76e10c)
---
 pnpm-lock.yaml | 520 +++++++++++++++++++++----------------------------
 1 file changed, 220 insertions(+), 300 deletions(-)

diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 2f3b16f1303e..2bb2fefd3fbd 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -106,7 +106,7 @@ importers:
         version: 4.1.1
       '@types/jasmine':
         specifier: ~5.1.0
-        version: 5.1.7
+        version: 5.1.8
       '@types/jasmine-reporters':
         specifier: ^2
         version: 2.5.3
@@ -124,7 +124,7 @@ importers:
         version: 4.17.16
       '@types/node':
         specifier: ^20.17.19
-        version: 20.17.32
+        version: 20.17.44
       '@types/npm-package-arg':
         specifier: ^6.1.0
         version: 6.1.4
@@ -277,7 +277,7 @@ importers:
         version: 6.2.1(rollup@4.40.2)(typescript@5.8.3)
       rollup-plugin-sourcemaps2:
         specifier: 0.5.1
-        version: 0.5.1(@types/node@20.17.32)(rollup@4.40.2)
+        version: 0.5.1(@types/node@20.17.44)(rollup@4.40.2)
       semver:
         specifier: 7.7.1
         version: 7.7.1
@@ -292,7 +292,7 @@ importers:
         version: 7.4.3
       ts-node:
         specifier: ^10.9.1
-        version: 10.9.2(@types/node@20.17.32)(typescript@5.8.3)
+        version: 10.9.2(@types/node@20.17.44)(typescript@5.8.3)
       tslib:
         specifier: 2.8.1
         version: 2.8.1
@@ -342,7 +342,7 @@ importers:
         version: 7.8.2
       vitest:
         specifier: 3.1.3
-        version: 3.1.3(@types/node@20.17.32)(jiti@1.21.7)(jsdom@26.1.0)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1)
+        version: 3.1.3(@types/node@20.17.44)(jiti@1.21.7)(jsdom@26.1.0)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1)
 
   packages/angular/build:
     dependencies:
@@ -363,10 +363,10 @@ importers:
         version: 7.24.7
       '@inquirer/confirm':
         specifier: 5.1.9
-        version: 5.1.9(@types/node@20.17.32)
+        version: 5.1.9(@types/node@20.17.44)
       '@vitejs/plugin-basic-ssl':
         specifier: 2.0.0
-        version: 2.0.0(vite@6.3.5(@types/node@20.17.32)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1))
+        version: 2.0.0(vite@6.3.5(@types/node@20.17.44)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1))
       beasties:
         specifier: 0.3.3
         version: 0.3.3
@@ -420,7 +420,7 @@ importers:
         version: 0.2.13
       vite:
         specifier: 6.3.5
-        version: 6.3.5(@types/node@20.17.32)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1)
+        version: 6.3.5(@types/node@20.17.44)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1)
       watchpack:
         specifier: 2.4.2
         version: 2.4.2
@@ -452,7 +452,7 @@ importers:
         version: 7.8.2
       vitest:
         specifier: 3.1.3
-        version: 3.1.3(@types/node@20.17.32)(jiti@1.21.7)(jsdom@26.1.0)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1)
+        version: 3.1.3(@types/node@20.17.44)(jiti@1.21.7)(jsdom@26.1.0)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1)
 
   packages/angular/cli:
     dependencies:
@@ -467,10 +467,10 @@ importers:
         version: link:../../angular_devkit/schematics
       '@inquirer/prompts':
         specifier: 7.5.0
-        version: 7.5.0(@types/node@20.17.32)
+        version: 7.5.0(@types/node@20.17.44)
       '@listr2/prompt-adapter-inquirer':
         specifier: 2.0.22
-        version: 2.0.22(@inquirer/prompts@7.5.0(@types/node@20.17.32))
+        version: 2.0.22(@inquirer/prompts@7.5.0(@types/node@20.17.44))
       '@schematics/angular':
         specifier: workspace:0.0.0-PLACEHOLDER
         version: link:../../schematics/angular
@@ -631,7 +631,7 @@ importers:
         version: link:../../ngtools/webpack
       '@vitejs/plugin-basic-ssl':
         specifier: 2.0.0
-        version: 2.0.0(vite@6.3.5(@types/node@20.17.32)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1))
+        version: 2.0.0(vite@6.3.5(@types/node@20.17.44)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1))
       ansi-colors:
         specifier: 4.1.3
         version: 4.1.3
@@ -842,7 +842,7 @@ importers:
         version: link:../schematics
       '@inquirer/prompts':
         specifier: 7.5.0
-        version: 7.5.0(@types/node@20.17.32)
+        version: 7.5.0(@types/node@20.17.44)
       ansi-colors:
         specifier: 4.1.3
         version: 4.1.3
@@ -1025,10 +1025,6 @@ packages:
     resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/compat-data@7.27.1':
-    resolution: {integrity: sha512-Q+E+rd/yBzNQhXkG+zQnF58e4zoZfBedaxwzPmicKsiK3nt8iJYrSrDbjwFFDGC4f+rPafqRaPH6TsDoSvMf7A==}
-    engines: {node: '>=6.9.0'}
-
   '@babel/compat-data@7.27.2':
     resolution: {integrity: sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ==}
     engines: {node: '>=6.9.0'}
@@ -1049,10 +1045,6 @@ packages:
     resolution: {integrity: sha512-WnuuDILl9oOBbKnb4L+DyODx7iC47XfzmNCpTttFsSp6hTG7XZxu60+4IO+2/hPfcGOoKbFiwoI/+zwARbNQow==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/helper-compilation-targets@7.27.1':
-    resolution: {integrity: sha512-2YaDd/Rd9E598B5+WIc8wJPmWETiiJXFYVE60oX8FDohv7rAUU3CQj+A1MgeEmcsk2+dQuEjIe/GDvig0SqL4g==}
-    engines: {node: '>=6.9.0'}
-
   '@babel/helper-compilation-targets@7.27.2':
     resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==}
     engines: {node: '>=6.9.0'}
@@ -1136,8 +1128,8 @@ packages:
     resolution: {integrity: sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/parser@7.27.1':
-    resolution: {integrity: sha512-I0dZ3ZpCrJ1c04OqlNsQcKiZlsrXf/kkE4FXzID9rIOYICsAbA8mMDzhW/luRNAHdCNt7os/u8wenklZDlUVUQ==}
+  '@babel/parser@7.27.2':
+    resolution: {integrity: sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==}
     engines: {node: '>=6.0.0'}
     hasBin: true
 
@@ -1516,8 +1508,8 @@ packages:
     resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/template@7.27.1':
-    resolution: {integrity: sha512-Fyo3ghWMqkHHpHQCoBs2VnYjR4iWFFjguTDEqA5WgZDOrFesVjMhMM2FSqTKSoUSDO1VQtavj8NFpdRBEvJTtg==}
+  '@babel/template@7.27.2':
+    resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==}
     engines: {node: '>=6.9.0'}
 
   '@babel/traverse@7.27.1':
@@ -1828,8 +1820,8 @@ packages:
     resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==}
     engines: {node: '>=18.18'}
 
-  '@humanwhocodes/retry@0.4.2':
-    resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==}
+  '@humanwhocodes/retry@0.4.3':
+    resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==}
     engines: {node: '>=18.18'}
 
   '@inquirer/checkbox@4.1.5':
@@ -2058,8 +2050,8 @@ packages:
     cpu: [x64]
     os: [win32]
 
-  '@mdn/browser-compat-data@6.0.11':
-    resolution: {integrity: sha512-vcLCW2dvKfHGV4t/lkocstKvu15hfaMaAEaGTzL4wZ6ZWmI2aHbrFcO/LkK34jkFPjKXm3GHLm5h35u5WD4d9w==}
+  '@mdn/browser-compat-data@6.0.12':
+    resolution: {integrity: sha512-lQ6p212jKeJBG+L7UYRKchTCcnQbp6yOj5swKxGLjvuW4SmbgWgd/WyA1Dxq1GGT86C7jVTEaKry36LmsBp8SQ==}
 
   '@modelcontextprotocol/sdk@1.11.0':
     resolution: {integrity: sha512-k/1pb70eD638anoi0e8wUGAlbMJXyvdV4p62Ko+EZ7eBe1xMx8Uhak1R5DgfoofsK5IBBnRwsYGTaLZl+6/+RQ==}
@@ -2236,8 +2228,8 @@ packages:
     resolution: {integrity: sha512-/bNJhjc+o6qL+Dwz/bqfTQClkEO5nTQ1ZEcdCkAQjhkZMHIh22LPG7fNh1enJP1NKWDqYiiABnjFCY7E0zHYtQ==}
     engines: {node: ^18.17.0 || >=20.5.0}
 
-  '@npmcli/redact@3.2.1':
-    resolution: {integrity: sha512-VW+1SW5CkP1aSegFQx7/AawdzM6b4UP6R3QET192ON4IAP6iK++IG6Ztg+bkoeGN8lh/prOzT+ZkNgWQrAXLNQ==}
+  '@npmcli/redact@3.2.2':
+    resolution: {integrity: sha512-7VmYAmk4csGv08QzrDKScdzn11jHPFGyqJW39FyPgPuAp3zIaUmuCo1yxw9aGs+NEJuTGQ9Gwqpt93vtJubucg==}
     engines: {node: ^18.17.0 || >=20.5.0}
 
   '@npmcli/run-script@9.1.0':
@@ -2601,8 +2593,8 @@ packages:
     cpu: [x64]
     os: [win32]
 
-  '@rollup/wasm-node@4.40.1':
-    resolution: {integrity: sha512-3nXUKfAq1nD/vgQi7ncLNyn8jx1PAsN6njSS9baCpI9JHk92Y/JOWZib7HvLJ5BBZ4MC5NSeqkpUKnmceXyzXA==}
+  '@rollup/wasm-node@4.40.2':
+    resolution: {integrity: sha512-rl60ew3oh38IrtETrAf0A0qTByOsHSi7Sx1BZH4+vrIzL/DqxFx+FgTUFVViL3ZQqs95gIOm9mZQ1fUOopnkmA==}
     engines: {node: '>=18.0.0', npm: '>=8.0.0'}
     hasBin: true
 
@@ -2783,8 +2775,8 @@ packages:
   '@types/jasmine-reporters@2.5.3':
     resolution: {integrity: sha512-8aojAUdgdiD9VQbllBJb/9gny3lOjz9T5gyMcbYlKe6npwGVsarbr8v2JYSFJSZSuFYXcPVzFG2lLX3ib0j/DA==}
 
-  '@types/jasmine@5.1.7':
-    resolution: {integrity: sha512-DVOfk9FaClQfNFpSfaML15jjB5cjffDMvjtph525sroR5BEAW2uKnTOYUTqTFuZFjNvH0T5XMIydvIctnUKufw==}
+  '@types/jasmine@5.1.8':
+    resolution: {integrity: sha512-u7/CnvRdh6AaaIzYjCgUuVbREFgulhX05Qtf6ZtW+aOcjCKKVvKgpkPYJBFTZSHtFBYimzU4zP0V2vrEsq9Wcg==}
 
   '@types/json-schema@7.0.15':
     resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
@@ -2831,14 +2823,14 @@ packages:
   '@types/node-forge@1.3.11':
     resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==}
 
-  '@types/node@20.17.32':
-    resolution: {integrity: sha512-zeMXFn8zQ+UkjK4ws0RiOC9EWByyW1CcVmLe+2rQocXRsGEDxUCwPEIVgpsGcLHS/P8JkT0oa3839BRABS0oPw==}
+  '@types/node@20.17.44':
+    resolution: {integrity: sha512-50sE4Ibb4BgUMxHrcJQSAU0Fu7fLcTdwcXwRzEF7wnVMWvImFLg2Rxc7SW0vpvaJm4wvhoWEZaQiPpBpocZiUA==}
 
   '@types/npm-package-arg@6.1.4':
     resolution: {integrity: sha512-vDgdbMy2QXHnAruzlv68pUtXCjmqUk3WrBAsRboRovsOmxbfn/WiYCjmecyKjGztnMps5dWp4Uq2prp+Ilo17Q==}
 
-  '@types/npm-registry-fetch@8.0.7':
-    resolution: {integrity: sha512-db9iBh7kDDg4lRT4k4XZ6IiecTEgFCID4qk+VDVPbtzU855q3KZLCn08ATr4H27ntRJVhulQ7GWjl24H42x96w==}
+  '@types/npm-registry-fetch@8.0.8':
+    resolution: {integrity: sha512-VL/chssZawBkaQ5gFD5njblJce/ny9OICBlWAG9X6/m/ypPNJMWYiM22SY2mhLIGoknd4AyEJyi+FGyrBnsr+A==}
 
   '@types/npmlog@7.0.0':
     resolution: {integrity: sha512-hJWbrKFvxKyWwSUXjZMYTINsSOY6IclhvGOZ97M8ac2tmR9hMwmTnYaMdpGhvju9ctWLTPhCS+eLfQNluiEjQQ==}
@@ -2967,10 +2959,6 @@ packages:
       eslint: ^8.57.0 || ^9.0.0
       typescript: 5.8.3
 
-  '@typescript-eslint/scope-manager@8.31.1':
-    resolution: {integrity: sha512-BMNLOElPxrtNQMIsFHE+3P0Yf1z0dJqV9zLdDxN/xLlWMlXK/ApEsVEKzpizg9oal8bAT5Sc7+ocal7AC1HCVw==}
-    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
-
   '@typescript-eslint/scope-manager@8.32.0':
     resolution: {integrity: sha512-jc/4IxGNedXkmG4mx4nJTILb6TMjL66D41vyeaPWvDUmeYQzF3lKtN15WsAeTr65ce4mPxwopPSo1yUUAWw0hQ==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -2982,33 +2970,16 @@ packages:
       eslint: ^8.57.0 || ^9.0.0
       typescript: 5.8.3
 
-  '@typescript-eslint/types@8.31.1':
-    resolution: {integrity: sha512-SfepaEFUDQYRoA70DD9GtytljBePSj17qPxFHA/h3eg6lPTqGJ5mWOtbXCk1YrVU1cTJRd14nhaXWFu0l2troQ==}
-    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
-
   '@typescript-eslint/types@8.32.0':
     resolution: {integrity: sha512-O5Id6tGadAZEMThM6L9HmVf5hQUXNSxLVKeGJYWNhhVseps/0LddMkp7//VDkzwJ69lPL0UmZdcZwggj9akJaA==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
-  '@typescript-eslint/typescript-estree@8.31.1':
-    resolution: {integrity: sha512-kaA0ueLe2v7KunYOyWYtlf/QhhZb7+qh4Yw6Ni5kgukMIG+iP773tjgBiLWIXYumWCwEq3nLW+TUywEp8uEeag==}
-    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
-    peerDependencies:
-      typescript: 5.8.3
-
   '@typescript-eslint/typescript-estree@8.32.0':
     resolution: {integrity: sha512-pU9VD7anSCOIoBFnhTGfOzlVFQIA1XXiQpH/CezqOBaDppRwTglJzCC6fUQGpfwey4T183NKhF1/mfatYmjRqQ==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     peerDependencies:
       typescript: 5.8.3
 
-  '@typescript-eslint/utils@8.31.1':
-    resolution: {integrity: sha512-2DSI4SNfF5T4oRveQ4nUrSjUqjMND0nLq9rEkz0gfGr3tg0S5KB6DhwR+WZPCjzkZl3cH+4x2ce3EsL50FubjQ==}
-    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
-    peerDependencies:
-      eslint: ^8.57.0 || ^9.0.0
-      typescript: 5.8.3
-
   '@typescript-eslint/utils@8.32.0':
     resolution: {integrity: sha512-8S9hXau6nQ/sYVtC3D6ISIDoJzS1NsCK+gluVhLN2YkBPX+/1wkwyUiDKnxRh15579WoOIyVWnoyIf3yGI9REw==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -3016,10 +2987,6 @@ packages:
       eslint: ^8.57.0 || ^9.0.0
       typescript: 5.8.3
 
-  '@typescript-eslint/visitor-keys@8.31.1':
-    resolution: {integrity: sha512-I+/rgqOVBn6f0o7NDTmAPWWC6NuqhV174lfYvAm9fUaWeiefLdux9/YI3/nLugEn9L8fcSi0XmpKi/r5u0nmpw==}
-    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
-
   '@typescript-eslint/visitor-keys@8.32.0':
     resolution: {integrity: sha512-1rYQTCLFFzOI5Nl0c8LUpJT8HxpwVRn9E4CkMsYfuN6ctmQqExjSTzzSk0Tz2apmXy7WU6/6fyaZVVA/thPN+w==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -3773,8 +3740,8 @@ packages:
     resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==}
     engines: {node: '>=6.0'}
 
-  chromium-bidi@4.1.1:
-    resolution: {integrity: sha512-biR7t4vF3YluE6RlMSk9IWk+b9U+WWyzHp+N2pL9vRTk+UXHYRTVp7jTK58ZNzMLBgoLMHY4QyJMbeuw3eKxqg==}
+  chromium-bidi@5.1.0:
+    resolution: {integrity: sha512-9MSRhWRVoRPDG0TgzkHrshFSJJNZzfY5UFqUMuksg7zL1yoZIZ3jLB0YAgHclbiAxPI86pBnwDX1tbzoiV8aFw==}
     peerDependencies:
       devtools-protocol: '*'
 
@@ -4283,8 +4250,8 @@ packages:
   ee-first@1.1.1:
     resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
 
-  electron-to-chromium@1.5.149:
-    resolution: {integrity: sha512-UyiO82eb9dVOx8YO3ajDf9jz2kKyt98DEITRdeLPstOEuTlLzDA4Gyq5K9he71TQziU5jUVu2OAu5N48HmQiyQ==}
+  electron-to-chromium@1.5.150:
+    resolution: {integrity: sha512-rOOkP2ZUMx1yL4fCxXQKDHQ8ZXwisb2OycOQVKHgvB3ZI4CvehOd4y2tfnnLDieJ3Zs1RL1Dlp3cMkyIn7nnXA==}
 
   emoji-regex@10.4.0:
     resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==}
@@ -5134,8 +5101,8 @@ packages:
     resolution: {integrity: sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==}
     engines: {node: '>=0.10.0'}
 
-  immutable@5.1.1:
-    resolution: {integrity: sha512-3jatXi9ObIsPGr3N5hGw/vWWcTkq6hUYhpQz4k0wLC+owqWi/LiugIw9x0EdNZ2yGedKN/HzePiBvaJRXa0Ujg==}
+  immutable@5.1.2:
+    resolution: {integrity: sha512-qHKXW1q6liAk1Oys6umoaZbDRqjcjgSrbnrifHsfsttza7zcvRAsL7mMV6xWcyhwQy7Xj5v4hhbr6b+iDYwlmQ==}
 
   import-fresh@3.3.1:
     resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==}
@@ -5617,11 +5584,11 @@ packages:
   jszip@3.10.1:
     resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==}
 
-  jwa@1.4.1:
-    resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==}
+  jwa@1.4.2:
+    resolution: {integrity: sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==}
 
-  jwa@2.0.0:
-    resolution: {integrity: sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==}
+  jwa@2.0.1:
+    resolution: {integrity: sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==}
 
   jws@3.2.2:
     resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==}
@@ -6712,8 +6679,8 @@ packages:
     resolution: {integrity: sha512-SAzp/O4Yh02jGdRc+uIrGoe87dkN/XtwxfZ4ZyafJHymd79ozp5VG5nyZ7ygqPM5+cpLDjjGnYFUkngonyDPOQ==}
     engines: {node: '>=14.0.0'}
 
-  protobufjs@7.5.0:
-    resolution: {integrity: sha512-Z2E/kOY1QjoMlCytmexzYfDm/w5fKAiRwpSzGtdnXW1zC88Z2yXazHHrOtwCzn+7wSxyE8PYM4rvVcMphF9sOA==}
+  protobufjs@7.4.0:
+    resolution: {integrity: sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==}
     engines: {node: '>=12.0.0'}
 
   protractor@7.0.0:
@@ -6759,8 +6726,8 @@ packages:
     resolution: {integrity: sha512-MRtTAZfQTluz3U2oU/X2VqVWPcR1+94nbA2V6ZrSZRVEwLqZ8eclZ551qGFQD/vD2PYqHJwWOW/fpC721uznVw==}
     engines: {node: '>=14.1.0'}
 
-  puppeteer-core@24.8.0:
-    resolution: {integrity: sha512-tDf2YKIo5kM5r0vOzT52+PTgN0bBZOA4OFgQaqYyfarrcXLLJ92wi/lSMe44hd+F+gk0gw9QsAzyRW8v6ra93w==}
+  puppeteer-core@24.8.1:
+    resolution: {integrity: sha512-UP/VIxVk/Akrgql3a55ZAIuAIx7+yQevz6qEXFUtSTIynEcgsCJ6tlRdi7uKAAlovmNQG4iNMzq9f8WxZLnGGg==}
     engines: {node: '>=18'}
 
   puppeteer@18.2.1:
@@ -8418,8 +8385,6 @@ snapshots:
       js-tokens: 4.0.0
       picocolors: 1.1.1
 
-  '@babel/compat-data@7.27.1': {}
-
   '@babel/compat-data@7.27.2': {}
 
   '@babel/core@7.26.10':
@@ -8427,11 +8392,11 @@ snapshots:
       '@ampproject/remapping': 2.3.0
       '@babel/code-frame': 7.27.1
       '@babel/generator': 7.27.1
-      '@babel/helper-compilation-targets': 7.27.1
+      '@babel/helper-compilation-targets': 7.27.2
       '@babel/helper-module-transforms': 7.27.1(@babel/core@7.26.10)
       '@babel/helpers': 7.27.1
-      '@babel/parser': 7.27.1
-      '@babel/template': 7.27.1
+      '@babel/parser': 7.27.2
+      '@babel/template': 7.27.2
       '@babel/traverse': 7.27.1
       '@babel/types': 7.27.1
       convert-source-map: 2.0.0
@@ -8447,11 +8412,11 @@ snapshots:
       '@ampproject/remapping': 2.3.0
       '@babel/code-frame': 7.27.1
       '@babel/generator': 7.27.1
-      '@babel/helper-compilation-targets': 7.27.1
+      '@babel/helper-compilation-targets': 7.27.2
       '@babel/helper-module-transforms': 7.27.1(@babel/core@7.27.1)
       '@babel/helpers': 7.27.1
-      '@babel/parser': 7.27.1
-      '@babel/template': 7.27.1
+      '@babel/parser': 7.27.2
+      '@babel/template': 7.27.2
       '@babel/traverse': 7.27.1
       '@babel/types': 7.27.1
       convert-source-map: 2.0.0
@@ -8464,7 +8429,7 @@ snapshots:
 
   '@babel/generator@7.27.1':
     dependencies:
-      '@babel/parser': 7.27.1
+      '@babel/parser': 7.27.2
       '@babel/types': 7.27.1
       '@jridgewell/gen-mapping': 0.3.8
       '@jridgewell/trace-mapping': 0.3.25
@@ -8474,14 +8439,6 @@ snapshots:
     dependencies:
       '@babel/types': 7.27.1
 
-  '@babel/helper-compilation-targets@7.27.1':
-    dependencies:
-      '@babel/compat-data': 7.27.1
-      '@babel/helper-validator-option': 7.27.1
-      browserslist: 4.24.5
-      lru-cache: 5.1.1
-      semver: 6.3.1
-
   '@babel/helper-compilation-targets@7.27.2':
     dependencies:
       '@babel/compat-data': 7.27.2
@@ -8513,7 +8470,7 @@ snapshots:
   '@babel/helper-define-polyfill-provider@0.6.4(@babel/core@7.27.1)':
     dependencies:
       '@babel/core': 7.27.1
-      '@babel/helper-compilation-targets': 7.27.1
+      '@babel/helper-compilation-targets': 7.27.2
       '@babel/helper-plugin-utils': 7.27.1
       debug: 4.4.0(supports-color@10.0.0)
       lodash.debounce: 4.0.8
@@ -8596,7 +8553,7 @@ snapshots:
 
   '@babel/helper-wrap-function@7.27.1':
     dependencies:
-      '@babel/template': 7.27.1
+      '@babel/template': 7.27.2
       '@babel/traverse': 7.27.1
       '@babel/types': 7.27.1
     transitivePeerDependencies:
@@ -8604,10 +8561,10 @@ snapshots:
 
   '@babel/helpers@7.27.1':
     dependencies:
-      '@babel/template': 7.27.1
+      '@babel/template': 7.27.2
       '@babel/types': 7.27.1
 
-  '@babel/parser@7.27.1':
+  '@babel/parser@7.27.2':
     dependencies:
       '@babel/types': 7.27.1
 
@@ -8731,7 +8688,7 @@ snapshots:
     dependencies:
       '@babel/core': 7.27.1
       '@babel/helper-plugin-utils': 7.27.1
-      '@babel/template': 7.27.1
+      '@babel/template': 7.27.2
 
   '@babel/plugin-transform-destructuring@7.27.1(@babel/core@7.27.1)':
     dependencies:
@@ -9081,18 +9038,18 @@ snapshots:
 
   '@babel/runtime@7.27.1': {}
 
-  '@babel/template@7.27.1':
+  '@babel/template@7.27.2':
     dependencies:
       '@babel/code-frame': 7.27.1
-      '@babel/parser': 7.27.1
+      '@babel/parser': 7.27.2
       '@babel/types': 7.27.1
 
   '@babel/traverse@7.27.1':
     dependencies:
       '@babel/code-frame': 7.27.1
       '@babel/generator': 7.27.1
-      '@babel/parser': 7.27.1
-      '@babel/template': 7.27.1
+      '@babel/parser': 7.27.2
+      '@babel/template': 7.27.2
       '@babel/types': 7.27.1
       debug: 4.4.0(supports-color@10.0.0)
       globals: 11.12.0
@@ -9324,12 +9281,12 @@ snapshots:
       extend: 3.0.2
       google-auth-library: 9.15.1(encoding@0.1.13)(supports-color@10.0.0)
       google-gax: 4.4.1(encoding@0.1.13)(supports-color@10.0.0)
-      grpc-gcp: 1.0.1(protobufjs@7.5.0)
+      grpc-gcp: 1.0.1(protobufjs@7.4.0)
       is: 3.3.0
       lodash.snakecase: 4.1.1
       merge-stream: 2.0.0
       p-queue: 6.6.2
-      protobufjs: 7.5.0
+      protobufjs: 7.4.0
       retry-request: 7.0.2(encoding@0.1.13)(supports-color@10.0.0)
       split-array-stream: 2.0.0
       stack-trace: 0.0.10
@@ -9349,7 +9306,7 @@ snapshots:
     dependencies:
       lodash.camelcase: 4.3.0
       long: 5.3.2
-      protobufjs: 7.5.0
+      protobufjs: 7.4.0
       yargs: 17.7.2
 
   '@hapi/bourne@3.0.0': {}
@@ -9365,29 +9322,29 @@ snapshots:
 
   '@humanwhocodes/retry@0.3.1': {}
 
-  '@humanwhocodes/retry@0.4.2': {}
+  '@humanwhocodes/retry@0.4.3': {}
 
-  '@inquirer/checkbox@4.1.5(@types/node@20.17.32)':
+  '@inquirer/checkbox@4.1.5(@types/node@20.17.44)':
     dependencies:
-      '@inquirer/core': 10.1.10(@types/node@20.17.32)
+      '@inquirer/core': 10.1.10(@types/node@20.17.44)
       '@inquirer/figures': 1.0.11
-      '@inquirer/type': 3.0.6(@types/node@20.17.32)
+      '@inquirer/type': 3.0.6(@types/node@20.17.44)
       ansi-escapes: 4.3.2
       yoctocolors-cjs: 2.1.2
     optionalDependencies:
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
 
-  '@inquirer/confirm@5.1.9(@types/node@20.17.32)':
+  '@inquirer/confirm@5.1.9(@types/node@20.17.44)':
     dependencies:
-      '@inquirer/core': 10.1.10(@types/node@20.17.32)
-      '@inquirer/type': 3.0.6(@types/node@20.17.32)
+      '@inquirer/core': 10.1.10(@types/node@20.17.44)
+      '@inquirer/type': 3.0.6(@types/node@20.17.44)
     optionalDependencies:
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
 
-  '@inquirer/core@10.1.10(@types/node@20.17.32)':
+  '@inquirer/core@10.1.10(@types/node@20.17.44)':
     dependencies:
       '@inquirer/figures': 1.0.11
-      '@inquirer/type': 3.0.6(@types/node@20.17.32)
+      '@inquirer/type': 3.0.6(@types/node@20.17.44)
       ansi-escapes: 4.3.2
       cli-width: 4.1.0
       mute-stream: 2.0.0
@@ -9395,97 +9352,97 @@ snapshots:
       wrap-ansi: 6.2.0
       yoctocolors-cjs: 2.1.2
     optionalDependencies:
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
 
-  '@inquirer/editor@4.2.10(@types/node@20.17.32)':
+  '@inquirer/editor@4.2.10(@types/node@20.17.44)':
     dependencies:
-      '@inquirer/core': 10.1.10(@types/node@20.17.32)
-      '@inquirer/type': 3.0.6(@types/node@20.17.32)
+      '@inquirer/core': 10.1.10(@types/node@20.17.44)
+      '@inquirer/type': 3.0.6(@types/node@20.17.44)
       external-editor: 3.1.0
     optionalDependencies:
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
 
-  '@inquirer/expand@4.0.12(@types/node@20.17.32)':
+  '@inquirer/expand@4.0.12(@types/node@20.17.44)':
     dependencies:
-      '@inquirer/core': 10.1.10(@types/node@20.17.32)
-      '@inquirer/type': 3.0.6(@types/node@20.17.32)
+      '@inquirer/core': 10.1.10(@types/node@20.17.44)
+      '@inquirer/type': 3.0.6(@types/node@20.17.44)
       yoctocolors-cjs: 2.1.2
     optionalDependencies:
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
 
   '@inquirer/figures@1.0.11': {}
 
-  '@inquirer/input@4.1.9(@types/node@20.17.32)':
+  '@inquirer/input@4.1.9(@types/node@20.17.44)':
     dependencies:
-      '@inquirer/core': 10.1.10(@types/node@20.17.32)
-      '@inquirer/type': 3.0.6(@types/node@20.17.32)
+      '@inquirer/core': 10.1.10(@types/node@20.17.44)
+      '@inquirer/type': 3.0.6(@types/node@20.17.44)
     optionalDependencies:
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
 
-  '@inquirer/number@3.0.12(@types/node@20.17.32)':
+  '@inquirer/number@3.0.12(@types/node@20.17.44)':
     dependencies:
-      '@inquirer/core': 10.1.10(@types/node@20.17.32)
-      '@inquirer/type': 3.0.6(@types/node@20.17.32)
+      '@inquirer/core': 10.1.10(@types/node@20.17.44)
+      '@inquirer/type': 3.0.6(@types/node@20.17.44)
     optionalDependencies:
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
 
-  '@inquirer/password@4.0.12(@types/node@20.17.32)':
+  '@inquirer/password@4.0.12(@types/node@20.17.44)':
     dependencies:
-      '@inquirer/core': 10.1.10(@types/node@20.17.32)
-      '@inquirer/type': 3.0.6(@types/node@20.17.32)
+      '@inquirer/core': 10.1.10(@types/node@20.17.44)
+      '@inquirer/type': 3.0.6(@types/node@20.17.44)
       ansi-escapes: 4.3.2
     optionalDependencies:
-      '@types/node': 20.17.32
-
-  '@inquirer/prompts@7.5.0(@types/node@20.17.32)':
-    dependencies:
-      '@inquirer/checkbox': 4.1.5(@types/node@20.17.32)
-      '@inquirer/confirm': 5.1.9(@types/node@20.17.32)
-      '@inquirer/editor': 4.2.10(@types/node@20.17.32)
-      '@inquirer/expand': 4.0.12(@types/node@20.17.32)
-      '@inquirer/input': 4.1.9(@types/node@20.17.32)
-      '@inquirer/number': 3.0.12(@types/node@20.17.32)
-      '@inquirer/password': 4.0.12(@types/node@20.17.32)
-      '@inquirer/rawlist': 4.1.0(@types/node@20.17.32)
-      '@inquirer/search': 3.0.12(@types/node@20.17.32)
-      '@inquirer/select': 4.2.0(@types/node@20.17.32)
+      '@types/node': 20.17.44
+
+  '@inquirer/prompts@7.5.0(@types/node@20.17.44)':
+    dependencies:
+      '@inquirer/checkbox': 4.1.5(@types/node@20.17.44)
+      '@inquirer/confirm': 5.1.9(@types/node@20.17.44)
+      '@inquirer/editor': 4.2.10(@types/node@20.17.44)
+      '@inquirer/expand': 4.0.12(@types/node@20.17.44)
+      '@inquirer/input': 4.1.9(@types/node@20.17.44)
+      '@inquirer/number': 3.0.12(@types/node@20.17.44)
+      '@inquirer/password': 4.0.12(@types/node@20.17.44)
+      '@inquirer/rawlist': 4.1.0(@types/node@20.17.44)
+      '@inquirer/search': 3.0.12(@types/node@20.17.44)
+      '@inquirer/select': 4.2.0(@types/node@20.17.44)
     optionalDependencies:
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
 
-  '@inquirer/rawlist@4.1.0(@types/node@20.17.32)':
+  '@inquirer/rawlist@4.1.0(@types/node@20.17.44)':
     dependencies:
-      '@inquirer/core': 10.1.10(@types/node@20.17.32)
-      '@inquirer/type': 3.0.6(@types/node@20.17.32)
+      '@inquirer/core': 10.1.10(@types/node@20.17.44)
+      '@inquirer/type': 3.0.6(@types/node@20.17.44)
       yoctocolors-cjs: 2.1.2
     optionalDependencies:
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
 
-  '@inquirer/search@3.0.12(@types/node@20.17.32)':
+  '@inquirer/search@3.0.12(@types/node@20.17.44)':
     dependencies:
-      '@inquirer/core': 10.1.10(@types/node@20.17.32)
+      '@inquirer/core': 10.1.10(@types/node@20.17.44)
       '@inquirer/figures': 1.0.11
-      '@inquirer/type': 3.0.6(@types/node@20.17.32)
+      '@inquirer/type': 3.0.6(@types/node@20.17.44)
       yoctocolors-cjs: 2.1.2
     optionalDependencies:
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
 
-  '@inquirer/select@4.2.0(@types/node@20.17.32)':
+  '@inquirer/select@4.2.0(@types/node@20.17.44)':
     dependencies:
-      '@inquirer/core': 10.1.10(@types/node@20.17.32)
+      '@inquirer/core': 10.1.10(@types/node@20.17.44)
       '@inquirer/figures': 1.0.11
-      '@inquirer/type': 3.0.6(@types/node@20.17.32)
+      '@inquirer/type': 3.0.6(@types/node@20.17.44)
       ansi-escapes: 4.3.2
       yoctocolors-cjs: 2.1.2
     optionalDependencies:
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
 
   '@inquirer/type@1.5.5':
     dependencies:
       mute-stream: 1.0.0
 
-  '@inquirer/type@3.0.6(@types/node@20.17.32)':
+  '@inquirer/type@3.0.6(@types/node@20.17.44)':
     optionalDependencies:
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
 
   '@isaacs/cliui@8.0.2':
     dependencies:
@@ -9549,9 +9506,9 @@ snapshots:
 
   '@leichtgewicht/ip-codec@2.0.5': {}
 
-  '@listr2/prompt-adapter-inquirer@2.0.22(@inquirer/prompts@7.5.0(@types/node@20.17.32))':
+  '@listr2/prompt-adapter-inquirer@2.0.22(@inquirer/prompts@7.5.0(@types/node@20.17.44))':
     dependencies:
-      '@inquirer/prompts': 7.5.0(@types/node@20.17.32)
+      '@inquirer/prompts': 7.5.0(@types/node@20.17.44)
       '@inquirer/type': 1.5.5
 
   '@lmdb/lmdb-darwin-arm64@3.3.0':
@@ -9575,7 +9532,7 @@ snapshots:
   '@lmdb/lmdb-win32-x64@3.3.0':
     optional: true
 
-  '@mdn/browser-compat-data@6.0.11': {}
+  '@mdn/browser-compat-data@6.0.12': {}
 
   '@modelcontextprotocol/sdk@1.11.0':
     dependencies:
@@ -9736,7 +9693,7 @@ snapshots:
     dependencies:
       which: 5.0.0
 
-  '@npmcli/redact@3.2.1': {}
+  '@npmcli/redact@3.2.2': {}
 
   '@npmcli/run-script@9.1.0':
     dependencies:
@@ -10042,7 +9999,7 @@ snapshots:
   '@rollup/rollup-win32-x64-msvc@4.40.2':
     optional: true
 
-  '@rollup/wasm-node@4.40.1':
+  '@rollup/wasm-node@4.40.2':
     dependencies:
       '@types/estree': 1.0.7
     optionalDependencies:
@@ -10086,7 +10043,7 @@ snapshots:
 
   '@stylistic/eslint-plugin@4.2.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)':
     dependencies:
-      '@typescript-eslint/utils': 8.31.1(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
+      '@typescript-eslint/utils': 8.32.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
       eslint: 9.26.0(jiti@1.21.7)
       eslint-visitor-keys: 4.2.0
       espree: 10.3.0
@@ -10117,13 +10074,13 @@ snapshots:
 
   '@types/accepts@1.3.7':
     dependencies:
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
 
   '@types/babel__code-frame@7.0.6': {}
 
   '@types/babel__core@7.20.5':
     dependencies:
-      '@babel/parser': 7.27.1
+      '@babel/parser': 7.27.2
       '@babel/types': 7.27.1
       '@types/babel__generator': 7.27.0
       '@types/babel__template': 7.4.4
@@ -10135,7 +10092,7 @@ snapshots:
 
   '@types/babel__template@7.4.4':
     dependencies:
-      '@babel/parser': 7.27.1
+      '@babel/parser': 7.27.2
       '@babel/types': 7.27.1
 
   '@types/babel__traverse@7.20.7':
@@ -10147,16 +10104,16 @@ snapshots:
   '@types/body-parser@1.19.5':
     dependencies:
       '@types/connect': 3.4.38
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
 
   '@types/bonjour@3.5.13':
     dependencies:
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
 
   '@types/browser-sync@2.29.0':
     dependencies:
       '@types/micromatch': 2.3.35
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
       '@types/serve-static': 1.15.7
       chokidar: 3.6.0
 
@@ -10164,7 +10121,7 @@ snapshots:
 
   '@types/co-body@6.1.3':
     dependencies:
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
       '@types/qs': 6.9.18
 
   '@types/command-line-args@5.2.3': {}
@@ -10172,11 +10129,11 @@ snapshots:
   '@types/connect-history-api-fallback@1.5.4':
     dependencies:
       '@types/express-serve-static-core': 4.19.6
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
 
   '@types/connect@3.4.38':
     dependencies:
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
 
   '@types/content-disposition@0.5.8': {}
 
@@ -10187,17 +10144,17 @@ snapshots:
       '@types/connect': 3.4.38
       '@types/express': 5.0.1
       '@types/keygrip': 1.0.6
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
 
   '@types/cors@2.8.17':
     dependencies:
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
 
   '@types/debounce@1.2.4': {}
 
   '@types/duplexify@3.6.4':
     dependencies:
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
 
   '@types/eslint-scope@3.7.7':
     dependencies:
@@ -10213,14 +10170,14 @@ snapshots:
 
   '@types/express-serve-static-core@4.19.6':
     dependencies:
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
       '@types/qs': 6.9.18
       '@types/range-parser': 1.2.7
       '@types/send': 0.17.4
 
   '@types/express-serve-static-core@5.0.6':
     dependencies:
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
       '@types/qs': 6.9.18
       '@types/range-parser': 1.2.7
       '@types/send': 0.17.4
@@ -10241,11 +10198,11 @@ snapshots:
   '@types/glob@7.2.0':
     dependencies:
       '@types/minimatch': 5.1.2
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
 
   '@types/graceful-fs@4.1.9':
     dependencies:
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
 
   '@types/http-assert@1.5.6': {}
 
@@ -10253,7 +10210,7 @@ snapshots:
 
   '@types/http-proxy@1.17.16':
     dependencies:
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
 
   '@types/ini@4.1.1': {}
 
@@ -10269,9 +10226,9 @@ snapshots:
 
   '@types/jasmine-reporters@2.5.3':
     dependencies:
-      '@types/jasmine': 5.1.7
+      '@types/jasmine': 5.1.8
 
-  '@types/jasmine@5.1.7': {}
+  '@types/jasmine@5.1.8': {}
 
   '@types/json-schema@7.0.15': {}
 
@@ -10279,7 +10236,7 @@ snapshots:
 
   '@types/karma@6.3.9':
     dependencies:
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
       log4js: 6.9.1
     transitivePeerDependencies:
       - supports-color
@@ -10299,13 +10256,13 @@ snapshots:
       '@types/http-errors': 2.0.4
       '@types/keygrip': 1.0.6
       '@types/koa-compose': 3.2.8
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
 
   '@types/less@3.0.8': {}
 
   '@types/loader-utils@2.0.6':
     dependencies:
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
       '@types/webpack': 4.41.40
 
   '@types/lodash@4.17.16': {}
@@ -10322,22 +10279,22 @@ snapshots:
 
   '@types/node-fetch@2.6.12':
     dependencies:
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
       form-data: 4.0.2
 
   '@types/node-forge@1.3.11':
     dependencies:
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
 
-  '@types/node@20.17.32':
+  '@types/node@20.17.44':
     dependencies:
       undici-types: 6.19.8
 
   '@types/npm-package-arg@6.1.4': {}
 
-  '@types/npm-registry-fetch@8.0.7':
+  '@types/npm-registry-fetch@8.0.8':
     dependencies:
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
       '@types/node-fetch': 2.6.12
       '@types/npm-package-arg': 6.1.4
       '@types/npmlog': 7.0.0
@@ -10345,12 +10302,12 @@ snapshots:
 
   '@types/npmlog@7.0.0':
     dependencies:
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
 
   '@types/pacote@11.1.8':
     dependencies:
-      '@types/node': 20.17.32
-      '@types/npm-registry-fetch': 8.0.7
+      '@types/node': 20.17.44
+      '@types/npm-registry-fetch': 8.0.8
       '@types/npmlog': 7.0.0
       '@types/ssri': 7.1.5
 
@@ -10362,12 +10319,12 @@ snapshots:
 
   '@types/progress@2.0.7':
     dependencies:
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
 
   '@types/pumpify@1.4.4':
     dependencies:
       '@types/duplexify': 3.6.4
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
 
   '@types/q@0.0.32': {}
 
@@ -10378,7 +10335,7 @@ snapshots:
   '@types/request@2.48.12':
     dependencies:
       '@types/caseless': 0.12.5
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
       '@types/tough-cookie': 4.0.5
       form-data: 2.5.3
 
@@ -10395,7 +10352,7 @@ snapshots:
   '@types/send@0.17.4':
     dependencies:
       '@types/mime': 1.3.5
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
 
   '@types/serve-index@1.9.4':
     dependencies:
@@ -10404,23 +10361,23 @@ snapshots:
   '@types/serve-static@1.15.7':
     dependencies:
       '@types/http-errors': 2.0.4
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
       '@types/send': 0.17.4
 
   '@types/shelljs@0.8.15':
     dependencies:
       '@types/glob': 7.2.0
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
 
   '@types/sockjs@0.3.36':
     dependencies:
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
 
   '@types/source-list-map@0.1.6': {}
 
   '@types/ssri@7.1.5':
     dependencies:
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
 
   '@types/stack-trace@0.0.33': {}
 
@@ -10439,17 +10396,17 @@ snapshots:
   '@types/watchpack@2.4.4':
     dependencies:
       '@types/graceful-fs': 4.1.9
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
 
   '@types/webpack-sources@3.2.3':
     dependencies:
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
       '@types/source-list-map': 0.1.6
       source-map: 0.7.4
 
   '@types/webpack@4.41.40':
     dependencies:
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
       '@types/tapable': 1.0.12
       '@types/uglify-js': 3.17.5
       '@types/webpack-sources': 3.2.3
@@ -10458,11 +10415,11 @@ snapshots:
 
   '@types/ws@7.4.7':
     dependencies:
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
 
   '@types/ws@8.18.1':
     dependencies:
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
 
   '@types/yargs-parser@21.0.3': {}
 
@@ -10474,7 +10431,7 @@ snapshots:
 
   '@types/yauzl@2.10.3':
     dependencies:
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
     optional: true
 
   '@typescript-eslint/eslint-plugin@8.32.0(@typescript-eslint/parser@8.32.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)':
@@ -10506,11 +10463,6 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@typescript-eslint/scope-manager@8.31.1':
-    dependencies:
-      '@typescript-eslint/types': 8.31.1
-      '@typescript-eslint/visitor-keys': 8.31.1
-
   '@typescript-eslint/scope-manager@8.32.0':
     dependencies:
       '@typescript-eslint/types': 8.32.0
@@ -10527,24 +10479,8 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@typescript-eslint/types@8.31.1': {}
-
   '@typescript-eslint/types@8.32.0': {}
 
-  '@typescript-eslint/typescript-estree@8.31.1(typescript@5.8.3)':
-    dependencies:
-      '@typescript-eslint/types': 8.31.1
-      '@typescript-eslint/visitor-keys': 8.31.1
-      debug: 4.4.0(supports-color@10.0.0)
-      fast-glob: 3.3.3
-      is-glob: 4.0.3
-      minimatch: 9.0.5
-      semver: 7.7.1
-      ts-api-utils: 2.1.0(typescript@5.8.3)
-      typescript: 5.8.3
-    transitivePeerDependencies:
-      - supports-color
-
   '@typescript-eslint/typescript-estree@8.32.0(typescript@5.8.3)':
     dependencies:
       '@typescript-eslint/types': 8.32.0
@@ -10559,17 +10495,6 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@typescript-eslint/utils@8.31.1(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)':
-    dependencies:
-      '@eslint-community/eslint-utils': 4.7.0(eslint@9.26.0(jiti@1.21.7))
-      '@typescript-eslint/scope-manager': 8.31.1
-      '@typescript-eslint/types': 8.31.1
-      '@typescript-eslint/typescript-estree': 8.31.1(typescript@5.8.3)
-      eslint: 9.26.0(jiti@1.21.7)
-      typescript: 5.8.3
-    transitivePeerDependencies:
-      - supports-color
-
   '@typescript-eslint/utils@8.32.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)':
     dependencies:
       '@eslint-community/eslint-utils': 4.7.0(eslint@9.26.0(jiti@1.21.7))
@@ -10581,11 +10506,6 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@typescript-eslint/visitor-keys@8.31.1':
-    dependencies:
-      '@typescript-eslint/types': 8.31.1
-      eslint-visitor-keys: 4.2.0
-
   '@typescript-eslint/visitor-keys@8.32.0':
     dependencies:
       '@typescript-eslint/types': 8.32.0
@@ -10738,9 +10658,9 @@ snapshots:
       minimatch: 7.4.6
       semver: 7.7.1
 
-  '@vitejs/plugin-basic-ssl@2.0.0(vite@6.3.5(@types/node@20.17.32)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1))':
+  '@vitejs/plugin-basic-ssl@2.0.0(vite@6.3.5(@types/node@20.17.44)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1))':
     dependencies:
-      vite: 6.3.5(@types/node@20.17.32)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1)
+      vite: 6.3.5(@types/node@20.17.44)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1)
 
   '@vitest/expect@3.1.3':
     dependencies:
@@ -10749,13 +10669,13 @@ snapshots:
       chai: 5.2.0
       tinyrainbow: 2.0.0
 
-  '@vitest/mocker@3.1.3(vite@6.3.5(@types/node@20.17.32)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1))':
+  '@vitest/mocker@3.1.3(vite@6.3.5(@types/node@20.17.44)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1))':
     dependencies:
       '@vitest/spy': 3.1.3
       estree-walker: 3.0.3
       magic-string: 0.30.17
     optionalDependencies:
-      vite: 6.3.5(@types/node@20.17.32)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1)
+      vite: 6.3.5(@types/node@20.17.44)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1)
 
   '@vitest/pretty-format@3.1.3':
     dependencies:
@@ -10857,7 +10777,7 @@ snapshots:
       '@web/test-runner-core': 0.13.4
       '@web/test-runner-coverage-v8': 0.8.0
       chrome-launcher: 0.15.2
-      puppeteer-core: 24.8.0
+      puppeteer-core: 24.8.1
     transitivePeerDependencies:
       - bare-buffer
       - bufferutil
@@ -11272,7 +11192,7 @@ snapshots:
 
   babel-plugin-polyfill-corejs2@0.4.13(@babel/core@7.27.1):
     dependencies:
-      '@babel/compat-data': 7.27.1
+      '@babel/compat-data': 7.27.2
       '@babel/core': 7.27.1
       '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.27.1)
       semver: 6.3.1
@@ -11327,7 +11247,7 @@ snapshots:
 
   baseline-browser-mapping@2.3.0:
     dependencies:
-      '@mdn/browser-compat-data': 6.0.11
+      '@mdn/browser-compat-data': 6.0.12
       web-features: 2.34.2
 
   basic-ftp@5.0.5: {}
@@ -11487,7 +11407,7 @@ snapshots:
   browserslist@4.24.5:
     dependencies:
       caniuse-lite: 1.0.30001717
-      electron-to-chromium: 1.5.149
+      electron-to-chromium: 1.5.150
       node-releases: 2.0.19
       update-browserslist-db: 1.1.3(browserslist@4.24.5)
 
@@ -11633,7 +11553,7 @@ snapshots:
 
   chrome-launcher@0.15.2:
     dependencies:
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
       escape-string-regexp: 4.0.0
       is-wsl: 2.2.0
       lighthouse-logger: 1.4.2
@@ -11642,7 +11562,7 @@ snapshots:
 
   chrome-trace-event@1.0.4: {}
 
-  chromium-bidi@4.1.1(devtools-protocol@0.0.1439962):
+  chromium-bidi@5.1.0(devtools-protocol@0.0.1439962):
     dependencies:
       devtools-protocol: 0.0.1439962
       mitt: 3.0.1
@@ -12141,7 +12061,7 @@ snapshots:
 
   ee-first@1.1.1: {}
 
-  electron-to-chromium@1.5.149: {}
+  electron-to-chromium@1.5.150: {}
 
   emoji-regex@10.4.0: {}
 
@@ -12181,7 +12101,7 @@ snapshots:
   engine.io@6.6.4:
     dependencies:
       '@types/cors': 2.8.17
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
       accepts: 1.3.8
       base64id: 2.0.0
       cookie: 0.7.2
@@ -12443,7 +12363,7 @@ snapshots:
       '@eslint/plugin-kit': 0.2.8
       '@humanfs/node': 0.16.6
       '@humanwhocodes/module-importer': 1.0.1
-      '@humanwhocodes/retry': 0.4.2
+      '@humanwhocodes/retry': 0.4.3
       '@modelcontextprotocol/sdk': 1.11.0
       '@types/estree': 1.0.7
       '@types/json-schema': 7.0.15
@@ -12633,7 +12553,7 @@ snapshots:
 
   extract-zip@2.0.1:
     dependencies:
-      debug: 4.4.0(supports-color@10.0.0)
+      debug: 4.3.4
       get-stream: 5.2.0
       yauzl: 2.10.0
     optionalDependencies:
@@ -13012,7 +12932,7 @@ snapshots:
       node-fetch: 2.7.0(encoding@0.1.13)
       object-hash: 3.0.0
       proto3-json-serializer: 2.0.2
-      protobufjs: 7.5.0
+      protobufjs: 7.4.0
       retry-request: 7.0.2(encoding@0.1.13)(supports-color@10.0.0)
       uuid: 9.0.1
     transitivePeerDependencies:
@@ -13027,10 +12947,10 @@ snapshots:
 
   graphemer@1.4.0: {}
 
-  grpc-gcp@1.0.1(protobufjs@7.5.0):
+  grpc-gcp@1.0.1(protobufjs@7.4.0):
     dependencies:
       '@grpc/grpc-js': 1.13.3
-      protobufjs: 7.5.0
+      protobufjs: 7.4.0
 
   gtoken@7.1.0(encoding@0.1.13)(supports-color@10.0.0):
     dependencies:
@@ -13269,7 +13189,7 @@ snapshots:
 
   immutable@3.8.2: {}
 
-  immutable@5.1.1: {}
+  immutable@5.1.2: {}
 
   import-fresh@3.3.1:
     dependencies:
@@ -13543,7 +13463,7 @@ snapshots:
   istanbul-lib-instrument@5.2.1:
     dependencies:
       '@babel/core': 7.27.1
-      '@babel/parser': 7.27.1
+      '@babel/parser': 7.27.2
       '@istanbuljs/schema': 0.1.3
       istanbul-lib-coverage: 3.2.2
       semver: 6.3.1
@@ -13553,7 +13473,7 @@ snapshots:
   istanbul-lib-instrument@6.0.3:
     dependencies:
       '@babel/core': 7.27.1
-      '@babel/parser': 7.27.1
+      '@babel/parser': 7.27.2
       '@istanbuljs/schema': 0.1.3
       istanbul-lib-coverage: 3.2.2
       semver: 7.7.1
@@ -13615,7 +13535,7 @@ snapshots:
 
   jest-worker@27.5.1:
     dependencies:
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
       merge-stream: 2.0.0
       supports-color: 8.1.1
 
@@ -13736,13 +13656,13 @@ snapshots:
       readable-stream: 2.3.8
       setimmediate: 1.0.5
 
-  jwa@1.4.1:
+  jwa@1.4.2:
     dependencies:
       buffer-equal-constant-time: 1.0.1
       ecdsa-sig-formatter: 1.0.11
       safe-buffer: 5.2.1
 
-  jwa@2.0.0:
+  jwa@2.0.1:
     dependencies:
       buffer-equal-constant-time: 1.0.1
       ecdsa-sig-formatter: 1.0.11
@@ -13750,12 +13670,12 @@ snapshots:
 
   jws@3.2.2:
     dependencies:
-      jwa: 1.4.1
+      jwa: 1.4.2
       safe-buffer: 5.2.1
 
   jws@4.0.0:
     dependencies:
-      jwa: 2.0.0
+      jwa: 2.0.1
       safe-buffer: 5.2.1
 
   karma-chrome-launcher@3.2.0:
@@ -14287,7 +14207,7 @@ snapshots:
       '@ampproject/remapping': 2.3.0
       '@angular/compiler-cli': 20.0.0-next.9(@angular/compiler@20.0.0-next.9)(typescript@5.8.3)
       '@rollup/plugin-json': 6.1.0(rollup@4.40.2)
-      '@rollup/wasm-node': 4.40.1
+      '@rollup/wasm-node': 4.40.2
       ajv: 8.17.1
       ansi-colors: 4.1.3
       browserslist: 4.24.5
@@ -14403,7 +14323,7 @@ snapshots:
 
   npm-registry-fetch@18.0.2:
     dependencies:
-      '@npmcli/redact': 3.2.1
+      '@npmcli/redact': 3.2.2
       jsonparse: 1.3.1
       make-fetch-happen: 14.0.3
       minipass: 7.1.2
@@ -14849,9 +14769,9 @@ snapshots:
 
   proto3-json-serializer@2.0.2:
     dependencies:
-      protobufjs: 7.5.0
+      protobufjs: 7.4.0
 
-  protobufjs@7.5.0:
+  protobufjs@7.4.0:
     dependencies:
       '@protobufjs/aspromise': 1.1.2
       '@protobufjs/base64': 1.1.2
@@ -14863,7 +14783,7 @@ snapshots:
       '@protobufjs/path': 1.1.2
       '@protobufjs/pool': 1.1.0
       '@protobufjs/utf8': 1.1.0
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
       long: 5.3.2
 
   protractor@7.0.0:
@@ -14951,10 +14871,10 @@ snapshots:
       - supports-color
       - utf-8-validate
 
-  puppeteer-core@24.8.0:
+  puppeteer-core@24.8.1:
     dependencies:
       '@puppeteer/browsers': 2.10.3
-      chromium-bidi: 4.1.1(devtools-protocol@0.0.1439962)
+      chromium-bidi: 5.1.0(devtools-protocol@0.0.1439962)
       debug: 4.4.0(supports-color@10.0.0)
       devtools-protocol: 0.0.1439962
       typed-query-selector: 2.12.0
@@ -15231,12 +15151,12 @@ snapshots:
     optionalDependencies:
       '@babel/code-frame': 7.27.1
 
-  rollup-plugin-sourcemaps2@0.5.1(@types/node@20.17.32)(rollup@4.40.2):
+  rollup-plugin-sourcemaps2@0.5.1(@types/node@20.17.44)(rollup@4.40.2):
     dependencies:
       '@rollup/pluginutils': 5.1.4(rollup@4.40.2)
       rollup: 4.40.2
     optionalDependencies:
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
 
   rollup@4.40.2:
     dependencies:
@@ -15325,7 +15245,7 @@ snapshots:
   sass@1.87.0:
     dependencies:
       chokidar: 4.0.3
-      immutable: 5.1.1
+      immutable: 5.1.2
       source-map-js: 1.2.1
     optionalDependencies:
       '@parcel/watcher': 2.5.1
@@ -16041,14 +15961,14 @@ snapshots:
     dependencies:
       typescript: 5.8.3
 
-  ts-node@10.9.2(@types/node@20.17.32)(typescript@5.8.3):
+  ts-node@10.9.2(@types/node@20.17.44)(typescript@5.8.3):
     dependencies:
       '@cspotcode/source-map-support': 0.8.1
       '@tsconfig/node10': 1.0.11
       '@tsconfig/node12': 1.0.11
       '@tsconfig/node14': 1.0.3
       '@tsconfig/node16': 1.0.4
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
       acorn: 8.14.1
       acorn-walk: 8.3.4
       arg: 4.1.3
@@ -16329,13 +16249,13 @@ snapshots:
       core-util-is: 1.0.2
       extsprintf: 1.3.0
 
-  vite-node@3.1.3(@types/node@20.17.32)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1):
+  vite-node@3.1.3(@types/node@20.17.44)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1):
     dependencies:
       cac: 6.7.14
       debug: 4.4.0(supports-color@10.0.0)
       es-module-lexer: 1.7.0
       pathe: 2.0.3
-      vite: 6.3.5(@types/node@20.17.32)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1)
+      vite: 6.3.5(@types/node@20.17.44)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1)
     transitivePeerDependencies:
       - '@types/node'
       - jiti
@@ -16350,7 +16270,7 @@ snapshots:
       - tsx
       - yaml
 
-  vite@6.3.5(@types/node@20.17.32)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1):
+  vite@6.3.5(@types/node@20.17.44)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1):
     dependencies:
       esbuild: 0.25.4
       fdir: 6.4.4(picomatch@4.0.2)
@@ -16359,7 +16279,7 @@ snapshots:
       rollup: 4.40.2
       tinyglobby: 0.2.13
     optionalDependencies:
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
       fsevents: 2.3.3
       jiti: 1.21.7
       less: 4.3.0
@@ -16367,10 +16287,10 @@ snapshots:
       terser: 5.39.0
       yaml: 2.7.1
 
-  vitest@3.1.3(@types/node@20.17.32)(jiti@1.21.7)(jsdom@26.1.0)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1):
+  vitest@3.1.3(@types/node@20.17.44)(jiti@1.21.7)(jsdom@26.1.0)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1):
     dependencies:
       '@vitest/expect': 3.1.3
-      '@vitest/mocker': 3.1.3(vite@6.3.5(@types/node@20.17.32)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1))
+      '@vitest/mocker': 3.1.3(vite@6.3.5(@types/node@20.17.44)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1))
       '@vitest/pretty-format': 3.1.3
       '@vitest/runner': 3.1.3
       '@vitest/snapshot': 3.1.3
@@ -16387,11 +16307,11 @@ snapshots:
       tinyglobby: 0.2.13
       tinypool: 1.0.2
       tinyrainbow: 2.0.0
-      vite: 6.3.5(@types/node@20.17.32)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1)
-      vite-node: 3.1.3(@types/node@20.17.32)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1)
+      vite: 6.3.5(@types/node@20.17.44)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1)
+      vite-node: 3.1.3(@types/node@20.17.44)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1)
       why-is-node-running: 2.3.0
     optionalDependencies:
-      '@types/node': 20.17.32
+      '@types/node': 20.17.44
       jsdom: 26.1.0
     transitivePeerDependencies:
       - jiti

From f1213e3c09560befad0307ae86a27d40d90e97b8 Mon Sep 17 00:00:00 2001
From: Alan Agius <17563226+alan-agius4@users.noreply.github.com>
Date: Wed, 7 May 2025 06:18:45 +0000
Subject: [PATCH 030/138] ci: enable e2e test runs on Node.js 24

This update configures the CI pipeline to execute e2e tests using Node.js v24.

(cherry picked from commit 7b25900de0b6d7a398b84a69ae7fa3b70a340080)
---
 .github/workflows/ci.yml |  2 +-
 WORKSPACE                | 14 ++++++++++++++
 tools/toolchain_info.bzl |  6 ++++++
 3 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index a0ec69c967be..b46aa942a8bb 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -81,7 +81,7 @@ 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 }}
diff --git a/WORKSPACE b/WORKSPACE
index 1a0cd8aa81e5..2b82500f6f7f 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -101,6 +101,20 @@ nodejs_register_toolchains(
     node_version = "22.11.0",
 )
 
+nodejs_register_toolchains(
+    name = "node24",
+    node_repositories = {
+        "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"),
+    },
+    node_version = "24.0.0",
+)
+
 load("@aspect_rules_js//js:toolchains.bzl", "rules_js_register_toolchains")
 
 rules_js_register_toolchains(
diff --git a/tools/toolchain_info.bzl b/tools/toolchain_info.bzl
index 8a69f7d0c474..727a02abcae4 100644
--- a/tools/toolchain_info.bzl
+++ b/tools/toolchain_info.bzl
@@ -5,6 +5,7 @@
 TOOLCHAINS_NAMES = [
     "node20",
     "node22",
+    "node24",
 ]
 
 # this is the list of toolchains that should be used and are registered with nodejs_register_toolchains in the WORKSPACE file
@@ -19,6 +20,11 @@ TOOLCHAINS_VERSIONS = [
         "@bazel_tools//src/conditions:darwin": "@node22_darwin_amd64//:node_toolchain",
         "@bazel_tools//src/conditions:windows": "@node22_windows_amd64//:node_toolchain",
     }),
+    select({
+        "@bazel_tools//src/conditions:linux_x86_64": "@node24_linux_amd64//:node_toolchain",
+        "@bazel_tools//src/conditions:darwin": "@node24_darwin_amd64//:node_toolchain",
+        "@bazel_tools//src/conditions:windows": "@node24_windows_amd64//:node_toolchain",
+    }),
 ]
 
 # A default toolchain for use when only one is necessary

From d60503ce0332fedd5e652955a347b2499046533e Mon Sep 17 00:00:00 2001
From: Charles Lyding <19598772+clydin@users.noreply.github.com>
Date: Wed, 7 May 2025 14:45:22 -0400
Subject: [PATCH 031/138] release: cut the v20.0.0-rc.0 release

---
 CHANGELOG.md | 42 ++++++++++++++++++++++++++++++++++++++++++
 package.json |  2 +-
 2 files changed, 43 insertions(+), 1 deletion(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index d242ff94b916..f7ec636449a4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,45 @@
+<a name="20.0.0-rc.0"></a>
+
+# 20.0.0-rc.0 (2025-05-07)
+
+### @angular/cli
+
+| Commit                                                                                              | Type | Description                         |
+| --------------------------------------------------------------------------------------------------- | ---- | ----------------------------------- |
+| [e513cd4aa](https://github.com/angular/angular-cli/commit/e513cd4aa218e5ab634f05c18b6aa90f223e096c) | fix  | add Node.js 24 as supported version |
+
+### @schematics/angular
+
+| Commit                                                                                              | Type | Description                                        |
+| --------------------------------------------------------------------------------------------------- | ---- | -------------------------------------------------- |
+| [901ab60d9](https://github.com/angular/angular-cli/commit/901ab60d9f63fcff17213dbf7fe17e4a46835974) | fix  | remove explicit index option from new applications |
+
+### @angular-devkit/build-angular
+
+| Commit                                                                                              | Type | Description                                           |
+| --------------------------------------------------------------------------------------------------- | ---- | ----------------------------------------------------- |
+| [635999d4e](https://github.com/angular/angular-cli/commit/635999d4ef6045c50526193f1ead3dd4542a225b) | fix  | correctly set i18n subPath in webpack browser builder |
+
+### @angular/build
+
+| Commit                                                                                              | Type | Description                                      |
+| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------ |
+| [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      |
+| [ffaf8aa19](https://github.com/angular/angular-cli/commit/ffaf8aa194ccb4b541c4c5291da5a58c86635f1d) | fix  | avoid attempting to watch bundler internal files |
+| [ba844ae16](https://github.com/angular/angular-cli/commit/ba844ae16922961cef306553e49ce91b856f94d2) | fix  | avoid internal karma request cache for assets    |
+| [7bb1f8747](https://github.com/angular/angular-cli/commit/7bb1f87478d441e35b73b920c8bfcd4376a3422d) | fix  | enable unit-test reporters option                |
+| [1cd65a08d](https://github.com/angular/angular-cli/commit/1cd65a08d5278134115f33ff0e666aee420faf8a) | fix  | perform testing module cleanup when using Vitest |
+| [22ba07444](https://github.com/angular/angular-cli/commit/22ba07444192872278c7508b4af084fd39f9b3bd) | perf | fix unnecessary esbuild rebuilds                 |
+
+### @angular/pwa
+
+| Commit                                                                                              | Type | Description                                         |
+| --------------------------------------------------------------------------------------------------- | ---- | --------------------------------------------------- |
+| [fa0a06f9f](https://github.com/angular/angular-cli/commit/fa0a06f9f92b28929fc775074245a0b97c3d9adc) | fix  | support using default index option when not present |
+
+<!-- CHANGELOG SPLIT MARKER -->
+
 <a name="20.0.0-next.9"></a>
 
 # 20.0.0-next.9 (2025-04-30)
diff --git a/package.json b/package.json
index 325c140ae11e..d7cadc4e9fd0 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@angular/devkit-repo",
-  "version": "20.0.0-next.9",
+  "version": "20.0.0-rc.0",
   "private": true,
   "description": "Software Development Kit for Angular",
   "keywords": [

From 769961e4a9a67f88f8fb4b7de80dea67825219f9 Mon Sep 17 00:00:00 2001
From: Charles Lyding <19598772+clydin@users.noreply.github.com>
Date: Thu, 8 May 2025 11:55:12 -0400
Subject: [PATCH 032/138] fix(@angular/build): allow vitest-based unit testing
 to use watch option

When using the `application` build system with the experimental `unit-test`
vitest support, the `watch` option will now be passed through to the underlying
test runner. This allows vitest to be used for watch-based test development.
Incremental test file updates from the build system are also enabled in watch
mode as well to remove the need to rewrite all output files on a rebuild.

(cherry picked from commit bfcee38a58f648ede83f523142edd81fe40dc2aa)
---
 .../build/src/builders/unit-test/builder.ts   | 77 +++++++++++--------
 .../build/src/builders/unit-test/options.ts   |  6 +-
 2 files changed, 46 insertions(+), 37 deletions(-)

diff --git a/packages/angular/build/src/builders/unit-test/builder.ts b/packages/angular/build/src/builders/unit-test/builder.ts
index 9eb1a552bdd6..a572b12b30e9 100644
--- a/packages/angular/build/src/builders/unit-test/builder.ts
+++ b/packages/angular/build/src/builders/unit-test/builder.ts
@@ -100,6 +100,7 @@ export async function* execute(
   const buildOptions: ApplicationBuilderInternalOptions = {
     ...buildTargetOptions,
     watch: normalizedOptions.watch,
+    incrementalResults: normalizedOptions.watch,
     outputPath,
     index: false,
     browser: undefined,
@@ -171,44 +172,52 @@ export async function* execute(
     };
   }
 
-  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');
-    }
+  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,
-        reporters: normalizedOptions.reporters ?? ['default'],
-        coverage: {
-          enabled: normalizedOptions.codeCoverage,
-          exclude: normalizedOptions.codeCoverageExclude,
-          excludeAfterRemap: true,
+  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 */, 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,
+          reporters: normalizedOptions.reporters ?? ['default'],
+          coverage: {
+            enabled: normalizedOptions.codeCoverage,
+            exclude: normalizedOptions.codeCoverageExclude,
+            excludeAfterRemap: true,
+          },
         },
-      },
-    });
+      });
 
-    // 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();
+    }
   }
 }
 
diff --git a/packages/angular/build/src/builders/unit-test/options.ts b/packages/angular/build/src/builders/unit-test/options.ts
index 2cd09a3b03e9..6bfe7361eebb 100644
--- a/packages/angular/build/src/builders/unit-test/options.ts
+++ b/packages/angular/build/src/builders/unit-test/options.ts
@@ -32,7 +32,8 @@ export async function normalizeOptions(
   const buildTargetSpecifier = options.buildTarget ?? `::development`;
   const buildTarget = targetFromTargetString(buildTargetSpecifier, projectName, 'build');
 
-  const { codeCoverage, codeCoverageExclude, tsConfig, runner, reporters, browsers } = options;
+  const { codeCoverage, codeCoverageExclude, tsConfig, runner, reporters, browsers, watch } =
+    options;
 
   return {
     // Project/workspace information
@@ -50,8 +51,7 @@ export async function normalizeOptions(
     tsConfig,
     reporters,
     browsers,
-    // TODO: Implement watch support
-    watch: false,
+    watch,
   };
 }
 

From 247cd335217d9997995321b4b235c40480adadb3 Mon Sep 17 00:00:00 2001
From: Charles Lyding <19598772+clydin@users.noreply.github.com>
Date: Thu, 8 May 2025 12:05:18 -0400
Subject: [PATCH 033/138] fix(@angular/build): show unit-test error for missing
 vitest package

When using the experimental `unit-test` builder with `vitest` as the runner,
an error message will now be shown if the `vitest` package cannot be loaded.
The error message includes a suggestion to install the package if not present.

(cherry picked from commit 48f84caac8213f42cf4c7753199622407553ffef)
---
 .../build/src/builders/unit-test/builder.ts   | 19 ++++++++++++++++++-
 1 file changed, 18 insertions(+), 1 deletion(-)

diff --git a/packages/angular/build/src/builders/unit-test/builder.ts b/packages/angular/build/src/builders/unit-test/builder.ts
index a572b12b30e9..f103b6ddc8af 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<typeof import('vitest/node')>('vitest/node');
+  let vitestNodeModule;
+  try {
+    vitestNodeModule = await loadEsmModule<typeof import('vitest/node')>('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(

From 7b718d17e5cd470ffad1767854bc8007f7bd2ce9 Mon Sep 17 00:00:00 2001
From: Angular Robot <angular-robot@google.com>
Date: Wed, 7 May 2025 05:03:12 +0000
Subject: [PATCH 034/138] build: update rules_angular digest to e35da73

(cherry picked from commit 78cbe8b04a209453a37f831dc9b02e01fedef8fc)
---
 WORKSPACE | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/WORKSPACE b/WORKSPACE
index 2b82500f6f7f..c8ad4868fa67 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -276,7 +276,7 @@ esbuild_register_toolchains(
 
 git_repository(
     name = "rules_angular",
-    commit = "42d4791c1c2cd8b21deaf960443dd883033fdedf",
+    commit = "e35da7371d02d0c8d165c518d532d66be7afb8a6",
     remote = "https://github.com/devversion/rules_angular.git",
 )
 

From 9119af85fe9c46371c722c66603bc7621f5c397f Mon Sep 17 00:00:00 2001
From: Angular Robot <angular-robot@google.com>
Date: Thu, 8 May 2025 20:04:30 +0000
Subject: [PATCH 035/138] build: update angular

(cherry picked from commit 505c8368fcec85c34bf4561638eb30c8b6285bf8)
---
 .../assistant-to-the-branch-manager.yml       |   2 +-
 .github/workflows/ci.yml                      |  50 +--
 .github/workflows/dev-infra.yml               |   4 +-
 .github/workflows/feature-requests.yml        |   2 +-
 .github/workflows/perf.yml                    |   6 +-
 .github/workflows/pr.yml                      |  42 +--
 package.json                                  |  28 +-
 packages/angular/ssr/package.json             |  12 +-
 packages/ngtools/webpack/package.json         |   4 +-
 pnpm-lock.yaml                                | 306 +++++++++---------
 tests/legacy-cli/e2e/ng-snapshot/package.json |  32 +-
 11 files changed, 244 insertions(+), 244 deletions(-)

diff --git a/.github/workflows/assistant-to-the-branch-manager.yml b/.github/workflows/assistant-to-the-branch-manager.yml
index a46a76f2f4de..8aafbe2bbaa0 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@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
+      - uses: angular/dev-infra/github-actions/branch-manager@030487ad792aad6856c48b2d1e699b0d96e11a7b
         with:
           angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }}
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index b46aa942a8bb..5ea6cb69a0db 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@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@030487ad792aad6856c48b2d1e699b0d96e11a7b
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
+        uses: angular/dev-infra/github-actions/bazel/setup@030487ad792aad6856c48b2d1e699b0d96e11a7b
       - 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@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@030487ad792aad6856c48b2d1e699b0d96e11a7b
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
+        uses: angular/dev-infra/github-actions/bazel/setup@030487ad792aad6856c48b2d1e699b0d96e11a7b
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@030487ad792aad6856c48b2d1e699b0d96e11a7b
         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@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@030487ad792aad6856c48b2d1e699b0d96e11a7b
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
+        uses: angular/dev-infra/github-actions/bazel/setup@030487ad792aad6856c48b2d1e699b0d96e11a7b
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@030487ad792aad6856c48b2d1e699b0d96e11a7b
         with:
           google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }}
       - name: Install node modules
@@ -87,13 +87,13 @@ jobs:
     runs-on: ${{ matrix.os }}
     steps:
       - name: Initialize environment
-        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@030487ad792aad6856c48b2d1e699b0d96e11a7b
       - name: Install node modules
         run: pnpm install --frozen-lockfile
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
+        uses: angular/dev-infra/github-actions/bazel/setup@030487ad792aad6856c48b2d1e699b0d96e11a7b
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@030487ad792aad6856c48b2d1e699b0d96e11a7b
         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@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@030487ad792aad6856c48b2d1e699b0d96e11a7b
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
+        uses: angular/dev-infra/github-actions/bazel/setup@030487ad792aad6856c48b2d1e699b0d96e11a7b
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@030487ad792aad6856c48b2d1e699b0d96e11a7b
         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@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@030487ad792aad6856c48b2d1e699b0d96e11a7b
       - name: Install node modules
         run: pnpm install --frozen-lockfile
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
+        uses: angular/dev-infra/github-actions/bazel/setup@030487ad792aad6856c48b2d1e699b0d96e11a7b
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@030487ad792aad6856c48b2d1e699b0d96e11a7b
         with:
           google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }}
       - name: Run CLI E2E tests
@@ -162,13 +162,13 @@ jobs:
     runs-on: ${{ matrix.os }}
     steps:
       - name: Initialize environment
-        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@030487ad792aad6856c48b2d1e699b0d96e11a7b
       - name: Install node modules
         run: pnpm install --frozen-lockfile
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
+        uses: angular/dev-infra/github-actions/bazel/setup@030487ad792aad6856c48b2d1e699b0d96e11a7b
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@030487ad792aad6856c48b2d1e699b0d96e11a7b
         with:
           google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }}
       - name: Run CLI E2E tests
@@ -182,13 +182,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@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@030487ad792aad6856c48b2d1e699b0d96e11a7b
       - name: Install node modules
         run: pnpm install --frozen-lockfile
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
+        uses: angular/dev-infra/github-actions/bazel/setup@030487ad792aad6856c48b2d1e699b0d96e11a7b
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@030487ad792aad6856c48b2d1e699b0d96e11a7b
         with:
           google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }}
       - name: Run E2E Browser tests
@@ -218,11 +218,11 @@ jobs:
       CIRCLE_BRANCH: ${{ github.ref_name }}
     steps:
       - name: Initialize environment
-        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@030487ad792aad6856c48b2d1e699b0d96e11a7b
       - name: Install node modules
         run: pnpm install --frozen-lockfile
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
+        uses: angular/dev-infra/github-actions/bazel/setup@030487ad792aad6856c48b2d1e699b0d96e11a7b
       - 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 a4c41ecb1d2c..50700b4f7326 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@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
+      - uses: angular/dev-infra/github-actions/commit-message-based-labels@030487ad792aad6856c48b2d1e699b0d96e11a7b
         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@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
+      - uses: angular/dev-infra/github-actions/post-approval-changes@030487ad792aad6856c48b2d1e699b0d96e11a7b
         with:
           angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }}
diff --git a/.github/workflows/feature-requests.yml b/.github/workflows/feature-requests.yml
index 5f48097b7975..fd144c9760dc 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@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
+      - uses: angular/dev-infra/github-actions/feature-request@030487ad792aad6856c48b2d1e699b0d96e11a7b
         with:
           angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }}
diff --git a/.github/workflows/perf.yml b/.github/workflows/perf.yml
index 5fbcbf75894c..78081fa54cc3 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@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@030487ad792aad6856c48b2d1e699b0d96e11a7b
       - 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@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@030487ad792aad6856c48b2d1e699b0d96e11a7b
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
+        uses: angular/dev-infra/github-actions/bazel/setup@030487ad792aad6856c48b2d1e699b0d96e11a7b
       - 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 e38b513ff426..d44cea3ef466 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@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@030487ad792aad6856c48b2d1e699b0d96e11a7b
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
+        uses: angular/dev-infra/github-actions/bazel/setup@030487ad792aad6856c48b2d1e699b0d96e11a7b
       - 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@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
+        uses: angular/dev-infra/github-actions/linting/licenses@030487ad792aad6856c48b2d1e699b0d96e11a7b
       - 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@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@030487ad792aad6856c48b2d1e699b0d96e11a7b
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
+        uses: angular/dev-infra/github-actions/bazel/setup@030487ad792aad6856c48b2d1e699b0d96e11a7b
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@030487ad792aad6856c48b2d1e699b0d96e11a7b
       - name: Install node modules
         run: pnpm install --frozen-lockfile
       - name: Build release targets
@@ -93,11 +93,11 @@ jobs:
     runs-on: ubuntu-latest
     steps:
       - name: Initialize environment
-        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@030487ad792aad6856c48b2d1e699b0d96e11a7b
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
+        uses: angular/dev-infra/github-actions/bazel/setup@030487ad792aad6856c48b2d1e699b0d96e11a7b
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@030487ad792aad6856c48b2d1e699b0d96e11a7b
       - 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@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@030487ad792aad6856c48b2d1e699b0d96e11a7b
       - name: Install node modules
         run: pnpm install --frozen-lockfile
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
+        uses: angular/dev-infra/github-actions/bazel/setup@030487ad792aad6856c48b2d1e699b0d96e11a7b
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@030487ad792aad6856c48b2d1e699b0d96e11a7b
       - 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@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@030487ad792aad6856c48b2d1e699b0d96e11a7b
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
+        uses: angular/dev-infra/github-actions/bazel/setup@030487ad792aad6856c48b2d1e699b0d96e11a7b
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@030487ad792aad6856c48b2d1e699b0d96e11a7b
         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@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@030487ad792aad6856c48b2d1e699b0d96e11a7b
       - name: Install node modules
         run: pnpm install --frozen-lockfile
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
+        uses: angular/dev-infra/github-actions/bazel/setup@030487ad792aad6856c48b2d1e699b0d96e11a7b
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@030487ad792aad6856c48b2d1e699b0d96e11a7b
       - 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@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@030487ad792aad6856c48b2d1e699b0d96e11a7b
       - name: Install node modules
         run: pnpm install --frozen-lockfile
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
+        uses: angular/dev-infra/github-actions/bazel/setup@030487ad792aad6856c48b2d1e699b0d96e11a7b
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@2c7bab7971084f3f1f6f72735099a9591ee5ebcb
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@030487ad792aad6856c48b2d1e699b0d96e11a7b
       - 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/package.json b/package.json
index d7cadc4e9fd0..7fce14f3b6a7 100644
--- a/package.json
+++ b/package.json
@@ -46,20 +46,20 @@
   },
   "homepage": "https://github.com/angular/angular-cli",
   "devDependencies": {
-    "@angular/animations": "20.0.0-next.9",
-    "@angular/cdk": "20.0.0-next.10",
-    "@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.10",
-    "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#1125d8dbec5e787d9579e5b218b60a3be64c50fa",
-    "@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-rc.0",
+    "@angular/cdk": "20.0.0-rc.0",
+    "@angular/common": "20.0.0-rc.0",
+    "@angular/compiler": "20.0.0-rc.0",
+    "@angular/compiler-cli": "20.0.0-rc.0",
+    "@angular/core": "20.0.0-rc.0",
+    "@angular/forms": "20.0.0-rc.0",
+    "@angular/localize": "20.0.0-rc.0",
+    "@angular/material": "20.0.0-rc.0",
+    "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#14ea8ca5b4adfb73a1f4ad531116cd448379a0a3",
+    "@angular/platform-browser": "20.0.0-rc.0",
+    "@angular/platform-server": "20.0.0-rc.0",
+    "@angular/router": "20.0.0-rc.0",
+    "@angular/service-worker": "20.0.0-rc.0",
     "@bazel/bazelisk": "1.26.0",
     "@bazel/buildifier": "8.2.0",
     "@eslint/compat": "1.2.9",
diff --git a/packages/angular/ssr/package.json b/packages/angular/ssr/package.json
index 7e8c92324be5..4889f1b724cf 100644
--- a/packages/angular/ssr/package.json
+++ b/packages/angular/ssr/package.json
@@ -29,12 +29,12 @@
   },
   "devDependencies": {
     "@angular-devkit/schematics": "workspace:*",
-    "@angular/common": "20.0.0-next.9",
-    "@angular/compiler": "20.0.0-next.9",
-    "@angular/core": "20.0.0-next.9",
-    "@angular/platform-browser": "20.0.0-next.9",
-    "@angular/platform-server": "20.0.0-next.9",
-    "@angular/router": "20.0.0-next.9",
+    "@angular/common": "20.0.0-rc.0",
+    "@angular/compiler": "20.0.0-rc.0",
+    "@angular/core": "20.0.0-rc.0",
+    "@angular/platform-browser": "20.0.0-rc.0",
+    "@angular/platform-server": "20.0.0-rc.0",
+    "@angular/router": "20.0.0-rc.0",
     "@schematics/angular": "workspace:*"
   },
   "sideEffects": false,
diff --git a/packages/ngtools/webpack/package.json b/packages/ngtools/webpack/package.json
index 20dc65e038bd..5773340fff1e 100644
--- a/packages/ngtools/webpack/package.json
+++ b/packages/ngtools/webpack/package.json
@@ -27,8 +27,8 @@
   },
   "devDependencies": {
     "@angular-devkit/core": "workspace:0.0.0-PLACEHOLDER",
-    "@angular/compiler": "20.0.0-next.9",
-    "@angular/compiler-cli": "20.0.0-next.9",
+    "@angular/compiler": "20.0.0-rc.0",
+    "@angular/compiler-cli": "20.0.0-rc.0",
     "typescript": "5.8.3",
     "webpack": "5.99.8"
   }
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 2bb2fefd3fbd..087343e5431b 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -15,47 +15,47 @@ importers:
   .:
     devDependencies:
       '@angular/animations':
-        specifier: 20.0.0-next.9
-        version: 20.0.0-next.9(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))
+        specifier: 20.0.0-rc.0
+        version: 20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))
       '@angular/cdk':
-        specifier: 20.0.0-next.10
-        version: 20.0.0-next.10(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
+        specifier: 20.0.0-rc.0
+        version: 20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
       '@angular/common':
-        specifier: 20.0.0-next.9
-        version: 20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
+        specifier: 20.0.0-rc.0
+        version: 20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
       '@angular/compiler':
-        specifier: 20.0.0-next.9
-        version: 20.0.0-next.9
+        specifier: 20.0.0-rc.0
+        version: 20.0.0-rc.0
       '@angular/compiler-cli':
-        specifier: 20.0.0-next.9
-        version: 20.0.0-next.9(@angular/compiler@20.0.0-next.9)(typescript@5.8.3)
+        specifier: 20.0.0-rc.0
+        version: 20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(typescript@5.8.3)
       '@angular/core':
-        specifier: 20.0.0-next.9
-        version: 20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0)
+        specifier: 20.0.0-rc.0
+        version: 20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)
       '@angular/forms':
-        specifier: 20.0.0-next.9
-        version: 20.0.0-next.9(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(@angular/platform-browser@20.0.0-next.9(@angular/animations@20.0.0-next.9(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0)))(rxjs@7.8.2)
+        specifier: 20.0.0-rc.0
+        version: 20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(@angular/platform-browser@20.0.0-rc.0(@angular/animations@20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)))(rxjs@7.8.2)
       '@angular/localize':
-        specifier: 20.0.0-next.9
-        version: 20.0.0-next.9(@angular/compiler-cli@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(typescript@5.8.3))(@angular/compiler@20.0.0-next.9)
+        specifier: 20.0.0-rc.0
+        version: 20.0.0-rc.0(@angular/compiler-cli@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(typescript@5.8.3))(@angular/compiler@20.0.0-rc.0)
       '@angular/material':
-        specifier: 20.0.0-next.10
-        version: 20.0.0-next.10(xotmywbppgelv3sapeuqfwdbqe)
+        specifier: 20.0.0-rc.0
+        version: 20.0.0-rc.0(s3hqhtlo3u2ktlkecz27drcsye)
       '@angular/ng-dev':
-        specifier: https://github.com/angular/dev-infra-private-ng-dev-builds.git#1125d8dbec5e787d9579e5b218b60a3be64c50fa
-        version: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/1125d8dbec5e787d9579e5b218b60a3be64c50fa(encoding@0.1.13)
+        specifier: https://github.com/angular/dev-infra-private-ng-dev-builds.git#14ea8ca5b4adfb73a1f4ad531116cd448379a0a3
+        version: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/14ea8ca5b4adfb73a1f4ad531116cd448379a0a3(encoding@0.1.13)
       '@angular/platform-browser':
-        specifier: 20.0.0-next.9
-        version: 20.0.0-next.9(@angular/animations@20.0.0-next.9(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))
+        specifier: 20.0.0-rc.0
+        version: 20.0.0-rc.0(@angular/animations@20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))
       '@angular/platform-server':
-        specifier: 20.0.0-next.9
-        version: 20.0.0-next.9(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/compiler@20.0.0-next.9)(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(@angular/platform-browser@20.0.0-next.9(@angular/animations@20.0.0-next.9(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0)))(rxjs@7.8.2)
+        specifier: 20.0.0-rc.0
+        version: 20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/compiler@20.0.0-rc.0)(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(@angular/platform-browser@20.0.0-rc.0(@angular/animations@20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)))(rxjs@7.8.2)
       '@angular/router':
-        specifier: 20.0.0-next.9
-        version: 20.0.0-next.9(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(@angular/platform-browser@20.0.0-next.9(@angular/animations@20.0.0-next.9(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0)))(rxjs@7.8.2)
+        specifier: 20.0.0-rc.0
+        version: 20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(@angular/platform-browser@20.0.0-rc.0(@angular/animations@20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)))(rxjs@7.8.2)
       '@angular/service-worker':
-        specifier: 20.0.0-next.9
-        version: 20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
+        specifier: 20.0.0-rc.0
+        version: 20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
       '@bazel/bazelisk':
         specifier: 1.26.0
         version: 1.26.0
@@ -443,7 +443,7 @@ importers:
         version: 4.3.0
       ng-packagr:
         specifier: 20.0.0-rc.0
-        version: 20.0.0-rc.0(@angular/compiler-cli@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(typescript@5.8.3))(tslib@2.8.1)(typescript@5.8.3)
+        version: 20.0.0-rc.0(@angular/compiler-cli@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(typescript@5.8.3))(tslib@2.8.1)(typescript@5.8.3)
       postcss:
         specifier: 8.5.3
         version: 8.5.3
@@ -527,23 +527,23 @@ importers:
         specifier: workspace:*
         version: link:../../angular_devkit/schematics
       '@angular/common':
-        specifier: 20.0.0-next.9
-        version: 20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
+        specifier: 20.0.0-rc.0
+        version: 20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
       '@angular/compiler':
-        specifier: 20.0.0-next.9
-        version: 20.0.0-next.9
+        specifier: 20.0.0-rc.0
+        version: 20.0.0-rc.0
       '@angular/core':
-        specifier: 20.0.0-next.9
-        version: 20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0)
+        specifier: 20.0.0-rc.0
+        version: 20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)
       '@angular/platform-browser':
-        specifier: 20.0.0-next.9
-        version: 20.0.0-next.9(@angular/animations@20.0.0-next.9(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))
+        specifier: 20.0.0-rc.0
+        version: 20.0.0-rc.0(@angular/animations@20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))
       '@angular/platform-server':
-        specifier: 20.0.0-next.9
-        version: 20.0.0-next.9(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/compiler@20.0.0-next.9)(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(@angular/platform-browser@20.0.0-next.9(@angular/animations@20.0.0-next.9(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0)))(rxjs@7.8.2)
+        specifier: 20.0.0-rc.0
+        version: 20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/compiler@20.0.0-rc.0)(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(@angular/platform-browser@20.0.0-rc.0(@angular/animations@20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)))(rxjs@7.8.2)
       '@angular/router':
-        specifier: 20.0.0-next.9
-        version: 20.0.0-next.9(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(@angular/platform-browser@20.0.0-next.9(@angular/animations@20.0.0-next.9(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0)))(rxjs@7.8.2)
+        specifier: 20.0.0-rc.0
+        version: 20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(@angular/platform-browser@20.0.0-rc.0(@angular/animations@20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)))(rxjs@7.8.2)
       '@schematics/angular':
         specifier: workspace:*
         version: link:../../schematics/angular
@@ -762,7 +762,7 @@ importers:
         version: 3.0.4
       ng-packagr:
         specifier: 20.0.0-rc.0
-        version: 20.0.0-rc.0(@angular/compiler-cli@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(typescript@5.8.3))(tslib@2.8.1)(typescript@5.8.3)
+        version: 20.0.0-rc.0(@angular/compiler-cli@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(typescript@5.8.3))(tslib@2.8.1)(typescript@5.8.3)
       undici:
         specifier: 7.8.0
         version: 7.8.0
@@ -856,11 +856,11 @@ importers:
         specifier: workspace:0.0.0-PLACEHOLDER
         version: link:../../angular_devkit/core
       '@angular/compiler':
-        specifier: 20.0.0-next.9
-        version: 20.0.0-next.9
+        specifier: 20.0.0-rc.0
+        version: 20.0.0-rc.0
       '@angular/compiler-cli':
-        specifier: 20.0.0-next.9
-        version: 20.0.0-next.9(@angular/compiler@20.0.0-next.9)(typescript@5.8.3)
+        specifier: 20.0.0-rc.0
+        version: 20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(typescript@5.8.3)
       typescript:
         specifier: 5.8.3
         version: 5.8.3
@@ -904,118 +904,118 @@ packages:
     resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
     engines: {node: '>=6.0.0'}
 
-  '@angular/animations@20.0.0-next.9':
-    resolution: {integrity: sha512-lO0KPbUiCTE/ODvYZMVms+2tu0yWbBB4ryI4HyFDVlMIIx7a/4jhQVoXQHuLseuw9Z8e9StO3RB7zbEsZjtT5g==}
-    engines: {node: ^20.11.1 || >=22.11.0}
+  '@angular/animations@20.0.0-rc.0':
+    resolution: {integrity: sha512-+vrpMe9NJ4QmW8iBh/cf/9sDHTOcJk7UW4jCf8y9s9HLk38MgUiCE0WAZz6RmnIrFGUCfewPzp9OsSf8duG4ww==}
+    engines: {node: ^20.11.1 || ^22.11.0 || >=24.0.0}
     peerDependencies:
-      '@angular/common': 20.0.0-next.9
-      '@angular/core': 20.0.0-next.9
+      '@angular/common': 20.0.0-rc.0
+      '@angular/core': 20.0.0-rc.0
 
-  '@angular/cdk@20.0.0-next.10':
-    resolution: {integrity: sha512-z72vwZnryFydG4lqElMXEP6ywdlq2kA+uA8pIH2vdneR7iyM3TdGfgeVqFB/S8JOoq0AeQ3A9K5l1Gm0dPDRgw==}
+  '@angular/cdk@20.0.0-rc.0':
+    resolution: {integrity: sha512-dvSacjyg5+6GCQiQpXIfguFcjrtR2R0uweUL8R9ZpGRi35jA0HqUYYY99asqyvhMS/G7F0etxRaPWu/d6sHpzg==}
     peerDependencies:
       '@angular/common': ^20.0.0-0 || ^20.1.0-0 || ^20.2.0-0 || ^20.3.0-0 || ^21.0.0-0
       '@angular/core': ^20.0.0-0 || ^20.1.0-0 || ^20.2.0-0 || ^20.3.0-0 || ^21.0.0-0
       rxjs: ^6.5.3 || ^7.4.0
 
-  '@angular/common@20.0.0-next.9':
-    resolution: {integrity: sha512-+V9Rbp6rbkJ7qx/ZGxrIdFb36X1TZSik9eXHVpcUncojdsg+je2mG7fvuCcuktkc2JRhv08TQnhOWi/BNuHQGA==}
-    engines: {node: ^20.11.1 || >=22.11.0}
+  '@angular/common@20.0.0-rc.0':
+    resolution: {integrity: sha512-aaEjRPtVv0DF3q6wPHRfephY1kMYTefmFH35z+hzcUVIrVyYQdT/LIUX3L+C9ITfYyLmFWlENf3HxmVUILfXAg==}
+    engines: {node: ^20.11.1 || ^22.11.0 || >=24.0.0}
     peerDependencies:
-      '@angular/core': 20.0.0-next.9
+      '@angular/core': 20.0.0-rc.0
       rxjs: ^6.5.3 || ^7.4.0
 
-  '@angular/compiler-cli@20.0.0-next.9':
-    resolution: {integrity: sha512-M0kAujqufiNnPt/PJoNj8c7to6epjPfwBYsUf0M6xi1jqjhXYqOJr4FUnatV5WkzjCdfVVf1YrwnGtZnKeUdDg==}
-    engines: {node: ^20.11.1 || >=22.11.0}
+  '@angular/compiler-cli@20.0.0-rc.0':
+    resolution: {integrity: sha512-0+nEw4JXRSdBPDJvtBwQlMYd3dVsM0XOzc1hpg+1E7RWIXsxGb2WE8gEvNjNdR0oE7kjdUWSOKlDMJfE3AWVLA==}
+    engines: {node: ^20.11.1 || ^22.11.0 || >=24.0.0}
     hasBin: true
     peerDependencies:
-      '@angular/compiler': 20.0.0-next.9
+      '@angular/compiler': 20.0.0-rc.0
       typescript: 5.8.3
 
-  '@angular/compiler@20.0.0-next.9':
-    resolution: {integrity: sha512-5f0fEokhjE4JU/d/I7dB1t/TOoGWOGftdqjswfniHij2s/UMdgXNSr7HcTk+AibZ3pT142PDSqtWDuYaG4zAtA==}
-    engines: {node: ^20.11.1 || >=22.11.0}
+  '@angular/compiler@20.0.0-rc.0':
+    resolution: {integrity: sha512-MJ2rJVQ/H6m9P3kIL9+wrwLnY2N48GM6vBhZ5+hVvtTPKLM0qcMwfTd/1SaG5e17tpg4mDWcr+pmnoGFgkXHvg==}
+    engines: {node: ^20.11.1 || ^22.11.0 || >=24.0.0}
 
-  '@angular/core@20.0.0-next.9':
-    resolution: {integrity: sha512-dTcDo1mp3A0hsAAajgMHjb8DX/MweUrPqJH660iXSCZVSM5MqFUBhazrJgySt31CKCPE5F3W+ZeISN8QCi9pcQ==}
-    engines: {node: ^20.11.1 || >=22.11.0}
+  '@angular/core@20.0.0-rc.0':
+    resolution: {integrity: sha512-RKIXYA129vdrRKrnac2XOgpWuYusWqwM4KsQ7b5qKIMZabJ0a2GoOlezT6+NhPkOSsyygYuZtaia5wzQeU1acA==}
+    engines: {node: ^20.11.1 || ^22.11.0 || >=24.0.0}
     peerDependencies:
-      '@angular/compiler': 20.0.0-next.9
+      '@angular/compiler': 20.0.0-rc.0
       rxjs: ^6.5.3 || ^7.4.0
       zone.js: ~0.15.0
     peerDependenciesMeta:
       '@angular/compiler':
         optional: true
 
-  '@angular/forms@20.0.0-next.9':
-    resolution: {integrity: sha512-ne7hBsqpyfpkSgkC7JRBrY5pnPEE+uIm9xYaDjsBzJHaJYGWkkF9eHdPmW7X13Lok8LRG7z24wxZlTeY/UNn0g==}
-    engines: {node: ^20.11.1 || >=22.11.0}
+  '@angular/forms@20.0.0-rc.0':
+    resolution: {integrity: sha512-RH95gg+WBBHS+m6y2XDTCCUZMg6Xih1Y4G91tnBdzSxV32evqyNDrSA9IxOhC6Ztxcd+2aLg1S1hsaiMbF2Alw==}
+    engines: {node: ^20.11.1 || ^22.11.0 || >=24.0.0}
     peerDependencies:
-      '@angular/common': 20.0.0-next.9
-      '@angular/core': 20.0.0-next.9
-      '@angular/platform-browser': 20.0.0-next.9
+      '@angular/common': 20.0.0-rc.0
+      '@angular/core': 20.0.0-rc.0
+      '@angular/platform-browser': 20.0.0-rc.0
       rxjs: ^6.5.3 || ^7.4.0
 
-  '@angular/localize@20.0.0-next.9':
-    resolution: {integrity: sha512-B3IS4i1ez4vpVe1VD9Gl/v0XXOvyNOhuXanGKGLCYfepBiDMy4YwMh7t5WfwYrGAPYO5kCaNFyEYot4p4tK8cw==}
-    engines: {node: ^20.11.1 || >=22.11.0}
+  '@angular/localize@20.0.0-rc.0':
+    resolution: {integrity: sha512-x6NmY9VCjSh0IPgTBF8SMIasy97ChOZfYgi1iDZwDNaAVug+jQm8XB3zC/SmDGN4yluTA9f2dvOMRhYVaenUNw==}
+    engines: {node: ^20.11.1 || ^22.11.0 || >=24.0.0}
     hasBin: true
     peerDependencies:
-      '@angular/compiler': 20.0.0-next.9
-      '@angular/compiler-cli': 20.0.0-next.9
+      '@angular/compiler': 20.0.0-rc.0
+      '@angular/compiler-cli': 20.0.0-rc.0
 
-  '@angular/material@20.0.0-next.10':
-    resolution: {integrity: sha512-V8YU1uSaHVd0LZAV4wSd3RbQ/tV+HSuTtu+RiJ8z7OEfdIt44NOIqQ1AzSHhiCTz8+BS61TDKrbDNUDJP2KX/g==}
+  '@angular/material@20.0.0-rc.0':
+    resolution: {integrity: sha512-Z6uaTLaTdfMoT2RnL8GB1na/n2/0d9Dk5h2wSsymyZFJz/U20btCQuor9Cvb/mUlrPs/uu/5SWDMpigRXlaomg==}
     peerDependencies:
-      '@angular/cdk': 20.0.0-next.10
+      '@angular/cdk': 20.0.0-rc.0
       '@angular/common': ^20.0.0-0 || ^20.1.0-0 || ^20.2.0-0 || ^20.3.0-0 || ^21.0.0-0
       '@angular/core': ^20.0.0-0 || ^20.1.0-0 || ^20.2.0-0 || ^20.3.0-0 || ^21.0.0-0
       '@angular/forms': ^20.0.0-0 || ^20.1.0-0 || ^20.2.0-0 || ^20.3.0-0 || ^21.0.0-0
       '@angular/platform-browser': ^20.0.0-0 || ^20.1.0-0 || ^20.2.0-0 || ^20.3.0-0 || ^21.0.0-0
       rxjs: ^6.5.3 || ^7.4.0
 
-  '@angular/ng-dev@https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/1125d8dbec5e787d9579e5b218b60a3be64c50fa':
-    resolution: {tarball: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/1125d8dbec5e787d9579e5b218b60a3be64c50fa}
-    version: 0.0.0-2c7bab7971084f3f1f6f72735099a9591ee5ebcb
+  '@angular/ng-dev@https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/14ea8ca5b4adfb73a1f4ad531116cd448379a0a3':
+    resolution: {tarball: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/14ea8ca5b4adfb73a1f4ad531116cd448379a0a3}
+    version: 0.0.0-030487ad792aad6856c48b2d1e699b0d96e11a7b
     hasBin: true
 
-  '@angular/platform-browser@20.0.0-next.9':
-    resolution: {integrity: sha512-gvyrm4o4UWn/VSiaJirI4hOf50bD6wF3QwpoP9NOG4YQyo5GjFQf6QPGVAfPgKjrp3eyTemVMhFq2yoVj9elNg==}
-    engines: {node: ^20.11.1 || >=22.11.0}
+  '@angular/platform-browser@20.0.0-rc.0':
+    resolution: {integrity: sha512-mu2g1PNJkGCJxyCA366nGQt3abX9jx+VTcPR1PRaLqY/sGzA42sYJTG/M74CIpfnx9Sxb1hD3/XCB3xbN5rPhw==}
+    engines: {node: ^20.11.1 || ^22.11.0 || >=24.0.0}
     peerDependencies:
-      '@angular/animations': 20.0.0-next.9
-      '@angular/common': 20.0.0-next.9
-      '@angular/core': 20.0.0-next.9
+      '@angular/animations': 20.0.0-rc.0
+      '@angular/common': 20.0.0-rc.0
+      '@angular/core': 20.0.0-rc.0
     peerDependenciesMeta:
       '@angular/animations':
         optional: true
 
-  '@angular/platform-server@20.0.0-next.9':
-    resolution: {integrity: sha512-+CxoXX5rh497SYwhCzCYV2OKboZ3iyHJgWDQTQ2PhdKrPb6iKRsTw7IcNj5CYKAPb/iFpQ4lBUNfYwRwirmoRg==}
-    engines: {node: ^20.11.1 || >=22.11.0}
+  '@angular/platform-server@20.0.0-rc.0':
+    resolution: {integrity: sha512-bIZMXPDAWVYhvlBUjo4HwqIdPHL/rcTmM2IIg3imdgPrva0yJmtyqILCVEHqZJuuQTpEIKJF3TLtF7DyVcHDRw==}
+    engines: {node: ^20.11.1 || ^22.11.0 || >=24.0.0}
     peerDependencies:
-      '@angular/common': 20.0.0-next.9
-      '@angular/compiler': 20.0.0-next.9
-      '@angular/core': 20.0.0-next.9
-      '@angular/platform-browser': 20.0.0-next.9
+      '@angular/common': 20.0.0-rc.0
+      '@angular/compiler': 20.0.0-rc.0
+      '@angular/core': 20.0.0-rc.0
+      '@angular/platform-browser': 20.0.0-rc.0
       rxjs: ^6.5.3 || ^7.4.0
 
-  '@angular/router@20.0.0-next.9':
-    resolution: {integrity: sha512-pkgcyBTfO1LIUHBfmnxQNDhWN6Gr7S4RNkvms9n/fj/athKEvAxSjwcqkrIFADkqOw0t2zRjdqEPIoHAouImHw==}
-    engines: {node: ^20.11.1 || >=22.11.0}
+  '@angular/router@20.0.0-rc.0':
+    resolution: {integrity: sha512-QkViBejo2xZwyGMHcM7NJh8QxhrAEeNq58Yoph6owzGb1/LMArVvZgoJAJC8HW3ojHN8xFUIfgxM4sFjjcw0dA==}
+    engines: {node: ^20.11.1 || ^22.11.0 || >=24.0.0}
     peerDependencies:
-      '@angular/common': 20.0.0-next.9
-      '@angular/core': 20.0.0-next.9
-      '@angular/platform-browser': 20.0.0-next.9
+      '@angular/common': 20.0.0-rc.0
+      '@angular/core': 20.0.0-rc.0
+      '@angular/platform-browser': 20.0.0-rc.0
       rxjs: ^6.5.3 || ^7.4.0
 
-  '@angular/service-worker@20.0.0-next.9':
-    resolution: {integrity: sha512-HCm5LaCp0C9fS9RsCCWcntNzVOyiE2WEbeyuDbAkrOJOahtPC1cgkixGgipOCc95ib6d3W8yIS7gwvH8tFt4qg==}
-    engines: {node: ^20.11.1 || >=22.11.0}
+  '@angular/service-worker@20.0.0-rc.0':
+    resolution: {integrity: sha512-YaG4KIxDW4gPAJXX0rRLDunaS8EC5+qUzd41oYxoNMQNdGPGYrmBPNs6zEObPKHk+ZvX/L6GJ5YNrWbPvuo/rg==}
+    engines: {node: ^20.11.1 || ^22.11.0 || >=24.0.0}
     hasBin: true
     peerDependencies:
-      '@angular/core': 20.0.0-next.9
+      '@angular/core': 20.0.0-rc.0
       rxjs: ^6.5.3 || ^7.4.0
 
   '@asamuzakjp/css-color@3.1.7':
@@ -8246,29 +8246,29 @@ snapshots:
       '@jridgewell/gen-mapping': 0.3.8
       '@jridgewell/trace-mapping': 0.3.25
 
-  '@angular/animations@20.0.0-next.9(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))':
+  '@angular/animations@20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))':
     dependencies:
-      '@angular/common': 20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
-      '@angular/core': 20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0)
+      '@angular/common': 20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
+      '@angular/core': 20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)
       tslib: 2.8.1
 
-  '@angular/cdk@20.0.0-next.10(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)':
+  '@angular/cdk@20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)':
     dependencies:
-      '@angular/common': 20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
-      '@angular/core': 20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0)
+      '@angular/common': 20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
+      '@angular/core': 20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)
       parse5: 7.3.0
       rxjs: 7.8.2
       tslib: 2.8.1
 
-  '@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)':
+  '@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)':
     dependencies:
-      '@angular/core': 20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0)
+      '@angular/core': 20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)
       rxjs: 7.8.2
       tslib: 2.8.1
 
-  '@angular/compiler-cli@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(typescript@5.8.3)':
+  '@angular/compiler-cli@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(typescript@5.8.3)':
     dependencies:
-      '@angular/compiler': 20.0.0-next.9
+      '@angular/compiler': 20.0.0-rc.0
       '@babel/core': 7.26.10
       '@jridgewell/sourcemap-codec': 1.5.0
       chokidar: 4.0.3
@@ -8281,30 +8281,30 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@angular/compiler@20.0.0-next.9':
+  '@angular/compiler@20.0.0-rc.0':
     dependencies:
       tslib: 2.8.1
 
-  '@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0)':
+  '@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)':
     dependencies:
       rxjs: 7.8.2
       tslib: 2.8.1
       zone.js: 0.15.0
     optionalDependencies:
-      '@angular/compiler': 20.0.0-next.9
+      '@angular/compiler': 20.0.0-rc.0
 
-  '@angular/forms@20.0.0-next.9(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(@angular/platform-browser@20.0.0-next.9(@angular/animations@20.0.0-next.9(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0)))(rxjs@7.8.2)':
+  '@angular/forms@20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(@angular/platform-browser@20.0.0-rc.0(@angular/animations@20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)))(rxjs@7.8.2)':
     dependencies:
-      '@angular/common': 20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
-      '@angular/core': 20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0)
-      '@angular/platform-browser': 20.0.0-next.9(@angular/animations@20.0.0-next.9(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))
+      '@angular/common': 20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
+      '@angular/core': 20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)
+      '@angular/platform-browser': 20.0.0-rc.0(@angular/animations@20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))
       rxjs: 7.8.2
       tslib: 2.8.1
 
-  '@angular/localize@20.0.0-next.9(@angular/compiler-cli@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(typescript@5.8.3))(@angular/compiler@20.0.0-next.9)':
+  '@angular/localize@20.0.0-rc.0(@angular/compiler-cli@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(typescript@5.8.3))(@angular/compiler@20.0.0-rc.0)':
     dependencies:
-      '@angular/compiler': 20.0.0-next.9
-      '@angular/compiler-cli': 20.0.0-next.9(@angular/compiler@20.0.0-next.9)(typescript@5.8.3)
+      '@angular/compiler': 20.0.0-rc.0
+      '@angular/compiler-cli': 20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(typescript@5.8.3)
       '@babel/core': 7.26.10
       '@types/babel__core': 7.20.5
       tinyglobby: 0.2.13
@@ -8312,17 +8312,17 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@angular/material@20.0.0-next.10(xotmywbppgelv3sapeuqfwdbqe)':
+  '@angular/material@20.0.0-rc.0(s3hqhtlo3u2ktlkecz27drcsye)':
     dependencies:
-      '@angular/cdk': 20.0.0-next.10(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
-      '@angular/common': 20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
-      '@angular/core': 20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0)
-      '@angular/forms': 20.0.0-next.9(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(@angular/platform-browser@20.0.0-next.9(@angular/animations@20.0.0-next.9(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0)))(rxjs@7.8.2)
-      '@angular/platform-browser': 20.0.0-next.9(@angular/animations@20.0.0-next.9(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))
+      '@angular/cdk': 20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
+      '@angular/common': 20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
+      '@angular/core': 20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)
+      '@angular/forms': 20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(@angular/platform-browser@20.0.0-rc.0(@angular/animations@20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)))(rxjs@7.8.2)
+      '@angular/platform-browser': 20.0.0-rc.0(@angular/animations@20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))
       rxjs: 7.8.2
       tslib: 2.8.1
 
-  '@angular/ng-dev@https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/1125d8dbec5e787d9579e5b218b60a3be64c50fa(encoding@0.1.13)':
+  '@angular/ng-dev@https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/14ea8ca5b4adfb73a1f4ad531116cd448379a0a3(encoding@0.1.13)':
     dependencies:
       '@google-cloud/spanner': 7.21.0(encoding@0.1.13)(supports-color@10.0.0)
       '@octokit/rest': 21.1.1
@@ -8339,35 +8339,35 @@ snapshots:
     transitivePeerDependencies:
       - encoding
 
-  '@angular/platform-browser@20.0.0-next.9(@angular/animations@20.0.0-next.9(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))':
+  '@angular/platform-browser@20.0.0-rc.0(@angular/animations@20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))':
     dependencies:
-      '@angular/common': 20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
-      '@angular/core': 20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0)
+      '@angular/common': 20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
+      '@angular/core': 20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)
       tslib: 2.8.1
     optionalDependencies:
-      '@angular/animations': 20.0.0-next.9(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))
+      '@angular/animations': 20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))
 
-  '@angular/platform-server@20.0.0-next.9(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/compiler@20.0.0-next.9)(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(@angular/platform-browser@20.0.0-next.9(@angular/animations@20.0.0-next.9(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0)))(rxjs@7.8.2)':
+  '@angular/platform-server@20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/compiler@20.0.0-rc.0)(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(@angular/platform-browser@20.0.0-rc.0(@angular/animations@20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)))(rxjs@7.8.2)':
     dependencies:
-      '@angular/common': 20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
-      '@angular/compiler': 20.0.0-next.9
-      '@angular/core': 20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0)
-      '@angular/platform-browser': 20.0.0-next.9(@angular/animations@20.0.0-next.9(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))
+      '@angular/common': 20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
+      '@angular/compiler': 20.0.0-rc.0
+      '@angular/core': 20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)
+      '@angular/platform-browser': 20.0.0-rc.0(@angular/animations@20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))
       rxjs: 7.8.2
       tslib: 2.8.1
       xhr2: 0.2.1
 
-  '@angular/router@20.0.0-next.9(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(@angular/platform-browser@20.0.0-next.9(@angular/animations@20.0.0-next.9(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0)))(rxjs@7.8.2)':
+  '@angular/router@20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(@angular/platform-browser@20.0.0-rc.0(@angular/animations@20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)))(rxjs@7.8.2)':
     dependencies:
-      '@angular/common': 20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
-      '@angular/core': 20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0)
-      '@angular/platform-browser': 20.0.0-next.9(@angular/animations@20.0.0-next.9(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))
+      '@angular/common': 20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
+      '@angular/core': 20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)
+      '@angular/platform-browser': 20.0.0-rc.0(@angular/animations@20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))
       rxjs: 7.8.2
       tslib: 2.8.1
 
-  '@angular/service-worker@20.0.0-next.9(@angular/core@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)':
+  '@angular/service-worker@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)':
     dependencies:
-      '@angular/core': 20.0.0-next.9(@angular/compiler@20.0.0-next.9)(rxjs@7.8.2)(zone.js@0.15.0)
+      '@angular/core': 20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)
       rxjs: 7.8.2
       tslib: 2.8.1
 
@@ -12553,7 +12553,7 @@ snapshots:
 
   extract-zip@2.0.1:
     dependencies:
-      debug: 4.3.4
+      debug: 4.4.0(supports-color@10.0.0)
       get-stream: 5.2.0
       yauzl: 2.10.0
     optionalDependencies:
@@ -14202,10 +14202,10 @@ snapshots:
 
   netmask@2.0.2: {}
 
-  ng-packagr@20.0.0-rc.0(@angular/compiler-cli@20.0.0-next.9(@angular/compiler@20.0.0-next.9)(typescript@5.8.3))(tslib@2.8.1)(typescript@5.8.3):
+  ng-packagr@20.0.0-rc.0(@angular/compiler-cli@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(typescript@5.8.3))(tslib@2.8.1)(typescript@5.8.3):
     dependencies:
       '@ampproject/remapping': 2.3.0
-      '@angular/compiler-cli': 20.0.0-next.9(@angular/compiler@20.0.0-next.9)(typescript@5.8.3)
+      '@angular/compiler-cli': 20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(typescript@5.8.3)
       '@rollup/plugin-json': 6.1.0(rollup@4.40.2)
       '@rollup/wasm-node': 4.40.2
       ajv: 8.17.1
diff --git a/tests/legacy-cli/e2e/ng-snapshot/package.json b/tests/legacy-cli/e2e/ng-snapshot/package.json
index b66330c9835d..3c43dd74c935 100644
--- a/tests/legacy-cli/e2e/ng-snapshot/package.json
+++ b/tests/legacy-cli/e2e/ng-snapshot/package.json
@@ -2,21 +2,21 @@
   "description": "snapshot versions of Angular for e2e testing",
   "private": true,
   "dependencies": {
-    "@angular/animations": "github:angular/animations-builds#d45d183a7862ed31228028a557cf28f2a919ad31",
-    "@angular/cdk": "github:angular/cdk-builds#1cb6c8ce50ec6c85ccfd865d961857a38716422d",
-    "@angular/common": "github:angular/common-builds#3a864e7851a8db81bc308149f7ebcb12f8a2f3de",
-    "@angular/compiler": "github:angular/compiler-builds#eba2a6d9cedb4e2b4324b0f7aa17b657120fbbaa",
-    "@angular/compiler-cli": "github:angular/compiler-cli-builds#97435f625b722fc5f05d56a5e1fa1b685a21c2f6",
-    "@angular/core": "github:angular/core-builds#5564ed93bb02afb234a47101a461401e1c86ba0e",
-    "@angular/forms": "github:angular/forms-builds#c4b3b1e47acfaf5866fbbd8429876f6347b37bd4",
-    "@angular/language-service": "github:angular/language-service-builds#8353535cbda057f52774653f380cd7122c94cc15",
-    "@angular/localize": "github:angular/localize-builds#9d7f4a23d1fb0c277085632d46d88b96c52f4396",
-    "@angular/material": "github:angular/material-builds#ef46fceae4f1b9cae2d3a8b45f652ffaccbf749e",
-    "@angular/material-moment-adapter": "github:angular/material-moment-adapter-builds#1db1d24bdbca33e4017e9b16b0a914f3eb2e2171",
-    "@angular/platform-browser": "github:angular/platform-browser-builds#0eebb01962f236bac9e55a521da424a1f2ce68de",
-    "@angular/platform-browser-dynamic": "github:angular/platform-browser-dynamic-builds#43610d0e7a39fcbb05f250b8f8f11df639b1ebdb",
-    "@angular/platform-server": "github:angular/platform-server-builds#ccdb4fb12c9a77a63f7dc235897608dd77474dec",
-    "@angular/router": "github:angular/router-builds#f7eb4edff552fe724c24740789dc0d88e7db020a",
-    "@angular/service-worker": "github:angular/service-worker-builds#d9b9d72a93b4f7c51ec1e8bf181bf6ceb2d37a4a"
+    "@angular/animations": "github:angular/animations-builds#2c2628d9c7fef0599dcc51c52beea24331eb3da4",
+    "@angular/cdk": "github:angular/cdk-builds#ff41eac39a2e97c4b4be178d24cbf1f5e38cc2b5",
+    "@angular/common": "github:angular/common-builds#19e618973b888c4e8694edb7bf61ccc6cb376f03",
+    "@angular/compiler": "github:angular/compiler-builds#2b978c6d1c31772b3fd829622ed2da7c436fd8dd",
+    "@angular/compiler-cli": "github:angular/compiler-cli-builds#b4c99df93e2593ec6160ffb04c46c29b35e5682a",
+    "@angular/core": "github:angular/core-builds#328d8aad5b4291f0472772bf6d98df1cefcda259",
+    "@angular/forms": "github:angular/forms-builds#149f321e14b0ac6e5be2c70fad50a312c4f5aff3",
+    "@angular/language-service": "github:angular/language-service-builds#35b78373bed13dda904ed36dce8493b2e6274477",
+    "@angular/localize": "github:angular/localize-builds#0e6cf5d88b933073d1792891ded501f4eb37d732",
+    "@angular/material": "github:angular/material-builds#435c3d79ce7209aa1829eb967487cac68ea0a1fa",
+    "@angular/material-moment-adapter": "github:angular/material-moment-adapter-builds#c23417698c2127ccdf71960aba75929c185041ac",
+    "@angular/platform-browser": "github:angular/platform-browser-builds#d721f1ffc0cdc97f6c12588355c0ed18eb99a892",
+    "@angular/platform-browser-dynamic": "github:angular/platform-browser-dynamic-builds#f4a141cef34306411c11f73b31ebdd833807212b",
+    "@angular/platform-server": "github:angular/platform-server-builds#8f2bcc358f7f5a3330e9f2e836dbd9b0602d968a",
+    "@angular/router": "github:angular/router-builds#cea8c97759e5a391e19f7037cb304947881ed2ce",
+    "@angular/service-worker": "github:angular/service-worker-builds#81b2ef92effd324d6f7322341e9d7ae3108c4146"
   }
 }

From f36237f7dee00fc188255834446d9a6d24668288 Mon Sep 17 00:00:00 2001
From: Alan Agius <17563226+alan-agius4@users.noreply.github.com>
Date: Mon, 12 May 2025 07:26:10 +0000
Subject: [PATCH 036/138] ci: refactor renovate config to use dev-infra preset

This change uses the dev-infra preset.

(cherry picked from commit 259f8c580a6509951a569b03dcd98b9aa7a3b0ae)
---
 renovate.json | 85 +--------------------------------------------------
 1 file changed, 1 insertion(+), 84 deletions(-)

diff --git a/renovate.json b/renovate.json
index 46266084e448..3214405915b3 100644
--- a/renovate.json
+++ b/renovate.json
@@ -1,73 +1,8 @@
 {
   "$schema": "https://docs.renovatebot.com/renovate-schema.json",
-  "rangeStrategy": "replace",
-  "semanticCommits": "enabled",
-  "semanticCommitType": "build",
-  "semanticCommitScope": "",
-  "separateMajorMinor": false,
-  "prHourlyLimit": 2,
-  "labels": ["target: minor", "action: merge"],
-  "timezone": "America/Tijuana",
-  "lockFileMaintenance": {
-    "enabled": true
-  },
-  "dependencyDashboard": true,
-  "schedule": ["after 10:00pm every weekday", "before 4:00am every weekday", "every weekend"],
-  "baseBranches": ["main"],
-  "ignoreDeps": ["@types/node", "build_bazel_rules_nodejs", "rules_pkg", "yarn"],
-  "includePaths": [
-    "WORKSPACE",
-    "package.json",
-    "**/package.json",
-    ".github/workflows/**/*.yml",
-    ".nvmrc"
-  ],
+  "extends": ["github>angular/dev-infra//renovate-presets/default.json5"],
   "ignorePaths": ["tests/legacy-cli/e2e/assets/**", "tests/schematics/update/packages/**"],
   "packageRules": [
-    {
-      "matchDepNames": ["node"],
-      "matchUpdateTypes": ["minor", "patch"]
-    },
-    {
-      "enabled": false,
-      "matchDepNames": ["node"],
-      "matchUpdateTypes": ["major"]
-    },
-    {
-      "matchPackageNames": ["quicktype-core"],
-      "schedule": ["before 4:00am on the first day of the month"]
-    },
-    {
-      "matchCurrentVersion": "/^[~^]?0\\.0\\.0-/",
-      "enabled": false
-    },
-    {
-      "groupName": "angular",
-      "followTag": "next",
-      "matchDepNames": ["/^@angular/.*/", "/angular/dev-infra/"]
-    },
-    {
-      "groupName": "babel",
-      "matchDepNames": ["/^@babel/.*/"]
-    },
-    {
-      "groupName": "bazel",
-      "matchDepNames": ["/^@bazel/.*/", "/^build_bazel.*/"]
-    },
-    {
-      "separateMinorPatch": true,
-      "matchPackageNames": ["typescript", "rxjs", "tslib"]
-    },
-    {
-      "enabled": false,
-      "matchPackageNames": ["typescript", "rxjs", "tslib"],
-      "matchUpdateTypes": ["major"]
-    },
-    {
-      "enabled": false,
-      "matchPackageNames": ["typescript"],
-      "matchUpdateTypes": ["minor"]
-    },
     {
       "matchFileNames": [
         "packages/angular_devkit/schematics_cli/blank/project-files/package.json",
@@ -76,27 +11,9 @@
       ],
       "matchPackageNames": ["*"],
       "groupName": "schematics dependencies",
-      "groupSlug": "all-schematics-dependencies",
       "lockFileMaintenance": {
         "enabled": false
       }
-    },
-    {
-      "matchFileNames": [
-        "!packages/angular_devkit/schematics_cli/blank/project-files/package.json",
-        "!packages/angular_devkit/schematics_cli/schematic/files/package.json",
-        "!packages/schematics/angular/utility/latest-versions/package.json"
-      ],
-      "matchPackageNames": ["*", "!/^@angular/.*/", "!/angular/dev-infra/"],
-      "matchUpdateTypes": ["minor", "patch"],
-      "groupName": "all non-major dependencies",
-      "groupSlug": "all-minor-patch"
-    },
-    {
-      "matchFileNames": [".github/workflows/scorecard.yml"],
-      "matchPackageNames": ["*"],
-      "groupName": "scorecard action dependencies",
-      "groupSlug": "scorecard-action"
     }
   ]
 }

From 0f8594f24d51f77dea2735d268c59a6ed0177023 Mon Sep 17 00:00:00 2001
From: Angular Robot <angular-robot@google.com>
Date: Mon, 12 May 2025 08:17:42 +0000
Subject: [PATCH 037/138] build: update pnpm to v9.15.9

See associated pull request for more information.

(cherry picked from commit adaa74222dad45d976f856012c73360711394916)
---
 package.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/package.json b/package.json
index 7fce14f3b6a7..e191f6820fa7 100644
--- a/package.json
+++ b/package.json
@@ -32,7 +32,7 @@
     "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",
     "npm": "Please use pnpm instead of NPM to install dependencies",

From 643dd85a18521a11a27c30606294b5f8dc6eaf3f Mon Sep 17 00:00:00 2001
From: Angular Robot <angular-robot@google.com>
Date: Mon, 12 May 2025 08:17:12 +0000
Subject: [PATCH 038/138] build: update all non-major dependencies

See associated pull request for more information.

(cherry picked from commit 71d6c72e616143f866cee4de0401c21535c61cca)
---
 .bazelversion                                 |   2 +-
 package.json                                  |  10 +-
 packages/angular/build/package.json           |   4 +-
 packages/angular/cli/package.json             |   2 +-
 .../angular_devkit/build_angular/package.json |   4 +-
 .../schematics_cli/package.json               |   2 +-
 pnpm-lock.yaml                                | 340 +++++++-----------
 7 files changed, 134 insertions(+), 230 deletions(-)

diff --git a/.bazelversion b/.bazelversion
index 93c8ddab9fef..e8be68404bcb 100644
--- a/.bazelversion
+++ b/.bazelversion
@@ -1 +1 @@
-7.6.0
+7.6.1
diff --git a/package.json b/package.json
index e191f6820fa7..a0e77de8d5cc 100644
--- a/package.json
+++ b/package.json
@@ -103,12 +103,12 @@
     "esbuild": "0.25.4",
     "esbuild-wasm": "0.25.4",
     "eslint": "9.26.0",
-    "eslint-config-prettier": "10.1.2",
+    "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",
@@ -131,17 +131,17 @@
     "prettier": "^3.0.0",
     "protractor": "~7.0.0",
     "puppeteer": "18.2.1",
-    "quicktype-core": "23.1.3",
+    "quicktype-core": "23.1.4",
     "rollup": "4.40.2",
     "rollup-license-plugin": "~3.0.1",
     "semver": "7.7.1",
-    "shelljs": "^0.9.0",
+    "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/package.json b/packages/angular/build/package.json
index d1064d8000ed..207d14c6436e 100644
--- a/packages/angular/build/package.json
+++ b/packages/angular/build/package.json
@@ -23,7 +23,7 @@
     "@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",
     "browserslist": "^4.23.0",
@@ -38,7 +38,7 @@
     "picomatch": "4.0.2",
     "piscina": "5.0.0",
     "rollup": "4.40.2",
-    "sass": "1.87.0",
+    "sass": "1.88.0",
     "semver": "7.7.1",
     "source-map-support": "0.5.21",
     "tinyglobby": "0.2.13",
diff --git a/packages/angular/cli/package.json b/packages/angular/cli/package.json
index abee2e8b2a96..7c42298590ac 100644
--- a/packages/angular/cli/package.json
+++ b/packages/angular/cli/package.json
@@ -25,7 +25,7 @@
     "@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",
+    "@inquirer/prompts": "7.5.1",
     "@listr2/prompt-adapter-inquirer": "2.0.22",
     "@schematics/angular": "workspace:0.0.0-PLACEHOLDER",
     "@yarnpkg/lockfile": "1.1.0",
diff --git a/packages/angular_devkit/build_angular/package.json b/packages/angular_devkit/build_angular/package.json
index feb1dce8875c..0ca23bc40605 100644
--- a/packages/angular_devkit/build_angular/package.json
+++ b/packages/angular_devkit/build_angular/package.json
@@ -48,7 +48,7 @@
     "postcss-loader": "8.1.1",
     "resolve-url-loader": "5.0.0",
     "rxjs": "7.8.2",
-    "sass": "1.87.0",
+    "sass": "1.88.0",
     "sass-loader": "16.0.5",
     "semver": "7.7.1",
     "source-map-loader": "5.0.0",
@@ -70,7 +70,7 @@
     "@web/test-runner": "0.20.1",
     "browser-sync": "3.0.4",
     "ng-packagr": "20.0.0-rc.0",
-    "undici": "7.8.0"
+    "undici": "7.9.0"
   },
   "peerDependencies": {
     "@angular/core": "0.0.0-ANGULAR-FW-PEER-DEP",
diff --git a/packages/angular_devkit/schematics_cli/package.json b/packages/angular_devkit/schematics_cli/package.json
index 12fc1af514d2..fc4ecb8a6fa9 100644
--- a/packages/angular_devkit/schematics_cli/package.json
+++ b/packages/angular_devkit/schematics_cli/package.json
@@ -18,7 +18,7 @@
   "dependencies": {
     "@angular-devkit/core": "workspace:0.0.0-PLACEHOLDER",
     "@angular-devkit/schematics": "workspace:0.0.0-PLACEHOLDER",
-    "@inquirer/prompts": "7.5.0",
+    "@inquirer/prompts": "7.5.1",
     "ansi-colors": "4.1.3",
     "yargs-parser": "21.1.1"
   }
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 087343e5431b..0810d0476e3b 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -186,8 +186,8 @@ importers:
         specifier: 9.26.0
         version: 9.26.0(jiti@1.21.7)
       eslint-config-prettier:
-        specifier: 10.1.2
-        version: 10.1.2(eslint@9.26.0(jiti@1.21.7))
+        specifier: 10.1.5
+        version: 10.1.5(eslint@9.26.0(jiti@1.21.7))
       eslint-plugin-header:
         specifier: 3.1.1
         version: 3.1.1(eslint@9.26.0(jiti@1.21.7))
@@ -201,8 +201,8 @@ importers:
         specifier: 3.3.3
         version: 3.3.3
       globals:
-        specifier: 16.0.0
-        version: 16.0.0
+        specifier: 16.1.0
+        version: 16.1.0
       http-proxy:
         specifier: ^1.18.1
         version: 1.18.1(debug@4.4.0)
@@ -264,8 +264,8 @@ importers:
         specifier: 18.2.1
         version: 18.2.1(encoding@0.1.13)
       quicktype-core:
-        specifier: 23.1.3
-        version: 23.1.3(encoding@0.1.13)
+        specifier: 23.1.4
+        version: 23.1.4(encoding@0.1.13)
       rollup:
         specifier: 4.40.2
         version: 4.40.2
@@ -282,8 +282,8 @@ importers:
         specifier: 7.7.1
         version: 7.7.1
       shelljs:
-        specifier: ^0.9.0
-        version: 0.9.2
+        specifier: ^0.10.0
+        version: 0.10.0
       source-map-support:
         specifier: 0.5.21
         version: 0.5.21
@@ -300,8 +300,8 @@ importers:
         specifier: 5.8.3
         version: 5.8.3
       undici:
-        specifier: 7.8.0
-        version: 7.8.0
+        specifier: 7.9.0
+        version: 7.9.0
       unenv:
         specifier: ^1.10.0
         version: 1.10.0
@@ -342,7 +342,7 @@ importers:
         version: 7.8.2
       vitest:
         specifier: 3.1.3
-        version: 3.1.3(@types/node@20.17.44)(jiti@1.21.7)(jsdom@26.1.0)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1)
+        version: 3.1.3(@types/node@20.17.44)(jiti@1.21.7)(jsdom@26.1.0)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1)
 
   packages/angular/build:
     dependencies:
@@ -362,11 +362,11 @@ importers:
         specifier: 7.24.7
         version: 7.24.7
       '@inquirer/confirm':
-        specifier: 5.1.9
-        version: 5.1.9(@types/node@20.17.44)
+        specifier: 5.1.10
+        version: 5.1.10(@types/node@20.17.44)
       '@vitejs/plugin-basic-ssl':
         specifier: 2.0.0
-        version: 2.0.0(vite@6.3.5(@types/node@20.17.44)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1))
+        version: 2.0.0(vite@6.3.5(@types/node@20.17.44)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1))
       beasties:
         specifier: 0.3.3
         version: 0.3.3
@@ -407,8 +407,8 @@ importers:
         specifier: 4.40.2
         version: 4.40.2
       sass:
-        specifier: 1.87.0
-        version: 1.87.0
+        specifier: 1.88.0
+        version: 1.88.0
       semver:
         specifier: 7.7.1
         version: 7.7.1
@@ -420,7 +420,7 @@ importers:
         version: 0.2.13
       vite:
         specifier: 6.3.5
-        version: 6.3.5(@types/node@20.17.44)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1)
+        version: 6.3.5(@types/node@20.17.44)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1)
       watchpack:
         specifier: 2.4.2
         version: 2.4.2
@@ -452,7 +452,7 @@ importers:
         version: 7.8.2
       vitest:
         specifier: 3.1.3
-        version: 3.1.3(@types/node@20.17.44)(jiti@1.21.7)(jsdom@26.1.0)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1)
+        version: 3.1.3(@types/node@20.17.44)(jiti@1.21.7)(jsdom@26.1.0)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1)
 
   packages/angular/cli:
     dependencies:
@@ -466,11 +466,11 @@ importers:
         specifier: workspace:0.0.0-PLACEHOLDER
         version: link:../../angular_devkit/schematics
       '@inquirer/prompts':
-        specifier: 7.5.0
-        version: 7.5.0(@types/node@20.17.44)
+        specifier: 7.5.1
+        version: 7.5.1(@types/node@20.17.44)
       '@listr2/prompt-adapter-inquirer':
         specifier: 2.0.22
-        version: 2.0.22(@inquirer/prompts@7.5.0(@types/node@20.17.44))
+        version: 2.0.22(@inquirer/prompts@7.5.1(@types/node@20.17.44))
       '@schematics/angular':
         specifier: workspace:0.0.0-PLACEHOLDER
         version: link:../../schematics/angular
@@ -631,7 +631,7 @@ importers:
         version: link:../../ngtools/webpack
       '@vitejs/plugin-basic-ssl':
         specifier: 2.0.0
-        version: 2.0.0(vite@6.3.5(@types/node@20.17.44)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1))
+        version: 2.0.0(vite@6.3.5(@types/node@20.17.44)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1))
       ansi-colors:
         specifier: 4.1.3
         version: 4.1.3
@@ -708,11 +708,11 @@ importers:
         specifier: 7.8.2
         version: 7.8.2
       sass:
-        specifier: 1.87.0
-        version: 1.87.0
+        specifier: 1.88.0
+        version: 1.88.0
       sass-loader:
         specifier: 16.0.5
-        version: 16.0.5(sass@1.87.0)(webpack@5.99.8(esbuild@0.25.4))
+        version: 16.0.5(sass@1.88.0)(webpack@5.99.8(esbuild@0.25.4))
       semver:
         specifier: 7.7.1
         version: 7.7.1
@@ -764,8 +764,8 @@ importers:
         specifier: 20.0.0-rc.0
         version: 20.0.0-rc.0(@angular/compiler-cli@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(typescript@5.8.3))(tslib@2.8.1)(typescript@5.8.3)
       undici:
-        specifier: 7.8.0
-        version: 7.8.0
+        specifier: 7.9.0
+        version: 7.9.0
 
   packages/angular_devkit/build_webpack:
     dependencies:
@@ -841,8 +841,8 @@ importers:
         specifier: workspace:0.0.0-PLACEHOLDER
         version: link:../schematics
       '@inquirer/prompts':
-        specifier: 7.5.0
-        version: 7.5.0(@types/node@20.17.44)
+        specifier: 7.5.1
+        version: 7.5.1(@types/node@20.17.44)
       ansi-colors:
         specifier: 4.1.3
         version: 4.1.3
@@ -1824,8 +1824,8 @@ packages:
     resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==}
     engines: {node: '>=18.18'}
 
-  '@inquirer/checkbox@4.1.5':
-    resolution: {integrity: sha512-swPczVU+at65xa5uPfNP9u3qx/alNwiaykiI/ExpsmMSQW55trmZcwhYWzw/7fj+n6Q8z1eENvR7vFfq9oPSAQ==}
+  '@inquirer/checkbox@4.1.6':
+    resolution: {integrity: sha512-62u896rWCtKKE43soodq5e/QcRsA22I+7/4Ov7LESWnKRO6BVo2A1DFLDmXL9e28TB0CfHc3YtkbPm7iwajqkg==}
     engines: {node: '>=18'}
     peerDependencies:
       '@types/node': '>=18'
@@ -1833,8 +1833,8 @@ packages:
       '@types/node':
         optional: true
 
-  '@inquirer/confirm@5.1.9':
-    resolution: {integrity: sha512-NgQCnHqFTjF7Ys2fsqK2WtnA8X1kHyInyG+nMIuHowVTIgIuS10T4AznI/PvbqSpJqjCUqNBlKGh1v3bwLFL4w==}
+  '@inquirer/confirm@5.1.10':
+    resolution: {integrity: sha512-FxbQ9giWxUWKUk2O5XZ6PduVnH2CZ/fmMKMBkH71MHJvWr7WL5AHKevhzF1L5uYWB2P548o1RzVxrNd3dpmk6g==}
     engines: {node: '>=18'}
     peerDependencies:
       '@types/node': '>=18'
@@ -1842,8 +1842,8 @@ packages:
       '@types/node':
         optional: true
 
-  '@inquirer/core@10.1.10':
-    resolution: {integrity: sha512-roDaKeY1PYY0aCqhRmXihrHjoSW2A00pV3Ke5fTpMCkzcGF64R8e0lw3dK+eLEHwS4vB5RnW1wuQmvzoRul8Mw==}
+  '@inquirer/core@10.1.11':
+    resolution: {integrity: sha512-BXwI/MCqdtAhzNQlBEFE7CEflhPkl/BqvAuV/aK6lW3DClIfYVDWPP/kXuXHtBWC7/EEbNqd/1BGq2BGBBnuxw==}
     engines: {node: '>=18'}
     peerDependencies:
       '@types/node': '>=18'
@@ -1851,8 +1851,8 @@ packages:
       '@types/node':
         optional: true
 
-  '@inquirer/editor@4.2.10':
-    resolution: {integrity: sha512-5GVWJ+qeI6BzR6TIInLP9SXhWCEcvgFQYmcRG6d6RIlhFjM5TyG18paTGBgRYyEouvCmzeco47x9zX9tQEofkw==}
+  '@inquirer/editor@4.2.11':
+    resolution: {integrity: sha512-YoZr0lBnnLFPpfPSNsQ8IZyKxU47zPyVi9NLjCWtna52//M/xuL0PGPAxHxxYhdOhnvY2oBafoM+BI5w/JK7jw==}
     engines: {node: '>=18'}
     peerDependencies:
       '@types/node': '>=18'
@@ -1860,8 +1860,8 @@ packages:
       '@types/node':
         optional: true
 
-  '@inquirer/expand@4.0.12':
-    resolution: {integrity: sha512-jV8QoZE1fC0vPe6TnsOfig+qwu7Iza1pkXoUJ3SroRagrt2hxiL+RbM432YAihNR7m7XnU0HWl/WQ35RIGmXHw==}
+  '@inquirer/expand@4.0.13':
+    resolution: {integrity: sha512-HgYNWuZLHX6q5y4hqKhwyytqAghmx35xikOGY3TcgNiElqXGPas24+UzNPOwGUZa5Dn32y25xJqVeUcGlTv+QQ==}
     engines: {node: '>=18'}
     peerDependencies:
       '@types/node': '>=18'
@@ -1873,8 +1873,8 @@ packages:
     resolution: {integrity: sha512-eOg92lvrn/aRUqbxRyvpEWnrvRuTYRifixHkYVpJiygTgVSBIHDqLh0SrMQXkafvULg3ck11V7xvR+zcgvpHFw==}
     engines: {node: '>=18'}
 
-  '@inquirer/input@4.1.9':
-    resolution: {integrity: sha512-mshNG24Ij5KqsQtOZMgj5TwEjIf+F2HOESk6bjMwGWgcH5UBe8UoljwzNFHqdMbGYbgAf6v2wU/X9CAdKJzgOA==}
+  '@inquirer/input@4.1.10':
+    resolution: {integrity: sha512-kV3BVne3wJ+j6reYQUZi/UN9NZGZLxgc/tfyjeK3mrx1QI7RXPxGp21IUTv+iVHcbP4ytZALF8vCHoxyNSC6qg==}
     engines: {node: '>=18'}
     peerDependencies:
       '@types/node': '>=18'
@@ -1882,8 +1882,8 @@ packages:
       '@types/node':
         optional: true
 
-  '@inquirer/number@3.0.12':
-    resolution: {integrity: sha512-7HRFHxbPCA4e4jMxTQglHJwP+v/kpFsCf2szzfBHy98Wlc3L08HL76UDiA87TOdX5fwj2HMOLWqRWv9Pnn+Z5Q==}
+  '@inquirer/number@3.0.13':
+    resolution: {integrity: sha512-IrLezcg/GWKS8zpKDvnJ/YTflNJdG0qSFlUM/zNFsdi4UKW/CO+gaJpbMgQ20Q58vNKDJbEzC6IebdkprwL6ew==}
     engines: {node: '>=18'}
     peerDependencies:
       '@types/node': '>=18'
@@ -1891,8 +1891,8 @@ packages:
       '@types/node':
         optional: true
 
-  '@inquirer/password@4.0.12':
-    resolution: {integrity: sha512-FlOB0zvuELPEbnBYiPaOdJIaDzb2PmJ7ghi/SVwIHDDSQ2K4opGBkF+5kXOg6ucrtSUQdLhVVY5tycH0j0l+0g==}
+  '@inquirer/password@4.0.13':
+    resolution: {integrity: sha512-NN0S/SmdhakqOTJhDwOpeBEEr8VdcYsjmZHDb0rblSh2FcbXQOr+2IApP7JG4WE3sxIdKytDn4ed3XYwtHxmJQ==}
     engines: {node: '>=18'}
     peerDependencies:
       '@types/node': '>=18'
@@ -1900,8 +1900,8 @@ packages:
       '@types/node':
         optional: true
 
-  '@inquirer/prompts@7.5.0':
-    resolution: {integrity: sha512-tk8Bx7l5AX/CR0sVfGj3Xg6v7cYlFBkEahH+EgBB+cZib6Fc83dwerTbzj7f2+qKckjIUGsviWRI1d7lx6nqQA==}
+  '@inquirer/prompts@7.5.1':
+    resolution: {integrity: sha512-5AOrZPf2/GxZ+SDRZ5WFplCA2TAQgK3OYrXCYmJL5NaTu4ECcoWFlfUZuw7Es++6Njv7iu/8vpYJhuzxUH76Vg==}
     engines: {node: '>=18'}
     peerDependencies:
       '@types/node': '>=18'
@@ -1909,8 +1909,8 @@ packages:
       '@types/node':
         optional: true
 
-  '@inquirer/rawlist@4.1.0':
-    resolution: {integrity: sha512-6ob45Oh9pXmfprKqUiEeMz/tjtVTFQTgDDz1xAMKMrIvyrYjAmRbQZjMJfsictlL4phgjLhdLu27IkHNnNjB7g==}
+  '@inquirer/rawlist@4.1.1':
+    resolution: {integrity: sha512-VBUC0jPN2oaOq8+krwpo/mf3n/UryDUkKog3zi+oIi8/e5hykvdntgHUB9nhDM78RubiyR1ldIOfm5ue+2DeaQ==}
     engines: {node: '>=18'}
     peerDependencies:
       '@types/node': '>=18'
@@ -1918,8 +1918,8 @@ packages:
       '@types/node':
         optional: true
 
-  '@inquirer/search@3.0.12':
-    resolution: {integrity: sha512-H/kDJA3kNlnNIjB8YsaXoQI0Qccgf0Na14K1h8ExWhNmUg2E941dyFPrZeugihEa9AZNW5NdsD/NcvUME83OPQ==}
+  '@inquirer/search@3.0.13':
+    resolution: {integrity: sha512-9g89d2c5Izok/Gw/U7KPC3f9kfe5rA1AJ24xxNZG0st+vWekSk7tB9oE+dJv5JXd0ZSijomvW0KPMoBd8qbN4g==}
     engines: {node: '>=18'}
     peerDependencies:
       '@types/node': '>=18'
@@ -1927,8 +1927,8 @@ packages:
       '@types/node':
         optional: true
 
-  '@inquirer/select@4.2.0':
-    resolution: {integrity: sha512-KkXQ4aSySWimpV4V/TUJWdB3tdfENZUU765GjOIZ0uPwdbGIG6jrxD4dDf1w68uP+DVtfNhr1A92B+0mbTZ8FA==}
+  '@inquirer/select@4.2.1':
+    resolution: {integrity: sha512-gt1Kd5XZm+/ddemcT3m23IP8aD8rC9drRckWoP/1f7OL46Yy2FGi8DSmNjEjQKtPl6SV96Kmjbl6p713KXJ/Jg==}
     engines: {node: '>=18'}
     peerDependencies:
       '@types/node': '>=18'
@@ -3948,10 +3948,6 @@ packages:
   cross-fetch@4.1.0:
     resolution: {integrity: sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==}
 
-  cross-spawn@6.0.6:
-    resolution: {integrity: sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==}
-    engines: {node: '>=4.8'}
-
   cross-spawn@7.0.6:
     resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
     engines: {node: '>= 8'}
@@ -4400,8 +4396,8 @@ packages:
     engines: {node: '>=6.0'}
     hasBin: true
 
-  eslint-config-prettier@10.1.2:
-    resolution: {integrity: sha512-Epgp/EofAUeEpIdZkW60MHKvPyru1ruQJxPL+WIycnaPApuseK0Zpkrh/FwL9oIpQvIhJwV7ptOy0DWUjTlCiA==}
+  eslint-config-prettier@10.1.5:
+    resolution: {integrity: sha512-zc1UmCpNltmVY34vuLRV61r1K27sWuX39E+uyUnY8xS2Bex88VV9cugG+UZbRSRGtGyFboj+D8JODyme1plMpw==}
     hasBin: true
     peerDependencies:
       eslint: '>=7.0.0'
@@ -4535,10 +4531,6 @@ packages:
     resolution: {integrity: sha512-l19WpE2m9hSuyP06+FbuUUf1G+R0SFLrtQfbRb9PRr+oimOfxQhgGCbVaXg5IvZyyTThJsxh6L/srkMiCeBPDA==}
     engines: {node: '>=18.0.0'}
 
-  execa@1.0.0:
-    resolution: {integrity: sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==}
-    engines: {node: '>=6'}
-
   execa@5.1.1:
     resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
     engines: {node: '>=10'}
@@ -4805,10 +4797,6 @@ packages:
     resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
     engines: {node: '>= 0.4'}
 
-  get-stream@4.1.0:
-    resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==}
-    engines: {node: '>=6'}
-
   get-stream@5.2.0:
     resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==}
     engines: {node: '>=8'}
@@ -4855,8 +4843,8 @@ packages:
     resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==}
     engines: {node: '>=18'}
 
-  globals@16.0.0:
-    resolution: {integrity: sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A==}
+  globals@16.1.0:
+    resolution: {integrity: sha512-aibexHNbb/jiUSObBgpHLj+sIuUmJnYcgXBlrfsiDZ9rt4aF2TFRbyLgZ2iFQuVZ1K5Mx3FVkbKRSgKrbK3K2g==}
     engines: {node: '>=18'}
 
   globalthis@1.0.4:
@@ -5144,10 +5132,6 @@ packages:
     resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==}
     engines: {node: '>= 0.4'}
 
-  interpret@1.4.0:
-    resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==}
-    engines: {node: '>= 0.10'}
-
   ip-address@9.0.5:
     resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==}
     engines: {node: '>= 12'}
@@ -5334,10 +5318,6 @@ packages:
   is-stream-ended@0.1.4:
     resolution: {integrity: sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw==}
 
-  is-stream@1.1.0:
-    resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==}
-    engines: {node: '>=0.10.0'}
-
   is-stream@2.0.1:
     resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
     engines: {node: '>=8'}
@@ -6080,9 +6060,6 @@ packages:
       tailwindcss:
         optional: true
 
-  nice-try@1.0.5:
-    resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==}
-
   node-addon-api@6.1.0:
     resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==}
 
@@ -6176,10 +6153,6 @@ packages:
     resolution: {integrity: sha512-LeVMZBBVy+oQb5R6FDV9OlJCcWDU+al10oKpe+nsvcHnG24Z3uM3SvJYKfGJlfGjVU8v9liejCrUR/M5HO5NEQ==}
     engines: {node: ^18.17.0 || >=20.5.0}
 
-  npm-run-path@2.0.2:
-    resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==}
-    engines: {node: '>=4'}
-
   npm-run-path@4.0.1:
     resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
     engines: {node: '>=8'}
@@ -6466,10 +6439,6 @@ packages:
   path-is-inside@1.0.2:
     resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==}
 
-  path-key@2.0.1:
-    resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==}
-    engines: {node: '>=4'}
-
   path-key@3.1.1:
     resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
     engines: {node: '>=8'}
@@ -6765,8 +6734,8 @@ packages:
   quick-format-unescaped@4.0.4:
     resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==}
 
-  quicktype-core@23.1.3:
-    resolution: {integrity: sha512-0wL9YYx6SvfI3sd7e+mr1Ha514CXnOKdNJgHSiccMqoHfGumrChmVkQhD81HQHztdLQq1k+HMmACzFgfDJJLAA==}
+  quicktype-core@23.1.4:
+    resolution: {integrity: sha512-Yp+y96V2T72bFk5AXqOqTy5iq3bAOeQiVxA72BKYacmXC3TtRxf2wSl4I3gVdCmqZ0JxnQPoqazq31DTn55ROg==}
 
   randombytes@2.1.0:
     resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==}
@@ -6810,10 +6779,6 @@ packages:
     resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==}
     engines: {node: '>= 12.13.0'}
 
-  rechoir@0.6.2:
-    resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==}
-    engines: {node: '>= 0.10'}
-
   reflect-metadata@0.2.2:
     resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==}
 
@@ -7015,8 +6980,8 @@ packages:
       webpack:
         optional: true
 
-  sass@1.87.0:
-    resolution: {integrity: sha512-d0NoFH4v6SjEK7BoX810Jsrhj7IQSYHAHLi/iSpgqKc7LaIDshFRlSg5LOymf9FqQhxEHs2W5ZQXlvy0KD45Uw==}
+  sass@1.88.0:
+    resolution: {integrity: sha512-sF6TWQqjFvr4JILXzG4ucGOLELkESHL+I5QJhh7CNaE+Yge0SI+ehCatsXhJ7ymU1hAFcIS3/PBpjdIbXoyVbg==}
     engines: {node: '>=14.0.0'}
     hasBin: true
 
@@ -7121,18 +7086,10 @@ packages:
     resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==}
     engines: {node: '>=8'}
 
-  shebang-command@1.2.0:
-    resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==}
-    engines: {node: '>=0.10.0'}
-
   shebang-command@2.0.0:
     resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
     engines: {node: '>=8'}
 
-  shebang-regex@1.0.0:
-    resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==}
-    engines: {node: '>=0.10.0'}
-
   shebang-regex@3.0.0:
     resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
     engines: {node: '>=8'}
@@ -7141,10 +7098,9 @@ packages:
     resolution: {integrity: sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==}
     engines: {node: '>= 0.4'}
 
-  shelljs@0.9.2:
-    resolution: {integrity: sha512-S3I64fEiKgTZzKCC46zT/Ib9meqofLrQVbpSswtjFfAVDW+AZ54WTnAM/3/yENoxz/V1Cy6u3kiiEbQ4DNphvw==}
+  shelljs@0.10.0:
+    resolution: {integrity: sha512-Jex+xw5Mg2qMZL3qnzXIfaxEtBaC4n7xifqaqtrZDdlheR70OGkydrPJWT0V1cA1k3nanC86x9FwAmQl6w3Klw==}
     engines: {node: '>=18'}
-    hasBin: true
 
   side-channel-list@1.0.0:
     resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==}
@@ -7388,10 +7344,6 @@ packages:
     resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
     engines: {node: '>=4'}
 
-  strip-eof@1.0.0:
-    resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==}
-    engines: {node: '>=0.10.0'}
-
   strip-final-newline@2.0.0:
     resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
     engines: {node: '>=6'}
@@ -7701,8 +7653,8 @@ packages:
   undici-types@6.19.8:
     resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==}
 
-  undici@7.8.0:
-    resolution: {integrity: sha512-vFv1GA99b7eKO1HG/4RPu2Is3FBTWBrmzqzO0mz+rLxN3yXkE4mqRcb8g8fHxzX4blEysrNZLqg5RbJLqX5buA==}
+  undici@7.9.0:
+    resolution: {integrity: sha512-e696y354tf5cFZPXsF26Yg+5M63+5H3oE6Vtkh2oqbvsE2Oe7s2nIbcQh5lmG7Lp/eS29vJtTpw9+p6PX0qNSg==}
     engines: {node: '>=20.18.1'}
 
   unenv@1.10.0:
@@ -9324,9 +9276,9 @@ snapshots:
 
   '@humanwhocodes/retry@0.4.3': {}
 
-  '@inquirer/checkbox@4.1.5(@types/node@20.17.44)':
+  '@inquirer/checkbox@4.1.6(@types/node@20.17.44)':
     dependencies:
-      '@inquirer/core': 10.1.10(@types/node@20.17.44)
+      '@inquirer/core': 10.1.11(@types/node@20.17.44)
       '@inquirer/figures': 1.0.11
       '@inquirer/type': 3.0.6(@types/node@20.17.44)
       ansi-escapes: 4.3.2
@@ -9334,14 +9286,14 @@ snapshots:
     optionalDependencies:
       '@types/node': 20.17.44
 
-  '@inquirer/confirm@5.1.9(@types/node@20.17.44)':
+  '@inquirer/confirm@5.1.10(@types/node@20.17.44)':
     dependencies:
-      '@inquirer/core': 10.1.10(@types/node@20.17.44)
+      '@inquirer/core': 10.1.11(@types/node@20.17.44)
       '@inquirer/type': 3.0.6(@types/node@20.17.44)
     optionalDependencies:
       '@types/node': 20.17.44
 
-  '@inquirer/core@10.1.10(@types/node@20.17.44)':
+  '@inquirer/core@10.1.11(@types/node@20.17.44)':
     dependencies:
       '@inquirer/figures': 1.0.11
       '@inquirer/type': 3.0.6(@types/node@20.17.44)
@@ -9354,17 +9306,17 @@ snapshots:
     optionalDependencies:
       '@types/node': 20.17.44
 
-  '@inquirer/editor@4.2.10(@types/node@20.17.44)':
+  '@inquirer/editor@4.2.11(@types/node@20.17.44)':
     dependencies:
-      '@inquirer/core': 10.1.10(@types/node@20.17.44)
+      '@inquirer/core': 10.1.11(@types/node@20.17.44)
       '@inquirer/type': 3.0.6(@types/node@20.17.44)
       external-editor: 3.1.0
     optionalDependencies:
       '@types/node': 20.17.44
 
-  '@inquirer/expand@4.0.12(@types/node@20.17.44)':
+  '@inquirer/expand@4.0.13(@types/node@20.17.44)':
     dependencies:
-      '@inquirer/core': 10.1.10(@types/node@20.17.44)
+      '@inquirer/core': 10.1.11(@types/node@20.17.44)
       '@inquirer/type': 3.0.6(@types/node@20.17.44)
       yoctocolors-cjs: 2.1.2
     optionalDependencies:
@@ -9372,63 +9324,63 @@ snapshots:
 
   '@inquirer/figures@1.0.11': {}
 
-  '@inquirer/input@4.1.9(@types/node@20.17.44)':
+  '@inquirer/input@4.1.10(@types/node@20.17.44)':
     dependencies:
-      '@inquirer/core': 10.1.10(@types/node@20.17.44)
+      '@inquirer/core': 10.1.11(@types/node@20.17.44)
       '@inquirer/type': 3.0.6(@types/node@20.17.44)
     optionalDependencies:
       '@types/node': 20.17.44
 
-  '@inquirer/number@3.0.12(@types/node@20.17.44)':
+  '@inquirer/number@3.0.13(@types/node@20.17.44)':
     dependencies:
-      '@inquirer/core': 10.1.10(@types/node@20.17.44)
+      '@inquirer/core': 10.1.11(@types/node@20.17.44)
       '@inquirer/type': 3.0.6(@types/node@20.17.44)
     optionalDependencies:
       '@types/node': 20.17.44
 
-  '@inquirer/password@4.0.12(@types/node@20.17.44)':
+  '@inquirer/password@4.0.13(@types/node@20.17.44)':
     dependencies:
-      '@inquirer/core': 10.1.10(@types/node@20.17.44)
+      '@inquirer/core': 10.1.11(@types/node@20.17.44)
       '@inquirer/type': 3.0.6(@types/node@20.17.44)
       ansi-escapes: 4.3.2
     optionalDependencies:
       '@types/node': 20.17.44
 
-  '@inquirer/prompts@7.5.0(@types/node@20.17.44)':
-    dependencies:
-      '@inquirer/checkbox': 4.1.5(@types/node@20.17.44)
-      '@inquirer/confirm': 5.1.9(@types/node@20.17.44)
-      '@inquirer/editor': 4.2.10(@types/node@20.17.44)
-      '@inquirer/expand': 4.0.12(@types/node@20.17.44)
-      '@inquirer/input': 4.1.9(@types/node@20.17.44)
-      '@inquirer/number': 3.0.12(@types/node@20.17.44)
-      '@inquirer/password': 4.0.12(@types/node@20.17.44)
-      '@inquirer/rawlist': 4.1.0(@types/node@20.17.44)
-      '@inquirer/search': 3.0.12(@types/node@20.17.44)
-      '@inquirer/select': 4.2.0(@types/node@20.17.44)
+  '@inquirer/prompts@7.5.1(@types/node@20.17.44)':
+    dependencies:
+      '@inquirer/checkbox': 4.1.6(@types/node@20.17.44)
+      '@inquirer/confirm': 5.1.10(@types/node@20.17.44)
+      '@inquirer/editor': 4.2.11(@types/node@20.17.44)
+      '@inquirer/expand': 4.0.13(@types/node@20.17.44)
+      '@inquirer/input': 4.1.10(@types/node@20.17.44)
+      '@inquirer/number': 3.0.13(@types/node@20.17.44)
+      '@inquirer/password': 4.0.13(@types/node@20.17.44)
+      '@inquirer/rawlist': 4.1.1(@types/node@20.17.44)
+      '@inquirer/search': 3.0.13(@types/node@20.17.44)
+      '@inquirer/select': 4.2.1(@types/node@20.17.44)
     optionalDependencies:
       '@types/node': 20.17.44
 
-  '@inquirer/rawlist@4.1.0(@types/node@20.17.44)':
+  '@inquirer/rawlist@4.1.1(@types/node@20.17.44)':
     dependencies:
-      '@inquirer/core': 10.1.10(@types/node@20.17.44)
+      '@inquirer/core': 10.1.11(@types/node@20.17.44)
       '@inquirer/type': 3.0.6(@types/node@20.17.44)
       yoctocolors-cjs: 2.1.2
     optionalDependencies:
       '@types/node': 20.17.44
 
-  '@inquirer/search@3.0.12(@types/node@20.17.44)':
+  '@inquirer/search@3.0.13(@types/node@20.17.44)':
     dependencies:
-      '@inquirer/core': 10.1.10(@types/node@20.17.44)
+      '@inquirer/core': 10.1.11(@types/node@20.17.44)
       '@inquirer/figures': 1.0.11
       '@inquirer/type': 3.0.6(@types/node@20.17.44)
       yoctocolors-cjs: 2.1.2
     optionalDependencies:
       '@types/node': 20.17.44
 
-  '@inquirer/select@4.2.0(@types/node@20.17.44)':
+  '@inquirer/select@4.2.1(@types/node@20.17.44)':
     dependencies:
-      '@inquirer/core': 10.1.10(@types/node@20.17.44)
+      '@inquirer/core': 10.1.11(@types/node@20.17.44)
       '@inquirer/figures': 1.0.11
       '@inquirer/type': 3.0.6(@types/node@20.17.44)
       ansi-escapes: 4.3.2
@@ -9506,9 +9458,9 @@ snapshots:
 
   '@leichtgewicht/ip-codec@2.0.5': {}
 
-  '@listr2/prompt-adapter-inquirer@2.0.22(@inquirer/prompts@7.5.0(@types/node@20.17.44))':
+  '@listr2/prompt-adapter-inquirer@2.0.22(@inquirer/prompts@7.5.1(@types/node@20.17.44))':
     dependencies:
-      '@inquirer/prompts': 7.5.0(@types/node@20.17.44)
+      '@inquirer/prompts': 7.5.1(@types/node@20.17.44)
       '@inquirer/type': 1.5.5
 
   '@lmdb/lmdb-darwin-arm64@3.3.0':
@@ -10658,9 +10610,9 @@ snapshots:
       minimatch: 7.4.6
       semver: 7.7.1
 
-  '@vitejs/plugin-basic-ssl@2.0.0(vite@6.3.5(@types/node@20.17.44)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1))':
+  '@vitejs/plugin-basic-ssl@2.0.0(vite@6.3.5(@types/node@20.17.44)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1))':
     dependencies:
-      vite: 6.3.5(@types/node@20.17.44)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1)
+      vite: 6.3.5(@types/node@20.17.44)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1)
 
   '@vitest/expect@3.1.3':
     dependencies:
@@ -10669,13 +10621,13 @@ snapshots:
       chai: 5.2.0
       tinyrainbow: 2.0.0
 
-  '@vitest/mocker@3.1.3(vite@6.3.5(@types/node@20.17.44)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1))':
+  '@vitest/mocker@3.1.3(vite@6.3.5(@types/node@20.17.44)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1))':
     dependencies:
       '@vitest/spy': 3.1.3
       estree-walker: 3.0.3
       magic-string: 0.30.17
     optionalDependencies:
-      vite: 6.3.5(@types/node@20.17.44)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1)
+      vite: 6.3.5(@types/node@20.17.44)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1)
 
   '@vitest/pretty-format@3.1.3':
     dependencies:
@@ -11783,14 +11735,6 @@ snapshots:
     transitivePeerDependencies:
       - encoding
 
-  cross-spawn@6.0.6:
-    dependencies:
-      nice-try: 1.0.5
-      path-key: 2.0.1
-      semver: 5.7.2
-      shebang-command: 1.2.0
-      which: 1.3.1
-
   cross-spawn@7.0.6:
     dependencies:
       path-key: 3.1.1
@@ -12282,7 +12226,7 @@ snapshots:
     optionalDependencies:
       source-map: 0.6.1
 
-  eslint-config-prettier@10.1.2(eslint@9.26.0(jiti@1.21.7)):
+  eslint-config-prettier@10.1.5(eslint@9.26.0(jiti@1.21.7)):
     dependencies:
       eslint: 9.26.0(jiti@1.21.7)
 
@@ -12441,16 +12385,6 @@ snapshots:
     dependencies:
       eventsource-parser: 3.0.1
 
-  execa@1.0.0:
-    dependencies:
-      cross-spawn: 6.0.6
-      get-stream: 4.1.0
-      is-stream: 1.1.0
-      npm-run-path: 2.0.2
-      p-finally: 1.0.0
-      signal-exit: 3.0.7
-      strip-eof: 1.0.0
-
   execa@5.1.1:
     dependencies:
       cross-spawn: 7.0.6
@@ -12824,10 +12758,6 @@ snapshots:
       dunder-proto: 1.0.1
       es-object-atoms: 1.1.1
 
-  get-stream@4.1.0:
-    dependencies:
-      pump: 3.0.2
-
   get-stream@5.2.0:
     dependencies:
       pump: 3.0.2
@@ -12884,7 +12814,7 @@ snapshots:
 
   globals@14.0.0: {}
 
-  globals@16.0.0: {}
+  globals@16.1.0: {}
 
   globalthis@1.0.4:
     dependencies:
@@ -13230,8 +13160,6 @@ snapshots:
       hasown: 2.0.2
       side-channel: 1.1.0
 
-  interpret@1.4.0: {}
-
   ip-address@9.0.5:
     dependencies:
       jsbn: 1.1.0
@@ -13392,8 +13320,6 @@ snapshots:
 
   is-stream-ended@0.1.4: {}
 
-  is-stream@1.1.0: {}
-
   is-stream@2.0.1: {}
 
   is-string@1.1.1:
@@ -14224,15 +14150,13 @@ snapshots:
       postcss: 8.5.3
       rollup-plugin-dts: 6.2.1(rollup@4.40.2)(typescript@5.8.3)
       rxjs: 7.8.2
-      sass: 1.87.0
+      sass: 1.88.0
       tinyglobby: 0.2.13
       tslib: 2.8.1
       typescript: 5.8.3
     optionalDependencies:
       rollup: 4.40.2
 
-  nice-try@1.0.5: {}
-
   node-addon-api@6.1.0:
     optional: true
 
@@ -14334,10 +14258,6 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  npm-run-path@2.0.2:
-    dependencies:
-      path-key: 2.0.1
-
   npm-run-path@4.0.1:
     dependencies:
       path-key: 3.1.1
@@ -14590,8 +14510,6 @@ snapshots:
 
   path-is-inside@1.0.2: {}
 
-  path-key@2.0.1: {}
-
   path-key@3.1.1: {}
 
   path-parse@1.0.7: {}
@@ -14915,7 +14833,7 @@ snapshots:
 
   quick-format-unescaped@4.0.4: {}
 
-  quicktype-core@23.1.3(encoding@0.1.13):
+  quicktype-core@23.1.4(encoding@0.1.13):
     dependencies:
       '@glideapps/ts-necessities': 2.2.3
       browser-or-node: 3.0.0
@@ -14994,10 +14912,6 @@ snapshots:
 
   real-require@0.2.0: {}
 
-  rechoir@0.6.2:
-    dependencies:
-      resolve: 1.22.10
-
   reflect-metadata@0.2.2: {}
 
   reflect.getprototypeof@1.0.10:
@@ -15235,14 +15149,14 @@ snapshots:
 
   safer-buffer@2.1.2: {}
 
-  sass-loader@16.0.5(sass@1.87.0)(webpack@5.99.8(esbuild@0.25.4)):
+  sass-loader@16.0.5(sass@1.88.0)(webpack@5.99.8(esbuild@0.25.4)):
     dependencies:
       neo-async: 2.6.2
     optionalDependencies:
-      sass: 1.87.0
+      sass: 1.88.0
       webpack: 5.99.8(esbuild@0.25.4)
 
-  sass@1.87.0:
+  sass@1.88.0:
     dependencies:
       chokidar: 4.0.3
       immutable: 5.1.2
@@ -15413,26 +15327,18 @@ snapshots:
     dependencies:
       kind-of: 6.0.3
 
-  shebang-command@1.2.0:
-    dependencies:
-      shebang-regex: 1.0.0
-
   shebang-command@2.0.0:
     dependencies:
       shebang-regex: 3.0.0
 
-  shebang-regex@1.0.0: {}
-
   shebang-regex@3.0.0: {}
 
   shell-quote@1.8.2: {}
 
-  shelljs@0.9.2:
+  shelljs@0.10.0:
     dependencies:
-      execa: 1.0.0
+      execa: 5.1.1
       fast-glob: 3.3.3
-      interpret: 1.4.0
-      rechoir: 0.6.2
 
   side-channel-list@1.0.0:
     dependencies:
@@ -15763,8 +15669,6 @@ snapshots:
 
   strip-bom@3.0.0: {}
 
-  strip-eof@1.0.0: {}
-
   strip-final-newline@2.0.0: {}
 
   strip-json-comments@3.1.1: {}
@@ -16089,7 +15993,7 @@ snapshots:
 
   undici-types@6.19.8: {}
 
-  undici@7.8.0: {}
+  undici@7.9.0: {}
 
   unenv@1.10.0:
     dependencies:
@@ -16249,13 +16153,13 @@ snapshots:
       core-util-is: 1.0.2
       extsprintf: 1.3.0
 
-  vite-node@3.1.3(@types/node@20.17.44)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1):
+  vite-node@3.1.3(@types/node@20.17.44)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1):
     dependencies:
       cac: 6.7.14
       debug: 4.4.0(supports-color@10.0.0)
       es-module-lexer: 1.7.0
       pathe: 2.0.3
-      vite: 6.3.5(@types/node@20.17.44)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1)
+      vite: 6.3.5(@types/node@20.17.44)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1)
     transitivePeerDependencies:
       - '@types/node'
       - jiti
@@ -16270,7 +16174,7 @@ snapshots:
       - tsx
       - yaml
 
-  vite@6.3.5(@types/node@20.17.44)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1):
+  vite@6.3.5(@types/node@20.17.44)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1):
     dependencies:
       esbuild: 0.25.4
       fdir: 6.4.4(picomatch@4.0.2)
@@ -16283,14 +16187,14 @@ snapshots:
       fsevents: 2.3.3
       jiti: 1.21.7
       less: 4.3.0
-      sass: 1.87.0
+      sass: 1.88.0
       terser: 5.39.0
       yaml: 2.7.1
 
-  vitest@3.1.3(@types/node@20.17.44)(jiti@1.21.7)(jsdom@26.1.0)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1):
+  vitest@3.1.3(@types/node@20.17.44)(jiti@1.21.7)(jsdom@26.1.0)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1):
     dependencies:
       '@vitest/expect': 3.1.3
-      '@vitest/mocker': 3.1.3(vite@6.3.5(@types/node@20.17.44)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1))
+      '@vitest/mocker': 3.1.3(vite@6.3.5(@types/node@20.17.44)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1))
       '@vitest/pretty-format': 3.1.3
       '@vitest/runner': 3.1.3
       '@vitest/snapshot': 3.1.3
@@ -16307,8 +16211,8 @@ snapshots:
       tinyglobby: 0.2.13
       tinypool: 1.0.2
       tinyrainbow: 2.0.0
-      vite: 6.3.5(@types/node@20.17.44)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1)
-      vite-node: 3.1.3(@types/node@20.17.44)(jiti@1.21.7)(less@4.3.0)(sass@1.87.0)(terser@5.39.0)(yaml@2.7.1)
+      vite: 6.3.5(@types/node@20.17.44)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1)
+      vite-node: 3.1.3(@types/node@20.17.44)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1)
       why-is-node-running: 2.3.0
     optionalDependencies:
       '@types/node': 20.17.44

From a01dc230b22d2a9fcc30a13779f4ff4f78c042e6 Mon Sep 17 00:00:00 2001
From: Angular Robot <angular-robot@google.com>
Date: Mon, 12 May 2025 08:17:03 +0000
Subject: [PATCH 039/138] build: update rules_angular digest to 7fb42d2

See associated pull request for more information.

(cherry picked from commit 5805f0f12f80b8bf2d53bfb8f3d911b407b43d79)
---
 WORKSPACE | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/WORKSPACE b/WORKSPACE
index c8ad4868fa67..99815331f45b 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -276,7 +276,7 @@ esbuild_register_toolchains(
 
 git_repository(
     name = "rules_angular",
-    commit = "e35da7371d02d0c8d165c518d532d66be7afb8a6",
+    commit = "7fb42d23831222c54dd74bf148758833f60cce6b",
     remote = "https://github.com/devversion/rules_angular.git",
 )
 

From a7ad8e1619756870bf68555dbaafdd3b4bf5315b Mon Sep 17 00:00:00 2001
From: Angular Robot <angular-robot@google.com>
Date: Mon, 12 May 2025 09:03:58 +0000
Subject: [PATCH 040/138] build: lock file maintenance

See associated pull request for more information.

(cherry picked from commit 30ac634ad957c674c676485e52b2344216c604e2)
---
 pnpm-lock.yaml | 384 ++++++++++++++++++++++++-------------------------
 1 file changed, 192 insertions(+), 192 deletions(-)

diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 0810d0476e3b..43ed810a029f 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -124,7 +124,7 @@ importers:
         version: 4.17.16
       '@types/node':
         specifier: ^20.17.19
-        version: 20.17.44
+        version: 20.17.46
       '@types/npm-package-arg':
         specifier: ^6.1.0
         version: 6.1.4
@@ -145,7 +145,7 @@ importers:
         version: 7.7.0
       '@types/shelljs':
         specifier: ^0.8.11
-        version: 0.8.15
+        version: 0.8.16
       '@types/watchpack':
         specifier: ^2.4.4
         version: 2.4.4
@@ -277,7 +277,7 @@ importers:
         version: 6.2.1(rollup@4.40.2)(typescript@5.8.3)
       rollup-plugin-sourcemaps2:
         specifier: 0.5.1
-        version: 0.5.1(@types/node@20.17.44)(rollup@4.40.2)
+        version: 0.5.1(@types/node@20.17.46)(rollup@4.40.2)
       semver:
         specifier: 7.7.1
         version: 7.7.1
@@ -292,7 +292,7 @@ importers:
         version: 7.4.3
       ts-node:
         specifier: ^10.9.1
-        version: 10.9.2(@types/node@20.17.44)(typescript@5.8.3)
+        version: 10.9.2(@types/node@20.17.46)(typescript@5.8.3)
       tslib:
         specifier: 2.8.1
         version: 2.8.1
@@ -342,7 +342,7 @@ importers:
         version: 7.8.2
       vitest:
         specifier: 3.1.3
-        version: 3.1.3(@types/node@20.17.44)(jiti@1.21.7)(jsdom@26.1.0)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1)
+        version: 3.1.3(@types/node@20.17.46)(jiti@1.21.7)(jsdom@26.1.0)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1)
 
   packages/angular/build:
     dependencies:
@@ -363,10 +363,10 @@ importers:
         version: 7.24.7
       '@inquirer/confirm':
         specifier: 5.1.10
-        version: 5.1.10(@types/node@20.17.44)
+        version: 5.1.10(@types/node@20.17.46)
       '@vitejs/plugin-basic-ssl':
         specifier: 2.0.0
-        version: 2.0.0(vite@6.3.5(@types/node@20.17.44)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1))
+        version: 2.0.0(vite@6.3.5(@types/node@20.17.46)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1))
       beasties:
         specifier: 0.3.3
         version: 0.3.3
@@ -420,7 +420,7 @@ importers:
         version: 0.2.13
       vite:
         specifier: 6.3.5
-        version: 6.3.5(@types/node@20.17.44)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1)
+        version: 6.3.5(@types/node@20.17.46)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1)
       watchpack:
         specifier: 2.4.2
         version: 2.4.2
@@ -452,7 +452,7 @@ importers:
         version: 7.8.2
       vitest:
         specifier: 3.1.3
-        version: 3.1.3(@types/node@20.17.44)(jiti@1.21.7)(jsdom@26.1.0)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1)
+        version: 3.1.3(@types/node@20.17.46)(jiti@1.21.7)(jsdom@26.1.0)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1)
 
   packages/angular/cli:
     dependencies:
@@ -467,10 +467,10 @@ importers:
         version: link:../../angular_devkit/schematics
       '@inquirer/prompts':
         specifier: 7.5.1
-        version: 7.5.1(@types/node@20.17.44)
+        version: 7.5.1(@types/node@20.17.46)
       '@listr2/prompt-adapter-inquirer':
         specifier: 2.0.22
-        version: 2.0.22(@inquirer/prompts@7.5.1(@types/node@20.17.44))
+        version: 2.0.22(@inquirer/prompts@7.5.1(@types/node@20.17.46))
       '@schematics/angular':
         specifier: workspace:0.0.0-PLACEHOLDER
         version: link:../../schematics/angular
@@ -631,7 +631,7 @@ importers:
         version: link:../../ngtools/webpack
       '@vitejs/plugin-basic-ssl':
         specifier: 2.0.0
-        version: 2.0.0(vite@6.3.5(@types/node@20.17.44)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1))
+        version: 2.0.0(vite@6.3.5(@types/node@20.17.46)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1))
       ansi-colors:
         specifier: 4.1.3
         version: 4.1.3
@@ -842,7 +842,7 @@ importers:
         version: link:../schematics
       '@inquirer/prompts':
         specifier: 7.5.1
-        version: 7.5.1(@types/node@20.17.44)
+        version: 7.5.1(@types/node@20.17.46)
       ansi-colors:
         specifier: 4.1.3
         version: 4.1.3
@@ -2050,11 +2050,11 @@ packages:
     cpu: [x64]
     os: [win32]
 
-  '@mdn/browser-compat-data@6.0.12':
-    resolution: {integrity: sha512-lQ6p212jKeJBG+L7UYRKchTCcnQbp6yOj5swKxGLjvuW4SmbgWgd/WyA1Dxq1GGT86C7jVTEaKry36LmsBp8SQ==}
+  '@mdn/browser-compat-data@6.0.13':
+    resolution: {integrity: sha512-RSYYaex/5lC4mim5pMTKHxfSpWf7Oc4r8Vk4exFVvt/KzIj7GacXAiYu5WfGnIWrBaa0KaSPda7oanQiFwjbeg==}
 
-  '@modelcontextprotocol/sdk@1.11.0':
-    resolution: {integrity: sha512-k/1pb70eD638anoi0e8wUGAlbMJXyvdV4p62Ko+EZ7eBe1xMx8Uhak1R5DgfoofsK5IBBnRwsYGTaLZl+6/+RQ==}
+  '@modelcontextprotocol/sdk@1.11.1':
+    resolution: {integrity: sha512-9LfmxKTb1v+vUS1/emSk1f5ePmTLkb9Le9AxOB5T0XM59EUumwcS45z05h7aiZx3GI0Bl7mjb3FMEglYj+acuQ==}
     engines: {node: '>=18'}
 
   '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3':
@@ -2314,8 +2314,8 @@ packages:
     resolution: {integrity: sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==}
     engines: {node: '>=14'}
 
-  '@opentelemetry/semantic-conventions@1.32.0':
-    resolution: {integrity: sha512-s0OpmpQFSfMrmedAn9Lhg4KWJELHCU6uU9dtIJ28N8UGhf9Y55im5X8fEzwhwDwiSqN+ZPSNrDJF7ivf/AuRPQ==}
+  '@opentelemetry/semantic-conventions@1.33.0':
+    resolution: {integrity: sha512-TIpZvE8fiEILFfTlfPnltpBaD3d9/+uQHVCyC3vfdh6WfCXKhNFzoP5RyDDIndfvZC5GrA4pyEDNyjPloJud+w==}
     engines: {node: '>=14'}
 
   '@parcel/watcher-android-arm64@2.5.1':
@@ -2434,8 +2434,8 @@ packages:
   '@protobufjs/utf8@1.1.0':
     resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==}
 
-  '@puppeteer/browsers@2.10.3':
-    resolution: {integrity: sha512-iPpnFpX25gKIVsHsqVjHV+/GzW36xPgsscWkCnrrETndcdxNsXLdCrTwhkCJNR/FGWr122dJUBeyV4niz/j3TA==}
+  '@puppeteer/browsers@2.10.4':
+    resolution: {integrity: sha512-9DxbZx+XGMNdjBynIs4BRSz+M3iRDeB7qRcAr6UORFLphCIM2x3DXgOucvADiifcqCE4XePFUKcnaAMyGbrDlQ==}
     engines: {node: '>=18'}
     hasBin: true
 
@@ -2715,8 +2715,8 @@ packages:
   '@types/cookies@0.9.0':
     resolution: {integrity: sha512-40Zk8qR147RABiQ7NQnBzWzDcjKzNrntB5BAmeGCb2p/MIyOE+4BVvc17wumsUqUw00bJYqoXFHYygQnEFh4/Q==}
 
-  '@types/cors@2.8.17':
-    resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==}
+  '@types/cors@2.8.18':
+    resolution: {integrity: sha512-nX3d0sxJW41CqQvfOzVG1NCTXfFDrDWIghCZncpHeWlVFd81zxB/DLhg7avFg6eHLCRX7ckBmoIIcqa++upvJA==}
 
   '@types/debounce@1.2.4':
     resolution: {integrity: sha512-jBqiORIzKDOToaF63Fm//haOCHuwQuLa2202RK4MozpA6lh93eCBc+/8+wZn5OzjJt3ySdc+74SXWXB55Ewtyw==}
@@ -2823,8 +2823,8 @@ packages:
   '@types/node-forge@1.3.11':
     resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==}
 
-  '@types/node@20.17.44':
-    resolution: {integrity: sha512-50sE4Ibb4BgUMxHrcJQSAU0Fu7fLcTdwcXwRzEF7wnVMWvImFLg2Rxc7SW0vpvaJm4wvhoWEZaQiPpBpocZiUA==}
+  '@types/node@20.17.46':
+    resolution: {integrity: sha512-0PQHLhZPWOxGW4auogW0eOQAuNIlCYvibIpG67ja0TOJ6/sehu+1en7sfceUn+QQtx4Rk3GxbLNwPh0Cav7TWw==}
 
   '@types/npm-package-arg@6.1.4':
     resolution: {integrity: sha512-vDgdbMy2QXHnAruzlv68pUtXCjmqUk3WrBAsRboRovsOmxbfn/WiYCjmecyKjGztnMps5dWp4Uq2prp+Ilo17Q==}
@@ -2889,8 +2889,8 @@ packages:
   '@types/serve-static@1.15.7':
     resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==}
 
-  '@types/shelljs@0.8.15':
-    resolution: {integrity: sha512-vzmnCHl6hViPu9GNLQJ+DZFd6BQI2DBTUeOvYHqkWQLMfKAAQYMb/xAmZkTogZI/vqXHCWkqDRymDI5p0QTi5Q==}
+  '@types/shelljs@0.8.16':
+    resolution: {integrity: sha512-40SUXiH0tZfAg/oKkkGF1kdHPAmE4slv2xAmbfa8VtE6ztHYwdpW2phlzHTVdJh5JOGqA3Cx1Hzp7kxFalKHYA==}
 
   '@types/sockjs@0.3.36':
     resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==}
@@ -4246,8 +4246,8 @@ packages:
   ee-first@1.1.1:
     resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
 
-  electron-to-chromium@1.5.150:
-    resolution: {integrity: sha512-rOOkP2ZUMx1yL4fCxXQKDHQ8ZXwisb2OycOQVKHgvB3ZI4CvehOd4y2tfnnLDieJ3Zs1RL1Dlp3cMkyIn7nnXA==}
+  electron-to-chromium@1.5.151:
+    resolution: {integrity: sha512-Rl6uugut2l9sLojjS4H4SAr3A4IgACMLgpuEMPYCVcKydzfyPrn5absNRju38IhQOf/NwjJY8OGWjlteqYeBCA==}
 
   emoji-regex@10.4.0:
     resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==}
@@ -4527,8 +4527,8 @@ packages:
     resolution: {integrity: sha512-VARTJ9CYeuQYb0pZEPbzi740OWFgpHe7AYJ2WFZVnUDUQp5Dk2yJUgF36YsZ81cOyxT0QxmXD2EQpapAouzWVA==}
     engines: {node: '>=18.0.0'}
 
-  eventsource@3.0.6:
-    resolution: {integrity: sha512-l19WpE2m9hSuyP06+FbuUUf1G+R0SFLrtQfbRb9PRr+oimOfxQhgGCbVaXg5IvZyyTThJsxh6L/srkMiCeBPDA==}
+  eventsource@3.0.7:
+    resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==}
     engines: {node: '>=18.0.0'}
 
   execa@5.1.1:
@@ -4967,8 +4967,8 @@ packages:
     resolution: {integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==}
     engines: {node: '>= 0.8'}
 
-  http-cache-semantics@4.1.1:
-    resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==}
+  http-cache-semantics@4.2.0:
+    resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==}
 
   http-deceiver@1.2.7:
     resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==}
@@ -6648,8 +6648,8 @@ packages:
     resolution: {integrity: sha512-SAzp/O4Yh02jGdRc+uIrGoe87dkN/XtwxfZ4ZyafJHymd79ozp5VG5nyZ7ygqPM5+cpLDjjGnYFUkngonyDPOQ==}
     engines: {node: '>=14.0.0'}
 
-  protobufjs@7.4.0:
-    resolution: {integrity: sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==}
+  protobufjs@7.5.1:
+    resolution: {integrity: sha512-3qx3IRjR9WPQKagdwrKjO3Gu8RgQR2qqw+1KnigWhoVjFqegIj1K3bP11sGqhxrO46/XL7lekuG4jmjL+4cLsw==}
     engines: {node: '>=12.0.0'}
 
   protractor@7.0.0:
@@ -6695,8 +6695,8 @@ packages:
     resolution: {integrity: sha512-MRtTAZfQTluz3U2oU/X2VqVWPcR1+94nbA2V6ZrSZRVEwLqZ8eclZ551qGFQD/vD2PYqHJwWOW/fpC721uznVw==}
     engines: {node: '>=14.1.0'}
 
-  puppeteer-core@24.8.1:
-    resolution: {integrity: sha512-UP/VIxVk/Akrgql3a55ZAIuAIx7+yQevz6qEXFUtSTIynEcgsCJ6tlRdi7uKAAlovmNQG4iNMzq9f8WxZLnGGg==}
+  puppeteer-core@24.8.2:
+    resolution: {integrity: sha512-wNw5cRZOHiFibWc0vdYCYO92QuKTbJ8frXiUfOq/UGJWMqhPoBThTKkV+dJ99YyWfzJ2CfQQ4T1nhhR0h8FlVw==}
     engines: {node: '>=18'}
 
   puppeteer@18.2.1:
@@ -7690,8 +7690,8 @@ packages:
     resolution: {integrity: sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==}
     engines: {node: ^18.17.0 || >=20.5.0}
 
-  universal-user-agent@7.0.2:
-    resolution: {integrity: sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==}
+  universal-user-agent@7.0.3:
+    resolution: {integrity: sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==}
 
   universalify@0.1.2:
     resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==}
@@ -9222,7 +9222,7 @@ snapshots:
       '@opentelemetry/api': 1.9.0
       '@opentelemetry/context-async-hooks': 1.30.1(@opentelemetry/api@1.9.0)
       '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0)
-      '@opentelemetry/semantic-conventions': 1.32.0
+      '@opentelemetry/semantic-conventions': 1.33.0
       '@types/big.js': 6.2.2
       '@types/stack-trace': 0.0.33
       arrify: 2.0.1
@@ -9233,12 +9233,12 @@ snapshots:
       extend: 3.0.2
       google-auth-library: 9.15.1(encoding@0.1.13)(supports-color@10.0.0)
       google-gax: 4.4.1(encoding@0.1.13)(supports-color@10.0.0)
-      grpc-gcp: 1.0.1(protobufjs@7.4.0)
+      grpc-gcp: 1.0.1(protobufjs@7.5.1)
       is: 3.3.0
       lodash.snakecase: 4.1.1
       merge-stream: 2.0.0
       p-queue: 6.6.2
-      protobufjs: 7.4.0
+      protobufjs: 7.5.1
       retry-request: 7.0.2(encoding@0.1.13)(supports-color@10.0.0)
       split-array-stream: 2.0.0
       stack-trace: 0.0.10
@@ -9258,7 +9258,7 @@ snapshots:
     dependencies:
       lodash.camelcase: 4.3.0
       long: 5.3.2
-      protobufjs: 7.4.0
+      protobufjs: 7.5.1
       yargs: 17.7.2
 
   '@hapi/bourne@3.0.0': {}
@@ -9276,27 +9276,27 @@ snapshots:
 
   '@humanwhocodes/retry@0.4.3': {}
 
-  '@inquirer/checkbox@4.1.6(@types/node@20.17.44)':
+  '@inquirer/checkbox@4.1.6(@types/node@20.17.46)':
     dependencies:
-      '@inquirer/core': 10.1.11(@types/node@20.17.44)
+      '@inquirer/core': 10.1.11(@types/node@20.17.46)
       '@inquirer/figures': 1.0.11
-      '@inquirer/type': 3.0.6(@types/node@20.17.44)
+      '@inquirer/type': 3.0.6(@types/node@20.17.46)
       ansi-escapes: 4.3.2
       yoctocolors-cjs: 2.1.2
     optionalDependencies:
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
 
-  '@inquirer/confirm@5.1.10(@types/node@20.17.44)':
+  '@inquirer/confirm@5.1.10(@types/node@20.17.46)':
     dependencies:
-      '@inquirer/core': 10.1.11(@types/node@20.17.44)
-      '@inquirer/type': 3.0.6(@types/node@20.17.44)
+      '@inquirer/core': 10.1.11(@types/node@20.17.46)
+      '@inquirer/type': 3.0.6(@types/node@20.17.46)
     optionalDependencies:
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
 
-  '@inquirer/core@10.1.11(@types/node@20.17.44)':
+  '@inquirer/core@10.1.11(@types/node@20.17.46)':
     dependencies:
       '@inquirer/figures': 1.0.11
-      '@inquirer/type': 3.0.6(@types/node@20.17.44)
+      '@inquirer/type': 3.0.6(@types/node@20.17.46)
       ansi-escapes: 4.3.2
       cli-width: 4.1.0
       mute-stream: 2.0.0
@@ -9304,97 +9304,97 @@ snapshots:
       wrap-ansi: 6.2.0
       yoctocolors-cjs: 2.1.2
     optionalDependencies:
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
 
-  '@inquirer/editor@4.2.11(@types/node@20.17.44)':
+  '@inquirer/editor@4.2.11(@types/node@20.17.46)':
     dependencies:
-      '@inquirer/core': 10.1.11(@types/node@20.17.44)
-      '@inquirer/type': 3.0.6(@types/node@20.17.44)
+      '@inquirer/core': 10.1.11(@types/node@20.17.46)
+      '@inquirer/type': 3.0.6(@types/node@20.17.46)
       external-editor: 3.1.0
     optionalDependencies:
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
 
-  '@inquirer/expand@4.0.13(@types/node@20.17.44)':
+  '@inquirer/expand@4.0.13(@types/node@20.17.46)':
     dependencies:
-      '@inquirer/core': 10.1.11(@types/node@20.17.44)
-      '@inquirer/type': 3.0.6(@types/node@20.17.44)
+      '@inquirer/core': 10.1.11(@types/node@20.17.46)
+      '@inquirer/type': 3.0.6(@types/node@20.17.46)
       yoctocolors-cjs: 2.1.2
     optionalDependencies:
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
 
   '@inquirer/figures@1.0.11': {}
 
-  '@inquirer/input@4.1.10(@types/node@20.17.44)':
+  '@inquirer/input@4.1.10(@types/node@20.17.46)':
     dependencies:
-      '@inquirer/core': 10.1.11(@types/node@20.17.44)
-      '@inquirer/type': 3.0.6(@types/node@20.17.44)
+      '@inquirer/core': 10.1.11(@types/node@20.17.46)
+      '@inquirer/type': 3.0.6(@types/node@20.17.46)
     optionalDependencies:
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
 
-  '@inquirer/number@3.0.13(@types/node@20.17.44)':
+  '@inquirer/number@3.0.13(@types/node@20.17.46)':
     dependencies:
-      '@inquirer/core': 10.1.11(@types/node@20.17.44)
-      '@inquirer/type': 3.0.6(@types/node@20.17.44)
+      '@inquirer/core': 10.1.11(@types/node@20.17.46)
+      '@inquirer/type': 3.0.6(@types/node@20.17.46)
     optionalDependencies:
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
 
-  '@inquirer/password@4.0.13(@types/node@20.17.44)':
+  '@inquirer/password@4.0.13(@types/node@20.17.46)':
     dependencies:
-      '@inquirer/core': 10.1.11(@types/node@20.17.44)
-      '@inquirer/type': 3.0.6(@types/node@20.17.44)
+      '@inquirer/core': 10.1.11(@types/node@20.17.46)
+      '@inquirer/type': 3.0.6(@types/node@20.17.46)
       ansi-escapes: 4.3.2
     optionalDependencies:
-      '@types/node': 20.17.44
-
-  '@inquirer/prompts@7.5.1(@types/node@20.17.44)':
-    dependencies:
-      '@inquirer/checkbox': 4.1.6(@types/node@20.17.44)
-      '@inquirer/confirm': 5.1.10(@types/node@20.17.44)
-      '@inquirer/editor': 4.2.11(@types/node@20.17.44)
-      '@inquirer/expand': 4.0.13(@types/node@20.17.44)
-      '@inquirer/input': 4.1.10(@types/node@20.17.44)
-      '@inquirer/number': 3.0.13(@types/node@20.17.44)
-      '@inquirer/password': 4.0.13(@types/node@20.17.44)
-      '@inquirer/rawlist': 4.1.1(@types/node@20.17.44)
-      '@inquirer/search': 3.0.13(@types/node@20.17.44)
-      '@inquirer/select': 4.2.1(@types/node@20.17.44)
+      '@types/node': 20.17.46
+
+  '@inquirer/prompts@7.5.1(@types/node@20.17.46)':
+    dependencies:
+      '@inquirer/checkbox': 4.1.6(@types/node@20.17.46)
+      '@inquirer/confirm': 5.1.10(@types/node@20.17.46)
+      '@inquirer/editor': 4.2.11(@types/node@20.17.46)
+      '@inquirer/expand': 4.0.13(@types/node@20.17.46)
+      '@inquirer/input': 4.1.10(@types/node@20.17.46)
+      '@inquirer/number': 3.0.13(@types/node@20.17.46)
+      '@inquirer/password': 4.0.13(@types/node@20.17.46)
+      '@inquirer/rawlist': 4.1.1(@types/node@20.17.46)
+      '@inquirer/search': 3.0.13(@types/node@20.17.46)
+      '@inquirer/select': 4.2.1(@types/node@20.17.46)
     optionalDependencies:
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
 
-  '@inquirer/rawlist@4.1.1(@types/node@20.17.44)':
+  '@inquirer/rawlist@4.1.1(@types/node@20.17.46)':
     dependencies:
-      '@inquirer/core': 10.1.11(@types/node@20.17.44)
-      '@inquirer/type': 3.0.6(@types/node@20.17.44)
+      '@inquirer/core': 10.1.11(@types/node@20.17.46)
+      '@inquirer/type': 3.0.6(@types/node@20.17.46)
       yoctocolors-cjs: 2.1.2
     optionalDependencies:
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
 
-  '@inquirer/search@3.0.13(@types/node@20.17.44)':
+  '@inquirer/search@3.0.13(@types/node@20.17.46)':
     dependencies:
-      '@inquirer/core': 10.1.11(@types/node@20.17.44)
+      '@inquirer/core': 10.1.11(@types/node@20.17.46)
       '@inquirer/figures': 1.0.11
-      '@inquirer/type': 3.0.6(@types/node@20.17.44)
+      '@inquirer/type': 3.0.6(@types/node@20.17.46)
       yoctocolors-cjs: 2.1.2
     optionalDependencies:
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
 
-  '@inquirer/select@4.2.1(@types/node@20.17.44)':
+  '@inquirer/select@4.2.1(@types/node@20.17.46)':
     dependencies:
-      '@inquirer/core': 10.1.11(@types/node@20.17.44)
+      '@inquirer/core': 10.1.11(@types/node@20.17.46)
       '@inquirer/figures': 1.0.11
-      '@inquirer/type': 3.0.6(@types/node@20.17.44)
+      '@inquirer/type': 3.0.6(@types/node@20.17.46)
       ansi-escapes: 4.3.2
       yoctocolors-cjs: 2.1.2
     optionalDependencies:
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
 
   '@inquirer/type@1.5.5':
     dependencies:
       mute-stream: 1.0.0
 
-  '@inquirer/type@3.0.6(@types/node@20.17.44)':
+  '@inquirer/type@3.0.6(@types/node@20.17.46)':
     optionalDependencies:
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
 
   '@isaacs/cliui@8.0.2':
     dependencies:
@@ -9458,9 +9458,9 @@ snapshots:
 
   '@leichtgewicht/ip-codec@2.0.5': {}
 
-  '@listr2/prompt-adapter-inquirer@2.0.22(@inquirer/prompts@7.5.1(@types/node@20.17.44))':
+  '@listr2/prompt-adapter-inquirer@2.0.22(@inquirer/prompts@7.5.1(@types/node@20.17.46))':
     dependencies:
-      '@inquirer/prompts': 7.5.1(@types/node@20.17.44)
+      '@inquirer/prompts': 7.5.1(@types/node@20.17.46)
       '@inquirer/type': 1.5.5
 
   '@lmdb/lmdb-darwin-arm64@3.3.0':
@@ -9484,14 +9484,14 @@ snapshots:
   '@lmdb/lmdb-win32-x64@3.3.0':
     optional: true
 
-  '@mdn/browser-compat-data@6.0.12': {}
+  '@mdn/browser-compat-data@6.0.13': {}
 
-  '@modelcontextprotocol/sdk@1.11.0':
+  '@modelcontextprotocol/sdk@1.11.1':
     dependencies:
       content-type: 1.0.5
       cors: 2.8.5
       cross-spawn: 7.0.6
-      eventsource: 3.0.6
+      eventsource: 3.0.7
       express: 5.1.0
       express-rate-limit: 7.5.0(express@5.1.0)
       pkce-challenge: 5.0.0
@@ -9668,18 +9668,18 @@ snapshots:
       '@octokit/request-error': 6.1.8
       '@octokit/types': 14.0.0
       before-after-hook: 3.0.2
-      universal-user-agent: 7.0.2
+      universal-user-agent: 7.0.3
 
   '@octokit/endpoint@10.1.4':
     dependencies:
       '@octokit/types': 14.0.0
-      universal-user-agent: 7.0.2
+      universal-user-agent: 7.0.3
 
   '@octokit/graphql@8.2.2':
     dependencies:
       '@octokit/request': 9.2.3
       '@octokit/types': 14.0.0
-      universal-user-agent: 7.0.2
+      universal-user-agent: 7.0.3
 
   '@octokit/openapi-types@24.2.0': {}
 
@@ -9709,7 +9709,7 @@ snapshots:
       '@octokit/request-error': 6.1.8
       '@octokit/types': 14.0.0
       fast-content-type-parse: 2.0.1
-      universal-user-agent: 7.0.2
+      universal-user-agent: 7.0.3
 
   '@octokit/rest@21.1.1':
     dependencies:
@@ -9739,7 +9739,7 @@ snapshots:
 
   '@opentelemetry/semantic-conventions@1.28.0': {}
 
-  '@opentelemetry/semantic-conventions@1.32.0': {}
+  '@opentelemetry/semantic-conventions@1.33.0': {}
 
   '@parcel/watcher-android-arm64@2.5.1':
     optional: true
@@ -9828,7 +9828,7 @@ snapshots:
 
   '@protobufjs/utf8@1.1.0': {}
 
-  '@puppeteer/browsers@2.10.3':
+  '@puppeteer/browsers@2.10.4':
     dependencies:
       debug: 4.4.0(supports-color@10.0.0)
       extract-zip: 2.0.1
@@ -10026,7 +10026,7 @@ snapshots:
 
   '@types/accepts@1.3.7':
     dependencies:
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
 
   '@types/babel__code-frame@7.0.6': {}
 
@@ -10056,16 +10056,16 @@ snapshots:
   '@types/body-parser@1.19.5':
     dependencies:
       '@types/connect': 3.4.38
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
 
   '@types/bonjour@3.5.13':
     dependencies:
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
 
   '@types/browser-sync@2.29.0':
     dependencies:
       '@types/micromatch': 2.3.35
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
       '@types/serve-static': 1.15.7
       chokidar: 3.6.0
 
@@ -10073,7 +10073,7 @@ snapshots:
 
   '@types/co-body@6.1.3':
     dependencies:
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
       '@types/qs': 6.9.18
 
   '@types/command-line-args@5.2.3': {}
@@ -10081,11 +10081,11 @@ snapshots:
   '@types/connect-history-api-fallback@1.5.4':
     dependencies:
       '@types/express-serve-static-core': 4.19.6
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
 
   '@types/connect@3.4.38':
     dependencies:
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
 
   '@types/content-disposition@0.5.8': {}
 
@@ -10096,17 +10096,17 @@ snapshots:
       '@types/connect': 3.4.38
       '@types/express': 5.0.1
       '@types/keygrip': 1.0.6
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
 
-  '@types/cors@2.8.17':
+  '@types/cors@2.8.18':
     dependencies:
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
 
   '@types/debounce@1.2.4': {}
 
   '@types/duplexify@3.6.4':
     dependencies:
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
 
   '@types/eslint-scope@3.7.7':
     dependencies:
@@ -10122,14 +10122,14 @@ snapshots:
 
   '@types/express-serve-static-core@4.19.6':
     dependencies:
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
       '@types/qs': 6.9.18
       '@types/range-parser': 1.2.7
       '@types/send': 0.17.4
 
   '@types/express-serve-static-core@5.0.6':
     dependencies:
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
       '@types/qs': 6.9.18
       '@types/range-parser': 1.2.7
       '@types/send': 0.17.4
@@ -10150,11 +10150,11 @@ snapshots:
   '@types/glob@7.2.0':
     dependencies:
       '@types/minimatch': 5.1.2
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
 
   '@types/graceful-fs@4.1.9':
     dependencies:
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
 
   '@types/http-assert@1.5.6': {}
 
@@ -10162,7 +10162,7 @@ snapshots:
 
   '@types/http-proxy@1.17.16':
     dependencies:
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
 
   '@types/ini@4.1.1': {}
 
@@ -10188,7 +10188,7 @@ snapshots:
 
   '@types/karma@6.3.9':
     dependencies:
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
       log4js: 6.9.1
     transitivePeerDependencies:
       - supports-color
@@ -10208,13 +10208,13 @@ snapshots:
       '@types/http-errors': 2.0.4
       '@types/keygrip': 1.0.6
       '@types/koa-compose': 3.2.8
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
 
   '@types/less@3.0.8': {}
 
   '@types/loader-utils@2.0.6':
     dependencies:
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
       '@types/webpack': 4.41.40
 
   '@types/lodash@4.17.16': {}
@@ -10231,14 +10231,14 @@ snapshots:
 
   '@types/node-fetch@2.6.12':
     dependencies:
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
       form-data: 4.0.2
 
   '@types/node-forge@1.3.11':
     dependencies:
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
 
-  '@types/node@20.17.44':
+  '@types/node@20.17.46':
     dependencies:
       undici-types: 6.19.8
 
@@ -10246,7 +10246,7 @@ snapshots:
 
   '@types/npm-registry-fetch@8.0.8':
     dependencies:
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
       '@types/node-fetch': 2.6.12
       '@types/npm-package-arg': 6.1.4
       '@types/npmlog': 7.0.0
@@ -10254,11 +10254,11 @@ snapshots:
 
   '@types/npmlog@7.0.0':
     dependencies:
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
 
   '@types/pacote@11.1.8':
     dependencies:
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
       '@types/npm-registry-fetch': 8.0.8
       '@types/npmlog': 7.0.0
       '@types/ssri': 7.1.5
@@ -10271,12 +10271,12 @@ snapshots:
 
   '@types/progress@2.0.7':
     dependencies:
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
 
   '@types/pumpify@1.4.4':
     dependencies:
       '@types/duplexify': 3.6.4
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
 
   '@types/q@0.0.32': {}
 
@@ -10287,7 +10287,7 @@ snapshots:
   '@types/request@2.48.12':
     dependencies:
       '@types/caseless': 0.12.5
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
       '@types/tough-cookie': 4.0.5
       form-data: 2.5.3
 
@@ -10304,7 +10304,7 @@ snapshots:
   '@types/send@0.17.4':
     dependencies:
       '@types/mime': 1.3.5
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
 
   '@types/serve-index@1.9.4':
     dependencies:
@@ -10313,23 +10313,23 @@ snapshots:
   '@types/serve-static@1.15.7':
     dependencies:
       '@types/http-errors': 2.0.4
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
       '@types/send': 0.17.4
 
-  '@types/shelljs@0.8.15':
+  '@types/shelljs@0.8.16':
     dependencies:
       '@types/glob': 7.2.0
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
 
   '@types/sockjs@0.3.36':
     dependencies:
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
 
   '@types/source-list-map@0.1.6': {}
 
   '@types/ssri@7.1.5':
     dependencies:
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
 
   '@types/stack-trace@0.0.33': {}
 
@@ -10348,17 +10348,17 @@ snapshots:
   '@types/watchpack@2.4.4':
     dependencies:
       '@types/graceful-fs': 4.1.9
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
 
   '@types/webpack-sources@3.2.3':
     dependencies:
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
       '@types/source-list-map': 0.1.6
       source-map: 0.7.4
 
   '@types/webpack@4.41.40':
     dependencies:
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
       '@types/tapable': 1.0.12
       '@types/uglify-js': 3.17.5
       '@types/webpack-sources': 3.2.3
@@ -10367,11 +10367,11 @@ snapshots:
 
   '@types/ws@7.4.7':
     dependencies:
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
 
   '@types/ws@8.18.1':
     dependencies:
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
 
   '@types/yargs-parser@21.0.3': {}
 
@@ -10383,7 +10383,7 @@ snapshots:
 
   '@types/yauzl@2.10.3':
     dependencies:
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
     optional: true
 
   '@typescript-eslint/eslint-plugin@8.32.0(@typescript-eslint/parser@8.32.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)':
@@ -10610,9 +10610,9 @@ snapshots:
       minimatch: 7.4.6
       semver: 7.7.1
 
-  '@vitejs/plugin-basic-ssl@2.0.0(vite@6.3.5(@types/node@20.17.44)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1))':
+  '@vitejs/plugin-basic-ssl@2.0.0(vite@6.3.5(@types/node@20.17.46)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1))':
     dependencies:
-      vite: 6.3.5(@types/node@20.17.44)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1)
+      vite: 6.3.5(@types/node@20.17.46)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1)
 
   '@vitest/expect@3.1.3':
     dependencies:
@@ -10621,13 +10621,13 @@ snapshots:
       chai: 5.2.0
       tinyrainbow: 2.0.0
 
-  '@vitest/mocker@3.1.3(vite@6.3.5(@types/node@20.17.44)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1))':
+  '@vitest/mocker@3.1.3(vite@6.3.5(@types/node@20.17.46)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1))':
     dependencies:
       '@vitest/spy': 3.1.3
       estree-walker: 3.0.3
       magic-string: 0.30.17
     optionalDependencies:
-      vite: 6.3.5(@types/node@20.17.44)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1)
+      vite: 6.3.5(@types/node@20.17.46)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1)
 
   '@vitest/pretty-format@3.1.3':
     dependencies:
@@ -10729,7 +10729,7 @@ snapshots:
       '@web/test-runner-core': 0.13.4
       '@web/test-runner-coverage-v8': 0.8.0
       chrome-launcher: 0.15.2
-      puppeteer-core: 24.8.1
+      puppeteer-core: 24.8.2
     transitivePeerDependencies:
       - bare-buffer
       - bufferutil
@@ -11199,7 +11199,7 @@ snapshots:
 
   baseline-browser-mapping@2.3.0:
     dependencies:
-      '@mdn/browser-compat-data': 6.0.12
+      '@mdn/browser-compat-data': 6.0.13
       web-features: 2.34.2
 
   basic-ftp@5.0.5: {}
@@ -11359,7 +11359,7 @@ snapshots:
   browserslist@4.24.5:
     dependencies:
       caniuse-lite: 1.0.30001717
-      electron-to-chromium: 1.5.150
+      electron-to-chromium: 1.5.151
       node-releases: 2.0.19
       update-browserslist-db: 1.1.3(browserslist@4.24.5)
 
@@ -11505,7 +11505,7 @@ snapshots:
 
   chrome-launcher@0.15.2:
     dependencies:
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
       escape-string-regexp: 4.0.0
       is-wsl: 2.2.0
       lighthouse-logger: 1.4.2
@@ -12005,7 +12005,7 @@ snapshots:
 
   ee-first@1.1.1: {}
 
-  electron-to-chromium@1.5.150: {}
+  electron-to-chromium@1.5.151: {}
 
   emoji-regex@10.4.0: {}
 
@@ -12044,8 +12044,8 @@ snapshots:
 
   engine.io@6.6.4:
     dependencies:
-      '@types/cors': 2.8.17
-      '@types/node': 20.17.44
+      '@types/cors': 2.8.18
+      '@types/node': 20.17.46
       accepts: 1.3.8
       base64id: 2.0.0
       cookie: 0.7.2
@@ -12308,7 +12308,7 @@ snapshots:
       '@humanfs/node': 0.16.6
       '@humanwhocodes/module-importer': 1.0.1
       '@humanwhocodes/retry': 0.4.3
-      '@modelcontextprotocol/sdk': 1.11.0
+      '@modelcontextprotocol/sdk': 1.11.1
       '@types/estree': 1.0.7
       '@types/json-schema': 7.0.15
       ajv: 6.12.6
@@ -12381,7 +12381,7 @@ snapshots:
 
   eventsource-parser@3.0.1: {}
 
-  eventsource@3.0.6:
+  eventsource@3.0.7:
     dependencies:
       eventsource-parser: 3.0.1
 
@@ -12487,7 +12487,7 @@ snapshots:
 
   extract-zip@2.0.1:
     dependencies:
-      debug: 4.4.0(supports-color@10.0.0)
+      debug: 4.3.4
       get-stream: 5.2.0
       yauzl: 2.10.0
     optionalDependencies:
@@ -12862,7 +12862,7 @@ snapshots:
       node-fetch: 2.7.0(encoding@0.1.13)
       object-hash: 3.0.0
       proto3-json-serializer: 2.0.2
-      protobufjs: 7.4.0
+      protobufjs: 7.5.1
       retry-request: 7.0.2(encoding@0.1.13)(supports-color@10.0.0)
       uuid: 9.0.1
     transitivePeerDependencies:
@@ -12877,10 +12877,10 @@ snapshots:
 
   graphemer@1.4.0: {}
 
-  grpc-gcp@1.0.1(protobufjs@7.4.0):
+  grpc-gcp@1.0.1(protobufjs@7.5.1):
     dependencies:
       '@grpc/grpc-js': 1.13.3
-      protobufjs: 7.4.0
+      protobufjs: 7.5.1
 
   gtoken@7.1.0(encoding@0.1.13)(supports-color@10.0.0):
     dependencies:
@@ -12974,7 +12974,7 @@ snapshots:
       deep-equal: 1.0.1
       http-errors: 1.8.1
 
-  http-cache-semantics@4.1.1: {}
+  http-cache-semantics@4.2.0: {}
 
   http-deceiver@1.2.7: {}
 
@@ -13461,7 +13461,7 @@ snapshots:
 
   jest-worker@27.5.1:
     dependencies:
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
       merge-stream: 2.0.0
       supports-color: 8.1.1
 
@@ -13931,7 +13931,7 @@ snapshots:
     dependencies:
       '@npmcli/agent': 3.0.0
       cacache: 19.0.1
-      http-cache-semantics: 4.1.1
+      http-cache-semantics: 4.2.0
       minipass: 7.1.2
       minipass-fetch: 4.0.1
       minipass-flush: 1.0.5
@@ -14687,9 +14687,9 @@ snapshots:
 
   proto3-json-serializer@2.0.2:
     dependencies:
-      protobufjs: 7.4.0
+      protobufjs: 7.5.1
 
-  protobufjs@7.4.0:
+  protobufjs@7.5.1:
     dependencies:
       '@protobufjs/aspromise': 1.1.2
       '@protobufjs/base64': 1.1.2
@@ -14701,7 +14701,7 @@ snapshots:
       '@protobufjs/path': 1.1.2
       '@protobufjs/pool': 1.1.0
       '@protobufjs/utf8': 1.1.0
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
       long: 5.3.2
 
   protractor@7.0.0:
@@ -14789,9 +14789,9 @@ snapshots:
       - supports-color
       - utf-8-validate
 
-  puppeteer-core@24.8.1:
+  puppeteer-core@24.8.2:
     dependencies:
-      '@puppeteer/browsers': 2.10.3
+      '@puppeteer/browsers': 2.10.4
       chromium-bidi: 5.1.0(devtools-protocol@0.0.1439962)
       debug: 4.4.0(supports-color@10.0.0)
       devtools-protocol: 0.0.1439962
@@ -15065,12 +15065,12 @@ snapshots:
     optionalDependencies:
       '@babel/code-frame': 7.27.1
 
-  rollup-plugin-sourcemaps2@0.5.1(@types/node@20.17.44)(rollup@4.40.2):
+  rollup-plugin-sourcemaps2@0.5.1(@types/node@20.17.46)(rollup@4.40.2):
     dependencies:
       '@rollup/pluginutils': 5.1.4(rollup@4.40.2)
       rollup: 4.40.2
     optionalDependencies:
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
 
   rollup@4.40.2:
     dependencies:
@@ -15865,14 +15865,14 @@ snapshots:
     dependencies:
       typescript: 5.8.3
 
-  ts-node@10.9.2(@types/node@20.17.44)(typescript@5.8.3):
+  ts-node@10.9.2(@types/node@20.17.46)(typescript@5.8.3):
     dependencies:
       '@cspotcode/source-map-support': 0.8.1
       '@tsconfig/node10': 1.0.11
       '@tsconfig/node12': 1.0.11
       '@tsconfig/node14': 1.0.3
       '@tsconfig/node16': 1.0.4
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
       acorn: 8.14.1
       acorn-walk: 8.3.4
       arg: 4.1.3
@@ -16032,7 +16032,7 @@ snapshots:
     dependencies:
       imurmurhash: 0.1.4
 
-  universal-user-agent@7.0.2: {}
+  universal-user-agent@7.0.3: {}
 
   universalify@0.1.2: {}
 
@@ -16153,13 +16153,13 @@ snapshots:
       core-util-is: 1.0.2
       extsprintf: 1.3.0
 
-  vite-node@3.1.3(@types/node@20.17.44)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1):
+  vite-node@3.1.3(@types/node@20.17.46)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1):
     dependencies:
       cac: 6.7.14
       debug: 4.4.0(supports-color@10.0.0)
       es-module-lexer: 1.7.0
       pathe: 2.0.3
-      vite: 6.3.5(@types/node@20.17.44)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1)
+      vite: 6.3.5(@types/node@20.17.46)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1)
     transitivePeerDependencies:
       - '@types/node'
       - jiti
@@ -16174,7 +16174,7 @@ snapshots:
       - tsx
       - yaml
 
-  vite@6.3.5(@types/node@20.17.44)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1):
+  vite@6.3.5(@types/node@20.17.46)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1):
     dependencies:
       esbuild: 0.25.4
       fdir: 6.4.4(picomatch@4.0.2)
@@ -16183,7 +16183,7 @@ snapshots:
       rollup: 4.40.2
       tinyglobby: 0.2.13
     optionalDependencies:
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
       fsevents: 2.3.3
       jiti: 1.21.7
       less: 4.3.0
@@ -16191,10 +16191,10 @@ snapshots:
       terser: 5.39.0
       yaml: 2.7.1
 
-  vitest@3.1.3(@types/node@20.17.44)(jiti@1.21.7)(jsdom@26.1.0)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1):
+  vitest@3.1.3(@types/node@20.17.46)(jiti@1.21.7)(jsdom@26.1.0)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1):
     dependencies:
       '@vitest/expect': 3.1.3
-      '@vitest/mocker': 3.1.3(vite@6.3.5(@types/node@20.17.44)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1))
+      '@vitest/mocker': 3.1.3(vite@6.3.5(@types/node@20.17.46)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1))
       '@vitest/pretty-format': 3.1.3
       '@vitest/runner': 3.1.3
       '@vitest/snapshot': 3.1.3
@@ -16211,11 +16211,11 @@ snapshots:
       tinyglobby: 0.2.13
       tinypool: 1.0.2
       tinyrainbow: 2.0.0
-      vite: 6.3.5(@types/node@20.17.44)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1)
-      vite-node: 3.1.3(@types/node@20.17.44)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1)
+      vite: 6.3.5(@types/node@20.17.46)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1)
+      vite-node: 3.1.3(@types/node@20.17.46)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1)
       why-is-node-running: 2.3.0
     optionalDependencies:
-      '@types/node': 20.17.44
+      '@types/node': 20.17.46
       jsdom: 26.1.0
     transitivePeerDependencies:
       - jiti

From 5093ce0a6c85429a402fcccbdb63f1d1db75bcf6 Mon Sep 17 00:00:00 2001
From: Alan Agius <17563226+alan-agius4@users.noreply.github.com>
Date: Mon, 12 May 2025 09:16:29 +0000
Subject: [PATCH 041/138] fix(@angular/cli): properly handle Node.js
 `require()` errors with ESM modules

Resolve `ERR_REQUIRE_ASYNC_MODULE` when attempting to `require()` ESM modules in a CommonJS context.

Closes #30286

(cherry picked from commit 0ae9c1feb10a4792f8b0b31b0b58db772d20546e)
---
 packages/angular/build/src/utils/load-proxy-config.ts        | 2 +-
 .../architect/node/node-modules-architect-host.ts            | 5 ++++-
 .../build_angular/src/tools/webpack/configs/dev-server.ts    | 2 +-
 packages/angular_devkit/build_webpack/src/utils.ts           | 5 ++++-
 4 files changed, 10 insertions(+), 4 deletions(-)

diff --git a/packages/angular/build/src/utils/load-proxy-config.ts b/packages/angular/build/src/utils/load-proxy-config.ts
index b0882187d0c2..e9e382a7805a 100644
--- a/packages/angular/build/src/utils/load-proxy-config.ts
+++ b/packages/angular/build/src/utils/load-proxy-config.ts
@@ -67,7 +67,7 @@ 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.
diff --git a/packages/angular_devkit/architect/node/node-modules-architect-host.ts b/packages/angular_devkit/architect/node/node-modules-architect-host.ts
index e01394a22d04..e30badffcc97 100644
--- a/packages/angular_devkit/architect/node/node-modules-architect-host.ts
+++ b/packages/angular_devkit/architect/node/node-modules-architect-host.ts
@@ -324,7 +324,10 @@ async function getBuilder(builderPath: string): Promise<any> {
       try {
         return localRequire(builderPath);
       } catch (e) {
-        if ((e as NodeJS.ErrnoException).code === 'ERR_REQUIRE_ESM') {
+        if (
+          (e as NodeJS.ErrnoException).code === 'ERR_REQUIRE_ESM' ||
+          (e as NodeJS.ErrnoException).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.
diff --git a/packages/angular_devkit/build_angular/src/tools/webpack/configs/dev-server.ts b/packages/angular_devkit/build_angular/src/tools/webpack/configs/dev-server.ts
index bb23a1860510..70d863cdfbfd 100644
--- a/packages/angular_devkit/build_angular/src/tools/webpack/configs/dev-server.ts
+++ b/packages/angular_devkit/build_angular/src/tools/webpack/configs/dev-server.ts
@@ -210,7 +210,7 @@ async function addProxyConfig(
         proxyConfiguration = require(proxyPath);
       } catch (e) {
         assertIsError(e);
-        if (e.code !== 'ERR_REQUIRE_ESM') {
+        if (e.code !== 'ERR_REQUIRE_ESM' && e.code !== 'ERR_REQUIRE_ASYNC_MODULE') {
           throw e;
         }
 
diff --git a/packages/angular_devkit/build_webpack/src/utils.ts b/packages/angular_devkit/build_webpack/src/utils.ts
index 7a0f228ec676..0254848053f0 100644
--- a/packages/angular_devkit/build_webpack/src/utils.ts
+++ b/packages/angular_devkit/build_webpack/src/utils.ts
@@ -90,7 +90,10 @@ export async function getWebpackConfig(configPath: string): Promise<Configuratio
       try {
         return require(configPath);
       } catch (e) {
-        if ((e as NodeJS.ErrnoException).code === 'ERR_REQUIRE_ESM') {
+        if (
+          (e as NodeJS.ErrnoException).code === 'ERR_REQUIRE_ESM' ||
+          (e as NodeJS.ErrnoException).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.

From e6eca4ae62b101086caad9f31fe1c3f7b079007c Mon Sep 17 00:00:00 2001
From: Alan Agius <17563226+alan-agius4@users.noreply.github.com>
Date: Mon, 12 May 2025 09:36:45 +0000
Subject: [PATCH 042/138] ci: skip `e2e-snapshots` on non-main branches

Snapshot updates occur only on the `main` branch, so running them on patch branches provides no benefit.

(cherry picked from commit 5d296bc0796ccf1a517a03f836f2b6386374ca70)
---
 .github/workflows/ci.yml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 5ea6cb69a0db..e4429a0bf54f 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -152,6 +152,7 @@ jobs:
 
   e2e-snapshots:
     needs: test
+    if: github.ref == 'refs/heads/main'
     strategy:
       fail-fast: false
       matrix:

From 0af4e106052403b2de3eae86b4c0f1d9dfd5795f Mon Sep 17 00:00:00 2001
From: Angular Robot <angular-robot@google.com>
Date: Mon, 12 May 2025 12:04:49 +0000
Subject: [PATCH 043/138] build: update cross-repo angular dependencies

See associated pull request for more information.

(cherry picked from commit b37df3ac494942d343a5472ca0ab6736224d1d02)
---
 .../windows-bazel-test/action.yml             |  2 +-
 .../assistant-to-the-branch-manager.yml       |  2 +-
 .github/workflows/ci.yml                      | 50 +++++++++----------
 .github/workflows/dev-infra.yml               |  4 +-
 .github/workflows/feature-requests.yml        |  2 +-
 .github/workflows/perf.yml                    |  6 +--
 .github/workflows/pr.yml                      | 42 ++++++++--------
 package.json                                  |  2 +-
 pnpm-lock.yaml                                | 12 ++---
 tests/legacy-cli/e2e/ng-snapshot/package.json | 32 ++++++------
 10 files changed, 77 insertions(+), 77 deletions(-)

diff --git a/.github/shared-actions/windows-bazel-test/action.yml b/.github/shared-actions/windows-bazel-test/action.yml
index 524eb1c3a684..baa3e458505a 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@6f44591738d6f0374148fffc723788c62e5cb775
       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 8aafbe2bbaa0..31a0ec991eca 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@030487ad792aad6856c48b2d1e699b0d96e11a7b
+      - uses: angular/dev-infra/github-actions/branch-manager@6f44591738d6f0374148fffc723788c62e5cb775
         with:
           angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }}
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index e4429a0bf54f..3689040d58ba 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@030487ad792aad6856c48b2d1e699b0d96e11a7b
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@6f44591738d6f0374148fffc723788c62e5cb775
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@030487ad792aad6856c48b2d1e699b0d96e11a7b
+        uses: angular/dev-infra/github-actions/bazel/setup@6f44591738d6f0374148fffc723788c62e5cb775
       - 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@030487ad792aad6856c48b2d1e699b0d96e11a7b
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@6f44591738d6f0374148fffc723788c62e5cb775
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@030487ad792aad6856c48b2d1e699b0d96e11a7b
+        uses: angular/dev-infra/github-actions/bazel/setup@6f44591738d6f0374148fffc723788c62e5cb775
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@030487ad792aad6856c48b2d1e699b0d96e11a7b
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@6f44591738d6f0374148fffc723788c62e5cb775
         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@030487ad792aad6856c48b2d1e699b0d96e11a7b
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@6f44591738d6f0374148fffc723788c62e5cb775
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@030487ad792aad6856c48b2d1e699b0d96e11a7b
+        uses: angular/dev-infra/github-actions/bazel/setup@6f44591738d6f0374148fffc723788c62e5cb775
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@030487ad792aad6856c48b2d1e699b0d96e11a7b
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@6f44591738d6f0374148fffc723788c62e5cb775
         with:
           google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }}
       - name: Install node modules
@@ -87,13 +87,13 @@ jobs:
     runs-on: ${{ matrix.os }}
     steps:
       - name: Initialize environment
-        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@030487ad792aad6856c48b2d1e699b0d96e11a7b
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@6f44591738d6f0374148fffc723788c62e5cb775
       - name: Install node modules
         run: pnpm install --frozen-lockfile
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@030487ad792aad6856c48b2d1e699b0d96e11a7b
+        uses: angular/dev-infra/github-actions/bazel/setup@6f44591738d6f0374148fffc723788c62e5cb775
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@030487ad792aad6856c48b2d1e699b0d96e11a7b
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@6f44591738d6f0374148fffc723788c62e5cb775
         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@030487ad792aad6856c48b2d1e699b0d96e11a7b
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@6f44591738d6f0374148fffc723788c62e5cb775
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@030487ad792aad6856c48b2d1e699b0d96e11a7b
+        uses: angular/dev-infra/github-actions/bazel/setup@6f44591738d6f0374148fffc723788c62e5cb775
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@030487ad792aad6856c48b2d1e699b0d96e11a7b
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@6f44591738d6f0374148fffc723788c62e5cb775
         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@030487ad792aad6856c48b2d1e699b0d96e11a7b
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@6f44591738d6f0374148fffc723788c62e5cb775
       - name: Install node modules
         run: pnpm install --frozen-lockfile
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@030487ad792aad6856c48b2d1e699b0d96e11a7b
+        uses: angular/dev-infra/github-actions/bazel/setup@6f44591738d6f0374148fffc723788c62e5cb775
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@030487ad792aad6856c48b2d1e699b0d96e11a7b
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@6f44591738d6f0374148fffc723788c62e5cb775
         with:
           google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }}
       - name: Run CLI E2E tests
@@ -163,13 +163,13 @@ jobs:
     runs-on: ${{ matrix.os }}
     steps:
       - name: Initialize environment
-        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@030487ad792aad6856c48b2d1e699b0d96e11a7b
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@6f44591738d6f0374148fffc723788c62e5cb775
       - name: Install node modules
         run: pnpm install --frozen-lockfile
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@030487ad792aad6856c48b2d1e699b0d96e11a7b
+        uses: angular/dev-infra/github-actions/bazel/setup@6f44591738d6f0374148fffc723788c62e5cb775
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@030487ad792aad6856c48b2d1e699b0d96e11a7b
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@6f44591738d6f0374148fffc723788c62e5cb775
         with:
           google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }}
       - name: Run CLI E2E tests
@@ -183,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@030487ad792aad6856c48b2d1e699b0d96e11a7b
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@6f44591738d6f0374148fffc723788c62e5cb775
       - name: Install node modules
         run: pnpm install --frozen-lockfile
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@030487ad792aad6856c48b2d1e699b0d96e11a7b
+        uses: angular/dev-infra/github-actions/bazel/setup@6f44591738d6f0374148fffc723788c62e5cb775
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@030487ad792aad6856c48b2d1e699b0d96e11a7b
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@6f44591738d6f0374148fffc723788c62e5cb775
         with:
           google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }}
       - name: Run E2E Browser tests
@@ -219,11 +219,11 @@ jobs:
       CIRCLE_BRANCH: ${{ github.ref_name }}
     steps:
       - name: Initialize environment
-        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@030487ad792aad6856c48b2d1e699b0d96e11a7b
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@6f44591738d6f0374148fffc723788c62e5cb775
       - name: Install node modules
         run: pnpm install --frozen-lockfile
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@030487ad792aad6856c48b2d1e699b0d96e11a7b
+        uses: angular/dev-infra/github-actions/bazel/setup@6f44591738d6f0374148fffc723788c62e5cb775
       - 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 50700b4f7326..79c2f4854902 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@030487ad792aad6856c48b2d1e699b0d96e11a7b
+      - uses: angular/dev-infra/github-actions/commit-message-based-labels@6f44591738d6f0374148fffc723788c62e5cb775
         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@030487ad792aad6856c48b2d1e699b0d96e11a7b
+      - uses: angular/dev-infra/github-actions/post-approval-changes@6f44591738d6f0374148fffc723788c62e5cb775
         with:
           angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }}
diff --git a/.github/workflows/feature-requests.yml b/.github/workflows/feature-requests.yml
index fd144c9760dc..1e239842801c 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@030487ad792aad6856c48b2d1e699b0d96e11a7b
+      - uses: angular/dev-infra/github-actions/feature-request@6f44591738d6f0374148fffc723788c62e5cb775
         with:
           angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }}
diff --git a/.github/workflows/perf.yml b/.github/workflows/perf.yml
index 78081fa54cc3..528cae69fc20 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@030487ad792aad6856c48b2d1e699b0d96e11a7b
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@6f44591738d6f0374148fffc723788c62e5cb775
       - 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@030487ad792aad6856c48b2d1e699b0d96e11a7b
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@6f44591738d6f0374148fffc723788c62e5cb775
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@030487ad792aad6856c48b2d1e699b0d96e11a7b
+        uses: angular/dev-infra/github-actions/bazel/setup@6f44591738d6f0374148fffc723788c62e5cb775
       - 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 d44cea3ef466..84f8efa21c34 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@030487ad792aad6856c48b2d1e699b0d96e11a7b
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@6f44591738d6f0374148fffc723788c62e5cb775
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@030487ad792aad6856c48b2d1e699b0d96e11a7b
+        uses: angular/dev-infra/github-actions/bazel/setup@6f44591738d6f0374148fffc723788c62e5cb775
       - 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@030487ad792aad6856c48b2d1e699b0d96e11a7b
+        uses: angular/dev-infra/github-actions/linting/licenses@6f44591738d6f0374148fffc723788c62e5cb775
       - 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@030487ad792aad6856c48b2d1e699b0d96e11a7b
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@6f44591738d6f0374148fffc723788c62e5cb775
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@030487ad792aad6856c48b2d1e699b0d96e11a7b
+        uses: angular/dev-infra/github-actions/bazel/setup@6f44591738d6f0374148fffc723788c62e5cb775
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@030487ad792aad6856c48b2d1e699b0d96e11a7b
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@6f44591738d6f0374148fffc723788c62e5cb775
       - name: Install node modules
         run: pnpm install --frozen-lockfile
       - name: Build release targets
@@ -93,11 +93,11 @@ jobs:
     runs-on: ubuntu-latest
     steps:
       - name: Initialize environment
-        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@030487ad792aad6856c48b2d1e699b0d96e11a7b
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@6f44591738d6f0374148fffc723788c62e5cb775
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@030487ad792aad6856c48b2d1e699b0d96e11a7b
+        uses: angular/dev-infra/github-actions/bazel/setup@6f44591738d6f0374148fffc723788c62e5cb775
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@030487ad792aad6856c48b2d1e699b0d96e11a7b
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@6f44591738d6f0374148fffc723788c62e5cb775
       - 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@030487ad792aad6856c48b2d1e699b0d96e11a7b
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@6f44591738d6f0374148fffc723788c62e5cb775
       - name: Install node modules
         run: pnpm install --frozen-lockfile
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@030487ad792aad6856c48b2d1e699b0d96e11a7b
+        uses: angular/dev-infra/github-actions/bazel/setup@6f44591738d6f0374148fffc723788c62e5cb775
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@030487ad792aad6856c48b2d1e699b0d96e11a7b
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@6f44591738d6f0374148fffc723788c62e5cb775
       - 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@030487ad792aad6856c48b2d1e699b0d96e11a7b
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@6f44591738d6f0374148fffc723788c62e5cb775
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@030487ad792aad6856c48b2d1e699b0d96e11a7b
+        uses: angular/dev-infra/github-actions/bazel/setup@6f44591738d6f0374148fffc723788c62e5cb775
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@030487ad792aad6856c48b2d1e699b0d96e11a7b
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@6f44591738d6f0374148fffc723788c62e5cb775
         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@030487ad792aad6856c48b2d1e699b0d96e11a7b
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@6f44591738d6f0374148fffc723788c62e5cb775
       - name: Install node modules
         run: pnpm install --frozen-lockfile
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@030487ad792aad6856c48b2d1e699b0d96e11a7b
+        uses: angular/dev-infra/github-actions/bazel/setup@6f44591738d6f0374148fffc723788c62e5cb775
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@030487ad792aad6856c48b2d1e699b0d96e11a7b
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@6f44591738d6f0374148fffc723788c62e5cb775
       - 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@030487ad792aad6856c48b2d1e699b0d96e11a7b
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@6f44591738d6f0374148fffc723788c62e5cb775
       - name: Install node modules
         run: pnpm install --frozen-lockfile
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@030487ad792aad6856c48b2d1e699b0d96e11a7b
+        uses: angular/dev-infra/github-actions/bazel/setup@6f44591738d6f0374148fffc723788c62e5cb775
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@030487ad792aad6856c48b2d1e699b0d96e11a7b
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@6f44591738d6f0374148fffc723788c62e5cb775
       - 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/package.json b/package.json
index a0e77de8d5cc..c1cb238c6eb2 100644
--- a/package.json
+++ b/package.json
@@ -55,7 +55,7 @@
     "@angular/forms": "20.0.0-rc.0",
     "@angular/localize": "20.0.0-rc.0",
     "@angular/material": "20.0.0-rc.0",
-    "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#14ea8ca5b4adfb73a1f4ad531116cd448379a0a3",
+    "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#aa535e2d49ecfb0fbd230b192cb97c3d193ca3ee",
     "@angular/platform-browser": "20.0.0-rc.0",
     "@angular/platform-server": "20.0.0-rc.0",
     "@angular/router": "20.0.0-rc.0",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 43ed810a029f..fe69882c349c 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -42,8 +42,8 @@ importers:
         specifier: 20.0.0-rc.0
         version: 20.0.0-rc.0(s3hqhtlo3u2ktlkecz27drcsye)
       '@angular/ng-dev':
-        specifier: https://github.com/angular/dev-infra-private-ng-dev-builds.git#14ea8ca5b4adfb73a1f4ad531116cd448379a0a3
-        version: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/14ea8ca5b4adfb73a1f4ad531116cd448379a0a3(encoding@0.1.13)
+        specifier: https://github.com/angular/dev-infra-private-ng-dev-builds.git#aa535e2d49ecfb0fbd230b192cb97c3d193ca3ee
+        version: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/aa535e2d49ecfb0fbd230b192cb97c3d193ca3ee(encoding@0.1.13)
       '@angular/platform-browser':
         specifier: 20.0.0-rc.0
         version: 20.0.0-rc.0(@angular/animations@20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))
@@ -975,9 +975,9 @@ packages:
       '@angular/platform-browser': ^20.0.0-0 || ^20.1.0-0 || ^20.2.0-0 || ^20.3.0-0 || ^21.0.0-0
       rxjs: ^6.5.3 || ^7.4.0
 
-  '@angular/ng-dev@https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/14ea8ca5b4adfb73a1f4ad531116cd448379a0a3':
-    resolution: {tarball: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/14ea8ca5b4adfb73a1f4ad531116cd448379a0a3}
-    version: 0.0.0-030487ad792aad6856c48b2d1e699b0d96e11a7b
+  '@angular/ng-dev@https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/aa535e2d49ecfb0fbd230b192cb97c3d193ca3ee':
+    resolution: {tarball: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/aa535e2d49ecfb0fbd230b192cb97c3d193ca3ee}
+    version: 0.0.0-47ce326218e10e67066c27f618129ac8a13a7033
     hasBin: true
 
   '@angular/platform-browser@20.0.0-rc.0':
@@ -8274,7 +8274,7 @@ snapshots:
       rxjs: 7.8.2
       tslib: 2.8.1
 
-  '@angular/ng-dev@https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/14ea8ca5b4adfb73a1f4ad531116cd448379a0a3(encoding@0.1.13)':
+  '@angular/ng-dev@https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/aa535e2d49ecfb0fbd230b192cb97c3d193ca3ee(encoding@0.1.13)':
     dependencies:
       '@google-cloud/spanner': 7.21.0(encoding@0.1.13)(supports-color@10.0.0)
       '@octokit/rest': 21.1.1
diff --git a/tests/legacy-cli/e2e/ng-snapshot/package.json b/tests/legacy-cli/e2e/ng-snapshot/package.json
index 3c43dd74c935..54f66ebd981a 100644
--- a/tests/legacy-cli/e2e/ng-snapshot/package.json
+++ b/tests/legacy-cli/e2e/ng-snapshot/package.json
@@ -2,21 +2,21 @@
   "description": "snapshot versions of Angular for e2e testing",
   "private": true,
   "dependencies": {
-    "@angular/animations": "github:angular/animations-builds#2c2628d9c7fef0599dcc51c52beea24331eb3da4",
-    "@angular/cdk": "github:angular/cdk-builds#ff41eac39a2e97c4b4be178d24cbf1f5e38cc2b5",
-    "@angular/common": "github:angular/common-builds#19e618973b888c4e8694edb7bf61ccc6cb376f03",
-    "@angular/compiler": "github:angular/compiler-builds#2b978c6d1c31772b3fd829622ed2da7c436fd8dd",
-    "@angular/compiler-cli": "github:angular/compiler-cli-builds#b4c99df93e2593ec6160ffb04c46c29b35e5682a",
-    "@angular/core": "github:angular/core-builds#328d8aad5b4291f0472772bf6d98df1cefcda259",
-    "@angular/forms": "github:angular/forms-builds#149f321e14b0ac6e5be2c70fad50a312c4f5aff3",
-    "@angular/language-service": "github:angular/language-service-builds#35b78373bed13dda904ed36dce8493b2e6274477",
-    "@angular/localize": "github:angular/localize-builds#0e6cf5d88b933073d1792891ded501f4eb37d732",
-    "@angular/material": "github:angular/material-builds#435c3d79ce7209aa1829eb967487cac68ea0a1fa",
-    "@angular/material-moment-adapter": "github:angular/material-moment-adapter-builds#c23417698c2127ccdf71960aba75929c185041ac",
-    "@angular/platform-browser": "github:angular/platform-browser-builds#d721f1ffc0cdc97f6c12588355c0ed18eb99a892",
-    "@angular/platform-browser-dynamic": "github:angular/platform-browser-dynamic-builds#f4a141cef34306411c11f73b31ebdd833807212b",
-    "@angular/platform-server": "github:angular/platform-server-builds#8f2bcc358f7f5a3330e9f2e836dbd9b0602d968a",
-    "@angular/router": "github:angular/router-builds#cea8c97759e5a391e19f7037cb304947881ed2ce",
-    "@angular/service-worker": "github:angular/service-worker-builds#81b2ef92effd324d6f7322341e9d7ae3108c4146"
+    "@angular/animations": "github:angular/animations-builds#55074297973d498bfe7a18abda2769c009dc2ff9",
+    "@angular/cdk": "github:angular/cdk-builds#a8a5a6a8d13fb6f2d2c5a708d4648d6fe7a900c9",
+    "@angular/common": "github:angular/common-builds#2f0d8ff6c9a49a72cdda62ab8802cc9176875c03",
+    "@angular/compiler": "github:angular/compiler-builds#463d634c9c87e6fafa131ee5ce9d619246ea25c3",
+    "@angular/compiler-cli": "github:angular/compiler-cli-builds#b5695a4e7e634185a4439e792892d8c97c779b68",
+    "@angular/core": "github:angular/core-builds#1d794219de1260cff814e0d9461cc9ef5b9c57c8",
+    "@angular/forms": "github:angular/forms-builds#722c031a57bba5a4d64300bd6e92ca569bc8631a",
+    "@angular/language-service": "github:angular/language-service-builds#2e436eb69ffb6adbe7376a0f32759112763a7b38",
+    "@angular/localize": "github:angular/localize-builds#c8b4ec2358bd0d811f1dcd6d4c887e1134bef863",
+    "@angular/material": "github:angular/material-builds#8d389b7225d87e9e54501f4a1a59209c9124a636",
+    "@angular/material-moment-adapter": "github:angular/material-moment-adapter-builds#26d976545ca26c79ec089578de86398d97877259",
+    "@angular/platform-browser": "github:angular/platform-browser-builds#6e9d488c6b2e5c42736b4942f7baa7c8b6d904da",
+    "@angular/platform-browser-dynamic": "github:angular/platform-browser-dynamic-builds#ecc55789bc80b8717e63f809cc5ec01c0d10909e",
+    "@angular/platform-server": "github:angular/platform-server-builds#021ace94e7dda237517268401cc33d7c81a5f4ac",
+    "@angular/router": "github:angular/router-builds#2770f5814bf69186d9e5b7cb3220a70b3e90d0dd",
+    "@angular/service-worker": "github:angular/service-worker-builds#926e69fe73d96b9d3b18fc166123bdc3ed08b468"
   }
 }

From e36bf964a776b04f6a9193387692274865e1630b Mon Sep 17 00:00:00 2001
From: Charles Lyding <19598772+clydin@users.noreply.github.com>
Date: Thu, 8 May 2025 19:06:39 -0400
Subject: [PATCH 044/138] fix(@angular/build): allow TestBed provider
 configuration with vitest unit-testing

The experimental `unit-test` builder with the `vitest` runner configured
can now specify an Angular providers file via the `providersFile` option.
This allows the TestBed initialization to use the providers defined in
this file for all executed tests. The contents of the providers file should
include a default export with an array of one or more Angular providers.
As an example:
```
import { provideZonelessChangeDetection } from '@angular/core';

export default [
  provideZonelessChangeDetection(),
];

```

(cherry picked from commit ceaf6b5af8fd409195ba3830c881b7a3fa3e1fd0)
---
 .../build/src/builders/unit-test/builder.ts       | 15 ++++++++++++++-
 .../build/src/builders/unit-test/options.ts       |  1 +
 .../build/src/builders/unit-test/schema.json      |  5 +++++
 3 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/packages/angular/build/src/builders/unit-test/builder.ts b/packages/angular/build/src/builders/unit-test/builder.ts
index f103b6ddc8af..e86895fdf579 100644
--- a/packages/angular/build/src/builders/unit-test/builder.ts
+++ b/packages/angular/build/src/builders/unit-test/builder.ts
@@ -142,15 +142,28 @@ export async function* execute(
     loadContent: async () => {
       const contents: string[] = [
         // Initialize the Angular testing environment
+        `import { NgModule } from '@angular/core';`,
         `import { getTestBed, ɵgetCleanupHook as getCleanupHook } from '@angular/core/testing';`,
         `import { BrowserTestingModule, platformBrowserTesting } from '@angular/platform-browser/testing';`,
         `import { beforeEach, afterEach } from 'vitest';`,
         '',
+        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));`,
         '',
-        `getTestBed().initTestEnvironment(BrowserTestingModule, platformBrowserTesting(), {`,
+        `@NgModule({`,
+        `  providers,`,
+        `})`,
+        `export class TestModule {}`,
+        '',
+        `getTestBed().initTestEnvironment([BrowserTestingModule, TestModule], platformBrowserTesting(), {`,
         `  errorOnUnknownElements: true,`,
         `  errorOnUnknownProperties: true,`,
         '});',
diff --git a/packages/angular/build/src/builders/unit-test/options.ts b/packages/angular/build/src/builders/unit-test/options.ts
index 6bfe7361eebb..9edd02d1c14a 100644
--- a/packages/angular/build/src/builders/unit-test/options.ts
+++ b/packages/angular/build/src/builders/unit-test/options.ts
@@ -52,6 +52,7 @@ export async function normalizeOptions(
     reporters,
     browsers,
     watch,
+    providersFile: options.providersFile && path.join(workspaceRoot, options.providersFile),
   };
 }
 
diff --git a/packages/angular/build/src/builders/unit-test/schema.json b/packages/angular/build/src/builders/unit-test/schema.json
index 223aa149bcdf..8cc91c7d8b90 100644
--- a/packages/angular/build/src/builders/unit-test/schema.json
+++ b/packages/angular/build/src/builders/unit-test/schema.json
@@ -65,6 +65,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,

From 8cbb78ddda27e85252106fe1818ed47937cc3112 Mon Sep 17 00:00:00 2001
From: Angular Robot <angular-robot@google.com>
Date: Mon, 12 May 2025 14:04:16 +0000
Subject: [PATCH 045/138] build: lock file maintenance

See associated pull request for more information.

(cherry picked from commit bd180658ef55bc62a0f7a09eeb58a119c5d58d73)
---
 pnpm-lock.yaml | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index fe69882c349c..dbfdaf3359ae 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -2053,8 +2053,8 @@ packages:
   '@mdn/browser-compat-data@6.0.13':
     resolution: {integrity: sha512-RSYYaex/5lC4mim5pMTKHxfSpWf7Oc4r8Vk4exFVvt/KzIj7GacXAiYu5WfGnIWrBaa0KaSPda7oanQiFwjbeg==}
 
-  '@modelcontextprotocol/sdk@1.11.1':
-    resolution: {integrity: sha512-9LfmxKTb1v+vUS1/emSk1f5ePmTLkb9Le9AxOB5T0XM59EUumwcS45z05h7aiZx3GI0Bl7mjb3FMEglYj+acuQ==}
+  '@modelcontextprotocol/sdk@1.11.2':
+    resolution: {integrity: sha512-H9vwztj5OAqHg9GockCQC06k1natgcxWQSRpQcPJf6i5+MWBzfKkRtxGbjQf0X2ihii0ffLZCRGbYV2f2bjNCQ==}
     engines: {node: '>=18'}
 
   '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3':
@@ -9486,7 +9486,7 @@ snapshots:
 
   '@mdn/browser-compat-data@6.0.13': {}
 
-  '@modelcontextprotocol/sdk@1.11.1':
+  '@modelcontextprotocol/sdk@1.11.2':
     dependencies:
       content-type: 1.0.5
       cors: 2.8.5
@@ -12308,7 +12308,7 @@ snapshots:
       '@humanfs/node': 0.16.6
       '@humanwhocodes/module-importer': 1.0.1
       '@humanwhocodes/retry': 0.4.3
-      '@modelcontextprotocol/sdk': 1.11.1
+      '@modelcontextprotocol/sdk': 1.11.2
       '@types/estree': 1.0.7
       '@types/json-schema': 7.0.15
       ajv: 6.12.6

From fa3dc6387db971be265c1c5391c71a23c62df15c Mon Sep 17 00:00:00 2001
From: Charles Lyding <19598772+clydin@users.noreply.github.com>
Date: Mon, 12 May 2025 14:06:20 -0400
Subject: [PATCH 046/138] fix(@angular/build): show unit-test error for missing
 vitest browser package

When using the experimental `unit-test` builder with the `vitest` runner
and the `browsers` option, an error will now be reported if the `@vitest/browser`
package is not found. Previously, the tests would attempt to execute and
produce a runtime error and stack trace. Now an explicit error with instructions
to install the package will be printed to the console prior to building
and executing the tests.

(cherry picked from commit 9a50040b23d2fc7fd624956cfb500b12faf66488)
---
 .../build/src/builders/unit-test/builder.ts   | 77 +++++++++++++------
 1 file changed, 55 insertions(+), 22 deletions(-)

diff --git a/packages/angular/build/src/builders/unit-test/builder.ts b/packages/angular/build/src/builders/unit-test/builder.ts
index e86895fdf579..c4564468f9c6 100644
--- a/packages/angular/build/src/builders/unit-test/builder.ts
+++ b/packages/angular/build/src/builders/unit-test/builder.ts
@@ -181,27 +181,17 @@ 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,
+    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 };
   }
 
+  // Add setup file entries for TestBed initialization and project polyfills
   const setupFiles = ['init-testbed.js'];
   if (buildTargetOptions?.polyfills?.length) {
     setupFiles.push('polyfills.js');
@@ -252,11 +242,9 @@ export async function* execute(
 }
 
 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) {
@@ -267,3 +255,48 @@ function findBrowserProvider(
     } catch {}
   }
 }
+
+function setupBrowserConfiguration(
+  browsers: string[] | undefined,
+  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.',
+    );
+  }
+
+  if (errors) {
+    return { errors };
+  }
+
+  const browser = {
+    enabled: true,
+    provider,
+    instances: browsers.map((browserName) => ({
+      browser: browserName,
+    })),
+  };
+
+  return { browser };
+}

From 0568c9c6a38e1e2e5d459aae92e090f88fe31ec6 Mon Sep 17 00:00:00 2001
From: Alan Agius <17563226+alan-agius4@users.noreply.github.com>
Date: Tue, 13 May 2025 12:17:50 +0000
Subject: [PATCH 047/138] build: update TypeScript integrity to 5.8.3

Update `rules_ts_dependencies` to use TypeScript 5.8.3

(cherry picked from commit cb154ba47128e0b8f2b76605abc0710cb3e0a0aa)
---
 WORKSPACE | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/WORKSPACE b/WORKSPACE
index 99815331f45b..663b9f0af672 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -206,10 +206,9 @@ http_archive(
 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(

From f86837a919b9feda005f5ffa4e62638ece3dcb4f Mon Sep 17 00:00:00 2001
From: Angular Robot <angular-robot@google.com>
Date: Mon, 12 May 2025 22:02:47 +0000
Subject: [PATCH 048/138] build: update rules_angular digest to c0d7927

See associated pull request for more information.

(cherry picked from commit 2fbefc8b4f21f27123c3062b4142e62e68a9d89b)
---
 WORKSPACE | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/WORKSPACE b/WORKSPACE
index 663b9f0af672..43098332611e 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -275,7 +275,7 @@ esbuild_register_toolchains(
 
 git_repository(
     name = "rules_angular",
-    commit = "7fb42d23831222c54dd74bf148758833f60cce6b",
+    commit = "c0d7927a33802db438c01d2ae8ad1884e6c363fd",
     remote = "https://github.com/devversion/rules_angular.git",
 )
 

From cb9d605d5d0108c2e89fb3de2c1c5fc6f5c12b8b Mon Sep 17 00:00:00 2001
From: Angular Robot <angular-robot@google.com>
Date: Tue, 13 May 2025 05:04:00 +0000
Subject: [PATCH 049/138] build: update all non-major dependencies

See associated pull request for more information.

(cherry picked from commit 9d3071d0f6a0ad23b517387d070db89091acf4b5)
---
 package.json                                  |   6 +-
 packages/angular/build/package.json           |   2 +-
 packages/angular/cli/package.json             |   2 +-
 .../angular_devkit/build_angular/package.json |   2 +-
 pnpm-lock.yaml                                | 197 ++++++++++++------
 tools/baseline_browserslist/package.json      |   2 +-
 6 files changed, 143 insertions(+), 68 deletions(-)

diff --git a/package.json b/package.json
index c1cb238c6eb2..4a71d630f355 100644
--- a/package.json
+++ b/package.json
@@ -94,8 +94,8 @@
     "@types/yargs": "^17.0.20",
     "@types/yargs-parser": "^21.0.0",
     "@types/yarnpkg__lockfile": "^1.1.5",
-    "@typescript-eslint/eslint-plugin": "8.32.0",
-    "@typescript-eslint/parser": "8.32.0",
+    "@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",
@@ -134,7 +134,7 @@
     "quicktype-core": "23.1.4",
     "rollup": "4.40.2",
     "rollup-license-plugin": "~3.0.1",
-    "semver": "7.7.1",
+    "semver": "7.7.2",
     "shelljs": "^0.10.0",
     "source-map-support": "0.5.21",
     "tar": "^7.0.0",
diff --git a/packages/angular/build/package.json b/packages/angular/build/package.json
index 207d14c6436e..4072db48aca0 100644
--- a/packages/angular/build/package.json
+++ b/packages/angular/build/package.json
@@ -39,7 +39,7 @@
     "piscina": "5.0.0",
     "rollup": "4.40.2",
     "sass": "1.88.0",
-    "semver": "7.7.1",
+    "semver": "7.7.2",
     "source-map-support": "0.5.21",
     "tinyglobby": "0.2.13",
     "vite": "6.3.5",
diff --git a/packages/angular/cli/package.json b/packages/angular/cli/package.json
index 7c42298590ac..a8f029d35253 100644
--- a/packages/angular/cli/package.json
+++ b/packages/angular/cli/package.json
@@ -36,7 +36,7 @@
     "npm-pick-manifest": "10.0.0",
     "pacote": "20.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_devkit/build_angular/package.json b/packages/angular_devkit/build_angular/package.json
index 0ca23bc40605..ed52fe895262 100644
--- a/packages/angular_devkit/build_angular/package.json
+++ b/packages/angular_devkit/build_angular/package.json
@@ -50,7 +50,7 @@
     "rxjs": "7.8.2",
     "sass": "1.88.0",
     "sass-loader": "16.0.5",
-    "semver": "7.7.1",
+    "semver": "7.7.2",
     "source-map-loader": "5.0.0",
     "source-map-support": "0.5.21",
     "terser": "5.39.0",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index dbfdaf3359ae..c0fffac7dfb3 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -159,11 +159,11 @@ importers:
         specifier: ^1.1.5
         version: 1.1.9
       '@typescript-eslint/eslint-plugin':
-        specifier: 8.32.0
-        version: 8.32.0(@typescript-eslint/parser@8.32.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
+        specifier: 8.32.1
+        version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
       '@typescript-eslint/parser':
-        specifier: 8.32.0
-        version: 8.32.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
+        specifier: 8.32.1
+        version: 8.32.1(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
       ajv:
         specifier: 8.17.1
         version: 8.17.1
@@ -193,7 +193,7 @@ importers:
         version: 3.1.1(eslint@9.26.0(jiti@1.21.7))
       eslint-plugin-import:
         specifier: 2.31.0
-        version: 2.31.0(@typescript-eslint/parser@8.32.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.26.0(jiti@1.21.7))
+        version: 2.31.0(@typescript-eslint/parser@8.32.1(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.26.0(jiti@1.21.7))
       express:
         specifier: 5.1.0
         version: 5.1.0
@@ -279,8 +279,8 @@ importers:
         specifier: 0.5.1
         version: 0.5.1(@types/node@20.17.46)(rollup@4.40.2)
       semver:
-        specifier: 7.7.1
-        version: 7.7.1
+        specifier: 7.7.2
+        version: 7.7.2
       shelljs:
         specifier: ^0.10.0
         version: 0.10.0
@@ -410,8 +410,8 @@ importers:
         specifier: 1.88.0
         version: 1.88.0
       semver:
-        specifier: 7.7.1
-        version: 7.7.1
+        specifier: 7.7.2
+        version: 7.7.2
       source-map-support:
         specifier: 0.5.21
         version: 0.5.21
@@ -499,8 +499,8 @@ importers:
         specifier: 1.22.10
         version: 1.22.10
       semver:
-        specifier: 7.7.1
-        version: 7.7.1
+        specifier: 7.7.2
+        version: 7.7.2
       yargs:
         specifier: 17.7.2
         version: 17.7.2
@@ -714,8 +714,8 @@ importers:
         specifier: 16.0.5
         version: 16.0.5(sass@1.88.0)(webpack@5.99.8(esbuild@0.25.4))
       semver:
-        specifier: 7.7.1
-        version: 7.7.1
+        specifier: 7.7.2
+        version: 7.7.2
       source-map-loader:
         specifier: 5.0.0
         version: 5.0.0(webpack@5.99.8(esbuild@0.25.4))
@@ -895,8 +895,8 @@ importers:
   tools/baseline_browserslist:
     devDependencies:
       baseline-browser-mapping:
-        specifier: 2.3.0
-        version: 2.3.0
+        specifier: 2.4.1
+        version: 2.4.1
 
 packages:
 
@@ -2944,16 +2944,16 @@ packages:
   '@types/yauzl@2.10.3':
     resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==}
 
-  '@typescript-eslint/eslint-plugin@8.32.0':
-    resolution: {integrity: sha512-/jU9ettcntkBFmWUzzGgsClEi2ZFiikMX5eEQsmxIAWMOn4H3D4rvHssstmAHGVvrYnaMqdWWWg0b5M6IN/MTQ==}
+  '@typescript-eslint/eslint-plugin@8.32.1':
+    resolution: {integrity: sha512-6u6Plg9nP/J1GRpe/vcjjabo6Uc5YQPAMxsgQyGC/I0RuukiG1wIe3+Vtg3IrSCVJDmqK3j8adrtzXSENRtFgg==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     peerDependencies:
       '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0
       eslint: ^8.57.0 || ^9.0.0
       typescript: 5.8.3
 
-  '@typescript-eslint/parser@8.32.0':
-    resolution: {integrity: sha512-B2MdzyWxCE2+SqiZHAjPphft+/2x2FlO9YBx7eKE1BCb+rqBlQdhtAEhzIEdozHd55DXPmxBdpMygFJjfjjA9A==}
+  '@typescript-eslint/parser@8.32.1':
+    resolution: {integrity: sha512-LKMrmwCPoLhM45Z00O1ulb6jwyVr2kr3XJp+G+tSEZcbauNnScewcQwtJqXDhXeYPDEjZ8C1SjXm015CirEmGg==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     peerDependencies:
       eslint: ^8.57.0 || ^9.0.0
@@ -2963,8 +2963,12 @@ packages:
     resolution: {integrity: sha512-jc/4IxGNedXkmG4mx4nJTILb6TMjL66D41vyeaPWvDUmeYQzF3lKtN15WsAeTr65ce4mPxwopPSo1yUUAWw0hQ==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
-  '@typescript-eslint/type-utils@8.32.0':
-    resolution: {integrity: sha512-t2vouuYQKEKSLtJaa5bB4jHeha2HJczQ6E5IXPDPgIty9EqcJxpr1QHQ86YyIPwDwxvUmLfP2YADQ5ZY4qddZg==}
+  '@typescript-eslint/scope-manager@8.32.1':
+    resolution: {integrity: sha512-7IsIaIDeZn7kffk7qXC3o6Z4UblZJKV3UBpkvRNpr5NSyLji7tvTcvmnMNYuYLyh26mN8W723xpo3i4MlD33vA==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  '@typescript-eslint/type-utils@8.32.1':
+    resolution: {integrity: sha512-mv9YpQGA8iIsl5KyUPi+FGLm7+bA4fgXaeRcFKRDRwDMu4iwrSHeDPipwueNXhdIIZltwCJv+NkxftECbIZWfA==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     peerDependencies:
       eslint: ^8.57.0 || ^9.0.0
@@ -2974,12 +2978,22 @@ packages:
     resolution: {integrity: sha512-O5Id6tGadAZEMThM6L9HmVf5hQUXNSxLVKeGJYWNhhVseps/0LddMkp7//VDkzwJ69lPL0UmZdcZwggj9akJaA==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
+  '@typescript-eslint/types@8.32.1':
+    resolution: {integrity: sha512-YmybwXUJcgGqgAp6bEsgpPXEg6dcCyPyCSr0CAAueacR/CCBi25G3V8gGQ2kRzQRBNol7VQknxMs9HvVa9Rvfg==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
   '@typescript-eslint/typescript-estree@8.32.0':
     resolution: {integrity: sha512-pU9VD7anSCOIoBFnhTGfOzlVFQIA1XXiQpH/CezqOBaDppRwTglJzCC6fUQGpfwey4T183NKhF1/mfatYmjRqQ==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     peerDependencies:
       typescript: 5.8.3
 
+  '@typescript-eslint/typescript-estree@8.32.1':
+    resolution: {integrity: sha512-Y3AP9EIfYwBb4kWGb+simvPaqQoT5oJuzzj9m0i6FCY6SPvlomY2Ei4UEMm7+FXtlNJbor80ximyslzaQF6xhg==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    peerDependencies:
+      typescript: 5.8.3
+
   '@typescript-eslint/utils@8.32.0':
     resolution: {integrity: sha512-8S9hXau6nQ/sYVtC3D6ISIDoJzS1NsCK+gluVhLN2YkBPX+/1wkwyUiDKnxRh15579WoOIyVWnoyIf3yGI9REw==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -2987,10 +3001,21 @@ packages:
       eslint: ^8.57.0 || ^9.0.0
       typescript: 5.8.3
 
+  '@typescript-eslint/utils@8.32.1':
+    resolution: {integrity: sha512-DsSFNIgLSrc89gpq1LJB7Hm1YpuhK086DRDJSNrewcGvYloWW1vZLHBTIvarKZDcAORIy/uWNx8Gad+4oMpkSA==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    peerDependencies:
+      eslint: ^8.57.0 || ^9.0.0
+      typescript: 5.8.3
+
   '@typescript-eslint/visitor-keys@8.32.0':
     resolution: {integrity: sha512-1rYQTCLFFzOI5Nl0c8LUpJT8HxpwVRn9E4CkMsYfuN6ctmQqExjSTzzSk0Tz2apmXy7WU6/6fyaZVVA/thPN+w==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
+  '@typescript-eslint/visitor-keys@8.32.1':
+    resolution: {integrity: sha512-ar0tjQfObzhSaW3C3QNmTc5ofj0hDoNQ5XWrCy6zDyabdr0TWhCkClp+rywGNj/odAFBVzzJrK4tEq5M4Hmu4w==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
   '@verdaccio/auth@8.0.0-next-8.15':
     resolution: {integrity: sha512-vAfzGOHbPcPXMCI90jqm/qSZ1OUBnOGzudZA3+YtherncdwADekvXbdJlZVclcfmZ0sRbfVG5Xpf88aETiwfcw==}
     engines: {node: '>=18'}
@@ -3520,8 +3545,8 @@ packages:
     resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==}
     engines: {node: ^4.5.0 || >= 5.9}
 
-  baseline-browser-mapping@2.3.0:
-    resolution: {integrity: sha512-K6nnZh0g0B/ZxbHSjZfKuJK7q1wto+RBqmVk9u/G+/YSOVlVXls71j2Jbl25Dos6j4HPAtne0MYdXdNOOSJm5g==}
+  baseline-browser-mapping@2.4.1:
+    resolution: {integrity: sha512-x2Z9jkNB6D1/sTM/IY8XU3v8OlY2NrYVT5TEZicMW5OL+MHz/Ac/D3qW27Dk01Z+Vbtlk/h/GSClc65uO5pEPA==}
 
   basic-ftp@5.0.5:
     resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==}
@@ -5077,6 +5102,10 @@ packages:
     resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
     engines: {node: '>= 4'}
 
+  ignore@7.0.4:
+    resolution: {integrity: sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A==}
+    engines: {node: '>= 4'}
+
   image-size@0.5.5:
     resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==}
     engines: {node: '>=0.10.0'}
@@ -7028,6 +7057,11 @@ packages:
     engines: {node: '>=10'}
     hasBin: true
 
+  semver@7.7.2:
+    resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==}
+    engines: {node: '>=10'}
+    hasBin: true
+
   send@0.19.0:
     resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==}
     engines: {node: '>= 0.8.0'}
@@ -8226,7 +8260,7 @@ snapshots:
       chokidar: 4.0.3
       convert-source-map: 1.9.0
       reflect-metadata: 0.2.2
-      semver: 7.7.1
+      semver: 7.7.2
       tslib: 2.8.1
       typescript: 5.8.3
       yargs: 17.7.2
@@ -8282,7 +8316,7 @@ snapshots:
       '@types/supports-color': 10.0.0
       '@yarnpkg/lockfile': 1.1.0
       chalk: 5.4.1
-      semver: 7.7.1
+      semver: 7.7.2
       supports-color: 10.0.0
       typed-graphqlify: 3.1.6
       typescript: 5.8.3
@@ -9611,7 +9645,7 @@ snapshots:
 
   '@npmcli/fs@4.0.0':
     dependencies:
-      semver: 7.7.1
+      semver: 7.7.2
 
   '@npmcli/git@6.0.3':
     dependencies:
@@ -9621,7 +9655,7 @@ snapshots:
       npm-pick-manifest: 10.0.0
       proc-log: 5.0.0
       promise-retry: 2.0.1
-      semver: 7.7.1
+      semver: 7.7.2
       which: 5.0.0
 
   '@npmcli/installed-package-contents@3.0.0':
@@ -9638,7 +9672,7 @@ snapshots:
       hosted-git-info: 8.1.0
       json-parse-even-better-errors: 4.0.0
       proc-log: 5.0.0
-      semver: 7.7.1
+      semver: 7.7.2
       validate-npm-package-license: 3.0.4
 
   '@npmcli/promise-spawn@8.0.2':
@@ -9834,7 +9868,7 @@ snapshots:
       extract-zip: 2.0.1
       progress: 2.0.3
       proxy-agent: 6.5.0
-      semver: 7.7.1
+      semver: 7.7.2
       tar-fs: 3.0.8
       yargs: 17.7.2
     transitivePeerDependencies:
@@ -10386,29 +10420,29 @@ snapshots:
       '@types/node': 20.17.46
     optional: true
 
-  '@typescript-eslint/eslint-plugin@8.32.0(@typescript-eslint/parser@8.32.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)':
+  '@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)':
     dependencies:
       '@eslint-community/regexpp': 4.12.1
-      '@typescript-eslint/parser': 8.32.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
-      '@typescript-eslint/scope-manager': 8.32.0
-      '@typescript-eslint/type-utils': 8.32.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
-      '@typescript-eslint/utils': 8.32.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
-      '@typescript-eslint/visitor-keys': 8.32.0
+      '@typescript-eslint/parser': 8.32.1(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
+      '@typescript-eslint/scope-manager': 8.32.1
+      '@typescript-eslint/type-utils': 8.32.1(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
+      '@typescript-eslint/utils': 8.32.1(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
+      '@typescript-eslint/visitor-keys': 8.32.1
       eslint: 9.26.0(jiti@1.21.7)
       graphemer: 1.4.0
-      ignore: 5.3.2
+      ignore: 7.0.4
       natural-compare: 1.4.0
       ts-api-utils: 2.1.0(typescript@5.8.3)
       typescript: 5.8.3
     transitivePeerDependencies:
       - supports-color
 
-  '@typescript-eslint/parser@8.32.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)':
+  '@typescript-eslint/parser@8.32.1(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)':
     dependencies:
-      '@typescript-eslint/scope-manager': 8.32.0
-      '@typescript-eslint/types': 8.32.0
-      '@typescript-eslint/typescript-estree': 8.32.0(typescript@5.8.3)
-      '@typescript-eslint/visitor-keys': 8.32.0
+      '@typescript-eslint/scope-manager': 8.32.1
+      '@typescript-eslint/types': 8.32.1
+      '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3)
+      '@typescript-eslint/visitor-keys': 8.32.1
       debug: 4.4.0(supports-color@10.0.0)
       eslint: 9.26.0(jiti@1.21.7)
       typescript: 5.8.3
@@ -10420,10 +10454,15 @@ snapshots:
       '@typescript-eslint/types': 8.32.0
       '@typescript-eslint/visitor-keys': 8.32.0
 
-  '@typescript-eslint/type-utils@8.32.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)':
+  '@typescript-eslint/scope-manager@8.32.1':
     dependencies:
-      '@typescript-eslint/typescript-estree': 8.32.0(typescript@5.8.3)
-      '@typescript-eslint/utils': 8.32.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
+      '@typescript-eslint/types': 8.32.1
+      '@typescript-eslint/visitor-keys': 8.32.1
+
+  '@typescript-eslint/type-utils@8.32.1(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)':
+    dependencies:
+      '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3)
+      '@typescript-eslint/utils': 8.32.1(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
       debug: 4.4.0(supports-color@10.0.0)
       eslint: 9.26.0(jiti@1.21.7)
       ts-api-utils: 2.1.0(typescript@5.8.3)
@@ -10433,6 +10472,8 @@ snapshots:
 
   '@typescript-eslint/types@8.32.0': {}
 
+  '@typescript-eslint/types@8.32.1': {}
+
   '@typescript-eslint/typescript-estree@8.32.0(typescript@5.8.3)':
     dependencies:
       '@typescript-eslint/types': 8.32.0
@@ -10441,7 +10482,21 @@ snapshots:
       fast-glob: 3.3.3
       is-glob: 4.0.3
       minimatch: 9.0.5
-      semver: 7.7.1
+      semver: 7.7.2
+      ts-api-utils: 2.1.0(typescript@5.8.3)
+      typescript: 5.8.3
+    transitivePeerDependencies:
+      - supports-color
+
+  '@typescript-eslint/typescript-estree@8.32.1(typescript@5.8.3)':
+    dependencies:
+      '@typescript-eslint/types': 8.32.1
+      '@typescript-eslint/visitor-keys': 8.32.1
+      debug: 4.4.0(supports-color@10.0.0)
+      fast-glob: 3.3.3
+      is-glob: 4.0.3
+      minimatch: 9.0.5
+      semver: 7.7.2
       ts-api-utils: 2.1.0(typescript@5.8.3)
       typescript: 5.8.3
     transitivePeerDependencies:
@@ -10458,11 +10513,27 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
+  '@typescript-eslint/utils@8.32.1(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)':
+    dependencies:
+      '@eslint-community/eslint-utils': 4.7.0(eslint@9.26.0(jiti@1.21.7))
+      '@typescript-eslint/scope-manager': 8.32.1
+      '@typescript-eslint/types': 8.32.1
+      '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3)
+      eslint: 9.26.0(jiti@1.21.7)
+      typescript: 5.8.3
+    transitivePeerDependencies:
+      - supports-color
+
   '@typescript-eslint/visitor-keys@8.32.0':
     dependencies:
       '@typescript-eslint/types': 8.32.0
       eslint-visitor-keys: 4.2.0
 
+  '@typescript-eslint/visitor-keys@8.32.1':
+    dependencies:
+      '@typescript-eslint/types': 8.32.1
+      eslint-visitor-keys: 4.2.0
+
   '@verdaccio/auth@8.0.0-next-8.15':
     dependencies:
       '@verdaccio/config': 8.0.0-next-8.15
@@ -11197,7 +11268,7 @@ snapshots:
 
   base64id@2.0.0: {}
 
-  baseline-browser-mapping@2.3.0:
+  baseline-browser-mapping@2.4.1:
     dependencies:
       '@mdn/browser-compat-data': 6.0.13
       web-features: 2.34.2
@@ -11750,7 +11821,7 @@ snapshots:
       postcss-modules-scope: 3.2.1(postcss@8.5.3)
       postcss-modules-values: 4.0.0(postcss@8.5.3)
       postcss-value-parser: 4.2.0
-      semver: 7.7.1
+      semver: 7.7.2
     optionalDependencies:
       webpack: 5.99.8(esbuild@0.25.4)
 
@@ -12238,11 +12309,11 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  eslint-module-utils@2.12.0(@typescript-eslint/parser@8.32.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.26.0(jiti@1.21.7)):
+  eslint-module-utils@2.12.0(@typescript-eslint/parser@8.32.1(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.26.0(jiti@1.21.7)):
     dependencies:
       debug: 3.2.7
     optionalDependencies:
-      '@typescript-eslint/parser': 8.32.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
+      '@typescript-eslint/parser': 8.32.1(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
       eslint: 9.26.0(jiti@1.21.7)
       eslint-import-resolver-node: 0.3.9
     transitivePeerDependencies:
@@ -12252,7 +12323,7 @@ snapshots:
     dependencies:
       eslint: 9.26.0(jiti@1.21.7)
 
-  eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.32.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.26.0(jiti@1.21.7)):
+  eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.32.1(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.26.0(jiti@1.21.7)):
     dependencies:
       '@rtsao/scc': 1.1.0
       array-includes: 3.1.8
@@ -12263,7 +12334,7 @@ snapshots:
       doctrine: 2.1.0
       eslint: 9.26.0(jiti@1.21.7)
       eslint-import-resolver-node: 0.3.9
-      eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.32.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.26.0(jiti@1.21.7))
+      eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.32.1(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.26.0(jiti@1.21.7))
       hasown: 2.0.2
       is-core-module: 2.16.1
       is-glob: 4.0.3
@@ -12275,7 +12346,7 @@ snapshots:
       string.prototype.trimend: 1.0.9
       tsconfig-paths: 3.15.0
     optionalDependencies:
-      '@typescript-eslint/parser': 8.32.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
+      '@typescript-eslint/parser': 8.32.1(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
     transitivePeerDependencies:
       - eslint-import-resolver-typescript
       - eslint-import-resolver-webpack
@@ -12487,7 +12558,7 @@ snapshots:
 
   extract-zip@2.0.1:
     dependencies:
-      debug: 4.3.4
+      debug: 4.4.0(supports-color@10.0.0)
       get-stream: 5.2.0
       yauzl: 2.10.0
     optionalDependencies:
@@ -13112,6 +13183,8 @@ snapshots:
 
   ignore@5.3.2: {}
 
+  ignore@7.0.4: {}
+
   image-size@0.5.5:
     optional: true
 
@@ -13402,7 +13475,7 @@ snapshots:
       '@babel/parser': 7.27.2
       '@istanbuljs/schema': 0.1.3
       istanbul-lib-coverage: 3.2.2
-      semver: 7.7.1
+      semver: 7.7.2
     transitivePeerDependencies:
       - supports-color
 
@@ -13559,7 +13632,7 @@ snapshots:
       lodash.isstring: 4.0.1
       lodash.once: 4.1.1
       ms: 2.1.3
-      semver: 7.7.1
+      semver: 7.7.2
 
   jsprim@1.4.2:
     dependencies:
@@ -13923,7 +13996,7 @@ snapshots:
 
   make-dir@4.0.0:
     dependencies:
-      semver: 7.7.1
+      semver: 7.7.2
 
   make-error@1.3.6: {}
 
@@ -14200,7 +14273,7 @@ snapshots:
       make-fetch-happen: 14.0.3
       nopt: 8.1.0
       proc-log: 5.0.0
-      semver: 7.7.1
+      semver: 7.7.2
       tar: 7.4.3
       tinyglobby: 0.2.13
       which: 5.0.0
@@ -14223,7 +14296,7 @@ snapshots:
 
   npm-install-checks@7.1.1:
     dependencies:
-      semver: 7.7.1
+      semver: 7.7.2
 
   npm-normalize-package-bin@4.0.0: {}
 
@@ -14231,7 +14304,7 @@ snapshots:
     dependencies:
       hosted-git-info: 8.1.0
       proc-log: 5.0.0
-      semver: 7.7.1
+      semver: 7.7.2
       validate-npm-package-name: 6.0.0
 
   npm-packlist@9.0.0:
@@ -14243,7 +14316,7 @@ snapshots:
       npm-install-checks: 7.1.1
       npm-normalize-package-bin: 4.0.0
       npm-package-arg: 12.0.2
-      semver: 7.7.1
+      semver: 7.7.2
 
   npm-registry-fetch@18.0.2:
     dependencies:
@@ -14622,7 +14695,7 @@ snapshots:
       cosmiconfig: 9.0.0(typescript@5.8.3)
       jiti: 1.21.7
       postcss: 8.5.3
-      semver: 7.7.1
+      semver: 7.7.2
     optionalDependencies:
       webpack: 5.99.8(esbuild@0.25.4)
     transitivePeerDependencies:
@@ -15205,6 +15278,8 @@ snapshots:
 
   semver@7.7.1: {}
 
+  semver@7.7.2: {}
+
   send@0.19.0:
     dependencies:
       debug: 2.6.9
diff --git a/tools/baseline_browserslist/package.json b/tools/baseline_browserslist/package.json
index 055c59705a2e..3b7e23153882 100644
--- a/tools/baseline_browserslist/package.json
+++ b/tools/baseline_browserslist/package.json
@@ -1,6 +1,6 @@
 {
   "type": "module",
   "devDependencies": {
-    "baseline-browser-mapping": "2.3.0"
+    "baseline-browser-mapping": "2.4.1"
   }
 }

From c7f2cb59684a264bb4ecab2024d8a8c58efbefa7 Mon Sep 17 00:00:00 2001
From: Charles Lyding <19598772+clydin@users.noreply.github.com>
Date: Tue, 13 May 2025 12:38:59 -0400
Subject: [PATCH 050/138] fix(@angular/build): provide vitest globals in
 unit-test builder

The experimental `unit-test` builder with the `vitest` runner now provides
the test APIs also as globals. This increases the potential compatibility
for existing karma/jasmine based tests. The initial unit tests within a
newly generated application, for instance, now require no changes to
execute with the new builder.

(cherry picked from commit 7b8c9af200ebe2f562ddfb53cbf4be7a1127da2a)
---
 packages/angular/build/src/builders/unit-test/builder.ts | 1 +
 1 file changed, 1 insertion(+)

diff --git a/packages/angular/build/src/builders/unit-test/builder.ts b/packages/angular/build/src/builders/unit-test/builder.ts
index c4564468f9c6..4a0808f58115 100644
--- a/packages/angular/build/src/builders/unit-test/builder.ts
+++ b/packages/angular/build/src/builders/unit-test/builder.ts
@@ -213,6 +213,7 @@ export async function* execute(
       instance ??= await startVitest('test', undefined /* cliFilters */, undefined /* options */, {
         test: {
           root: outputPath,
+          globals: true,
           setupFiles,
           // Use `jsdom` if no browsers are explicitly configured.
           // `node` is effectively no "environment" and the default.

From 0d40cdecd0fdc1b03d2cafcdd5321db0d31b56ee Mon Sep 17 00:00:00 2001
From: Charles Lyding <19598772+clydin@users.noreply.github.com>
Date: Tue, 13 May 2025 19:11:41 -0400
Subject: [PATCH 051/138] fix(@angular/build): setup unit-test polyfills before
 TestBed init

To ensure that Zone.js is fully setup and patched prior to the use of TestBed,
the setup file order for the `vitest` runner of the `unit-test` builder
has been swapped. This is particularly relevant for `fakeAsync` which
has a module level statement that attempts to capture the `Zone` instance.
If Zone.js is not setup at that point, fakeAsync will fail to function in
tests.

(cherry picked from commit 8b2ca7ae2617d0e6a1854693dbd24408a4cbe4fb)
---
 packages/angular/build/src/builders/unit-test/builder.ts | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/packages/angular/build/src/builders/unit-test/builder.ts b/packages/angular/build/src/builders/unit-test/builder.ts
index 4a0808f58115..934440eec5b6 100644
--- a/packages/angular/build/src/builders/unit-test/builder.ts
+++ b/packages/angular/build/src/builders/unit-test/builder.ts
@@ -194,7 +194,7 @@ export async function* execute(
   // Add setup file entries for TestBed initialization and project polyfills
   const setupFiles = ['init-testbed.js'];
   if (buildTargetOptions?.polyfills?.length) {
-    setupFiles.push('polyfills.js');
+    setupFiles.unshift('polyfills.js');
   }
 
   try {

From 255bc559a0b59864bc315be875391f1c25159b8c Mon Sep 17 00:00:00 2001
From: Angular Robot <angular-robot@google.com>
Date: Wed, 14 May 2025 05:03:35 +0000
Subject: [PATCH 052/138] build: update dependency terser to v5.39.1

See associated pull request for more information.

(cherry picked from commit 9d07249679234b2104aebbf38d117f85f4f473e8)
---
 .../angular_devkit/build_angular/package.json |  2 +-
 pnpm-lock.yaml                                | 46 +++++++++----------
 2 files changed, 24 insertions(+), 24 deletions(-)

diff --git a/packages/angular_devkit/build_angular/package.json b/packages/angular_devkit/build_angular/package.json
index ed52fe895262..fe975c0e24d3 100644
--- a/packages/angular_devkit/build_angular/package.json
+++ b/packages/angular_devkit/build_angular/package.json
@@ -53,7 +53,7 @@
     "semver": "7.7.2",
     "source-map-loader": "5.0.0",
     "source-map-support": "0.5.21",
-    "terser": "5.39.0",
+    "terser": "5.39.1",
     "tree-kill": "1.2.2",
     "tslib": "2.8.1",
     "webpack": "5.99.8",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index c0fffac7dfb3..b8c1b15110f9 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -342,7 +342,7 @@ importers:
         version: 7.8.2
       vitest:
         specifier: 3.1.3
-        version: 3.1.3(@types/node@20.17.46)(jiti@1.21.7)(jsdom@26.1.0)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1)
+        version: 3.1.3(@types/node@20.17.46)(jiti@1.21.7)(jsdom@26.1.0)(less@4.3.0)(sass@1.88.0)(terser@5.39.1)(yaml@2.7.1)
 
   packages/angular/build:
     dependencies:
@@ -366,7 +366,7 @@ importers:
         version: 5.1.10(@types/node@20.17.46)
       '@vitejs/plugin-basic-ssl':
         specifier: 2.0.0
-        version: 2.0.0(vite@6.3.5(@types/node@20.17.46)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1))
+        version: 2.0.0(vite@6.3.5(@types/node@20.17.46)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.1)(yaml@2.7.1))
       beasties:
         specifier: 0.3.3
         version: 0.3.3
@@ -420,7 +420,7 @@ importers:
         version: 0.2.13
       vite:
         specifier: 6.3.5
-        version: 6.3.5(@types/node@20.17.46)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1)
+        version: 6.3.5(@types/node@20.17.46)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.1)(yaml@2.7.1)
       watchpack:
         specifier: 2.4.2
         version: 2.4.2
@@ -452,7 +452,7 @@ importers:
         version: 7.8.2
       vitest:
         specifier: 3.1.3
-        version: 3.1.3(@types/node@20.17.46)(jiti@1.21.7)(jsdom@26.1.0)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1)
+        version: 3.1.3(@types/node@20.17.46)(jiti@1.21.7)(jsdom@26.1.0)(less@4.3.0)(sass@1.88.0)(terser@5.39.1)(yaml@2.7.1)
 
   packages/angular/cli:
     dependencies:
@@ -631,7 +631,7 @@ importers:
         version: link:../../ngtools/webpack
       '@vitejs/plugin-basic-ssl':
         specifier: 2.0.0
-        version: 2.0.0(vite@6.3.5(@types/node@20.17.46)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1))
+        version: 2.0.0(vite@6.3.5(@types/node@20.17.46)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.1)(yaml@2.7.1))
       ansi-colors:
         specifier: 4.1.3
         version: 4.1.3
@@ -723,8 +723,8 @@ importers:
         specifier: 0.5.21
         version: 0.5.21
       terser:
-        specifier: 5.39.0
-        version: 5.39.0
+        specifier: 5.39.1
+        version: 5.39.1
       tree-kill:
         specifier: 1.2.2
         version: 1.2.2
@@ -7461,8 +7461,8 @@ packages:
       uglify-js:
         optional: true
 
-  terser@5.39.0:
-    resolution: {integrity: sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==}
+  terser@5.39.1:
+    resolution: {integrity: sha512-Mm6+uad0ZuDtcV8/4uOZQDQ8RuiC5Pu+iZRedJtF7yA/27sPL7d++In/AJKpWZlU3SYMPPkVfwetn6sgZ66pUA==}
     engines: {node: '>=10'}
     hasBin: true
 
@@ -10681,9 +10681,9 @@ snapshots:
       minimatch: 7.4.6
       semver: 7.7.1
 
-  '@vitejs/plugin-basic-ssl@2.0.0(vite@6.3.5(@types/node@20.17.46)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1))':
+  '@vitejs/plugin-basic-ssl@2.0.0(vite@6.3.5(@types/node@20.17.46)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.1)(yaml@2.7.1))':
     dependencies:
-      vite: 6.3.5(@types/node@20.17.46)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1)
+      vite: 6.3.5(@types/node@20.17.46)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.1)(yaml@2.7.1)
 
   '@vitest/expect@3.1.3':
     dependencies:
@@ -10692,13 +10692,13 @@ snapshots:
       chai: 5.2.0
       tinyrainbow: 2.0.0
 
-  '@vitest/mocker@3.1.3(vite@6.3.5(@types/node@20.17.46)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1))':
+  '@vitest/mocker@3.1.3(vite@6.3.5(@types/node@20.17.46)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.1)(yaml@2.7.1))':
     dependencies:
       '@vitest/spy': 3.1.3
       estree-walker: 3.0.3
       magic-string: 0.30.17
     optionalDependencies:
-      vite: 6.3.5(@types/node@20.17.46)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1)
+      vite: 6.3.5(@types/node@20.17.46)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.1)(yaml@2.7.1)
 
   '@vitest/pretty-format@3.1.3':
     dependencies:
@@ -15839,12 +15839,12 @@ snapshots:
       jest-worker: 27.5.1
       schema-utils: 4.3.2
       serialize-javascript: 6.0.2
-      terser: 5.39.0
+      terser: 5.39.1
       webpack: 5.99.8(esbuild@0.25.4)
     optionalDependencies:
       esbuild: 0.25.4
 
-  terser@5.39.0:
+  terser@5.39.1:
     dependencies:
       '@jridgewell/source-map': 0.3.6
       acorn: 8.14.1
@@ -16228,13 +16228,13 @@ snapshots:
       core-util-is: 1.0.2
       extsprintf: 1.3.0
 
-  vite-node@3.1.3(@types/node@20.17.46)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1):
+  vite-node@3.1.3(@types/node@20.17.46)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.1)(yaml@2.7.1):
     dependencies:
       cac: 6.7.14
       debug: 4.4.0(supports-color@10.0.0)
       es-module-lexer: 1.7.0
       pathe: 2.0.3
-      vite: 6.3.5(@types/node@20.17.46)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1)
+      vite: 6.3.5(@types/node@20.17.46)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.1)(yaml@2.7.1)
     transitivePeerDependencies:
       - '@types/node'
       - jiti
@@ -16249,7 +16249,7 @@ snapshots:
       - tsx
       - yaml
 
-  vite@6.3.5(@types/node@20.17.46)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1):
+  vite@6.3.5(@types/node@20.17.46)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.1)(yaml@2.7.1):
     dependencies:
       esbuild: 0.25.4
       fdir: 6.4.4(picomatch@4.0.2)
@@ -16263,13 +16263,13 @@ snapshots:
       jiti: 1.21.7
       less: 4.3.0
       sass: 1.88.0
-      terser: 5.39.0
+      terser: 5.39.1
       yaml: 2.7.1
 
-  vitest@3.1.3(@types/node@20.17.46)(jiti@1.21.7)(jsdom@26.1.0)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1):
+  vitest@3.1.3(@types/node@20.17.46)(jiti@1.21.7)(jsdom@26.1.0)(less@4.3.0)(sass@1.88.0)(terser@5.39.1)(yaml@2.7.1):
     dependencies:
       '@vitest/expect': 3.1.3
-      '@vitest/mocker': 3.1.3(vite@6.3.5(@types/node@20.17.46)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1))
+      '@vitest/mocker': 3.1.3(vite@6.3.5(@types/node@20.17.46)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.1)(yaml@2.7.1))
       '@vitest/pretty-format': 3.1.3
       '@vitest/runner': 3.1.3
       '@vitest/snapshot': 3.1.3
@@ -16286,8 +16286,8 @@ snapshots:
       tinyglobby: 0.2.13
       tinypool: 1.0.2
       tinyrainbow: 2.0.0
-      vite: 6.3.5(@types/node@20.17.46)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1)
-      vite-node: 3.1.3(@types/node@20.17.46)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.0)(yaml@2.7.1)
+      vite: 6.3.5(@types/node@20.17.46)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.1)(yaml@2.7.1)
+      vite-node: 3.1.3(@types/node@20.17.46)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.1)(yaml@2.7.1)
       why-is-node-running: 2.3.0
     optionalDependencies:
       '@types/node': 20.17.46

From 3cf6ab0f77b23b8717e79b7125ea930cb018ebc5 Mon Sep 17 00:00:00 2001
From: Charles Lyding <19598772+clydin@users.noreply.github.com>
Date: Wed, 14 May 2025 11:02:15 -0400
Subject: [PATCH 053/138] fix(@schematics/angular): support using default
 browser option when not present

The Angular schematics that require knowledge of the main entry point of
an application will now use the default value for the `application` builder.
The default value as per the `application` build system is `<project_source_root>/main.ts`.

(cherry picked from commit 07ac1742d21d96dcdc66d26c3b163faeb0126740)
---
 .../angular/environments/index_spec.ts           |  2 +-
 packages/schematics/angular/server/index_spec.ts |  2 +-
 .../schematics/angular/service-worker/index.ts   |  6 ++----
 .../angular/service-worker/index_spec.ts         |  2 +-
 packages/schematics/angular/ssr/index_spec.ts    |  2 +-
 .../angular/utility/standalone/util.ts           | 16 ++++++++++++----
 6 files changed, 18 insertions(+), 12 deletions(-)

diff --git a/packages/schematics/angular/environments/index_spec.ts b/packages/schematics/angular/environments/index_spec.ts
index 3db69c5d866c..d53026a28a4d 100644
--- a/packages/schematics/angular/environments/index_spec.ts
+++ b/packages/schematics/angular/environments/index_spec.ts
@@ -50,7 +50,7 @@ describe('Environments Schematic', () => {
     build.builder = Builders.Browser;
     build.options = {
       ...build.options,
-      main: build.options.browser,
+      main: 'projects/foo/src/main.ts',
       browser: undefined,
     };
 
diff --git a/packages/schematics/angular/server/index_spec.ts b/packages/schematics/angular/server/index_spec.ts
index f3e5e277d8ef..de6046e38c00 100644
--- a/packages/schematics/angular/server/index_spec.ts
+++ b/packages/schematics/angular/server/index_spec.ts
@@ -269,7 +269,7 @@ describe('Server Schematic', () => {
       build.builder = Builders.Browser;
       build.options = {
         ...build.options,
-        main: build.options.browser,
+        main: 'projects/bar/src/main.ts',
         browser: undefined,
       };
 
diff --git a/packages/schematics/angular/service-worker/index.ts b/packages/schematics/angular/service-worker/index.ts
index e32969d9d0c6..0f794981faa0 100644
--- a/packages/schematics/angular/service-worker/index.ts
+++ b/packages/schematics/angular/service-worker/index.ts
@@ -28,7 +28,7 @@ import { getAppModulePath, isStandaloneApp } from '../utility/ng-ast-utils';
 import { relativePathToWorkspaceRoot } from '../utility/paths';
 import { targetBuildNotFoundError } from '../utility/project-targets';
 import { findAppConfig } from '../utility/standalone/app_config';
-import { findBootstrapApplicationCall } from '../utility/standalone/util';
+import { findBootstrapApplicationCall, getMainFilePath } from '../utility/standalone/util';
 import { Builders } from '../utility/workspace-models';
 import { Schema as ServiceWorkerOptions } from './schema';
 
@@ -119,20 +119,18 @@ export default function (options: ServiceWorkerOptions): Rule {
     }
 
     const buildOptions = buildTarget.options as Record<string, string | boolean>;
-    let browserEntryPoint: string | undefined;
+    const browserEntryPoint = await getMainFilePath(host, options.project);
     const ngswConfigPath = join(normalize(project.root), 'ngsw-config.json');
 
     if (
       buildTarget.builder === Builders.Application ||
       buildTarget.builder === Builders.BuildApplication
     ) {
-      browserEntryPoint = buildOptions.browser as string;
       const productionConf = buildTarget.configurations?.production;
       if (productionConf) {
         productionConf.serviceWorker = ngswConfigPath;
       }
     } else {
-      browserEntryPoint = buildOptions.main as string;
       buildOptions.serviceWorker = true;
       buildOptions.ngswConfigPath = ngswConfigPath;
     }
diff --git a/packages/schematics/angular/service-worker/index_spec.ts b/packages/schematics/angular/service-worker/index_spec.ts
index e9ec677f44ba..fbd976e48960 100644
--- a/packages/schematics/angular/service-worker/index_spec.ts
+++ b/packages/schematics/angular/service-worker/index_spec.ts
@@ -203,7 +203,7 @@ describe('Service Worker Schematic', () => {
       build.builder = Builders.Browser;
       build.options = {
         ...build.options,
-        main: build.options.browser,
+        main: 'projects/bar/src/main.ts',
         browser: undefined,
       };
 
diff --git a/packages/schematics/angular/ssr/index_spec.ts b/packages/schematics/angular/ssr/index_spec.ts
index 97b534aba8e1..4c70e971e54b 100644
--- a/packages/schematics/angular/ssr/index_spec.ts
+++ b/packages/schematics/angular/ssr/index_spec.ts
@@ -182,7 +182,7 @@ describe('SSR Schematic', () => {
       build.builder = '@angular-devkit/build-angular:browser';
       build.options = {
         ...build.options,
-        main: build.options.browser,
+        main: 'projects/test-app/src/main.ts',
         browser: undefined,
       };
 
diff --git a/packages/schematics/angular/utility/standalone/util.ts b/packages/schematics/angular/utility/standalone/util.ts
index 6d5648b68fd6..4c64e68ad559 100644
--- a/packages/schematics/angular/utility/standalone/util.ts
+++ b/packages/schematics/angular/utility/standalone/util.ts
@@ -7,6 +7,7 @@
  */
 
 import { SchematicsException, Tree } from '@angular-devkit/schematics';
+import { join } from 'node:path/posix';
 import ts from '../../third_party/github.com/Microsoft/TypeScript/lib/typescript';
 import { Change, applyToUpdateRecorder } from '../change';
 import { targetBuildNotFoundError } from '../project-targets';
@@ -23,16 +24,23 @@ export async function getMainFilePath(tree: Tree, projectName: string): Promise<
   const project = workspace.projects.get(projectName);
   const buildTarget = project?.targets.get('build');
 
-  if (!buildTarget) {
+  if (!project || !buildTarget) {
     throw targetBuildNotFoundError();
   }
 
   const options = buildTarget.options as Record<string, string>;
 
-  return buildTarget.builder === Builders.Application ||
+  if (
+    buildTarget.builder === Builders.Application ||
     buildTarget.builder === Builders.BuildApplication
-    ? options.browser
-    : options.main;
+  ) {
+    // These builders support a default of `<project_source_root>/main.ts`
+    const projectSourceRoot = project.sourceRoot ?? join(project.root, 'src');
+
+    return options.browser ?? join(projectSourceRoot, 'main.ts');
+  }
+
+  return options.main;
 }
 
 /**

From c2030ed20ba0d49b75107b673f87674defb68604 Mon Sep 17 00:00:00 2001
From: Charles Lyding <19598772+clydin@users.noreply.github.com>
Date: Wed, 14 May 2025 13:51:34 -0400
Subject: [PATCH 054/138] release: cut the v20.0.0-rc.1 release

---
 CHANGELOG.md | 29 +++++++++++++++++++++++++++++
 package.json |  2 +-
 2 files changed, 30 insertions(+), 1 deletion(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index f7ec636449a4..8a97b614f43d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,32 @@
+<a name="20.0.0-rc.1"></a>
+
+# 20.0.0-rc.1 (2025-05-14)
+
+### @angular/cli
+
+| Commit                                                                                              | Type | Description                                                 |
+| --------------------------------------------------------------------------------------------------- | ---- | ----------------------------------------------------------- |
+| [5093ce0a6](https://github.com/angular/angular-cli/commit/5093ce0a6c85429a402fcccbdb63f1d1db75bcf6) | fix  | properly handle Node.js `require()` errors with ESM modules |
+
+### @schematics/angular
+
+| Commit                                                                                              | Type | Description                                           |
+| --------------------------------------------------------------------------------------------------- | ---- | ----------------------------------------------------- |
+| [3cf6ab0f7](https://github.com/angular/angular-cli/commit/3cf6ab0f77b23b8717e79b7125ea930cb018ebc5) | fix  | support using default browser option when not present |
+
+### @angular/build
+
+| Commit                                                                                              | Type | Description                                                   |
+| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------- |
+| [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           |
+| [c7f2cb596](https://github.com/angular/angular-cli/commit/c7f2cb59684a264bb4ecab2024d8a8c58efbefa7) | fix  | provide vitest globals in unit-test builder                   |
+| [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               |
+
+<!-- CHANGELOG SPLIT MARKER -->
+
 <a name="20.0.0-rc.0"></a>
 
 # 20.0.0-rc.0 (2025-05-07)
diff --git a/package.json b/package.json
index 4a71d630f355..19ea63ca5cf4 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@angular/devkit-repo",
-  "version": "20.0.0-rc.0",
+  "version": "20.0.0-rc.1",
   "private": true,
   "description": "Software Development Kit for Angular",
   "keywords": [

From d2bfc6bd4eb0892e9eb6205838158142b716d21c Mon Sep 17 00:00:00 2001
From: Charles Lyding <19598772+clydin@users.noreply.github.com>
Date: Wed, 14 May 2025 15:33:43 -0400
Subject: [PATCH 055/138] fix(@angular/build): revert setup unit-test polyfills
 before TestBed init

The previous change caused Zone.js related test failures when using vitest as a
test runner.

This reverts commit 8b2ca7ae2617d0e6a1854693dbd24408a4cbe4fb.

(cherry picked from commit 2d47dcef788a77722933f0fa02b0fab648ec5d7d)
---
 packages/angular/build/src/builders/unit-test/builder.ts | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/packages/angular/build/src/builders/unit-test/builder.ts b/packages/angular/build/src/builders/unit-test/builder.ts
index 934440eec5b6..4a0808f58115 100644
--- a/packages/angular/build/src/builders/unit-test/builder.ts
+++ b/packages/angular/build/src/builders/unit-test/builder.ts
@@ -194,7 +194,7 @@ export async function* execute(
   // Add setup file entries for TestBed initialization and project polyfills
   const setupFiles = ['init-testbed.js'];
   if (buildTargetOptions?.polyfills?.length) {
-    setupFiles.unshift('polyfills.js');
+    setupFiles.push('polyfills.js');
   }
 
   try {

From bbd35bd48051af374238e968c8285d38a1a426a2 Mon Sep 17 00:00:00 2001
From: Charles Lyding <19598772+clydin@users.noreply.github.com>
Date: Wed, 14 May 2025 15:43:15 -0400
Subject: [PATCH 056/138] release: cut the v20.0.0-rc.2 release

---
 CHANGELOG.md | 12 ++++++++++++
 package.json |  2 +-
 2 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8a97b614f43d..76f906bfae9d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,15 @@
+<a name="20.0.0-rc.2"></a>
+
+# 20.0.0-rc.2 (2025-05-14)
+
+### @angular/build
+
+| Commit                                                                                              | Type | Description                                          |
+| --------------------------------------------------------------------------------------------------- | ---- | ---------------------------------------------------- |
+| [d2bfc6bd4](https://github.com/angular/angular-cli/commit/d2bfc6bd4eb0892e9eb6205838158142b716d21c) | fix  | revert setup unit-test polyfills before TestBed init |
+
+<!-- CHANGELOG SPLIT MARKER -->
+
 <a name="20.0.0-rc.1"></a>
 
 # 20.0.0-rc.1 (2025-05-14)
diff --git a/package.json b/package.json
index 19ea63ca5cf4..33e8f4a49a2f 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@angular/devkit-repo",
-  "version": "20.0.0-rc.1",
+  "version": "20.0.0-rc.2",
   "private": true,
   "description": "Software Development Kit for Angular",
   "keywords": [

From a5caafd0f8ad6ab9e3d5089f4e7ac09551778fe4 Mon Sep 17 00:00:00 2001
From: Angular Robot <angular-robot@google.com>
Date: Thu, 15 May 2025 05:03:12 +0000
Subject: [PATCH 057/138] build: update dependency node to v22.15.1

See associated pull request for more information.

(cherry picked from commit fc04fe7cf7b758aada6710b34921e787572e9675)
---
 .nvmrc | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.nvmrc b/.nvmrc
index b8ffd70759fb..8320a6d2994a 100644
--- a/.nvmrc
+++ b/.nvmrc
@@ -1 +1 @@
-22.15.0
+22.15.1

From 9c29cf7ba3b5a81b62ffc22ac1af9c9690374f98 Mon Sep 17 00:00:00 2001
From: Alan Agius <17563226+alan-agius4@users.noreply.github.com>
Date: Thu, 15 May 2025 08:30:15 +0000
Subject: [PATCH 058/138] refactor: remove unused function

Remove unused code

(cherry picked from commit f9b9e4e32cdd451f429091e9e41e2dfc151da023)
---
 .../build/src/builders/unit-test/options.ts       | 15 ---------------
 1 file changed, 15 deletions(-)

diff --git a/packages/angular/build/src/builders/unit-test/options.ts b/packages/angular/build/src/builders/unit-test/options.ts
index 9edd02d1c14a..2df827028d29 100644
--- a/packages/angular/build/src/builders/unit-test/options.ts
+++ b/packages/angular/build/src/builders/unit-test/options.ts
@@ -55,18 +55,3 @@ export async function normalizeOptions(
     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;
-}

From c51a540ce4fb191811d2be06a9937f11826b38a5 Mon Sep 17 00:00:00 2001
From: Charles Lyding <19598772+clydin@users.noreply.github.com>
Date: Thu, 15 May 2025 13:47:50 -0400
Subject: [PATCH 059/138] fix(@angular/build): provide direct debugging support
 for unit test builder

When using the experimental `unit-test` builder with the `vitest` runner,
a `debug` option is now available which configures the underlying runner
to setup and use the Node Inspector to debug tests. This reduces the
complexity to support debugging unit tests via a command execution of
`ng test --debug`. This will cause the test process to initialize and
then wait for a debugger to connect prior to executing the tests.

(cherry picked from commit ce2840762ba38e58d14f2a06fbeb949f054d963c)
---
 .../build/src/builders/unit-test/builder.ts   | 19 +++++++++++++++++++
 .../src/builders/unit-test/karma-bridge.ts    |  6 ++++++
 .../build/src/builders/unit-test/options.ts   |  1 +
 .../build/src/builders/unit-test/schema.json  |  5 +++++
 4 files changed, 31 insertions(+)

diff --git a/packages/angular/build/src/builders/unit-test/builder.ts b/packages/angular/build/src/builders/unit-test/builder.ts
index 4a0808f58115..3e4a02fed5f3 100644
--- a/packages/angular/build/src/builders/unit-test/builder.ts
+++ b/packages/angular/build/src/builders/unit-test/builder.ts
@@ -183,6 +183,7 @@ export async function* execute(
   // Setup vitest browser options if configured
   const { browser, errors } = setupBrowserConfiguration(
     normalizedOptions.browsers,
+    normalizedOptions.debug,
     projectSourceRoot,
   );
   if (errors?.length) {
@@ -196,6 +197,13 @@ export async function* execute(
   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)) {
@@ -226,6 +234,7 @@ export async function* execute(
             exclude: normalizedOptions.codeCoverageExclude,
             excludeAfterRemap: true,
           },
+          ...debugOptions,
         },
       });
 
@@ -259,6 +268,7 @@ function findBrowserProvider(
 
 function setupBrowserConfiguration(
   browsers: string[] | undefined,
+  debug: boolean,
   projectSourceRoot: string,
 ): { browser?: import('vitest/node').BrowserConfigOptions; errors?: string[] } {
   if (browsers === undefined) {
@@ -287,6 +297,15 @@ function setupBrowserConfiguration(
     );
   }
 
+  // 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 };
   }
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<AsyncIterable<BuilderOutput>> {
+  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 2df827028d29..ec2e0402a507 100644
--- a/packages/angular/build/src/builders/unit-test/options.ts
+++ b/packages/angular/build/src/builders/unit-test/options.ts
@@ -52,6 +52,7 @@ export async function normalizeOptions(
     reporters,
     browsers,
     watch,
+    debug: options.debug ?? false,
     providersFile: options.providersFile && path.join(workspaceRoot, options.providersFile),
   };
 }
diff --git a/packages/angular/build/src/builders/unit-test/schema.json b/packages/angular/build/src/builders/unit-test/schema.json
index 8cc91c7d8b90..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.",

From eee816f79b4464286dcecc16f53c06be8afd4ccf Mon Sep 17 00:00:00 2001
From: Charles Lyding <19598772+clydin@users.noreply.github.com>
Date: Thu, 15 May 2025 13:17:18 -0400
Subject: [PATCH 060/138] fix(@angular/build): use global unit-test hooks
 during TestBed init

To provide improved Zone.js support with the experimental `unit-test` builder
using the `vitest` runner, the TestBed initialization now uses the global
`beforeEach`/`afterEach` test hooks. The global hooks can be patched by
Zone.js. The vitest globals are always available when using the `unit-test`
builder.

(cherry picked from commit 1d26eb536bb0f3d1a2d1679f6f83934046f0bc7b)
---
 packages/angular/build/src/builders/unit-test/builder.ts | 1 -
 1 file changed, 1 deletion(-)

diff --git a/packages/angular/build/src/builders/unit-test/builder.ts b/packages/angular/build/src/builders/unit-test/builder.ts
index 3e4a02fed5f3..65bcf9f21efb 100644
--- a/packages/angular/build/src/builders/unit-test/builder.ts
+++ b/packages/angular/build/src/builders/unit-test/builder.ts
@@ -145,7 +145,6 @@ export async function* execute(
         `import { NgModule } from '@angular/core';`,
         `import { getTestBed, ɵgetCleanupHook as getCleanupHook } from '@angular/core/testing';`,
         `import { BrowserTestingModule, platformBrowserTesting } from '@angular/platform-browser/testing';`,
-        `import { beforeEach, afterEach } from 'vitest';`,
         '',
         normalizedOptions.providersFile
           ? `import providers from './${path

From 059c10eb4df72b0d67f73783826e2bbae611ad35 Mon Sep 17 00:00:00 2001
From: Andrew Scott <atscott01@gmail.com>
Date: Thu, 15 May 2025 09:35:30 -0700
Subject: [PATCH 061/138] fix(@angular/ssr): SSR should work without
 `@angular/router`

This fixes SSR to ensure serialization is not broken when router is not
provided.

(cherry picked from commit dfe68c797d50c02f313d51eca053c1878453ac9f)
---
 packages/angular/ssr/src/utils/ng.ts | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/packages/angular/ssr/src/utils/ng.ts b/packages/angular/ssr/src/utils/ng.ts
index c485784798dd..b92aa51d1d84 100644
--- a/packages/angular/ssr/src/utils/ng.ts
+++ b/packages/angular/ssr/src/utils/ng.ts
@@ -20,7 +20,7 @@ import {
   platformServer,
   ɵrenderInternal as renderInternal,
 } from '@angular/platform-server';
-import { Router } from '@angular/router';
+import { ActivatedRoute, Router } from '@angular/router';
 import { Console } from '../console';
 import { joinUrlParts, stripIndexHtmlFromURL } from './url';
 
@@ -98,10 +98,13 @@ export async function renderAngular(
 
     // TODO(alanagius): Find a way to avoid rendering here especially for redirects as any output will be discarded.
     const envInjector = applicationRef.injector;
+    const routerIsProvided = !!envInjector.get(ActivatedRoute, null);
     const router = envInjector.get(Router);
     const lastSuccessfulNavigation = router.lastSuccessfulNavigation;
 
-    if (lastSuccessfulNavigation?.finalUrl) {
+    if (!routerIsProvided) {
+      hasNavigationError = false;
+    } else if (lastSuccessfulNavigation?.finalUrl) {
       hasNavigationError = false;
 
       const { finalUrl, initialUrl } = lastSuccessfulNavigation;

From b155ba1dcdbc3c506311e4434c37f1b4c77c7572 Mon Sep 17 00:00:00 2001
From: Charles Lyding <19598772+clydin@users.noreply.github.com>
Date: Thu, 15 May 2025 17:51:02 -0400
Subject: [PATCH 062/138] fix(@angular/build): enable unit-test builder watch
 outside CI

When using the experimental `unit-test` builder, the `watch` option will
now default to true when there is an interactive terminal and not on CI.
This more closely aligns with the behavior of the existing `karma` builder
and that of vitest itself. CI is determined by the presence of a truthy
`CI` environment variable.

(cherry picked from commit 4da02ca5d8ebef04f23b1a2454c82f81b4c44d52)
---
 packages/angular/build/src/builders/unit-test/options.ts | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/packages/angular/build/src/builders/unit-test/options.ts b/packages/angular/build/src/builders/unit-test/options.ts
index ec2e0402a507..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<ReturnType<typeof normalizeOptions>>;
@@ -32,8 +33,7 @@ export async function normalizeOptions(
   const buildTargetSpecifier = options.buildTarget ?? `::development`;
   const buildTarget = targetFromTargetString(buildTargetSpecifier, projectName, 'build');
 
-  const { codeCoverage, codeCoverageExclude, tsConfig, runner, reporters, browsers, watch } =
-    options;
+  const { codeCoverage, codeCoverageExclude, tsConfig, runner, reporters, browsers } = options;
 
   return {
     // Project/workspace information
@@ -51,7 +51,7 @@ export async function normalizeOptions(
     tsConfig,
     reporters,
     browsers,
-    watch,
+    watch: options.watch ?? isTTY(),
     debug: options.debug ?? false,
     providersFile: options.providersFile && path.join(workspaceRoot, options.providersFile),
   };

From b36034dfd5bc30774b89dce331147ecdc36dea11 Mon Sep 17 00:00:00 2001
From: Alan Agius <17563226+alan-agius4@users.noreply.github.com>
Date: Fri, 16 May 2025 12:57:07 +0000
Subject: [PATCH 063/138] refactor: disable chrome sandbox as it no longer
 works in CI

This commit disables the chrome sandbox

(cherry picked from commit 0b4e3f3bfbcaf4a9123e3a544ce80ec7fa91733d)
---
 modules/testing/builder/projects/hello-world-app/karma.conf.js  | 2 +-
 .../test/hello-world-lib/projects/lib/karma.conf.js             | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

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/packages/angular_devkit/build_angular/test/hello-world-lib/projects/lib/karma.conf.js b/packages/angular_devkit/build_angular/test/hello-world-lib/projects/lib/karma.conf.js
index 949ae97608d3..fe024ed63ee2 100644
--- a/packages/angular_devkit/build_angular/test/hello-world-lib/projects/lib/karma.conf.js
+++ b/packages/angular_devkit/build_angular/test/hello-world-lib/projects/lib/karma.conf.js
@@ -42,7 +42,7 @@ module.exports = function (config) {
         base: 'ChromeHeadless',
         flags: [
           '--disable-gpu',
-          ...(process.env.CHROME_NO_SANDBOX === '1' ? ['--no-sandbox'] : []),
+          '--no-sandbox'
         ],
       }
     },

From 4b579347ff28aa3d9a301da8e98d13833549ccdc Mon Sep 17 00:00:00 2001
From: Paul Gschwendtner <paulgschwendtner@gmail.com>
Date: Fri, 16 May 2025 12:27:32 +0000
Subject: [PATCH 064/138] build: update dev-infra for latest RBE changes

Updates dev-infra for latest RBE changes.

(cherry picked from commit e19166088f6f6c7e359497410d0e1f5a23b65064)
---
 WORKSPACE | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/WORKSPACE b/WORKSPACE
index 43098332611e..a6fd2d2ce6da 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -232,7 +232,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",
 )
 

From b264517a946ed5ad92712920b7c60ddd243d817c Mon Sep 17 00:00:00 2001
From: Angular Robot <angular-robot@google.com>
Date: Fri, 16 May 2025 14:02:34 +0000
Subject: [PATCH 065/138] build: update dependency aspect_rules_ts to v3.6.0

See associated pull request for more information.

(cherry picked from commit 411ff72782e25bd3af4409721db3a739318f70f0)
---
 WORKSPACE | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/WORKSPACE b/WORKSPACE
index a6fd2d2ce6da..6fdd5f39caa6 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -198,9 +198,9 @@ 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")

From 5b43174f129d10648258ac33961a55f341649af6 Mon Sep 17 00:00:00 2001
From: Alan Agius <17563226+alan-agius4@users.noreply.github.com>
Date: Mon, 19 May 2025 08:44:34 +0000
Subject: [PATCH 066/138] fix(@angular/pwa): remove `background_color` and
 `theme_color` from manifest

These properties are unnecessary and create additional maintenance overhead for developers.

Closes: #30336
(cherry picked from commit 7a21deb007efb25c43bd867c0dfc50c1123f37a6)
---
 packages/angular/pwa/README.md                             | 4 +---
 packages/angular/pwa/pwa/files/assets/manifest.webmanifest | 2 --
 packages/angular/pwa/pwa/index.ts                          | 1 -
 packages/angular/pwa/pwa/index_spec.ts                     | 2 --
 4 files changed, 1 insertion(+), 8 deletions(-)

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 f78095b7a564..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('  <link rel="manifest" href="manifest.webmanifest">\n');
-        rewriter.emitRaw('  <meta name="theme-color" content="#1976d2">\n');
       } else if (endTag.tagName === 'body' && needsNoScript) {
         rewriter.emitRaw(
           '  <noscript>Please enable JavaScript to continue using this application.</noscript>\n',
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(/<link rel="manifest" href="manifest.webmanifest">/);
-    expect(content).toMatch(/<meta name="theme-color" content="#1976d2">/);
     expect(content).toMatch(
       /<noscript>Please enable JavaScript to continue using this application.<\/noscript>/,
     );
@@ -127,7 +126,6 @@ describe('PWA Schematic', () => {
     const content = tree.readContent('projects/bar/src/index.html');
 
     expect(content).toMatch(/<link rel="manifest" href="manifest.webmanifest">/);
-    expect(content).toMatch(/<meta name="theme-color" content="#1976d2">/);
     expect(content).not.toMatch(
       /<noscript>Please enable JavaScript to continue using this application.<\/noscript>/,
     );

From b13805a77a5654a352a6c6f760965c326977ff14 Mon Sep 17 00:00:00 2001
From: cexbrayat <cedric@ninja-squad.com>
Date: Mon, 19 May 2025 18:00:54 +0200
Subject: [PATCH 067/138] fix(@schematics/angular): use protected for class
 member

This follows the updated style guide recommendations.

https://next.angular.dev/style-guide#use-protected-on-class-members-that-are-only-used-by-a-components-template
(cherry picked from commit db74fb3f5e4a279416b81a2d3df035d2d8e55b5e)
---
 .../files/module-files/src/app/app.spec.ts.template         | 6 ------
 .../application/files/module-files/src/app/app.ts.template  | 2 +-
 .../files/standalone-files/src/app/app.spec.ts.template     | 6 ------
 .../files/standalone-files/src/app/app.ts.template          | 2 +-
 4 files changed, 2 insertions(+), 14 deletions(-)

diff --git a/packages/schematics/angular/application/files/module-files/src/app/app.spec.ts.template b/packages/schematics/angular/application/files/module-files/src/app/app.spec.ts.template
index e3f5c5fff092..43a982f1f3b1 100644
--- a/packages/schematics/angular/application/files/module-files/src/app/app.spec.ts.template
+++ b/packages/schematics/angular/application/files/module-files/src/app/app.spec.ts.template
@@ -22,12 +22,6 @@ describe('App', () => {
     expect(app).toBeTruthy();
   });
 
-  it(`should have as title '<%= name %>'`, () => {
-    const fixture = TestBed.createComponent(App);
-    const app = fixture.componentInstance;
-    expect(app.title).toEqual('<%= name %>');
-  });
-
   it('should render title', () => {
     const fixture = TestBed.createComponent(App);
     fixture.detectChanges();
diff --git a/packages/schematics/angular/application/files/module-files/src/app/app.ts.template b/packages/schematics/angular/application/files/module-files/src/app/app.ts.template
index ca94fc7bb99a..a7de7291cb3c 100644
--- a/packages/schematics/angular/application/files/module-files/src/app/app.ts.template
+++ b/packages/schematics/angular/application/files/module-files/src/app/app.ts.template
@@ -15,5 +15,5 @@ import { Component } from '@angular/core';
   styleUrl: './app.<%= style %>'<% } %>
 })
 export class App {
-  title = '<%= name %>';
+  protected title = '<%= name %>';
 }
diff --git a/packages/schematics/angular/application/files/standalone-files/src/app/app.spec.ts.template b/packages/schematics/angular/application/files/standalone-files/src/app/app.spec.ts.template
index eb529a1df3c7..808723635d96 100644
--- a/packages/schematics/angular/application/files/standalone-files/src/app/app.spec.ts.template
+++ b/packages/schematics/angular/application/files/standalone-files/src/app/app.spec.ts.template
@@ -16,12 +16,6 @@ describe('App', () => {
     expect(app).toBeTruthy();
   });
 
-  it(`should have the '<%= name %>' title`, () => {
-    const fixture = TestBed.createComponent(App);
-    const app = fixture.componentInstance;
-    expect(app.title).toEqual('<%= name %>');
-  });
-
   it('should render title', () => {
     const fixture = TestBed.createComponent(App);
     fixture.detectChanges();
diff --git a/packages/schematics/angular/application/files/standalone-files/src/app/app.ts.template b/packages/schematics/angular/application/files/standalone-files/src/app/app.ts.template
index 74ea464e5d04..ec40bb8c0c07 100644
--- a/packages/schematics/angular/application/files/standalone-files/src/app/app.ts.template
+++ b/packages/schematics/angular/application/files/standalone-files/src/app/app.ts.template
@@ -16,5 +16,5 @@ import { RouterOutlet } from '@angular/router';<% } %>
   styleUrl: './app.<%= style %>'<% } %>
 })
 export class App {
-  title = '<%= name %>';
+  protected title = '<%= name %>';
 }

From aec95042b4d690c25645af590788c608b4b353dc Mon Sep 17 00:00:00 2001
From: Charles Lyding <19598772+clydin@users.noreply.github.com>
Date: Mon, 19 May 2025 11:49:18 -0400
Subject: [PATCH 068/138] fix(@angular/build): exclude only source test files
 with unit-test vitest support

When using the experimental unit-test builder with the vitest runner and code coverage,
the automatic coverage excludes are now adjust to not include the bundled test files.
This previously prevent accurate coverage analysis.
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.

(cherry picked from commit 87f412120aaa472399c1bf34e57db2e9ea4c80f2)
---
 .../build/src/builders/unit-test/builder.ts      | 16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)

diff --git a/packages/angular/build/src/builders/unit-test/builder.ts b/packages/angular/build/src/builders/unit-test/builder.ts
index 65bcf9f21efb..70573a481234 100644
--- a/packages/angular/build/src/builders/unit-test/builder.ts
+++ b/packages/angular/build/src/builders/unit-test/builder.ts
@@ -230,11 +230,25 @@ export async function* execute(
           reporters: normalizedOptions.reporters ?? ['default'],
           coverage: {
             enabled: normalizedOptions.codeCoverage,
-            exclude: normalizedOptions.codeCoverageExclude,
             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

From 787e510dccabf30589194fcefdb74a687dfa3945 Mon Sep 17 00:00:00 2001
From: Alan Agius <17563226+alan-agius4@users.noreply.github.com>
Date: Tue, 20 May 2025 11:14:31 +0000
Subject: [PATCH 069/138] fix(@angular/cli): update min Node.js support to
 20.19, 22.12, and 24.0

Bumps the minimum Node.js support for `@angular/cli`. This update ensures compatibility with a growing number of upstream dependencies, such as Undici and Pacote, that are adopting newer Node.js versions. These versions where selected as `require(esm)` is enabled by default. This change also prepares us for future package releases that will likely rely on this behavior.

(cherry picked from commit d06ff3f408d30e0db11a2bc5f65d3ffa81b22643)
---
 WORKSPACE                                     | 74 +++++++++----------
 constants.bzl                                 |  2 +-
 docs/DEVELOPER.md                             |  2 +-
 package.json                                  |  2 +-
 .../build/src/utils/load-proxy-config.ts      | 10 ++-
 packages/angular/cli/lib/cli/index.ts         |  2 +-
 .../node/node-modules-architect-host.ts       | 14 +++-
 .../src/tools/webpack/configs/dev-server.ts   | 22 +++---
 .../angular_devkit/build_webpack/src/utils.ts | 15 ++--
 9 files changed, 77 insertions(+), 66 deletions(-)

diff --git a/WORKSPACE b/WORKSPACE
index 6fdd5f39caa6..699ae2932acb 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,65 +59,65 @@ 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 = {
-        "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"),
-    },
-    node_version = "24.0.0",
+    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(
diff --git a/constants.bzl b/constants.bzl
index cb33e793ed8c..00a26f29f81b 100644
--- a/constants.bzl
+++ b/constants.bzl
@@ -1,5 +1,5 @@
 # Engine versions to stamp in a release package.json
-RELEASE_ENGINES_NODE = "^20.11.1 || ^22.11.0 || >=24.0.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"
 
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/package.json b/package.json
index 33e8f4a49a2f..c218b5a8c320 100644
--- a/package.json
+++ b/package.json
@@ -34,7 +34,7 @@
   },
   "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"
diff --git a/packages/angular/build/src/utils/load-proxy-config.ts b/packages/angular/build/src/utils/load-proxy-config.ts
index e9e382a7805a..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);
@@ -71,8 +70,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;
         }
 
@@ -80,6 +78,10 @@ export async function loadProxyConfiguration(
       }
   }
 
+  if ('default' in proxyConfiguration) {
+    proxyConfiguration = proxyConfiguration.default;
+  }
+
   return normalizeProxyConfiguration(proxyConfiguration);
 }
 
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_devkit/architect/node/node-modules-architect-host.ts b/packages/angular_devkit/architect/node/node-modules-architect-host.ts
index e30badffcc97..6319ab638360 100644
--- a/packages/angular_devkit/architect/node/node-modules-architect-host.ts
+++ b/packages/angular_devkit/architect/node/node-modules-architect-host.ts
@@ -310,19 +310,22 @@ export function loadEsmModule<T>(modulePath: string | URL): Promise<T> {
 
 // eslint-disable-next-line @typescript-eslint/no-explicit-any
 async function getBuilder(builderPath: string): Promise<any> {
+  let builder;
   switch (path.extname(builderPath)) {
     case '.mjs':
       // 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.
-      return (await loadEsmModule<{ default: unknown }>(pathToFileURL(builderPath))).default;
+      builder = (await loadEsmModule<{ default: unknown }>(pathToFileURL(builderPath))).default;
+      break;
     case '.cjs':
-      return localRequire(builderPath);
+      builder = localRequire(builderPath);
+      break;
     default:
       // The file could be either CommonJS or ESM.
       // CommonJS is tried first then ESM if loading fails.
       try {
-        return localRequire(builderPath);
+        builder = localRequire(builderPath);
       } catch (e) {
         if (
           (e as NodeJS.ErrnoException).code === 'ERR_REQUIRE_ESM' ||
@@ -331,10 +334,13 @@ async function getBuilder(builderPath: string): Promise<any> {
           // 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.
-          return (await loadEsmModule<{ default: unknown }>(pathToFileURL(builderPath))).default;
+          builder = await loadEsmModule<{ default: unknown }>(pathToFileURL(builderPath));
         }
 
         throw e;
       }
+      break;
   }
+
+  return 'default' in builder ? builder.default : builder;
 }
diff --git a/packages/angular_devkit/build_angular/src/tools/webpack/configs/dev-server.ts b/packages/angular_devkit/build_angular/src/tools/webpack/configs/dev-server.ts
index 70d863cdfbfd..5606e8d13d87 100644
--- a/packages/angular_devkit/build_angular/src/tools/webpack/configs/dev-server.ts
+++ b/packages/angular_devkit/build_angular/src/tools/webpack/configs/dev-server.ts
@@ -169,7 +169,7 @@ async function addProxyConfig(
     throw new Error(`Proxy configuration file ${proxyPath} does not exist.`);
   }
 
-  let proxyConfiguration: Record<string, object> | object[];
+  let proxyConfiguration;
 
   switch (extname(proxyPath)) {
     case '.json': {
@@ -194,11 +194,9 @@ async function addProxyConfig(
       // 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: Record<string, object> | object[] }>(
-          pathToFileURL(proxyPath),
-        )
-      ).default;
+      proxyConfiguration = await loadEsmModule<{ default: Record<string, object> | object[] }>(
+        pathToFileURL(proxyPath),
+      );
       break;
     case '.cjs':
       proxyConfiguration = require(proxyPath);
@@ -217,14 +215,16 @@ async function addProxyConfig(
         // 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: Record<string, object> | object[] }>(
-            pathToFileURL(proxyPath),
-          )
-        ).default;
+        proxyConfiguration = await loadEsmModule<{ default: Record<string, object> | object[] }>(
+          pathToFileURL(proxyPath),
+        );
       }
   }
 
+  if ('default' in proxyConfiguration) {
+    proxyConfiguration = proxyConfiguration.default;
+  }
+
   return normalizeProxyConfiguration(proxyConfiguration);
 }
 
diff --git a/packages/angular_devkit/build_webpack/src/utils.ts b/packages/angular_devkit/build_webpack/src/utils.ts
index 0254848053f0..47c30b548f4e 100644
--- a/packages/angular_devkit/build_webpack/src/utils.ts
+++ b/packages/angular_devkit/build_webpack/src/utils.ts
@@ -76,19 +76,23 @@ export async function getWebpackConfig(configPath: string): Promise<Configuratio
     throw new Error(`Webpack configuration file ${configPath} does not exist.`);
   }
 
+  let config;
   switch (path.extname(configPath)) {
     case '.mjs':
       // 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.
-      return (await loadEsmModule<{ default: Configuration }>(pathToFileURL(configPath))).default;
+      config = await loadEsmModule<{ default: Configuration }>(pathToFileURL(configPath));
+      break;
     case '.cjs':
-      return require(configPath);
+      config = require(configPath);
+      break;
     default:
       // The file could be either CommonJS or ESM.
       // CommonJS is tried first then ESM if loading fails.
       try {
-        return require(configPath);
+        config = require(configPath);
+        break;
       } catch (e) {
         if (
           (e as NodeJS.ErrnoException).code === 'ERR_REQUIRE_ESM' ||
@@ -97,11 +101,12 @@ export async function getWebpackConfig(configPath: string): Promise<Configuratio
           // 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.
-          return (await loadEsmModule<{ default: Configuration }>(pathToFileURL(configPath)))
-            .default;
+          config = await loadEsmModule<{ default: Configuration }>(pathToFileURL(configPath));
         }
 
         throw e;
       }
   }
+
+  return 'default' in config ? config.default : config;
 }

From cd96217e702f528d9602843f4a80a748160bead6 Mon Sep 17 00:00:00 2001
From: Angular Robot <angular-robot@google.com>
Date: Mon, 19 May 2025 19:45:51 +0000
Subject: [PATCH 070/138] build: update dependency pacote to v21

See associated pull request for more information.

(cherry picked from commit 662d95e6d6ca05c1b7405e82babcf7268c4411c2)
---
 packages/angular/cli/package.json |  2 +-
 pnpm-lock.yaml                    | 22 +++++++++++-----------
 2 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/packages/angular/cli/package.json b/packages/angular/cli/package.json
index a8f029d35253..93ba24f0306e 100644
--- a/packages/angular/cli/package.json
+++ b/packages/angular/cli/package.json
@@ -34,7 +34,7 @@
     "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.2",
     "yargs": "17.7.2"
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index b8c1b15110f9..c87be45e6ce4 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -493,8 +493,8 @@ importers:
         specifier: 10.0.0
         version: 10.0.0
       pacote:
-        specifier: 20.0.0
-        version: 20.0.0
+        specifier: 21.0.0
+        version: 21.0.0
       resolve:
         specifier: 1.22.10
         version: 1.22.10
@@ -6170,9 +6170,9 @@ packages:
     resolution: {integrity: sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA==}
     engines: {node: ^18.17.0 || >=20.5.0}
 
-  npm-packlist@9.0.0:
-    resolution: {integrity: sha512-8qSayfmHJQTx3nJWYbbUmflpyarbLMBc6LCAjYsiGtXxDB68HaZpb8re6zeaLGxZzDuMdhsg70jryJe+RrItVQ==}
-    engines: {node: ^18.17.0 || >=20.5.0}
+  npm-packlist@10.0.0:
+    resolution: {integrity: sha512-rht9U6nS8WOBDc53eipZNPo5qkAV4X2rhKE2Oj1DYUQ3DieXfj0mKkVmjnf3iuNdtMd8WfLdi2L6ASkD/8a+Kg==}
+    engines: {node: ^20.17.0 || >=22.9.0}
 
   npm-pick-manifest@10.0.0:
     resolution: {integrity: sha512-r4fFa4FqYY8xaM7fHecQ9Z2nE9hgNfJR+EmoKv0+chvzWkBcORX3r0FpTByP+CbOVJDladMXnPQGVN8PBLGuTQ==}
@@ -6418,9 +6418,9 @@ packages:
   package-json-from-dist@1.0.1:
     resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==}
 
-  pacote@20.0.0:
-    resolution: {integrity: sha512-pRjC5UFwZCgx9kUFDVM9YEahv4guZ1nSLqwmWiLUnDbGsjs+U5w7z6Uc8HNR1a6x8qnu5y9xtGE6D1uAuYz+0A==}
-    engines: {node: ^18.17.0 || >=20.5.0}
+  pacote@21.0.0:
+    resolution: {integrity: sha512-lcqexq73AMv6QNLo7SOpz0JJoaGdS3rBFgF122NZVl1bApo2mfu+XzUBU/X/XsiJu+iUmKpekRayqQYAs+PhkA==}
+    engines: {node: ^20.17.0 || >=22.9.0}
     hasBin: true
 
   pako@0.2.9:
@@ -14307,7 +14307,7 @@ snapshots:
       semver: 7.7.2
       validate-npm-package-name: 6.0.0
 
-  npm-packlist@9.0.0:
+  npm-packlist@10.0.0:
     dependencies:
       ignore-walk: 7.0.0
 
@@ -14520,7 +14520,7 @@ snapshots:
 
   package-json-from-dist@1.0.1: {}
 
-  pacote@20.0.0:
+  pacote@21.0.0:
     dependencies:
       '@npmcli/git': 6.0.3
       '@npmcli/installed-package-contents': 3.0.0
@@ -14531,7 +14531,7 @@ snapshots:
       fs-minipass: 3.0.3
       minipass: 7.1.2
       npm-package-arg: 12.0.2
-      npm-packlist: 9.0.0
+      npm-packlist: 10.0.0
       npm-pick-manifest: 10.0.0
       npm-registry-fetch: 18.0.2
       proc-log: 5.0.0

From 36c2a823231245af1f1151ed6b73782d678e446c Mon Sep 17 00:00:00 2001
From: Angular Robot <angular-robot@google.com>
Date: Tue, 20 May 2025 08:02:11 +0000
Subject: [PATCH 071/138] build: update rules_angular digest to 5b9b1fc

See associated pull request for more information.

(cherry picked from commit 776366f3730e8fe973588b8c38223e72ad526819)
---
 WORKSPACE | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/WORKSPACE b/WORKSPACE
index 699ae2932acb..de1eb4bfe2fe 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -273,7 +273,7 @@ esbuild_register_toolchains(
 
 git_repository(
     name = "rules_angular",
-    commit = "c0d7927a33802db438c01d2ae8ad1884e6c363fd",
+    commit = "5b9b1fc545736b8b602a216f89134c1f20d3009c",
     remote = "https://github.com/devversion/rules_angular.git",
 )
 

From a42e045bab3bfbeb0bb69c3406fd0a76ae263cdf Mon Sep 17 00:00:00 2001
From: igord <grmail@gmail.com>
Date: Wed, 14 May 2025 15:31:52 +0200
Subject: [PATCH 072/138] fix(@angular-devkit/build-angular): respect
 i18nDuplicateTranslation option when duplicates exist

Running the extract-i18n command will always log duplicate i18n message IDs as warnings, regardless of the value of the i18nDuplicateTranslation option. With this fix, command will log duplication errors and exit with code 1

Fixes #23635

(cherry picked from commit d16e358edac8fdeeb4faf07d090e34fcfa10da2d)
---
 goldens/public-api/angular/build/index.api.md |  1 +
 .../angular_devkit/build_angular/index.api.md |  1 +
 .../src/builders/extract-i18n/builder.ts      | 13 +++++++--
 .../src/builders/extract-i18n/options.ts      | 10 +++++--
 .../src/builders/extract-i18n/schema.json     |  5 ++++
 .../angular/build/src/utils/i18n-options.ts   |  2 --
 .../src/builders/extract-i18n/builder.ts      | 13 +++++++--
 .../src/builders/extract-i18n/options.ts      | 10 +++++--
 .../src/builders/extract-i18n/schema.json     |  5 ++++
 .../src/builders/extract-i18n/works_spec.ts   | 28 +++++++++++++++++++
 10 files changed, 76 insertions(+), 12 deletions(-)

diff --git a/goldens/public-api/angular/build/index.api.md b/goldens/public-api/angular/build/index.api.md
index 31576f664e36..aa9ac693864e 100644
--- a/goldens/public-api/angular/build/index.api.md
+++ b/goldens/public-api/angular/build/index.api.md
@@ -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<T> = (input: T) => T | Promise<T>;
 export type ExtractI18nBuilderOptions = {
     buildTarget?: string;
     format?: Format;
+    i18nDuplicateTranslation?: I18NDuplicateTranslation;
     outFile?: string;
     outputPath?: string;
     progress?: boolean;
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<ReturnType<typeof normalizeOptions>>;
@@ -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/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_devkit/build_angular/src/builders/extract-i18n/builder.ts b/packages/angular_devkit/build_angular/src/builders/extract-i18n/builder.ts
index bb6750189a1a..2d22fda36e96 100644
--- a/packages/angular_devkit/build_angular/src/builders/extract-i18n/builder.ts
+++ b/packages/angular_devkit/build_angular/src/builders/extract-i18n/builder.ts
@@ -110,16 +110,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,
-    '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_devkit/build_angular/src/builders/extract-i18n/options.ts b/packages/angular_devkit/build_angular/src/builders/extract-i18n/options.ts
index 492909da14f0..0aaf255e7d47 100644
--- a/packages/angular_devkit/build_angular/src/builders/extract-i18n/options.ts
+++ b/packages/angular_devkit/build_angular/src/builders/extract-i18n/options.ts
@@ -6,7 +6,8 @@
  * found in the LICENSE file at https://angular.dev/license
  */
 
-import { createI18nOptions } from '@angular/build/private';
+import { type I18nOptions, createI18nOptions } from '@angular/build/private';
+import { type DiagnosticHandlingStrategy } from '@angular/localize/tools';
 import { BuilderContext, targetFromTargetString } from '@angular-devkit/architect';
 import { fail } from 'node:assert';
 import path from 'node:path';
@@ -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_devkit/build_angular/src/builders/extract-i18n/schema.json b/packages/angular_devkit/build_angular/src/builders/extract-i18n/schema.json
index 9ab939b0e938..08a118ad7d5e 100644
--- a/packages/angular_devkit/build_angular/src/builders/extract-i18n/schema.json
+++ b/packages/angular_devkit/build_angular/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_devkit/build_angular/src/builders/extract-i18n/works_spec.ts b/packages/angular_devkit/build_angular/src/builders/extract-i18n/works_spec.ts
index b0705dfee1b8..1f29fb96a581 100644
--- a/packages/angular_devkit/build_angular/src/builders/extract-i18n/works_spec.ts
+++ b/packages/angular_devkit/build_angular/src/builders/extract-i18n/works_spec.ts
@@ -147,6 +147,34 @@ describe('Extract i18n Target', () => {
     expect(fullLog).toContain('Duplicate messages with id');
   });
 
+  it('issues errors for duplicate message identifiers', async () => {
+    host.appendToFile(
+      'src/app/app.component.ts',
+      'const c = $localize`:@@message-2:message contents`; const d = $localize`:@@message-2:different message contents`;',
+    );
+
+    const logger = new logging.Logger('');
+    const logs: string[] = [];
+    logger.subscribe((e) => logs.push(e.message));
+
+    const run = await architect.scheduleTarget(
+      extractI18nTargetSpec,
+      {
+        i18nDuplicateTranslation: 'error',
+      },
+      { logger },
+    );
+    await expectAsync(run.result).toBeResolvedTo(jasmine.objectContaining({ success: false }));
+
+    await run.stop();
+
+    expect(host.scopedSync().exists(extractionFile)).toBe(false);
+
+    const fullLog = logs.join();
+    expect(fullLog).toContain('Duplicate messages with id');
+    expect(fullLog).toContain('Extraction Failed');
+  });
+
   it('ignores inline styles', async () => {
     host.appendToFile('src/app/app.component.html', '<p i18n>i18n test</p>');
     host.replaceInFile('src/app/app.component.ts', 'styleUrls', 'styles');

From 7877d9a971dbef5025fdb9a40f49f36e9b42569d Mon Sep 17 00:00:00 2001
From: Charles Lyding <19598772+clydin@users.noreply.github.com>
Date: Tue, 20 May 2025 17:01:54 -0400
Subject: [PATCH 073/138] fix(@angular/build): ensure disabled vitest config
 loading

With the experimental `unit-test` builder with the `vitest` runner, the underlying
vitest execution will no longer attempt to load external configuration files.
The current internal vitest usage does not support integration of external
configuration files.

(cherry picked from commit 25c80b3d7e853bba53353fbeed023b4b0c7dd9df)
---
 .../build/src/builders/unit-test/builder.ts   | 68 +++++++++++--------
 1 file changed, 38 insertions(+), 30 deletions(-)

diff --git a/packages/angular/build/src/builders/unit-test/builder.ts b/packages/angular/build/src/builders/unit-test/builder.ts
index 70573a481234..1fb1aa06a1b2 100644
--- a/packages/angular/build/src/builders/unit-test/builder.ts
+++ b/packages/angular/build/src/builders/unit-test/builder.ts
@@ -217,39 +217,47 @@ export async function* execute(
 
       await writeTestFiles(result.files, outputPath);
 
-      instance ??= await startVitest('test', undefined /* cliFilters */, undefined /* options */, {
-        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,
+      instance ??= await startVitest(
+        'test',
+        undefined /* cliFilters */,
+        {
+          // Disable configuration file resolution/loading
+          config: false,
         },
-        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',
-              ];
+        {
+          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();

From 4f515ad2a945db7598b907dccb8bd8210a3c0a52 Mon Sep 17 00:00:00 2001
From: Alan Agius <17563226+alan-agius4@users.noreply.github.com>
Date: Wed, 21 May 2025 11:04:38 +0000
Subject: [PATCH 074/138] release: cut the v20.0.0-rc.3 release

---
 CHANGELOG.md | 46 ++++++++++++++++++++++++++++++++++++++++++++++
 package.json |  2 +-
 2 files changed, 47 insertions(+), 1 deletion(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 76f906bfae9d..af1ed782ac07 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,49 @@
+<a name="20.0.0-rc.3"></a>
+
+# 20.0.0-rc.3 (2025-05-21)
+
+### @angular/cli
+
+| Commit                                                                                              | Type | Description                                          |
+| --------------------------------------------------------------------------------------------------- | ---- | ---------------------------------------------------- |
+| [787e510dc](https://github.com/angular/angular-cli/commit/787e510dccabf30589194fcefdb74a687dfa3945) | fix  | update min Node.js support to 20.19, 22.12, and 24.0 |
+
+### @schematics/angular
+
+| Commit                                                                                              | Type | Description                    |
+| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------ |
+| [b13805a77](https://github.com/angular/angular-cli/commit/b13805a77a5654a352a6c6f760965c326977ff14) | fix  | use protected for class member |
+
+### @angular-devkit/build-angular
+
+| Commit                                                                                              | Type | Description                                                   |
+| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------- |
+| [a42e045ba](https://github.com/angular/angular-cli/commit/a42e045bab3bfbeb0bb69c3406fd0a76ae263cdf) | fix  | respect i18nDuplicateTranslation option when duplicates exist |
+
+### @angular/build
+
+| Commit                                                                                              | Type | Description                                                  |
+| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------ |
+| [b155ba1dc](https://github.com/angular/angular-cli/commit/b155ba1dcdbc3c506311e4434c37f1b4c77c7572) | fix  | enable unit-test builder watch outside CI                    |
+| [7877d9a97](https://github.com/angular/angular-cli/commit/7877d9a971dbef5025fdb9a40f49f36e9b42569d) | fix  | ensure disabled vitest config loading                        |
+| [aec95042b](https://github.com/angular/angular-cli/commit/aec95042b4d690c25645af590788c608b4b353dc) | fix  | exclude only source test files with unit-test vitest support |
+| [c51a540ce](https://github.com/angular/angular-cli/commit/c51a540ce4fb191811d2be06a9937f11826b38a5) | fix  | provide direct debugging support for unit test builder       |
+| [eee816f79](https://github.com/angular/angular-cli/commit/eee816f79b4464286dcecc16f53c06be8afd4ccf) | fix  | use global unit-test hooks during TestBed init               |
+
+### @angular/pwa
+
+| Commit                                                                                              | Type | Description                                               |
+| --------------------------------------------------------------------------------------------------- | ---- | --------------------------------------------------------- |
+| [5b43174f1](https://github.com/angular/angular-cli/commit/5b43174f129d10648258ac33961a55f341649af6) | fix  | remove `background_color` and `theme_color` from manifest |
+
+### @angular/ssr
+
+| Commit                                                                                              | Type | Description                               |
+| --------------------------------------------------------------------------------------------------- | ---- | ----------------------------------------- |
+| [059c10eb4](https://github.com/angular/angular-cli/commit/059c10eb4df72b0d67f73783826e2bbae611ad35) | fix  | SSR should work without `@angular/router` |
+
+<!-- CHANGELOG SPLIT MARKER -->
+
 <a name="20.0.0-rc.2"></a>
 
 # 20.0.0-rc.2 (2025-05-14)
diff --git a/package.json b/package.json
index c218b5a8c320..1638477caa7a 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@angular/devkit-repo",
-  "version": "20.0.0-rc.2",
+  "version": "20.0.0-rc.3",
   "private": true,
   "description": "Software Development Kit for Angular",
   "keywords": [

From bcc0892a65f00e68709e84c380f448a5e0fd05e7 Mon Sep 17 00:00:00 2001
From: Alan Agius <17563226+alan-agius4@users.noreply.github.com>
Date: Wed, 21 May 2025 12:06:04 +0000
Subject: [PATCH 075/138] fix(@schematics/angular): migrate
 `provideServerRoutesConfig` to `provideServerRendering`

Previously, `provideServerRoutesConfig` was not properly migrated to `provideServerRendering`. This change ensures the migration is handled correctly.

(cherry picked from commit 7e69aa0ccf30a15472ae29df463b6ed27a7c3c3a)
---
 .../migrations/migration-collection.json      |  2 +-
 .../migration.ts                              | 11 ++++++---
 .../migration_spec.ts                         | 24 +++++++++++++++++++
 3 files changed, 33 insertions(+), 4 deletions(-)

diff --git a/packages/schematics/angular/migrations/migration-collection.json b/packages/schematics/angular/migrations/migration-collection.json
index 659dd48728cd..1de0910aa50a 100644
--- a/packages/schematics/angular/migrations/migration-collection.json
+++ b/packages/schematics/angular/migrations/migration-collection.json
@@ -8,7 +8,7 @@
     "replace-provide-server-routing": {
       "version": "20.0.0",
       "factory": "./replace-provide-server-routing/migration",
-      "description": "Migrate 'provideServerRendering' to use 'withRoutes' and remove 'provideServerRouting' from '@angular/ssr'."
+      "description": "Migrate 'provideServerRendering' to use 'withRoutes', and remove 'provideServerRouting' and 'provideServerRoutesConfig' from '@angular/ssr'."
     },
     "update-module-resolution": {
       "version": "20.0.0",
diff --git a/packages/schematics/angular/migrations/replace-provide-server-routing/migration.ts b/packages/schematics/angular/migrations/replace-provide-server-routing/migration.ts
index 8fc662b6b69a..8b0510aee62b 100644
--- a/packages/schematics/angular/migrations/replace-provide-server-routing/migration.ts
+++ b/packages/schematics/angular/migrations/replace-provide-server-routing/migration.ts
@@ -16,7 +16,11 @@ function* visit(directory: DirEntry): IterableIterator<[fileName: string, conten
       const entry = directory.file(path);
       if (entry) {
         const content = entry.content;
-        if (content.includes('provideServerRouting') && content.includes('@angular/ssr')) {
+        if (
+          (content.includes('provideServerRouting') ||
+            content.includes('provideServerRoutesConfig')) &&
+          content.includes('@angular/ssr')
+        ) {
           // Only need to rename the import so we can just string replacements.
           yield [entry.path, content.toString()];
         }
@@ -63,7 +67,8 @@ export default function (): Rule {
               if (
                 ts.isCallExpression(el) &&
                 ts.isIdentifier(el.expression) &&
-                el.expression.text === 'provideServerRouting'
+                (el.expression.text === 'provideServerRouting' ||
+                  el.expression.text === 'provideServerRoutesConfig')
               ) {
                 const [withRouteVal, ...others] = el.arguments.map((arg) => arg.getText());
 
@@ -99,7 +104,7 @@ export default function (): Rule {
           const elements = namedBindings.elements;
           const updatedElements = elements
             .map((el) => el.getText())
-            .filter((x) => x !== 'provideServerRouting');
+            .filter((x) => x !== 'provideServerRouting' && x !== 'provideServerRoutesConfig');
 
           updatedElements.push('withRoutes');
 
diff --git a/packages/schematics/angular/migrations/replace-provide-server-routing/migration_spec.ts b/packages/schematics/angular/migrations/replace-provide-server-routing/migration_spec.ts
index a0ab33aa15f1..c570ea81c077 100644
--- a/packages/schematics/angular/migrations/replace-provide-server-routing/migration_spec.ts
+++ b/packages/schematics/angular/migrations/replace-provide-server-routing/migration_spec.ts
@@ -61,6 +61,30 @@ describe(`Migration to replace 'provideServerRouting' with 'provideServerRenderi
     expect(content).not.toContain(`provideServerRouting(serverRoutes)`);
   });
 
+  it('should remove "provideServerRoutesConfig" and update "provideServerRendering"', async () => {
+    tree.overwrite(
+      'src/app/app.config.ts',
+      `
+      import { ApplicationConfig } from '@angular/core';
+      import { provideServerRendering, provideServerRoutesConfig } from '@angular/ssr';
+      import { serverRoutes } from './app.routes';
+
+      const serverConfig: ApplicationConfig = {
+        providers: [
+          provideServerRendering(),
+          provideServerRoutesConfig(serverRoutes)
+        ]
+      };
+      `,
+    );
+
+    const newTree = await schematicRunner.runSchematic(schematicName, {}, tree);
+    const content = newTree.readContent('src/app/app.config.ts');
+
+    expect(content).toContain(`providers: [provideServerRendering(withRoutes(serverRoutes))]`);
+    expect(content).not.toContain(`provideServerRoutesConfig(serverRoutes)`);
+  });
+
   it('should correctly handle provideServerRouting with extra arguments', async () => {
     tree.overwrite(
       'src/app/app.config.ts',

From be8cfbab5ff9df2a550c823ddadf2a8c862352f9 Mon Sep 17 00:00:00 2001
From: Alan Agius <17563226+alan-agius4@users.noreply.github.com>
Date: Wed, 21 May 2025 12:37:52 +0000
Subject: [PATCH 076/138] build: update ora to version 8

This commit update ora to version 8.

(cherry picked from commit 2a23579525c80f1918016a0a19109bd73289ea49)
---
 .../angular_devkit/build_angular/package.json |  2 +-
 .../build_angular/src/utils/spinner.ts        |  4 +-
 .../angular_devkit/schematics/package.json    |  2 +-
 .../tasks/package-manager/executor.ts         |  8 +--
 pnpm-lock.yaml                                | 57 +++++++++++++++++--
 5 files changed, 60 insertions(+), 13 deletions(-)

diff --git a/packages/angular_devkit/build_angular/package.json b/packages/angular_devkit/build_angular/package.json
index fe975c0e24d3..84be3d6693a9 100644
--- a/packages/angular_devkit/build_angular/package.json
+++ b/packages/angular_devkit/build_angular/package.json
@@ -41,7 +41,7 @@
     "loader-utils": "3.3.1",
     "mini-css-extract-plugin": "2.9.2",
     "open": "10.1.2",
-    "ora": "5.4.1",
+    "ora": "8.2.0",
     "picomatch": "4.0.2",
     "piscina": "5.0.0",
     "postcss": "8.5.3",
diff --git a/packages/angular_devkit/build_angular/src/utils/spinner.ts b/packages/angular_devkit/build_angular/src/utils/spinner.ts
index f567cac09fdc..c0c29ff2c076 100644
--- a/packages/angular_devkit/build_angular/src/utils/spinner.ts
+++ b/packages/angular_devkit/build_angular/src/utils/spinner.ts
@@ -6,12 +6,12 @@
  * found in the LICENSE file at https://angular.dev/license
  */
 
-import ora from 'ora';
+import ora, { type Ora } from 'ora';
 import { colors } from './color';
 import { isTTY } from './tty';
 
 export class Spinner {
-  private readonly spinner: ora.Ora;
+  private readonly spinner: Ora;
 
   /** When false, only fail messages will be displayed. */
   enabled = true;
diff --git a/packages/angular_devkit/schematics/package.json b/packages/angular_devkit/schematics/package.json
index a82bf8be934b..86047b108921 100644
--- a/packages/angular_devkit/schematics/package.json
+++ b/packages/angular_devkit/schematics/package.json
@@ -16,7 +16,7 @@
     "@angular-devkit/core": "workspace:0.0.0-PLACEHOLDER",
     "jsonc-parser": "3.3.1",
     "magic-string": "0.30.17",
-    "ora": "5.4.1",
+    "ora": "8.2.0",
     "rxjs": "7.8.2"
   }
 }
diff --git a/packages/angular_devkit/schematics/tasks/package-manager/executor.ts b/packages/angular_devkit/schematics/tasks/package-manager/executor.ts
index 99a768ffec64..9e162c0b397b 100644
--- a/packages/angular_devkit/schematics/tasks/package-manager/executor.ts
+++ b/packages/angular_devkit/schematics/tasks/package-manager/executor.ts
@@ -10,7 +10,6 @@ import { BaseException } from '@angular-devkit/core';
 import { SpawnOptions, spawn } from 'node:child_process';
 import * as path from 'node:path';
 import ora from 'ora';
-import { Observable } from 'rxjs';
 import { TaskExecutor, UnsuccessfulWorkflowExecution } from '../../src';
 import { NodePackageTaskFactoryOptions, NodePackageTaskOptions } from './options';
 
@@ -127,7 +126,7 @@ export default function (
       args.push('--force');
     }
 
-    return new Observable((obs) => {
+    return new Promise<void>((resolve, reject) => {
       const spinner = ora({
         text: `Installing packages (${taskPackageManagerName})...`,
         // Workaround for https://github.com/sindresorhus/ora/issues/136.
@@ -139,14 +138,13 @@ export default function (
           if (code === 0) {
             spinner.succeed('Packages installed successfully.');
             spinner.stop();
-            obs.next();
-            obs.complete();
+            resolve();
           } else {
             if (options.hideOutput) {
               bufferedOutput.forEach(({ stream, data }) => stream.write(data));
             }
             spinner.fail('Package install failed, see above.');
-            obs.error(new UnsuccessfulWorkflowExecution());
+            reject(new UnsuccessfulWorkflowExecution());
           }
         },
       );
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index c87be45e6ce4..77dd5682da5a 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -687,8 +687,8 @@ importers:
         specifier: 10.1.2
         version: 10.1.2
       ora:
-        specifier: 5.4.1
-        version: 5.4.1
+        specifier: 8.2.0
+        version: 8.2.0
       picomatch:
         specifier: 4.0.2
         version: 4.0.2
@@ -826,8 +826,8 @@ importers:
         specifier: 0.30.17
         version: 0.30.17
       ora:
-        specifier: 5.4.1
-        version: 5.4.1
+        specifier: 8.2.0
+        version: 8.2.0
       rxjs:
         specifier: 7.8.2
         version: 7.8.2
@@ -5270,6 +5270,10 @@ packages:
     resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==}
     engines: {node: '>=8'}
 
+  is-interactive@2.0.0:
+    resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==}
+    engines: {node: '>=12'}
+
   is-ip@3.1.0:
     resolution: {integrity: sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q==}
     engines: {node: '>=8'}
@@ -5370,6 +5374,14 @@ packages:
     resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==}
     engines: {node: '>=10'}
 
+  is-unicode-supported@1.3.0:
+    resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==}
+    engines: {node: '>=12'}
+
+  is-unicode-supported@2.1.0:
+    resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==}
+    engines: {node: '>=18'}
+
   is-url@1.2.4:
     resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==}
 
@@ -5785,6 +5797,10 @@ packages:
     resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==}
     engines: {node: '>=10'}
 
+  log-symbols@6.0.0:
+    resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==}
+    engines: {node: '>=18'}
+
   log-update@4.0.0:
     resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==}
     engines: {node: '>=10'}
@@ -6352,6 +6368,10 @@ packages:
     resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==}
     engines: {node: '>=10'}
 
+  ora@8.2.0:
+    resolution: {integrity: sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==}
+    engines: {node: '>=18'}
+
   ordered-binary@1.5.3:
     resolution: {integrity: sha512-oGFr3T+pYdTGJ+YFEILMpS3es+GiIbs9h/XQrclBXUtd44ey7XwfsMzM31f64I1SQOawDoDr/D823kNCADI8TA==}
 
@@ -7311,6 +7331,10 @@ packages:
   std-env@3.9.0:
     resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==}
 
+  stdin-discarder@0.2.2:
+    resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==}
+    engines: {node: '>=18'}
+
   steno@0.4.4:
     resolution: {integrity: sha512-EEHMVYHNXFHfGtgjNITnka0aHhiAlo93F7z2/Pwd+g0teG9CnM3JIINM7hVVB5/rhw9voufD7Wukwgtw2uqh6w==}
 
@@ -13329,6 +13353,8 @@ snapshots:
 
   is-interactive@1.0.0: {}
 
+  is-interactive@2.0.0: {}
+
   is-ip@3.1.0:
     dependencies:
       ip-regex: 4.3.0
@@ -13414,6 +13440,10 @@ snapshots:
 
   is-unicode-supported@0.1.0: {}
 
+  is-unicode-supported@1.3.0: {}
+
+  is-unicode-supported@2.1.0: {}
+
   is-url@1.2.4: {}
 
   is-weakmap@2.0.2: {}
@@ -13933,6 +13963,11 @@ snapshots:
       chalk: 4.1.2
       is-unicode-supported: 0.1.0
 
+  log-symbols@6.0.0:
+    dependencies:
+      chalk: 5.4.1
+      is-unicode-supported: 1.3.0
+
   log-update@4.0.0:
     dependencies:
       ansi-escapes: 4.3.2
@@ -14448,6 +14483,18 @@ snapshots:
       strip-ansi: 6.0.1
       wcwidth: 1.0.1
 
+  ora@8.2.0:
+    dependencies:
+      chalk: 5.4.1
+      cli-cursor: 5.0.0
+      cli-spinners: 2.9.2
+      is-interactive: 2.0.0
+      is-unicode-supported: 2.1.0
+      log-symbols: 6.0.0
+      stdin-discarder: 0.2.2
+      string-width: 7.2.0
+      strip-ansi: 7.1.0
+
   ordered-binary@1.5.3:
     optional: true
 
@@ -15651,6 +15698,8 @@ snapshots:
 
   std-env@3.9.0: {}
 
+  stdin-discarder@0.2.2: {}
+
   steno@0.4.4:
     dependencies:
       graceful-fs: 4.2.11

From b776d326b1a832f32b7a4f8cb856f8ff32c58f78 Mon Sep 17 00:00:00 2001
From: Alan Agius <17563226+alan-agius4@users.noreply.github.com>
Date: Wed, 21 May 2025 13:21:11 +0000
Subject: [PATCH 077/138] refactor(@angular/build): check that AOT is enabled
 in HMR logic

This commit refactors the HMR logic within `@angular/build` to explicitly check for AOT.

(cherry picked from commit 8bfdd3daa3053e9786c950f9048c223352ecbc40)
---
 .../angular/build/src/builders/dev-server/vite-server.ts | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

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

From 4c0d873b069b2671d7a0f98bcdc9b86ef48a8cd6 Mon Sep 17 00:00:00 2001
From: Charles Lyding <19598772+clydin@users.noreply.github.com>
Date: Wed, 21 May 2025 14:41:51 -0400
Subject: [PATCH 078/138] fix(@angular/build): include full metadata for AOT
 unit-testing

Include class metadata and JIT information in code built for development and/or test usage.
All non-optimized builds will now contain this metadata (`optimization.scripts` is false).
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).
To support all these TestBed usage scenarios both the underlying `setClassMetadata`
and `setNgModuleScope` class augmentation functions are now emitted when
test metadata inclusion is enabled.

(cherry picked from commit 578525e64ca4797b0a6dd3660d3f751aabb3c1bb)
---
 .../build/src/tools/esbuild/angular/compiler-plugin.ts | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

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,
     };
   };
 }

From fdbafa5573fe3e1b6169f655a8d94df8f76ceeaf Mon Sep 17 00:00:00 2001
From: Charles Lyding <19598772+clydin@users.noreply.github.com>
Date: Wed, 21 May 2025 18:38:03 -0400
Subject: [PATCH 079/138] refactor(@angular/cli): adjust type usage for
 eventual ESM building

Several adjustments to type usage with the goal of support for the future
 building of the package as ESM. These changes were mainly around the
 `yargs` package where the ESM types differ from the CommonJS types.

(cherry picked from commit 233495f4d00dbb616a642a692bf331c7ae88753e)
---
 packages/angular/cli/src/command-builder/command-module.ts  | 6 ++++--
 packages/angular/cli/src/command-builder/command-runner.ts  | 2 +-
 .../cli/src/command-builder/utilities/json-schema.ts        | 4 ++--
 packages/angular/cli/src/{typings.ts => typings.d.ts}       | 0
 4 files changed, 7 insertions(+), 5 deletions(-)
 rename packages/angular/cli/src/{typings.ts => typings.d.ts} (100%)

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/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

From 5ff6188c4330b009201a64a23d0090bfcec0612f Mon Sep 17 00:00:00 2001
From: Charles Lyding <19598772+clydin@users.noreply.github.com>
Date: Thu, 22 May 2025 12:41:34 -0400
Subject: [PATCH 080/138] perf(@angular/build): directly check code for Angular
 partial linking
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

To more completely avoid having to load any Angular compiler linking code
when analyzing for code transformations during a build, the declaration
function checks are now performed directly. This is in contrast to the
previous behavior that required importing the linker code to use a helper
function included in the `@angular/compiler-cli` package. Avoiding the
need to load and parse a potentially large amount of code to perform the
check can improve performance for the cases where no linking is required.
To ensure the check stays up to date and while the list of function names
rarely changes, the linker must always use the existing function name
prefix (`ɵɵngDeclare`) for any declaration functions.

(cherry picked from commit dfeb37f4ba167932b2e5669eefc06823e538891c)
---
 .../esbuild/javascript-transformer-worker.ts  | 28 ++++++++-----------
 1 file changed, 12 insertions(+), 16 deletions(-)

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<unknown> {
@@ -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<boolean> {
     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<typeof import('@angular/compiler-cli/linker')>(
-      '@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<JavaScriptTransformRequest, 'filename' | 'data'>) {

From 5df256f24dd5f4a95c10f4215f20eafb02104e71 Mon Sep 17 00:00:00 2001
From: Alan Agius <17563226+alan-agius4@users.noreply.github.com>
Date: Thu, 22 May 2025 08:12:36 +0000
Subject: [PATCH 081/138] refactor(@angular/build): update `ensureWorkerPool`
 to do an early exit

The avoid unnecessary logic to be executed for every call to `transformFile`.

(cherry picked from commit eed60d1300f6f28d011652efb4dbf4e947bb77fa)
---
 .../build/src/tools/esbuild/javascript-transformer.ts       | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

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;
   }

From d1600426b4d2f7538987d0129d3f91739e6e0ee3 Mon Sep 17 00:00:00 2001
From: Angular Robot <angular-robot@google.com>
Date: Thu, 22 May 2025 05:04:36 +0000
Subject: [PATCH 082/138] build: update all non-major dependencies

See associated pull request for more information.

(cherry picked from commit 4bd1d7c50ea7b0191440fd3ea0e4e96d5078de53)
---
 package.json                                  |  2 +-
 packages/angular/build/package.json           |  2 +-
 .../angular_devkit/build_angular/package.json |  2 +-
 pnpm-lock.yaml                                | 24 +++++++++----------
 4 files changed, 15 insertions(+), 15 deletions(-)

diff --git a/package.json b/package.json
index 1638477caa7a..95b81f3d843b 100644
--- a/package.json
+++ b/package.json
@@ -98,7 +98,7 @@
     "@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.4",
     "esbuild-wasm": "0.25.4",
diff --git a/packages/angular/build/package.json b/packages/angular/build/package.json
index 4072db48aca0..d55add53a201 100644
--- a/packages/angular/build/package.json
+++ b/packages/angular/build/package.json
@@ -25,7 +25,7 @@
     "@babel/helper-split-export-declaration": "7.24.7",
     "@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.4",
     "https-proxy-agent": "7.0.6",
diff --git a/packages/angular_devkit/build_angular/package.json b/packages/angular_devkit/build_angular/package.json
index 84be3d6693a9..85029ea2a808 100644
--- a/packages/angular_devkit/build_angular/package.json
+++ b/packages/angular_devkit/build_angular/package.json
@@ -67,7 +67,7 @@
   },
   "devDependencies": {
     "@angular/ssr": "workspace:*",
-    "@web/test-runner": "0.20.1",
+    "@web/test-runner": "0.20.2",
     "browser-sync": "3.0.4",
     "ng-packagr": "20.0.0-rc.0",
     "undici": "7.9.0"
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 77dd5682da5a..5afa55e1f3a5 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -171,8 +171,8 @@ importers:
         specifier: 4.1.3
         version: 4.1.3
       beasties:
-        specifier: 0.3.3
-        version: 0.3.3
+        specifier: 0.3.4
+        version: 0.3.4
       buffer:
         specifier: 6.0.3
         version: 6.0.3
@@ -368,8 +368,8 @@ importers:
         specifier: 2.0.0
         version: 2.0.0(vite@6.3.5(@types/node@20.17.46)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.1)(yaml@2.7.1))
       beasties:
-        specifier: 0.3.3
-        version: 0.3.3
+        specifier: 0.3.4
+        version: 0.3.4
       browserslist:
         specifier: ^4.23.0
         version: 4.24.5
@@ -755,8 +755,8 @@ importers:
         specifier: workspace:*
         version: link:../../angular/ssr
       '@web/test-runner':
-        specifier: 0.20.1
-        version: 0.20.1
+        specifier: 0.20.2
+        version: 0.20.2
       browser-sync:
         specifier: 3.0.4
         version: 3.0.4
@@ -3171,8 +3171,8 @@ packages:
     resolution: {integrity: sha512-ZL9F6FXd0DBQvo/h/+mSfzFTSRVxzV9st/AHhpgABtUtV/AIpVE9to6+xdkpu6827kwjezdpuadPfg+PlrBWqQ==}
     engines: {node: '>=18.0.0'}
 
-  '@web/test-runner@0.20.1':
-    resolution: {integrity: sha512-MTN8D1WCeCdkUWJIeG9yauUbRkk9g0zGFnBbI5smtPE91NpXFMfRd8nShIvxQnHx9fNTmK+OCYKnOSlq5DLLVA==}
+  '@web/test-runner@0.20.2':
+    resolution: {integrity: sha512-zfEGYEDnS0EI8qgoWFjmtkIXhqP15W40NW3dCaKtbxj5eU0a7E53f3GV/tZGD0GlZKF8d4Fyw+AFrwOJU9Z4GA==}
     engines: {node: '>=18.0.0'}
     hasBin: true
 
@@ -3561,8 +3561,8 @@ packages:
   bcryptjs@2.4.3:
     resolution: {integrity: sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==}
 
-  beasties@0.3.3:
-    resolution: {integrity: sha512-Mba3V4hTPrM7P2CSidueg71JZ0G+DyK7maBqp4/uax/PQznwdFti9cOW6Z3lTxBRH84kRICN0TyQ0MSSmufaAw==}
+  beasties@0.3.4:
+    resolution: {integrity: sha512-NmzN1zN1cvGccXFyZ73335+ASXwBlVWcUPssiUDIlFdfyatHPRRufjCd5w8oPaQPvVnf9ELklaCGb1gi9FBwIw==}
     engines: {node: '>=14.0.0'}
 
   before-after-hook@3.0.2:
@@ -10893,7 +10893,7 @@ snapshots:
       - supports-color
       - utf-8-validate
 
-  '@web/test-runner@0.20.1':
+  '@web/test-runner@0.20.2':
     dependencies:
       '@web/browser-logs': 0.4.1
       '@web/config-loader': 0.3.3
@@ -11307,7 +11307,7 @@ snapshots:
 
   bcryptjs@2.4.3: {}
 
-  beasties@0.3.3:
+  beasties@0.3.4:
     dependencies:
       css-select: 5.1.0
       css-what: 6.1.0

From a9928cfa68c808e1da430f959544a6ae7e86adc1 Mon Sep 17 00:00:00 2001
From: Angular Robot <angular-robot@google.com>
Date: Thu, 22 May 2025 05:04:58 +0000
Subject: [PATCH 083/138] build: update dependency node to v22.16.0

See associated pull request for more information.

(cherry picked from commit 5dbf33cd1ae2f2e8d7bfd0a55aeb35cfc657a977)
---
 .nvmrc | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.nvmrc b/.nvmrc
index 8320a6d2994a..5b540673a828 100644
--- a/.nvmrc
+++ b/.nvmrc
@@ -1 +1 @@
-22.15.1
+22.16.0

From 25c26ff8876fcf72eca57ccf4eb3ec0ba457a84d Mon Sep 17 00:00:00 2001
From: Angular Robot <angular-robot@google.com>
Date: Thu, 22 May 2025 08:39:24 +0000
Subject: [PATCH 084/138] build: update rules_angular digest to 652e5b0

See associated pull request for more information.

(cherry picked from commit 5f7ac5567c85ae9ce54a5f5b39d0152d1577677a)
---
 WORKSPACE | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/WORKSPACE b/WORKSPACE
index de1eb4bfe2fe..43e3d5fc851c 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -273,7 +273,7 @@ esbuild_register_toolchains(
 
 git_repository(
     name = "rules_angular",
-    commit = "5b9b1fc545736b8b602a216f89134c1f20d3009c",
+    commit = "652e5b0ef9be65ca738e11d5d01424b64344b466",
     remote = "https://github.com/devversion/rules_angular.git",
 )
 

From ec94eb902e2f88a1eeeb20c098aab68483470720 Mon Sep 17 00:00:00 2001
From: Alan Agius <17563226+alan-agius4@users.noreply.github.com>
Date: Fri, 23 May 2025 07:22:34 +0000
Subject: [PATCH 085/138] build: correctly replace `BUILD_SCM_HASH-PLACEHOLDER`
 with `BUILD_SCM_ABBREV_HASH`

Correctly replace `BUILD_SCM_HASH-PLACEHOLDER` with `BUILD_SCM_ABBREV_HASH` by enclosing it in `{}` for proper interpolation.

Example of the issue: https://github.com/angular/angular-build-builds/blob/cac2e58892c99256d3a1f0abeb274f116edd5a26/package.json#L26

(cherry picked from commit c4efd7421d1d7d0bc7d3ec483252610cdd059f73)
---
 tools/substitutions.bzl | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tools/substitutions.bzl b/tools/substitutions.bzl
index 098b511b1d6e..b2e3877138cd 100644
--- a/tools/substitutions.bzl
+++ b/tools/substitutions.bzl
@@ -5,7 +5,7 @@ _stamp_substitutions = {
     "0.0.0-PLACEHOLDER": "{{STABLE_PROJECT_VERSION}}",
     "0.0.0-EXPERIMENTAL-PLACEHOLDER": "{{STABLE_PROJECT_EXPERIMENTAL_VERSION}}",
     # ---
-    "BUILD_SCM_HASH-PLACEHOLDER": "{BUILD_SCM_ABBREV_HASH}",
+    "BUILD_SCM_HASH-PLACEHOLDER": "{{BUILD_SCM_ABBREV_HASH}}",
     "0.0.0-ENGINES-NODE": RELEASE_ENGINES_NODE,
     "0.0.0-ENGINES-NPM": RELEASE_ENGINES_NPM,
     "0.0.0-ENGINES-YARN": RELEASE_ENGINES_YARN,

From a2d77d3a69bf529145a7605a6ba305179ba06107 Mon Sep 17 00:00:00 2001
From: Alan Agius <17563226+alan-agius4@users.noreply.github.com>
Date: Fri, 23 May 2025 09:45:38 +0000
Subject: [PATCH 086/138] refactor(@angular-devkit/architect): remove redundant
 internal job schema validation

Removed JSON schema-based validation for internal job arguments, inputs, and outputs in architect builder jobs. This validation applied to internal architect values.

Builder option validation remains unaffected. Eliminating this validation reduces overhead from costly RxJS operations, improving performance, especially for builders producing large outputs that were previously delayed by this processing.

(cherry picked from commit bf2f5a88e6f4a821b67b8d1cad4c3050479c362f)
---
 .../angular_devkit/architect/src/architect.ts | 22 +++--------------
 .../architect/src/jobs/simple-scheduler.ts    | 24 ++++++++++++++++---
 2 files changed, 24 insertions(+), 22 deletions(-)

diff --git a/packages/angular_devkit/architect/src/architect.ts b/packages/angular_devkit/architect/src/architect.ts
index aecbeb06ea05..6dbf97cb5179 100644
--- a/packages/angular_devkit/architect/src/architect.ts
+++ b/packages/angular_devkit/architect/src/architect.ts
@@ -48,9 +48,6 @@ import {
 import { mergeOptions } from './options';
 import { scheduleByName, scheduleByTarget } from './schedule-by-name';
 
-const inputSchema = require('./input-schema.json');
-const outputSchema = require('./output-schema.json');
-
 function _createJobHandlerFromBuilderInfo(
   info: BuilderInfo,
   target: Target | undefined,
@@ -60,9 +57,9 @@ function _createJobHandlerFromBuilderInfo(
 ): Observable<BuilderJobHandler> {
   const jobDescription: BuilderDescription = {
     name: target ? `{${targetStringFromTarget(target)}}` : info.builderName,
-    argument: { type: 'object' },
-    input: inputSchema,
-    output: outputSchema,
+    argument: true,
+    input: true,
+    output: true,
     info,
   };
 
@@ -279,8 +276,6 @@ function _getTargetOptionsFactory(host: ArchitectHost) {
     },
     {
       name: '..getTargetOptions',
-      output: { type: 'object' },
-      argument: inputSchema.properties.target,
     },
   );
 }
@@ -298,10 +293,6 @@ function _getProjectMetadataFactory(host: ArchitectHost) {
     },
     {
       name: '..getProjectMetadata',
-      output: { type: 'object' },
-      argument: {
-        oneOf: [{ type: 'string' }, inputSchema.properties.target],
-      },
     },
   );
 }
@@ -318,8 +309,6 @@ function _getBuilderNameForTargetFactory(host: ArchitectHost) {
     },
     {
       name: '..getBuilderNameForTarget',
-      output: { type: 'string' },
-      argument: inputSchema.properties.target,
     },
   );
 }
@@ -344,11 +333,6 @@ function _validateOptionsFactory(host: ArchitectHost, registry: json.schema.Sche
     },
     {
       name: '..validateOptions',
-      output: { type: 'object' },
-      argument: {
-        type: 'array',
-        items: [{ type: 'string' }, { type: 'object' }],
-      },
     },
   );
 }
diff --git a/packages/angular_devkit/architect/src/jobs/simple-scheduler.ts b/packages/angular_devkit/architect/src/jobs/simple-scheduler.ts
index 2c82b0d90052..8dacbbe687f8 100644
--- a/packages/angular_devkit/architect/src/jobs/simple-scheduler.ts
+++ b/packages/angular_devkit/architect/src/jobs/simple-scheduler.ts
@@ -155,11 +155,22 @@ export class SimpleScheduler<
           channels: handler.jobDescription.channels || {},
         };
 
+        const noopValidator = noopSchemaValidator();
+
         const handlerWithExtra = Object.assign(handler.bind(undefined), {
           jobDescription: description,
-          argumentV: this._schemaRegistry.compile(description.argument),
-          inputV: this._schemaRegistry.compile(description.input),
-          outputV: this._schemaRegistry.compile(description.output),
+          argumentV:
+            description.argument === true
+              ? noopValidator
+              : this._schemaRegistry.compile(description.argument),
+          inputV:
+            description.input === true
+              ? noopValidator
+              : this._schemaRegistry.compile(description.input),
+          outputV:
+            description.output === true
+              ? noopValidator
+              : this._schemaRegistry.compile(description.output),
         }) as JobHandlerWithExtra;
         this._internalJobDescriptionMap.set(name, handlerWithExtra);
 
@@ -546,3 +557,10 @@ export class SimpleScheduler<
     return this._createJob(name, argument, handler, inboundBus, outboundBus);
   }
 }
+
+async function noopSchemaValidator(): Promise<schema.SchemaValidator> {
+  return async (data: JsonValue) => ({
+    data,
+    success: true,
+  });
+}

From 646fbe14758cabdcf8fcaa802b545c00999578be Mon Sep 17 00:00:00 2001
From: Charles Lyding <19598772+clydin@users.noreply.github.com>
Date: Fri, 23 May 2025 10:31:48 -0400
Subject: [PATCH 087/138] refactor(@angular/cli): allow opt-in Node.js compile
 cache for Bazel

When using the Angular CLI within Bazel, the Node.js compile cache can
be enabled by setting the `NODE_COMPILE_CACHE` environment variable to
a filesystem path.
This allows opt-in usage based on the Bazel execution environment.

Compile cache documentation:
https://nodejs.org/api/module.html#module-compile-cache

(cherry picked from commit 0574076e28a939e5b0d808b8b9ef7ccc1c7240bf)
---
 packages/angular/cli/bin/bootstrap.js | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

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');
 

From fbdbe61682cc9be26f511542bb4df408ed87b592 Mon Sep 17 00:00:00 2001
From: Alan Agius <17563226+alan-agius4@users.noreply.github.com>
Date: Mon, 26 May 2025 09:44:24 +0000
Subject: [PATCH 088/138] build: preserve `peerDependenciesMeta` in snapshots

Addresses an issue where publishing snapshot builds would replace the value with the package SHAs in `peerDependenciesMeta`.

See: https://github.com/angular/angular-build-builds/blob/d4d0f1ca0932bd4fe2df4cc2da10d132789dcd8f/package.json#L89
(cherry picked from commit 697d7e64cc06b9acf586c568d01d40948018a513)
---
 tools/snapshot_repo_filter.bzl | 23 ++++++++++++++++-------
 1 file changed, 16 insertions(+), 7 deletions(-)

diff --git a/tools/snapshot_repo_filter.bzl b/tools/snapshot_repo_filter.bzl
index 00e26b44dd9d..a648e8e300a7 100644
--- a/tools/snapshot_repo_filter.bzl
+++ b/tools/snapshot_repo_filter.bzl
@@ -6,14 +6,23 @@
 load("//:constants.bzl", "SNAPSHOT_REPOS")
 
 def _generate_snapshot_repo_filter():
-    filter = ""
-    for (i, pkg_name) in enumerate(SNAPSHOT_REPOS.keys()):
-        filter += "{sep}(..|objects|select(has(\"{pkg_name}\")))[\"{pkg_name}\"] |= \"github:{snapshot_repo}#BUILD_SCM_HASH-PLACEHOLDER\"\n".format(
-            sep = "| " if i > 0 else "",
-            pkg_name = pkg_name,
-            snapshot_repo = SNAPSHOT_REPOS[pkg_name],
+    individual_pkg_filters = []
+    for pkg_name, snapshot_repo in SNAPSHOT_REPOS.items():
+        individual_pkg_filters.append(
+            """
+            . as $root
+                | [paths(..)]
+                | [(.[] | select(
+                    contains(["{pkg_name}"]) and
+                    contains(["peerDependenciesMeta"]) != true))] as $paths
+                | $paths | reduce $paths[] as $path ($root; setpath($path; "github:{snapshot_repo}#BUILD_SCM_HASH-PLACEHOLDER")) | .
+            """.format(
+                pkg_name = pkg_name,
+                snapshot_repo = snapshot_repo,
+            ),
         )
-    return filter
+
+    return " | ".join(individual_pkg_filters)
 
 # jq filter that replaces package.json dependencies with snapshot repos
 SNAPSHOT_REPO_JQ_FILTER = _generate_snapshot_repo_filter()

From 817d8f114adac34040bc389b9369aee85eeb76cd Mon Sep 17 00:00:00 2001
From: Charles Lyding <19598772+clydin@users.noreply.github.com>
Date: Tue, 27 May 2025 10:24:28 -0400
Subject: [PATCH 089/138] build: update esbuild to v0.25.5

---
 package.json                                  |   4 +-
 packages/angular/build/package.json           |   2 +-
 .../angular_devkit/build_angular/package.json |   4 +-
 pnpm-lock.yaml                                | 328 +++++++++---------
 4 files changed, 169 insertions(+), 169 deletions(-)

diff --git a/package.json b/package.json
index 95b81f3d843b..aa6b143dec15 100644
--- a/package.json
+++ b/package.json
@@ -100,8 +100,8 @@
     "ansi-colors": "4.1.3",
     "beasties": "0.3.4",
     "buffer": "6.0.3",
-    "esbuild": "0.25.4",
-    "esbuild-wasm": "0.25.4",
+    "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",
diff --git a/packages/angular/build/package.json b/packages/angular/build/package.json
index d55add53a201..7181067e4334 100644
--- a/packages/angular/build/package.json
+++ b/packages/angular/build/package.json
@@ -27,7 +27,7 @@
     "@vitejs/plugin-basic-ssl": "2.0.0",
     "beasties": "0.3.4",
     "browserslist": "^4.23.0",
-    "esbuild": "0.25.4",
+    "esbuild": "0.25.5",
     "https-proxy-agent": "7.0.6",
     "istanbul-lib-instrument": "6.0.3",
     "jsonc-parser": "3.3.1",
diff --git a/packages/angular_devkit/build_angular/package.json b/packages/angular_devkit/build_angular/package.json
index 85029ea2a808..02a895347009 100644
--- a/packages/angular_devkit/build_angular/package.json
+++ b/packages/angular_devkit/build_angular/package.json
@@ -29,7 +29,7 @@
     "browserslist": "^4.21.5",
     "copy-webpack-plugin": "13.0.0",
     "css-loader": "7.1.2",
-    "esbuild-wasm": "0.25.4",
+    "esbuild-wasm": "0.25.5",
     "fast-glob": "3.3.3",
     "http-proxy-middleware": "3.0.5",
     "istanbul-lib-instrument": "6.0.3",
@@ -63,7 +63,7 @@
     "webpack-subresource-integrity": "5.1.0"
   },
   "optionalDependencies": {
-    "esbuild": "0.25.4"
+    "esbuild": "0.25.5"
   },
   "devDependencies": {
     "@angular/ssr": "workspace:*",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 5afa55e1f3a5..c9fb8dad3f81 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -177,11 +177,11 @@ importers:
         specifier: 6.0.3
         version: 6.0.3
       esbuild:
-        specifier: 0.25.4
-        version: 0.25.4
+        specifier: 0.25.5
+        version: 0.25.5
       esbuild-wasm:
-        specifier: 0.25.4
-        version: 0.25.4
+        specifier: 0.25.5
+        version: 0.25.5
       eslint:
         specifier: 9.26.0
         version: 9.26.0(jiti@1.21.7)
@@ -374,8 +374,8 @@ importers:
         specifier: ^4.23.0
         version: 4.24.5
       esbuild:
-        specifier: 0.25.4
-        version: 0.25.4
+        specifier: 0.25.5
+        version: 0.25.5
       https-proxy-agent:
         specifier: 7.0.6
         version: 7.0.6(supports-color@10.0.0)
@@ -640,19 +640,19 @@ importers:
         version: 10.4.21(postcss@8.5.3)
       babel-loader:
         specifier: 10.0.0
-        version: 10.0.0(@babel/core@7.27.1)(webpack@5.99.8(esbuild@0.25.4))
+        version: 10.0.0(@babel/core@7.27.1)(webpack@5.99.8(esbuild@0.25.5))
       browserslist:
         specifier: ^4.21.5
         version: 4.24.5
       copy-webpack-plugin:
         specifier: 13.0.0
-        version: 13.0.0(webpack@5.99.8(esbuild@0.25.4))
+        version: 13.0.0(webpack@5.99.8(esbuild@0.25.5))
       css-loader:
         specifier: 7.1.2
-        version: 7.1.2(webpack@5.99.8(esbuild@0.25.4))
+        version: 7.1.2(webpack@5.99.8(esbuild@0.25.5))
       esbuild-wasm:
-        specifier: 0.25.4
-        version: 0.25.4
+        specifier: 0.25.5
+        version: 0.25.5
       fast-glob:
         specifier: 3.3.3
         version: 3.3.3
@@ -673,16 +673,16 @@ importers:
         version: 4.3.0
       less-loader:
         specifier: 12.3.0
-        version: 12.3.0(less@4.3.0)(webpack@5.99.8(esbuild@0.25.4))
+        version: 12.3.0(less@4.3.0)(webpack@5.99.8(esbuild@0.25.5))
       license-webpack-plugin:
         specifier: 4.0.2
-        version: 4.0.2(webpack@5.99.8(esbuild@0.25.4))
+        version: 4.0.2(webpack@5.99.8(esbuild@0.25.5))
       loader-utils:
         specifier: 3.3.1
         version: 3.3.1
       mini-css-extract-plugin:
         specifier: 2.9.2
-        version: 2.9.2(webpack@5.99.8(esbuild@0.25.4))
+        version: 2.9.2(webpack@5.99.8(esbuild@0.25.5))
       open:
         specifier: 10.1.2
         version: 10.1.2
@@ -700,7 +700,7 @@ importers:
         version: 8.5.3
       postcss-loader:
         specifier: 8.1.1
-        version: 8.1.1(postcss@8.5.3)(typescript@5.8.3)(webpack@5.99.8(esbuild@0.25.4))
+        version: 8.1.1(postcss@8.5.3)(typescript@5.8.3)(webpack@5.99.8(esbuild@0.25.5))
       resolve-url-loader:
         specifier: 5.0.0
         version: 5.0.0
@@ -712,13 +712,13 @@ importers:
         version: 1.88.0
       sass-loader:
         specifier: 16.0.5
-        version: 16.0.5(sass@1.88.0)(webpack@5.99.8(esbuild@0.25.4))
+        version: 16.0.5(sass@1.88.0)(webpack@5.99.8(esbuild@0.25.5))
       semver:
         specifier: 7.7.2
         version: 7.7.2
       source-map-loader:
         specifier: 5.0.0
-        version: 5.0.0(webpack@5.99.8(esbuild@0.25.4))
+        version: 5.0.0(webpack@5.99.8(esbuild@0.25.5))
       source-map-support:
         specifier: 0.5.21
         version: 0.5.21
@@ -733,23 +733,23 @@ importers:
         version: 2.8.1
       webpack:
         specifier: 5.99.8
-        version: 5.99.8(esbuild@0.25.4)
+        version: 5.99.8(esbuild@0.25.5)
       webpack-dev-middleware:
         specifier: 7.4.2
-        version: 7.4.2(webpack@5.99.8(esbuild@0.25.4))
+        version: 7.4.2(webpack@5.99.8(esbuild@0.25.5))
       webpack-dev-server:
         specifier: 5.2.1
-        version: 5.2.1(webpack@5.99.8(esbuild@0.25.4))
+        version: 5.2.1(webpack@5.99.8(esbuild@0.25.5))
       webpack-merge:
         specifier: 6.0.1
         version: 6.0.1
       webpack-subresource-integrity:
         specifier: 5.1.0
-        version: 5.1.0(webpack@5.99.8(esbuild@0.25.4))
+        version: 5.1.0(webpack@5.99.8(esbuild@0.25.5))
     optionalDependencies:
       esbuild:
-        specifier: 0.25.4
-        version: 0.25.4
+        specifier: 0.25.5
+        version: 0.25.5
     devDependencies:
       '@angular/ssr':
         specifier: workspace:*
@@ -784,10 +784,10 @@ importers:
         version: link:../../ngtools/webpack
       webpack:
         specifier: 5.99.8
-        version: 5.99.8(esbuild@0.25.4)
+        version: 5.99.8(esbuild@0.25.5)
       webpack-dev-server:
         specifier: 5.2.1
-        version: 5.2.1(webpack@5.99.8(esbuild@0.25.4))
+        version: 5.2.1(webpack@5.99.8(esbuild@0.25.5))
 
   packages/angular_devkit/core:
     dependencies:
@@ -866,7 +866,7 @@ importers:
         version: 5.8.3
       webpack:
         specifier: 5.99.8
-        version: 5.99.8(esbuild@0.25.4)
+        version: 5.99.8(esbuild@0.25.5)
 
   packages/schematics/angular:
     dependencies:
@@ -1572,152 +1572,152 @@ packages:
     resolution: {integrity: sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==}
     engines: {node: '>=14.17.0'}
 
-  '@esbuild/aix-ppc64@0.25.4':
-    resolution: {integrity: sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==}
+  '@esbuild/aix-ppc64@0.25.5':
+    resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==}
     engines: {node: '>=18'}
     cpu: [ppc64]
     os: [aix]
 
-  '@esbuild/android-arm64@0.25.4':
-    resolution: {integrity: sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==}
+  '@esbuild/android-arm64@0.25.5':
+    resolution: {integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==}
     engines: {node: '>=18'}
     cpu: [arm64]
     os: [android]
 
-  '@esbuild/android-arm@0.25.4':
-    resolution: {integrity: sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==}
+  '@esbuild/android-arm@0.25.5':
+    resolution: {integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==}
     engines: {node: '>=18'}
     cpu: [arm]
     os: [android]
 
-  '@esbuild/android-x64@0.25.4':
-    resolution: {integrity: sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==}
+  '@esbuild/android-x64@0.25.5':
+    resolution: {integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==}
     engines: {node: '>=18'}
     cpu: [x64]
     os: [android]
 
-  '@esbuild/darwin-arm64@0.25.4':
-    resolution: {integrity: sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==}
+  '@esbuild/darwin-arm64@0.25.5':
+    resolution: {integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==}
     engines: {node: '>=18'}
     cpu: [arm64]
     os: [darwin]
 
-  '@esbuild/darwin-x64@0.25.4':
-    resolution: {integrity: sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==}
+  '@esbuild/darwin-x64@0.25.5':
+    resolution: {integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==}
     engines: {node: '>=18'}
     cpu: [x64]
     os: [darwin]
 
-  '@esbuild/freebsd-arm64@0.25.4':
-    resolution: {integrity: sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==}
+  '@esbuild/freebsd-arm64@0.25.5':
+    resolution: {integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==}
     engines: {node: '>=18'}
     cpu: [arm64]
     os: [freebsd]
 
-  '@esbuild/freebsd-x64@0.25.4':
-    resolution: {integrity: sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==}
+  '@esbuild/freebsd-x64@0.25.5':
+    resolution: {integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==}
     engines: {node: '>=18'}
     cpu: [x64]
     os: [freebsd]
 
-  '@esbuild/linux-arm64@0.25.4':
-    resolution: {integrity: sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==}
+  '@esbuild/linux-arm64@0.25.5':
+    resolution: {integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==}
     engines: {node: '>=18'}
     cpu: [arm64]
     os: [linux]
 
-  '@esbuild/linux-arm@0.25.4':
-    resolution: {integrity: sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==}
+  '@esbuild/linux-arm@0.25.5':
+    resolution: {integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==}
     engines: {node: '>=18'}
     cpu: [arm]
     os: [linux]
 
-  '@esbuild/linux-ia32@0.25.4':
-    resolution: {integrity: sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==}
+  '@esbuild/linux-ia32@0.25.5':
+    resolution: {integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==}
     engines: {node: '>=18'}
     cpu: [ia32]
     os: [linux]
 
-  '@esbuild/linux-loong64@0.25.4':
-    resolution: {integrity: sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==}
+  '@esbuild/linux-loong64@0.25.5':
+    resolution: {integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==}
     engines: {node: '>=18'}
     cpu: [loong64]
     os: [linux]
 
-  '@esbuild/linux-mips64el@0.25.4':
-    resolution: {integrity: sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==}
+  '@esbuild/linux-mips64el@0.25.5':
+    resolution: {integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==}
     engines: {node: '>=18'}
     cpu: [mips64el]
     os: [linux]
 
-  '@esbuild/linux-ppc64@0.25.4':
-    resolution: {integrity: sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==}
+  '@esbuild/linux-ppc64@0.25.5':
+    resolution: {integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==}
     engines: {node: '>=18'}
     cpu: [ppc64]
     os: [linux]
 
-  '@esbuild/linux-riscv64@0.25.4':
-    resolution: {integrity: sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==}
+  '@esbuild/linux-riscv64@0.25.5':
+    resolution: {integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==}
     engines: {node: '>=18'}
     cpu: [riscv64]
     os: [linux]
 
-  '@esbuild/linux-s390x@0.25.4':
-    resolution: {integrity: sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==}
+  '@esbuild/linux-s390x@0.25.5':
+    resolution: {integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==}
     engines: {node: '>=18'}
     cpu: [s390x]
     os: [linux]
 
-  '@esbuild/linux-x64@0.25.4':
-    resolution: {integrity: sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==}
+  '@esbuild/linux-x64@0.25.5':
+    resolution: {integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==}
     engines: {node: '>=18'}
     cpu: [x64]
     os: [linux]
 
-  '@esbuild/netbsd-arm64@0.25.4':
-    resolution: {integrity: sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==}
+  '@esbuild/netbsd-arm64@0.25.5':
+    resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==}
     engines: {node: '>=18'}
     cpu: [arm64]
     os: [netbsd]
 
-  '@esbuild/netbsd-x64@0.25.4':
-    resolution: {integrity: sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==}
+  '@esbuild/netbsd-x64@0.25.5':
+    resolution: {integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==}
     engines: {node: '>=18'}
     cpu: [x64]
     os: [netbsd]
 
-  '@esbuild/openbsd-arm64@0.25.4':
-    resolution: {integrity: sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==}
+  '@esbuild/openbsd-arm64@0.25.5':
+    resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==}
     engines: {node: '>=18'}
     cpu: [arm64]
     os: [openbsd]
 
-  '@esbuild/openbsd-x64@0.25.4':
-    resolution: {integrity: sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==}
+  '@esbuild/openbsd-x64@0.25.5':
+    resolution: {integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==}
     engines: {node: '>=18'}
     cpu: [x64]
     os: [openbsd]
 
-  '@esbuild/sunos-x64@0.25.4':
-    resolution: {integrity: sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==}
+  '@esbuild/sunos-x64@0.25.5':
+    resolution: {integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==}
     engines: {node: '>=18'}
     cpu: [x64]
     os: [sunos]
 
-  '@esbuild/win32-arm64@0.25.4':
-    resolution: {integrity: sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==}
+  '@esbuild/win32-arm64@0.25.5':
+    resolution: {integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==}
     engines: {node: '>=18'}
     cpu: [arm64]
     os: [win32]
 
-  '@esbuild/win32-ia32@0.25.4':
-    resolution: {integrity: sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==}
+  '@esbuild/win32-ia32@0.25.5':
+    resolution: {integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==}
     engines: {node: '>=18'}
     cpu: [ia32]
     os: [win32]
 
-  '@esbuild/win32-x64@0.25.4':
-    resolution: {integrity: sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==}
+  '@esbuild/win32-x64@0.25.5':
+    resolution: {integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==}
     engines: {node: '>=18'}
     cpu: [x64]
     os: [win32]
@@ -4391,13 +4391,13 @@ packages:
   es6-promisify@5.0.0:
     resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==}
 
-  esbuild-wasm@0.25.4:
-    resolution: {integrity: sha512-2HlCS6rNvKWaSKhWaG/YIyRsTsL3gUrMP2ToZMBIjw9LM7vVcIs+rz8kE2vExvTJgvM8OKPqNpcHawY/BQc/qQ==}
+  esbuild-wasm@0.25.5:
+    resolution: {integrity: sha512-V/rbdOws2gDcnCAECfPrajhuafI0WY4WumUgc8ZHwOLnvmM0doLQ+dqvVFI2qkVxQsvo6880aC9IjpyDqcwwTw==}
     engines: {node: '>=18'}
     hasBin: true
 
-  esbuild@0.25.4:
-    resolution: {integrity: sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==}
+  esbuild@0.25.5:
+    resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==}
     engines: {node: '>=18'}
     hasBin: true
 
@@ -9124,79 +9124,79 @@ snapshots:
 
   '@discoveryjs/json-ext@0.6.3': {}
 
-  '@esbuild/aix-ppc64@0.25.4':
+  '@esbuild/aix-ppc64@0.25.5':
     optional: true
 
-  '@esbuild/android-arm64@0.25.4':
+  '@esbuild/android-arm64@0.25.5':
     optional: true
 
-  '@esbuild/android-arm@0.25.4':
+  '@esbuild/android-arm@0.25.5':
     optional: true
 
-  '@esbuild/android-x64@0.25.4':
+  '@esbuild/android-x64@0.25.5':
     optional: true
 
-  '@esbuild/darwin-arm64@0.25.4':
+  '@esbuild/darwin-arm64@0.25.5':
     optional: true
 
-  '@esbuild/darwin-x64@0.25.4':
+  '@esbuild/darwin-x64@0.25.5':
     optional: true
 
-  '@esbuild/freebsd-arm64@0.25.4':
+  '@esbuild/freebsd-arm64@0.25.5':
     optional: true
 
-  '@esbuild/freebsd-x64@0.25.4':
+  '@esbuild/freebsd-x64@0.25.5':
     optional: true
 
-  '@esbuild/linux-arm64@0.25.4':
+  '@esbuild/linux-arm64@0.25.5':
     optional: true
 
-  '@esbuild/linux-arm@0.25.4':
+  '@esbuild/linux-arm@0.25.5':
     optional: true
 
-  '@esbuild/linux-ia32@0.25.4':
+  '@esbuild/linux-ia32@0.25.5':
     optional: true
 
-  '@esbuild/linux-loong64@0.25.4':
+  '@esbuild/linux-loong64@0.25.5':
     optional: true
 
-  '@esbuild/linux-mips64el@0.25.4':
+  '@esbuild/linux-mips64el@0.25.5':
     optional: true
 
-  '@esbuild/linux-ppc64@0.25.4':
+  '@esbuild/linux-ppc64@0.25.5':
     optional: true
 
-  '@esbuild/linux-riscv64@0.25.4':
+  '@esbuild/linux-riscv64@0.25.5':
     optional: true
 
-  '@esbuild/linux-s390x@0.25.4':
+  '@esbuild/linux-s390x@0.25.5':
     optional: true
 
-  '@esbuild/linux-x64@0.25.4':
+  '@esbuild/linux-x64@0.25.5':
     optional: true
 
-  '@esbuild/netbsd-arm64@0.25.4':
+  '@esbuild/netbsd-arm64@0.25.5':
     optional: true
 
-  '@esbuild/netbsd-x64@0.25.4':
+  '@esbuild/netbsd-x64@0.25.5':
     optional: true
 
-  '@esbuild/openbsd-arm64@0.25.4':
+  '@esbuild/openbsd-arm64@0.25.5':
     optional: true
 
-  '@esbuild/openbsd-x64@0.25.4':
+  '@esbuild/openbsd-x64@0.25.5':
     optional: true
 
-  '@esbuild/sunos-x64@0.25.4':
+  '@esbuild/sunos-x64@0.25.5':
     optional: true
 
-  '@esbuild/win32-arm64@0.25.4':
+  '@esbuild/win32-arm64@0.25.5':
     optional: true
 
-  '@esbuild/win32-ia32@0.25.4':
+  '@esbuild/win32-ia32@0.25.5':
     optional: true
 
-  '@esbuild/win32-x64@0.25.4':
+  '@esbuild/win32-x64@0.25.5':
     optional: true
 
   '@eslint-community/eslint-utils@4.7.0(eslint@9.26.0(jiti@1.21.7))':
@@ -11231,11 +11231,11 @@ snapshots:
 
   b4a@1.6.7: {}
 
-  babel-loader@10.0.0(@babel/core@7.27.1)(webpack@5.99.8(esbuild@0.25.4)):
+  babel-loader@10.0.0(@babel/core@7.27.1)(webpack@5.99.8(esbuild@0.25.5)):
     dependencies:
       '@babel/core': 7.27.1
       find-up: 5.0.0
-      webpack: 5.99.8(esbuild@0.25.4)
+      webpack: 5.99.8(esbuild@0.25.5)
 
   babel-plugin-polyfill-corejs2@0.4.13(@babel/core@7.27.1):
     dependencies:
@@ -11783,14 +11783,14 @@ snapshots:
     dependencies:
       is-what: 3.14.1
 
-  copy-webpack-plugin@13.0.0(webpack@5.99.8(esbuild@0.25.4)):
+  copy-webpack-plugin@13.0.0(webpack@5.99.8(esbuild@0.25.5)):
     dependencies:
       glob-parent: 6.0.2
       normalize-path: 3.0.0
       schema-utils: 4.3.2
       serialize-javascript: 6.0.2
       tinyglobby: 0.2.13
-      webpack: 5.99.8(esbuild@0.25.4)
+      webpack: 5.99.8(esbuild@0.25.5)
 
   core-js-compat@3.42.0:
     dependencies:
@@ -11836,7 +11836,7 @@ snapshots:
       shebang-command: 2.0.0
       which: 2.0.2
 
-  css-loader@7.1.2(webpack@5.99.8(esbuild@0.25.4)):
+  css-loader@7.1.2(webpack@5.99.8(esbuild@0.25.5)):
     dependencies:
       icss-utils: 5.1.0(postcss@8.5.3)
       postcss: 8.5.3
@@ -11847,7 +11847,7 @@ snapshots:
       postcss-value-parser: 4.2.0
       semver: 7.7.2
     optionalDependencies:
-      webpack: 5.99.8(esbuild@0.25.4)
+      webpack: 5.99.8(esbuild@0.25.5)
 
   css-select@5.1.0:
     dependencies:
@@ -12275,35 +12275,35 @@ snapshots:
     dependencies:
       es6-promise: 4.2.8
 
-  esbuild-wasm@0.25.4: {}
+  esbuild-wasm@0.25.5: {}
 
-  esbuild@0.25.4:
+  esbuild@0.25.5:
     optionalDependencies:
-      '@esbuild/aix-ppc64': 0.25.4
-      '@esbuild/android-arm': 0.25.4
-      '@esbuild/android-arm64': 0.25.4
-      '@esbuild/android-x64': 0.25.4
-      '@esbuild/darwin-arm64': 0.25.4
-      '@esbuild/darwin-x64': 0.25.4
-      '@esbuild/freebsd-arm64': 0.25.4
-      '@esbuild/freebsd-x64': 0.25.4
-      '@esbuild/linux-arm': 0.25.4
-      '@esbuild/linux-arm64': 0.25.4
-      '@esbuild/linux-ia32': 0.25.4
-      '@esbuild/linux-loong64': 0.25.4
-      '@esbuild/linux-mips64el': 0.25.4
-      '@esbuild/linux-ppc64': 0.25.4
-      '@esbuild/linux-riscv64': 0.25.4
-      '@esbuild/linux-s390x': 0.25.4
-      '@esbuild/linux-x64': 0.25.4
-      '@esbuild/netbsd-arm64': 0.25.4
-      '@esbuild/netbsd-x64': 0.25.4
-      '@esbuild/openbsd-arm64': 0.25.4
-      '@esbuild/openbsd-x64': 0.25.4
-      '@esbuild/sunos-x64': 0.25.4
-      '@esbuild/win32-arm64': 0.25.4
-      '@esbuild/win32-ia32': 0.25.4
-      '@esbuild/win32-x64': 0.25.4
+      '@esbuild/aix-ppc64': 0.25.5
+      '@esbuild/android-arm': 0.25.5
+      '@esbuild/android-arm64': 0.25.5
+      '@esbuild/android-x64': 0.25.5
+      '@esbuild/darwin-arm64': 0.25.5
+      '@esbuild/darwin-x64': 0.25.5
+      '@esbuild/freebsd-arm64': 0.25.5
+      '@esbuild/freebsd-x64': 0.25.5
+      '@esbuild/linux-arm': 0.25.5
+      '@esbuild/linux-arm64': 0.25.5
+      '@esbuild/linux-ia32': 0.25.5
+      '@esbuild/linux-loong64': 0.25.5
+      '@esbuild/linux-mips64el': 0.25.5
+      '@esbuild/linux-ppc64': 0.25.5
+      '@esbuild/linux-riscv64': 0.25.5
+      '@esbuild/linux-s390x': 0.25.5
+      '@esbuild/linux-x64': 0.25.5
+      '@esbuild/netbsd-arm64': 0.25.5
+      '@esbuild/netbsd-x64': 0.25.5
+      '@esbuild/openbsd-arm64': 0.25.5
+      '@esbuild/openbsd-x64': 0.25.5
+      '@esbuild/sunos-x64': 0.25.5
+      '@esbuild/win32-arm64': 0.25.5
+      '@esbuild/win32-ia32': 0.25.5
+      '@esbuild/win32-x64': 0.25.5
 
   escalade@3.2.0: {}
 
@@ -13838,11 +13838,11 @@ snapshots:
       picocolors: 1.1.1
       shell-quote: 1.8.2
 
-  less-loader@12.3.0(less@4.3.0)(webpack@5.99.8(esbuild@0.25.4)):
+  less-loader@12.3.0(less@4.3.0)(webpack@5.99.8(esbuild@0.25.5)):
     dependencies:
       less: 4.3.0
     optionalDependencies:
-      webpack: 5.99.8(esbuild@0.25.4)
+      webpack: 5.99.8(esbuild@0.25.5)
 
   less@4.3.0:
     dependencies:
@@ -13863,11 +13863,11 @@ snapshots:
       prelude-ls: 1.2.1
       type-check: 0.4.0
 
-  license-webpack-plugin@4.0.2(webpack@5.99.8(esbuild@0.25.4)):
+  license-webpack-plugin@4.0.2(webpack@5.99.8(esbuild@0.25.5)):
     dependencies:
       webpack-sources: 3.2.3
     optionalDependencies:
-      webpack: 5.99.8(esbuild@0.25.4)
+      webpack: 5.99.8(esbuild@0.25.5)
 
   lie@3.3.0:
     dependencies:
@@ -14103,11 +14103,11 @@ snapshots:
 
   mimic-function@5.0.1: {}
 
-  mini-css-extract-plugin@2.9.2(webpack@5.99.8(esbuild@0.25.4)):
+  mini-css-extract-plugin@2.9.2(webpack@5.99.8(esbuild@0.25.5)):
     dependencies:
       schema-utils: 4.3.2
       tapable: 2.2.1
-      webpack: 5.99.8(esbuild@0.25.4)
+      webpack: 5.99.8(esbuild@0.25.5)
 
   minimalistic-assert@1.0.1: {}
 
@@ -14248,7 +14248,7 @@ snapshots:
       chokidar: 4.0.3
       commander: 13.1.0
       dependency-graph: 1.0.0
-      esbuild: 0.25.4
+      esbuild: 0.25.5
       find-cache-dir: 3.3.2
       injection-js: 2.5.0
       jsonc-parser: 3.3.1
@@ -14737,14 +14737,14 @@ snapshots:
 
   possible-typed-array-names@1.1.0: {}
 
-  postcss-loader@8.1.1(postcss@8.5.3)(typescript@5.8.3)(webpack@5.99.8(esbuild@0.25.4)):
+  postcss-loader@8.1.1(postcss@8.5.3)(typescript@5.8.3)(webpack@5.99.8(esbuild@0.25.5)):
     dependencies:
       cosmiconfig: 9.0.0(typescript@5.8.3)
       jiti: 1.21.7
       postcss: 8.5.3
       semver: 7.7.2
     optionalDependencies:
-      webpack: 5.99.8(esbuild@0.25.4)
+      webpack: 5.99.8(esbuild@0.25.5)
     transitivePeerDependencies:
       - typescript
 
@@ -15269,12 +15269,12 @@ snapshots:
 
   safer-buffer@2.1.2: {}
 
-  sass-loader@16.0.5(sass@1.88.0)(webpack@5.99.8(esbuild@0.25.4)):
+  sass-loader@16.0.5(sass@1.88.0)(webpack@5.99.8(esbuild@0.25.5)):
     dependencies:
       neo-async: 2.6.2
     optionalDependencies:
       sass: 1.88.0
-      webpack: 5.99.8(esbuild@0.25.4)
+      webpack: 5.99.8(esbuild@0.25.5)
 
   sass@1.88.0:
     dependencies:
@@ -15597,11 +15597,11 @@ snapshots:
 
   source-map-js@1.2.1: {}
 
-  source-map-loader@5.0.0(webpack@5.99.8(esbuild@0.25.4)):
+  source-map-loader@5.0.0(webpack@5.99.8(esbuild@0.25.5)):
     dependencies:
       iconv-lite: 0.6.3
       source-map-js: 1.2.1
-      webpack: 5.99.8(esbuild@0.25.4)
+      webpack: 5.99.8(esbuild@0.25.5)
 
   source-map-support@0.4.18:
     dependencies:
@@ -15882,16 +15882,16 @@ snapshots:
       - encoding
       - supports-color
 
-  terser-webpack-plugin@5.3.14(esbuild@0.25.4)(webpack@5.99.8(esbuild@0.25.4)):
+  terser-webpack-plugin@5.3.14(esbuild@0.25.5)(webpack@5.99.8(esbuild@0.25.5)):
     dependencies:
       '@jridgewell/trace-mapping': 0.3.25
       jest-worker: 27.5.1
       schema-utils: 4.3.2
       serialize-javascript: 6.0.2
       terser: 5.39.1
-      webpack: 5.99.8(esbuild@0.25.4)
+      webpack: 5.99.8(esbuild@0.25.5)
     optionalDependencies:
-      esbuild: 0.25.4
+      esbuild: 0.25.5
 
   terser@5.39.1:
     dependencies:
@@ -16300,7 +16300,7 @@ snapshots:
 
   vite@6.3.5(@types/node@20.17.46)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.1)(yaml@2.7.1):
     dependencies:
-      esbuild: 0.25.4
+      esbuild: 0.25.5
       fdir: 6.4.4(picomatch@4.0.2)
       picomatch: 4.0.2
       postcss: 8.5.3
@@ -16404,7 +16404,7 @@ snapshots:
 
   webidl-conversions@7.0.0: {}
 
-  webpack-dev-middleware@7.4.2(webpack@5.99.8(esbuild@0.25.4)):
+  webpack-dev-middleware@7.4.2(webpack@5.99.8(esbuild@0.25.5)):
     dependencies:
       colorette: 2.0.20
       memfs: 4.17.1
@@ -16413,9 +16413,9 @@ snapshots:
       range-parser: 1.2.1
       schema-utils: 4.3.2
     optionalDependencies:
-      webpack: 5.99.8(esbuild@0.25.4)
+      webpack: 5.99.8(esbuild@0.25.5)
 
-  webpack-dev-server@5.2.1(webpack@5.99.8(esbuild@0.25.4)):
+  webpack-dev-server@5.2.1(webpack@5.99.8(esbuild@0.25.5)):
     dependencies:
       '@types/bonjour': 3.5.13
       '@types/connect-history-api-fallback': 1.5.4
@@ -16443,10 +16443,10 @@ snapshots:
       serve-index: 1.9.1
       sockjs: 0.3.24
       spdy: 4.0.2
-      webpack-dev-middleware: 7.4.2(webpack@5.99.8(esbuild@0.25.4))
+      webpack-dev-middleware: 7.4.2(webpack@5.99.8(esbuild@0.25.5))
       ws: 8.18.2
     optionalDependencies:
-      webpack: 5.99.8(esbuild@0.25.4)
+      webpack: 5.99.8(esbuild@0.25.5)
     transitivePeerDependencies:
       - bufferutil
       - debug
@@ -16461,12 +16461,12 @@ snapshots:
 
   webpack-sources@3.2.3: {}
 
-  webpack-subresource-integrity@5.1.0(webpack@5.99.8(esbuild@0.25.4)):
+  webpack-subresource-integrity@5.1.0(webpack@5.99.8(esbuild@0.25.5)):
     dependencies:
       typed-assert: 1.0.9
-      webpack: 5.99.8(esbuild@0.25.4)
+      webpack: 5.99.8(esbuild@0.25.5)
 
-  webpack@5.99.8(esbuild@0.25.4):
+  webpack@5.99.8(esbuild@0.25.5):
     dependencies:
       '@types/eslint-scope': 3.7.7
       '@types/estree': 1.0.7
@@ -16489,7 +16489,7 @@ snapshots:
       neo-async: 2.6.2
       schema-utils: 4.3.2
       tapable: 2.2.1
-      terser-webpack-plugin: 5.3.14(esbuild@0.25.4)(webpack@5.99.8(esbuild@0.25.4))
+      terser-webpack-plugin: 5.3.14(esbuild@0.25.5)(webpack@5.99.8(esbuild@0.25.5))
       watchpack: 2.4.2
       webpack-sources: 3.2.3
     transitivePeerDependencies:

From 2353de5ceff232936a3dfbdd7587e7a093185b93 Mon Sep 17 00:00:00 2001
From: Jan Martin <jan.krems@gmail.com>
Date: Tue, 27 May 2025 08:57:31 -0700
Subject: [PATCH 090/138] release: cut the v20.0.0-rc.4 release

---
 CHANGELOG.md | 19 +++++++++++++++++++
 package.json |  2 +-
 2 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index af1ed782ac07..f28d5aa6c3e7 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,22 @@
+<a name="20.0.0-rc.4"></a>
+
+# 20.0.0-rc.4 (2025-05-27)
+
+### @schematics/angular
+
+| Commit                                                                                              | Type | Description                                                     |
+| --------------------------------------------------------------------------------------------------- | ---- | --------------------------------------------------------------- |
+| [bcc0892a6](https://github.com/angular/angular-cli/commit/bcc0892a65f00e68709e84c380f448a5e0fd05e7) | fix  | migrate `provideServerRoutesConfig` to `provideServerRendering` |
+
+### @angular/build
+
+| Commit                                                                                              | Type | Description                                     |
+| --------------------------------------------------------------------------------------------------- | ---- | ----------------------------------------------- |
+| [4c0d873b0](https://github.com/angular/angular-cli/commit/4c0d873b069b2671d7a0f98bcdc9b86ef48a8cd6) | fix  | include full metadata for AOT unit-testing      |
+| [5ff6188c4](https://github.com/angular/angular-cli/commit/5ff6188c4330b009201a64a23d0090bfcec0612f) | perf | directly check code for Angular partial linking |
+
+<!-- CHANGELOG SPLIT MARKER -->
+
 <a name="20.0.0-rc.3"></a>
 
 # 20.0.0-rc.3 (2025-05-21)
diff --git a/package.json b/package.json
index aa6b143dec15..59de7986e02c 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@angular/devkit-repo",
-  "version": "20.0.0-rc.3",
+  "version": "20.0.0-rc.4",
   "private": true,
   "description": "Software Development Kit for Angular",
   "keywords": [

From b3fa0a85d4686ca5eda289c8414e3a298e7b1df0 Mon Sep 17 00:00:00 2001
From: Jan Martin <jan.krems@gmail.com>
Date: Wed, 28 May 2025 06:56:44 -0700
Subject: [PATCH 091/138] build: update framework and ng-packagr to 20.0.0

---
 constants.bzl                                 |   8 +-
 package.json                                  |  26 +-
 packages/angular/build/package.json           |   2 +-
 packages/angular/ssr/package.json             |  12 +-
 .../angular_devkit/build_angular/package.json |   2 +-
 packages/ngtools/webpack/package.json         |   4 +-
 pnpm-lock.yaml                                | 473 +++++++-----------
 7 files changed, 219 insertions(+), 308 deletions(-)

diff --git a/constants.bzl b/constants.bzl
index 00a26f29f81b..a80292ab7c1c 100644
--- a/constants.bzl
+++ b/constants.bzl
@@ -3,10 +3,10 @@ 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/package.json b/package.json
index 59de7986e02c..0c0e35aa455c 100644
--- a/package.json
+++ b/package.json
@@ -46,20 +46,20 @@
   },
   "homepage": "https://github.com/angular/angular-cli",
   "devDependencies": {
-    "@angular/animations": "20.0.0-rc.0",
-    "@angular/cdk": "20.0.0-rc.0",
-    "@angular/common": "20.0.0-rc.0",
-    "@angular/compiler": "20.0.0-rc.0",
-    "@angular/compiler-cli": "20.0.0-rc.0",
-    "@angular/core": "20.0.0-rc.0",
-    "@angular/forms": "20.0.0-rc.0",
-    "@angular/localize": "20.0.0-rc.0",
-    "@angular/material": "20.0.0-rc.0",
+    "@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-rc.0",
-    "@angular/platform-server": "20.0.0-rc.0",
-    "@angular/router": "20.0.0-rc.0",
-    "@angular/service-worker": "20.0.0-rc.0",
+    "@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.2.0",
     "@eslint/compat": "1.2.9",
diff --git a/packages/angular/build/package.json b/packages/angular/build/package.json
index 7181067e4334..56e2ae83b140 100644
--- a/packages/angular/build/package.json
+++ b/packages/angular/build/package.json
@@ -53,7 +53,7 @@
     "@angular-devkit/core": "workspace:*",
     "jsdom": "26.1.0",
     "less": "4.3.0",
-    "ng-packagr": "20.0.0-rc.0",
+    "ng-packagr": "20.0.0",
     "postcss": "8.5.3",
     "rxjs": "7.8.2",
     "vitest": "3.1.3"
diff --git a/packages/angular/ssr/package.json b/packages/angular/ssr/package.json
index 4889f1b724cf..bbecb56c046a 100644
--- a/packages/angular/ssr/package.json
+++ b/packages/angular/ssr/package.json
@@ -29,12 +29,12 @@
   },
   "devDependencies": {
     "@angular-devkit/schematics": "workspace:*",
-    "@angular/common": "20.0.0-rc.0",
-    "@angular/compiler": "20.0.0-rc.0",
-    "@angular/core": "20.0.0-rc.0",
-    "@angular/platform-browser": "20.0.0-rc.0",
-    "@angular/platform-server": "20.0.0-rc.0",
-    "@angular/router": "20.0.0-rc.0",
+    "@angular/common": "20.0.0",
+    "@angular/compiler": "20.0.0",
+    "@angular/core": "20.0.0",
+    "@angular/platform-browser": "20.0.0",
+    "@angular/platform-server": "20.0.0",
+    "@angular/router": "20.0.0",
     "@schematics/angular": "workspace:*"
   },
   "sideEffects": false,
diff --git a/packages/angular_devkit/build_angular/package.json b/packages/angular_devkit/build_angular/package.json
index 02a895347009..96653c1db42f 100644
--- a/packages/angular_devkit/build_angular/package.json
+++ b/packages/angular_devkit/build_angular/package.json
@@ -69,7 +69,7 @@
     "@angular/ssr": "workspace:*",
     "@web/test-runner": "0.20.2",
     "browser-sync": "3.0.4",
-    "ng-packagr": "20.0.0-rc.0",
+    "ng-packagr": "20.0.0",
     "undici": "7.9.0"
   },
   "peerDependencies": {
diff --git a/packages/ngtools/webpack/package.json b/packages/ngtools/webpack/package.json
index 5773340fff1e..49310a53ce22 100644
--- a/packages/ngtools/webpack/package.json
+++ b/packages/ngtools/webpack/package.json
@@ -27,8 +27,8 @@
   },
   "devDependencies": {
     "@angular-devkit/core": "workspace:0.0.0-PLACEHOLDER",
-    "@angular/compiler": "20.0.0-rc.0",
-    "@angular/compiler-cli": "20.0.0-rc.0",
+    "@angular/compiler": "20.0.0",
+    "@angular/compiler-cli": "20.0.0",
     "typescript": "5.8.3",
     "webpack": "5.99.8"
   }
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index c9fb8dad3f81..9ddfbba919e3 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -15,47 +15,47 @@ importers:
   .:
     devDependencies:
       '@angular/animations':
-        specifier: 20.0.0-rc.0
-        version: 20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))
+        specifier: 20.0.0
+        version: 20.0.0(@angular/common@20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))
       '@angular/cdk':
-        specifier: 20.0.0-rc.0
-        version: 20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
+        specifier: 20.0.0-rc.2
+        version: 20.0.0-rc.2(@angular/common@20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
       '@angular/common':
-        specifier: 20.0.0-rc.0
-        version: 20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
+        specifier: 20.0.0
+        version: 20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
       '@angular/compiler':
-        specifier: 20.0.0-rc.0
-        version: 20.0.0-rc.0
+        specifier: 20.0.0
+        version: 20.0.0
       '@angular/compiler-cli':
-        specifier: 20.0.0-rc.0
-        version: 20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(typescript@5.8.3)
+        specifier: 20.0.0
+        version: 20.0.0(@angular/compiler@20.0.0)(typescript@5.8.3)
       '@angular/core':
-        specifier: 20.0.0-rc.0
-        version: 20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)
+        specifier: 20.0.0
+        version: 20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0)
       '@angular/forms':
-        specifier: 20.0.0-rc.0
-        version: 20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(@angular/platform-browser@20.0.0-rc.0(@angular/animations@20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)))(rxjs@7.8.2)
+        specifier: 20.0.0
+        version: 20.0.0(@angular/common@20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(@angular/platform-browser@20.0.0(@angular/animations@20.0.0(@angular/common@20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0)))(rxjs@7.8.2)
       '@angular/localize':
-        specifier: 20.0.0-rc.0
-        version: 20.0.0-rc.0(@angular/compiler-cli@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(typescript@5.8.3))(@angular/compiler@20.0.0-rc.0)
+        specifier: 20.0.0
+        version: 20.0.0(@angular/compiler-cli@20.0.0(@angular/compiler@20.0.0)(typescript@5.8.3))(@angular/compiler@20.0.0)
       '@angular/material':
-        specifier: 20.0.0-rc.0
-        version: 20.0.0-rc.0(s3hqhtlo3u2ktlkecz27drcsye)
+        specifier: 20.0.0-rc.2
+        version: 20.0.0-rc.2(h6g2jqhgzl2uhquhuco2s7e3pa)
       '@angular/ng-dev':
         specifier: https://github.com/angular/dev-infra-private-ng-dev-builds.git#aa535e2d49ecfb0fbd230b192cb97c3d193ca3ee
         version: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/aa535e2d49ecfb0fbd230b192cb97c3d193ca3ee(encoding@0.1.13)
       '@angular/platform-browser':
-        specifier: 20.0.0-rc.0
-        version: 20.0.0-rc.0(@angular/animations@20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))
+        specifier: 20.0.0
+        version: 20.0.0(@angular/animations@20.0.0(@angular/common@20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))
       '@angular/platform-server':
-        specifier: 20.0.0-rc.0
-        version: 20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/compiler@20.0.0-rc.0)(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(@angular/platform-browser@20.0.0-rc.0(@angular/animations@20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)))(rxjs@7.8.2)
+        specifier: 20.0.0
+        version: 20.0.0(@angular/common@20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/compiler@20.0.0)(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(@angular/platform-browser@20.0.0(@angular/animations@20.0.0(@angular/common@20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0)))(rxjs@7.8.2)
       '@angular/router':
-        specifier: 20.0.0-rc.0
-        version: 20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(@angular/platform-browser@20.0.0-rc.0(@angular/animations@20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)))(rxjs@7.8.2)
+        specifier: 20.0.0
+        version: 20.0.0(@angular/common@20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(@angular/platform-browser@20.0.0(@angular/animations@20.0.0(@angular/common@20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0)))(rxjs@7.8.2)
       '@angular/service-worker':
-        specifier: 20.0.0-rc.0
-        version: 20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
+        specifier: 20.0.0
+        version: 20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
       '@bazel/bazelisk':
         specifier: 1.26.0
         version: 1.26.0
@@ -442,8 +442,8 @@ importers:
         specifier: 4.3.0
         version: 4.3.0
       ng-packagr:
-        specifier: 20.0.0-rc.0
-        version: 20.0.0-rc.0(@angular/compiler-cli@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(typescript@5.8.3))(tslib@2.8.1)(typescript@5.8.3)
+        specifier: 20.0.0
+        version: 20.0.0(@angular/compiler-cli@20.0.0(@angular/compiler@20.0.0)(typescript@5.8.3))(tslib@2.8.1)(typescript@5.8.3)
       postcss:
         specifier: 8.5.3
         version: 8.5.3
@@ -527,23 +527,23 @@ importers:
         specifier: workspace:*
         version: link:../../angular_devkit/schematics
       '@angular/common':
-        specifier: 20.0.0-rc.0
-        version: 20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
+        specifier: 20.0.0
+        version: 20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
       '@angular/compiler':
-        specifier: 20.0.0-rc.0
-        version: 20.0.0-rc.0
+        specifier: 20.0.0
+        version: 20.0.0
       '@angular/core':
-        specifier: 20.0.0-rc.0
-        version: 20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)
+        specifier: 20.0.0
+        version: 20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0)
       '@angular/platform-browser':
-        specifier: 20.0.0-rc.0
-        version: 20.0.0-rc.0(@angular/animations@20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))
+        specifier: 20.0.0
+        version: 20.0.0(@angular/animations@20.0.0(@angular/common@20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))
       '@angular/platform-server':
-        specifier: 20.0.0-rc.0
-        version: 20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/compiler@20.0.0-rc.0)(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(@angular/platform-browser@20.0.0-rc.0(@angular/animations@20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)))(rxjs@7.8.2)
+        specifier: 20.0.0
+        version: 20.0.0(@angular/common@20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/compiler@20.0.0)(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(@angular/platform-browser@20.0.0(@angular/animations@20.0.0(@angular/common@20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0)))(rxjs@7.8.2)
       '@angular/router':
-        specifier: 20.0.0-rc.0
-        version: 20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(@angular/platform-browser@20.0.0-rc.0(@angular/animations@20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)))(rxjs@7.8.2)
+        specifier: 20.0.0
+        version: 20.0.0(@angular/common@20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(@angular/platform-browser@20.0.0(@angular/animations@20.0.0(@angular/common@20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0)))(rxjs@7.8.2)
       '@schematics/angular':
         specifier: workspace:*
         version: link:../../schematics/angular
@@ -761,8 +761,8 @@ importers:
         specifier: 3.0.4
         version: 3.0.4
       ng-packagr:
-        specifier: 20.0.0-rc.0
-        version: 20.0.0-rc.0(@angular/compiler-cli@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(typescript@5.8.3))(tslib@2.8.1)(typescript@5.8.3)
+        specifier: 20.0.0
+        version: 20.0.0(@angular/compiler-cli@20.0.0(@angular/compiler@20.0.0)(typescript@5.8.3))(tslib@2.8.1)(typescript@5.8.3)
       undici:
         specifier: 7.9.0
         version: 7.9.0
@@ -856,11 +856,11 @@ importers:
         specifier: workspace:0.0.0-PLACEHOLDER
         version: link:../../angular_devkit/core
       '@angular/compiler':
-        specifier: 20.0.0-rc.0
-        version: 20.0.0-rc.0
+        specifier: 20.0.0
+        version: 20.0.0
       '@angular/compiler-cli':
-        specifier: 20.0.0-rc.0
-        version: 20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(typescript@5.8.3)
+        specifier: 20.0.0
+        version: 20.0.0(@angular/compiler@20.0.0)(typescript@5.8.3)
       typescript:
         specifier: 5.8.3
         version: 5.8.3
@@ -904,71 +904,76 @@ packages:
     resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
     engines: {node: '>=6.0.0'}
 
-  '@angular/animations@20.0.0-rc.0':
-    resolution: {integrity: sha512-+vrpMe9NJ4QmW8iBh/cf/9sDHTOcJk7UW4jCf8y9s9HLk38MgUiCE0WAZz6RmnIrFGUCfewPzp9OsSf8duG4ww==}
-    engines: {node: ^20.11.1 || ^22.11.0 || >=24.0.0}
+  '@angular/animations@20.0.0':
+    resolution: {integrity: sha512-yU4hUH6AheY0dnMSaLRMfgnXhg/JUSUvrhE+lHzIiSKdEf0lyo1Ri6bkPD1CbamxZ94BqhRNCApvbvTbibGICQ==}
+    engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0}
     peerDependencies:
-      '@angular/common': 20.0.0-rc.0
-      '@angular/core': 20.0.0-rc.0
+      '@angular/common': 20.0.0
+      '@angular/core': 20.0.0
 
-  '@angular/cdk@20.0.0-rc.0':
-    resolution: {integrity: sha512-dvSacjyg5+6GCQiQpXIfguFcjrtR2R0uweUL8R9ZpGRi35jA0HqUYYY99asqyvhMS/G7F0etxRaPWu/d6sHpzg==}
+  '@angular/cdk@20.0.0-rc.2':
+    resolution: {integrity: sha512-jqv5621my90f9mn3iZRkAp8f7Dn1b16QyuDl6csOsH4wATySIprCE9jECcyAOtWvWGibw4fr5kocYkX+Lljlag==}
     peerDependencies:
       '@angular/common': ^20.0.0-0 || ^20.1.0-0 || ^20.2.0-0 || ^20.3.0-0 || ^21.0.0-0
       '@angular/core': ^20.0.0-0 || ^20.1.0-0 || ^20.2.0-0 || ^20.3.0-0 || ^21.0.0-0
       rxjs: ^6.5.3 || ^7.4.0
 
-  '@angular/common@20.0.0-rc.0':
-    resolution: {integrity: sha512-aaEjRPtVv0DF3q6wPHRfephY1kMYTefmFH35z+hzcUVIrVyYQdT/LIUX3L+C9ITfYyLmFWlENf3HxmVUILfXAg==}
-    engines: {node: ^20.11.1 || ^22.11.0 || >=24.0.0}
+  '@angular/common@20.0.0':
+    resolution: {integrity: sha512-tZTvxDjx+wH74/hIpip63u4tlaXNVXkq1iVf4gk7RPQGCAYLNPDWma8X+RpXMXWikn4/mA5NS1VBBtStTbS+gg==}
+    engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0}
     peerDependencies:
-      '@angular/core': 20.0.0-rc.0
+      '@angular/core': 20.0.0
       rxjs: ^6.5.3 || ^7.4.0
 
-  '@angular/compiler-cli@20.0.0-rc.0':
-    resolution: {integrity: sha512-0+nEw4JXRSdBPDJvtBwQlMYd3dVsM0XOzc1hpg+1E7RWIXsxGb2WE8gEvNjNdR0oE7kjdUWSOKlDMJfE3AWVLA==}
-    engines: {node: ^20.11.1 || ^22.11.0 || >=24.0.0}
+  '@angular/compiler-cli@20.0.0':
+    resolution: {integrity: sha512-dPFp/YyRJkiyppnoI85mZz0CJv0ulc5MpJV16Lx0qdrRyoKmBrGmdaGEP0DOhhBLVAmJ5J2wvShvWfE2pjMMWw==}
+    engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0}
     hasBin: true
     peerDependencies:
-      '@angular/compiler': 20.0.0-rc.0
+      '@angular/compiler': 20.0.0
       typescript: 5.8.3
+    peerDependenciesMeta:
+      typescript:
+        optional: true
 
-  '@angular/compiler@20.0.0-rc.0':
-    resolution: {integrity: sha512-MJ2rJVQ/H6m9P3kIL9+wrwLnY2N48GM6vBhZ5+hVvtTPKLM0qcMwfTd/1SaG5e17tpg4mDWcr+pmnoGFgkXHvg==}
-    engines: {node: ^20.11.1 || ^22.11.0 || >=24.0.0}
+  '@angular/compiler@20.0.0':
+    resolution: {integrity: sha512-RzS7MFNy/f8Tft0u6Q1zszzFTeki4408zsBALwmS91a8O8x/jaEvfwA7swC7RiqiX9KKmAyuBJ0qiv42v1T5dA==}
+    engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0}
 
-  '@angular/core@20.0.0-rc.0':
-    resolution: {integrity: sha512-RKIXYA129vdrRKrnac2XOgpWuYusWqwM4KsQ7b5qKIMZabJ0a2GoOlezT6+NhPkOSsyygYuZtaia5wzQeU1acA==}
-    engines: {node: ^20.11.1 || ^22.11.0 || >=24.0.0}
+  '@angular/core@20.0.0':
+    resolution: {integrity: sha512-2UjKbTtYSY8omY+LE4G6hQ1/R4PkE6NY7/2u99TxLH/oOnc9broCH1g9ITU+n0eJURcOFeK0/w6RdSrK+di3pg==}
+    engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0}
     peerDependencies:
-      '@angular/compiler': 20.0.0-rc.0
+      '@angular/compiler': 20.0.0
       rxjs: ^6.5.3 || ^7.4.0
       zone.js: ~0.15.0
     peerDependenciesMeta:
       '@angular/compiler':
         optional: true
+      zone.js:
+        optional: true
 
-  '@angular/forms@20.0.0-rc.0':
-    resolution: {integrity: sha512-RH95gg+WBBHS+m6y2XDTCCUZMg6Xih1Y4G91tnBdzSxV32evqyNDrSA9IxOhC6Ztxcd+2aLg1S1hsaiMbF2Alw==}
-    engines: {node: ^20.11.1 || ^22.11.0 || >=24.0.0}
+  '@angular/forms@20.0.0':
+    resolution: {integrity: sha512-6yeb99IrNyeyj7o0bbd+n3JTZrXX2dJfdYLJH3tlXVlO9wg63bq+YR1AeM+RDCYMs+YDJis0lQpF6s+OICJv4g==}
+    engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0}
     peerDependencies:
-      '@angular/common': 20.0.0-rc.0
-      '@angular/core': 20.0.0-rc.0
-      '@angular/platform-browser': 20.0.0-rc.0
+      '@angular/common': 20.0.0
+      '@angular/core': 20.0.0
+      '@angular/platform-browser': 20.0.0
       rxjs: ^6.5.3 || ^7.4.0
 
-  '@angular/localize@20.0.0-rc.0':
-    resolution: {integrity: sha512-x6NmY9VCjSh0IPgTBF8SMIasy97ChOZfYgi1iDZwDNaAVug+jQm8XB3zC/SmDGN4yluTA9f2dvOMRhYVaenUNw==}
-    engines: {node: ^20.11.1 || ^22.11.0 || >=24.0.0}
+  '@angular/localize@20.0.0':
+    resolution: {integrity: sha512-sGu8QA2lj/4soCRhK1LtWc5yhBPPfb/7M+3p+jUgzPiO5ZaeDjvi/NLwJjIlBkUAfTVpRxADLJjAziRGar5gtw==}
+    engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0}
     hasBin: true
     peerDependencies:
-      '@angular/compiler': 20.0.0-rc.0
-      '@angular/compiler-cli': 20.0.0-rc.0
+      '@angular/compiler': 20.0.0
+      '@angular/compiler-cli': 20.0.0
 
-  '@angular/material@20.0.0-rc.0':
-    resolution: {integrity: sha512-Z6uaTLaTdfMoT2RnL8GB1na/n2/0d9Dk5h2wSsymyZFJz/U20btCQuor9Cvb/mUlrPs/uu/5SWDMpigRXlaomg==}
+  '@angular/material@20.0.0-rc.2':
+    resolution: {integrity: sha512-/ktz7f9Kc3+8NaJGDAROFlgGWMWGb0SgLio4CcxxZ2JxNH4JB2XSTnoQoFrShATTuaoBQ/D8/YaE+L5BZTPvGw==}
     peerDependencies:
-      '@angular/cdk': 20.0.0-rc.0
+      '@angular/cdk': 20.0.0-rc.2
       '@angular/common': ^20.0.0-0 || ^20.1.0-0 || ^20.2.0-0 || ^20.3.0-0 || ^21.0.0-0
       '@angular/core': ^20.0.0-0 || ^20.1.0-0 || ^20.2.0-0 || ^20.3.0-0 || ^21.0.0-0
       '@angular/forms': ^20.0.0-0 || ^20.1.0-0 || ^20.2.0-0 || ^20.3.0-0 || ^21.0.0-0
@@ -980,42 +985,42 @@ packages:
     version: 0.0.0-47ce326218e10e67066c27f618129ac8a13a7033
     hasBin: true
 
-  '@angular/platform-browser@20.0.0-rc.0':
-    resolution: {integrity: sha512-mu2g1PNJkGCJxyCA366nGQt3abX9jx+VTcPR1PRaLqY/sGzA42sYJTG/M74CIpfnx9Sxb1hD3/XCB3xbN5rPhw==}
-    engines: {node: ^20.11.1 || ^22.11.0 || >=24.0.0}
+  '@angular/platform-browser@20.0.0':
+    resolution: {integrity: sha512-FP9YjT2beF0tov0wub6+eUQqJd2MwyYqEQQ6+Qx67ukd04plIryhrcImORehrsN24DbnHkyTqhCvUyNAZs2uwA==}
+    engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0}
     peerDependencies:
-      '@angular/animations': 20.0.0-rc.0
-      '@angular/common': 20.0.0-rc.0
-      '@angular/core': 20.0.0-rc.0
+      '@angular/animations': 20.0.0
+      '@angular/common': 20.0.0
+      '@angular/core': 20.0.0
     peerDependenciesMeta:
       '@angular/animations':
         optional: true
 
-  '@angular/platform-server@20.0.0-rc.0':
-    resolution: {integrity: sha512-bIZMXPDAWVYhvlBUjo4HwqIdPHL/rcTmM2IIg3imdgPrva0yJmtyqILCVEHqZJuuQTpEIKJF3TLtF7DyVcHDRw==}
-    engines: {node: ^20.11.1 || ^22.11.0 || >=24.0.0}
+  '@angular/platform-server@20.0.0':
+    resolution: {integrity: sha512-H2Qw6bZYYQdZKrMv6YS1k65+mXCRFBAZJziFeNUG9HreKaSNBlqCvrR/ru6TLo6UhItpX3bS/y9u/lBcGP/Ejg==}
+    engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0}
     peerDependencies:
-      '@angular/common': 20.0.0-rc.0
-      '@angular/compiler': 20.0.0-rc.0
-      '@angular/core': 20.0.0-rc.0
-      '@angular/platform-browser': 20.0.0-rc.0
+      '@angular/common': 20.0.0
+      '@angular/compiler': 20.0.0
+      '@angular/core': 20.0.0
+      '@angular/platform-browser': 20.0.0
       rxjs: ^6.5.3 || ^7.4.0
 
-  '@angular/router@20.0.0-rc.0':
-    resolution: {integrity: sha512-QkViBejo2xZwyGMHcM7NJh8QxhrAEeNq58Yoph6owzGb1/LMArVvZgoJAJC8HW3ojHN8xFUIfgxM4sFjjcw0dA==}
-    engines: {node: ^20.11.1 || ^22.11.0 || >=24.0.0}
+  '@angular/router@20.0.0':
+    resolution: {integrity: sha512-RQ7rU4NaZDSvvOfMZQmB50q7de+jrHYb+f0ExLKBvr80B1MK3oc9VvI2BzBkGfM4aGx71MMa0UizjOiT/31kqw==}
+    engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0}
     peerDependencies:
-      '@angular/common': 20.0.0-rc.0
-      '@angular/core': 20.0.0-rc.0
-      '@angular/platform-browser': 20.0.0-rc.0
+      '@angular/common': 20.0.0
+      '@angular/core': 20.0.0
+      '@angular/platform-browser': 20.0.0
       rxjs: ^6.5.3 || ^7.4.0
 
-  '@angular/service-worker@20.0.0-rc.0':
-    resolution: {integrity: sha512-YaG4KIxDW4gPAJXX0rRLDunaS8EC5+qUzd41oYxoNMQNdGPGYrmBPNs6zEObPKHk+ZvX/L6GJ5YNrWbPvuo/rg==}
-    engines: {node: ^20.11.1 || ^22.11.0 || >=24.0.0}
+  '@angular/service-worker@20.0.0':
+    resolution: {integrity: sha512-umeJHjGwIf10EksSAVz8kV0GP10FF2M0f6QrIV2LceWyKZl3EeK+joDEjo9GGTGgVukVg3TNKp5WyqqR1GmmSw==}
+    engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0}
     hasBin: true
     peerDependencies:
-      '@angular/core': 20.0.0-rc.0
+      '@angular/core': 20.0.0
       rxjs: ^6.5.3 || ^7.4.0
 
   '@asamuzakjp/css-color@3.1.7':
@@ -1029,10 +1034,6 @@ packages:
     resolution: {integrity: sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/core@7.26.10':
-    resolution: {integrity: sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==}
-    engines: {node: '>=6.9.0'}
-
   '@babel/core@7.27.1':
     resolution: {integrity: sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ==}
     engines: {node: '>=6.9.0'}
@@ -3807,10 +3808,6 @@ packages:
     resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==}
     engines: {node: '>=6'}
 
-  clone@1.0.4:
-    resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==}
-    engines: {node: '>=0.8'}
-
   clone@2.1.2:
     resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==}
     engines: {node: '>=0.8'}
@@ -3852,13 +3849,16 @@ packages:
     resolution: {integrity: sha512-PqMLy5+YGwhMh1wS04mVG44oqDsgyLRSKJBdOo1bnYhMKBW65gZF1dRp2OZRhiTjgUHljy99qkO7bsctLaw35Q==}
     engines: {node: '>=12.20.0'}
 
-  commander@13.1.0:
-    resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==}
-    engines: {node: '>=18'}
+  commander@14.0.0:
+    resolution: {integrity: sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==}
+    engines: {node: '>=20'}
 
   commander@2.20.3:
     resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
 
+  common-path-prefix@3.0.0:
+    resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==}
+
   commondir@1.0.1:
     resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==}
 
@@ -4122,9 +4122,6 @@ packages:
     resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==}
     engines: {node: '>= 10'}
 
-  defaults@1.0.4:
-    resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==}
-
   define-data-property@1.1.4:
     resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
     engines: {node: '>= 0.4'}
@@ -4676,14 +4673,18 @@ packages:
     resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==}
     engines: {node: '>= 0.8'}
 
-  find-cache-dir@3.3.2:
-    resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==}
-    engines: {node: '>=8'}
+  find-cache-directory@6.0.0:
+    resolution: {integrity: sha512-CvFd5ivA6HcSHbD+59P7CyzINHXzwhuQK8RY7CxJZtgDSAtRlHiCaQpZQ2lMR/WRyUIEmzUvL6G2AGurMfegZA==}
+    engines: {node: '>=20'}
 
   find-replace@3.0.0:
     resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==}
     engines: {node: '>=4.0.0'}
 
+  find-up-simple@1.0.1:
+    resolution: {integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==}
+    engines: {node: '>=18'}
+
   find-up@4.1.0:
     resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==}
     engines: {node: '>=8'}
@@ -5266,10 +5267,6 @@ packages:
     engines: {node: '>=14.16'}
     hasBin: true
 
-  is-interactive@1.0.0:
-    resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==}
-    engines: {node: '>=8'}
-
   is-interactive@2.0.0:
     resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==}
     engines: {node: '>=12'}
@@ -5370,10 +5367,6 @@ packages:
   is-typedarray@1.0.0:
     resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==}
 
-  is-unicode-supported@0.1.0:
-    resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==}
-    engines: {node: '>=10'}
-
   is-unicode-supported@1.3.0:
     resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==}
     engines: {node: '>=12'}
@@ -5793,10 +5786,6 @@ packages:
   lodash@4.17.21:
     resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
 
-  log-symbols@4.1.0:
-    resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==}
-    engines: {node: '>=10'}
-
   log-symbols@6.0.0:
     resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==}
     engines: {node: '>=18'}
@@ -5844,10 +5833,6 @@ packages:
     resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==}
     engines: {node: '>=6'}
 
-  make-dir@3.1.0:
-    resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==}
-    engines: {node: '>=8'}
-
   make-dir@4.0.0:
     resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==}
     engines: {node: '>=10'}
@@ -6092,12 +6077,12 @@ packages:
     resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==}
     engines: {node: '>= 0.4.0'}
 
-  ng-packagr@20.0.0-rc.0:
-    resolution: {integrity: sha512-XxyqxmF229CYlqqdw2G7WLp2BSacMr0swSiLM7qJBu0jPJFAMmGOfvxOMD542suCekYRaFzzQ+WRpSLftEjV5A==}
-    engines: {node: ^20.11.1 || >=22.11.0}
+  ng-packagr@20.0.0:
+    resolution: {integrity: sha512-p4pKkeulFi8wIOE2oLCPuzGLWE3uCNdrovSHGK5/w3+eA3l6DZmdEcvXM8YrEhbi253aB3yp4nKipc1OlK7hvQ==}
+    engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0}
     hasBin: true
     peerDependencies:
-      '@angular/compiler-cli': ^20.0.0 || ^20.0.0-next.0
+      '@angular/compiler-cli': ^20.0.0 || ^20.0.0-next.0 || ^20.1.0-next.0
       tailwindcss: ^2.0.0 || ^3.0.0 || ^4.0.0
       tslib: ^2.3.0
       typescript: 5.8.3
@@ -6364,10 +6349,6 @@ packages:
     resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
     engines: {node: '>= 0.8.0'}
 
-  ora@5.4.1:
-    resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==}
-    engines: {node: '>=10'}
-
   ora@8.2.0:
     resolution: {integrity: sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==}
     engines: {node: '>=18'}
@@ -6573,9 +6554,6 @@ packages:
     resolution: {integrity: sha512-i85pKRCt4qMjZ1+L7sy2Ag4t1atFcdbEt76+7iRJn1g2BvsnRMGu9p8pivl9fs63M2kF/A0OacFZhTub+m/qMg==}
     hasBin: true
 
-  piscina@4.9.2:
-    resolution: {integrity: sha512-Fq0FERJWFEUpB4eSY59wSNwXD4RYqR+nR/WiEVcZW8IWfVBxJJafcgTEZDQo8k3w0sUarJ8RyVbbUF4GQ2LGbQ==}
-
   piscina@5.0.0:
     resolution: {integrity: sha512-R+arufwL7sZvGjAhSMK3TfH55YdGOqhpKXkcwQJr432AAnJX/xxX19PA4QisrmJ+BTTfZVggaz6HexbkQq1l1Q==}
     engines: {node: '>=18.x'}
@@ -6584,9 +6562,9 @@ packages:
     resolution: {integrity: sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==}
     engines: {node: '>=16.20.0'}
 
-  pkg-dir@4.2.0:
-    resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==}
-    engines: {node: '>=8'}
+  pkg-dir@8.0.0:
+    resolution: {integrity: sha512-4peoBq4Wks0riS0z8741NVv+/8IiTvqnZAr8QGgtdifrtpdXbNw/FxRS1l6NFqm4EMzuS0EDqNNx4XGaz8cuyQ==}
+    engines: {node: '>=18'}
 
   pkginfo@0.4.1:
     resolution: {integrity: sha512-8xCNE/aT/EXKenuMDZ+xTVwkT8gsoHN2z/Q29l80u0ppGEXVvsKRzNMbtKhg8LS8k1tJLAHHylf6p4VFmP6XUQ==}
@@ -7925,9 +7903,6 @@ packages:
   wbuf@1.7.3:
     resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==}
 
-  wcwidth@1.0.1:
-    resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==}
-
   weak-lru-cache@1.2.2:
     resolution: {integrity: sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==}
 
@@ -8256,79 +8231,80 @@ snapshots:
       '@jridgewell/gen-mapping': 0.3.8
       '@jridgewell/trace-mapping': 0.3.25
 
-  '@angular/animations@20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))':
+  '@angular/animations@20.0.0(@angular/common@20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))':
     dependencies:
-      '@angular/common': 20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
-      '@angular/core': 20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)
+      '@angular/common': 20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
+      '@angular/core': 20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0)
       tslib: 2.8.1
 
-  '@angular/cdk@20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)':
+  '@angular/cdk@20.0.0-rc.2(@angular/common@20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)':
     dependencies:
-      '@angular/common': 20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
-      '@angular/core': 20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)
+      '@angular/common': 20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
+      '@angular/core': 20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0)
       parse5: 7.3.0
       rxjs: 7.8.2
       tslib: 2.8.1
 
-  '@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)':
+  '@angular/common@20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)':
     dependencies:
-      '@angular/core': 20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)
+      '@angular/core': 20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0)
       rxjs: 7.8.2
       tslib: 2.8.1
 
-  '@angular/compiler-cli@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(typescript@5.8.3)':
+  '@angular/compiler-cli@20.0.0(@angular/compiler@20.0.0)(typescript@5.8.3)':
     dependencies:
-      '@angular/compiler': 20.0.0-rc.0
-      '@babel/core': 7.26.10
+      '@angular/compiler': 20.0.0
+      '@babel/core': 7.27.1
       '@jridgewell/sourcemap-codec': 1.5.0
       chokidar: 4.0.3
       convert-source-map: 1.9.0
       reflect-metadata: 0.2.2
       semver: 7.7.2
       tslib: 2.8.1
-      typescript: 5.8.3
       yargs: 17.7.2
+    optionalDependencies:
+      typescript: 5.8.3
     transitivePeerDependencies:
       - supports-color
 
-  '@angular/compiler@20.0.0-rc.0':
+  '@angular/compiler@20.0.0':
     dependencies:
       tslib: 2.8.1
 
-  '@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)':
+  '@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0)':
     dependencies:
       rxjs: 7.8.2
       tslib: 2.8.1
-      zone.js: 0.15.0
     optionalDependencies:
-      '@angular/compiler': 20.0.0-rc.0
+      '@angular/compiler': 20.0.0
+      zone.js: 0.15.0
 
-  '@angular/forms@20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(@angular/platform-browser@20.0.0-rc.0(@angular/animations@20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)))(rxjs@7.8.2)':
+  '@angular/forms@20.0.0(@angular/common@20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(@angular/platform-browser@20.0.0(@angular/animations@20.0.0(@angular/common@20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0)))(rxjs@7.8.2)':
     dependencies:
-      '@angular/common': 20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
-      '@angular/core': 20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)
-      '@angular/platform-browser': 20.0.0-rc.0(@angular/animations@20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))
+      '@angular/common': 20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
+      '@angular/core': 20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0)
+      '@angular/platform-browser': 20.0.0(@angular/animations@20.0.0(@angular/common@20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))
       rxjs: 7.8.2
       tslib: 2.8.1
 
-  '@angular/localize@20.0.0-rc.0(@angular/compiler-cli@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(typescript@5.8.3))(@angular/compiler@20.0.0-rc.0)':
+  '@angular/localize@20.0.0(@angular/compiler-cli@20.0.0(@angular/compiler@20.0.0)(typescript@5.8.3))(@angular/compiler@20.0.0)':
     dependencies:
-      '@angular/compiler': 20.0.0-rc.0
-      '@angular/compiler-cli': 20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(typescript@5.8.3)
-      '@babel/core': 7.26.10
+      '@angular/compiler': 20.0.0
+      '@angular/compiler-cli': 20.0.0(@angular/compiler@20.0.0)(typescript@5.8.3)
+      '@babel/core': 7.27.1
       '@types/babel__core': 7.20.5
       tinyglobby: 0.2.13
       yargs: 17.7.2
     transitivePeerDependencies:
       - supports-color
 
-  '@angular/material@20.0.0-rc.0(s3hqhtlo3u2ktlkecz27drcsye)':
+  '@angular/material@20.0.0-rc.2(h6g2jqhgzl2uhquhuco2s7e3pa)':
     dependencies:
-      '@angular/cdk': 20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
-      '@angular/common': 20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
-      '@angular/core': 20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)
-      '@angular/forms': 20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(@angular/platform-browser@20.0.0-rc.0(@angular/animations@20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)))(rxjs@7.8.2)
-      '@angular/platform-browser': 20.0.0-rc.0(@angular/animations@20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))
+      '@angular/cdk': 20.0.0-rc.2(@angular/common@20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
+      '@angular/common': 20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
+      '@angular/core': 20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0)
+      '@angular/forms': 20.0.0(@angular/common@20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(@angular/platform-browser@20.0.0(@angular/animations@20.0.0(@angular/common@20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0)))(rxjs@7.8.2)
+      '@angular/platform-browser': 20.0.0(@angular/animations@20.0.0(@angular/common@20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))
       rxjs: 7.8.2
       tslib: 2.8.1
 
@@ -8349,35 +8325,35 @@ snapshots:
     transitivePeerDependencies:
       - encoding
 
-  '@angular/platform-browser@20.0.0-rc.0(@angular/animations@20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))':
+  '@angular/platform-browser@20.0.0(@angular/animations@20.0.0(@angular/common@20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))':
     dependencies:
-      '@angular/common': 20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
-      '@angular/core': 20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)
+      '@angular/common': 20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
+      '@angular/core': 20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0)
       tslib: 2.8.1
     optionalDependencies:
-      '@angular/animations': 20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))
+      '@angular/animations': 20.0.0(@angular/common@20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))
 
-  '@angular/platform-server@20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/compiler@20.0.0-rc.0)(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(@angular/platform-browser@20.0.0-rc.0(@angular/animations@20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)))(rxjs@7.8.2)':
+  '@angular/platform-server@20.0.0(@angular/common@20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/compiler@20.0.0)(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(@angular/platform-browser@20.0.0(@angular/animations@20.0.0(@angular/common@20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0)))(rxjs@7.8.2)':
     dependencies:
-      '@angular/common': 20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
-      '@angular/compiler': 20.0.0-rc.0
-      '@angular/core': 20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)
-      '@angular/platform-browser': 20.0.0-rc.0(@angular/animations@20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))
+      '@angular/common': 20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
+      '@angular/compiler': 20.0.0
+      '@angular/core': 20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0)
+      '@angular/platform-browser': 20.0.0(@angular/animations@20.0.0(@angular/common@20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))
       rxjs: 7.8.2
       tslib: 2.8.1
       xhr2: 0.2.1
 
-  '@angular/router@20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(@angular/platform-browser@20.0.0-rc.0(@angular/animations@20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)))(rxjs@7.8.2)':
+  '@angular/router@20.0.0(@angular/common@20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(@angular/platform-browser@20.0.0(@angular/animations@20.0.0(@angular/common@20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0)))(rxjs@7.8.2)':
     dependencies:
-      '@angular/common': 20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
-      '@angular/core': 20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)
-      '@angular/platform-browser': 20.0.0-rc.0(@angular/animations@20.0.0-rc.0(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))
+      '@angular/common': 20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)
+      '@angular/core': 20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0)
+      '@angular/platform-browser': 20.0.0(@angular/animations@20.0.0(@angular/common@20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))
       rxjs: 7.8.2
       tslib: 2.8.1
 
-  '@angular/service-worker@20.0.0-rc.0(@angular/core@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)':
+  '@angular/service-worker@20.0.0(@angular/core@20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)':
     dependencies:
-      '@angular/core': 20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.0)
+      '@angular/core': 20.0.0(@angular/compiler@20.0.0)(rxjs@7.8.2)(zone.js@0.15.0)
       rxjs: 7.8.2
       tslib: 2.8.1
 
@@ -8397,26 +8373,6 @@ snapshots:
 
   '@babel/compat-data@7.27.2': {}
 
-  '@babel/core@7.26.10':
-    dependencies:
-      '@ampproject/remapping': 2.3.0
-      '@babel/code-frame': 7.27.1
-      '@babel/generator': 7.27.1
-      '@babel/helper-compilation-targets': 7.27.2
-      '@babel/helper-module-transforms': 7.27.1(@babel/core@7.26.10)
-      '@babel/helpers': 7.27.1
-      '@babel/parser': 7.27.2
-      '@babel/template': 7.27.2
-      '@babel/traverse': 7.27.1
-      '@babel/types': 7.27.1
-      convert-source-map: 2.0.0
-      debug: 4.4.0(supports-color@10.0.0)
-      gensync: 1.0.0-beta.2
-      json5: 2.2.3
-      semver: 6.3.1
-    transitivePeerDependencies:
-      - supports-color
-
   '@babel/core@7.27.1':
     dependencies:
       '@ampproject/remapping': 2.3.0
@@ -8502,15 +8458,6 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@babel/helper-module-transforms@7.27.1(@babel/core@7.26.10)':
-    dependencies:
-      '@babel/core': 7.26.10
-      '@babel/helper-module-imports': 7.27.1
-      '@babel/helper-validator-identifier': 7.27.1
-      '@babel/traverse': 7.27.1
-    transitivePeerDependencies:
-      - supports-color
-
   '@babel/helper-module-transforms@7.27.1(@babel/core@7.27.1)':
     dependencies:
       '@babel/core': 7.27.1
@@ -11660,8 +11607,6 @@ snapshots:
       kind-of: 6.0.3
       shallow-clone: 3.0.1
 
-  clone@1.0.4: {}
-
   clone@2.1.2: {}
 
   co-body@6.2.0:
@@ -11704,10 +11649,12 @@ snapshots:
       table-layout: 4.1.1
       typical: 7.3.0
 
-  commander@13.1.0: {}
+  commander@14.0.0: {}
 
   commander@2.20.3: {}
 
+  common-path-prefix@3.0.0: {}
+
   commondir@1.0.1: {}
 
   compressible@2.0.18:
@@ -11950,10 +11897,6 @@ snapshots:
     dependencies:
       execa: 5.1.1
 
-  defaults@1.0.4:
-    dependencies:
-      clone: 1.0.4
-
   define-data-property@1.1.4:
     dependencies:
       es-define-property: 1.0.1
@@ -12690,16 +12633,17 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  find-cache-dir@3.3.2:
+  find-cache-directory@6.0.0:
     dependencies:
-      commondir: 1.0.1
-      make-dir: 3.1.0
-      pkg-dir: 4.2.0
+      common-path-prefix: 3.0.0
+      pkg-dir: 8.0.0
 
   find-replace@3.0.0:
     dependencies:
       array-back: 3.1.0
 
+  find-up-simple@1.0.1: {}
+
   find-up@4.1.0:
     dependencies:
       locate-path: 5.0.0
@@ -13351,8 +13295,6 @@ snapshots:
     dependencies:
       is-docker: 3.0.0
 
-  is-interactive@1.0.0: {}
-
   is-interactive@2.0.0: {}
 
   is-ip@3.1.0:
@@ -13438,8 +13380,6 @@ snapshots:
 
   is-typedarray@1.0.0: {}
 
-  is-unicode-supported@0.1.0: {}
-
   is-unicode-supported@1.3.0: {}
 
   is-unicode-supported@2.1.0: {}
@@ -13958,11 +13898,6 @@ snapshots:
 
   lodash@4.17.21: {}
 
-  log-symbols@4.1.0:
-    dependencies:
-      chalk: 4.1.2
-      is-unicode-supported: 0.1.0
-
   log-symbols@6.0.0:
     dependencies:
       chalk: 5.4.1
@@ -14025,10 +13960,6 @@ snapshots:
       semver: 5.7.2
     optional: true
 
-  make-dir@3.1.0:
-    dependencies:
-      semver: 6.3.1
-
   make-dir@4.0.0:
     dependencies:
       semver: 7.7.2
@@ -14236,25 +14167,25 @@ snapshots:
 
   netmask@2.0.2: {}
 
-  ng-packagr@20.0.0-rc.0(@angular/compiler-cli@20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(typescript@5.8.3))(tslib@2.8.1)(typescript@5.8.3):
+  ng-packagr@20.0.0(@angular/compiler-cli@20.0.0(@angular/compiler@20.0.0)(typescript@5.8.3))(tslib@2.8.1)(typescript@5.8.3):
     dependencies:
       '@ampproject/remapping': 2.3.0
-      '@angular/compiler-cli': 20.0.0-rc.0(@angular/compiler@20.0.0-rc.0)(typescript@5.8.3)
+      '@angular/compiler-cli': 20.0.0(@angular/compiler@20.0.0)(typescript@5.8.3)
       '@rollup/plugin-json': 6.1.0(rollup@4.40.2)
       '@rollup/wasm-node': 4.40.2
       ajv: 8.17.1
       ansi-colors: 4.1.3
       browserslist: 4.24.5
       chokidar: 4.0.3
-      commander: 13.1.0
+      commander: 14.0.0
       dependency-graph: 1.0.0
       esbuild: 0.25.5
-      find-cache-dir: 3.3.2
+      find-cache-directory: 6.0.0
       injection-js: 2.5.0
       jsonc-parser: 3.3.1
       less: 4.3.0
-      ora: 5.4.1
-      piscina: 4.9.2
+      ora: 8.2.0
+      piscina: 5.0.0
       postcss: 8.5.3
       rollup-plugin-dts: 6.2.1(rollup@4.40.2)(typescript@5.8.3)
       rxjs: 7.8.2
@@ -14471,18 +14402,6 @@ snapshots:
       type-check: 0.4.0
       word-wrap: 1.2.5
 
-  ora@5.4.1:
-    dependencies:
-      bl: 4.1.0
-      chalk: 4.1.2
-      cli-cursor: 3.1.0
-      cli-spinners: 2.9.2
-      is-interactive: 1.0.0
-      is-unicode-supported: 0.1.0
-      log-symbols: 4.1.0
-      strip-ansi: 6.0.1
-      wcwidth: 1.0.1
-
   ora@8.2.0:
     dependencies:
       chalk: 5.4.1
@@ -14705,19 +14624,15 @@ snapshots:
       sonic-boom: 4.2.0
       thread-stream: 3.1.0
 
-  piscina@4.9.2:
-    optionalDependencies:
-      '@napi-rs/nice': 1.0.1
-
   piscina@5.0.0:
     optionalDependencies:
       '@napi-rs/nice': 1.0.1
 
   pkce-challenge@5.0.0: {}
 
-  pkg-dir@4.2.0:
+  pkg-dir@8.0.0:
     dependencies:
-      find-up: 4.1.0
+      find-up-simple: 1.0.1
 
   pkginfo@0.4.1: {}
 
@@ -16370,10 +16285,6 @@ snapshots:
     dependencies:
       minimalistic-assert: 1.0.1
 
-  wcwidth@1.0.1:
-    dependencies:
-      defaults: 1.0.4
-
   weak-lru-cache@1.2.2:
     optional: true
 

From 510db3e93f6aa8daccc80dd0fcbc4dd0c3a3fcec Mon Sep 17 00:00:00 2001
From: Jan Martin <jan.krems@gmail.com>
Date: Wed, 28 May 2025 07:48:46 -0700
Subject: [PATCH 092/138] release: cut the v20.0.0 release

---
 CHANGELOG.md | 564 +++++++++++----------------------------------------
 package.json |   2 +-
 2 files changed, 118 insertions(+), 448 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index f28d5aa6c3e7..01b1ee5c38a4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,142 +1,134 @@
-<a name="20.0.0-rc.4"></a>
+<a name="20.0.0"></a>
 
-# 20.0.0-rc.4 (2025-05-27)
+# 20.0.0 (2025-05-28)
 
-### @schematics/angular
-
-| Commit                                                                                              | Type | Description                                                     |
-| --------------------------------------------------------------------------------------------------- | ---- | --------------------------------------------------------------- |
-| [bcc0892a6](https://github.com/angular/angular-cli/commit/bcc0892a65f00e68709e84c380f448a5e0fd05e7) | fix  | migrate `provideServerRoutesConfig` to `provideServerRendering` |
-
-### @angular/build
-
-| Commit                                                                                              | Type | Description                                     |
-| --------------------------------------------------------------------------------------------------- | ---- | ----------------------------------------------- |
-| [4c0d873b0](https://github.com/angular/angular-cli/commit/4c0d873b069b2671d7a0f98bcdc9b86ef48a8cd6) | fix  | include full metadata for AOT unit-testing      |
-| [5ff6188c4](https://github.com/angular/angular-cli/commit/5ff6188c4330b009201a64a23d0090bfcec0612f) | perf | directly check code for Angular partial linking |
-
-<!-- CHANGELOG SPLIT MARKER -->
-
-<a name="20.0.0-rc.3"></a>
-
-# 20.0.0-rc.3 (2025-05-21)
+## Breaking Changes
 
 ### @angular/cli
 
-| Commit                                                                                              | Type | Description                                          |
-| --------------------------------------------------------------------------------------------------- | ---- | ---------------------------------------------------- |
-| [787e510dc](https://github.com/angular/angular-cli/commit/787e510dccabf30589194fcefdb74a687dfa3945) | fix  | update min Node.js support to 20.19, 22.12, and 24.0 |
-
-### @schematics/angular
-
-| Commit                                                                                              | Type | Description                    |
-| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------ |
-| [b13805a77](https://github.com/angular/angular-cli/commit/b13805a77a5654a352a6c6f760965c326977ff14) | fix  | use protected for class member |
-
-### @angular-devkit/build-angular
-
-| Commit                                                                                              | Type | Description                                                   |
-| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------- |
-| [a42e045ba](https://github.com/angular/angular-cli/commit/a42e045bab3bfbeb0bb69c3406fd0a76ae263cdf) | fix  | respect i18nDuplicateTranslation option when duplicates exist |
-
-### @angular/build
-
-| Commit                                                                                              | Type | Description                                                  |
-| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------ |
-| [b155ba1dc](https://github.com/angular/angular-cli/commit/b155ba1dcdbc3c506311e4434c37f1b4c77c7572) | fix  | enable unit-test builder watch outside CI                    |
-| [7877d9a97](https://github.com/angular/angular-cli/commit/7877d9a971dbef5025fdb9a40f49f36e9b42569d) | fix  | ensure disabled vitest config loading                        |
-| [aec95042b](https://github.com/angular/angular-cli/commit/aec95042b4d690c25645af590788c608b4b353dc) | fix  | exclude only source test files with unit-test vitest support |
-| [c51a540ce](https://github.com/angular/angular-cli/commit/c51a540ce4fb191811d2be06a9937f11826b38a5) | fix  | provide direct debugging support for unit test builder       |
-| [eee816f79](https://github.com/angular/angular-cli/commit/eee816f79b4464286dcecc16f53c06be8afd4ccf) | fix  | use global unit-test hooks during TestBed init               |
+- Node.js v18 is no longer supported with Angular.
 
-### @angular/pwa
+  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.
 
-| Commit                                                                                              | Type | Description                                               |
-| --------------------------------------------------------------------------------------------------- | ---- | --------------------------------------------------------- |
-| [5b43174f1](https://github.com/angular/angular-cli/commit/5b43174f129d10648258ac33961a55f341649af6) | fix  | remove `background_color` and `theme_color` from manifest |
+- Node.js versions from 22.0 to 22.10 are no longer supported
 
-### @angular/ssr
+### @schematics/angular
 
-| Commit                                                                                              | Type | Description                               |
-| --------------------------------------------------------------------------------------------------- | ---- | ----------------------------------------- |
-| [059c10eb4](https://github.com/angular/angular-cli/commit/059c10eb4df72b0d67f73783826e2bbae611ad35) | fix  | SSR should work without `@angular/router` |
+- `--server-routing` option has been removed from several schematics. Server routing will be used when using the application builder.
 
-<!-- CHANGELOG SPLIT MARKER -->
+### @angular-devkit/schematics
 
-<a name="20.0.0-rc.2"></a>
+- The `NodePackageLinkTask` has been removed without a replacement. Create a custom task if needed.
 
-# 20.0.0-rc.2 (2025-05-14)
+  Note: This does not affect application developers.
 
 ### @angular/build
 
-| Commit                                                                                              | Type | Description                                          |
-| --------------------------------------------------------------------------------------------------- | ---- | ---------------------------------------------------- |
-| [d2bfc6bd4](https://github.com/angular/angular-cli/commit/d2bfc6bd4eb0892e9eb6205838158142b716d21c) | fix  | revert setup unit-test polyfills before TestBed init |
-
-<!-- CHANGELOG SPLIT MARKER -->
+- TypeScript versions less than 5.8 are no longer supported.
 
-<a name="20.0.0-rc.1"></a>
+### @schematics/angular
 
-# 20.0.0-rc.1 (2025-05-14)
+| 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                                                 |
-| --------------------------------------------------------------------------------------------------- | ---- | ----------------------------------------------------------- |
-| [5093ce0a6](https://github.com/angular/angular-cli/commit/5093ce0a6c85429a402fcccbdb63f1d1db75bcf6) | fix  | properly handle Node.js `require()` errors with ESM modules |
-
-### @schematics/angular
-
-| Commit                                                                                              | Type | Description                                           |
-| --------------------------------------------------------------------------------------------------- | ---- | ----------------------------------------------------- |
-| [3cf6ab0f7](https://github.com/angular/angular-cli/commit/3cf6ab0f77b23b8717e79b7125ea930cb018ebc5) | fix  | support using default browser option when not present |
+| 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/build
+### @angular-devkit/build-angular
 
 | Commit                                                                                              | Type | Description                                                   |
 | --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------- |
-| [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           |
-| [c7f2cb596](https://github.com/angular/angular-cli/commit/c7f2cb59684a264bb4ecab2024d8a8c58efbefa7) | fix  | provide vitest globals in unit-test builder                   |
-| [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               |
-
-<!-- CHANGELOG SPLIT MARKER -->
-
-<a name="20.0.0-rc.0"></a>
-
-# 20.0.0-rc.0 (2025-05-07)
-
-### @angular/cli
-
-| Commit                                                                                              | Type | Description                         |
-| --------------------------------------------------------------------------------------------------- | ---- | ----------------------------------- |
-| [e513cd4aa](https://github.com/angular/angular-cli/commit/e513cd4aa218e5ab634f05c18b6aa90f223e096c) | fix  | add Node.js 24 as supported version |
-
-### @schematics/angular
-
-| Commit                                                                                              | Type | Description                                        |
-| --------------------------------------------------------------------------------------------------- | ---- | -------------------------------------------------- |
-| [901ab60d9](https://github.com/angular/angular-cli/commit/901ab60d9f63fcff17213dbf7fe17e4a46835974) | fix  | remove explicit index option from new applications |
+| [a42e045ba](https://github.com/angular/angular-cli/commit/a42e045bab3bfbeb0bb69c3406fd0a76ae263cdf) | fix  | respect i18nDuplicateTranslation option when duplicates exist |
 
-### @angular-devkit/build-angular
+### @angular-devkit/schematics
 
-| Commit                                                                                              | Type | Description                                           |
-| --------------------------------------------------------------------------------------------------- | ---- | ----------------------------------------------------- |
-| [635999d4e](https://github.com/angular/angular-cli/commit/635999d4ef6045c50526193f1ead3dd4542a225b) | fix  | correctly set i18n subPath in webpack browser builder |
+| Commit                                                                                              | Type     | Description                             |
+| --------------------------------------------------------------------------------------------------- | -------- | --------------------------------------- |
+| [e6be37601](https://github.com/angular/angular-cli/commit/e6be37601d57f884a1ddf2cc1ddecf51819b9f51) | refactor | remove deprecated `NodePackageLinkTask` |
 
 ### @angular/build
 
-| Commit                                                                                              | Type | Description                                      |
-| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------ |
-| [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      |
-| [ffaf8aa19](https://github.com/angular/angular-cli/commit/ffaf8aa194ccb4b541c4c5291da5a58c86635f1d) | fix  | avoid attempting to watch bundler internal files |
-| [ba844ae16](https://github.com/angular/angular-cli/commit/ba844ae16922961cef306553e49ce91b856f94d2) | fix  | avoid internal karma request cache for assets    |
-| [7bb1f8747](https://github.com/angular/angular-cli/commit/7bb1f87478d441e35b73b920c8bfcd4376a3422d) | fix  | enable unit-test reporters option                |
-| [1cd65a08d](https://github.com/angular/angular-cli/commit/1cd65a08d5278134115f33ff0e666aee420faf8a) | fix  | perform testing module cleanup when using Vitest |
-| [22ba07444](https://github.com/angular/angular-cli/commit/22ba07444192872278c7508b4af084fd39f9b3bd) | perf | fix unnecessary esbuild rebuilds                 |
+| 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
 
@@ -144,33 +136,24 @@
 | --------------------------------------------------------------------------------------------------- | ---- | --------------------------------------------------- |
 | [fa0a06f9f](https://github.com/angular/angular-cli/commit/fa0a06f9f92b28929fc775074245a0b97c3d9adc) | fix  | support using default index option when not present |
 
-<!-- CHANGELOG SPLIT MARKER -->
-
-<a name="20.0.0-next.9"></a>
-
-# 20.0.0-next.9 (2025-04-30)
-
-### @schematics/angular
-
-| Commit                                                                                              | Type | Description                                              |
-| --------------------------------------------------------------------------------------------------- | ---- | -------------------------------------------------------- |
-| [5876577af](https://github.com/angular/angular-cli/commit/5876577af163b534846e720b0184558197dce741) | feat | Add prompt for new apps to be zoneless                   |
-| [c557a19ef](https://github.com/angular/angular-cli/commit/c557a19ef4eed9f2d805bb235d3819c69a1aaef6) | fix  | avoid empty polyfill option for new zoneless application |
-| [148498c2b](https://github.com/angular/angular-cli/commit/148498c2bcd0feb495dc0aa14b6a4555ac01facb) | fix  | Remove experimental from zoneless                        |
-| [0f7dc2cd8](https://github.com/angular/angular-cli/commit/0f7dc2cd8f76f928e64e734563a433ff6a0d478c) | fix  | skip spec project reference for minimal ng new           |
-
-### @angular/build
+### @angular/ssr
 
-| Commit                                                                                              | Type | Description                                                                |
-| --------------------------------------------------------------------------------------------------- | ---- | -------------------------------------------------------------------------- |
-| [d6ea6b09f](https://github.com/angular/angular-cli/commit/d6ea6b09f182433f859a78d4a4d38a9db521e593) | feat | add experimental vitest browser support to unit-testing                    |
-| [05485ede7](https://github.com/angular/angular-cli/commit/05485ede7b472f98120c51f28bd485eeb635bac2) | fix  | ensure `com.chrome.devtools.json` is consistently served after initial run |
+| 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                                                |
 
-### @angular/ssr
+### @ngtools/webpack
 
-| Commit                                                                                              | Type | Description                              |
-| --------------------------------------------------------------------------------------------------- | ---- | ---------------------------------------- |
-| [2d11e8e45](https://github.com/angular/angular-cli/commit/2d11e8e45b29cf879ee72ffbcf438198d73ffaba) | fix  | return 302 when redirectTo is a function |
+| Commit                                                                                              | Type | Description                                               |
+| --------------------------------------------------------------------------------------------------- | ---- | --------------------------------------------------------- |
+| [427bd846f](https://github.com/angular/angular-cli/commit/427bd846f552b393cb969472a05488ac11d47e9f) | fix  | disable TypeScript composite option with Angular compiler |
 
 <!-- CHANGELOG SPLIT MARKER -->
 
@@ -198,51 +181,6 @@
 
 <!-- CHANGELOG SPLIT MARKER -->
 
-<a name="20.0.0-next.8"></a>
-
-# 20.0.0-next.8 (2025-04-23)
-
-### @schematics/angular
-
-| Commit                                                                                              | Type | Description                                            |
-| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------ |
-| [0ab1ddf63](https://github.com/angular/angular-cli/commit/0ab1ddf632b7305db28a2f87f5c6b099a44669f6) | feat | generate libraries using TypeScript project references |
-
-### @angular/build
-
-| Commit                                                                                              | Type | Description                                  |
-| --------------------------------------------------------------------------------------------------- | ---- | -------------------------------------------- |
-| [12def3a2e](https://github.com/angular/angular-cli/commit/12def3a2e907ca8e7d530cea1b39bba90e153144) | feat | add experimental vitest unit-testing support |
-
-<!-- CHANGELOG SPLIT MARKER -->
-
-<a name="20.0.0-next.7"></a>
-
-# 20.0.0-next.7 (2025-04-23)
-
-### @schematics/angular
-
-| 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            |
-
-### @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        |
-
-### @angular/ssr
-
-| Commit                                                                                              | Type | Description                                      |
-| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------ |
-| [8bfcae4c1](https://github.com/angular/angular-cli/commit/8bfcae4c1ba19c9bbd75ddb1ed61ddbf6fa2b76b) | fix  | support `getPrerenderParams` for wildcard routes |
-
-<!-- CHANGELOG SPLIT MARKER -->
-
 <a name="19.2.9"></a>
 
 # 19.2.9 (2025-04-23)
@@ -279,29 +217,6 @@
 
 <!-- CHANGELOG SPLIT MARKER -->
 
-<a name="20.0.0-next.6"></a>
-
-# 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 |
-
-<!-- CHANGELOG SPLIT MARKER -->
-
 <a name="19.2.8"></a>
 
 # 19.2.8 (2025-04-16)
@@ -317,46 +232,6 @@
 
 <!-- CHANGELOG SPLIT MARKER -->
 
-<a name="20.0.0-next.5"></a>
-
-# 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 |
-
-<!-- CHANGELOG SPLIT MARKER -->
-
 <a name="19.2.7"></a>
 
 # 19.2.7 (2025-04-09)
@@ -395,32 +270,6 @@
 
 <!-- CHANGELOG SPLIT MARKER -->
 
-<a name="20.0.0-next.4"></a>
-
-# 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    |
-
-<!-- CHANGELOG SPLIT MARKER -->
-
 <a name="19.2.6"></a>
 
 # 19.2.6 (2025-04-02)
@@ -464,49 +313,6 @@
 
 <!-- CHANGELOG SPLIT MARKER -->
 
-<a name="20.0.0-next.3"></a>
-
-# 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          |
-
-<!-- CHANGELOG SPLIT MARKER -->
-
 <a name="19.2.5"></a>
 
 # 19.2.5 (2025-03-26)
@@ -552,47 +358,6 @@
 
 <!-- CHANGELOG SPLIT MARKER -->
 
-<a name="20.0.0-next.2"></a>
-
-# 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 |
-
-<!-- CHANGELOG SPLIT MARKER -->
-
 <a name="19.2.4"></a>
 
 # 19.2.4 (2025-03-19)
@@ -648,49 +413,6 @@
 
 <!-- CHANGELOG SPLIT MARKER -->
 
-<a name="20.0.0-next.1"></a>
-
-# 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 |
-
-<!-- CHANGELOG SPLIT MARKER -->
-
 <a name="19.2.2"></a>
 
 # 19.2.2 (2025-03-12)
@@ -718,58 +440,6 @@
 
 <!-- CHANGELOG SPLIT MARKER -->
 
-<a name="20.0.0-next.0"></a>
-
-# 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 |
-
-<!-- CHANGELOG SPLIT MARKER -->
-
 <a name="19.2.1"></a>
 
 # 19.2.1 (2025-03-05)
diff --git a/package.json b/package.json
index 0c0e35aa455c..af8ea1d9c5fe 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@angular/devkit-repo",
-  "version": "20.0.0-rc.4",
+  "version": "20.0.0",
   "private": true,
   "description": "Software Development Kit for Angular",
   "keywords": [

From e5efdc577be913870b29173345b8194b87420474 Mon Sep 17 00:00:00 2001
From: Charles Lyding <19598772+clydin@users.noreply.github.com>
Date: Thu, 29 May 2025 09:24:14 -0400
Subject: [PATCH 093/138] fix(@angular/build): also disable outputMode in
 vitest unit-tests

Application defined entry points (`browser`/`server`) are disabled when
using the experimental unit-test builder. This allows the unit test files
themselves to become the entry points for testing purposes. Previously,
the `outputMode` option was not also disabled. This lead to errors if it
was present in the build target configuration used for `unit-test` due to
the `outputMode` option requiring the `server` option.

(cherry picked from commit 020527e9dbfe09980b9d79442cb4e60b0bb8c34f)
---
 packages/angular/build/src/builders/unit-test/builder.ts | 1 +
 1 file changed, 1 insertion(+)

diff --git a/packages/angular/build/src/builders/unit-test/builder.ts b/packages/angular/build/src/builders/unit-test/builder.ts
index 1fb1aa06a1b2..84b41f1a280a 100644
--- a/packages/angular/build/src/builders/unit-test/builder.ts
+++ b/packages/angular/build/src/builders/unit-test/builder.ts
@@ -122,6 +122,7 @@ export async function* execute(
     index: false,
     browser: undefined,
     server: undefined,
+    outputMode: undefined,
     localize: false,
     budgets: [],
     serviceWorker: false,

From 525ddcbd290525e4dac2547c352cf6c774d728a2 Mon Sep 17 00:00:00 2001
From: Charles Lyding <19598772+clydin@users.noreply.github.com>
Date: Thu, 29 May 2025 12:31:54 -0400
Subject: [PATCH 094/138] fix(@schematics/angular): only overwrite JSON file if
 actually changed

The JSON file helper utility used within the Angular schematics now
contains additional checks when attempting to modify a file to avoid
overwriting a file if no actual changes will occur after a modify request.

(cherry picked from commit 664e6c7286c13e61eadfd693162edac4e471ab5b)
---
 packages/schematics/angular/utility/json-file.ts | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/packages/schematics/angular/utility/json-file.ts b/packages/schematics/angular/utility/json-file.ts
index dffb7a94f997..e7c767745b90 100644
--- a/packages/schematics/angular/utility/json-file.ts
+++ b/packages/schematics/angular/utility/json-file.ts
@@ -95,9 +95,16 @@ export class JSONFile {
       },
     });
 
-    this.content = applyEdits(this.content, edits);
-    this.host.overwrite(this.path, this.content);
-    this._jsonAst = undefined;
+    if (edits.length > 0) {
+      const editedContent = applyEdits(this.content, edits);
+
+      // Update the file content if it changed
+      if (editedContent !== this.content) {
+        this.content = editedContent;
+        this.host.overwrite(this.path, editedContent);
+        this._jsonAst = undefined;
+      }
+    }
   }
 
   remove(jsonPath: JSONPath): void {

From 83c820e5ab55d01662417a51e4cc8d094e409fc6 Mon Sep 17 00:00:00 2001
From: Charles Lyding <19598772+clydin@users.noreply.github.com>
Date: Thu, 29 May 2025 10:15:56 -0400
Subject: [PATCH 095/138] fix(@schematics/angular): remove karma config devkit
 package usages during application migration

When performing an `ng update` to Angular v20, the application migration
will detect the usage of the `karma` builder's `karmaConfig` option and
attempt to remove usages of the no longer needed `@angular-devkit/build-angular`
karma framework and plugin usage. While the karma framework usage will be
specifically ignored when using the `@angular/build:karma` builder, the
plugin usage leverages a direct `require` within the configuration file.
Regardless of the ability of the builder to ignore, neither usage is
needed with `@angular/build:karma` and removing the code aligns
with what would be generated by `ng generate config karma`.

(cherry picked from commit a2aba4c4b90e3ea227b3c3c74b8faba7de01fe22)
---
 .../use-application-builder/migration.ts      | 38 +++++++-
 .../use-application-builder/migration_spec.ts | 97 +++++++++++++++++++
 2 files changed, 134 insertions(+), 1 deletion(-)

diff --git a/packages/schematics/angular/migrations/use-application-builder/migration.ts b/packages/schematics/angular/migrations/use-application-builder/migration.ts
index 396ba48430d2..6a59c212fa21 100644
--- a/packages/schematics/angular/migrations/use-application-builder/migration.ts
+++ b/packages/schematics/angular/migrations/use-application-builder/migration.ts
@@ -232,6 +232,8 @@ function updateProjects(tree: Tree, context: SchematicContext) {
 
     // Use @angular/build directly if there is no devkit package usage
     if (!hasAngularDevkitUsage) {
+      const karmaConfigFiles = new Set<string>();
+
       for (const [, target] of allWorkspaceTargets(workspace)) {
         switch (target.builder) {
           case Builders.Application:
@@ -245,9 +247,15 @@ function updateProjects(tree: Tree, context: SchematicContext) {
             break;
           case Builders.Karma:
             target.builder = '@angular/build:karma';
-            // Remove "builderMode" option since the builder will always use "application"
             for (const [, karmaOptions] of allTargetOptions(target)) {
+              // Remove "builderMode" option since the builder will always use "application"
               delete karmaOptions['builderMode'];
+
+              // Collect custom karma configurations for @angular-devkit/build-angular plugin removal
+              const karmaConfig = karmaOptions['karmaConfig'];
+              if (karmaConfig && typeof karmaConfig === 'string') {
+                karmaConfigFiles.add(karmaConfig);
+              }
             }
             break;
           case Builders.NgPackagr:
@@ -292,6 +300,34 @@ function updateProjects(tree: Tree, context: SchematicContext) {
           }),
         );
       }
+
+      for (const karmaConfigFile of karmaConfigFiles) {
+        if (!tree.exists(karmaConfigFile)) {
+          continue;
+        }
+
+        try {
+          const originalKarmaConfigText = tree.readText(karmaConfigFile);
+          const updatedKarmaConfigText = originalKarmaConfigText
+            .replaceAll(`require('@angular-devkit/build-angular/plugins/karma'),`, '')
+            .replaceAll(`require('@angular-devkit/build-angular/plugins/karma')`, '');
+
+          if (updatedKarmaConfigText.includes('@angular-devkit/build-angular/plugins')) {
+            throw new Error(
+              'Migration does not support found usage of "@angular-devkit/build-angular".',
+            );
+          } else {
+            tree.overwrite(karmaConfigFile, updatedKarmaConfigText);
+          }
+        } catch (error) {
+          const reason = error instanceof Error ? `Reason: ${error.message}` : '';
+          context.logger.warn(
+            `Unable to update custom karma configuration file ("${karmaConfigFile}"). ` +
+              reason +
+              '\nReferences to the "@angular-devkit/build-angular" package within the file may need to be removed manually.',
+          );
+        }
+      }
     }
 
     return chain(rules);
diff --git a/packages/schematics/angular/migrations/use-application-builder/migration_spec.ts b/packages/schematics/angular/migrations/use-application-builder/migration_spec.ts
index 3adef7d419eb..a8d50193958e 100644
--- a/packages/schematics/angular/migrations/use-application-builder/migration_spec.ts
+++ b/packages/schematics/angular/migrations/use-application-builder/migration_spec.ts
@@ -130,6 +130,103 @@ describe(`Migration to use the application builder`, () => {
     expect(builderMode).toBeUndefined();
   });
 
+  it(`should update file for 'karmaConfig' karma option (no require trailing comma)`, async () => {
+    addWorkspaceTarget(tree, 'test', {
+      'builder': Builders.Karma,
+      'options': {
+        'karmaConfig': './karma.conf.js',
+        'polyfills': ['zone.js', 'zone.js/testing'],
+        'tsConfig': 'projects/app-a/tsconfig.spec.json',
+      },
+    });
+    tree.create(
+      './karma.conf.js',
+      `
+        module.exports = function (config) {
+          config.set({
+            basePath: '',
+            frameworks: ['jasmine', '@angular-devkit/build-angular'],
+            plugins: [
+              require('karma-jasmine'),
+              require('karma-chrome-launcher'),
+              require('karma-jasmine-html-reporter'),
+              require('karma-coverage'),
+              require('@angular-devkit/build-angular/plugins/karma')
+            ]
+          });
+        };`,
+    );
+
+    const newTree = await schematicRunner.runSchematic(schematicName, {}, tree);
+    const {
+      projects: { app },
+    } = JSON.parse(newTree.readContent('/angular.json'));
+
+    const { karmaConfig } = app.architect['test'].options;
+    expect(karmaConfig).toBe('./karma.conf.js');
+
+    const karmaConfigText = newTree.readText('./karma.conf.js');
+    expect(karmaConfigText).not.toContain(`require('@angular-devkit/build-angular/plugins/karma')`);
+  });
+
+  it(`should update file for 'karmaConfig' karma option (require trailing comma)`, async () => {
+    addWorkspaceTarget(tree, 'test', {
+      'builder': Builders.Karma,
+      'options': {
+        'karmaConfig': './karma.conf.js',
+        'polyfills': ['zone.js', 'zone.js/testing'],
+        'tsConfig': 'projects/app-a/tsconfig.spec.json',
+      },
+    });
+    tree.create(
+      './karma.conf.js',
+      `
+        module.exports = function (config) {
+          config.set({
+            basePath: '',
+            frameworks: ['jasmine', '@angular-devkit/build-angular'],
+            plugins: [
+              require('karma-jasmine'),
+              require('karma-chrome-launcher'),
+              require('karma-jasmine-html-reporter'),
+              require('karma-coverage'),
+              require('@angular-devkit/build-angular/plugins/karma'),
+            ]
+          });
+        };`,
+    );
+
+    const newTree = await schematicRunner.runSchematic(schematicName, {}, tree);
+    const {
+      projects: { app },
+    } = JSON.parse(newTree.readContent('/angular.json'));
+
+    const { karmaConfig } = app.architect['test'].options;
+    expect(karmaConfig).toBe('./karma.conf.js');
+
+    const karmaConfigText = newTree.readText('./karma.conf.js');
+    expect(karmaConfigText).not.toContain(`require('@angular-devkit/build-angular/plugins/karma')`);
+  });
+
+  it(`should ignore missing file for 'karmaConfig' karma option`, async () => {
+    addWorkspaceTarget(tree, 'test', {
+      'builder': Builders.Karma,
+      'options': {
+        'karmaConfig': './karma.conf.js',
+        'polyfills': ['zone.js', 'zone.js/testing'],
+        'tsConfig': 'projects/app-a/tsconfig.spec.json',
+      },
+    });
+
+    const newTree = await schematicRunner.runSchematic(schematicName, {}, tree);
+    const {
+      projects: { app },
+    } = JSON.parse(newTree.readContent('/angular.json'));
+
+    const { karmaConfig } = app.architect['test'].options;
+    expect(karmaConfig).toBe('./karma.conf.js');
+  });
+
   it('should remove tilde prefix from CSS @import specifiers', async () => {
     // Replace outputPath
     tree.create(

From 5814393dbb2f9227ce10f1df77a8deee06c7d1c5 Mon Sep 17 00:00:00 2001
From: Charles Lyding <19598772+clydin@users.noreply.github.com>
Date: Mon, 2 Jun 2025 12:27:47 -0400
Subject: [PATCH 096/138] fix(@angular/build): resolve junit karma reporter
 output to workspace root

To maintain behavior with the Webpack-based karma unit-testing available
via `@angular-devkit/build-angular`, the application build system based
karma testing will now resolve the output directory location of the junit
karma reporter to the same workspace root location.  This is only performed
if the `junit` reporter is enabled and the reporter's `outputDir` option
is not an absolute path.

(cherry picked from commit bec42f70c518144917999f7efdcee11554a34755)
---
 .../src/builders/karma/application_builder.ts | 29 +++++++++++++++++++
 .../e2e/tests/test/karma-junit-output.ts      | 27 +++++++++++++++++
 2 files changed, 56 insertions(+)
 create mode 100644 tests/legacy-cli/e2e/tests/test/karma-junit-output.ts

diff --git a/packages/angular/build/src/builders/karma/application_builder.ts b/packages/angular/build/src/builders/karma/application_builder.ts
index fc92ed59dbc0..55a10b37c54e 100644
--- a/packages/angular/build/src/builders/karma/application_builder.ts
+++ b/packages/angular/build/src/builders/karma/application_builder.ts
@@ -577,6 +577,35 @@ async function initializeApplication(
   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/tests/legacy-cli/e2e/tests/test/karma-junit-output.ts b/tests/legacy-cli/e2e/tests/test/karma-junit-output.ts
new file mode 100644
index 000000000000..056adea26ab3
--- /dev/null
+++ b/tests/legacy-cli/e2e/tests/test/karma-junit-output.ts
@@ -0,0 +1,27 @@
+import { expectFileMatchToExist, replaceInFile } from '../../utils/fs';
+import { installPackage } from '../../utils/packages';
+import { silentNg } from '../../utils/process';
+
+const E2E_CUSTOM_LAUNCHER = `
+  customLaunchers: {
+    ChromeHeadlessNoSandbox: {
+      base: 'ChromeHeadless',
+      flags: ['--no-sandbox', '--headless', '--disable-gpu', '--disable-dev-shm-usage'],
+    },
+  },
+  restartOnFileChange: true,
+`;
+
+export default async function () {
+  await installPackage('karma-junit-reporter');
+  await silentNg('generate', 'config', 'karma');
+
+  await replaceInFile('karma.conf.js', 'karma-jasmine-html-reporter', 'karma-junit-reporter');
+  await replaceInFile('karma.conf.js', `'kjhtml'`, `'junit'`);
+
+  await replaceInFile('karma.conf.js', `restartOnFileChange: true`, E2E_CUSTOM_LAUNCHER);
+
+  await silentNg('test', '--no-watch');
+
+  await expectFileMatchToExist('.', /TESTS\-.+\.xml/);
+}

From 87266b38a09ce783ac6d18f532ebe1f8ae5954c0 Mon Sep 17 00:00:00 2001
From: Charles Lyding <19598772+clydin@users.noreply.github.com>
Date: Thu, 29 May 2025 16:48:32 -0400
Subject: [PATCH 097/138] fix(@schematics/angular): skip zone.js dependency for
 zoneless applications

A newly generated application no longer adds the `zone.js` dependency to
the workspace if the `zoneless` option is enabled.

(cherry picked from commit 7ca250a5617379eff57f5b50b0b55d0df31cc1af)
---
 .../schematics/angular/application/index.ts   |  8 ++++
 .../angular/application/index_spec.ts         | 42 +++++++++++++++++++
 packages/schematics/angular/library/index.ts  | 13 ++++--
 .../schematics/angular/library/index_spec.ts  |  7 ++++
 .../workspace/files/package.json.template     |  3 +-
 .../angular/workspace/index_spec.ts           |  1 -
 6 files changed, 68 insertions(+), 6 deletions(-)

diff --git a/packages/schematics/angular/application/index.ts b/packages/schematics/angular/application/index.ts
index 825f98c04158..14c0688cf334 100644
--- a/packages/schematics/angular/application/index.ts
+++ b/packages/schematics/angular/application/index.ts
@@ -149,6 +149,14 @@ function addDependenciesToPackageJson(options: ApplicationOptions) {
       },
     ].forEach((dependency) => addPackageJsonDependency(host, dependency));
 
+    if (!options.zoneless) {
+      addPackageJsonDependency(host, {
+        type: NodeDependencyType.Default,
+        name: 'zone.js',
+        version: latestVersions['zone.js'],
+      });
+    }
+
     if (!options.skipInstall) {
       context.addTask(new NodePackageInstallTask());
     }
diff --git a/packages/schematics/angular/application/index_spec.ts b/packages/schematics/angular/application/index_spec.ts
index 458f91d6eef0..60700c9f45ff 100644
--- a/packages/schematics/angular/application/index_spec.ts
+++ b/packages/schematics/angular/application/index_spec.ts
@@ -268,6 +268,48 @@ describe('Application Schematic', () => {
       expect(pkg.devDependencies['typescript']).toEqual(latestVersions['typescript']);
     });
 
+    it('should include zone.js if "zoneless" option is false', async () => {
+      const tree = await schematicRunner.runSchematic(
+        'application',
+        {
+          ...defaultOptions,
+          zoneless: false,
+        },
+        workspaceTree,
+      );
+
+      const pkg = JSON.parse(tree.readContent('/package.json'));
+      expect(pkg.dependencies['zone.js']).toEqual(latestVersions['zone.js']);
+    });
+
+    it('should include zone.js if "zoneless" option is not present', async () => {
+      const tree = await schematicRunner.runSchematic(
+        'application',
+        {
+          ...defaultOptions,
+          zoneless: undefined,
+        },
+        workspaceTree,
+      );
+
+      const pkg = JSON.parse(tree.readContent('/package.json'));
+      expect(pkg.dependencies['zone.js']).toEqual(latestVersions['zone.js']);
+    });
+
+    it('should not include zone.js if "zoneless" option is true', async () => {
+      const tree = await schematicRunner.runSchematic(
+        'application',
+        {
+          ...defaultOptions,
+          zoneless: true,
+        },
+        workspaceTree,
+      );
+
+      const pkg = JSON.parse(tree.readContent('/package.json'));
+      expect(pkg.dependencies['zone.js']).toBeUndefined();
+    });
+
     it(`should not override existing users dependencies`, async () => {
       const oldPackageJson = workspaceTree.readContent('package.json');
       workspaceTree.overwrite(
diff --git a/packages/schematics/angular/library/index.ts b/packages/schematics/angular/library/index.ts
index b409d986dd57..d96cc8b505a8 100644
--- a/packages/schematics/angular/library/index.ts
+++ b/packages/schematics/angular/library/index.ts
@@ -22,7 +22,11 @@ import {
 } from '@angular-devkit/schematics';
 import { NodePackageInstallTask } from '@angular-devkit/schematics/tasks';
 import { join } from 'node:path/posix';
-import { NodeDependencyType, addPackageJsonDependency } from '../utility/dependencies';
+import {
+  NodeDependencyType,
+  addPackageJsonDependency,
+  getPackageJsonDependency,
+} from '../utility/dependencies';
 import { JSONFile } from '../utility/json-file';
 import { latestVersions } from '../utility/latest-versions';
 import { relativePathToWorkspaceRoot } from '../utility/paths';
@@ -96,6 +100,7 @@ function addLibToWorkspaceFile(
   options: LibraryOptions,
   projectRoot: string,
   projectName: string,
+  hasZoneDependency: boolean,
 ): Rule {
   return updateWorkspace((workspace) => {
     workspace.projects.add({
@@ -121,7 +126,7 @@ function addLibToWorkspaceFile(
           builder: Builders.BuildKarma,
           options: {
             tsConfig: `${projectRoot}/tsconfig.spec.json`,
-            polyfills: ['zone.js', 'zone.js/testing'],
+            polyfills: hasZoneDependency ? ['zone.js', 'zone.js/testing'] : undefined,
           },
         },
       },
@@ -172,9 +177,11 @@ export default function (options: LibraryOptions): Rule {
       move(libDir),
     ]);
 
+    const hasZoneDependency = getPackageJsonDependency(host, 'zone.js') !== null;
+
     return chain([
       mergeWith(templateSource),
-      addLibToWorkspaceFile(options, libDir, packageName),
+      addLibToWorkspaceFile(options, libDir, packageName, hasZoneDependency),
       options.skipPackageJson ? noop() : addDependenciesToPackageJson(),
       options.skipTsConfig ? noop() : updateTsConfig(packageName, './' + distRoot),
       options.skipTsConfig
diff --git a/packages/schematics/angular/library/index_spec.ts b/packages/schematics/angular/library/index_spec.ts
index 1d5503d70b38..97e517767f1f 100644
--- a/packages/schematics/angular/library/index_spec.ts
+++ b/packages/schematics/angular/library/index_spec.ts
@@ -195,6 +195,13 @@ describe('Library Schematic', () => {
     expect(workspace.projects.foo.prefix).toEqual('pre');
   });
 
+  it(`should not add zone.js to test polyfills when no zone.js dependency`, async () => {
+    const tree = await schematicRunner.runSchematic('library', defaultOptions, workspaceTree);
+
+    const workspace = getJsonFileContent(tree, '/angular.json');
+    expect(workspace.projects.foo.architect.test.options.polyfills).toBeUndefined();
+  });
+
   it('should handle a pascalCasedName', async () => {
     const options = { ...defaultOptions, name: 'pascalCasedName' };
     const tree = await schematicRunner.runSchematic('library', options, workspaceTree);
diff --git a/packages/schematics/angular/workspace/files/package.json.template b/packages/schematics/angular/workspace/files/package.json.template
index 4ee0cdd9ab73..dcbe6939829d 100644
--- a/packages/schematics/angular/workspace/files/package.json.template
+++ b/packages/schematics/angular/workspace/files/package.json.template
@@ -17,8 +17,7 @@
     "@angular/platform-browser": "<%= latestVersions.Angular %>",
     "@angular/router": "<%= latestVersions.Angular %>",
     "rxjs": "<%= latestVersions['rxjs'] %>",
-    "tslib": "<%= latestVersions['tslib'] %>",
-    "zone.js": "<%= latestVersions['zone.js'] %>"
+    "tslib": "<%= latestVersions['tslib'] %>"
   },
   "devDependencies": {
     "@angular/cli": "<%= '^' + version %>",
diff --git a/packages/schematics/angular/workspace/index_spec.ts b/packages/schematics/angular/workspace/index_spec.ts
index 520452e71b89..21efd7275b82 100644
--- a/packages/schematics/angular/workspace/index_spec.ts
+++ b/packages/schematics/angular/workspace/index_spec.ts
@@ -58,7 +58,6 @@ describe('Workspace Schematic', () => {
     const pkg = JSON.parse(tree.readContent('/package.json'));
     expect(pkg.dependencies['@angular/core']).toEqual(latestVersions.Angular);
     expect(pkg.dependencies['rxjs']).toEqual(latestVersions['rxjs']);
-    expect(pkg.dependencies['zone.js']).toEqual(latestVersions['zone.js']);
     expect(pkg.devDependencies['typescript']).toEqual(latestVersions['typescript']);
   });
 

From 0883248cbdebcad09393349a0a5d9487b2a452ae Mon Sep 17 00:00:00 2001
From: Alan Agius <17563226+alan-agius4@users.noreply.github.com>
Date: Wed, 4 Jun 2025 09:53:57 +0000
Subject: [PATCH 098/138] fix(@angular/cli): improve Node.js version check and
 error messages

Enhances the Node.js version validation to include Node.js 22.12

(cherry picked from commit abe69ddb1ab3ec303a4d867a89853a75f2773067)
---
 packages/angular/cli/bin/ng.js | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

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',
   );
 

From 4e7e0b073f866eedf58bd1fc43be57b1b849cd88 Mon Sep 17 00:00:00 2001
From: Doug Parker <dgp1130@users.noreply.github.com>
Date: Wed, 4 Jun 2025 10:23:05 -0700
Subject: [PATCH 099/138] release: cut the v20.0.1 release

---
 CHANGELOG.md | 27 +++++++++++++++++++++++++++
 package.json |  2 +-
 2 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 01b1ee5c38a4..503b2567d3fc 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,30 @@
+<a name="20.0.1"></a>
+
+# 20.0.1 (2025-06-04)
+
+### @angular/cli
+
+| Commit                                                                                              | Type | Description                                      |
+| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------ |
+| [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                                           |
+| --------------------------------------------------------------------------------------------------- | ---- | ----------------------------------------------------- |
+| [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 |
+
+<!-- CHANGELOG SPLIT MARKER -->
+
 <a name="20.0.0"></a>
 
 # 20.0.0 (2025-05-28)
diff --git a/package.json b/package.json
index af8ea1d9c5fe..d21b5262a7a8 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@angular/devkit-repo",
-  "version": "20.0.0",
+  "version": "20.0.1",
   "private": true,
   "description": "Software Development Kit for Angular",
   "keywords": [

From d513e58d3d4efea02f0c4504f0ab0b29274e3cbb Mon Sep 17 00:00:00 2001
From: Alan Agius <17563226+alan-agius4@users.noreply.github.com>
Date: Thu, 5 Jun 2025 14:08:39 +0000
Subject: [PATCH 100/138] build: simplify unit test target names

Renamed unit test targets for easier execution without needing to inspect build files.

(cherry picked from commit 610a36702ef3d7867bef70b0403f0847c5e3904b)
---
 modules/testing/builder/BUILD.bazel                     | 2 +-
 packages/angular/cli/BUILD.bazel                        | 2 +-
 packages/angular/pwa/BUILD.bazel                        | 2 +-
 packages/angular/ssr/schematics/BUILD.bazel             | 2 +-
 packages/angular_devkit/architect/BUILD.bazel           | 2 +-
 packages/angular_devkit/architect/node/BUILD.bazel      | 2 +-
 packages/angular_devkit/build_angular/BUILD.bazel       | 2 +-
 packages/angular_devkit/core/BUILD.bazel                | 2 +-
 packages/angular_devkit/core/node/BUILD.bazel           | 2 +-
 packages/angular_devkit/schematics/BUILD.bazel          | 2 +-
 packages/angular_devkit/schematics/tools/BUILD.bazel    | 2 +-
 packages/angular_devkit/schematics_cli/test/BUILD.bazel | 2 +-
 packages/ngtools/webpack/BUILD.bazel                    | 2 +-
 packages/schematics/angular/BUILD.bazel                 | 2 +-
 tools/baseline_browserslist/BUILD.bazel                 | 2 +-
 15 files changed, 15 insertions(+), 15 deletions(-)

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/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/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/ssr/schematics/BUILD.bazel b/packages/angular/ssr/schematics/BUILD.bazel
index 34d4cb1591ec..b0d2d0b9cbd8 100644
--- a/packages/angular/ssr/schematics/BUILD.bazel
+++ b/packages/angular/ssr/schematics/BUILD.bazel
@@ -83,7 +83,7 @@ ts_project(
 )
 
 jasmine_test(
-    name = "ssr_schematics_test",
+    name = "test",
     data = [
         ":schematics_assets",
         ":ssr_schematics_test_lib",
diff --git a/packages/angular_devkit/architect/BUILD.bazel b/packages/angular_devkit/architect/BUILD.bazel
index b724096e4219..f76e44f93f9d 100644
--- a/packages/angular_devkit/architect/BUILD.bazel
+++ b/packages/angular_devkit/architect/BUILD.bazel
@@ -88,7 +88,7 @@ ts_project(
 )
 
 jasmine_test(
-    name = "architect_test",
+    name = "test",
     data = [":architect_test_lib"],
 )
 
diff --git a/packages/angular_devkit/architect/node/BUILD.bazel b/packages/angular_devkit/architect/node/BUILD.bazel
index 8cdaa1c72049..fad21dd46480 100644
--- a/packages/angular_devkit/architect/node/BUILD.bazel
+++ b/packages/angular_devkit/architect/node/BUILD.bazel
@@ -42,6 +42,6 @@ ts_project(
 )
 
 jasmine_test(
-    name = "node_test",
+    name = "test",
     data = [":node_test_lib"],
 )
diff --git a/packages/angular_devkit/build_angular/BUILD.bazel b/packages/angular_devkit/build_angular/BUILD.bazel
index 40884c857ee2..c4c283676ec4 100644
--- a/packages/angular_devkit/build_angular/BUILD.bazel
+++ b/packages/angular_devkit/build_angular/BUILD.bazel
@@ -235,7 +235,7 @@ ts_project(
 )
 
 jasmine_test(
-    name = "build_angular_test",
+    name = "test",
     data = [":build_angular_test_lib"],
 )
 
diff --git a/packages/angular_devkit/core/BUILD.bazel b/packages/angular_devkit/core/BUILD.bazel
index dc27e8e3f5c1..93892ecc3e2c 100644
--- a/packages/angular_devkit/core/BUILD.bazel
+++ b/packages/angular_devkit/core/BUILD.bazel
@@ -59,7 +59,7 @@ ts_project(
 )
 
 jasmine_test(
-    name = "core_test",
+    name = "test",
     data = [":core_test_lib"],
 )
 
diff --git a/packages/angular_devkit/core/node/BUILD.bazel b/packages/angular_devkit/core/node/BUILD.bazel
index a023a861589c..83e49baecd78 100644
--- a/packages/angular_devkit/core/node/BUILD.bazel
+++ b/packages/angular_devkit/core/node/BUILD.bazel
@@ -47,6 +47,6 @@ ts_project(
 )
 
 jasmine_test(
-    name = "node_test",
+    name = "test",
     data = [":node_test_lib"],
 )
diff --git a/packages/angular_devkit/schematics/BUILD.bazel b/packages/angular_devkit/schematics/BUILD.bazel
index d4376bc57d4a..0b1d0e0f781b 100644
--- a/packages/angular_devkit/schematics/BUILD.bazel
+++ b/packages/angular_devkit/schematics/BUILD.bazel
@@ -48,7 +48,7 @@ ts_project(
 )
 
 jasmine_test(
-    name = "schematics_test",
+    name = "test",
     data = [":schematics_test_lib"],
 )
 
diff --git a/packages/angular_devkit/schematics/tools/BUILD.bazel b/packages/angular_devkit/schematics/tools/BUILD.bazel
index 84d3bd9d8e54..f1b13a40ea77 100644
--- a/packages/angular_devkit/schematics/tools/BUILD.bazel
+++ b/packages/angular_devkit/schematics/tools/BUILD.bazel
@@ -52,6 +52,6 @@ ts_project(
 )
 
 jasmine_test(
-    name = "tools_test",
+    name = "test",
     data = [":tools_test_lib"],
 )
diff --git a/packages/angular_devkit/schematics_cli/test/BUILD.bazel b/packages/angular_devkit/schematics_cli/test/BUILD.bazel
index d75151c168ac..29eb34e8b7ea 100644
--- a/packages/angular_devkit/schematics_cli/test/BUILD.bazel
+++ b/packages/angular_devkit/schematics_cli/test/BUILD.bazel
@@ -21,7 +21,7 @@ npm_link_package(
 )
 
 jasmine_test(
-    name = "schematics_cli_test",
+    name = "test",
     data = [
         ":schematics_cli_test_lib",
         # The npm package itself is needed for the test at runtime, so we
diff --git a/packages/ngtools/webpack/BUILD.bazel b/packages/ngtools/webpack/BUILD.bazel
index 1a5b8b0b486d..eb75d42a0185 100644
--- a/packages/ngtools/webpack/BUILD.bazel
+++ b/packages/ngtools/webpack/BUILD.bazel
@@ -56,7 +56,7 @@ ts_project(
 )
 
 jasmine_test(
-    name = "webpack_test",
+    name = "test",
     data = [
         ":webpack_test_lib",
         # Needed at runtime for runtime TS compilations performed by tests.
diff --git a/packages/schematics/angular/BUILD.bazel b/packages/schematics/angular/BUILD.bazel
index 0e5ba72fed90..57887c2cf63d 100644
--- a/packages/schematics/angular/BUILD.bazel
+++ b/packages/schematics/angular/BUILD.bazel
@@ -138,7 +138,7 @@ ts_project(
 )
 
 jasmine_test(
-    name = "angular_test",
+    name = "test",
     data = [":angular_test_lib"],
 )
 
diff --git a/tools/baseline_browserslist/BUILD.bazel b/tools/baseline_browserslist/BUILD.bazel
index 34141cd15759..7680d4e021d0 100644
--- a/tools/baseline_browserslist/BUILD.bazel
+++ b/tools/baseline_browserslist/BUILD.bazel
@@ -32,7 +32,7 @@ ts_project(
 )
 
 jasmine_test(
-    name = "baseline_browserslist_test",
+    name = "test",
     data = [":baseline_browserslist_test_lib"],
 )
 

From 19dc7ddd54974bb2f15a81f4c21d496d0a11e8b0 Mon Sep 17 00:00:00 2001
From: Alan Agius <17563226+alan-agius4@users.noreply.github.com>
Date: Thu, 5 Jun 2025 14:32:40 +0000
Subject: [PATCH 101/138] build: simplify unit test target names

Renamed unit test targets for easier execution without needing to inspect build files.

(cherry picked from commit d2fa8ac4b69e4b90e1d8666244c31ecdc6124e44)
---
 .ng-dev/dx-perf-workflows.yml      | 2 +-
 packages/angular/build/BUILD.bazel | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/.ng-dev/dx-perf-workflows.yml b/.ng-dev/dx-perf-workflows.yml
index 21c8b95acff3..6b994f2b09c6 100644
--- a/.ng-dev/dx-perf-workflows.yml
+++ b/.ng-dev/dx-perf-workflows.yml
@@ -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/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"],
 )
 

From cb258a3e1525cda985109692fb88449259119ff2 Mon Sep 17 00:00:00 2001
From: Alan Agius <17563226+alan-agius4@users.noreply.github.com>
Date: Thu, 5 Jun 2025 14:13:54 +0000
Subject: [PATCH 102/138] fix(@schematics/angular): correctly detect modules
 using new file extension format

Previously, some internal methods failed to locate modules when using the `-module.ts` filename pattern instead of the legacy `.module.ts`. This update ensures proper detection with the new format.

(cherry picked from commit 0b7d48c7cafb49aa3cac7d9da831eff039b3e047)
---
 .../schematics/angular/component/index.ts     | 11 +----
 .../schematics/angular/directive/index.ts     | 10 +----
 packages/schematics/angular/module/index.ts   | 18 +++-----
 packages/schematics/angular/pipe/index.ts     | 11 +----
 .../schematics/angular/utility/find-module.ts | 43 ++++++++++++-------
 .../angular/utility/find-module_spec.ts       |  9 ++++
 6 files changed, 46 insertions(+), 56 deletions(-)

diff --git a/packages/schematics/angular/component/index.ts b/packages/schematics/angular/component/index.ts
index acbb82fadca6..359aa28fa94e 100644
--- a/packages/schematics/angular/component/index.ts
+++ b/packages/schematics/angular/component/index.ts
@@ -53,16 +53,7 @@ export default function (options: ComponentOptions): Rule {
       options.path = buildDefaultPath(project);
     }
 
-    try {
-      options.module = findModuleFromOptions(host, options);
-    } catch {
-      options.module = findModuleFromOptions(host, {
-        ...options,
-        moduleExt: '-module.ts',
-        routingModuleExt: '-routing-module.ts',
-      });
-    }
-
+    options.module = findModuleFromOptions(host, options);
     // Schematic templates require a defined type value
     options.type ??= '';
 
diff --git a/packages/schematics/angular/directive/index.ts b/packages/schematics/angular/directive/index.ts
index e05c64ca9e5b..77d68d2e3073 100644
--- a/packages/schematics/angular/directive/index.ts
+++ b/packages/schematics/angular/directive/index.ts
@@ -38,15 +38,7 @@ export default function (options: DirectiveOptions): Rule {
       options.path = buildDefaultPath(project);
     }
 
-    try {
-      options.module = findModuleFromOptions(host, options);
-    } catch {
-      options.module = findModuleFromOptions(host, {
-        ...options,
-        moduleExt: '-module.ts',
-        routingModuleExt: '-routing-module.ts',
-      });
-    }
+    options.module = findModuleFromOptions(host, options);
     const parsedPath = parseName(options.path, options.name);
     options.name = parsedPath.name;
     options.path = parsedPath.path;
diff --git a/packages/schematics/angular/module/index.ts b/packages/schematics/angular/module/index.ts
index f7657783d866..1a6065fedf95 100644
--- a/packages/schematics/angular/module/index.ts
+++ b/packages/schematics/angular/module/index.ts
@@ -27,7 +27,9 @@ import { addImportToModule, addRouteDeclarationToModule } from '../utility/ast-u
 import { InsertChange } from '../utility/change';
 import {
   MODULE_EXT,
+  MODULE_EXT_LEGACY,
   ROUTING_MODULE_EXT,
+  ROUTING_MODULE_EXT_LEGACY,
   buildRelativePath,
   findModuleFromOptions,
 } from '../utility/find-module';
@@ -114,11 +116,11 @@ function addRouteDeclarationToNgModule(
 
 function getRoutingModulePath(host: Tree, modulePath: string): string | undefined {
   const routingModulePath =
-    modulePath.endsWith(ROUTING_MODULE_EXT) || modulePath.endsWith('-routing-module.ts')
+    modulePath.endsWith(ROUTING_MODULE_EXT_LEGACY) || modulePath.endsWith(ROUTING_MODULE_EXT)
       ? modulePath
       : modulePath
-          .replace(MODULE_EXT, ROUTING_MODULE_EXT)
-          .replace('-module.ts', '-routing-module.ts');
+          .replace(MODULE_EXT_LEGACY, ROUTING_MODULE_EXT_LEGACY)
+          .replace(MODULE_EXT, ROUTING_MODULE_EXT);
 
   return host.exists(routingModulePath) ? routingModulePath : undefined;
 }
@@ -138,15 +140,7 @@ export default function (options: ModuleOptions): Rule {
     }
 
     if (options.module) {
-      try {
-        options.module = findModuleFromOptions(host, options);
-      } catch {
-        options.module = findModuleFromOptions(host, {
-          ...options,
-          moduleExt: '-module.ts',
-          routingModuleExt: '-routing-module.ts',
-        });
-      }
+      options.module = findModuleFromOptions(host, options);
     }
 
     let routingModulePath;
diff --git a/packages/schematics/angular/pipe/index.ts b/packages/schematics/angular/pipe/index.ts
index 150b0bc20c57..e266839cbcc2 100644
--- a/packages/schematics/angular/pipe/index.ts
+++ b/packages/schematics/angular/pipe/index.ts
@@ -18,16 +18,7 @@ import { Schema as PipeOptions } from './schema';
 export default function (options: PipeOptions): Rule {
   return async (host: Tree) => {
     options.path ??= await createDefaultPath(host, options.project);
-    try {
-      options.module = findModuleFromOptions(host, options);
-    } catch {
-      options.module = findModuleFromOptions(host, {
-        ...options,
-        moduleExt: '-module.ts',
-        routingModuleExt: '-routing-module.ts',
-      });
-    }
-
+    options.module = findModuleFromOptions(host, options);
     const parsedPath = parseName(options.path, options.name);
     options.name = parsedPath.name;
     options.path = parsedPath.path;
diff --git a/packages/schematics/angular/utility/find-module.ts b/packages/schematics/angular/utility/find-module.ts
index 69e10dc1368e..c98b52a0cbe2 100644
--- a/packages/schematics/angular/utility/find-module.ts
+++ b/packages/schematics/angular/utility/find-module.ts
@@ -20,8 +20,10 @@ export interface ModuleOptions {
   standalone?: boolean;
 }
 
-export const MODULE_EXT = '.module.ts';
-export const ROUTING_MODULE_EXT = '-routing.module.ts';
+export const MODULE_EXT = '-module.ts';
+export const ROUTING_MODULE_EXT = '-routing-module.ts';
+export const MODULE_EXT_LEGACY = '.module.ts';
+export const ROUTING_MODULE_EXT_LEGACY = '-routing.module.ts';
 
 /**
  * Find the module referred by a set of options passed to the schematics.
@@ -31,13 +33,10 @@ export function findModuleFromOptions(host: Tree, options: ModuleOptions): Path
     return undefined;
   }
 
-  const moduleExt = options.moduleExt || MODULE_EXT;
-  const routingModuleExt = options.routingModuleExt || ROUTING_MODULE_EXT;
-
   if (!options.module) {
     const pathToCheck = (options.path || '') + '/' + options.name;
 
-    return normalize(findModule(host, pathToCheck, moduleExt, routingModuleExt));
+    return normalize(findModule(host, pathToCheck, options.moduleExt, options.routingModuleExt));
   } else {
     const modulePath = normalize(`/${options.path}/${options.module}`);
     const componentPath = normalize(`/${options.path}/${options.name}`);
@@ -53,14 +52,21 @@ export function findModuleFromOptions(host: Tree, options: ModuleOptions): Path
     }
 
     const candidatesDirs = [...candidateSet].sort((a, b) => b.length - a.length);
-    for (const c of candidatesDirs) {
-      const candidateFiles = ['', `${moduleBaseName}.ts`, `${moduleBaseName}${moduleExt}`].map(
-        (x) => join(c, x),
+    const candidateFiles: string[] = ['', `${moduleBaseName}.ts`];
+    if (options.moduleExt) {
+      candidateFiles.push(`${moduleBaseName}${options.moduleExt}`);
+    } else {
+      candidateFiles.push(
+        `${moduleBaseName}${MODULE_EXT}`,
+        `${moduleBaseName}${MODULE_EXT_LEGACY}`,
       );
+    }
 
+    for (const c of candidatesDirs) {
       for (const sc of candidateFiles) {
-        if (host.exists(sc) && host.readText(sc).includes('@NgModule')) {
-          return normalize(sc);
+        const scPath = join(c, sc);
+        if (host.exists(scPath) && host.readText(scPath).includes('@NgModule')) {
+          return normalize(scPath);
         }
       }
     }
@@ -78,15 +84,22 @@ export function findModuleFromOptions(host: Tree, options: ModuleOptions): Path
 export function findModule(
   host: Tree,
   generateDir: string,
-  moduleExt = MODULE_EXT,
-  routingModuleExt = ROUTING_MODULE_EXT,
+  moduleExt?: string,
+  routingModuleExt?: string,
 ): Path {
   let dir: DirEntry | null = host.getDir('/' + generateDir);
   let foundRoutingModule = false;
 
+  const moduleExtensions: string[] = moduleExt ? [moduleExt] : [MODULE_EXT, MODULE_EXT_LEGACY];
+  const routingModuleExtensions: string[] = routingModuleExt
+    ? [routingModuleExt]
+    : [ROUTING_MODULE_EXT, ROUTING_MODULE_EXT_LEGACY];
+
   while (dir) {
-    const allMatches = dir.subfiles.filter((p) => p.endsWith(moduleExt));
-    const filteredMatches = allMatches.filter((p) => !p.endsWith(routingModuleExt));
+    const allMatches = dir.subfiles.filter((p) => moduleExtensions.some((m) => p.endsWith(m)));
+    const filteredMatches = allMatches.filter(
+      (p) => !routingModuleExtensions.some((m) => p.endsWith(m)),
+    );
 
     foundRoutingModule = foundRoutingModule || allMatches.length !== filteredMatches.length;
 
diff --git a/packages/schematics/angular/utility/find-module_spec.ts b/packages/schematics/angular/utility/find-module_spec.ts
index 9680f15949c8..0db295ae384f 100644
--- a/packages/schematics/angular/utility/find-module_spec.ts
+++ b/packages/schematics/angular/utility/find-module_spec.ts
@@ -143,6 +143,15 @@ describe('find-module', () => {
       expect(modPath).toEqual('/projects/my-proj/src/admin/foo.module.ts');
     });
 
+    it('should find a module in a sub dir when using the `-module` suffix', () => {
+      tree.create('/projects/my-proj/src/admin/foo-module.ts', '@NgModule');
+      options.name = 'other/test';
+      options.module = 'admin/foo';
+      options.path = '/projects/my-proj/src';
+      const modPath = findModuleFromOptions(tree, options) as string;
+      expect(modPath).toEqual('/projects/my-proj/src/admin/foo-module.ts');
+    });
+
     it('should find a module in a sub dir (2)', () => {
       tree.create('/projects/my-proj/src/admin/foo.module.ts', '@NgModule');
       options.name = 'admin/hello';

From 1db861cbdac29128d9a3af40baa59bf3727827da Mon Sep 17 00:00:00 2001
From: Paul Gschwendtner <paulgschwendtner@gmail.com>
Date: Thu, 5 Jun 2025 13:28:26 +0000
Subject: [PATCH 103/138] build: improve globbing of jasmine test files
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

This doesn't seem to surface here, but in the framework and in the COMP
repo, the glob wasn't catching all files because it wasn't escpaed— so
didn't actually get picked up by Jasmine, but was expanded by Bash.

This improves this and makes this logic more future-proof.

(cherry picked from commit 1a235e012297e4f0cdeedfa9e06e74a2ade54d72)
---
 tools/defaults.bzl | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/tools/defaults.bzl b/tools/defaults.bzl
index 18f7f0d5fdc0..cde6f8c43dd6 100644
--- a/tools/defaults.bzl
+++ b/tools/defaults.bzl
@@ -65,9 +65,10 @@ def jasmine_test(data = [], args = [], **kwargs):
         chdir = native.package_name(),
         args = [
             "--require=%s/node_modules/source-map-support/register.js" % relative_to_root,
-            "**/*spec.js",
-            "**/*spec.mjs",
-            "**/*spec.cjs",
+            # Escape so that the `js_binary` launcher triggers Bash expansion.
+            "'**/*+(.|_)spec.js'",
+            "'**/*+(.|_)spec.mjs'",
+            "'**/*+(.|_)spec.cjs'",
         ] + args,
         data = data + ["//:node_modules/source-map-support"],
         **kwargs

From fa253851a0129949337b64ecdfda634807cba12f Mon Sep 17 00:00:00 2001
From: Doug Parker <dgp1130@users.noreply.github.com>
Date: Thu, 5 Jun 2025 09:25:24 -0700
Subject: [PATCH 104/138] build: fix perf workflows

[610a36702ef3d7867bef70b0403f0847c5e3904b](https://github.com/angular/angular-cli/commit/610a36702ef3d7867bef70b0403f0847c5e3904b) renamed some test targets and broke these references.

(cherry picked from commit 3d65518adfa6d2fa63531c8b3e4d343e77306d12)
---
 .ng-dev/dx-perf-workflows.yml | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/.ng-dev/dx-perf-workflows.yml b/.ng-dev/dx-perf-workflows.yml
index 6b994f2b09c6..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

From 631ac7e6bc502fdbc6c416ee9fc4c9487dc18f3a Mon Sep 17 00:00:00 2001
From: Joey Perrott <josephperrott@gmail.com>
Date: Fri, 6 Jun 2025 16:27:46 +0000
Subject: [PATCH 105/138] ci: use new pull-request-labeling action

Use the pull-request-labeling action which replaced the commit-message-based-labeling action.
---
 .github/workflows/dev-infra.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/dev-infra.yml b/.github/workflows/dev-infra.yml
index 79c2f4854902..7f5b0b413c2c 100644
--- a/.github/workflows/dev-infra.yml
+++ b/.github/workflows/dev-infra.yml
@@ -13,7 +13,7 @@ jobs:
     runs-on: ubuntu-latest
     steps:
       - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
-      - uses: angular/dev-infra/github-actions/commit-message-based-labels@6f44591738d6f0374148fffc723788c62e5cb775
+      - uses: angular/dev-infra/github-actions/pull-request-labeling@3a765b303ce300f607b658abd4eb8a981bc7277f
         with:
           angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }}
   post_approval_changes:

From 424f1cbbfb709b4d6f480e6321ec1a152813cf5c Mon Sep 17 00:00:00 2001
From: Charles Lyding <19598772+clydin@users.noreply.github.com>
Date: Mon, 9 Jun 2025 10:28:15 -0400
Subject: [PATCH 106/138] fix(@angular/build): do not consider internal Angular
 files as external imports

When using the `application` build system with i18n enabled, the development
server may unintentionally attempt to optimize virtual internal files for
the locale data. These virtual files are now excluded from the list of
external imports.

(cherry picked from commit e36cbba11ecc0d95a0e7ff0e8184212ca824e87a)
---
 packages/angular/build/src/tools/esbuild/bundler-context.ts | 1 +
 1 file changed, 1 insertion(+)

diff --git a/packages/angular/build/src/tools/esbuild/bundler-context.ts b/packages/angular/build/src/tools/esbuild/bundler-context.ts
index 9b722e41640e..864ca2c6fdd9 100644
--- a/packages/angular/build/src/tools/esbuild/bundler-context.ts
+++ b/packages/angular/build/src/tools/esbuild/bundler-context.ts
@@ -366,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;

From bf64a0f2dcc2cbd5dc56e575dd337c16f2a3342b Mon Sep 17 00:00:00 2001
From: Alan Agius <17563226+alan-agius4@users.noreply.github.com>
Date: Tue, 10 Jun 2025 13:56:46 +0000
Subject: [PATCH 107/138] fix(@schematics/angular): add `less` as a
 devDependency when selected as the style preprocessor

Ensure `less` is automatically added to `devDependencies` when users choose it as the style preprocessor during application generation.

Closes #30503

(cherry picked from commit 42f45a39e63ab3ee1ba8d1b9af8d2e397ca07159)
---
 .../schematics/angular/application/index.ts    | 18 +++++++++++-------
 .../angular/application/index_spec.ts          | 14 ++++++++++++++
 2 files changed, 25 insertions(+), 7 deletions(-)

diff --git a/packages/schematics/angular/application/index.ts b/packages/schematics/angular/application/index.ts
index 14c0688cf334..ce8c83b2871f 100644
--- a/packages/schematics/angular/application/index.ts
+++ b/packages/schematics/angular/application/index.ts
@@ -49,12 +49,12 @@ function addTsProjectReference(...paths: string[]) {
 }
 
 export default function (options: ApplicationOptions): Rule {
-  return async (host: Tree, context: SchematicContext) => {
+  return async (host: Tree) => {
     const { appDir, appRootSelector, componentOptions, folderName, sourceDir } =
       await getAppOptions(host, options);
 
     return chain([
-      addAppToWorkspaceFile(options, appDir, folderName),
+      addAppToWorkspaceFile(options, appDir),
       addTsProjectReference('./' + join(normalize(appDir), 'tsconfig.app.json')),
       options.skipTests || options.minimal
         ? noop()
@@ -157,6 +157,14 @@ function addDependenciesToPackageJson(options: ApplicationOptions) {
       });
     }
 
+    if (options.style === Style.Less) {
+      addPackageJsonDependency(host, {
+        type: NodeDependencyType.Dev,
+        name: 'less',
+        version: latestVersions['less'],
+      });
+    }
+
     if (!options.skipInstall) {
       context.addTask(new NodePackageInstallTask());
     }
@@ -165,11 +173,7 @@ function addDependenciesToPackageJson(options: ApplicationOptions) {
   };
 }
 
-function addAppToWorkspaceFile(
-  options: ApplicationOptions,
-  appDir: string,
-  folderName: string,
-): Rule {
+function addAppToWorkspaceFile(options: ApplicationOptions, appDir: string): Rule {
   let projectRoot = appDir;
   if (projectRoot) {
     projectRoot += '/';
diff --git a/packages/schematics/angular/application/index_spec.ts b/packages/schematics/angular/application/index_spec.ts
index 60700c9f45ff..6db8671aabb6 100644
--- a/packages/schematics/angular/application/index_spec.ts
+++ b/packages/schematics/angular/application/index_spec.ts
@@ -282,6 +282,20 @@ describe('Application Schematic', () => {
       expect(pkg.dependencies['zone.js']).toEqual(latestVersions['zone.js']);
     });
 
+    it('should add "less" to devDependencies when Less is selected as the style option', async () => {
+      const tree = await schematicRunner.runSchematic(
+        'application',
+        {
+          ...defaultOptions,
+          style: Style.Less,
+        },
+        workspaceTree,
+      );
+
+      const pkg = JSON.parse(tree.readContent('/package.json'));
+      expect(pkg.devDependencies['less']).toEqual(latestVersions['less']);
+    });
+
     it('should include zone.js if "zoneless" option is not present', async () => {
       const tree = await schematicRunner.runSchematic(
         'application',

From e89245debdf08bec8281d943dd061810a9b48cc6 Mon Sep 17 00:00:00 2001
From: Charles Lyding <19598772+clydin@users.noreply.github.com>
Date: Wed, 11 Jun 2025 10:36:28 -0400
Subject: [PATCH 108/138] release: cut the v20.0.2 release

---
 CHANGELOG.md | 19 +++++++++++++++++++
 package.json |  2 +-
 2 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 503b2567d3fc..80c0e6ef7771 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,22 @@
+<a name="20.0.2"></a>
+
+# 20.0.2 (2025-06-11)
+
+### @schematics/angular
+
+| 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                                                |
+| --------------------------------------------------------------------------------------------------- | ---- | ---------------------------------------------------------- |
+| [424f1cbbf](https://github.com/angular/angular-cli/commit/424f1cbbfb709b4d6f480e6321ec1a152813cf5c) | fix  | do not consider internal Angular files as external imports |
+
+<!-- CHANGELOG SPLIT MARKER -->
+
 <a name="20.0.1"></a>
 
 # 20.0.1 (2025-06-04)
diff --git a/package.json b/package.json
index d21b5262a7a8..b5190c6e0a7a 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@angular/devkit-repo",
-  "version": "20.0.1",
+  "version": "20.0.2",
   "private": true,
   "description": "Software Development Kit for Angular",
   "keywords": [

From a61528bfc63d2dee932850e9102e23fb8057bbc6 Mon Sep 17 00:00:00 2001
From: Joey Perrott <josephperrott@gmail.com>
Date: Tue, 10 Jun 2025 20:10:31 +0000
Subject: [PATCH 109/138] ci: update to latest version of dev-infra actions

Update to the latest sha of the dev-infra actions
---
 .../windows-bazel-test/action.yml             |  2 +-
 .../assistant-to-the-branch-manager.yml       |  2 +-
 .github/workflows/ci.yml                      | 50 +++++++++----------
 .github/workflows/dev-infra.yml               |  2 +-
 .github/workflows/feature-requests.yml        |  2 +-
 .github/workflows/perf.yml                    |  6 +--
 .github/workflows/pr.yml                      | 44 ++++++++--------
 7 files changed, 54 insertions(+), 54 deletions(-)

diff --git a/.github/shared-actions/windows-bazel-test/action.yml b/.github/shared-actions/windows-bazel-test/action.yml
index baa3e458505a..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@6f44591738d6f0374148fffc723788c62e5cb775
+      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 31a0ec991eca..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@6f44591738d6f0374148fffc723788c62e5cb775
+      - 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 3689040d58ba..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@6f44591738d6f0374148fffc723788c62e5cb775
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@1f047e7dbae43ea969c2cafb53b33207e86b800f
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@6f44591738d6f0374148fffc723788c62e5cb775
+        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@6f44591738d6f0374148fffc723788c62e5cb775
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@1f047e7dbae43ea969c2cafb53b33207e86b800f
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@6f44591738d6f0374148fffc723788c62e5cb775
+        uses: angular/dev-infra/github-actions/bazel/setup@1f047e7dbae43ea969c2cafb53b33207e86b800f
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@6f44591738d6f0374148fffc723788c62e5cb775
+        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@6f44591738d6f0374148fffc723788c62e5cb775
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@1f047e7dbae43ea969c2cafb53b33207e86b800f
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@6f44591738d6f0374148fffc723788c62e5cb775
+        uses: angular/dev-infra/github-actions/bazel/setup@1f047e7dbae43ea969c2cafb53b33207e86b800f
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@6f44591738d6f0374148fffc723788c62e5cb775
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@1f047e7dbae43ea969c2cafb53b33207e86b800f
         with:
           google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }}
       - name: Install node modules
@@ -87,13 +87,13 @@ jobs:
     runs-on: ${{ matrix.os }}
     steps:
       - name: Initialize environment
-        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@6f44591738d6f0374148fffc723788c62e5cb775
+        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@6f44591738d6f0374148fffc723788c62e5cb775
+        uses: angular/dev-infra/github-actions/bazel/setup@1f047e7dbae43ea969c2cafb53b33207e86b800f
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@6f44591738d6f0374148fffc723788c62e5cb775
+        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@6f44591738d6f0374148fffc723788c62e5cb775
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@1f047e7dbae43ea969c2cafb53b33207e86b800f
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@6f44591738d6f0374148fffc723788c62e5cb775
+        uses: angular/dev-infra/github-actions/bazel/setup@1f047e7dbae43ea969c2cafb53b33207e86b800f
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@6f44591738d6f0374148fffc723788c62e5cb775
+        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@6f44591738d6f0374148fffc723788c62e5cb775
+        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@6f44591738d6f0374148fffc723788c62e5cb775
+        uses: angular/dev-infra/github-actions/bazel/setup@1f047e7dbae43ea969c2cafb53b33207e86b800f
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@6f44591738d6f0374148fffc723788c62e5cb775
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@1f047e7dbae43ea969c2cafb53b33207e86b800f
         with:
           google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }}
       - name: Run CLI E2E tests
@@ -163,13 +163,13 @@ jobs:
     runs-on: ${{ matrix.os }}
     steps:
       - name: Initialize environment
-        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@6f44591738d6f0374148fffc723788c62e5cb775
+        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@6f44591738d6f0374148fffc723788c62e5cb775
+        uses: angular/dev-infra/github-actions/bazel/setup@1f047e7dbae43ea969c2cafb53b33207e86b800f
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@6f44591738d6f0374148fffc723788c62e5cb775
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@1f047e7dbae43ea969c2cafb53b33207e86b800f
         with:
           google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }}
       - name: Run CLI E2E tests
@@ -183,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@6f44591738d6f0374148fffc723788c62e5cb775
+        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@6f44591738d6f0374148fffc723788c62e5cb775
+        uses: angular/dev-infra/github-actions/bazel/setup@1f047e7dbae43ea969c2cafb53b33207e86b800f
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@6f44591738d6f0374148fffc723788c62e5cb775
+        uses: angular/dev-infra/github-actions/bazel/configure-remote@1f047e7dbae43ea969c2cafb53b33207e86b800f
         with:
           google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }}
       - name: Run E2E Browser tests
@@ -219,11 +219,11 @@ jobs:
       CIRCLE_BRANCH: ${{ github.ref_name }}
     steps:
       - name: Initialize environment
-        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@6f44591738d6f0374148fffc723788c62e5cb775
+        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@6f44591738d6f0374148fffc723788c62e5cb775
+        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 7f5b0b413c2c..492ce043519b 100644
--- a/.github/workflows/dev-infra.yml
+++ b/.github/workflows/dev-infra.yml
@@ -20,6 +20,6 @@ jobs:
     runs-on: ubuntu-latest
     steps:
       - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
-      - uses: angular/dev-infra/github-actions/post-approval-changes@6f44591738d6f0374148fffc723788c62e5cb775
+      - 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 1e239842801c..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@6f44591738d6f0374148fffc723788c62e5cb775
+      - 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 528cae69fc20..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@6f44591738d6f0374148fffc723788c62e5cb775
+        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@6f44591738d6f0374148fffc723788c62e5cb775
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@1f047e7dbae43ea969c2cafb53b33207e86b800f
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@6f44591738d6f0374148fffc723788c62e5cb775
+        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 84f8efa21c34..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@6f44591738d6f0374148fffc723788c62e5cb775
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@1f047e7dbae43ea969c2cafb53b33207e86b800f
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@6f44591738d6f0374148fffc723788c62e5cb775
+        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@6f44591738d6f0374148fffc723788c62e5cb775
+        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@6f44591738d6f0374148fffc723788c62e5cb775
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@1f047e7dbae43ea969c2cafb53b33207e86b800f
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@6f44591738d6f0374148fffc723788c62e5cb775
+        uses: angular/dev-infra/github-actions/bazel/setup@1f047e7dbae43ea969c2cafb53b33207e86b800f
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@6f44591738d6f0374148fffc723788c62e5cb775
+        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@6f44591738d6f0374148fffc723788c62e5cb775
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@1f047e7dbae43ea969c2cafb53b33207e86b800f
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@6f44591738d6f0374148fffc723788c62e5cb775
+        uses: angular/dev-infra/github-actions/bazel/setup@1f047e7dbae43ea969c2cafb53b33207e86b800f
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@6f44591738d6f0374148fffc723788c62e5cb775
+        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@6f44591738d6f0374148fffc723788c62e5cb775
+        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@6f44591738d6f0374148fffc723788c62e5cb775
+        uses: angular/dev-infra/github-actions/bazel/setup@1f047e7dbae43ea969c2cafb53b33207e86b800f
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@6f44591738d6f0374148fffc723788c62e5cb775
+        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@6f44591738d6f0374148fffc723788c62e5cb775
+        uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@1f047e7dbae43ea969c2cafb53b33207e86b800f
       - name: Setup Bazel
-        uses: angular/dev-infra/github-actions/bazel/setup@6f44591738d6f0374148fffc723788c62e5cb775
+        uses: angular/dev-infra/github-actions/bazel/setup@1f047e7dbae43ea969c2cafb53b33207e86b800f
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@6f44591738d6f0374148fffc723788c62e5cb775
+        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@6f44591738d6f0374148fffc723788c62e5cb775
+        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@6f44591738d6f0374148fffc723788c62e5cb775
+        uses: angular/dev-infra/github-actions/bazel/setup@1f047e7dbae43ea969c2cafb53b33207e86b800f
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@6f44591738d6f0374148fffc723788c62e5cb775
+        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@6f44591738d6f0374148fffc723788c62e5cb775
+        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@6f44591738d6f0374148fffc723788c62e5cb775
+        uses: angular/dev-infra/github-actions/bazel/setup@1f047e7dbae43ea969c2cafb53b33207e86b800f
       - name: Setup Bazel RBE
-        uses: angular/dev-infra/github-actions/bazel/configure-remote@6f44591738d6f0374148fffc723788c62e5cb775
+        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 }}

From 0371f9aa18c69151466204c569a5334aefdd0088 Mon Sep 17 00:00:00 2001
From: Charles Lyding <19598772+clydin@users.noreply.github.com>
Date: Wed, 11 Jun 2025 13:36:21 -0400
Subject: [PATCH 110/138] test(@angular/ssr): mark jasmine tests as flaky

(cherry picked from commit 26f3641504475d745dd5797c205b3f79ea5e9643)
---
 packages/angular/ssr/test/BUILD.bazel | 1 +
 1 file changed, 1 insertion(+)

diff --git a/packages/angular/ssr/test/BUILD.bazel b/packages/angular/ssr/test/BUILD.bazel
index c81599b43a79..d18700a662ad 100644
--- a/packages/angular/ssr/test/BUILD.bazel
+++ b/packages/angular/ssr/test/BUILD.bazel
@@ -32,4 +32,5 @@ jasmine_test(
     data = [
         ":esm_tests_bundled",
     ],
+    flaky = True,
 )

From e90a808c0100beb319bae36ca3b771ee2da89435 Mon Sep 17 00:00:00 2001
From: Alan Agius <17563226+alan-agius4@users.noreply.github.com>
Date: Thu, 12 Jun 2025 07:02:49 +0000
Subject: [PATCH 111/138] fix(@schematics/angular): include `main.server.ts` in
 `tsconfig.files` when present

Add logic to automatically include `main.server.ts` in the `files` array of the tsconfig when present during schematic execution. This ensures backwards compatibility for applications generated prior to version 19.

Closes #30526

(cherry picked from commit c43711177b13b15ae4fbc7a009ae137bdc3fea4d)
---
 packages/schematics/angular/server/index.ts | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/packages/schematics/angular/server/index.ts b/packages/schematics/angular/server/index.ts
index 50f624e078cd..484a8f03a4ab 100644
--- a/packages/schematics/angular/server/index.ts
+++ b/packages/schematics/angular/server/index.ts
@@ -119,6 +119,14 @@ function updateConfigFileApplicationBuilder(options: ServerOptions): Rule {
 function updateTsConfigFile(tsConfigPath: string): Rule {
   return (host: Tree) => {
     const json = new JSONFile(host, tsConfigPath);
+    // Skip adding the files entry if the server entry would already be included.
+    const include = json.get(['include']);
+    if (!Array.isArray(include) || !include.includes('src/**/*.ts')) {
+      const filesPath = ['files'];
+      const files = new Set((json.get(filesPath) as string[] | undefined) ?? []);
+      files.add('src/' + serverMainEntryName);
+      json.modify(filesPath, [...files]);
+    }
 
     const typePath = ['compilerOptions', 'types'];
     const types = new Set((json.get(typePath) as string[] | undefined) ?? []);

From 5c48b8e0ac38a108740ebb290dc1e666ce390806 Mon Sep 17 00:00:00 2001
From: Alan Agius <17563226+alan-agius4@users.noreply.github.com>
Date: Thu, 12 Jun 2025 07:58:56 +0000
Subject: [PATCH 112/138] fix(@schematics/angular): reset module
 `typeSeparator` when generating applications

The application schematic now invokes the module schematic with `typeSeparator` explicitly set to `undefined`. This ensures any legacy value from `angular.json` set by older versions of the Angular CLI is cleared during application generation and does not cause multiple files to be generated.

Closes #30497

(cherry picked from commit 4be58ee8c9896107925507a60cc8dd830c93bb7e)
---
 packages/schematics/angular/application/index.ts | 1 +
 1 file changed, 1 insertion(+)

diff --git a/packages/schematics/angular/application/index.ts b/packages/schematics/angular/application/index.ts
index ce8c83b2871f..f9254fe0f3e6 100644
--- a/packages/schematics/angular/application/index.ts
+++ b/packages/schematics/angular/application/index.ts
@@ -69,6 +69,7 @@ export default function (options: ApplicationOptions): Rule {
             routingScope: 'Root',
             path: sourceDir,
             project: options.name,
+            typeSeparator: undefined,
           }),
       schematic('component', {
         name: 'app',

From e6d27bd5e3fe64f597621e0d5c08060cea64a302 Mon Sep 17 00:00:00 2001
From: Charles Lyding <19598772+clydin@users.noreply.github.com>
Date: Fri, 13 Jun 2025 09:30:33 -0400
Subject: [PATCH 113/138] fix(@angular/build): set scripts option output as
 classic script for karma

When using the `karma` builder, the generated output JavaScript file was
unintentionally being marked as a module type script. This prevent the
output file from providing equivalent behavior to that of an actual build.
The `scripts` option outputs should be considered classic scripts to the
browser.

(cherry picked from commit 60a16a82a99718a527e2c6b588d1489fba5bd500)
---
 .../angular/build/src/builders/karma/application_builder.ts  | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/packages/angular/build/src/builders/karma/application_builder.ts b/packages/angular/build/src/builders/karma/application_builder.ts
index 55a10b37c54e..3bfc13df6c74 100644
--- a/packages/angular/build/src/builders/karma/application_builder.ts
+++ b/packages/angular/build/src/builders/karma/application_builder.ts
@@ -161,6 +161,11 @@ class AngularPolyfillsPlugin {
               // page load. `type` won't affect them.
               continue;
             }
+            if (f.pattern === 'scripts.js') {
+              // Don't consider "scripts" option files as module types.
+              // This should be expanded if custom scripts bundle names support is added.
+              continue;
+            }
             if (f.pattern.endsWith('.js') && 'js' === (f.type ?? 'js')) {
               f.type = 'module';
             }

From 56f426e2548b86c00d4da19b9f7b5cf97dc79104 Mon Sep 17 00:00:00 2001
From: Charles Lyding <19598772+clydin@users.noreply.github.com>
Date: Fri, 13 Jun 2025 14:12:07 -0400
Subject: [PATCH 114/138] fix(@angular/build): include custom bundle name
 scripts with karma

When using the `karma` builder with custom "scripts" option entries that
contain the `bundleName` suboption, the output files for these scripts
will now correctly be injected into the test index HTML content. Previously
only the default `scripts.js` output file would be used.

(cherry picked from commit 049e6886f88267158d85ca72020fec728c3de0ac)
---
 .../src/builders/karma/application_builder.ts | 38 ++++++++++++-------
 1 file changed, 24 insertions(+), 14 deletions(-)

diff --git a/packages/angular/build/src/builders/karma/application_builder.ts b/packages/angular/build/src/builders/karma/application_builder.ts
index 3bfc13df6c74..d33469a45ef6 100644
--- a/packages/angular/build/src/builders/karma/application_builder.ts
+++ b/packages/angular/build/src/builders/karma/application_builder.ts
@@ -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
@@ -161,16 +162,14 @@ class AngularPolyfillsPlugin {
               // page load. `type` won't affect them.
               continue;
             }
-            if (f.pattern === 'scripts.js') {
-              // Don't consider "scripts" option files as module types.
-              // This should be expanded if custom scripts bundle names support is added.
-              continue;
-            }
             if (f.pattern.endsWith('.js') && 'js' === (f.type ?? 'js')) {
               f.type = 'module';
             }
           }
 
+          // 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'),
@@ -493,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<string>();
+    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 },
@@ -577,7 +587,7 @@ 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);

From dfe3a8b7342dd492e42ec48052612255ba76c09b Mon Sep 17 00:00:00 2001
From: Alan Agius <17563226+alan-agius4@users.noreply.github.com>
Date: Wed, 18 Jun 2025 07:45:45 +0000
Subject: [PATCH 115/138] fix(@angular/build): increase worker idle timeout

This is a workaround for https://github.com/piscinajs/piscina/issues/816

Closes #30549

(cherry picked from commit 1d76d0ee59d54a889b564bdf85f183fd08ddc860)
---
 packages/angular/build/src/utils/worker-pool.ts | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/packages/angular/build/src/utils/worker-pool.ts b/packages/angular/build/src/utils/worker-pool.ts
index 3a4b3def27cb..61f7b0ff7b59 100644
--- a/packages/angular/build/src/utils/worker-pool.ts
+++ b/packages/angular/build/src/utils/worker-pool.ts
@@ -15,7 +15,8 @@ export class WorkerPool extends Piscina {
   constructor(options: WorkerPoolOptions) {
     const piscinaOptions: WorkerPoolOptions = {
       minThreads: 1,
-      idleTimeout: 1000,
+      // Workaround for https://github.com/piscinajs/piscina/issues/816
+      idleTimeout: 10_000,
       // Web containers do not support transferable objects with receiveOnMessagePort which
       // is used when the Atomics based wait loop is enable.
       atomics: process.versions.webcontainer ? 'disabled' : 'sync',

From 897eaf97782d88b9c89892a040c1d7508c1f03e1 Mon Sep 17 00:00:00 2001
From: Alan Agius <17563226+alan-agius4@users.noreply.github.com>
Date: Wed, 18 Jun 2025 08:28:47 +0000
Subject: [PATCH 116/138] release: cut the v20.0.3 release

---
 CHANGELOG.md | 21 +++++++++++++++++++++
 package.json |  2 +-
 2 files changed, 22 insertions(+), 1 deletion(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 80c0e6ef7771..edb99af6152a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,24 @@
+<a name="20.0.3"></a>
+
+# 20.0.3 (2025-06-18)
+
+### @schematics/angular
+
+| 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 |
+
+<!-- CHANGELOG SPLIT MARKER -->
+
 <a name="20.0.2"></a>
 
 # 20.0.2 (2025-06-11)
diff --git a/package.json b/package.json
index b5190c6e0a7a..34b7ca0f9a07 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@angular/devkit-repo",
-  "version": "20.0.2",
+  "version": "20.0.3",
   "private": true,
   "description": "Software Development Kit for Angular",
   "keywords": [

From 358febb28d8aa20f2e2044203b1f97fb0f12c6c8 Mon Sep 17 00:00:00 2001
From: Matthieu Riegler <kyro38@gmail.com>
Date: Wed, 18 Jun 2025 16:20:03 -0700
Subject: [PATCH 117/138] refactor(@schematics/angular): add link to ai best
 practicies

This commit update the app.html template to add a link to the AI best practices documentation.

(cherry picked from commit d45d2a45822fc026113c72c5ee47de7c7e74da41)
---
 .../files/common-files/src/app/app.html.template         | 9 +++++++--
 .../e2e/assets/17.0-project/src/app/app.component.html   | 9 +++++++--
 2 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/packages/schematics/angular/application/files/common-files/src/app/app.html.template b/packages/schematics/angular/application/files/common-files/src/app/app.html.template
index 235056e117fa..9082d5468d7e 100644
--- a/packages/schematics/angular/application/files/common-files/src/app/app.html.template
+++ b/packages/schematics/angular/application/files/common-files/src/app/app.html.template
@@ -134,11 +134,15 @@
     --pill-accent: var(--bright-blue);
   }
   .pill-group .pill:nth-child(6n + 2) {
+    --pill-accent: var(--electric-violet);
+  }
+  .pill-group .pill:nth-child(6n + 3) {
     --pill-accent: var(--french-violet);
   }
-  .pill-group .pill:nth-child(6n + 3),
+
   .pill-group .pill:nth-child(6n + 4),
-  .pill-group .pill:nth-child(6n + 5) {
+  .pill-group .pill:nth-child(6n + 5),
+  .pill-group .pill:nth-child(6n + 6) {
     --pill-accent: var(--hot-red);
   }
 
@@ -234,6 +238,7 @@
         @for (item of [
           { title: 'Explore the Docs', link: 'https://angular.dev' },
           { title: 'Learn with Tutorials', link: 'https://angular.dev/tutorials' },
+          { title: 'Prompt and best practices for AI', link: 'https://angular.dev/ai/develop-with-ai'},
           { title: 'CLI Docs', link: 'https://angular.dev/tools/cli' },
           { title: 'Angular Language Service', link: 'https://angular.dev/tools/language-service' },
           { title: 'Angular DevTools', link: 'https://angular.dev/tools/devtools' },
diff --git a/tests/legacy-cli/e2e/assets/17.0-project/src/app/app.component.html b/tests/legacy-cli/e2e/assets/17.0-project/src/app/app.component.html
index 36093e187977..cfb20b1ffb89 100644
--- a/tests/legacy-cli/e2e/assets/17.0-project/src/app/app.component.html
+++ b/tests/legacy-cli/e2e/assets/17.0-project/src/app/app.component.html
@@ -134,11 +134,15 @@
     --pill-accent: var(--bright-blue);
   }
   .pill-group .pill:nth-child(6n + 2) {
+    --pill-accent: var(--electric-violet);
+  }
+  .pill-group .pill:nth-child(6n + 3) {
     --pill-accent: var(--french-violet);
   }
-  .pill-group .pill:nth-child(6n + 3),
+
   .pill-group .pill:nth-child(6n + 4),
-  .pill-group .pill:nth-child(6n + 5) {
+  .pill-group .pill:nth-child(6n + 5),
+  .pill-group .pill:nth-child(6n + 6) {
     --pill-accent: var(--hot-red);
   }
 
@@ -234,6 +238,7 @@ <h1>Hello, {{ title }}</h1>
         @for (item of [
           { title: 'Explore the Docs', link: 'https://angular.dev' },
           { title: 'Learn with Tutorials', link: 'https://angular.dev/tutorials' },
+          { title: 'Prompt and best practices for AI', link: 'https://angular.dev/ai/develop-with-ai'},
           { title: 'CLI Docs', link: 'https://angular.dev/tools/cli' },
           { title: 'Angular Language Service', link: 'https://angular.dev/tools/language-service' },
           { title: 'Angular DevTools', link: 'https://angular.dev/tools/devtools' },

From b8b4f28bcdf73fcf383d857856340bebdf3274f9 Mon Sep 17 00:00:00 2001
From: Alan Agius <17563226+alan-agius4@users.noreply.github.com>
Date: Thu, 19 Jun 2025 09:25:54 +0000
Subject: [PATCH 118/138] build: update piscina to 5.1.1

---
 packages/angular/build/package.json            |  2 +-
 .../angular_devkit/build_angular/package.json  |  2 +-
 pnpm-lock.yaml                                 | 18 +++++++++---------
 3 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/packages/angular/build/package.json b/packages/angular/build/package.json
index 56e2ae83b140..1bafb9b63681 100644
--- a/packages/angular/build/package.json
+++ b/packages/angular/build/package.json
@@ -36,7 +36,7 @@
     "mrmime": "2.0.1",
     "parse5-html-rewriting-stream": "7.1.0",
     "picomatch": "4.0.2",
-    "piscina": "5.0.0",
+    "piscina": "5.1.1",
     "rollup": "4.40.2",
     "sass": "1.88.0",
     "semver": "7.7.2",
diff --git a/packages/angular_devkit/build_angular/package.json b/packages/angular_devkit/build_angular/package.json
index 96653c1db42f..009d71d85fc6 100644
--- a/packages/angular_devkit/build_angular/package.json
+++ b/packages/angular_devkit/build_angular/package.json
@@ -43,7 +43,7 @@
     "open": "10.1.2",
     "ora": "8.2.0",
     "picomatch": "4.0.2",
-    "piscina": "5.0.0",
+    "piscina": "5.1.1",
     "postcss": "8.5.3",
     "postcss-loader": "8.1.1",
     "resolve-url-loader": "5.0.0",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 9ddfbba919e3..976d20cf2fb7 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -401,8 +401,8 @@ importers:
         specifier: 4.0.2
         version: 4.0.2
       piscina:
-        specifier: 5.0.0
-        version: 5.0.0
+        specifier: 5.1.1
+        version: 5.1.1
       rollup:
         specifier: 4.40.2
         version: 4.40.2
@@ -693,8 +693,8 @@ importers:
         specifier: 4.0.2
         version: 4.0.2
       piscina:
-        specifier: 5.0.0
-        version: 5.0.0
+        specifier: 5.1.1
+        version: 5.1.1
       postcss:
         specifier: 8.5.3
         version: 8.5.3
@@ -6554,9 +6554,9 @@ packages:
     resolution: {integrity: sha512-i85pKRCt4qMjZ1+L7sy2Ag4t1atFcdbEt76+7iRJn1g2BvsnRMGu9p8pivl9fs63M2kF/A0OacFZhTub+m/qMg==}
     hasBin: true
 
-  piscina@5.0.0:
-    resolution: {integrity: sha512-R+arufwL7sZvGjAhSMK3TfH55YdGOqhpKXkcwQJr432AAnJX/xxX19PA4QisrmJ+BTTfZVggaz6HexbkQq1l1Q==}
-    engines: {node: '>=18.x'}
+  piscina@5.1.1:
+    resolution: {integrity: sha512-9rPDIPsCwOivatEZGM8+apgM7AiTDLSnpwMmLaSmdm2PeND8bFJzZLZZxyrJjLH8Xx/MpKoVaKf+vZOWALNHbw==}
+    engines: {node: '>=20.x'}
 
   pkce-challenge@5.0.0:
     resolution: {integrity: sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==}
@@ -14185,7 +14185,7 @@ snapshots:
       jsonc-parser: 3.3.1
       less: 4.3.0
       ora: 8.2.0
-      piscina: 5.0.0
+      piscina: 5.1.1
       postcss: 8.5.3
       rollup-plugin-dts: 6.2.1(rollup@4.40.2)(typescript@5.8.3)
       rxjs: 7.8.2
@@ -14624,7 +14624,7 @@ snapshots:
       sonic-boom: 4.2.0
       thread-stream: 3.1.0
 
-  piscina@5.0.0:
+  piscina@5.1.1:
     optionalDependencies:
       '@napi-rs/nice': 1.0.1
 

From 1cc7014fe050eef782322713180fef7ef2877b59 Mon Sep 17 00:00:00 2001
From: Alan Agius <17563226+alan-agius4@users.noreply.github.com>
Date: Thu, 19 Jun 2025 09:23:31 +0000
Subject: [PATCH 119/138] Revert "fix(@angular/build): increase worker idle
 timeout"

This reverts commit 1d76d0ee59d54a889b564bdf85f183fd08ddc860.

(cherry picked from commit e58cbba69182dead4f27b4d48ceee13048fd5630)
---
 packages/angular/build/src/utils/worker-pool.ts | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/packages/angular/build/src/utils/worker-pool.ts b/packages/angular/build/src/utils/worker-pool.ts
index 61f7b0ff7b59..3a4b3def27cb 100644
--- a/packages/angular/build/src/utils/worker-pool.ts
+++ b/packages/angular/build/src/utils/worker-pool.ts
@@ -15,8 +15,7 @@ export class WorkerPool extends Piscina {
   constructor(options: WorkerPoolOptions) {
     const piscinaOptions: WorkerPoolOptions = {
       minThreads: 1,
-      // Workaround for https://github.com/piscinajs/piscina/issues/816
-      idleTimeout: 10_000,
+      idleTimeout: 1000,
       // Web containers do not support transferable objects with receiveOnMessagePort which
       // is used when the Atomics based wait loop is enable.
       atomics: process.versions.webcontainer ? 'disabled' : 'sync',

From 91ec24da0cdfa626170ce8d23fa0dea0898c9e26 Mon Sep 17 00:00:00 2001
From: Alan Agius <17563226+alan-agius4@users.noreply.github.com>
Date: Fri, 20 Jun 2025 07:38:32 +0000
Subject: [PATCH 120/138] test(@angular/build): reset project metadata before
 each run

Prevents test flakiness caused by `useProject` not cleaning up metadata between runs.

(cherry picked from commit d657609105d9235b3ba7bb0bbcaca050f0fca8f1)
---
 modules/testing/builder/src/builder-harness.ts | 4 ++++
 modules/testing/builder/src/jasmine-helpers.ts | 6 +++++-
 2 files changed, 9 insertions(+), 1 deletion(-)

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<T> {
     return join(getSystemPath(this.host.root()), path);
   }
 
+  resetProjectMetadata(): void {
+    this.projectMetadata = DEFAULT_PROJECT_METADATA;
+  }
+
   useProject(name: string, metadata: Record<string, unknown> = {}): 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<T>(
   });
 
   describe(options.name || builderHandler.name, () => {
-    beforeEach(() => host.initialize().toPromise());
+    beforeEach(async () => {
+      harness.resetProjectMetadata();
+
+      await host.initialize().toPromise();
+    });
 
     afterEach(() => host.restore().toPromise());
 

From 732639d5df00f2c01fe80c1a28690e749351718f Mon Sep 17 00:00:00 2001
From: Alan Agius <17563226+alan-agius4@users.noreply.github.com>
Date: Fri, 20 Jun 2025 08:04:25 +0000
Subject: [PATCH 121/138] refactor(@angular/build): increase piscina
 `idleTimeout` to 4s.

Workaround for https://github.com/piscinajs/piscina/issues/816

Addresses
```
    error properties: Object({ generatedMessage: true, code: 'ERR_ASSERTION', actual: 1, expected: 0, operator: 'strictEqual' })
        at Timeout._onTimeout (/home/runner/.cache/bazel/_bazel_runner/f47b8283cc0f5922f9455b06771398a1/sandbox/processwrapper-sandbox/3878/execroot/_main/bazel-out/k8-fastbuild/bin/packages/angular/build/application_integration_tests_/application_integration_tests.runfiles/_main/node_modules/.aspect_rules_js/piscina@5.1.1/node_modules/piscina/src/index.ts:447:16)
        at listOnTimeout (node:internal/timers:608:17)
        at processTimers (node:internal/timers:543:7)
```

(cherry picked from commit 8cccf386484ba83717969fd70f7abf61d69f26e1)
---
 packages/angular/build/src/utils/worker-pool.ts | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/packages/angular/build/src/utils/worker-pool.ts b/packages/angular/build/src/utils/worker-pool.ts
index 3a4b3def27cb..78db4302ef1a 100644
--- a/packages/angular/build/src/utils/worker-pool.ts
+++ b/packages/angular/build/src/utils/worker-pool.ts
@@ -15,7 +15,7 @@ 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.
       atomics: process.versions.webcontainer ? 'disabled' : 'sync',

From 03aff1e383daf1f2a33504f03ef42471b44a6be0 Mon Sep 17 00:00:00 2001
From: Alan Agius <17563226+alan-agius4@users.noreply.github.com>
Date: Fri, 20 Jun 2025 07:40:31 +0000
Subject: [PATCH 122/138] docs: update component schematic option descriptions

Several option descriptions were outdated and have been revised for accuracy.

Closes #30566

(cherry picked from commit caf70d8194237dd7013f9fd29edd14b1bd935cf1)
---
 packages/schematics/angular/component/schema.json | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/packages/schematics/angular/component/schema.json b/packages/schematics/angular/component/schema.json
index dfbc702f451e..23c89d7ec5e2 100644
--- a/packages/schematics/angular/component/schema.json
+++ b/packages/schematics/angular/component/schema.json
@@ -24,7 +24,7 @@
     },
     "name": {
       "type": "string",
-      "description": "The name for the new component. This will be used to create the component's class, template, and stylesheet files. For example, if you provide `my-component`, the files will be named `my-component.component.ts`, `my-component.component.html`, and `my-component.component.css`.",
+      "description": "The name for the new component. This will be used to create the component's class, template, and stylesheet files. For example, if you provide `my-component`, the files will be named `my-component.ts`, `my-component.html`, and `my-component.css`.",
       "$default": {
         "$source": "argv",
         "index": 0
@@ -38,14 +38,14 @@
       "alias": "b"
     },
     "inlineStyle": {
-      "description": "Include the component's styles directly in the `component.ts` file. By default, a separate stylesheet file (e.g., `my-component.component.css`) is created.",
+      "description": "Include the component's styles directly in the `component.ts` file. By default, a separate stylesheet file (e.g., `my-component.css`) is created.",
       "type": "boolean",
       "default": false,
       "alias": "s",
       "x-user-analytics": "ep.ng_inline_style"
     },
     "inlineTemplate": {
-      "description": "Include the component's HTML template directly in the `component.ts` file. By default, a separate template file (e.g., `my-component.component.html`) is created.",
+      "description": "Include the component's HTML template directly in the `component.ts` file. By default, a separate template file (e.g., `my-component.html`) is created.",
       "type": "boolean",
       "default": false,
       "alias": "t",

From 30974228988d7ff96741fe0515c35275e8a6bc0a Mon Sep 17 00:00:00 2001
From: Alan Agius <17563226+alan-agius4@users.noreply.github.com>
Date: Thu, 19 Jun 2025 07:28:05 +0000
Subject: [PATCH 123/138] fix(@angular/ssr): avoid preloading unnecessary
 dynamic bundles

This change to `@angular/ssr` prevents the preloading of dynamically imported bundles that aren't directly associated with routing.

Previously, Angular SSR might preload all dynamic bundles, even those not immediately required, such as deferred chunks within components.

Closes #30541

(cherry picked from commit 861a61a3b26a3e88105641084415f45a07cb56b5)
---
 .../src/utils/server-rendering/manifest.ts    | 22 +++++--------------
 packages/angular/ssr/src/manifest.ts          | 11 +++-------
 packages/angular/ssr/src/routes/ng-routes.ts  | 18 ++++-----------
 .../server-routes-preload-links.ts            |  6 ++---
 4 files changed, 14 insertions(+), 43 deletions(-)

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<string>,
   publicPath = '',
-): Record<string, FilesMapping[]> {
-  const entryPointToBundles: Record<string, FilesMapping[]> = {};
+): Record<string, string[]> {
+  const entryPointToBundles: Record<string, string[]> = {};
   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/ssr/src/manifest.ts b/packages/angular/ssr/src/manifest.ts
index ae33dc979577..d0f9032ec8b1 100644
--- a/packages/angular/ssr/src/manifest.ts
+++ b/packages/angular/ssr/src/manifest.ts
@@ -123,21 +123,16 @@ export interface AngularAppManifest {
    * Maps entry-point names to their corresponding browser bundles and loading strategies.
    *
    * - **Key**: The entry-point name, typically the value of `ɵentryName`.
-   * - **Value**: An array of objects, each representing a browser bundle with:
-   *   - `path`: The filename or URL of the associated JavaScript bundle to preload.
-   *   - `dynamicImport`: A boolean indicating whether the bundle is loaded via a dynamic `import()`.
-   *     If `true`, the bundle is lazily loaded, impacting its preloading behavior.
+   * - **Value**: A readonly array of JavaScript bundle paths or `undefined` if no bundles are associated.
    *
    * ### Example
    * ```ts
    * {
-   *   'src/app/lazy/lazy.ts': [{ path: 'src/app/lazy/lazy.js', dynamicImport: true }]
+   *   'src/app/lazy/lazy.ts': ['src/app/lazy/lazy.js']
    * }
    * ```
    */
-  readonly entryPointToBrowserMapping?: Readonly<
-    Record<string, ReadonlyArray<{ path: string; dynamicImport: boolean }> | undefined>
-  >;
+  readonly entryPointToBrowserMapping?: Readonly<Record<string, readonly string[] | undefined>>;
 }
 
 /**
diff --git a/packages/angular/ssr/src/routes/ng-routes.ts b/packages/angular/ssr/src/routes/ng-routes.ts
index a904c16fbae7..e2454896f832 100644
--- a/packages/angular/ssr/src/routes/ng-routes.ts
+++ b/packages/angular/ssr/src/routes/ng-routes.ts
@@ -148,7 +148,7 @@ async function* handleRoute(options: {
 
     const { redirectTo, loadChildren, loadComponent, children, ɵentryName } = route;
     if (ɵentryName && loadComponent) {
-      appendPreloadToMetadata(ɵentryName, entryPointToBrowserMapping, metadata, true);
+      appendPreloadToMetadata(ɵentryName, entryPointToBrowserMapping, metadata);
     }
 
     if (metadata.renderMode === RenderMode.Prerender) {
@@ -192,11 +192,7 @@ async function* handleRoute(options: {
     // Load and process lazy-loaded child routes
     if (loadChildren) {
       if (ɵentryName) {
-        // When using `loadChildren`, the entire feature area (including multiple routes) is loaded.
-        // As a result, we do not want all dynamic-import dependencies to be preload, because it involves multiple dependencies
-        // across different child routes. In contrast, `loadComponent` only loads a single component, which allows
-        // for precise control over preloading, ensuring that the files preloaded are exactly those required for that specific route.
-        appendPreloadToMetadata(ɵentryName, entryPointToBrowserMapping, metadata, false);
+        appendPreloadToMetadata(ɵentryName, entryPointToBrowserMapping, metadata);
       }
 
       const loadedChildRoutes = await loadChildrenHelper(
@@ -336,7 +332,6 @@ function appendPreloadToMetadata(
   entryName: string,
   entryPointToBrowserMapping: EntryPointToBrowserMapping,
   metadata: ServerConfigRouteTreeNodeMetadata,
-  includeDynamicImports: boolean,
 ): void {
   const existingPreloads = metadata.preload ?? [];
   if (!entryPointToBrowserMapping || existingPreloads.length >= MODULE_PRELOAD_MAX) {
@@ -350,13 +345,8 @@ function appendPreloadToMetadata(
 
   // Merge existing preloads with new ones, ensuring uniqueness and limiting the total to the maximum allowed.
   const combinedPreloads: Set<string> = new Set(existingPreloads);
-  for (const { dynamicImport, path } of preload) {
-    if (dynamicImport && !includeDynamicImports) {
-      continue;
-    }
-
-    combinedPreloads.add(path);
-
+  for (const href of preload) {
+    combinedPreloads.add(href);
     if (combinedPreloads.size === MODULE_PRELOAD_MAX) {
       break;
     }
diff --git a/tests/legacy-cli/e2e/tests/build/server-rendering/server-routes-preload-links.ts b/tests/legacy-cli/e2e/tests/build/server-rendering/server-routes-preload-links.ts
index 19697ace5657..f1437392492d 100644
--- a/tests/legacy-cli/e2e/tests/build/server-rendering/server-routes-preload-links.ts
+++ b/tests/legacy-cli/e2e/tests/build/server-rendering/server-routes-preload-links.ts
@@ -143,17 +143,15 @@ const RESPONSE_EXPECTS: Record<
     matches: [
       /<link rel="modulepreload" href="(ssg\.routes-[a-zA-Z0-9]{8}\.js)">/,
       /<link rel="modulepreload" href="(ssg-one-[a-zA-Z0-9]{8}\.js)">/,
-      /<link rel="modulepreload" href="(cross-dep-[a-zA-Z0-9]{8}\.js)">/,
     ],
-    notMatches: [/home/, /ssr/, /csr/, /ssg-two/, /ssg\-component/],
+    notMatches: [/home/, /ssr/, /csr/, /ssg-two/, /ssg\-component/, /cross-dep-/],
   },
   '/ssg/two': {
     matches: [
       /<link rel="modulepreload" href="(ssg\.routes-[a-zA-Z0-9]{8}\.js)">/,
       /<link rel="modulepreload" href="(ssg-two-[a-zA-Z0-9]{8}\.js)">/,
-      /<link rel="modulepreload" href="(cross-dep-[a-zA-Z0-9]{8}\.js)">/,
     ],
-    notMatches: [/home/, /ssr/, /csr/, /ssg-one/, /ssg\-component/],
+    notMatches: [/home/, /ssr/, /csr/, /ssg-one/, /ssg\-component/, /cross-dep-/],
   },
   '/ssr': {
     matches: [/<link rel="modulepreload" href="(ssr-[a-zA-Z0-9]{8}\.js)">/],

From 82691b98fa458febf40a16beb91b24c4b6c519c9 Mon Sep 17 00:00:00 2001
From: Alan Agius <17563226+alan-agius4@users.noreply.github.com>
Date: Tue, 24 Jun 2025 07:34:15 +0000
Subject: [PATCH 124/138] fix(@angular/ssr): ensure correct referer header
 handling in web request conversion

The `Referer` header is classified as a forbidden header name within the Web Standard Fetch API. This means it cannot be manually set directly within the `headers` option, instead it must be set when constructing a `new Request()` object.

Closes #30581

(cherry picked from commit 1c5bd2ef2fa95a789e14ab8c497b48e125ceb4f8)
---
 packages/angular/ssr/node/src/request.ts      |  2 +
 .../ssr/node/test/request_http1_spec.ts       | 46 ++++++++++++++++++-
 .../ssr/node/test/request_http2_spec.ts       | 43 ++++++++++++++++-
 3 files changed, 87 insertions(+), 4 deletions(-)

diff --git a/packages/angular/ssr/node/src/request.ts b/packages/angular/ssr/node/src/request.ts
index 51331a18cc35..f99e40491b07 100644
--- a/packages/angular/ssr/node/src/request.ts
+++ b/packages/angular/ssr/node/src/request.ts
@@ -33,12 +33,14 @@ export function createWebRequestFromNodeRequest(
 ): Request {
   const { headers, method = 'GET' } = nodeRequest;
   const withBody = method !== 'GET' && method !== 'HEAD';
+  const referrer = headers.referer && URL.canParse(headers.referer) ? headers.referer : undefined;
 
   return new Request(createRequestUrl(nodeRequest), {
     method,
     headers: createRequestHeaders(headers),
     body: withBody ? nodeRequest : undefined,
     duplex: withBody ? 'half' : undefined,
+    referrer,
   });
 }
 
diff --git a/packages/angular/ssr/node/test/request_http1_spec.ts b/packages/angular/ssr/node/test/request_http1_spec.ts
index 6559af458954..87f25f918ef7 100644
--- a/packages/angular/ssr/node/test/request_http1_spec.ts
+++ b/packages/angular/ssr/node/test/request_http1_spec.ts
@@ -45,7 +45,7 @@ describe('createWebRequestFromNodeRequest (HTTP/1.1)', () => {
     server.close(done);
   });
 
-  describe('GET Handling', () => {
+  describe('GET handling', () => {
     it('should correctly handle a basic GET request', async () => {
       const nodeRequest = await extractNodeRequest(() => {
         request({
@@ -96,9 +96,51 @@ describe('createWebRequestFromNodeRequest (HTTP/1.1)', () => {
       expect(webRequest.headers.get('x-custom-header1')).toBe('value1');
       expect(webRequest.headers.get('x-custom-header2')).toBe('value2');
     });
+
+    it('should correctly handle the referer header', async () => {
+      const referer = 'http://test-referer-site.com/page';
+      const nodeRequest = await extractNodeRequest(() => {
+        request({
+          hostname: 'localhost',
+          port,
+          path: '/with-referer',
+          method: 'GET',
+          headers: {
+            referer,
+          },
+        }).end();
+      });
+
+      expect(nodeRequest.headers['referer']).toBe(referer);
+
+      const webRequest = createWebRequestFromNodeRequest(nodeRequest);
+      expect(webRequest.headers.get('referer')).toBe(referer);
+      expect(webRequest.referrer).toBe(referer);
+    });
+
+    it('should handle an invalid referer header gracefully', async () => {
+      const invalidReferer = '/invalid-referer';
+      const nodeRequest = await extractNodeRequest(() => {
+        request({
+          hostname: 'localhost',
+          port,
+          path: '/with-invalid-referer',
+          method: 'GET',
+          headers: {
+            referer: invalidReferer,
+          },
+        }).end();
+      });
+
+      expect(nodeRequest.headers['referer']).toBe(invalidReferer);
+
+      const webRequest = createWebRequestFromNodeRequest(nodeRequest);
+      expect(webRequest.headers.get('referer')).toBe(invalidReferer);
+      expect(webRequest.referrer).toBe('about:client');
+    });
   });
 
-  describe('POST Handling', () => {
+  describe('POST handling', () => {
     it('should handle POST request with JSON body and correct response', async () => {
       const postData = JSON.stringify({ message: 'Hello from POST' });
       const nodeRequest = await extractNodeRequest(() => {
diff --git a/packages/angular/ssr/node/test/request_http2_spec.ts b/packages/angular/ssr/node/test/request_http2_spec.ts
index 4d9754d20cfc..7079a385daaf 100644
--- a/packages/angular/ssr/node/test/request_http2_spec.ts
+++ b/packages/angular/ssr/node/test/request_http2_spec.ts
@@ -56,7 +56,7 @@ describe('createWebRequestFromNodeRequest (HTTP/2)', () => {
     server.close(done);
   });
 
-  describe('GET Handling', () => {
+  describe('GET handling', () => {
     it('should correctly handle a basic GET request', async () => {
       const nodeRequest = await extractNodeRequest(() => {
         client
@@ -106,9 +106,48 @@ describe('createWebRequestFromNodeRequest (HTTP/2)', () => {
       expect(webRequest.headers.get('x-custom-header1')).toBe('value1');
       expect(webRequest.headers.get('x-custom-header2')).toBe('value2');
     });
+
+    it('should correctly handle the referer header', async () => {
+      const referer = 'http://test-referer-site.com/page';
+      const nodeRequest = await extractNodeRequest(() => {
+        client
+          .request({
+            ':path': '/with-referer',
+            ':method': 'GET',
+            referer,
+          })
+          .end();
+      });
+
+      expect(nodeRequest.headers['referer']).toBe(referer);
+
+      const webRequest = createWebRequestFromNodeRequest(nodeRequest);
+      expect(webRequest.headers.get('referer')).toBe(referer);
+      expect(webRequest.referrer).toBe(referer);
+      expect(webRequest.url).toBe(`http://localhost:${port}/with-referer`);
+    });
+
+    it('should handle an invalid referer header gracefully', async () => {
+      const invalidReferer = '/invalid-referer';
+      const nodeRequest = await extractNodeRequest(() => {
+        client
+          .request({
+            ':path': '/with-referer',
+            ':method': 'GET',
+            referer: invalidReferer,
+          })
+          .end();
+      });
+
+      expect(nodeRequest.headers['referer']).toBe(invalidReferer);
+
+      const webRequest = createWebRequestFromNodeRequest(nodeRequest);
+      expect(webRequest.headers.get('referer')).toBe(invalidReferer);
+      expect(webRequest.referrer).toBe('about:client');
+    });
   });
 
-  describe('POST Handling', () => {
+  describe('POST handling', () => {
     it('should handle POST request with JSON body and correct response', async () => {
       const postData = JSON.stringify({ message: 'Hello from POST' });
       const nodeRequest = await extractNodeRequest(() => {

From 2316fe29de57c593e5ccb8be612d3918b60d9761 Mon Sep 17 00:00:00 2001
From: Jan Martin <jan.krems@gmail.com>
Date: Tue, 24 Jun 2025 09:56:45 -0700
Subject: [PATCH 125/138] fix(@schematics/angular): add missing prettier config

The current style guide no longer enforces the use of the template
file extension `.component.html`. This means that prettier won't
auto-detect the proper parser for these files anymore.

To ensure template formatting works out-of-the-box, we're adding
a prettier config to newly created projects.

Fixes https://github.com/angular/angular-cli/issues/30548

(cherry picked from commit 4221a33cc7dee8a46464345f09005795f217ad02)
---
 .../angular/workspace/files/package.json.template      | 10 ++++++++++
 packages/schematics/angular/workspace/index_spec.ts    |  6 ++++++
 2 files changed, 16 insertions(+)

diff --git a/packages/schematics/angular/workspace/files/package.json.template b/packages/schematics/angular/workspace/files/package.json.template
index dcbe6939829d..8b3901b02010 100644
--- a/packages/schematics/angular/workspace/files/package.json.template
+++ b/packages/schematics/angular/workspace/files/package.json.template
@@ -8,6 +8,16 @@
     "watch": "ng build --watch --configuration development"<% if (!minimal) { %>,
     "test": "ng test"<% } %>
   },
+  "prettier": {
+    "overrides": [
+      {
+        "files": "*.html",
+        "options": {
+          "parser": "angular"
+        }
+      }
+    ]
+  },
   "private": true,
   "dependencies": {
     "@angular/common": "<%= latestVersions.Angular %>",
diff --git a/packages/schematics/angular/workspace/index_spec.ts b/packages/schematics/angular/workspace/index_spec.ts
index 21efd7275b82..b5c75b4a6d61 100644
--- a/packages/schematics/angular/workspace/index_spec.ts
+++ b/packages/schematics/angular/workspace/index_spec.ts
@@ -133,4 +133,10 @@ describe('Workspace Schematic', () => {
     const { tasks } = parseJson(tree.readContent('.vscode/tasks.json').toString());
     expect(tasks).not.toContain(jasmine.objectContaining({ type: 'npm', script: 'test' }));
   });
+
+  it('should include prettier config overrides for Angular templates', async () => {
+    const tree = await schematicRunner.runSchematic('workspace', defaultOptions);
+    const pkg = JSON.parse(tree.readContent('/package.json'));
+    expect(pkg.prettier).withContext('package.json#prettier is present').toBeTruthy();
+  });
 });

From 7e73abb9cc8ee9913839cb00ff2f212e485cbe4d Mon Sep 17 00:00:00 2001
From: Angular Robot <angular-robot@google.com>
Date: Wed, 25 Jun 2025 05:05:42 +0000
Subject: [PATCH 126/138] build: update dependency node to v22.17.0

See associated pull request for more information.

(cherry picked from commit 2b903203d7adab1a9793756932701257a22b4db7)
---
 .nvmrc | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.nvmrc b/.nvmrc
index 5b540673a828..fc37597bccdb 100644
--- a/.nvmrc
+++ b/.nvmrc
@@ -1 +1 @@
-22.16.0
+22.17.0

From 68fb0624d1841e77d5cc9044414182ea5f977050 Mon Sep 17 00:00:00 2001
From: Jan Martin <jan.krems@gmail.com>
Date: Wed, 25 Jun 2025 09:49:12 -0700
Subject: [PATCH 127/138] release: cut the v20.0.4 release

---
 CHANGELOG.md | 26 +++++++++++++++++++-------
 package.json |  2 +-
 2 files changed, 20 insertions(+), 8 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index edb99af6152a..39208a90f89a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,22 @@
+<a name="20.0.4"></a>
+
+# 20.0.4 (2025-06-25)
+
+### @schematics/angular
+
+| 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 |
+
+<!-- CHANGELOG SPLIT MARKER -->
+
 <a name="20.0.3"></a>
 
 # 20.0.3 (2025-06-18)
@@ -1080,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
 
@@ -3891,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.
@@ -4715,7 +4732,6 @@ Alan Agius, Charles Lyding and Doug Parker
 ### @angular/cli
 
 - Several changes to the `ng analytics` command syntax.
-
   - `ng analytics project <setting>` has been replaced with `ng analytics <setting>`
   - `ng analytics <setting>` has been replaced with `ng analytics <setting> --global`
 
@@ -4726,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.
@@ -4746,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`
@@ -4755,7 +4769,6 @@ Alan Agius, Charles Lyding and Doug Parker
   - `.mjsx`
 
   Valid extensions for `styles` are:
-
   - `.css`
   - `.less`
   - `.sass`
@@ -4798,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/package.json b/package.json
index 34b7ca0f9a07..63b32aee21e6 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@angular/devkit-repo",
-  "version": "20.0.3",
+  "version": "20.0.4",
   "private": true,
   "description": "Software Development Kit for Angular",
   "keywords": [

From 1ebd53df7168307f699a9f9ae8f5ef5b9bcf352c Mon Sep 17 00:00:00 2001
From: Alan Agius <17563226+alan-agius4@users.noreply.github.com>
Date: Fri, 27 Jun 2025 06:36:40 +0000
Subject: [PATCH 128/138] fix(@angular-devkit/build-angular): remove unused
 `@vitejs/plugin-basic-ssl` dependency

This dependency is no longer needed.

Closes #30613

(cherry picked from commit f1d41b069db6cd3ab83561113567b8e5f4bf25d8)
---
 packages/angular_devkit/build_angular/package.json | 1 -
 pnpm-lock.yaml                                     | 4 ----
 2 files changed, 5 deletions(-)

diff --git a/packages/angular_devkit/build_angular/package.json b/packages/angular_devkit/build_angular/package.json
index 009d71d85fc6..db6eeb12205b 100644
--- a/packages/angular_devkit/build_angular/package.json
+++ b/packages/angular_devkit/build_angular/package.json
@@ -22,7 +22,6 @@
     "@babel/runtime": "7.27.1",
     "@discoveryjs/json-ext": "0.6.3",
     "@ngtools/webpack": "workspace:0.0.0-PLACEHOLDER",
-    "@vitejs/plugin-basic-ssl": "2.0.0",
     "ansi-colors": "4.1.3",
     "autoprefixer": "10.4.21",
     "babel-loader": "10.0.0",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 976d20cf2fb7..109e4188c3e4 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -629,9 +629,6 @@ importers:
       '@ngtools/webpack':
         specifier: workspace:0.0.0-PLACEHOLDER
         version: link:../../ngtools/webpack
-      '@vitejs/plugin-basic-ssl':
-        specifier: 2.0.0
-        version: 2.0.0(vite@6.3.5(@types/node@20.17.46)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.1)(yaml@2.7.1))
       ansi-colors:
         specifier: 4.1.3
         version: 4.1.3
@@ -6736,7 +6733,6 @@ packages:
     engines: {node: '>=0.6.0', teleport: '>=0.2.0'}
     deprecated: |-
       You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.
-
       (For a CapTP with native promises, see @endo/eventual-send and @endo/captp)
 
   qjobs@1.2.0:

From 434ebb15273c2f367ea707c743c6575d3ada62c2 Mon Sep 17 00:00:00 2001
From: Jan Krems <jankrems@google.com>
Date: Fri, 27 Jun 2025 13:37:17 -0700
Subject: [PATCH 129/138] build: use more shards for application builder tests

(cherry picked from commit dcf356f0fe3effb72810f5f5c6720210178872dc)
---
 packages/angular/build/BUILD.bazel | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/packages/angular/build/BUILD.bazel b/packages/angular/build/BUILD.bazel
index 8762ac9e3880..e46c2da6fcee 100644
--- a/packages/angular/build/BUILD.bazel
+++ b/packages/angular/build/BUILD.bazel
@@ -294,7 +294,7 @@ jasmine_test(
     size = "large",
     data = [":application_integration_test_lib"],
     flaky = True,
-    shard_count = 10,
+    shard_count = 20,
 )
 
 jasmine_test(

From 05cebdbcd1466bf5c95eb724a784aeb8c7ac083f Mon Sep 17 00:00:00 2001
From: Alan Agius <17563226+alan-agius4@users.noreply.github.com>
Date: Tue, 1 Jul 2025 09:42:14 +0000
Subject: [PATCH 130/138] fix(@angular/build): proxy karma request from `/` to
 `/base`

This commit fixes an issue where Karma requests were not being correctly proxied, leading to 404 errors for assets and other files during test execution in Angular projects. The fix ensures that all Karma requests from the root (`/`) are correctly forwarded to the `/base` directory, where Karma serves the files.

Karma will always serve files from `/base`. This change aligns the testing environment with this fundamental behavior, resolving pathing issues and ensuring that tests can locate their dependencies reliably.

Closes #30627

(cherry picked from commit 73f57f3c9e0d9434c0f8507508dfe30f6a402861)
---
 packages/angular/build/src/builders/karma/index.ts | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/packages/angular/build/src/builders/karma/index.ts b/packages/angular/build/src/builders/karma/index.ts
index 1e5f5613e3a3..d3aefeeff628 100644
--- a/packages/angular/build/src/builders/karma/index.ts
+++ b/packages/angular/build/src/builders/karma/index.ts
@@ -99,6 +99,7 @@ function getBuiltInKarmaConfig(
   // Any changes to the config here need to be synced to: packages/schematics/angular/config/files/karma.conf.js.template
   return {
     basePath: '',
+    rootUrl: '/',
     frameworks: ['jasmine'],
     plugins: [
       'karma-jasmine',
@@ -106,6 +107,9 @@ function getBuiltInKarmaConfig(
       'karma-jasmine-html-reporter',
       'karma-coverage',
     ].map((p) => workspaceRootRequire(p)),
+    proxies: {
+      '/': '/base/',
+    },
     jasmineHtmlReporter: {
       suppressAll: true, // removes the duplicated traces
     },

From f5c2d674a8a6e21c3dc150345783409f1a1db567 Mon Sep 17 00:00:00 2001
From: Doug Parker <dgp1130@users.noreply.github.com>
Date: Tue, 1 Jul 2025 13:10:57 -0700
Subject: [PATCH 131/138] release: cut the v20.0.5 release

---
 CHANGELOG.md | 23 +++++++++++++++++++++++
 package.json |  2 +-
 2 files changed, 24 insertions(+), 1 deletion(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 39208a90f89a..b630438e41f2 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,21 @@
+<a name="20.0.5"></a>
+
+# 20.0.5 (2025-07-01)
+
+### @angular-devkit/build-angular
+
+| Commit                                                                                              | Type | Description                                         |
+| --------------------------------------------------------------------------------------------------- | ---- | --------------------------------------------------- |
+| [1ebd53df7](https://github.com/angular/angular-cli/commit/1ebd53df7168307f699a9f9ae8f5ef5b9bcf352c) | fix  | remove unused `@vitejs/plugin-basic-ssl` dependency |
+
+### @angular/build
+
+| Commit                                                                                              | Type | Description                             |
+| --------------------------------------------------------------------------------------------------- | ---- | --------------------------------------- |
+| [05cebdbcd](https://github.com/angular/angular-cli/commit/05cebdbcd1466bf5c95eb724a784aeb8c7ac083f) | fix  | proxy karma request from `/` to `/base` |
+
+<!-- CHANGELOG SPLIT MARKER -->
+
 <a name="20.0.4"></a>
 
 # 20.0.4 (2025-06-25)
@@ -1099,6 +1117,7 @@
 - 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
 
@@ -3909,6 +3928,7 @@ 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.
@@ -4732,6 +4752,7 @@ Alan Agius, Charles Lyding and Doug Parker
 ### @angular/cli
 
 - Several changes to the `ng analytics` command syntax.
+
   - `ng analytics project <setting>` has been replaced with `ng analytics <setting>`
   - `ng analytics <setting>` has been replaced with `ng analytics <setting> --global`
 
@@ -4761,6 +4782,7 @@ 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`
@@ -4769,6 +4791,7 @@ Alan Agius, Charles Lyding and Doug Parker
   - `.mjsx`
 
   Valid extensions for `styles` are:
+
   - `.css`
   - `.less`
   - `.sass`
diff --git a/package.json b/package.json
index 63b32aee21e6..e9ea3fda5767 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@angular/devkit-repo",
-  "version": "20.0.4",
+  "version": "20.0.5",
   "private": true,
   "description": "Software Development Kit for Angular",
   "keywords": [

From 41e28ff58b38883cf4151db718cc2fe54d941e97 Mon Sep 17 00:00:00 2001
From: Doug Parker <dgp1130@users.noreply.github.com>
Date: Wed, 2 Jul 2025 10:39:40 -0700
Subject: [PATCH 132/138] test: raise timeout of
 `//packages/ngtools/webpack:test`

This seems to be timing out occasionally in CI.

(cherry picked from commit d96a0933deffaf7ade5326caeef38e0c8566a402)
---
 packages/ngtools/webpack/BUILD.bazel | 1 +
 1 file changed, 1 insertion(+)

diff --git a/packages/ngtools/webpack/BUILD.bazel b/packages/ngtools/webpack/BUILD.bazel
index eb75d42a0185..332e8a39cc1a 100644
--- a/packages/ngtools/webpack/BUILD.bazel
+++ b/packages/ngtools/webpack/BUILD.bazel
@@ -57,6 +57,7 @@ ts_project(
 
 jasmine_test(
     name = "test",
+    size = "medium",
     data = [
         ":webpack_test_lib",
         # Needed at runtime for runtime TS compilations performed by tests.

From 0836ad28f8e4702f8ba12beef615d60c01a7947c Mon Sep 17 00:00:00 2001
From: Kristiyan Kostadinov <crisbeto@abv.bg>
Date: Thu, 3 Jul 2025 09:15:47 +0200
Subject: [PATCH 133/138] fix(@angular/build): correctly remap Angular
 diagnostics

The esbuild builder has some logic that re-map diagnostics coming from the compiler, depending on their `source` and `code`. Currently this is incorrect, because it assumed that a value of `ngtsc` for `source` always means that the error is from the Angular compiler, but what it actually means is that it comes from an Angular template diagnostics. Furthermore, we can't rely on a `source` always being defined.

These changes align the logic to a similar one we already have in the compiler where we assume the diagnostic comes from Angular if it starts with `-99`.

(cherry picked from commit 1cde40e38a22c406c777abc013311e490c3781b3)
---
 .../build/src/tools/esbuild/angular/diagnostics.ts        | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/packages/angular/build/src/tools/esbuild/angular/diagnostics.ts b/packages/angular/build/src/tools/esbuild/angular/diagnostics.ts
index fab71ee848d2..bf85b69f707c 100644
--- a/packages/angular/build/src/tools/esbuild/angular/diagnostics.ts
+++ b/packages/angular/build/src/tools/esbuild/angular/diagnostics.ts
@@ -75,9 +75,13 @@ export function convertTypeScriptDiagnostic(
 ): PartialMessage {
   let codePrefix = 'TS';
   let code = `${diagnostic.code}`;
-  if (diagnostic.source === 'ngtsc') {
+
+  // Custom ngtsc diagnostics are prefixed with -99 which isn't a valid TypeScript diagnostic code.
+  // Strip it and mark the diagnostic as coming from Angular. Note that we can't rely on
+  // `diagnostic.source`, because it isn't always produced. This is identical to:
+  // https://github.com/angular/angular/blob/main/packages/compiler-cli/src/ngtsc/diagnostics/src/util.ts
+  if (code.startsWith('-99')) {
     codePrefix = 'NG';
-    // Remove `-99` Angular prefix from diagnostic code
     code = code.slice(3);
   }
 

From 1a2da161e73f4f1fe876329adf8ed89f9044b404 Mon Sep 17 00:00:00 2001
From: Alan Agius <17563226+alan-agius4@users.noreply.github.com>
Date: Thu, 3 Jul 2025 10:37:58 +0000
Subject: [PATCH 134/138] fix(@angular/build): failed to proxy error for assets

Remove proxy to handle `/` to `/base/` instead update the `AngularAssetsMiddleware`

Closes #30639

(cherry picked from commit 1aeefa73577342e00a2ae3f9833ac4ca8ee81f36)
---
 .../src/builders/karma/application_builder.ts | 12 ++-
 .../angular/build/src/builders/karma/index.ts |  3 -
 .../karma/tests/options/scripts_spec.ts       | 74 +++++++++++++++++++
 3 files changed, 85 insertions(+), 4 deletions(-)
 create mode 100644 packages/angular/build/src/builders/karma/tests/options/scripts_spec.ts

diff --git a/packages/angular/build/src/builders/karma/application_builder.ts b/packages/angular/build/src/builders/karma/application_builder.ts
index d33469a45ef6..3dd968006684 100644
--- a/packages/angular/build/src/builders/karma/application_builder.ts
+++ b/packages/angular/build/src/builders/karma/application_builder.ts
@@ -84,13 +84,22 @@ class AngularAssetsMiddleware {
       return;
     }
 
+    // Implementation of serverFile can be found here:
+    // https://github.com/karma-runner/karma/blob/84f85e7016efc2266fa6b3465f494a3fa151c85c/lib/middleware/common.js#L10
     switch (file.origin) {
       case 'disk':
         this.serveFile(file.inputPath, undefined, res, undefined, undefined, /* doNotCache */ true);
         break;
       case 'memory':
         // Include pathname to help with Content-Type headers.
-        this.serveFile(`/unused/${url.pathname}`, undefined, res, undefined, file.contents, true);
+        this.serveFile(
+          `/unused/${url.pathname}`,
+          undefined,
+          res,
+          undefined,
+          file.contents,
+          /* doNotCache */ false,
+        );
         break;
     }
   }
@@ -508,6 +517,7 @@ async function initializeApplication(
       scriptsFiles.push({
         pattern: `${outputPath}/${outputName}`,
         watched: false,
+        included: typeof scriptEntry === 'string' ? true : scriptEntry.inject !== false,
         type: 'js',
       });
     }
diff --git a/packages/angular/build/src/builders/karma/index.ts b/packages/angular/build/src/builders/karma/index.ts
index d3aefeeff628..036d503cfdf6 100644
--- a/packages/angular/build/src/builders/karma/index.ts
+++ b/packages/angular/build/src/builders/karma/index.ts
@@ -107,9 +107,6 @@ function getBuiltInKarmaConfig(
       'karma-jasmine-html-reporter',
       'karma-coverage',
     ].map((p) => workspaceRootRequire(p)),
-    proxies: {
-      '/': '/base/',
-    },
     jasmineHtmlReporter: {
       suppressAll: true, // removes the duplicated traces
     },
diff --git a/packages/angular/build/src/builders/karma/tests/options/scripts_spec.ts b/packages/angular/build/src/builders/karma/tests/options/scripts_spec.ts
new file mode 100644
index 000000000000..483a05929e1c
--- /dev/null
+++ b/packages/angular/build/src/builders/karma/tests/options/scripts_spec.ts
@@ -0,0 +1,74 @@
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.dev/license
+ */
+
+import { execute } from '../../index';
+import { BASE_OPTIONS, KARMA_BUILDER_INFO, describeKarmaBuilder } from '../setup';
+
+describeKarmaBuilder(execute, KARMA_BUILDER_INFO, (harness, setupTarget) => {
+  describe('Option: "scripts"', () => {
+    beforeEach(async () => {
+      await setupTarget(harness);
+    });
+
+    it(`should be able to access non injected script`, async () => {
+      await harness.writeFiles({
+        'src/test.js': `console.log('hello from test script.')`,
+        'src/app/app.component.ts': `
+          import { Component } from '@angular/core';
+
+          @Component({
+            selector: 'app-root',
+            standalone: false,
+            template: '<p>Hello World</p>'
+          })
+          export class AppComponent {
+            loadScript() {
+              return new Promise<void>((resolve, reject) => {
+                const script = document.createElement('script');
+                script.onload = () => resolve();
+                script.onerror  = reject;
+                script.src = 'test.js';
+                document.body.appendChild(script);
+              });
+            }
+          }
+         `,
+        'src/app/app.component.spec.ts': `
+          import { TestBed } from '@angular/core/testing';
+          import { AppComponent } from './app.component';
+
+          describe('AppComponent', () => {
+            beforeEach(() => TestBed.configureTestingModule({
+              declarations: [AppComponent]
+            }));
+
+            it('should load script', async () => {
+              const fixture = TestBed.createComponent(AppComponent);
+              fixture.detectChanges();
+
+              await expectAsync(fixture.componentInstance.loadScript()).toBeResolved();
+            });
+          });`,
+      });
+
+      harness.useTarget('test', {
+        ...BASE_OPTIONS,
+        scripts: [
+          {
+            input: 'src/test.js',
+            bundleName: 'test',
+            inject: false,
+          },
+        ],
+      });
+
+      const { result } = await harness.executeOnce();
+      expect(result?.success).toBeTrue();
+    });
+  });
+});

From 5542445d30685a2ebbf66d15848a5abc657863c8 Mon Sep 17 00:00:00 2001
From: cexbrayat <cedric@ninja-squad.com>
Date: Thu, 3 Jul 2025 10:57:21 +0200
Subject: [PATCH 135/138] fix(@schematics/angular): remove constructor from
 service template

Now that the style guide recommends to use `inject()`, having a constructor in a service is not really useful.

(cherry picked from commit cefea43cea1ff7138f05cdef8202d77f403a382a)
---
 .../files/__name@dasherize__.__type@dasherize__.ts.template    | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/packages/schematics/angular/service/files/__name@dasherize__.__type@dasherize__.ts.template b/packages/schematics/angular/service/files/__name@dasherize__.__type@dasherize__.ts.template
index ad3685368077..5c104786d178 100644
--- a/packages/schematics/angular/service/files/__name@dasherize__.__type@dasherize__.ts.template
+++ b/packages/schematics/angular/service/files/__name@dasherize__.__type@dasherize__.ts.template
@@ -4,6 +4,5 @@ import { Injectable } from '@angular/core';
   providedIn: 'root'
 })
 export class <%= classify(name) %><%= classify(type) %> {
-
-  constructor() { }
+  
 }

From 4e021e2ed06fb1d025befa90f7b77c34c18c6a24 Mon Sep 17 00:00:00 2001
From: Alan Agius <17563226+alan-agius4@users.noreply.github.com>
Date: Thu, 3 Jul 2025 14:10:31 +0000
Subject: [PATCH 136/138] build: update bazel commands to use pnpm

`yarn` is no longer used.

(cherry picked from commit cad159402760163c8fd7c724f2d0f12cdefbc5a4)
---
 packages/angular/ssr/test/npm_package/BUILD.bazel | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/packages/angular/ssr/test/npm_package/BUILD.bazel b/packages/angular/ssr/test/npm_package/BUILD.bazel
index 97331cf8a9e0..d79cbf7d0105 100644
--- a/packages/angular/ssr/test/npm_package/BUILD.bazel
+++ b/packages/angular/ssr/test/npm_package/BUILD.bazel
@@ -37,7 +37,7 @@ diff_test(
     failure_message = """
 
     To accept the new golden file, execute:
-    yarn bazel run //packages/angular/ssr/test/npm_package:beasties_license_test.accept
+    pnpm bazel run //packages/angular/ssr/test/npm_package:beasties_license_test.accept
     """,
     file1 = ":THIRD_PARTY_LICENSES.txt.golden",
     file2 = ":beasties_license_file",
@@ -50,7 +50,7 @@ write_file(
         [
             "#!/usr/bin/env bash",
             "cd ${BUILD_WORKSPACE_DIRECTORY}",
-            "yarn bazel build //packages/angular/ssr:npm_package",
+            "pnpm bazel build //packages/angular/ssr:npm_package",
             "cp -fv dist/bin/packages/angular/ssr/npm_package/third_party/beasties/THIRD_PARTY_LICENSES.txt packages/angular/ssr/test/npm_package/THIRD_PARTY_LICENSES.txt.golden",
         ],
     is_executable = True,

From c475e546bfdfee0c098e5198325b52a53882d034 Mon Sep 17 00:00:00 2001
From: Alan Agius <17563226+alan-agius4@users.noreply.github.com>
Date: Wed, 9 Jul 2025 12:35:24 +0000
Subject: [PATCH 137/138] fix(@angular/build): exclude
 `@vitest/browser/context` from esbuild bundling

Bundling this module causes unit tests to fail with `@vitest/browser/context can be imported only inside the Browser Mode. Your test is running in browser pool. Make sure your regular tests are excluded from the "test.include" glob pattern.`, This is because `@vitest/browser/context` is a virtual mode in vite and the package on NPM is dummy that is used for static analysis.

Closes: #30677
(cherry picked from commit 9e292f1c16b563291caa523a6433e4ecc9b9b344)
---
 packages/angular/build/src/builders/unit-test/builder.ts | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/packages/angular/build/src/builders/unit-test/builder.ts b/packages/angular/build/src/builders/unit-test/builder.ts
index 84b41f1a280a..ebdf09949108 100644
--- a/packages/angular/build/src/builders/unit-test/builder.ts
+++ b/packages/angular/build/src/builders/unit-test/builder.ts
@@ -134,7 +134,11 @@ export async function* execute(
     optimization: false,
     tsConfig: normalizedOptions.tsConfig,
     entryPoints,
-    externalDependencies: ['vitest', ...(buildTargetOptions.externalDependencies ?? [])],
+    externalDependencies: [
+      'vitest',
+      '@vitest/browser/context',
+      ...(buildTargetOptions.externalDependencies ?? []),
+    ],
   };
   extensions ??= {};
   extensions.codePlugins ??= [];

From 82cf0cb98b6091df358cd6fb3d54a81fd179369e Mon Sep 17 00:00:00 2001
From: Charles Lyding <19598772+clydin@users.noreply.github.com>
Date: Wed, 9 Jul 2025 11:11:43 -0400
Subject: [PATCH 138/138] release: cut the v20.0.6 release

---
 CHANGELOG.md | 20 ++++++++++++++++++++
 package.json |  2 +-
 2 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index b630438e41f2..c805737b126b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,23 @@
+<a name="20.0.6"></a>
+
+# 20.0.6 (2025-07-09)
+
+### @schematics/angular
+
+| Commit                                                                                              | Type | Description                              |
+| --------------------------------------------------------------------------------------------------- | ---- | ---------------------------------------- |
+| [5542445d3](https://github.com/angular/angular-cli/commit/5542445d30685a2ebbf66d15848a5abc657863c8) | fix  | remove constructor from service template |
+
+### @angular/build
+
+| Commit                                                                                              | Type | Description                                             |
+| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------- |
+| [0836ad28f](https://github.com/angular/angular-cli/commit/0836ad28f8e4702f8ba12beef615d60c01a7947c) | fix  | correctly remap Angular diagnostics                     |
+| [c475e546b](https://github.com/angular/angular-cli/commit/c475e546bfdfee0c098e5198325b52a53882d034) | fix  | exclude `@vitest/browser/context` from esbuild bundling |
+| [1a2da161e](https://github.com/angular/angular-cli/commit/1a2da161e73f4f1fe876329adf8ed89f9044b404) | fix  | failed to proxy error for assets                        |
+
+<!-- CHANGELOG SPLIT MARKER -->
+
 <a name="20.0.5"></a>
 
 # 20.0.5 (2025-07-01)
diff --git a/package.json b/package.json
index e9ea3fda5767..5ca4b2e4c993 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@angular/devkit-repo",
-  "version": "20.0.5",
+  "version": "20.0.6",
   "private": true,
   "description": "Software Development Kit for Angular",
   "keywords": [
