1 | var component = require('component')
|
2 | , path = require('path')
|
3 | , resolve = path.resolve
|
4 | , lookup = component.lookup;
|
5 |
|
6 | module.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 |
|
22 | function 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 |
|
29 | if (conf.local) deps = deps.concat(conf.local);
|
30 |
|
31 |
|
32 | paths = (paths || ['components']).concat(conf.paths);
|
33 |
|
34 |
|
35 | node.label = conf.name;
|
36 | node.ver = conf.version;
|
37 |
|
38 |
|
39 | node.local = !conf.repo;
|
40 |
|
41 |
|
42 | if (++depth > 10) return node;
|
43 |
|
44 |
|
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 |
|