@o3r/schematics
Version:
Schematics module of the Otter framework
91 lines • 4.4 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.checkPackagesRule = checkPackagesRule;
const tslib_1 = require("tslib");
const node_fs_1 = require("node:fs");
const path = tslib_1.__importStar(require("node:path"));
const semver_1 = require("semver");
const error_1 = require("../../utility/error");
const package_manager_runner_1 = require("../../utility/package-manager-runner");
/**
* Check if the first level of peer deps of a given package are installed.
* List all not installed packages or packages with version mismatch
* @param packageName
*/
function getPackagesToInstallOrUpdate(packageName) {
let installedPackage;
try {
const packageJsonNamePath = require.resolve(`${packageName}${path.posix.sep}package.json`);
installedPackage = JSON.parse((0, node_fs_1.readFileSync)(packageJsonNamePath, { encoding: 'utf8' }));
}
catch {
throw new error_1.O3rCliError(`The provided package is not installed: ${packageName}`);
}
const packagesToInstall = [];
const packagesWrongVersion = [];
const optionalPackages = Object.entries(installedPackage.peerDependenciesMeta || {})
.filter(([, dep]) => dep?.optional)
.map(([depName]) => depName);
const peerDependenciesMap = Object.entries(installedPackage.peerDependencies || {})
.reduce((acc, [name, val]) => {
if (!optionalPackages.includes(name)) {
acc[name] = val;
}
return acc;
}, {});
Object.entries(peerDependenciesMap).forEach(([pName, pVersion]) => {
let installedPackageVersion;
try {
const packageJsonNamePath = require.resolve(`${pName}${path.posix.sep}package.json`);
installedPackageVersion = JSON.parse((0, node_fs_1.readFileSync)(packageJsonNamePath, { encoding: 'utf8' })).version;
}
catch {
packagesToInstall.push({ packageName: pName, version: pVersion });
}
if (installedPackageVersion && !(0, semver_1.satisfies)(installedPackageVersion, pVersion)) {
packagesWrongVersion.push({ packageName: pName, foundVersion: installedPackageVersion, version: pVersion });
}
});
return { packagesToInstall, packagesWrongVersion };
}
/**
* Log an instruction with the packages to install or update to match a package peer dependencies
* @param packageName
* @param logger
* @param angularJsonString
*/
function checkPackagesToInstallOrUpdate(packageName, logger, angularJsonString) {
const packageManager = (0, package_manager_runner_1.getPackageManager)({ workspaceConfig: angularJsonString });
const { packagesToInstall, packagesWrongVersion } = getPackagesToInstallOrUpdate(packageName);
if (packagesWrongVersion.length > 0) {
logger.warn('');
logger.warn(`The following packages have a mismatch version installed to satisfy "${packageName}" needed versions:`);
packagesWrongVersion.forEach((dep) => {
logger.warn(`${dep.packageName} found version is ${dep.foundVersion}. "${packageName}" needs ${dep.version}`);
});
logger.warn('');
logger.warn('You might consider reinstalling the packages with the good versions:');
packagesWrongVersion.forEach((dep) => logger.warn(`${packageManager} run ng update ${dep.packageName}@${dep.version}`));
}
if (packagesToInstall.length > 0) {
logger.error('');
logger.error(`The following packages need to be installed to have "${packageName}" working. Run the commands one by one:`);
packagesToInstall.forEach((dep) => logger.error(`${packageManager} run ng add ${dep.packageName}@${dep.version}`));
throw new error_1.O3rCliError('Missing peer dependencies');
}
if (packagesToInstall.length === 0 && packagesWrongVersion.length === 0) {
logger.info(`The package ${packageName} has all peer deps installed.\n`);
}
}
/**
* List peer deps packages of the given package, display a warning if version mismatch, error if peer dep is missing
* @param packageName The package to check peer deps for
*/
function checkPackagesRule(packageName) {
return (tree, context) => {
const angularJson = tree.read('/angular.json');
checkPackagesToInstallOrUpdate(packageName, context.logger, angularJson?.toString());
return tree;
};
}
//# sourceMappingURL=index.js.map