From 1da359ac08d1a5503ab152db72ee6cee927391b8 Mon Sep 17 00:00:00 2001 From: Alan Agius Date: Thu, 4 Mar 2021 10:01:53 +0100 Subject: [PATCH] feat(@angular-devkit/architect): add implementation for defaultConfiguration With this change, the architect can be configured to use a default configuration when it's not provided as part of the target. Consider the below, where `defaultConfiguration` is configured to `production`. Running `ng build` will be invoked with "production" configuration. ```js "build": { "builder": "@angular-devkit/build-angular:browser", "defaultConfiguration": "production", "options": { ... }, "configurations": { "production": { ... } } } ``` --- .../node/node-modules-architect-host.ts | 10 ++++-- .../src/testing/builder-harness.ts | 3 ++ .../misc/target-default-configuration.ts | 35 +++++++++++++++++++ 3 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 tests/legacy-cli/e2e/tests/misc/target-default-configuration.ts 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 cdccb1a24e1c..b41059280b0d 100644 --- a/packages/angular_devkit/architect/node/node-modules-architect-host.ts +++ b/packages/angular_devkit/architect/node/node-modules-architect-host.ts @@ -30,6 +30,7 @@ export interface WorkspaceHost { getMetadata(project: string): Promise; getOptions(project: string, target: string, configuration?: string): Promise; hasTarget(project: string, target: string): Promise; + getDefaultConfigurationName(project: string, target: string): Promise; } function findProjectTarget( @@ -99,6 +100,9 @@ export class WorkspaceNodeModulesArchitectHost implements ArchitectHost c.trim()); + if (targetConfiguration) { + const configurations = targetConfiguration.split(',').map((c) => c.trim()); for (const configuration of configurations) { options = { ...options, diff --git a/packages/angular_devkit/build_angular/src/testing/builder-harness.ts b/packages/angular_devkit/build_angular/src/testing/builder-harness.ts index 577ba868adc2..ce3782ec7111 100644 --- a/packages/angular_devkit/build_angular/src/testing/builder-harness.ts +++ b/packages/angular_devkit/build_angular/src/testing/builder-harness.ts @@ -174,6 +174,9 @@ export class BuilderHarness { return this.targetName === target || this.builderTargets.has(target); }, + getDefaultConfigurationName: async (_project, _target) => { + return undefined; + }, validate: async (options, builderName) => { let schema; if (builderName === this.builderInfo.builderName) { diff --git a/tests/legacy-cli/e2e/tests/misc/target-default-configuration.ts b/tests/legacy-cli/e2e/tests/misc/target-default-configuration.ts new file mode 100644 index 000000000000..010a922494c4 --- /dev/null +++ b/tests/legacy-cli/e2e/tests/misc/target-default-configuration.ts @@ -0,0 +1,35 @@ +import { expectFileToExist } from '../../utils/fs'; +import { ng } from '../../utils/process'; +import { updateJsonFile } from '../../utils/project'; +import { expectToFail } from '../../utils/utils'; + +export default async function () { + await updateJsonFile('angular.json', workspace => { + const build = workspace.projects['test-project'].architect.build; + build.defaultConfiguration = undefined; + build.options = { + ...build.options, + optimization: false, + buildOptimizer: false, + outputHashing: 'none', + sourceMap: true, + }; + }); + + await ng('build'); + await expectFileToExist('dist/test-project/main.js'); + await expectFileToExist('dist/test-project/main.js.map'); + + // Add new configuration and set "defaultConfiguration" + await updateJsonFile('angular.json', workspace => { + const build = workspace.projects['test-project'].architect.build; + build.defaultConfiguration = 'defaultConfiguration'; + build.configurations.defaultConfiguration = { + sourceMap: false, + }; + }); + + await ng('build'); + await expectFileToExist('dist/test-project/main.js'); + await expectToFail(() => expectFileToExist('dist/test-project/main.js.map')); +}