From 4493d7833a336acfa5d6c4671e1d649318e876d0 Mon Sep 17 00:00:00 2001 From: Raashish Aggarwal <94279692+raashish1601@users.noreply.github.com> Date: Fri, 27 Mar 2026 18:24:39 +0530 Subject: [PATCH 1/3] fix(@schematics/angular): preserve workspace build version --- .../use-application-builder/migration.ts | 6 +++++- .../use-application-builder/migration_spec.ts | 17 +++++++++++++++++ 2 files changed, 22 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 b481c4f30034..9a0040ad9f1d 100644 --- a/packages/schematics/angular/migrations/use-application-builder/migration.ts +++ b/packages/schematics/angular/migrations/use-application-builder/migration.ts @@ -15,6 +15,7 @@ import { externalSchematic, } from '@angular-devkit/schematics'; import { dirname, join } from 'node:path/posix'; +import { getPackageJsonDependency } from '../../utility/dependencies'; import { DependencyType, ExistingBehavior, @@ -270,8 +271,11 @@ function updateProjects(tree: Tree, context: SchematicContext) { } // Add direct @angular/build dependencies and remove @angular-devkit/build-angular + const buildDependency = + getPackageJsonDependency(tree, '@angular-devkit/build-angular') ?? + getPackageJsonDependency(tree, '@angular/build'); rules.push( - addDependency('@angular/build', latestVersions.DevkitBuildAngular, { + addDependency('@angular/build', buildDependency?.version ?? latestVersions.AngularBuild, { type: DependencyType.Dev, existing: ExistingBehavior.Replace, }), 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 fd10352c6eac..70730d73de5e 100644 --- a/packages/schematics/angular/migrations/use-application-builder/migration_spec.ts +++ b/packages/schematics/angular/migrations/use-application-builder/migration_spec.ts @@ -450,6 +450,23 @@ describe(`Migration to use the application builder`, () => { expect(devDependencies['postcss']).toBeUndefined(); }); + it('should reuse the installed builder version when migrating to "@angular/build"', async () => { + tree.overwrite( + '/package.json', + JSON.stringify({ + devDependencies: { + '@angular-devkit/build-angular': '~18.2.20', + }, + }), + ); + + const newTree = await schematicRunner.runSchematic(schematicName, {}, tree); + + const { devDependencies } = JSON.parse(newTree.readContent('/package.json')); + expect(devDependencies['@angular/build']).toBe('~18.2.20'); + expect(devDependencies['@angular-devkit/build-angular']).toBeUndefined(); + }); + it('it should not add esModuleInterop and moduleResolution when module is preserve', async () => { tree.overwrite( 'tsconfig.json', From 60392dd84e863bc09754a34efccca53a82d4173c Mon Sep 17 00:00:00 2001 From: Raashish Aggarwal <94279692+raashish1601@users.noreply.github.com> Date: Fri, 27 Mar 2026 19:04:08 +0530 Subject: [PATCH 2/3] fix(@schematics/angular): keep existing build versions --- .../use-application-builder/migration.ts | 12 ++++++------ .../use-application-builder/migration_spec.ts | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/packages/schematics/angular/migrations/use-application-builder/migration.ts b/packages/schematics/angular/migrations/use-application-builder/migration.ts index 9a0040ad9f1d..ea7afb5beba8 100644 --- a/packages/schematics/angular/migrations/use-application-builder/migration.ts +++ b/packages/schematics/angular/migrations/use-application-builder/migration.ts @@ -15,11 +15,11 @@ import { externalSchematic, } from '@angular-devkit/schematics'; import { dirname, join } from 'node:path/posix'; -import { getPackageJsonDependency } from '../../utility/dependencies'; import { DependencyType, ExistingBehavior, addDependency, + getDependency, removeDependency, } from '../../utility/dependency'; import { JSONFile } from '../../utility/json-file'; @@ -271,13 +271,13 @@ function updateProjects(tree: Tree, context: SchematicContext) { } // Add direct @angular/build dependencies and remove @angular-devkit/build-angular - const buildDependency = - getPackageJsonDependency(tree, '@angular-devkit/build-angular') ?? - getPackageJsonDependency(tree, '@angular/build'); + const buildAngularVersion = + getDependency(tree, '@angular-devkit/build-angular')?.version ?? + latestVersions.DevkitBuildAngular; rules.push( - addDependency('@angular/build', buildDependency?.version ?? latestVersions.AngularBuild, { + addDependency('@angular/build', buildAngularVersion, { type: DependencyType.Dev, - existing: ExistingBehavior.Replace, + existing: ExistingBehavior.Skip, }), removeDependency('@angular-devkit/build-angular'), ); 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 70730d73de5e..72a29805c9e8 100644 --- a/packages/schematics/angular/migrations/use-application-builder/migration_spec.ts +++ b/packages/schematics/angular/migrations/use-application-builder/migration_spec.ts @@ -467,6 +467,24 @@ describe(`Migration to use the application builder`, () => { expect(devDependencies['@angular-devkit/build-angular']).toBeUndefined(); }); + it('should preserve an existing "@angular/build" version when migrating', async () => { + tree.overwrite( + '/package.json', + JSON.stringify({ + devDependencies: { + '@angular-devkit/build-angular': '~18.2.20', + '@angular/build': '~18.2.10', + }, + }), + ); + + const newTree = await schematicRunner.runSchematic(schematicName, {}, tree); + + const { devDependencies } = JSON.parse(newTree.readContent('/package.json')); + expect(devDependencies['@angular/build']).toBe('~18.2.10'); + expect(devDependencies['@angular-devkit/build-angular']).toBeUndefined(); + }); + it('it should not add esModuleInterop and moduleResolution when module is preserve', async () => { tree.overwrite( 'tsconfig.json', From c82410d03d824d9a71adbbe962e11afd407b1618 Mon Sep 17 00:00:00 2001 From: Raashish Aggarwal <94279692+raashish1601@users.noreply.github.com> Date: Sat, 28 Mar 2026 19:00:40 +0530 Subject: [PATCH 3/3] fix(@schematics/angular): use angular build fallback version --- .../migrations/use-application-builder/migration.ts | 2 +- .../migrations/use-application-builder/migration_spec.ts | 9 +++++++++ 2 files changed, 10 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 ea7afb5beba8..9df1e7df0c44 100644 --- a/packages/schematics/angular/migrations/use-application-builder/migration.ts +++ b/packages/schematics/angular/migrations/use-application-builder/migration.ts @@ -273,7 +273,7 @@ function updateProjects(tree: Tree, context: SchematicContext) { // Add direct @angular/build dependencies and remove @angular-devkit/build-angular const buildAngularVersion = getDependency(tree, '@angular-devkit/build-angular')?.version ?? - latestVersions.DevkitBuildAngular; + latestVersions.AngularBuild; rules.push( addDependency('@angular/build', buildAngularVersion, { type: DependencyType.Dev, 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 72a29805c9e8..f5cc0002d534 100644 --- a/packages/schematics/angular/migrations/use-application-builder/migration_spec.ts +++ b/packages/schematics/angular/migrations/use-application-builder/migration_spec.ts @@ -9,6 +9,7 @@ import { JsonObject } from '@angular-devkit/core'; import { EmptyTree } from '@angular-devkit/schematics'; import { SchematicTestRunner, UnitTestTree } from '@angular-devkit/schematics/testing'; +import { latestVersions } from '../../utility/latest-versions'; import { Builders, ProjectType, WorkspaceSchema } from '../../utility/workspace-models'; function createWorkSpaceConfig(tree: UnitTestTree) { @@ -467,6 +468,14 @@ describe(`Migration to use the application builder`, () => { expect(devDependencies['@angular-devkit/build-angular']).toBeUndefined(); }); + it('should use the latest "@angular/build" version when no builder is installed', async () => { + const newTree = await schematicRunner.runSchematic(schematicName, {}, tree); + + const { devDependencies } = JSON.parse(newTree.readContent('/package.json')); + expect(devDependencies['@angular/build']).toBe(latestVersions.AngularBuild); + expect(devDependencies['@angular-devkit/build-angular']).toBeUndefined(); + }); + it('should preserve an existing "@angular/build" version when migrating', async () => { tree.overwrite( '/package.json',