forked from vovacodes/find-duplicate-dependencies
/
find-duplicate-dependencies.js
74 lines (48 loc) · 1.64 KB
/
find-duplicate-dependencies.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
'use strict';
var npm = require('npm');
var pairs = require('lodash.pairs');
var zipObject = require('lodash.zipobject');
var find = require('lodash.find');
var Promise = require('es6-promise').Promise;
function findDuplicateDependencies(options) {
options || (options = {});
return new Promise(function(resolve, reject) {
npm.load({production: !options.checkDevDependencies, json: true}, function(err) {
if (err) return reject(err);
npm.commands.ls([], true, function(err, packageInfo, packageObj) {
if (err) return reject(err);
var catalog = catalogDependencies(packageObj.dependencies, packageObj.name);
var duplicatePairs = pairs(catalog).filter(function (entry) {
return entry[1].length > 1;
});
resolve(zipObject(duplicatePairs));
});
})
});
}
function catalogDependencies(dependencies, path) {
return _catalogDependencies({}, dependencies, path);
function _catalogDependencies(result, dependencies, path) {
return pairs(dependencies).reduce(function(acc, entry) {
var name = entry[0];
var moduleObj = entry[1];
if (!acc[name]) {
acc[name] = [];
}
var isAdded = Boolean(find(acc[name], {version: moduleObj.version}));
if (!isAdded) {
acc[name].push({
name: name,
version: moduleObj.version,
from: moduleObj.from,
path: path
});
}
if (moduleObj.dependencies) {
return _catalogDependencies(acc, moduleObj.dependencies, path.concat('/' + name));
}
return acc;
}, result);
}
}
module.exports = findDuplicateDependencies;