Skip to content

Commit

Permalink
refactor(schematics): add fixed dependency versions
Browse files Browse the repository at this point in the history
  • Loading branch information
xidedix committed Jul 25, 2024
1 parent 2e4672c commit 2c716b3
Show file tree
Hide file tree
Showing 9 changed files with 222 additions and 61 deletions.
68 changes: 44 additions & 24 deletions projects/coreui-angular-chartjs/schematics/ng-add/index.ts
Original file line number Diff line number Diff line change
@@ -1,39 +1,59 @@
import { chain, Rule, SchematicContext, SchematicsException, Tree } from '@angular-devkit/schematics';
import { Rule, SchematicContext, SchematicsException, Tree } from '@angular-devkit/schematics';
import { NodePackageInstallTask } from '@angular-devkit/schematics/tasks';
import { addPackageToPackageJson, getPackageVersionFromPackageJson, PackageJson } from './package-config';
import { addPackageJsonDependency, NodeDependency, NodeDependencyType } from '@schematics/angular/utility/dependencies';
import { getPackageVersionFromPackageJson, PackageJson } from './package-config';
import * as pkgJson from '../../package.json';

export function addCoreUIAngularChartJs(): Rule {
return (tree: Tree, context: SchematicContext) => {
context.logger.info('Installing @coreui/angular-chartjs ...');
context.addTask(new NodePackageInstallTask());
return tree;
};
}

export function ngAdd(): Rule {
return (tree: Tree, context: SchematicContext) => {
const pkg = pkgJson as unknown as PackageJson;

context.logger.info(``);
context.logger.info('Installing @coreui/angular-chartjs dependencies...');
context.logger.info(`Installing ${pkg.name} dependencies...`);

const ngCoreVersionTag = getPackageVersionFromPackageJson(tree, '@angular/core');
context.logger.info(`@angular/core version ${ngCoreVersionTag}`);
if (!ngCoreVersionTag) {
throw new SchematicsException('@angular/core version not found');
}
const pkg = pkgJson as PackageJson;
const libPeerDeps: string[] = ['@coreui/chartjs', 'chart.js'];
libPeerDeps.forEach((dep: string) => {
const version = pkg.peerDependencies[dep];
context.logger.info(`Including ${dep} version ${version}`);
addPackageToPackageJson(tree, dep, version);
});
const libDeps: string[] = ['lodash-es'];
libDeps.forEach((dep: string) => {
const version = pkg.dependencies[dep];
context.logger.info(`Including ${dep} version ${version}`);
addPackageToPackageJson(tree, dep, version);

const libraryDeps: NodeDependency[] = [
{
name: '@coreui/chartjs',
type: NodeDependencyType.Default,
version: pkg.peerDependencies['@coreui/chartjs'],
overwrite: true
},
{
name: 'chart.js',
type: NodeDependencyType.Default,
version: pkg.peerDependencies['chart.js'],
overwrite: true
},
{
name: 'lodash-es',
type: NodeDependencyType.Default,
version: pkg.dependencies['lodash-es'],
overwrite: true
}
];

libraryDeps.forEach((dep) => {
addPackageJsonDependency(tree, dep);
context.logger.info(`Added dependency: ${dep.name}@${dep.version}`);
});

return chain([addCoreUIAngularChartJs()]);
const library: NodeDependency = {
name: pkg.name,
type: NodeDependencyType.Default,
version: `~${pkg.version}`,
overwrite: true
};

addPackageJsonDependency(tree, library);
context.logger.info(`Installing ${library.name}@${library.version}`);
context.addTask(new NodePackageInstallTask());

return tree;
};
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@ import { Tree } from '@angular-devkit/schematics';

export interface PackageJson {
dependencies: Record<string, string>;
name: string;
peerDependencies: Record<string, string>;
version: string;
}

/**
Expand Down
95 changes: 60 additions & 35 deletions projects/coreui-angular/schematics/ng-add/index.ts
Original file line number Diff line number Diff line change
@@ -1,52 +1,77 @@
import { chain, Rule, SchematicContext, SchematicsException, Tree } from '@angular-devkit/schematics';
import { Rule, SchematicContext, SchematicsException, Tree } from '@angular-devkit/schematics';
import { NodePackageInstallTask } from '@angular-devkit/schematics/tasks';
import { addPackageToPackageJson, getPackageVersionFromPackageJson, PackageJson } from './package-config';
import { addPackageJsonDependency, NodeDependency, NodeDependencyType } from '@schematics/angular/utility/dependencies';
import { getPackageVersionFromPackageJson, PackageJson } from './package-config';
import * as pkgJson from '../../package.json';

const addCoreUIIconsAngular = (): Rule => {
return (tree: Tree, context: SchematicContext) => {
context.logger.info(`Installing @coreui/icons-angular as dependency`);
context.addTask(new NodePackageInstallTask({ packageName: '@coreui/icons-angular' }));
return tree;
};
};

const addCoreUIAngular = (): Rule => {
return (tree: Tree, context: SchematicContext) => {
context.logger.info(`Installing @coreui/angular as dependency`);
context.addTask(new NodePackageInstallTask());
return tree;
};
};

export function ngAdd(): Rule {
return (tree: Tree, context: SchematicContext) => {
const pkg = pkgJson as unknown as PackageJson;

context.logger.info(``);
context.logger.info('Installing @coreui/angular dependencies...');
context.logger.info(`Installing ${pkg.name} dependencies...`);

const ngCoreVersionTag = getPackageVersionFromPackageJson(tree, '@angular/core');
context.logger.info(`@angular/core version ${ngCoreVersionTag}`);
if (!ngCoreVersionTag) {
throw new SchematicsException('@angular/core version not found');
}
const projDeps = ['@angular/animations', '@angular/common', '@angular/core', '@angular/router'];
projDeps.forEach((dep) => {
addPackageToPackageJson(tree, dep, ngCoreVersionTag);
});

const pkg = pkgJson as PackageJson;
const libPeerDeps: string[] = ['@angular/cdk', '@coreui/coreui'];
libPeerDeps.forEach((dep: string) => {
const version = pkg.peerDependencies[dep];
context.logger.info(`Including ${dep} version ${version}`);
addPackageToPackageJson(tree, dep, version);
const projectDeps: NodeDependency[] = [
{ name: '@angular/animations', type: NodeDependencyType.Default, version: ngCoreVersionTag, overwrite: false },
{ name: '@angular/common', type: NodeDependencyType.Default, version: ngCoreVersionTag, overwrite: false },
{ name: '@angular/core', type: NodeDependencyType.Default, version: ngCoreVersionTag, overwrite: false },
{ name: '@angular/router', type: NodeDependencyType.Default, version: ngCoreVersionTag, overwrite: false }
];

projectDeps.forEach((dep) => {
addPackageJsonDependency(tree, dep);
context.logger.info(`Added dependency: ${dep.name}@${dep.version}`);
});
const libDeps: string[] = ['@popperjs/core'];
libDeps.forEach((dep: string) => {
const version = pkg.dependencies[dep];
context.logger.info(`Including ${dep} version ${version}`);
addPackageToPackageJson(tree, dep, version);

const libraryDeps: NodeDependency[] = [
{
name: '@angular/cdk',
type: NodeDependencyType.Default,
version: pkg.peerDependencies['@angular/cdk'],
overwrite: false
},
{
name: '@coreui/coreui',
type: NodeDependencyType.Default,
version: pkg.peerDependencies['@coreui/coreui'],
overwrite: true
},
{
name: '@coreui/icons-angular',
type: NodeDependencyType.Default,
version: pkg.peerDependencies['@coreui/icons-angular'],
overwrite: true
},
{
name: '@popperjs/core',
type: NodeDependencyType.Default,
version: pkg.dependencies['@popperjs/core'],
overwrite: true
}
];

libraryDeps.forEach((dep) => {
addPackageJsonDependency(tree, dep);
context.logger.info(`Added dependency: ${dep.name}@${dep.version}`);
});

return chain([addCoreUIIconsAngular(), addCoreUIAngular()]);
const library: NodeDependency = {
name: pkg.name,
type: NodeDependencyType.Default,
version: `~${pkg.version}`,
overwrite: true
};

addPackageJsonDependency(tree, library);
context.logger.info(`Installing ${library.name}@${library.version}`);
context.addTask(new NodePackageInstallTask());

return tree;
};
}
2 changes: 2 additions & 0 deletions projects/coreui-angular/schematics/ng-add/package-config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@ import { Tree } from '@angular-devkit/schematics';

export interface PackageJson {
dependencies: Record<string, string>;
name: string;
peerDependencies: Record<string, string>;
version: string;
}

/**
Expand Down
3 changes: 3 additions & 0 deletions projects/coreui-angular/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@
},
{
"path": "./tsconfig.spec.json"
},
{
"path": "./tsconfig.schematics.json"
}
]
}
43 changes: 41 additions & 2 deletions projects/coreui-icons-angular/schematics/ng-add/index.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,49 @@
import { Rule, SchematicContext, Tree } from '@angular-devkit/schematics';
import { Rule, SchematicContext, SchematicsException, Tree } from '@angular-devkit/schematics';
import { NodePackageInstallTask } from '@angular-devkit/schematics/tasks';
import { addPackageJsonDependency, NodeDependency, NodeDependencyType } from '@schematics/angular/utility/dependencies';
import { getPackageVersionFromPackageJson, PackageJson } from './package-config';
import * as pkgJson from '../../package.json';

export function ngAdd(): Rule {
return (tree: Tree, context: SchematicContext) => {
context.logger.info('Installing @coreui/icons-angular ...');
const pkg = pkgJson as unknown as PackageJson;

context.logger.info(``);
context.logger.info(`Installing ${pkg.name} dependencies...`);

const ngCoreVersionTag = getPackageVersionFromPackageJson(tree, '@angular/core');
context.logger.info(`@angular/core version ${ngCoreVersionTag}`);
if (!ngCoreVersionTag) {
throw new SchematicsException('@angular/core version not found');
}

const projectDeps: NodeDependency[] = [
{ name: '@angular/common', type: NodeDependencyType.Default, version: ngCoreVersionTag, overwrite: false },
{ name: '@angular/core', type: NodeDependencyType.Default, version: ngCoreVersionTag, overwrite: false },
{
name: '@angular/platform-browser',
type: NodeDependencyType.Default,
version: ngCoreVersionTag,
overwrite: false
}
];

projectDeps.forEach((dep) => {
addPackageJsonDependency(tree, dep);
context.logger.info(`Added dependency: ${dep.name}@${dep.version}`);
});

const library: NodeDependency = {
name: pkg.name,
type: NodeDependencyType.Default,
version: `~${pkg.version}`,
overwrite: true
};

addPackageJsonDependency(tree, library);
context.logger.info(`Installing ${library.name}@${library.version}`);
context.addTask(new NodePackageInstallTask());

return tree;
};
}
68 changes: 68 additions & 0 deletions projects/coreui-icons-angular/schematics/ng-add/package-config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
/**
* @license
* Copyright Google LLC All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license
*/

import { Tree } from '@angular-devkit/schematics';

export interface PackageJson {
dependencies: Record<string, string>;
name: string;
peerDependencies: Record<string, string>;
version: string;
}

/**
* Sorts the keys of the given object.
* @returns A new object instance with sorted keys
*/
function sortObjectByKeys(obj: Record<string, string>) {
return Object.keys(obj)
.sort()
.reduce(
(result, key) => {
result[key] = obj[key];
return result;
},
{} as Record<string, string>
);
}

/** Adds a package to the package.json in the given host tree. */
export function addPackageToPackageJson(host: Tree, pkg: string, version: string): Tree {
if (host.exists('package.json')) {
const sourceText = host.read('package.json')!.toString('utf-8');
const json = JSON.parse(sourceText) as PackageJson;

if (!json.dependencies) {
json.dependencies = {};
}

if (!json.dependencies[pkg]) {
json.dependencies[pkg] = version;
json.dependencies = sortObjectByKeys(json.dependencies);
}

host.overwrite('package.json', JSON.stringify(json, null, 2));
}

return host;
}

/** Gets the version of the specified package by looking at the package.json in the given tree. */
export function getPackageVersionFromPackageJson(tree: Tree, name: string): string | null {
if (!tree.exists('package.json')) {
return null;
}

const packageJson = JSON.parse(tree.read('package.json')!.toString('utf8')) as PackageJson;

if (packageJson.dependencies && packageJson.dependencies[name]) {
return packageJson.dependencies[name];
}

return null;
}
1 change: 1 addition & 0 deletions projects/coreui-icons-angular/tsconfig.schematics.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
"noUnusedLocals": true,
"rootDir": "schematics",
"outDir": "../../dist/coreui-icons-angular/schematics",
"resolveJsonModule": true,
"skipDefaultLibCheck": true,
"skipLibCheck": true,
"sourceMap": true,
Expand Down
1 change: 1 addition & 0 deletions tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
"declaration": false,
"experimentalDecorators": true,
"moduleResolution": "node",
"resolveJsonModule": true,
"importHelpers": true,
"target": "ES2022",
"module": "ES2022",
Expand Down

0 comments on commit 2c716b3

Please sign in to comment.