1 | require('lazy-ass');
|
2 | var check = require('check-more-types');
|
3 | var semver = require('semver');
|
4 | var _ = require('lodash');
|
5 |
|
6 | la(check.fn(semver.diff), 'semver missing diff method', semver);
|
7 |
|
8 | function 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 |
|
28 | function 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 |
|
41 | function 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 |
|
49 |
|
50 |
|
51 | function filterVersions(fromVersion, toVersion) {
|
52 | var diff = semver.diff(fromVersion, toVersion);
|
53 |
|
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 |
|
86 | return filtered;
|
87 | }
|
88 |
|
89 | module.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');
|