Skip to content

Commit 641c65f

Browse files
authored
feat: prompt for jest-dom and user-event installation in ng-add (#478)
Closes #477 Closes #472
1 parent 80ec75d commit 641c65f

File tree

3 files changed

+53
-11
lines changed

3 files changed

+53
-11
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,44 @@
1-
import { Rule, SchematicContext, Tree } from '@angular-devkit/schematics';
1+
import { chain, noop, Rule, SchematicContext, Tree } from '@angular-devkit/schematics';
22
import {
33
addPackageJsonDependency,
44
getPackageJsonDependency,
55
NodeDependencyType,
66
} from '@schematics/angular/utility/dependencies';
7+
import { NodePackageInstallTask } from '@angular-devkit/schematics/tasks';
8+
import { Schema } from './schema';
79

8-
const dtl = '@testing-library/dom';
10+
export default function ({ installJestDom, installUserEvent }: Schema): Rule {
11+
return () => {
12+
return chain([
13+
addDependency('@testing-library/dom', '^10.0.0', NodeDependencyType.Dev),
14+
installJestDom ? addDependency('@testing-library/jest-dom', '^6.4.8', NodeDependencyType.Dev) : noop(),
15+
installUserEvent ? addDependency('@testing-library/user-event', '^14.5.2', NodeDependencyType.Dev) : noop(),
16+
installDependencies(),
17+
]);
18+
};
19+
}
920

10-
export default function (): Rule {
21+
function addDependency(packageName: string, version: string, dependencyType: NodeDependencyType) {
1122
return (tree: Tree, context: SchematicContext) => {
12-
const dtlDep = getPackageJsonDependency(tree, dtl);
23+
const dtlDep = getPackageJsonDependency(tree, packageName);
1324
if (dtlDep) {
14-
context.logger.info(`Skipping installation of '@testing-library/dom' because it's already installed.`);
25+
context.logger.info(`Skipping installation of '${packageName}' because it's already installed.`);
1526
} else {
16-
context.logger.info(`Adding '@testing-library/dom' as a dev dependency.`);
17-
addPackageJsonDependency(tree, { name: dtl, type: NodeDependencyType.Dev, overwrite: false, version: '^10.0.0' });
27+
context.logger.info(`Adding '${packageName}' as a dev dependency.`);
28+
addPackageJsonDependency(tree, { name: packageName, type: dependencyType, overwrite: false, version });
1829
}
1930

31+
return tree;
32+
};
33+
}
34+
35+
export function installDependencies(packageManager = 'npm') {
36+
return (_tree: Tree, context: SchematicContext) => {
37+
context.addTask(new NodePackageInstallTask({ packageManager }));
38+
2039
context.logger.info(
2140
`Correctly installed @testing-library/angular.
2241
See our docs at https://testing-library.com/docs/angular-testing-library/intro/ to get started.`,
2342
);
24-
25-
return tree;
2643
};
2744
}

projects/testing-library/schematics/ng-add/schema.json

+23-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,28 @@
33
"$id": "SchematicsTestingLibraryAngular",
44
"title": "testing-library-angular",
55
"type": "object",
6-
"properties": {},
6+
"properties": {
7+
"installJestDom": {
8+
"type": "boolean",
9+
"description": "Install jest-dom as a dependency.",
10+
"$default": {
11+
"$source": "argv",
12+
"index": 0
13+
},
14+
"default": false,
15+
"x-prompt": "Would you like to install jest-dom?"
16+
},
17+
"installUserEvent": {
18+
"type": "boolean",
19+
"description": "Install user-event as a dependency.",
20+
"$default": {
21+
"$source": "argv",
22+
"index": 1
23+
},
24+
"default": false,
25+
"x-prompt": "Would you like to install user-event?"
26+
}
27+
},
28+
"additionalProperties": false,
729
"required": []
830
}
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,5 @@
11
// eslint-disable-next-line @typescript-eslint/no-empty-interface
2-
export interface Schema {}
2+
export interface Schema {
3+
installJestDom: boolean;
4+
installUserEvent: boolean;
5+
}

0 commit comments

Comments
 (0)