-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.js
More file actions
executable file
·38 lines (32 loc) · 1.32 KB
/
index.js
File metadata and controls
executable file
·38 lines (32 loc) · 1.32 KB
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
var npmconf = require('npmconf');
var R = require('ramda');
var async = require('async');
var grabber = require('./lib/grabber');
var mergeFields = function mergeFields(left, right) {
return R.converge(R.merge, R.prop(left), R.prop(right));
};
var allDependencies = mergeFields('dependencies', 'devDependencies');
var basicValue = R.pick(['name', 'version']);
var sortByHead = R.sortBy(R.head);
var dependencyPairs = R.compose(sortByHead, R.toPairs, R.prop('dependencies'));
function resolve (meta, path, next) {
var name = R.prop('name', meta);
var value = basicValue(meta);
var addResolved = R.ifElse(R.isEmpty, R.always(value), R.assoc('dependencies', R.__, value));
if (R.find(R.eq(name), path)) return next(null, value);
async.map(dependencyPairs(meta), function (item, next) {
grabber.getVersion(R.head(item), R.last(item), function (err, res) {
if (err) return next(err);
resolve(res, R.append(name, path), next);
});
}, function (err, resolved) {
if (err) return next(err);
next(null, addResolved(resolved));
});
}
module.exports = function diaper (metadata, next) {
resolve(R.assoc('dependencies', allDependencies(metadata), metadata), [], function (err, resolved) {
if (err) return next(err);
next(null, resolved);
});
};