1 | "use strict";
|
2 |
|
3 | Object.defineProperty(exports, "__esModule", {
|
4 | value: true
|
5 | });
|
6 | exports.default = dumpGraphToGraphViz;
|
7 |
|
8 | var _assert = _interopRequireDefault(require("assert"));
|
9 |
|
10 | var _nullthrows = _interopRequireDefault(require("nullthrows"));
|
11 |
|
12 | var _graphviz = _interopRequireDefault(require("graphviz"));
|
13 |
|
14 | var _tempy = _interopRequireDefault(require("tempy"));
|
15 |
|
16 | var _path = _interopRequireDefault(require("path"));
|
17 |
|
18 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
19 |
|
20 | const COLORS = {
|
21 | root: 'gray',
|
22 | asset: 'green',
|
23 | dependency: 'orange',
|
24 | transformer_request: 'cyan',
|
25 | file: 'gray',
|
26 | default: 'white'
|
27 | };
|
28 |
|
29 | async 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);
|
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 |
|
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}`);
|
87 | }
|
88 |
|
89 | function 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 |