UNPKG

installed-check-core

Version:

Checks that all dependencies in your package.json have supported versions installed

59 lines (48 loc) 2.41 kB
import semver from 'semver'; /** * @param {import('./lookup-types.d.ts').PackageJsonLike} pkg * @param {import('./lookup-types.d.ts').InstalledDependencies} installedDependencies * @returns {import('./perform-installed-check.js').PerformInstalledCheckResult} */ export function checkPackageVersions (pkg, installedDependencies) { /** @type {string[]} */ const errors = []; /** @type {string[]} */ const warnings = []; const requiredDependencies = { ...pkg.dependencies, ...pkg.devDependencies }; const optionalDependencies = { ...pkg.optionalDependencies }; for (const dependency of Object.keys(requiredDependencies)) { let targetVersion = requiredDependencies[dependency]; const installed = installedDependencies instanceof Map ? installedDependencies.get(dependency) : installedDependencies[dependency]; const installedVersion = installed ? installed.version : undefined; if (!installed && !optionalDependencies[dependency]) { errors.push(dependency + ": Dependency is not installed. Can't check its version"); } if (!targetVersion) { warnings.push(dependency + ": Target version is empty. Can't match against dependency version"); continue; } if (targetVersion.startsWith('npm:')) { const [, targetPackage] = targetVersion.split(':'); const lastIndex = targetPackage?.lastIndexOf('@'); if (!targetPackage || lastIndex === undefined || lastIndex < 1) { warnings.push(dependency + ": Invalid npm alias. Can't match against dependency version"); continue; } const name = targetPackage.slice(0, lastIndex); const version = targetPackage.slice(lastIndex + 1); if (installed && installed.name !== name) { errors.push(`${dependency}: Invalid name of aliased package, expected "${name}" but got "${installed.name}"`); } targetVersion = version; } else if (targetVersion.startsWith('workspace:')) { continue; } if (!semver.validRange(targetVersion)) { warnings.push(dependency + ": Target version is not a semantic versioning range. Can't match against dependency version"); } else if (installed && (!installedVersion || !semver.satisfies(installedVersion, targetVersion))) { errors.push(dependency + ': Invalid version, expected a ' + targetVersion); } } return { errors, warnings, suggestions: [], fixes: [] }; }