aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/graphviz_to_grafn.js64
1 files changed, 64 insertions, 0 deletions
diff --git a/lib/graphviz_to_grafn.js b/lib/graphviz_to_grafn.js
new file mode 100644
index 0000000..e001e12
--- /dev/null
+++ b/lib/graphviz_to_grafn.js
@@ -0,0 +1,64 @@
+'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);
+};