-
Notifications
You must be signed in to change notification settings - Fork 236
/
Copy pathcreate-package-summary.js
113 lines (91 loc) · 4.3 KB
/
create-package-summary.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
'use strict';
const readPackageJson = require('./read-package-json');
const getLatestFromRegistry = require('./get-latest-from-registry');
const findModulePath = require('./find-module-path');
const _ = require('lodash');
const semverDiff = require('semver-diff');
const pathExists = require('path-exists');
const path = require('path');
const semver = require('semver');
const minimatch = require('minimatch');
function createPackageSummary(moduleName, currentState) {
const cwdPackageJson = currentState.get('cwdPackageJson');
const modulePath = findModulePath(moduleName, currentState);
const packageIsInstalled = pathExists.sync(modulePath);
const modulePackageJson = readPackageJson(path.join(modulePath, 'package.json'));
// Ignore private packages
const isPrivate = Boolean(modulePackageJson.private);
if (isPrivate) {
return false;
}
// Ignore packages that are using github or file urls
const packageJsonVersion = cwdPackageJson.dependencies[moduleName] ||
cwdPackageJson.devDependencies[moduleName] ||
currentState.get('globalPackages')[moduleName];
if (packageJsonVersion && !semver.validRange(packageJsonVersion)) {
return false;
}
// Ignore specified '--ignore' package globs
const ignore = currentState.get('ignore');
if (ignore) {
const ignoreMatch = Array.isArray(ignore) ? ignore.some(ignoredModule => minimatch(moduleName, ignoredModule)) : minimatch(moduleName, ignore);
if (ignoreMatch) {
return false;
}
}
const unusedDependencies = currentState.get('unusedDependencies');
const missingFromPackageJson = currentState.get('missingFromPackageJson');
function foundIn(files) {
if (!files) {
return;
}
return 'Found in: ' + files.map(filepath => filepath.replace(currentState.get('cwd'), ''))
.join(', ');
}
return getLatestFromRegistry(moduleName)
.then(fromRegistry => {
const installedVersion = modulePackageJson.version;
const latest = installedVersion && fromRegistry.latest && fromRegistry.next && semver.gt(installedVersion, fromRegistry.latest) ? fromRegistry.next : fromRegistry.latest;
const versions = fromRegistry.versions || [];
const versionWanted = semver.maxSatisfying(versions, packageJsonVersion);
const versionToUse = installedVersion || versionWanted;
const usingNonSemver = semver.valid(latest) && semver.lt(latest, '1.0.0-pre');
const bump = semver.valid(latest) &&
semver.valid(versionToUse) &&
(usingNonSemver && semverDiff(versionToUse, latest) ? 'nonSemver' : semverDiff(versionToUse, latest));
const 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, 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;