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 1/9] 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 2/9] 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 3/9] 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 Date: Thu, 5 Jun 2025 13:28:26 +0000 Subject: [PATCH 4/9] 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 Date: Thu, 5 Jun 2025 09:25:24 -0700 Subject: [PATCH 5/9] 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 Date: Fri, 6 Jun 2025 16:27:46 +0000 Subject: [PATCH 6/9] 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 7/9] 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 8/9] 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 9/9] 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 @@ + + +# 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 | + + + # 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": [