UNPKG

1.31 kBJavaScriptView Raw
1var component = require('component')
2 , path = require('path')
3 , resolve = path.resolve
4 , lookup = component.lookup;
5
6module.exports = function(grunt){
7 grunt.registerTask('graph', function(){
8 var depTree = tree(grunt.config('componentConfig'));
9 printTree(depTree);
10 });
11
12 function printTree(tree, depth){
13 depth = depth || 0;
14 console.log(new Array(depth*2 + 1).join(' ') + tree.label + " =", tree.ver);
15 depth++;
16 tree.nodes.forEach(function(node){
17 printTree(node, depth);
18 })
19 }
20}
21
22function tree(conf, paths, depth){
23 depth = depth || 0;
24 conf = conf.name?conf:require(resolve(conf));
25 var deps = Object.keys(conf.dependencies || {});
26 var node = {};
27
28 // local deps
29 if (conf.local) deps = deps.concat(conf.local);
30
31 // lookup paths
32 paths = (paths || ['components']).concat(conf.paths);
33
34 // label
35 node.label = conf.name;
36 node.ver = conf.version;
37
38 // flag local
39 node.local = !conf.repo;
40
41 // --depth n
42 if (++depth > 10) return node;
43
44 // dependencies
45 node.nodes = deps.map(function(dep){
46 var dep = dep.replace('/', '-');
47 var file = lookup(dep, paths);
48 if (!file) throw new Error('failed to resolve location of "' + dep + '"');
49 file = resolve(file, 'component.json');
50 return tree(file, paths, depth);
51 });
52
53 return node;
54}
55
56