Skip to content

Commit c3821ca

Browse files
clydindgp1130
authored andcommitted
refactor(@schematics/angular): use updated utilities in E2E schematic
Updates the E2E schematic to use the workspace and dependency utility rules exported from `@schematics/angular/utility`. This change also removes the use of the custom path manipulation functions from `@angular-devkit/core`. The development dependency versions for `protractor` and `jasmine-spec-reporter` are also moved to the latest versions helper `package.json` file. This move allows the versions to be automatically updated via renovate instead of hardcoded in the schematic source code.
1 parent d2e9edd commit c3821ca

File tree

2 files changed

+38
-44
lines changed

2 files changed

+38
-44
lines changed

packages/schematics/angular/e2e/index.ts

Lines changed: 36 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,9 @@
66
* found in the LICENSE file at https://angular.io/license
77
*/
88

9-
import { join, normalize } from '@angular-devkit/core';
109
import {
1110
Rule,
1211
SchematicsException,
13-
Tree,
1412
apply,
1513
applyTemplates,
1614
chain,
@@ -19,14 +17,29 @@ import {
1917
strings,
2018
url,
2119
} from '@angular-devkit/schematics';
22-
import { readWorkspace, writeWorkspace } from '../utility';
23-
import { NodeDependencyType, addPackageJsonDependency } from '../utility/dependencies';
20+
import {
21+
AngularBuilder,
22+
DependencyType,
23+
addDependency,
24+
updateWorkspace,
25+
} from '@schematics/angular/utility';
26+
import { posix as path } from 'path';
2427
import { JSONFile } from '../utility/json-file';
2528
import { latestVersions } from '../utility/latest-versions';
26-
import { relativePathToWorkspaceRoot } from '../utility/paths';
27-
import { Builders } from '../utility/workspace-models';
2829
import { Schema as E2eOptions } from './schema';
2930

31+
/**
32+
* The list of development dependencies used by the E2E protractor-based builder.
33+
* The versions are sourced from the latest versions `../utility/latest-versions/package.json`
34+
* file which is automatically updated via renovate.
35+
*/
36+
const E2E_DEV_DEPENDENCIES = Object.freeze([
37+
'protractor',
38+
'jasmine-spec-reporter',
39+
'ts-node',
40+
'@types/node',
41+
]);
42+
3043
function addScriptsToPackageJson(): Rule {
3144
return (host) => {
3245
const pkgJson = new JSONFile(host, 'package.json');
@@ -39,70 +52,49 @@ function addScriptsToPackageJson(): Rule {
3952
}
4053

4154
export default function (options: E2eOptions): Rule {
42-
return async (host: Tree) => {
43-
const appProject = options.relatedAppName;
44-
const workspace = await readWorkspace(host);
45-
const project = workspace.projects.get(appProject);
55+
const { relatedAppName } = options;
56+
57+
return updateWorkspace((workspace) => {
58+
const project = workspace.projects.get(relatedAppName);
59+
4660
if (!project) {
47-
throw new SchematicsException(`Project name "${appProject}" doesn't not exist.`);
61+
throw new SchematicsException(`Project name "${relatedAppName}" doesn't not exist.`);
4862
}
4963

50-
const root = join(normalize(project.root), 'e2e');
64+
const e2eRootPath = path.join(project.root, 'e2e');
5165

5266
project.targets.add({
5367
name: 'e2e',
54-
builder: Builders.Protractor,
68+
builder: AngularBuilder.Protractor,
5569
defaultConfiguration: 'development',
5670
options: {
57-
protractorConfig: `${root}/protractor.conf.js`,
71+
protractorConfig: path.join(e2eRootPath, 'protractor.conf.js'),
5872
},
5973
configurations: {
6074
production: {
61-
devServerTarget: `${options.relatedAppName}:serve:production`,
75+
devServerTarget: `${relatedAppName}:serve:production`,
6276
},
6377
development: {
64-
devServerTarget: `${options.relatedAppName}:serve:development`,
78+
devServerTarget: `${relatedAppName}:serve:development`,
6579
},
6680
},
6781
});
6882

69-
await writeWorkspace(host, workspace);
70-
7183
return chain([
7284
mergeWith(
7385
apply(url('./files'), [
7486
applyTemplates({
7587
utils: strings,
7688
...options,
77-
relativePathToWorkspaceRoot: relativePathToWorkspaceRoot(root),
89+
relativePathToWorkspaceRoot: path.relative(path.join('/', e2eRootPath), '/'),
7890
}),
79-
move(root),
91+
move(e2eRootPath),
8092
]),
8193
),
82-
(host) =>
83-
[
84-
{
85-
type: NodeDependencyType.Dev,
86-
name: 'protractor',
87-
version: '~7.0.0',
88-
},
89-
{
90-
type: NodeDependencyType.Dev,
91-
name: 'jasmine-spec-reporter',
92-
version: '~7.0.0',
93-
},
94-
{
95-
type: NodeDependencyType.Dev,
96-
name: 'ts-node',
97-
version: latestVersions['ts-node'],
98-
},
99-
{
100-
type: NodeDependencyType.Dev,
101-
name: '@types/node',
102-
version: latestVersions['@types/node'],
103-
},
104-
].forEach((dep) => addPackageJsonDependency(host, dep)),
94+
...E2E_DEV_DEPENDENCIES.map((name) =>
95+
addDependency(name, latestVersions[name], { type: DependencyType.Dev }),
96+
),
10597
addScriptsToPackageJson(),
10698
]);
107-
};
99+
});
108100
}

packages/schematics/angular/utility/latest-versions/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,14 @@
66
"@types/jasmine": "~4.0.0",
77
"@types/node": "^14.15.0",
88
"jasmine-core": "~4.1.0",
9+
"jasmine-spec-reporter": "~7.0.0",
910
"karma-chrome-launcher": "~3.1.0",
1011
"karma-coverage": "~2.2.0",
1112
"karma-jasmine-html-reporter": "~1.7.0",
1213
"karma-jasmine": "~5.0.0",
1314
"karma": "~6.3.0",
1415
"ng-packagr": "^14.0.0-next.8",
16+
"protractor": "~7.0.0",
1517
"rxjs": "~7.5.0",
1618
"tslib": "^2.3.0",
1719
"ts-node": "~10.8.0",

0 commit comments

Comments
 (0)