npm-check
Version:
Check for outdated, incorrect, and unused dependencies.
105 lines (83 loc) • 4.1 kB
JavaScript
var readPackageJson = require('./read-package-json');
var getLatestFromRegistry = require('./get-latest-from-registry');
var findModulePath = require('./find-module-path');
var _ = require('lodash');
var semverDiff = require('semver-diff');
var pathExists = require('path-exists');
var path = require('path');
var semver = require('semver');
var minimatch = require('minimatch');
function createPackageSummary(moduleName, currentState) {
var cwdPackageJson = currentState.get('cwdPackageJson');
var modulePath = findModulePath(moduleName, currentState);
var packageIsInstalled = pathExists.sync(modulePath);
var modulePackageJson = readPackageJson(path.join(modulePath, 'package.json'));
// Ignore private packages
var isPrivate = Boolean(modulePackageJson.private);
if (isPrivate) {
return false;
}
// Ignore packages that are using github or file urls
var packageJsonVersion = cwdPackageJson.dependencies[moduleName] || cwdPackageJson.devDependencies[moduleName] || currentState.get('globalPackages')[moduleName];
if (packageJsonVersion && !semver.validRange(packageJsonVersion)) {
return false;
}
// Ignore specified '--ignore' package globs
var ignore = currentState.get('ignore');
if (ignore) {
var ignoreMatch = Array.isArray(ignore) ? ignore.some(function (ignoredModule) {
return minimatch(moduleName, ignoredModule);
}) : minimatch(moduleName, ignore);
if (ignoreMatch) {
return false;
}
}
var unusedDependencies = currentState.get('unusedDependencies');
var missingFromPackageJson = currentState.get('missingFromPackageJson');
function foundIn(files) {
if (!files) {
return;
}
return 'Found in: ' + files.map(function (filepath) {
return filepath.replace(currentState.get('cwd'), '');
}).join(', ');
}
return getLatestFromRegistry(moduleName).then(function (fromRegistry) {
var installedVersion = modulePackageJson.version;
var latest = installedVersion && fromRegistry.latest && fromRegistry.next && semver.gt(installedVersion, fromRegistry.latest) ? fromRegistry.next : fromRegistry.latest;
var versions = fromRegistry.versions || [];
var versionWanted = semver.maxSatisfying(versions, packageJsonVersion);
var versionToUse = installedVersion || versionWanted;
var usingNonSemver = semver.valid(latest) && semver.lt(latest, '1.0.0-pre');
var bump = semver.valid(latest) && semver.valid(versionToUse) && (usingNonSemver && semverDiff(versionToUse, latest) ? 'nonSemver' : semverDiff(versionToUse, latest));
var unused = _.includes(unusedDependencies, moduleName);
return {
// info
moduleName: moduleName,
homepage: fromRegistry.homepage,
regError: fromRegistry.error,
pkgError: modulePackageJson.error,
// versions
latest: latest,
installed: versionToUse,
isInstalled: packageIsInstalled,
notInstalled: !packageIsInstalled,
packageWanted: versionWanted,
packageJson: packageJsonVersion,
// Missing from package json
notInPackageJson: foundIn(missingFromPackageJson[moduleName]),
// meta
devDependency: _.has(cwdPackageJson.devDependencies, moduleName),
usedInScripts: _.findKey(cwdPackageJson.scripts, function (script) {
return script.indexOf(moduleName) !== -1;
}),
mismatch: semver.validRange(packageJsonVersion) && semver.valid(versionToUse) && !semver.satisfies(versionToUse, packageJsonVersion),
semverValid: semver.valid(versionToUse),
easyUpgrade: semver.validRange(packageJsonVersion) && semver.valid(versionToUse) && semver.satisfies(latest, packageJsonVersion) && bump !== 'major',
bump: bump,
unused: unused
};
});
}
module.exports = createPackageSummary;
;