UNPKG

3.03 kBJavaScriptView Raw
1require('lazy-ass');
2var check = require('check-more-types');
3var semver = require('semver');
4var _ = require('lodash');
5
6la(check.fn(semver.diff), 'semver missing diff method', semver);
7
8function isDiffAllowed(allowed, diff) {
9 la(check.unemptyString(allowed), 'invalid allowed update', allowed);
10 la(check.unemptyString(diff), 'invalid diff update', diff);
11
12 switch (allowed) {
13 case 'major':
14 return true;
15 break;
16 case 'minor':
17 return diff === 'minor' || diff === 'patch';
18 break;
19 case 'patch':
20 return diff === 'patch';
21 break;
22 default:
23 throw new Error('Invalid allowed update ' + allowed);
24 break;
25 }
26}
27
28function isDependencyTypeAllowed(allowed, current) {
29 la(check.unemptyString(allowed), 'expected allowed string', allowed);
30 la(check.unemptyString(current), 'expected current string', current);
31
32 allowed = allowed.trim().toLowerCase();
33 current = current.trim().toLowerCase();
34
35 if (allowed === 'all') {
36 return true;
37 }
38 return allowed === current;
39}
40
41function filterAllowedUpdates(current, available, options) {
42 var allowed = options.allow || options.allowed || 'major';
43 var isAllowed = _.partial(isDiffAllowed, allowed);
44
45 var type = options.type || 'all';
46 var isAllowedType = _.partial(isDependencyTypeAllowed, type);
47
48 // console.log('filtering available updates', available);
49 // console.log('current versions', current);
50
51 function filterVersions(fromVersion, toVersion) {
52 var diff = semver.diff(fromVersion, toVersion);
53 // console.log(availableUpdate.name, 'difference from', fromVersion, 'to', toVersion, diff);
54 return isAllowed(diff);
55 }
56
57 function allowedDependencyType(availableUpdate) {
58 var dependency = current[availableUpdate.name];
59 la(check.object(dependency),
60 'cannot find dependency for update', availableUpdate, 'in', current);
61 la(check.unemptyString(dependency.type),
62 'missing type of update', dependency);
63 return isAllowedType(dependency.type);
64 }
65
66 function filterHasNewVersions(availableUpdate) {
67 la(check.unemptyString(availableUpdate.name), 'missing name in available', availableUpdate);
68
69 var fromVersion = current[availableUpdate.name].version;
70 la(check.unemptyString(fromVersion),
71 'cannot find current version for', availableUpdate.name, current);
72
73 var versions = availableUpdate.versions;
74 la(check.array(versions), 'missing versions in update', availableUpdate);
75
76 var filteredVersions = versions.filter(_.partial(filterVersions, fromVersion));
77 availableUpdate.versions = filteredVersions;
78 return availableUpdate.versions.length > 0;
79 }
80
81 var filtered = available
82 .filter(filterHasNewVersions)
83 .filter(allowedDependencyType);
84
85 // console.log('filtered', filtered);
86 return filtered;
87}
88
89module.exports = check.defend(filterAllowedUpdates,
90 check.object, 'expected object with all current dependencies',
91 check.array, 'available list should be an array',
92 check.object, 'options should be an object');