Skip to content

Commit fe8d83a

Browse files
committed
fix(@schematics/angular): add additional checks for application builder usage
The Angular schematics have been updated to perform additional checks for both the `@angular-devkit/build-angular:application` and `@angular/build:application` builders. This ensures that the schematics generate the appropriate output for each of these build systems in addition to the Webpack-based `browser` builder. (cherry picked from commit 1b43c05)
1 parent 1f715d2 commit fe8d83a

File tree

8 files changed

+83
-9
lines changed

8 files changed

+83
-9
lines changed

packages/angular/pwa/pwa/index.ts

+6-2
Original file line numberDiff line numberDiff line change
@@ -96,10 +96,14 @@ export default function (options: PwaOptions): Rule {
9696
for (const target of project.targets.values()) {
9797
if (
9898
target.builder === '@angular-devkit/build-angular:browser' ||
99-
target.builder === '@angular-devkit/build-angular:application'
99+
target.builder === '@angular-devkit/build-angular:application' ||
100+
target.builder === '@angular/build:application'
100101
) {
101102
buildTargets.push(target);
102-
} else if (target.builder === '@angular-devkit/build-angular:karma') {
103+
} else if (
104+
target.builder === '@angular-devkit/build-angular:karma' ||
105+
target.builder === '@angular/build:karma'
106+
) {
103107
testTargets.push(target);
104108
}
105109
}

packages/angular/pwa/pwa/index_spec.ts

+40
Original file line numberDiff line numberDiff line change
@@ -169,4 +169,44 @@ describe('PWA Schematic', () => {
169169
expect(swFlag).toBeTrue();
170170
});
171171
});
172+
173+
describe('@angular-devkit/build-angular:application builder', () => {
174+
beforeEach(() => {
175+
const config = JSON.parse(appTree.readContent('/angular.json'));
176+
const build = config.projects.bar.architect.build;
177+
178+
build.builder = '@angular-devkit/build-angular:application';
179+
180+
appTree.overwrite('/angular.json', JSON.stringify(config, undefined, 2));
181+
});
182+
183+
it('should run the service worker schematic', async () => {
184+
const tree = await schematicRunner.runSchematic('ng-add', defaultOptions, appTree);
185+
const configText = tree.readContent('/angular.json');
186+
const config = JSON.parse(configText);
187+
const swFlag = config.projects.bar.architect.build.configurations.production.serviceWorker;
188+
189+
expect(swFlag).toBe('projects/bar/ngsw-config.json');
190+
});
191+
});
192+
193+
describe('@angular/build:application builder', () => {
194+
beforeEach(() => {
195+
const config = JSON.parse(appTree.readContent('/angular.json'));
196+
const build = config.projects.bar.architect.build;
197+
198+
build.builder = '@angular/build:application';
199+
200+
appTree.overwrite('/angular.json', JSON.stringify(config, undefined, 2));
201+
});
202+
203+
it('should run the service worker schematic', async () => {
204+
const tree = await schematicRunner.runSchematic('ng-add', defaultOptions, appTree);
205+
const configText = tree.readContent('/angular.json');
206+
const config = JSON.parse(configText);
207+
const swFlag = config.projects.bar.architect.build.configurations.production.serviceWorker;
208+
209+
expect(swFlag).toBe('projects/bar/ngsw-config.json');
210+
});
211+
});
172212
});

packages/schematics/angular/config/files/karma.conf.js.template

+3-3
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@
44
module.exports = function (config) {
55
config.set({
66
basePath: '',
7-
frameworks: ['jasmine', '@angular-devkit/build-angular'],
7+
frameworks: ['jasmine'<% if (needDevkitPlugin) { %>, '@angular-devkit/build-angular'<% } %>],
88
plugins: [
99
require('karma-jasmine'),
1010
require('karma-chrome-launcher'),
1111
require('karma-jasmine-html-reporter'),
12-
require('karma-coverage'),
13-
require('@angular-devkit/build-angular/plugins/karma')
12+
require('karma-coverage'),<% if (needDevkitPlugin) { %>
13+
require('@angular-devkit/build-angular/plugins/karma')<% } %>
1414
],
1515
client: {
1616
jasmine: {

packages/schematics/angular/config/index.ts

+7-2
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,13 @@ function addKarmaConfig(options: ConfigOptions): Rule {
6666
);
6767
}
6868

69-
if (testTarget.builder !== AngularBuilder.Karma) {
69+
if (
70+
testTarget.builder !== AngularBuilder.Karma &&
71+
testTarget.builder !== AngularBuilder.BuildKarma
72+
) {
7073
throw new SchematicsException(
71-
`Cannot add a karma configuration as builder for "test" target in project does not use "${AngularBuilder.Karma}".`,
74+
`Cannot add a karma configuration as builder for "test" target in project does not` +
75+
` use "${AngularBuilder.Karma}" or "${AngularBuilder.BuildKarma}".`,
7276
);
7377
}
7478

@@ -87,6 +91,7 @@ function addKarmaConfig(options: ConfigOptions): Rule {
8791
applyTemplates({
8892
relativePathToWorkspaceRoot: relativePathToWorkspaceRoot(project.root),
8993
folderName,
94+
needDevkitPlugin: testTarget.builder === AngularBuilder.Karma,
9095
}),
9196
move(project.root),
9297
]),

packages/schematics/angular/config/index_spec.ts

+18
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,24 @@ describe('Config Schematic', () => {
5858
expect(tree.exists('projects/foo/karma.conf.js')).toBeTrue();
5959
});
6060

61+
it('should include devkit karma plugin by default', async () => {
62+
const tree = await runConfigSchematic(ConfigType.Karma);
63+
const karmaConf = tree.readText('projects/foo/karma.conf.js');
64+
expect(karmaConf).toContain(`'@angular-devkit/build-angular'`);
65+
});
66+
67+
it('should not include devkit karma plugin with angular/build:karma is used', async () => {
68+
applicationTree.overwrite(
69+
'angular.json',
70+
applicationTree
71+
.readText('angular.json')
72+
.replace('@angular-devkit/build-angular:karma', '@angular/build:karma'),
73+
);
74+
const tree = await runConfigSchematic(ConfigType.Karma);
75+
const karmaConf = tree.readText('projects/foo/karma.conf.js');
76+
expect(karmaConf).not.toContain(`'@angular-devkit/build-angular'`);
77+
});
78+
6179
it('should set the right coverage folder', async () => {
6280
const tree = await runConfigSchematic(ConfigType.Karma);
6381
const karmaConf = tree.readText('projects/foo/karma.conf.js');

packages/schematics/angular/environments/index.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,8 @@ function* generateConfigurationEnvironments(
7575
if (
7676
buildTarget.builder !== AngularBuilder.Browser &&
7777
buildTarget.builder !== AngularBuilder.BrowserEsbuild &&
78-
buildTarget.builder !== AngularBuilder.Application
78+
buildTarget.builder !== AngularBuilder.Application &&
79+
buildTarget.builder !== AngularBuilder.BuildApplication
7980
) {
8081
yield log(
8182
'warn',

packages/schematics/angular/service-worker/index.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,10 @@ export default function (options: ServiceWorkerOptions): Rule {
122122
let browserEntryPoint: string | undefined;
123123
const ngswConfigPath = join(normalize(project.root), 'ngsw-config.json');
124124

125-
if (buildTarget.builder === Builders.Application) {
125+
if (
126+
buildTarget.builder === Builders.Application ||
127+
buildTarget.builder === Builders.BuildApplication
128+
) {
126129
browserEntryPoint = buildOptions.browser as string;
127130
const productionConf = buildTarget.configurations?.production;
128131
if (productionConf) {

packages/schematics/angular/utility/workspace-models.ts

+3
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,14 @@ export enum Builders {
2626
Prerender = '@angular-devkit/build-angular:prerender',
2727
BrowserEsbuild = '@angular-devkit/build-angular:browser-esbuild',
2828
Karma = '@angular-devkit/build-angular:karma',
29+
BuildKarma = '@angular/build:karma',
2930
TsLint = '@angular-devkit/build-angular:tslint',
3031
NgPackagr = '@angular-devkit/build-angular:ng-packagr',
3132
BuildNgPackagr = '@angular/build:ng-packagr',
3233
DevServer = '@angular-devkit/build-angular:dev-server',
34+
BuildDevServer = '@angular/build:dev-server',
3335
ExtractI18n = '@angular-devkit/build-angular:extract-i18n',
36+
BuildExtractI18n = '@angular/build:extract-i18n',
3437
Protractor = '@angular-devkit/build-angular:private-protractor',
3538
BuildApplication = '@angular/build:application',
3639
}

0 commit comments

Comments
 (0)