postapl-mermaid-graph
Version:
PostAPL plugin to show AST or components as a Mermaid graph
75 lines (58 loc) • 1.8 kB
JavaScript
const ComponentVisitor = require('./componentVisitor');
const { pluginTools } = require('postapl');
const fs = require('fs');
class ComponentGraph {
constructor(result, componentGraphPath, pluginName) {
this.result = result;
this.componentGraphPath = componentGraphPath;
this.pluginName = pluginName;
}
execute() {
let code = [];
code.push('graph');
let nodes = [];
let edges = [];
const visitor = new ComponentVisitor(nodes, edges);
// graph for APL mainTemplate
const mainTemplateNode = pluginTools.findNode(this.result.root, 'mainTemplate');
if (mainTemplateNode) {
// const visitor = new ComponentVisitor(nodes, edges);
mainTemplateNode.accept(visitor);
if (nodes.length > 0) {
code.push('subgraph mainTemplate');
code = code.concat(nodes, edges);
code.push('end');
}
}
// graph for APL layouts
const layoutsNode = pluginTools.findNode(this.result.root, 'layouts');
if (layoutsNode) {
nodes = [];
edges = [];
// const visitor = new ComponentVisitor(nodes, edges);
layoutsNode.accept(visitor);
if (nodes.length > 0) {
code.push('subgraph layouts');
code = code.concat(nodes, edges);
code.push('end');
}
}
const result = code.join('\n');
if (this.componentGraphPath.startsWith('##messages:')) {
// save to messages
const parts = this.componentGraphPath.split(':');
const id = parts[1];
this.result.messages.push({
type: 'output',
id,
plugin: this.pluginName,
value: result
});
} else {
// write to file
fs.writeFile(this.componentGraphPath, result, () => true)
}
}
}
module.exports = ComponentGraph;