Skip to content

Commit 56e8b79

Browse files
committed
refactor(schematics): add fixed dependency versions
(cherry picked from commit 2c716b3)
1 parent bd733c2 commit 56e8b79

File tree

9 files changed

+222
-61
lines changed

9 files changed

+222
-61
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,59 @@
1-
import { chain, Rule, SchematicContext, SchematicsException, Tree } from '@angular-devkit/schematics';
1+
import { Rule, SchematicContext, SchematicsException, Tree } from '@angular-devkit/schematics';
22
import { NodePackageInstallTask } from '@angular-devkit/schematics/tasks';
3-
import { addPackageToPackageJson, getPackageVersionFromPackageJson, PackageJson } from './package-config';
3+
import { addPackageJsonDependency, NodeDependency, NodeDependencyType } from '@schematics/angular/utility/dependencies';
4+
import { getPackageVersionFromPackageJson, PackageJson } from './package-config';
45
import * as pkgJson from '../../package.json';
56

6-
export function addCoreUIAngularChartJs(): Rule {
7-
return (tree: Tree, context: SchematicContext) => {
8-
context.logger.info('Installing @coreui/angular-chartjs ...');
9-
context.addTask(new NodePackageInstallTask());
10-
return tree;
11-
};
12-
}
13-
147
export function ngAdd(): Rule {
158
return (tree: Tree, context: SchematicContext) => {
9+
const pkg = pkgJson as unknown as PackageJson;
10+
1611
context.logger.info(``);
17-
context.logger.info('Installing @coreui/angular-chartjs dependencies...');
12+
context.logger.info(`Installing ${pkg.name} dependencies...`);
13+
1814
const ngCoreVersionTag = getPackageVersionFromPackageJson(tree, '@angular/core');
1915
context.logger.info(`@angular/core version ${ngCoreVersionTag}`);
2016
if (!ngCoreVersionTag) {
2117
throw new SchematicsException('@angular/core version not found');
2218
}
23-
const pkg = pkgJson as PackageJson;
24-
const libPeerDeps: string[] = ['@coreui/chartjs', 'chart.js'];
25-
libPeerDeps.forEach((dep: string) => {
26-
const version = pkg.peerDependencies[dep];
27-
context.logger.info(`Including ${dep} version ${version}`);
28-
addPackageToPackageJson(tree, dep, version);
29-
});
30-
const libDeps: string[] = ['lodash-es'];
31-
libDeps.forEach((dep: string) => {
32-
const version = pkg.dependencies[dep];
33-
context.logger.info(`Including ${dep} version ${version}`);
34-
addPackageToPackageJson(tree, dep, version);
19+
20+
const libraryDeps: NodeDependency[] = [
21+
{
22+
name: '@coreui/chartjs',
23+
type: NodeDependencyType.Default,
24+
version: pkg.peerDependencies['@coreui/chartjs'],
25+
overwrite: true
26+
},
27+
{
28+
name: 'chart.js',
29+
type: NodeDependencyType.Default,
30+
version: pkg.peerDependencies['chart.js'],
31+
overwrite: true
32+
},
33+
{
34+
name: 'lodash-es',
35+
type: NodeDependencyType.Default,
36+
version: pkg.dependencies['lodash-es'],
37+
overwrite: true
38+
}
39+
];
40+
41+
libraryDeps.forEach((dep) => {
42+
addPackageJsonDependency(tree, dep);
43+
context.logger.info(`Added dependency: ${dep.name}@${dep.version}`);
3544
});
3645

37-
return chain([addCoreUIAngularChartJs()]);
46+
const library: NodeDependency = {
47+
name: pkg.name,
48+
type: NodeDependencyType.Default,
49+
version: `~${pkg.version}`,
50+
overwrite: true
51+
};
52+
53+
addPackageJsonDependency(tree, library);
54+
context.logger.info(`Installing ${library.name}@${library.version}`);
55+
context.addTask(new NodePackageInstallTask());
56+
57+
return tree;
3858
};
3959
}

projects/coreui-angular-chartjs/schematics/ng-add/package-config.ts

+2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ import { Tree } from '@angular-devkit/schematics';
1010

1111
export interface PackageJson {
1212
dependencies: Record<string, string>;
13+
name: string;
1314
peerDependencies: Record<string, string>;
15+
version: string;
1416
}
1517

1618
/**
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,77 @@
1-
import { chain, Rule, SchematicContext, SchematicsException, Tree } from '@angular-devkit/schematics';
1+
import { Rule, SchematicContext, SchematicsException, Tree } from '@angular-devkit/schematics';
22
import { NodePackageInstallTask } from '@angular-devkit/schematics/tasks';
3-
import { addPackageToPackageJson, getPackageVersionFromPackageJson, PackageJson } from './package-config';
3+
import { addPackageJsonDependency, NodeDependency, NodeDependencyType } from '@schematics/angular/utility/dependencies';
4+
import { getPackageVersionFromPackageJson, PackageJson } from './package-config';
45
import * as pkgJson from '../../package.json';
56

6-
const addCoreUIIconsAngular = (): Rule => {
7-
return (tree: Tree, context: SchematicContext) => {
8-
context.logger.info(`Installing @coreui/icons-angular as dependency`);
9-
context.addTask(new NodePackageInstallTask({ packageName: '@coreui/icons-angular' }));
10-
return tree;
11-
};
12-
};
13-
14-
const addCoreUIAngular = (): Rule => {
15-
return (tree: Tree, context: SchematicContext) => {
16-
context.logger.info(`Installing @coreui/angular as dependency`);
17-
context.addTask(new NodePackageInstallTask());
18-
return tree;
19-
};
20-
};
21-
227
export function ngAdd(): Rule {
238
return (tree: Tree, context: SchematicContext) => {
9+
const pkg = pkgJson as unknown as PackageJson;
10+
2411
context.logger.info(``);
25-
context.logger.info('Installing @coreui/angular dependencies...');
12+
context.logger.info(`Installing ${pkg.name} dependencies...`);
13+
2614
const ngCoreVersionTag = getPackageVersionFromPackageJson(tree, '@angular/core');
2715
context.logger.info(`@angular/core version ${ngCoreVersionTag}`);
2816
if (!ngCoreVersionTag) {
2917
throw new SchematicsException('@angular/core version not found');
3018
}
31-
const projDeps = ['@angular/animations', '@angular/common', '@angular/core', '@angular/router'];
32-
projDeps.forEach((dep) => {
33-
addPackageToPackageJson(tree, dep, ngCoreVersionTag);
34-
});
3519

36-
const pkg = pkgJson as PackageJson;
37-
const libPeerDeps: string[] = ['@angular/cdk', '@coreui/coreui'];
38-
libPeerDeps.forEach((dep: string) => {
39-
const version = pkg.peerDependencies[dep];
40-
context.logger.info(`Including ${dep} version ${version}`);
41-
addPackageToPackageJson(tree, dep, version);
20+
const projectDeps: NodeDependency[] = [
21+
{ name: '@angular/animations', type: NodeDependencyType.Default, version: ngCoreVersionTag, overwrite: false },
22+
{ name: '@angular/common', type: NodeDependencyType.Default, version: ngCoreVersionTag, overwrite: false },
23+
{ name: '@angular/core', type: NodeDependencyType.Default, version: ngCoreVersionTag, overwrite: false },
24+
{ name: '@angular/router', type: NodeDependencyType.Default, version: ngCoreVersionTag, overwrite: false }
25+
];
26+
27+
projectDeps.forEach((dep) => {
28+
addPackageJsonDependency(tree, dep);
29+
context.logger.info(`Added dependency: ${dep.name}@${dep.version}`);
4230
});
43-
const libDeps: string[] = ['@popperjs/core'];
44-
libDeps.forEach((dep: string) => {
45-
const version = pkg.dependencies[dep];
46-
context.logger.info(`Including ${dep} version ${version}`);
47-
addPackageToPackageJson(tree, dep, version);
31+
32+
const libraryDeps: NodeDependency[] = [
33+
{
34+
name: '@angular/cdk',
35+
type: NodeDependencyType.Default,
36+
version: pkg.peerDependencies['@angular/cdk'],
37+
overwrite: false
38+
},
39+
{
40+
name: '@coreui/coreui',
41+
type: NodeDependencyType.Default,
42+
version: pkg.peerDependencies['@coreui/coreui'],
43+
overwrite: true
44+
},
45+
{
46+
name: '@coreui/icons-angular',
47+
type: NodeDependencyType.Default,
48+
version: pkg.peerDependencies['@coreui/icons-angular'],
49+
overwrite: true
50+
},
51+
{
52+
name: '@popperjs/core',
53+
type: NodeDependencyType.Default,
54+
version: pkg.dependencies['@popperjs/core'],
55+
overwrite: true
56+
}
57+
];
58+
59+
libraryDeps.forEach((dep) => {
60+
addPackageJsonDependency(tree, dep);
61+
context.logger.info(`Added dependency: ${dep.name}@${dep.version}`);
4862
});
4963

50-
return chain([addCoreUIIconsAngular(), addCoreUIAngular()]);
64+
const library: NodeDependency = {
65+
name: pkg.name,
66+
type: NodeDependencyType.Default,
67+
version: `~${pkg.version}`,
68+
overwrite: true
69+
};
70+
71+
addPackageJsonDependency(tree, library);
72+
context.logger.info(`Installing ${library.name}@${library.version}`);
73+
context.addTask(new NodePackageInstallTask());
74+
75+
return tree;
5176
};
5277
}

projects/coreui-angular/schematics/ng-add/package-config.ts

+2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ import { Tree } from '@angular-devkit/schematics';
1010

1111
export interface PackageJson {
1212
dependencies: Record<string, string>;
13+
name: string;
1314
peerDependencies: Record<string, string>;
15+
version: string;
1416
}
1517

1618
/**

projects/coreui-angular/tsconfig.json

+3
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99
},
1010
{
1111
"path": "./tsconfig.spec.json"
12+
},
13+
{
14+
"path": "./tsconfig.schematics.json"
1215
}
1316
]
1417
}
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,49 @@
1-
import { Rule, SchematicContext, Tree } from '@angular-devkit/schematics';
1+
import { Rule, SchematicContext, SchematicsException, Tree } from '@angular-devkit/schematics';
22
import { NodePackageInstallTask } from '@angular-devkit/schematics/tasks';
3+
import { addPackageJsonDependency, NodeDependency, NodeDependencyType } from '@schematics/angular/utility/dependencies';
4+
import { getPackageVersionFromPackageJson, PackageJson } from './package-config';
5+
import * as pkgJson from '../../package.json';
36

47
export function ngAdd(): Rule {
58
return (tree: Tree, context: SchematicContext) => {
6-
context.logger.info('Installing @coreui/icons-angular ...');
9+
const pkg = pkgJson as unknown as PackageJson;
10+
11+
context.logger.info(``);
12+
context.logger.info(`Installing ${pkg.name} dependencies...`);
13+
14+
const ngCoreVersionTag = getPackageVersionFromPackageJson(tree, '@angular/core');
15+
context.logger.info(`@angular/core version ${ngCoreVersionTag}`);
16+
if (!ngCoreVersionTag) {
17+
throw new SchematicsException('@angular/core version not found');
18+
}
19+
20+
const projectDeps: NodeDependency[] = [
21+
{ name: '@angular/common', type: NodeDependencyType.Default, version: ngCoreVersionTag, overwrite: false },
22+
{ name: '@angular/core', type: NodeDependencyType.Default, version: ngCoreVersionTag, overwrite: false },
23+
{
24+
name: '@angular/platform-browser',
25+
type: NodeDependencyType.Default,
26+
version: ngCoreVersionTag,
27+
overwrite: false
28+
}
29+
];
30+
31+
projectDeps.forEach((dep) => {
32+
addPackageJsonDependency(tree, dep);
33+
context.logger.info(`Added dependency: ${dep.name}@${dep.version}`);
34+
});
35+
36+
const library: NodeDependency = {
37+
name: pkg.name,
38+
type: NodeDependencyType.Default,
39+
version: `~${pkg.version}`,
40+
overwrite: true
41+
};
42+
43+
addPackageJsonDependency(tree, library);
44+
context.logger.info(`Installing ${library.name}@${library.version}`);
745
context.addTask(new NodePackageInstallTask());
46+
847
return tree;
948
};
1049
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
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+
11+
export interface PackageJson {
12+
dependencies: Record<string, string>;
13+
name: string;
14+
peerDependencies: Record<string, string>;
15+
version: string;
16+
}
17+
18+
/**
19+
* Sorts the keys of the given object.
20+
* @returns A new object instance with sorted keys
21+
*/
22+
function sortObjectByKeys(obj: Record<string, string>) {
23+
return Object.keys(obj)
24+
.sort()
25+
.reduce(
26+
(result, key) => {
27+
result[key] = obj[key];
28+
return result;
29+
},
30+
{} as Record<string, string>
31+
);
32+
}
33+
34+
/** Adds a package to the package.json in the given host tree. */
35+
export function addPackageToPackageJson(host: Tree, pkg: string, version: string): Tree {
36+
if (host.exists('package.json')) {
37+
const sourceText = host.read('package.json')!.toString('utf-8');
38+
const json = JSON.parse(sourceText) as PackageJson;
39+
40+
if (!json.dependencies) {
41+
json.dependencies = {};
42+
}
43+
44+
if (!json.dependencies[pkg]) {
45+
json.dependencies[pkg] = version;
46+
json.dependencies = sortObjectByKeys(json.dependencies);
47+
}
48+
49+
host.overwrite('package.json', JSON.stringify(json, null, 2));
50+
}
51+
52+
return host;
53+
}
54+
55+
/** Gets the version of the specified package by looking at the package.json in the given tree. */
56+
export function getPackageVersionFromPackageJson(tree: Tree, name: string): string | null {
57+
if (!tree.exists('package.json')) {
58+
return null;
59+
}
60+
61+
const packageJson = JSON.parse(tree.read('package.json')!.toString('utf8')) as PackageJson;
62+
63+
if (packageJson.dependencies && packageJson.dependencies[name]) {
64+
return packageJson.dependencies[name];
65+
}
66+
67+
return null;
68+
}

projects/coreui-icons-angular/tsconfig.schematics.json

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
"noUnusedLocals": true,
1717
"rootDir": "schematics",
1818
"outDir": "../../dist/coreui-icons-angular/schematics",
19+
"resolveJsonModule": true,
1920
"skipDefaultLibCheck": true,
2021
"skipLibCheck": true,
2122
"sourceMap": true,

tsconfig.json

+1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
"declaration": false,
2828
"experimentalDecorators": true,
2929
"moduleResolution": "bundler",
30+
"resolveJsonModule": true,
3031
"importHelpers": true,
3132
"target": "ES2022",
3233
"module": "ES2022",

0 commit comments

Comments
 (0)