UNPKG

@o3r/schematics

Version:

Schematics module of the Otter framework

91 lines 4.4 kB
"use strict"; 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