UNPKG

1.55 kBJavaScriptView Raw
1function dot (s) {
2 return s.replace('.js', '_JS').replace(/-/g, '_')
3}
4
5function each (obj, iter) {
6 for (var k in obj) { iter(obj[k], k, obj) }
7}
8function source (modules, fn) {
9 for (var k in modules) {
10 for (var j in modules[k]) {
11 if (modules[k][j] === fn) return k
12 }
13 }
14}
15
16var exports = module.exports = function (modules, name) {
17 return exports.toDot(exports.toGraph(modules), name)
18}
19
20exports.toGraph = function (modules) {
21 var g = {}
22 each(modules, function (e, name) {
23 var o = {}
24 for (var k in e) {
25 if (Array.isArray(e[k])) {
26 o[k] = e[k].map(function (v) {
27 return source(modules, v)
28 })
29 }
30 }
31
32 g[name] = o
33 })
34 return g
35}
36
37exports.toDot = function (g, name) {
38 var s = ''
39 function log () {
40 var args = [].slice.call(arguments)
41 s += args.join(' ') + '\n'
42 }
43
44 log('digraph ' + (name || 'depject') + ' {')
45 for (var k in g) {
46 log(' ', dot(k), '[label="' + k + '"]')
47 }
48 log()
49 for (k in g) {
50 for (var j in g[k]) {
51 log(' ', dot(j), '[label="' + j + '", shape="box"]')
52 }
53 }
54
55 log()
56
57 var edges = {}
58 function once (edge) {
59 if (edges[edge]) return
60 edges[edge] = true
61 log(' ', edge)
62 }
63
64 for (k in g) {
65 for (j in g[k]) {
66 once(dot(k) + '->' + dot(j))
67 if (Array.isArray(g[k][j])) {
68 g[k][j].forEach(function (dest) {
69 if (dest) {
70 once(dot(j) + '->' + dot(dest))
71 }
72 })
73 } else { once(dot(j) + '->' + dot(g[k][j])) }
74 }
75 }
76
77 log('}')
78
79 return s
80}
81