UNPKG

3.06 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.default = dumpGraphToGraphViz;
7
8var _assert = _interopRequireDefault(require("assert"));
9
10var _nullthrows = _interopRequireDefault(require("nullthrows"));
11
12var _graphviz = _interopRequireDefault(require("graphviz"));
13
14var _tempy = _interopRequireDefault(require("tempy"));
15
16var _path = _interopRequireDefault(require("path"));
17
18function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
20const COLORS = {
21 root: 'gray',
22 asset: 'green',
23 dependency: 'orange',
24 transformer_request: 'cyan',
25 file: 'gray',
26 default: 'white'
27};
28
29async function dumpGraphToGraphViz(graph, name) {
30 let g = _graphviz.default.digraph('G');
31
32 let nodes = Array.from(graph.nodes.values());
33
34 for (let node of nodes) {
35 let n = g.addNode(node.id); // $FlowFixMe default is fine. Not every type needs to be in the map.
36
37 n.set('color', COLORS[node.type || 'default']);
38 n.set('shape', 'box');
39 n.set('style', 'filled');
40 let label = `${node.type || 'No Type'}: `;
41
42 if (node.type === 'dependency') {
43 label += node.value.moduleSpecifier;
44 let parts = [];
45 if (node.value.isEntry) parts.push('entry');
46 if (node.value.isAsync) parts.push('async');
47 if (node.value.isOptional) parts.push('optional');
48 if (parts.length) label += ' (' + parts.join(', ') + ')';
49 if (node.value.env) label += ` (${getEnvDescription(node.value.env)})`;
50 } else if (node.type === 'asset' || node.type === 'asset_reference') {
51 label += _path.default.basename(node.value.filePath) + '#' + node.value.type;
52 } else if (node.type === 'file') {
53 label += _path.default.basename(node.value.filePath);
54 } else if (node.type === 'transformer_request') {
55 label += _path.default.basename(node.value.filePath) + ` (${getEnvDescription(node.value.env)})`;
56 } else if (node.type === 'bundle') {
57 let rootAssets = node.value.assetGraph.getNodesConnectedFrom((0, _nullthrows.default)(node.value.assetGraph.getRootNode()));
58 label += rootAssets.map(asset => {
59 (0, _assert.default)(asset.type === 'asset');
60 let parts = asset.value.filePath.split(_path.default.sep);
61 let index = parts.lastIndexOf('node_modules');
62
63 if (index >= 0) {
64 return parts[index + 1];
65 }
66
67 return _path.default.basename(asset.value.filePath);
68 }).join(', ');
69 } else {
70 // label += node.id;
71 label = node.type;
72 }
73
74 n.set('label', label);
75 }
76
77 for (let edge of graph.edges) {
78 g.addEdge(edge.from, edge.to);
79 }
80
81 let tmp = _tempy.default.file({
82 name: `${name}.png`
83 });
84
85 await g.output('png', tmp);
86 console.log(`open ${tmp}`); // eslint-disable-line no-console
87}
88
89function getEnvDescription(env) {
90 let description = '';
91
92 if (env.engines.browsers) {
93 description = `${env.context}: ${env.engines.browsers.join(', ')}`;
94 } else if (env.engines.node) {
95 description = `node: ${env.engines.node}`;
96 }
97
98 return description;
99}
\No newline at end of file