Skip to content

Commit 94b86b1

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.
1 parent b2e2e68 commit 94b86b1

File tree

8 files changed

+91
-9
lines changed

8 files changed

+91
-9
lines changed

packages/angular/pwa/pwa/index.ts

Lines changed: 6 additions & 2 deletions
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

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,4 +169,52 @@ describe('PWA Schematic', () => {
169169
expect(swFlag).toBeTrue();
170170
});
171171
});
172+
173+
describe('@angular-devkit/build-angular:application builder', () => {
174+
function convertBuilderToLegacyBrowser(): void {
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+
beforeEach(() => {
184+
convertBuilderToLegacyBrowser();
185+
});
186+
187+
it('should run the service worker schematic', async () => {
188+
const tree = await schematicRunner.runSchematic('ng-add', defaultOptions, appTree);
189+
const configText = tree.readContent('/angular.json');
190+
const config = JSON.parse(configText);
191+
const swFlag = config.projects.bar.architect.build.configurations.production.serviceWorker;
192+
193+
expect(swFlag).toBe('projects/bar/ngsw-config.json');
194+
});
195+
});
196+
197+
describe('@angular/build:application builder', () => {
198+
function convertBuilderToLegacyBrowser(): void {
199+
const config = JSON.parse(appTree.readContent('/angular.json'));
200+
const build = config.projects.bar.architect.build;
201+
202+
build.builder = '@angular/build:application';
203+
204+
appTree.overwrite('/angular.json', JSON.stringify(config, undefined, 2));
205+
}
206+
207+
beforeEach(() => {
208+
convertBuilderToLegacyBrowser();
209+
});
210+
211+
it('should run the service worker schematic', async () => {
212+
const tree = await schematicRunner.runSchematic('ng-add', defaultOptions, appTree);
213+
const configText = tree.readContent('/angular.json');
214+
const config = JSON.parse(configText);
215+
const swFlag = config.projects.bar.architect.build.configurations.production.serviceWorker;
216+
217+
expect(swFlag).toBe('projects/bar/ngsw-config.json');
218+
});
219+
});
172220
});

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

Lines changed: 3 additions & 3 deletions
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

Lines changed: 7 additions & 2 deletions
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

Lines changed: 18 additions & 0 deletions
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

Lines changed: 2 additions & 1 deletion
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

Lines changed: 4 additions & 1 deletion
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

Lines changed: 3 additions & 0 deletions
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)