'use strict'; const DotParser = require('dotparser'); const internals = { // Extract vertices and dependencies parseDotObject(entries) { const vertices = new Set(); const dependencies = {}; entries.forEach((entry) => { if (entry.node_id) { vertices.add(entry.node_id.id); } if (entry.edge_list) { vertices.add(entry.edge_list[0].id); vertices.add(entry.edge_list[1].id); dependencies[entry.edge_list[1].id] = dependencies[entry.edge_list[1].id] || new Set(); dependencies[entry.edge_list[1].id].add(entry.edge_list[0].id); } }); return { vertices, dependencies }; }, // Generate grafn code from a list of vertices and dependencies generateCode(vertices, dependencies) { const code = ['const Grafn = require(\'grafn\')', 'const graph = new Grafn()']; for (const vertex of vertices) { const vertexDependencies = Array.from(dependencies[vertex] || []); code.push('graph.vertex({'); code.push(` name: '${vertex}',`); code.push(` dependencies: ${JSON.stringify(vertexDependencies).replace(/"/g, '\'')},`); code.push(' action: async () => {}'); code.push('});'); } return code.join('\n'); } }; // Take some dot source code... make it grafn source code. module.exports = function graphvizToGrafn(dotSource) { const dotObject = DotParser(dotSource); const { vertices, dependencies } = internals.parseDotObject(dotObject[0].children); return internals.generateCode(vertices, dependencies); };