Skip to content

Commit f72b95f

Browse files
trikjelbourn
authored andcommitted
fix(ng-add): ng add @angular/material fails in library projects (#19164)
Skip app related ng-add steps when working with library projects and warn about missing setup steps
1 parent 586b862 commit f72b95f

File tree

6 files changed

+97
-16
lines changed

6 files changed

+97
-16
lines changed

src/cdk/schematics/testing/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,6 @@
99
export * from './post-scheduled-tasks';
1010
export * from './test-app';
1111
export * from './test-case-setup';
12+
export * from './test-library';
1213
export * from './file-content';
1314
export * from './resolve-bazel-path';

src/cdk/schematics/testing/test-app.ts

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,10 @@
99
import {Tree} from '@angular-devkit/schematics';
1010
import {SchematicTestRunner, UnitTestTree} from '@angular-devkit/schematics/testing';
1111

12+
import {createTestProject} from './test-project';
13+
1214
/** Create a base app used for testing. */
1315
export async function createTestApp(runner: SchematicTestRunner, appOptions = {}, tree?: Tree):
1416
Promise<UnitTestTree> {
15-
const workspaceTree = await runner.runExternalSchematicAsync('@schematics/angular', 'workspace', {
16-
name: 'workspace',
17-
version: '6.0.0',
18-
newProjectRoot: 'projects',
19-
}, tree).toPromise();
20-
21-
return runner.runExternalSchematicAsync('@schematics/angular', 'application',
22-
{name: 'material', ...appOptions}, workspaceTree).toPromise();
17+
return createTestProject(runner, 'application', appOptions, tree);
2318
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/**
2+
* @license
3+
* Copyright Google LLC All Rights Reserved.
4+
*
5+
* Use of this source code is governed by an MIT-style license that can be
6+
* found in the LICENSE file at https://angular.io/license
7+
*/
8+
9+
import {Tree} from '@angular-devkit/schematics';
10+
import {SchematicTestRunner, UnitTestTree} from '@angular-devkit/schematics/testing';
11+
12+
import {createTestProject} from './test-project';
13+
14+
/** Create a base library used for testing. */
15+
export async function createTestLibrary(runner: SchematicTestRunner, appOptions = {}, tree?: Tree):
16+
Promise<UnitTestTree> {
17+
return createTestProject(runner, 'library', appOptions, tree);
18+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/**
2+
* @license
3+
* Copyright Google LLC All Rights Reserved.
4+
*
5+
* Use of this source code is governed by an MIT-style license that can be
6+
* found in the LICENSE file at https://angular.io/license
7+
*/
8+
9+
import {Tree} from '@angular-devkit/schematics';
10+
import {SchematicTestRunner, UnitTestTree} from '@angular-devkit/schematics/testing';
11+
12+
/** Create a base project used for testing. */
13+
export async function createTestProject(
14+
runner: SchematicTestRunner, projectType: 'application'|'library', appOptions = {}, tree?: Tree):
15+
Promise<UnitTestTree> {
16+
const workspaceTree = await runner.runExternalSchematicAsync('@schematics/angular', 'workspace', {
17+
name: 'workspace',
18+
version: '6.0.0',
19+
newProjectRoot: 'projects',
20+
}, tree).toPromise();
21+
22+
return runner.runExternalSchematicAsync('@schematics/angular', projectType,
23+
{name: 'material', ...appOptions}, workspaceTree).toPromise();
24+
}

src/material/schematics/ng-add/index.spec.ts

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import {
88
getProjectStyleFile,
99
getProjectTargetOptions,
1010
} from '@angular/cdk/schematics';
11-
import {createTestApp, getFileContent} from '@angular/cdk/schematics/testing';
11+
import {createTestApp, createTestLibrary, getFileContent} from '@angular/cdk/schematics/testing';
1212
import {getWorkspace} from '@schematics/angular/utility/config';
1313
import {COLLECTION_PATH} from '../index.spec';
1414
import {addPackageToPackageJson} from './package-config';
@@ -419,3 +419,33 @@ describe('ng-add schematic', () => {
419419
});
420420
});
421421
});
422+
423+
describe('ng-add schematic - library project', () => {
424+
let runner: SchematicTestRunner;
425+
let libraryTree: Tree;
426+
let errorOutput: string[];
427+
let warnOutput: string[];
428+
429+
beforeEach(async () => {
430+
runner = new SchematicTestRunner('schematics', require.resolve('../collection.json'));
431+
libraryTree = await createTestLibrary(runner);
432+
433+
errorOutput = [];
434+
warnOutput = [];
435+
runner.logger.subscribe(e => {
436+
if (e.level === 'error') {
437+
errorOutput.push(e.message);
438+
} else if (e.level === 'warn') {
439+
warnOutput.push(e.message);
440+
}
441+
});
442+
});
443+
444+
it('should warn if a library project is targeted', async () => {
445+
await runner.runSchematicAsync('ng-add-setup-project', {}, libraryTree).toPromise();
446+
447+
expect(errorOutput.length).toBe(0);
448+
expect(warnOutput.length).toBe(1);
449+
expect(warnOutput[0]).toMatch(/There is no additional setup required/);
450+
});
451+
});

src/material/schematics/ng-add/setup-project.ts

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,26 @@ const noopAnimationsModuleName = 'NoopAnimationsModule';
3333
* - Adds Browser Animation to app.module
3434
*/
3535
export default function(options: Schema): Rule {
36-
return chain([
37-
addAnimationsModule(options),
38-
addThemeToAppStyles(options),
39-
addFontsToIndex(options),
40-
addMaterialAppStyles(options),
41-
addTypographyClass(options),
42-
]);
36+
return (host: Tree, context: SchematicContext) => {
37+
const workspace = getWorkspace(host);
38+
const project = getProjectFromWorkspace(workspace, options.project);
39+
40+
if (project.projectType === 'application') {
41+
return chain([
42+
addAnimationsModule(options),
43+
addThemeToAppStyles(options),
44+
addFontsToIndex(options),
45+
addMaterialAppStyles(options),
46+
addTypographyClass(options),
47+
]);
48+
}
49+
context.logger.warn(
50+
'Angular Material has been set up in your workspace. There is no additional setup ' +
51+
'required for consuming Angular Material in your library project.\n\n' +
52+
'If you intended to run the schematic on a different project, pass the `--project` ' +
53+
'option.');
54+
return host;
55+
};
4356
}
4457

4558
/**

0 commit comments

Comments
 (0)