@dagrejs/dagre 0.7.5 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.js CHANGED
@@ -21,7 +21,7 @@ THE SOFTWARE.
21
21
  */
22
22
 
23
23
  module.exports = {
24
- graphlib: require("./lib/graphlib"),
24
+ graphlib: require("@dagrejs/graphlib"),
25
25
 
26
26
  layout: require("./lib/layout"),
27
27
  debug: require("./lib/debug"),
package/lib/acyclic.js CHANGED
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
 
3
- var _ = require("./lodash"),
4
- greedyFAS = require("./greedy-fas");
3
+ var greedyFAS = require("./greedy-fas");
4
+ var uniqueId = require("./util").uniqueId;
5
5
 
6
6
  module.exports = {
7
7
  run: run,
@@ -10,14 +10,14 @@ module.exports = {
10
10
 
11
11
  function run(g) {
12
12
  var fas = (g.graph().acyclicer === "greedy"
13
- ? greedyFAS(g, weightFn(g))
14
- : dfsFAS(g));
15
- _.each(fas, function(e) {
13
+ ? greedyFAS(g, weightFn(g))
14
+ : dfsFAS(g));
15
+ fas.forEach(function(e) {
16
16
  var label = g.edge(e);
17
17
  g.removeEdge(e);
18
18
  label.forwardName = e.name;
19
19
  label.reversed = true;
20
- g.setEdge(e.w, e.v, label, _.uniqueId("rev"));
20
+ g.setEdge(e.w, e.v, label, uniqueId("rev"));
21
21
  });
22
22
 
23
23
  function weightFn(g) {
@@ -28,18 +28,18 @@ function run(g) {
28
28
  }
29
29
 
30
30
  function dfsFAS(g) {
31
- var fas = [],
32
- stack = {},
33
- visited = {};
31
+ var fas = [];
32
+ var stack = {};
33
+ var visited = {};
34
34
 
35
35
  function dfs(v) {
36
- if (_.has(visited, v)) {
36
+ if (visited.hasOwnProperty(v)) {
37
37
  return;
38
38
  }
39
39
  visited[v] = true;
40
40
  stack[v] = true;
41
- _.each(g.outEdges(v), function(e) {
42
- if (_.has(stack, e.w)) {
41
+ g.outEdges(v).forEach(function(e) {
42
+ if (stack.hasOwnProperty(e.w)) {
43
43
  fas.push(e);
44
44
  } else {
45
45
  dfs(e.w);
@@ -48,12 +48,12 @@ function dfsFAS(g) {
48
48
  delete stack[v];
49
49
  }
50
50
 
51
- _.each(g.nodes(), dfs);
51
+ g.nodes().forEach(dfs);
52
52
  return fas;
53
53
  }
54
54
 
55
55
  function undo(g) {
56
- _.each(g.edges(), function(e) {
56
+ g.edges().forEach(function(e) {
57
57
  var label = g.edge(e);
58
58
  if (label.reversed) {
59
59
  g.removeEdge(e);
@@ -1,35 +1,34 @@
1
- var _ = require("./lodash"),
2
- util = require("./util");
1
+ var util = require("./util");
3
2
 
4
3
  module.exports = addBorderSegments;
5
4
 
6
5
  function addBorderSegments(g) {
7
6
  function dfs(v) {
8
- var children = g.children(v),
9
- node = g.node(v);
7
+ var children = g.children(v);
8
+ var node = g.node(v);
10
9
  if (children.length) {
11
- _.each(children, dfs);
10
+ children.forEach(dfs);
12
11
  }
13
12
 
14
- if (_.has(node, "minRank")) {
13
+ if (node.hasOwnProperty("minRank")) {
15
14
  node.borderLeft = [];
16
15
  node.borderRight = [];
17
16
  for (var rank = node.minRank, maxRank = node.maxRank + 1;
18
- rank < maxRank;
19
- ++rank) {
17
+ rank < maxRank;
18
+ ++rank) {
20
19
  addBorderNode(g, "borderLeft", "_bl", v, node, rank);
21
20
  addBorderNode(g, "borderRight", "_br", v, node, rank);
22
21
  }
23
22
  }
24
23
  }
25
24
 
26
- _.each(g.children(), dfs);
25
+ g.children().forEach(dfs);
27
26
  }
28
27
 
29
28
  function addBorderNode(g, prop, prefix, sg, sgNode, rank) {
30
- var label = { width: 0, height: 0, rank: rank, borderType: prop },
31
- prev = sgNode[prop][rank - 1],
32
- curr = util.addDummyNode(g, "border", label, prefix);
29
+ var label = { width: 0, height: 0, rank: rank, borderType: prop };
30
+ var prev = sgNode[prop][rank - 1];
31
+ var curr = util.addDummyNode(g, "border", label, prefix);
33
32
  sgNode[prop][rank] = curr;
34
33
  g.setParent(curr, sg);
35
34
  if (prev) {
@@ -1,7 +1,5 @@
1
1
  "use strict";
2
2
 
3
- var _ = require("./lodash");
4
-
5
3
  module.exports = {
6
4
  adjust: adjust,
7
5
  undo: undo
@@ -27,8 +25,8 @@ function undo(g) {
27
25
  }
28
26
 
29
27
  function swapWidthHeight(g) {
30
- _.each(g.nodes(), function(v) { swapWidthHeightOne(g.node(v)); });
31
- _.each(g.edges(), function(e) { swapWidthHeightOne(g.edge(e)); });
28
+ g.nodes().forEach(v => swapWidthHeightOne(g.node(v)));
29
+ g.edges().forEach(e => swapWidthHeightOne(g.edge(e)));
32
30
  }
33
31
 
34
32
  function swapWidthHeightOne(attrs) {
@@ -38,12 +36,12 @@ function swapWidthHeightOne(attrs) {
38
36
  }
39
37
 
40
38
  function reverseY(g) {
41
- _.each(g.nodes(), function(v) { reverseYOne(g.node(v)); });
39
+ g.nodes().forEach(v => reverseYOne(g.node(v)));
42
40
 
43
- _.each(g.edges(), function(e) {
41
+ g.edges().forEach(function(e) {
44
42
  var edge = g.edge(e);
45
- _.each(edge.points, reverseYOne);
46
- if (_.has(edge, "y")) {
43
+ edge.points.forEach(reverseYOne);
44
+ if (edge.hasOwnProperty("y")) {
47
45
  reverseYOne(edge);
48
46
  }
49
47
  });
@@ -54,12 +52,12 @@ function reverseYOne(attrs) {
54
52
  }
55
53
 
56
54
  function swapXY(g) {
57
- _.each(g.nodes(), function(v) { swapXYOne(g.node(v)); });
55
+ g.nodes().forEach(v => swapXYOne(g.node(v)));
58
56
 
59
- _.each(g.edges(), function(e) {
57
+ g.edges().forEach(function(e) {
60
58
  var edge = g.edge(e);
61
- _.each(edge.points, swapXYOne);
62
- if (_.has(edge, "x")) {
59
+ edge.points.forEach(swapXYOne);
60
+ if (edge.hasOwnProperty("x")) {
63
61
  swapXYOne(edge);
64
62
  }
65
63
  });
package/lib/data/list.js CHANGED
@@ -12,8 +12,8 @@ function List() {
12
12
  }
13
13
 
14
14
  List.prototype.dequeue = function() {
15
- var sentinel = this._sentinel,
16
- entry = sentinel._prev;
15
+ var sentinel = this._sentinel;
16
+ var entry = sentinel._prev;
17
17
  if (entry !== sentinel) {
18
18
  unlink(entry);
19
19
  return entry;
@@ -32,9 +32,9 @@ List.prototype.enqueue = function(entry) {
32
32
  };
33
33
 
34
34
  List.prototype.toString = function() {
35
- var strs = [],
36
- sentinel = this._sentinel,
37
- curr = sentinel._prev;
35
+ var strs = [];
36
+ var sentinel = this._sentinel;
37
+ var curr = sentinel._prev;
38
38
  while (curr !== sentinel) {
39
39
  strs.push(JSON.stringify(curr, filterOutLinks));
40
40
  curr = curr._prev;
package/lib/debug.js CHANGED
@@ -1,6 +1,5 @@
1
- var _ = require("./lodash"),
2
- util = require("./util"),
3
- Graph = require("./graphlib").Graph;
1
+ var util = require("./util");
2
+ var Graph = require("@dagrejs/graphlib").Graph;
4
3
 
5
4
  module.exports = {
6
5
  debugOrdering: debugOrdering
@@ -12,19 +11,19 @@ function debugOrdering(g) {
12
11
 
13
12
  var h = new Graph({ compound: true, multigraph: true }).setGraph({});
14
13
 
15
- _.each(g.nodes(), function(v) {
14
+ g.nodes().forEach(function(v) {
16
15
  h.setNode(v, { label: v });
17
16
  h.setParent(v, "layer" + g.node(v).rank);
18
17
  });
19
18
 
20
- _.each(g.edges(), function(e) {
19
+ g.edges().forEach(function(e) {
21
20
  h.setEdge(e.v, e.w, {}, e.name);
22
21
  });
23
22
 
24
- _.each(layerMatrix, function(layer, i) {
23
+ layerMatrix.forEach(function(layer, i) {
25
24
  var layerV = "layer" + i;
26
25
  h.setNode(layerV, { rank: "same" });
27
- _.reduce(layer, function(u, v) {
26
+ layer.reduce(function(u, v) {
28
27
  h.setEdge(u, v, { style: "invis" });
29
28
  return v;
30
29
  });
package/lib/greedy-fas.js CHANGED
@@ -1,6 +1,5 @@
1
- var _ = require("./lodash"),
2
- Graph = require("./graphlib").Graph,
3
- List = require("./data/list");
1
+ var Graph = require("@dagrejs/graphlib").Graph;
2
+ var List = require("./data/list");
4
3
 
5
4
  /*
6
5
  * A greedy heuristic for finding a feedback arc set for a graph. A feedback
@@ -11,7 +10,7 @@ var _ = require("./lodash"),
11
10
  */
12
11
  module.exports = greedyFAS;
13
12
 
14
- var DEFAULT_WEIGHT_FN = _.constant(1);
13
+ var DEFAULT_WEIGHT_FN = () => 1;
15
14
 
16
15
  function greedyFAS(g, weightFn) {
17
16
  if (g.nodeCount() <= 1) {
@@ -21,15 +20,13 @@ function greedyFAS(g, weightFn) {
21
20
  var results = doGreedyFAS(state.graph, state.buckets, state.zeroIdx);
22
21
 
23
22
  // Expand multi-edges
24
- return _.flatten(_.map(results, function(e) {
25
- return g.outEdges(e.v, e.w);
26
- }), true);
23
+ return results.flatMap(e => g.outEdges(e.v, e.w));
27
24
  }
28
25
 
29
26
  function doGreedyFAS(g, buckets, zeroIdx) {
30
- var results = [],
31
- sources = buckets[buckets.length - 1],
32
- sinks = buckets[0];
27
+ var results = [];
28
+ var sources = buckets[buckets.length - 1];
29
+ var sinks = buckets[0];
33
30
 
34
31
  var entry;
35
32
  while (g.nodeCount()) {
@@ -52,9 +49,9 @@ function doGreedyFAS(g, buckets, zeroIdx) {
52
49
  function removeNode(g, buckets, zeroIdx, entry, collectPredecessors) {
53
50
  var results = collectPredecessors ? [] : undefined;
54
51
 
55
- _.each(g.inEdges(entry.v), function(edge) {
56
- var weight = g.edge(edge),
57
- uEntry = g.node(edge.v);
52
+ g.inEdges(entry.v).forEach(function(edge) {
53
+ var weight = g.edge(edge);
54
+ var uEntry = g.node(edge.v);
58
55
 
59
56
  if (collectPredecessors) {
60
57
  results.push({ v: edge.v, w: edge.w });
@@ -64,10 +61,10 @@ function removeNode(g, buckets, zeroIdx, entry, collectPredecessors) {
64
61
  assignBucket(buckets, zeroIdx, uEntry);
65
62
  });
66
63
 
67
- _.each(g.outEdges(entry.v), function(edge) {
68
- var weight = g.edge(edge),
69
- w = edge.w,
70
- wEntry = g.node(w);
64
+ g.outEdges(entry.v).forEach(function(edge) {
65
+ var weight = g.edge(edge);
66
+ var w = edge.w;
67
+ var wEntry = g.node(w);
71
68
  wEntry["in"] -= weight;
72
69
  assignBucket(buckets, zeroIdx, wEntry);
73
70
  });
@@ -78,29 +75,29 @@ function removeNode(g, buckets, zeroIdx, entry, collectPredecessors) {
78
75
  }
79
76
 
80
77
  function buildState(g, weightFn) {
81
- var fasGraph = new Graph(),
82
- maxIn = 0,
83
- maxOut = 0;
78
+ var fasGraph = new Graph();
79
+ var maxIn = 0;
80
+ var maxOut = 0;
84
81
 
85
- _.each(g.nodes(), function(v) {
82
+ g.nodes().forEach(function(v) {
86
83
  fasGraph.setNode(v, { v: v, "in": 0, out: 0 });
87
84
  });
88
85
 
89
86
  // Aggregate weights on nodes, but also sum the weights across multi-edges
90
87
  // into a single edge for the fasGraph.
91
- _.each(g.edges(), function(e) {
92
- var prevWeight = fasGraph.edge(e.v, e.w) || 0,
93
- weight = weightFn(e),
94
- edgeWeight = prevWeight + weight;
88
+ g.edges().forEach(function(e) {
89
+ var prevWeight = fasGraph.edge(e.v, e.w) || 0;
90
+ var weight = weightFn(e);
91
+ var edgeWeight = prevWeight + weight;
95
92
  fasGraph.setEdge(e.v, e.w, edgeWeight);
96
93
  maxOut = Math.max(maxOut, fasGraph.node(e.v).out += weight);
97
94
  maxIn = Math.max(maxIn, fasGraph.node(e.w)["in"] += weight);
98
95
  });
99
96
 
100
- var buckets = _.range(maxOut + maxIn + 3).map(function() { return new List(); });
97
+ var buckets = range(maxOut + maxIn + 3).map(() => new List());
101
98
  var zeroIdx = maxIn + 1;
102
99
 
103
- _.each(fasGraph.nodes(), function(v) {
100
+ fasGraph.nodes().forEach(function(v) {
104
101
  assignBucket(buckets, zeroIdx, fasGraph.node(v));
105
102
  });
106
103
 
@@ -116,3 +113,12 @@ function assignBucket(buckets, zeroIdx, entry) {
116
113
  buckets[entry.out - entry["in"] + zeroIdx].enqueue(entry);
117
114
  }
118
115
  }
116
+
117
+ function range(limit) {
118
+ const range = [];
119
+ for (let i = 0; i < limit; i++) {
120
+ range.push(i);
121
+ }
122
+
123
+ return range;
124
+ }