From 472f8cff922d828d3578087e427fdebf13bdceb8 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Wed, 1 Oct 2025 17:29:58 -0400 Subject: [PATCH] refactor(@angular/build): make buildTarget optional in unit-test builder The `buildTarget` option in the `unit-test` builder is now optional to streamline the user configuration. If the `buildTarget` option is not provided, the builder now defaults to using the `build` target with the `development` configuration for the current project. This change significantly reduces the boilerplate configuration needed in `angular.json` for most projects, as the builder can now infer the correct build settings by convention. The builder's schema has been updated to reflect this change by removing `buildTarget` from the required properties and updating its description to document the new default behavior. --- goldens/public-api/angular/build/index.api.md | 2 +- .../build/src/builders/unit-test/builder.ts | 20 ++++++++++++++----- .../build/src/builders/unit-test/schema.json | 4 ++-- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/goldens/public-api/angular/build/index.api.md b/goldens/public-api/angular/build/index.api.md index 149471337945..b1338ae84508 100644 --- a/goldens/public-api/angular/build/index.api.md +++ b/goldens/public-api/angular/build/index.api.md @@ -216,7 +216,7 @@ export type NgPackagrBuilderOptions = { // @public export type UnitTestBuilderOptions = { browsers?: string[]; - buildTarget: string; + buildTarget?: string; coverage?: boolean; coverageAll?: boolean; coverageExclude?: string[]; diff --git a/packages/angular/build/src/builders/unit-test/builder.ts b/packages/angular/build/src/builders/unit-test/builder.ts index 8471e4e9f29c..4785c6c6d16c 100644 --- a/packages/angular/build/src/builders/unit-test/builder.ts +++ b/packages/angular/build/src/builders/unit-test/builder.ts @@ -240,9 +240,22 @@ export async function* execute( // Get base build options from the buildTarget let buildTargetOptions: ApplicationBuilderInternalOptions; try { + const builderName = await context.getBuilderNameForTarget(normalizedOptions.buildTarget); + if ( + builderName !== '@angular/build:application' && + // TODO: Add comprehensive support for ng-packagr. + builderName !== '@angular/build:ng-packagr' + ) { + context.logger.warn( + `The 'buildTarget' is configured to use '${builderName}', which is not supported. ` + + `The 'unit-test' builder is designed to work with '@angular/build:application'. ` + + 'Unexpected behavior or build failures may occur.', + ); + } + buildTargetOptions = (await context.validateOptions( await context.getTargetOptions(normalizedOptions.buildTarget), - await context.getBuilderNameForTarget(normalizedOptions.buildTarget), + builderName, )) as unknown as ApplicationBuilderInternalOptions; } catch (e) { assertIsError(e); @@ -297,12 +310,9 @@ export async function* execute( ...runnerBuildOptions, watch: normalizedOptions.watch, progress: normalizedOptions.buildProgress ?? buildTargetOptions.progress, + ...(normalizedOptions.tsConfig ? { tsConfig: normalizedOptions.tsConfig } : {}), } satisfies ApplicationBuilderInternalOptions; - if (normalizedOptions.tsConfig) { - applicationBuildOptions.tsConfig = normalizedOptions.tsConfig; - } - const dumpDirectory = normalizedOptions.dumpVirtualFiles ? path.join(normalizedOptions.cacheOptions.path, 'unit-test', 'output-files') : undefined; diff --git a/packages/angular/build/src/builders/unit-test/schema.json b/packages/angular/build/src/builders/unit-test/schema.json index 5ebc906329b4..303bd6905019 100644 --- a/packages/angular/build/src/builders/unit-test/schema.json +++ b/packages/angular/build/src/builders/unit-test/schema.json @@ -6,7 +6,7 @@ "properties": { "buildTarget": { "type": "string", - "description": "Specifies the build target to use for the unit test build in the format `project:target[:configuration]`. You can also pass a comma-separated list of configurations. Example: `project:target:production,staging`.", + "description": "Specifies the build target to use for the unit test build in the format `project:target[:configuration]`. This defaults to the `build` target of the current project with the `development` configuration. You can also pass a comma-separated list of configurations. Example: `project:target:production,staging`.", "pattern": "^[^:\\s]*:[^:\\s]*(:[^\\s]+)?$" }, "tsConfig": { @@ -262,5 +262,5 @@ } }, "additionalProperties": false, - "required": ["buildTarget", "runner"] + "required": ["runner"] }