@statewalker/fsm-charts 0.2.3 → 0.2.5

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.
Files changed (123) hide show
  1. package/dist/{chunk-AZBRQNTU.js → chunk-2LFUT2C6.js} +1062 -1110
  2. package/dist/{chunk-SVKVQY7B.js → chunk-ARZYBFNA.js} +4 -4
  3. package/dist/{chunk-36ZLXJVD.js → chunk-CR2M4445.js} +35 -33
  4. package/dist/{chunk-TZHCBZVP.js → chunk-GW2Z65BN.js} +22 -15
  5. package/dist/chunk-PKBMQBKP.js +5 -0
  6. package/dist/{chunk-VILLJJJD.js → chunk-RZ4FP6JB.js} +11 -9
  7. package/dist/index-config.js +2 -1
  8. package/dist/index-dom.js +2 -1
  9. package/dist/{index-html-DgSCNHkR.d.ts → index-html-BBQqYoST.d.ts} +10 -10
  10. package/dist/index-html.d.ts +1 -1
  11. package/dist/index-html.js +2 -1
  12. package/dist/index-layout.d.ts +15 -15
  13. package/dist/index-layout.js +2 -1
  14. package/dist/index-runtime.js +2 -1
  15. package/dist/index.d.ts +3 -3
  16. package/dist/index.js +6 -5
  17. package/package.json +16 -18
  18. package/src/config/concatTransitionsToString.ts +2 -2
  19. package/src/config/index.ts +4 -4
  20. package/src/config/serializeProcessConfig.ts +3 -3
  21. package/src/config/splitTransitionString.ts +2 -2
  22. package/src/config/toFsmStateConfig.ts +3 -3
  23. package/src/dagre/acyclic.js +9 -10
  24. package/src/dagre/add-border-segments.js +11 -7
  25. package/src/dagre/coordinate-system.js +12 -12
  26. package/src/dagre/data/list.js +2 -2
  27. package/src/dagre/debug.d.ts +1 -1
  28. package/src/dagre/debug.js +11 -11
  29. package/src/dagre/greedy-fas.js +17 -21
  30. package/src/dagre/index.d.ts +4 -4
  31. package/src/dagre/index.js +4 -4
  32. package/src/dagre/layout.js +107 -96
  33. package/src/dagre/nesting-graph.js +13 -19
  34. package/src/dagre/normalize.js +7 -7
  35. package/src/dagre/order/add-subgraph-constraints.js +2 -2
  36. package/src/dagre/order/barycenter.d.ts +1 -1
  37. package/src/dagre/order/barycenter.js +4 -4
  38. package/src/dagre/order/build-layer-graph.d.ts +1 -1
  39. package/src/dagre/order/build-layer-graph.js +7 -9
  40. package/src/dagre/order/cross-count.js +14 -17
  41. package/src/dagre/order/index.js +19 -17
  42. package/src/dagre/order/init-order.js +5 -15
  43. package/src/dagre/order/resolve-conflicts.js +10 -14
  44. package/src/dagre/order/sort-subgraph.d.ts +1 -1
  45. package/src/dagre/order/sort-subgraph.js +13 -14
  46. package/src/dagre/order/sort.d.ts +1 -1
  47. package/src/dagre/order/sort.js +6 -10
  48. package/src/dagre/parent-dummy-chains.js +10 -4
  49. package/src/dagre/position/bk.d.ts +3 -3
  50. package/src/dagre/position/bk.js +84 -65
  51. package/src/dagre/position/index.js +7 -11
  52. package/src/dagre/rank/feasible-tree.d.ts +1 -1
  53. package/src/dagre/rank/feasible-tree.js +6 -6
  54. package/src/dagre/rank/index.js +6 -6
  55. package/src/dagre/rank/network-simplex.d.ts +0 -1
  56. package/src/dagre/rank/network-simplex.js +20 -25
  57. package/src/dagre/rank/util.js +2 -6
  58. package/src/dagre/util.d.ts +12 -6
  59. package/src/dagre/util.js +31 -37
  60. package/src/dom/buildSections.ts +16 -12
  61. package/src/dom/description-panels.ts +3 -3
  62. package/src/dom/getStatesDescriptions.ts +1 -1
  63. package/src/full/index.ts +1 -1
  64. package/src/full/toFsmStateCharts.ts +11 -11
  65. package/src/graphlib/alg/components.js +2 -2
  66. package/src/graphlib/alg/dfs.js +5 -5
  67. package/src/graphlib/alg/dijkstra-all.js +4 -4
  68. package/src/graphlib/alg/dijkstra.js +9 -12
  69. package/src/graphlib/alg/find-cycles.js +7 -5
  70. package/src/graphlib/alg/floyd-warshall.js +8 -11
  71. package/src/graphlib/alg/index.d.ts +11 -11
  72. package/src/graphlib/alg/index.js +11 -11
  73. package/src/graphlib/alg/is-acyclic.js +1 -1
  74. package/src/graphlib/alg/postorder.js +2 -2
  75. package/src/graphlib/alg/preorder.js +2 -2
  76. package/src/graphlib/alg/prim.d.ts +1 -1
  77. package/src/graphlib/alg/prim.js +5 -5
  78. package/src/graphlib/alg/tarjan.js +3 -3
  79. package/src/graphlib/alg/topsort.js +1 -1
  80. package/src/graphlib/data/priority-queue.js +8 -10
  81. package/src/graphlib/graph.js +53 -52
  82. package/src/graphlib/index.d.ts +2 -2
  83. package/src/graphlib/index.js +2 -2
  84. package/src/graphlib/json.d.ts +1 -1
  85. package/src/graphlib/json.js +6 -6
  86. package/src/html/buildStatechartCss.ts +2 -2
  87. package/src/html/buildStatechartStyles.ts +1 -1
  88. package/src/html/buildStatechartSvg.ts +7 -7
  89. package/src/html/buildStatechartsPanel.ts +2 -2
  90. package/src/html/index.ts +4 -4
  91. package/src/index-config.ts +2 -2
  92. package/src/index-dom.ts +1 -1
  93. package/src/index-html.ts +2 -2
  94. package/src/index-layout.ts +2 -2
  95. package/src/index-runtime.ts +2 -2
  96. package/src/index.ts +8 -8
  97. package/src/layout/buildCharts.ts +5 -5
  98. package/src/layout/buildFlatCharts.ts +11 -13
  99. package/src/layout/getGraphParamsProvider.ts +5 -8
  100. package/src/layout/getLabelDimensions.ts +5 -5
  101. package/src/layout/index.ts +5 -4
  102. package/src/lodash-es/index.ts +2 -2
  103. package/src/lodash-es/types.ts +37 -35
  104. package/src/runtime/RuntimeStatechartApi.ts +12 -23
  105. package/src/runtime/StateChartIndex.ts +3 -3
  106. package/src/runtime/index.ts +2 -2
  107. package/src/types/FsmStateConfig.ts +1 -1
  108. package/src/types/GraphParamsProvider.ts +2 -2
  109. package/src/types/Position.ts +1 -1
  110. package/src/types/StateChart.ts +2 -2
  111. package/src/types/StateGraphEdge.ts +2 -2
  112. package/src/types/StateGraphNode.ts +2 -2
  113. package/src/types/TransitionsGraph.ts +4 -4
  114. package/src/types/index.ts +11 -11
  115. package/src/utils/BasisCurve.ts +3 -3
  116. package/src/utils/domToText.ts +1 -1
  117. package/src/utils/getPadding.ts +1 -1
  118. package/src/utils/newRegistry.ts +1 -1
  119. package/src/utils/serializeAttrs.ts +6 -6
  120. package/src/utils/serializeCss.ts +3 -3
  121. package/src/utils/serializeStyle.ts +2 -2
  122. package/src/utils/toKebabCase.ts +1 -1
  123. package/CHANGELOG.md +0 -1
@@ -68,25 +68,18 @@ var Graph = class {
68
68
  return _.keys(this._nodes);
69
69
  }
70
70
  sources() {
71
- var self = this;
72
- return _.filter(this.nodes(), function(v) {
73
- return _.isEmpty(self._in[v]);
74
- });
71
+ return _.filter(this.nodes(), (v) => _.isEmpty(this._in[v]));
75
72
  }
76
73
  sinks() {
77
- var self = this;
78
- return _.filter(this.nodes(), function(v) {
79
- return _.isEmpty(self._out[v]);
80
- });
74
+ return _.filter(this.nodes(), (v) => _.isEmpty(this._out[v]));
81
75
  }
82
76
  setNodes(vs, value) {
83
77
  var args = arguments;
84
- var self = this;
85
- _.each(vs, function(v) {
78
+ _.each(vs, (v) => {
86
79
  if (args.length > 1) {
87
- self.setNode(v, value);
80
+ this.setNode(v, value);
88
81
  } else {
89
- self.setNode(v);
82
+ this.setNode(v);
90
83
  }
91
84
  });
92
85
  return this;
@@ -118,17 +111,16 @@ var Graph = class {
118
111
  return _.has(this._nodes, v);
119
112
  }
120
113
  removeNode(v) {
121
- var self = this;
122
114
  if (_.has(this._nodes, v)) {
123
- var removeEdge = function(e) {
124
- self.removeEdge(self._edgeObjs[e]);
115
+ var removeEdge = (e) => {
116
+ this.removeEdge(this._edgeObjs[e]);
125
117
  };
126
118
  delete this._nodes[v];
127
119
  if (this._isCompound) {
128
120
  this._removeFromParentsChildList(v);
129
121
  delete this._parent[v];
130
- _.each(this.children(v), function(child) {
131
- self.setParent(child);
122
+ _.each(this.children(v), (child) => {
123
+ this.setParent(child);
132
124
  });
133
125
  delete this._children[v];
134
126
  }
@@ -152,7 +144,9 @@ var Graph = class {
152
144
  parent += "";
153
145
  for (var ancestor = parent; !_.isUndefined(ancestor); ancestor = this.parent(ancestor)) {
154
146
  if (ancestor === v) {
155
- throw new Error("Setting " + parent + " as parent of " + v + " would create a cycle");
147
+ throw new Error(
148
+ `Setting ${parent} as parent of ${v} would create a cycle`
149
+ );
156
150
  }
157
151
  }
158
152
  this.setNode(parent);
@@ -224,12 +218,12 @@ var Graph = class {
224
218
  });
225
219
  copy.setGraph(this.graph());
226
220
  var self = this;
227
- _.each(this._nodes, function(value, v) {
221
+ _.each(this._nodes, (value, v) => {
228
222
  if (filter(v)) {
229
223
  copy.setNode(v, value);
230
224
  }
231
225
  });
232
- _.each(this._edgeObjs, function(e) {
226
+ _.each(this._edgeObjs, (e) => {
233
227
  if (copy.hasNode(e.v) && copy.hasNode(e.w)) {
234
228
  copy.setEdge(e, self.edge(e));
235
229
  }
@@ -247,7 +241,7 @@ var Graph = class {
247
241
  }
248
242
  }
249
243
  if (this._isCompound) {
250
- _.each(copy.nodes(), function(v) {
244
+ _.each(copy.nodes(), (v) => {
251
245
  copy.setParent(v, findParent(v));
252
246
  });
253
247
  }
@@ -268,13 +262,12 @@ var Graph = class {
268
262
  return _.values(this._edgeObjs);
269
263
  }
270
264
  setPath(vs, value) {
271
- var self = this;
272
265
  var args = arguments;
273
- _.reduce(vs, function(v, w) {
266
+ _.reduce(vs, (v, w) => {
274
267
  if (args.length > 1) {
275
- self.setEdge(v, w, value);
268
+ this.setEdge(v, w, value);
276
269
  } else {
277
- self.setEdge(v, w);
270
+ this.setEdge(v, w);
278
271
  }
279
272
  return w;
280
273
  });
@@ -305,10 +298,10 @@ var Graph = class {
305
298
  valueSpecified = true;
306
299
  }
307
300
  }
308
- v = "" + v;
309
- w = "" + w;
301
+ v = `${v}`;
302
+ w = `${w}`;
310
303
  if (!_.isUndefined(name)) {
311
- name = "" + name;
304
+ name = `${name}`;
312
305
  }
313
306
  var e = edgeArgsToId(this._isDirected, v, w, name);
314
307
  if (_.has(this._edgeLabels, e)) {
@@ -366,9 +359,7 @@ var Graph = class {
366
359
  if (!u) {
367
360
  return edges;
368
361
  }
369
- return _.filter(edges, function(edge) {
370
- return edge.v === u;
371
- });
362
+ return _.filter(edges, (edge) => edge.v === u);
372
363
  }
373
364
  }
374
365
  outEdges(v, w) {
@@ -378,9 +369,7 @@ var Graph = class {
378
369
  if (!w) {
379
370
  return edges;
380
371
  }
381
- return _.filter(edges, function(edge) {
382
- return edge.w === w;
383
- });
372
+ return _.filter(edges, (edge) => edge.w === w);
384
373
  }
385
374
  }
386
375
  nodeEdges(v, w) {
@@ -405,8 +394,8 @@ function decrementOrRemoveEntry(map, k) {
405
394
  }
406
395
  }
407
396
  function edgeArgsToId(isDirected, v_, w_, name) {
408
- var v = "" + v_;
409
- var w = "" + w_;
397
+ var v = `${v_}`;
398
+ var w = `${w_}`;
410
399
  if (!isDirected && v > w) {
411
400
  var tmp = v;
412
401
  v = w;
@@ -415,8 +404,8 @@ function edgeArgsToId(isDirected, v_, w_, name) {
415
404
  return v + EDGE_KEY_DELIM + w + EDGE_KEY_DELIM + (_.isUndefined(name) ? DEFAULT_EDGE_NAME : name);
416
405
  }
417
406
  function edgeArgsToObj(isDirected, v_, w_, name) {
418
- var v = "" + v_;
419
- var w = "" + w_;
407
+ var v = `${v_}`;
408
+ var w = `${w_}`;
420
409
  if (!isDirected && v > w) {
421
410
  var tmp = v;
422
411
  v = w;
@@ -432,6 +421,192 @@ function edgeObjToId(isDirected, edgeObj) {
432
421
  return edgeArgsToId(isDirected, edgeObj.v, edgeObj.w, edgeObj.name);
433
422
  }
434
423
 
424
+ // src/dagre/data/list.js
425
+ var List = class {
426
+ constructor() {
427
+ var sentinel = {};
428
+ sentinel._next = sentinel._prev = sentinel;
429
+ this._sentinel = sentinel;
430
+ }
431
+ dequeue() {
432
+ var sentinel = this._sentinel;
433
+ var entry = sentinel._prev;
434
+ if (entry !== sentinel) {
435
+ unlink(entry);
436
+ return entry;
437
+ }
438
+ }
439
+ enqueue(entry) {
440
+ var sentinel = this._sentinel;
441
+ if (entry._prev && entry._next) {
442
+ unlink(entry);
443
+ }
444
+ entry._next = sentinel._next;
445
+ sentinel._next._prev = entry;
446
+ sentinel._next = entry;
447
+ entry._prev = sentinel;
448
+ }
449
+ toString() {
450
+ var strs = [];
451
+ var sentinel = this._sentinel;
452
+ var curr = sentinel._prev;
453
+ while (curr !== sentinel) {
454
+ strs.push(JSON.stringify(curr, filterOutLinks));
455
+ curr = curr._prev;
456
+ }
457
+ return `[${strs.join(", ")}]`;
458
+ }
459
+ };
460
+ function unlink(entry) {
461
+ entry._prev._next = entry._next;
462
+ entry._next._prev = entry._prev;
463
+ delete entry._next;
464
+ delete entry._prev;
465
+ }
466
+ function filterOutLinks(k, v) {
467
+ if (k !== "_next" && k !== "_prev") {
468
+ return v;
469
+ }
470
+ }
471
+
472
+ // src/dagre/greedy-fas.js
473
+ var DEFAULT_WEIGHT_FN = _.constant(1);
474
+ function greedyFAS(g, weightFn) {
475
+ if (g.nodeCount() <= 1) {
476
+ return [];
477
+ }
478
+ var state = buildState(g, weightFn || DEFAULT_WEIGHT_FN);
479
+ var results = doGreedyFAS(state.graph, state.buckets, state.zeroIdx);
480
+ return _.flatten(_.map(results, (e) => g.outEdges(e.v, e.w)));
481
+ }
482
+ function doGreedyFAS(g, buckets, zeroIdx) {
483
+ var results = [];
484
+ var sources = buckets[buckets.length - 1];
485
+ var sinks = buckets[0];
486
+ var entry;
487
+ while (g.nodeCount()) {
488
+ while (entry = sinks.dequeue()) {
489
+ removeNode(g, buckets, zeroIdx, entry);
490
+ }
491
+ while (entry = sources.dequeue()) {
492
+ removeNode(g, buckets, zeroIdx, entry);
493
+ }
494
+ if (g.nodeCount()) {
495
+ for (var i = buckets.length - 2; i > 0; --i) {
496
+ entry = buckets[i].dequeue();
497
+ if (entry) {
498
+ results = results.concat(
499
+ removeNode(g, buckets, zeroIdx, entry, true)
500
+ );
501
+ break;
502
+ }
503
+ }
504
+ }
505
+ }
506
+ return results;
507
+ }
508
+ function removeNode(g, buckets, zeroIdx, entry, collectPredecessors) {
509
+ var results = collectPredecessors ? [] : void 0;
510
+ _.forEach(g.inEdges(entry.v), (edge) => {
511
+ var weight = g.edge(edge);
512
+ var uEntry = g.node(edge.v);
513
+ if (collectPredecessors) {
514
+ results.push({ v: edge.v, w: edge.w });
515
+ }
516
+ uEntry.out -= weight;
517
+ assignBucket(buckets, zeroIdx, uEntry);
518
+ });
519
+ _.forEach(g.outEdges(entry.v), (edge) => {
520
+ var weight = g.edge(edge);
521
+ var w = edge.w;
522
+ var wEntry = g.node(w);
523
+ wEntry.in -= weight;
524
+ assignBucket(buckets, zeroIdx, wEntry);
525
+ });
526
+ g.removeNode(entry.v);
527
+ return results;
528
+ }
529
+ function buildState(g, weightFn) {
530
+ var fasGraph = new Graph();
531
+ var maxIn = 0;
532
+ var maxOut = 0;
533
+ _.forEach(g.nodes(), (v) => {
534
+ fasGraph.setNode(v, { v, in: 0, out: 0 });
535
+ });
536
+ _.forEach(g.edges(), (e) => {
537
+ var prevWeight = fasGraph.edge(e.v, e.w) || 0;
538
+ var weight = weightFn(e);
539
+ var edgeWeight = prevWeight + weight;
540
+ fasGraph.setEdge(e.v, e.w, edgeWeight);
541
+ maxOut = Math.max(maxOut, fasGraph.node(e.v).out += weight);
542
+ maxIn = Math.max(maxIn, fasGraph.node(e.w).in += weight);
543
+ });
544
+ var buckets = _.range(maxOut + maxIn + 3).map(() => new List());
545
+ var zeroIdx = maxIn + 1;
546
+ _.forEach(fasGraph.nodes(), (v) => {
547
+ assignBucket(buckets, zeroIdx, fasGraph.node(v));
548
+ });
549
+ return { graph: fasGraph, buckets, zeroIdx };
550
+ }
551
+ function assignBucket(buckets, zeroIdx, entry) {
552
+ if (!entry.out) {
553
+ buckets[0].enqueue(entry);
554
+ } else if (!entry.in) {
555
+ buckets[buckets.length - 1].enqueue(entry);
556
+ } else {
557
+ buckets[entry.out - entry.in + zeroIdx].enqueue(entry);
558
+ }
559
+ }
560
+
561
+ // src/dagre/acyclic.js
562
+ function run(g) {
563
+ var fas = g.graph().acyclicer === "greedy" ? greedyFAS(g, weightFn(g)) : dfsFAS(g);
564
+ _.forEach(fas, (e) => {
565
+ var label = g.edge(e);
566
+ g.removeEdge(e);
567
+ label.forwardName = e.name;
568
+ label.reversed = true;
569
+ g.setEdge(e.w, e.v, label, _.uniqueId("rev"));
570
+ });
571
+ function weightFn(g2) {
572
+ return (e) => g2.edge(e).weight;
573
+ }
574
+ }
575
+ function dfsFAS(g) {
576
+ var fas = [];
577
+ var stack = {};
578
+ var visited = {};
579
+ function dfs3(v) {
580
+ if (_.has(visited, v)) {
581
+ return;
582
+ }
583
+ visited[v] = true;
584
+ stack[v] = true;
585
+ _.forEach(g.outEdges(v), (e) => {
586
+ if (_.has(stack, e.w)) {
587
+ fas.push(e);
588
+ } else {
589
+ dfs3(e.w);
590
+ }
591
+ });
592
+ delete stack[v];
593
+ }
594
+ _.forEach(g.nodes(), dfs3);
595
+ return fas;
596
+ }
597
+ function undo(g) {
598
+ _.forEach(g.edges(), (e) => {
599
+ var label = g.edge(e);
600
+ if (label.reversed) {
601
+ g.removeEdge(e);
602
+ var forwardName = label.forwardName;
603
+ delete label.reversed;
604
+ delete label.forwardName;
605
+ g.setEdge(e.w, e.v, label, forwardName);
606
+ }
607
+ });
608
+ }
609
+
435
610
  // src/dagre/util.js
436
611
  function addDummyNode(g, type, attrs, name) {
437
612
  var v;
@@ -444,10 +619,10 @@ function addDummyNode(g, type, attrs, name) {
444
619
  }
445
620
  function simplify(g) {
446
621
  var simplified = new Graph().setGraph(g.graph());
447
- _.forEach(g.nodes(), function(v) {
622
+ _.forEach(g.nodes(), (v) => {
448
623
  simplified.setNode(v, g.node(v));
449
624
  });
450
- _.forEach(g.edges(), function(e) {
625
+ _.forEach(g.edges(), (e) => {
451
626
  var simpleLabel = simplified.edge(e.v, e.w) || { weight: 0, minlen: 1 };
452
627
  var label = g.edge(e);
453
628
  simplified.setEdge(e.v, e.w, {
@@ -458,13 +633,15 @@ function simplify(g) {
458
633
  return simplified;
459
634
  }
460
635
  function asNonCompoundGraph(g) {
461
- var simplified = new Graph({ multigraph: g.isMultigraph() }).setGraph(g.graph());
462
- _.forEach(g.nodes(), function(v) {
636
+ var simplified = new Graph({ multigraph: g.isMultigraph() }).setGraph(
637
+ g.graph()
638
+ );
639
+ _.forEach(g.nodes(), (v) => {
463
640
  if (!g.children(v).length) {
464
641
  simplified.setNode(v, g.node(v));
465
642
  }
466
643
  });
467
- _.forEach(g.edges(), function(e) {
644
+ _.forEach(g.edges(), (e) => {
468
645
  simplified.setEdge(e, g.edge(e));
469
646
  });
470
647
  return simplified;
@@ -477,7 +654,9 @@ function intersectRect(rect, point) {
477
654
  var w = rect.width / 2;
478
655
  var h = rect.height / 2;
479
656
  if (!dx && !dy) {
480
- throw new Error("Not possible to find intersection inside of the rectangle");
657
+ throw new Error(
658
+ "Not possible to find intersection inside of the rectangle"
659
+ );
481
660
  }
482
661
  var sx, sy;
483
662
  if (Math.abs(dy) * w > Math.abs(dx) * h) {
@@ -496,10 +675,8 @@ function intersectRect(rect, point) {
496
675
  return { x: x + sx, y: y + sy };
497
676
  }
498
677
  function buildLayerMatrix(g) {
499
- var layering = _.map(_.range(maxRank(g) + 1), function() {
500
- return [];
501
- });
502
- _.forEach(g.nodes(), function(v) {
678
+ var layering = _.map(_.range(maxRank(g) + 1), () => []);
679
+ _.forEach(g.nodes(), (v) => {
503
680
  var node = g.node(v);
504
681
  var rank2 = node.rank;
505
682
  if (!_.isUndefined(rank2)) {
@@ -509,12 +686,8 @@ function buildLayerMatrix(g) {
509
686
  return layering;
510
687
  }
511
688
  function normalizeRanks(g) {
512
- var min = _.min(
513
- _.map(g.nodes(), function(v) {
514
- return g.node(v).rank;
515
- })
516
- );
517
- _.forEach(g.nodes(), function(v) {
689
+ var min = _.min(_.map(g.nodes(), (v) => g.node(v).rank));
690
+ _.forEach(g.nodes(), (v) => {
518
691
  var node = g.node(v);
519
692
  if (_.has(node, "rank")) {
520
693
  node.rank -= min;
@@ -522,13 +695,9 @@ function normalizeRanks(g) {
522
695
  });
523
696
  }
524
697
  function removeEmptyRanks(g) {
525
- var offset = _.min(
526
- _.map(g.nodes(), function(v) {
527
- return g.node(v).rank;
528
- })
529
- );
698
+ var offset = _.min(_.map(g.nodes(), (v) => g.node(v).rank));
530
699
  var layers = [];
531
- _.forEach(g.nodes(), function(v) {
700
+ _.forEach(g.nodes(), (v) => {
532
701
  var rank2 = g.node(v).rank - offset;
533
702
  if (!layers[rank2]) {
534
703
  layers[rank2] = [];
@@ -537,11 +706,11 @@ function removeEmptyRanks(g) {
537
706
  });
538
707
  var delta = 0;
539
708
  var nodeRankFactor = g.graph().nodeRankFactor;
540
- _.forEach(layers, function(vs, i) {
709
+ _.forEach(layers, (vs, i) => {
541
710
  if (_.isUndefined(vs) && i % nodeRankFactor !== 0) {
542
711
  --delta;
543
712
  } else if (delta) {
544
- _.forEach(vs, function(v) {
713
+ _.forEach(vs, (v) => {
545
714
  g.node(v).rank += delta;
546
715
  });
547
716
  }
@@ -560,7 +729,7 @@ function addBorderNode(g, prefix, rank2, order2) {
560
729
  }
561
730
  function maxRank(g) {
562
731
  return _.max(
563
- _.map(g.nodes(), function(v) {
732
+ _.map(g.nodes(), (v) => {
564
733
  var rank2 = g.node(v).rank;
565
734
  if (!_.isUndefined(rank2)) {
566
735
  return rank2;
@@ -570,7 +739,7 @@ function maxRank(g) {
570
739
  }
571
740
  function partition(collection, fn) {
572
741
  var result = { lhs: [], rhs: [] };
573
- _.forEach(collection, function(value) {
742
+ _.forEach(collection, (value) => {
574
743
  if (fn(value)) {
575
744
  result.lhs.push(value);
576
745
  } else {
@@ -584,10 +753,10 @@ function time(name, fn) {
584
753
  try {
585
754
  return fn();
586
755
  } finally {
587
- console.log(name + " time: " + (_.now() - start) + "ms");
756
+ console.log(`${name} time: ${_.now() - start}ms`);
588
757
  }
589
758
  }
590
- function notime(name, fn) {
759
+ function notime(_name, fn) {
591
760
  return fn();
592
761
  }
593
762
 
@@ -628,7 +797,7 @@ function adjust(g) {
628
797
  swapWidthHeight(g);
629
798
  }
630
799
  }
631
- function undo(g) {
800
+ function undo2(g) {
632
801
  var rankDir = g.graph().rankdir.toLowerCase();
633
802
  if (rankDir === "bt" || rankDir === "rl") {
634
803
  reverseY(g);
@@ -639,10 +808,10 @@ function undo(g) {
639
808
  }
640
809
  }
641
810
  function swapWidthHeight(g) {
642
- _.forEach(g.nodes(), function(v) {
811
+ _.forEach(g.nodes(), (v) => {
643
812
  swapWidthHeightOne(g.node(v));
644
813
  });
645
- _.forEach(g.edges(), function(e) {
814
+ _.forEach(g.edges(), (e) => {
646
815
  swapWidthHeightOne(g.edge(e));
647
816
  });
648
817
  }
@@ -652,10 +821,10 @@ function swapWidthHeightOne(attrs) {
652
821
  attrs.height = w;
653
822
  }
654
823
  function reverseY(g) {
655
- _.forEach(g.nodes(), function(v) {
824
+ _.forEach(g.nodes(), (v) => {
656
825
  reverseYOne(g.node(v));
657
826
  });
658
- _.forEach(g.edges(), function(e) {
827
+ _.forEach(g.edges(), (e) => {
659
828
  var edge = g.edge(e);
660
829
  _.forEach(edge.points, reverseYOne);
661
830
  if (_.has(edge, "y")) {
@@ -667,10 +836,10 @@ function reverseYOne(attrs) {
667
836
  attrs.y = -attrs.y;
668
837
  }
669
838
  function swapXY(g) {
670
- _.forEach(g.nodes(), function(v) {
839
+ _.forEach(g.nodes(), (v) => {
671
840
  swapXYOne(g.node(v));
672
841
  });
673
- _.forEach(g.edges(), function(e) {
842
+ _.forEach(g.edges(), (e) => {
674
843
  var edge = g.edge(e);
675
844
  _.forEach(edge.points, swapXYOne);
676
845
  if (_.has(edge, "x")) {
@@ -684,202 +853,94 @@ function swapXYOne(attrs) {
684
853
  attrs.y = x;
685
854
  }
686
855
 
687
- // src/dagre/data/list.js
688
- var List = class {
689
- constructor() {
690
- var sentinel = {};
691
- sentinel._next = sentinel._prev = sentinel;
692
- this._sentinel = sentinel;
693
- }
694
- dequeue() {
695
- var sentinel = this._sentinel;
696
- var entry = sentinel._prev;
697
- if (entry !== sentinel) {
698
- unlink(entry);
699
- return entry;
856
+ // src/dagre/nesting-graph.js
857
+ function run2(g) {
858
+ var root = addDummyNode(g, "root", {}, "_root");
859
+ var depths = treeDepths(g);
860
+ var height = _.max(_.values(depths)) - 1;
861
+ var nodeSep = 2 * height + 1;
862
+ g.graph().nestingRoot = root;
863
+ _.forEach(g.edges(), (e) => {
864
+ g.edge(e).minlen *= nodeSep;
865
+ });
866
+ var weight = sumWeights(g) + 1;
867
+ _.forEach(g.children(), (child) => {
868
+ dfs(g, root, nodeSep, weight, height, depths, child);
869
+ });
870
+ g.graph().nodeRankFactor = nodeSep;
871
+ }
872
+ function dfs(g, root, nodeSep, weight, height, depths, v) {
873
+ var children = g.children(v);
874
+ if (!children.length) {
875
+ if (v !== root) {
876
+ g.setEdge(root, v, { weight: 0, minlen: nodeSep });
700
877
  }
878
+ return;
701
879
  }
702
- enqueue(entry) {
703
- var sentinel = this._sentinel;
704
- if (entry._prev && entry._next) {
705
- unlink(entry);
706
- }
707
- entry._next = sentinel._next;
708
- sentinel._next._prev = entry;
709
- sentinel._next = entry;
710
- entry._prev = sentinel;
880
+ var top = addBorderNode(g, "_bt");
881
+ var bottom = addBorderNode(g, "_bb");
882
+ var label = g.node(v);
883
+ g.setParent(top, v);
884
+ label.borderTop = top;
885
+ g.setParent(bottom, v);
886
+ label.borderBottom = bottom;
887
+ _.forEach(children, (child) => {
888
+ dfs(g, root, nodeSep, weight, height, depths, child);
889
+ var childNode = g.node(child);
890
+ var childTop = childNode.borderTop ? childNode.borderTop : child;
891
+ var childBottom = childNode.borderBottom ? childNode.borderBottom : child;
892
+ var thisWeight = childNode.borderTop ? weight : 2 * weight;
893
+ var minlen = childTop !== childBottom ? 1 : height - depths[v] + 1;
894
+ g.setEdge(top, childTop, {
895
+ weight: thisWeight,
896
+ minlen,
897
+ nestingEdge: true
898
+ });
899
+ g.setEdge(childBottom, bottom, {
900
+ weight: thisWeight,
901
+ minlen,
902
+ nestingEdge: true
903
+ });
904
+ });
905
+ if (!g.parent(v)) {
906
+ g.setEdge(root, top, { weight: 0, minlen: height + depths[v] });
711
907
  }
712
- toString() {
713
- var strs = [];
714
- var sentinel = this._sentinel;
715
- var curr = sentinel._prev;
716
- while (curr !== sentinel) {
717
- strs.push(JSON.stringify(curr, filterOutLinks));
718
- curr = curr._prev;
719
- }
720
- return "[" + strs.join(", ") + "]";
721
- }
722
- };
723
- function unlink(entry) {
724
- entry._prev._next = entry._next;
725
- entry._next._prev = entry._prev;
726
- delete entry._next;
727
- delete entry._prev;
728
- }
729
- function filterOutLinks(k, v) {
730
- if (k !== "_next" && k !== "_prev") {
731
- return v;
732
- }
733
- }
734
-
735
- // src/dagre/greedy-fas.js
736
- var DEFAULT_WEIGHT_FN = _.constant(1);
737
- function greedyFAS(g, weightFn) {
738
- if (g.nodeCount() <= 1) {
739
- return [];
740
- }
741
- var state = buildState(g, weightFn || DEFAULT_WEIGHT_FN);
742
- var results = doGreedyFAS(state.graph, state.buckets, state.zeroIdx);
743
- return _.flatten(
744
- _.map(results, function(e) {
745
- return g.outEdges(e.v, e.w);
746
- })
747
- );
748
- }
749
- function doGreedyFAS(g, buckets, zeroIdx) {
750
- var results = [];
751
- var sources = buckets[buckets.length - 1];
752
- var sinks = buckets[0];
753
- var entry;
754
- while (g.nodeCount()) {
755
- while (entry = sinks.dequeue()) {
756
- removeNode(g, buckets, zeroIdx, entry);
757
- }
758
- while (entry = sources.dequeue()) {
759
- removeNode(g, buckets, zeroIdx, entry);
760
- }
761
- if (g.nodeCount()) {
762
- for (var i = buckets.length - 2; i > 0; --i) {
763
- entry = buckets[i].dequeue();
764
- if (entry) {
765
- results = results.concat(removeNode(g, buckets, zeroIdx, entry, true));
766
- break;
767
- }
768
- }
769
- }
770
- }
771
- return results;
772
908
  }
773
- function removeNode(g, buckets, zeroIdx, entry, collectPredecessors) {
774
- var results = collectPredecessors ? [] : void 0;
775
- _.forEach(g.inEdges(entry.v), function(edge) {
776
- var weight = g.edge(edge);
777
- var uEntry = g.node(edge.v);
778
- if (collectPredecessors) {
779
- results.push({ v: edge.v, w: edge.w });
909
+ function treeDepths(g) {
910
+ var depths = {};
911
+ function dfs3(v, depth) {
912
+ var children = g.children(v);
913
+ if (children?.length) {
914
+ _.forEach(children, (child) => {
915
+ dfs3(child, depth + 1);
916
+ });
780
917
  }
781
- uEntry.out -= weight;
782
- assignBucket(buckets, zeroIdx, uEntry);
783
- });
784
- _.forEach(g.outEdges(entry.v), function(edge) {
785
- var weight = g.edge(edge);
786
- var w = edge.w;
787
- var wEntry = g.node(w);
788
- wEntry["in"] -= weight;
789
- assignBucket(buckets, zeroIdx, wEntry);
790
- });
791
- g.removeNode(entry.v);
792
- return results;
793
- }
794
- function buildState(g, weightFn) {
795
- var fasGraph = new Graph();
796
- var maxIn = 0;
797
- var maxOut = 0;
798
- _.forEach(g.nodes(), function(v) {
799
- fasGraph.setNode(v, { v, in: 0, out: 0 });
800
- });
801
- _.forEach(g.edges(), function(e) {
802
- var prevWeight = fasGraph.edge(e.v, e.w) || 0;
803
- var weight = weightFn(e);
804
- var edgeWeight = prevWeight + weight;
805
- fasGraph.setEdge(e.v, e.w, edgeWeight);
806
- maxOut = Math.max(maxOut, fasGraph.node(e.v).out += weight);
807
- maxIn = Math.max(maxIn, fasGraph.node(e.w)["in"] += weight);
808
- });
809
- var buckets = _.range(maxOut + maxIn + 3).map(function() {
810
- return new List();
811
- });
812
- var zeroIdx = maxIn + 1;
813
- _.forEach(fasGraph.nodes(), function(v) {
814
- assignBucket(buckets, zeroIdx, fasGraph.node(v));
815
- });
816
- return { graph: fasGraph, buckets, zeroIdx };
817
- }
818
- function assignBucket(buckets, zeroIdx, entry) {
819
- if (!entry.out) {
820
- buckets[0].enqueue(entry);
821
- } else if (!entry["in"]) {
822
- buckets[buckets.length - 1].enqueue(entry);
823
- } else {
824
- buckets[entry.out - entry["in"] + zeroIdx].enqueue(entry);
918
+ depths[v] = depth;
825
919
  }
826
- }
827
-
828
- // src/dagre/acyclic.js
829
- function run(g) {
830
- var fas = g.graph().acyclicer === "greedy" ? greedyFAS(g, weightFn(g)) : dfsFAS(g);
831
- _.forEach(fas, function(e) {
832
- var label = g.edge(e);
833
- g.removeEdge(e);
834
- label.forwardName = e.name;
835
- label.reversed = true;
836
- g.setEdge(e.w, e.v, label, _.uniqueId("rev"));
920
+ _.forEach(g.children(), (v) => {
921
+ dfs3(v, 1);
837
922
  });
838
- function weightFn(g2) {
839
- return function(e) {
840
- return g2.edge(e).weight;
841
- };
842
- }
923
+ return depths;
843
924
  }
844
- function dfsFAS(g) {
845
- var fas = [];
846
- var stack = {};
847
- var visited = {};
848
- function dfs3(v) {
849
- if (_.has(visited, v)) {
850
- return;
851
- }
852
- visited[v] = true;
853
- stack[v] = true;
854
- _.forEach(g.outEdges(v), function(e) {
855
- if (_.has(stack, e.w)) {
856
- fas.push(e);
857
- } else {
858
- dfs3(e.w);
859
- }
860
- });
861
- delete stack[v];
862
- }
863
- _.forEach(g.nodes(), dfs3);
864
- return fas;
925
+ function sumWeights(g) {
926
+ return _.reduce(g.edges(), (acc, e) => acc + g.edge(e).weight, 0);
865
927
  }
866
- function undo2(g) {
867
- _.forEach(g.edges(), function(e) {
868
- var label = g.edge(e);
869
- if (label.reversed) {
928
+ function cleanup(g) {
929
+ var graphLabel = g.graph();
930
+ g.removeNode(graphLabel.nestingRoot);
931
+ delete graphLabel.nestingRoot;
932
+ _.forEach(g.edges(), (e) => {
933
+ var edge = g.edge(e);
934
+ if (edge.nestingEdge) {
870
935
  g.removeEdge(e);
871
- var forwardName = label.forwardName;
872
- delete label.reversed;
873
- delete label.forwardName;
874
- g.setEdge(e.w, e.v, label, forwardName);
875
936
  }
876
937
  });
877
938
  }
878
939
 
879
940
  // src/dagre/normalize.js
880
- function run2(g) {
941
+ function run3(g) {
881
942
  g.graph().dummyChains = [];
882
- _.forEach(g.edges(), function(edge) {
943
+ _.forEach(g.edges(), (edge) => {
883
944
  normalizeEdge(g, edge);
884
945
  });
885
946
  }
@@ -919,7 +980,7 @@ function normalizeEdge(g, e) {
919
980
  g.setEdge(v, w, { weight: edgeLabel.weight }, name);
920
981
  }
921
982
  function undo3(g) {
922
- _.forEach(g.graph().dummyChains, function(v) {
983
+ _.forEach(g.graph().dummyChains, (v) => {
923
984
  var node = g.node(v);
924
985
  var origLabel = node.edgeLabel;
925
986
  var w;
@@ -940,465 +1001,91 @@ function undo3(g) {
940
1001
  });
941
1002
  }
942
1003
 
943
- // src/dagre/rank/util.js
944
- function longestPath(g) {
945
- var visited = {};
946
- function dfs3(v) {
947
- var label = g.node(v);
948
- if (_.has(visited, v)) {
949
- return label.rank;
950
- }
951
- visited[v] = true;
952
- var rank2 = _.min(
953
- _.map(g.outEdges(v), function(e) {
954
- return dfs3(e.w) - g.edge(e).minlen;
955
- })
956
- );
957
- if (rank2 === Number.POSITIVE_INFINITY || // return value of _.map([]) for Lodash 3
958
- rank2 === void 0 || // return value of _.map([]) for Lodash 4
959
- rank2 === null) {
960
- rank2 = 0;
1004
+ // src/dagre/order/add-subgraph-constraints.js
1005
+ function addSubgraphConstraints(g, cg, vs) {
1006
+ var prev = {}, rootPrev;
1007
+ _.forEach(vs, (v) => {
1008
+ var child = g.parent(v), parent, prevChild;
1009
+ while (child) {
1010
+ parent = g.parent(child);
1011
+ if (parent) {
1012
+ prevChild = prev[parent];
1013
+ prev[parent] = child;
1014
+ } else {
1015
+ prevChild = rootPrev;
1016
+ rootPrev = child;
1017
+ }
1018
+ if (prevChild && prevChild !== child) {
1019
+ cg.setEdge(prevChild, child);
1020
+ return;
1021
+ }
1022
+ child = parent;
961
1023
  }
962
- return label.rank = rank2;
963
- }
964
- _.forEach(g.sources(), dfs3);
965
- }
966
- function slack(g, e) {
967
- return g.node(e.w).rank - g.node(e.v).rank - g.edge(e).minlen;
1024
+ });
968
1025
  }
969
1026
 
970
- // src/dagre/rank/feasible-tree.js
971
- function feasibleTree(g) {
972
- var t = new Graph({ directed: false });
973
- var start = g.nodes()[0];
974
- var size = g.nodeCount();
975
- t.setNode(start, {});
976
- var edge, delta;
977
- while (tightTree(t, g) < size) {
978
- edge = findMinSlackEdge(t, g);
979
- delta = t.hasNode(edge.v) ? slack(g, edge) : -slack(g, edge);
980
- shiftRanks(t, g, delta);
981
- }
982
- return t;
983
- }
984
- function tightTree(t, g) {
985
- function dfs3(v) {
986
- _.forEach(g.nodeEdges(v), function(e) {
987
- var edgeV = e.v, w = v === edgeV ? e.w : edgeV;
988
- if (!t.hasNode(w) && !slack(g, e)) {
989
- t.setNode(w, {});
990
- t.setEdge(v, w, {});
991
- dfs3(w);
1027
+ // src/dagre/order/build-layer-graph.js
1028
+ function buildLayerGraph(g, rank2, relationship) {
1029
+ var root = createRootNode(g), result = new Graph({ compound: true }).setGraph({ root }).setDefaultNodeLabel((v) => g.node(v));
1030
+ _.forEach(g.nodes(), (v) => {
1031
+ var node = g.node(v), parent = g.parent(v);
1032
+ if (node.rank === rank2 || node.minRank <= rank2 && rank2 <= node.maxRank) {
1033
+ result.setNode(v);
1034
+ result.setParent(v, parent || root);
1035
+ _.forEach(g[relationship](v), (e) => {
1036
+ var u = e.v === v ? e.w : e.v, edge = result.edge(u, v), weight = !_.isUndefined(edge) ? edge.weight : 0;
1037
+ result.setEdge(u, v, { weight: g.edge(e).weight + weight });
1038
+ });
1039
+ if (_.has(node, "minRank")) {
1040
+ result.setNode(v, {
1041
+ borderLeft: node.borderLeft[rank2],
1042
+ borderRight: node.borderRight[rank2]
1043
+ });
992
1044
  }
993
- });
994
- }
995
- _.forEach(t.nodes(), dfs3);
996
- return t.nodeCount();
997
- }
998
- function findMinSlackEdge(t, g) {
999
- return _.minBy(g.edges(), function(e) {
1000
- if (t.hasNode(e.v) !== t.hasNode(e.w)) {
1001
- return slack(g, e);
1002
1045
  }
1003
1046
  });
1047
+ return result;
1004
1048
  }
1005
- function shiftRanks(t, g, delta) {
1006
- _.forEach(t.nodes(), function(v) {
1007
- g.node(v).rank += delta;
1008
- });
1009
- }
1010
-
1011
- // src/graphlib/alg/dijkstra.js
1012
- _.constant(1);
1013
-
1014
- // src/graphlib/alg/floyd-warshall.js
1015
- _.constant(1);
1016
- function CycleException() {
1049
+ function createRootNode(g) {
1050
+ var v;
1051
+ while (g.hasNode(v = _.uniqueId("_root"))) ;
1052
+ return v;
1017
1053
  }
1018
- CycleException.prototype = new Error();
1019
1054
 
1020
- // src/graphlib/alg/dfs.js
1021
- function dfs(g, vs, order2) {
1022
- if (!_.isArray(vs)) {
1023
- vs = [vs];
1024
- }
1025
- var navigation = (g.isDirected() ? g.successors : g.neighbors).bind(g);
1026
- var acc = [];
1027
- var visited = {};
1028
- _.each(vs, function(v) {
1029
- if (!g.hasNode(v)) {
1030
- throw new Error("Graph does not have node: " + v);
1031
- }
1032
- doDfs(g, v, order2 === "post", visited, navigation, acc);
1033
- });
1034
- return acc;
1035
- }
1036
- function doDfs(g, v, postorder3, visited, navigation, acc) {
1037
- if (!_.has(visited, v)) {
1038
- visited[v] = true;
1039
- if (!postorder3) {
1040
- acc.push(v);
1041
- }
1042
- _.each(navigation(v), function(w) {
1043
- doDfs(g, w, postorder3, visited, navigation, acc);
1044
- });
1045
- if (postorder3) {
1046
- acc.push(v);
1047
- }
1048
- }
1049
- }
1050
-
1051
- // src/graphlib/alg/postorder.js
1052
- function postorder(g, vs) {
1053
- return dfs(g, vs, "post");
1054
- }
1055
-
1056
- // src/graphlib/alg/preorder.js
1057
- function preorder(g, vs) {
1058
- return dfs(g, vs, "pre");
1059
- }
1060
-
1061
- // src/dagre/rank/network-simplex.js
1062
- networkSimplex.initLowLimValues = initLowLimValues;
1063
- networkSimplex.initCutValues = initCutValues;
1064
- networkSimplex.calcCutValue = calcCutValue;
1065
- networkSimplex.leaveEdge = leaveEdge;
1066
- networkSimplex.enterEdge = enterEdge;
1067
- networkSimplex.exchangeEdges = exchangeEdges;
1068
- function networkSimplex(g) {
1069
- g = simplify(g);
1070
- longestPath(g);
1071
- var t = feasibleTree(g);
1072
- initLowLimValues(t);
1073
- initCutValues(t, g);
1074
- var e, f;
1075
- while (e = leaveEdge(t)) {
1076
- f = enterEdge(t, g, e);
1077
- exchangeEdges(t, g, e, f);
1078
- }
1079
- }
1080
- function initCutValues(t, g) {
1081
- var vs = postorder(t, t.nodes());
1082
- vs = vs.slice(0, vs.length - 1);
1083
- _.forEach(vs, function(v) {
1084
- assignCutValue(t, g, v);
1085
- });
1086
- }
1087
- function assignCutValue(t, g, child) {
1088
- var childLab = t.node(child);
1089
- var parent = childLab.parent;
1090
- t.edge(child, parent).cutvalue = calcCutValue(t, g, child);
1091
- }
1092
- function calcCutValue(t, g, child) {
1093
- var childLab = t.node(child);
1094
- var parent = childLab.parent;
1095
- var childIsTail = true;
1096
- var graphEdge = g.edge(child, parent);
1097
- var cutValue = 0;
1098
- if (!graphEdge) {
1099
- childIsTail = false;
1100
- graphEdge = g.edge(parent, child);
1101
- }
1102
- cutValue = graphEdge.weight;
1103
- _.forEach(g.nodeEdges(child), function(e) {
1104
- var isOutEdge = e.v === child, other = isOutEdge ? e.w : e.v;
1105
- if (other !== parent) {
1106
- var pointsToHead = isOutEdge === childIsTail, otherWeight = g.edge(e).weight;
1107
- cutValue += pointsToHead ? otherWeight : -otherWeight;
1108
- if (isTreeEdge(t, child, other)) {
1109
- var otherCutValue = t.edge(child, other).cutvalue;
1110
- cutValue += pointsToHead ? -otherCutValue : otherCutValue;
1111
- }
1112
- }
1113
- });
1114
- return cutValue;
1115
- }
1116
- function initLowLimValues(tree, root) {
1117
- if (arguments.length < 2) {
1118
- root = tree.nodes()[0];
1119
- }
1120
- dfsAssignLowLim(tree, {}, 1, root);
1121
- }
1122
- function dfsAssignLowLim(tree, visited, nextLim, v, parent) {
1123
- var low = nextLim;
1124
- var label = tree.node(v);
1125
- visited[v] = true;
1126
- _.forEach(tree.neighbors(v), function(w) {
1127
- if (!_.has(visited, w)) {
1128
- nextLim = dfsAssignLowLim(tree, visited, nextLim, w, v);
1129
- }
1130
- });
1131
- label.low = low;
1132
- label.lim = nextLim++;
1133
- if (parent) {
1134
- label.parent = parent;
1135
- } else {
1136
- delete label.parent;
1137
- }
1138
- return nextLim;
1139
- }
1140
- function leaveEdge(tree) {
1141
- return _.find(tree.edges(), function(e) {
1142
- return tree.edge(e).cutvalue < 0;
1143
- });
1144
- }
1145
- function enterEdge(t, g, edge) {
1146
- var v = edge.v;
1147
- var w = edge.w;
1148
- if (!g.hasEdge(v, w)) {
1149
- v = edge.w;
1150
- w = edge.v;
1151
- }
1152
- var vLabel = t.node(v);
1153
- var wLabel = t.node(w);
1154
- var tailLabel = vLabel;
1155
- var flip = false;
1156
- if (vLabel.lim > wLabel.lim) {
1157
- tailLabel = wLabel;
1158
- flip = true;
1159
- }
1160
- var candidates = _.filter(g.edges(), function(edge2) {
1161
- return flip === isDescendant(t, t.node(edge2.v), tailLabel) && flip !== isDescendant(t, t.node(edge2.w), tailLabel);
1162
- });
1163
- return _.minBy(candidates, function(edge2) {
1164
- return slack(g, edge2);
1165
- });
1166
- }
1167
- function exchangeEdges(t, g, e, f) {
1168
- var v = e.v;
1169
- var w = e.w;
1170
- t.removeEdge(v, w);
1171
- t.setEdge(f.v, f.w, {});
1172
- initLowLimValues(t);
1173
- initCutValues(t, g);
1174
- updateRanks(t, g);
1175
- }
1176
- function updateRanks(t, g) {
1177
- var root = _.find(t.nodes(), function(v) {
1178
- return !g.node(v).parent;
1179
- });
1180
- var vs = preorder(t, root);
1181
- vs = vs.slice(1);
1182
- _.forEach(vs, function(v) {
1183
- var parent = t.node(v).parent, edge = g.edge(v, parent), flipped = false;
1184
- if (!edge) {
1185
- edge = g.edge(parent, v);
1186
- flipped = true;
1187
- }
1188
- g.node(v).rank = g.node(parent).rank + (flipped ? edge.minlen : -edge.minlen);
1189
- });
1190
- }
1191
- function isTreeEdge(tree, u, v) {
1192
- return tree.hasEdge(u, v);
1193
- }
1194
- function isDescendant(tree, vLabel, rootLabel) {
1195
- return rootLabel.low <= vLabel.lim && vLabel.lim <= rootLabel.lim;
1196
- }
1197
-
1198
- // src/dagre/rank/index.js
1199
- function rank(g) {
1200
- switch (g.graph().ranker) {
1201
- case "network-simplex":
1202
- networkSimplexRanker(g);
1203
- break;
1204
- case "tight-tree":
1205
- tightTreeRanker(g);
1206
- break;
1207
- case "longest-path":
1208
- longestPathRanker(g);
1209
- break;
1210
- default:
1211
- networkSimplexRanker(g);
1212
- }
1213
- }
1214
- var longestPathRanker = longestPath;
1215
- function tightTreeRanker(g) {
1216
- longestPath(g);
1217
- feasibleTree(g);
1218
- }
1219
- function networkSimplexRanker(g) {
1220
- networkSimplex(g);
1221
- }
1222
-
1223
- // src/dagre/nesting-graph.js
1224
- function run3(g) {
1225
- var root = addDummyNode(g, "root", {}, "_root");
1226
- var depths = treeDepths(g);
1227
- var height = _.max(_.values(depths)) - 1;
1228
- var nodeSep = 2 * height + 1;
1229
- g.graph().nestingRoot = root;
1230
- _.forEach(g.edges(), function(e) {
1231
- g.edge(e).minlen *= nodeSep;
1232
- });
1233
- var weight = sumWeights(g) + 1;
1234
- _.forEach(g.children(), function(child) {
1235
- dfs2(g, root, nodeSep, weight, height, depths, child);
1236
- });
1237
- g.graph().nodeRankFactor = nodeSep;
1238
- }
1239
- function dfs2(g, root, nodeSep, weight, height, depths, v) {
1240
- var children = g.children(v);
1241
- if (!children.length) {
1242
- if (v !== root) {
1243
- g.setEdge(root, v, { weight: 0, minlen: nodeSep });
1244
- }
1245
- return;
1246
- }
1247
- var top = addBorderNode(g, "_bt");
1248
- var bottom = addBorderNode(g, "_bb");
1249
- var label = g.node(v);
1250
- g.setParent(top, v);
1251
- label.borderTop = top;
1252
- g.setParent(bottom, v);
1253
- label.borderBottom = bottom;
1254
- _.forEach(children, function(child) {
1255
- dfs2(g, root, nodeSep, weight, height, depths, child);
1256
- var childNode = g.node(child);
1257
- var childTop = childNode.borderTop ? childNode.borderTop : child;
1258
- var childBottom = childNode.borderBottom ? childNode.borderBottom : child;
1259
- var thisWeight = childNode.borderTop ? weight : 2 * weight;
1260
- var minlen = childTop !== childBottom ? 1 : height - depths[v] + 1;
1261
- g.setEdge(top, childTop, {
1262
- weight: thisWeight,
1263
- minlen,
1264
- nestingEdge: true
1265
- });
1266
- g.setEdge(childBottom, bottom, {
1267
- weight: thisWeight,
1268
- minlen,
1269
- nestingEdge: true
1270
- });
1271
- });
1272
- if (!g.parent(v)) {
1273
- g.setEdge(root, top, { weight: 0, minlen: height + depths[v] });
1274
- }
1275
- }
1276
- function treeDepths(g) {
1277
- var depths = {};
1278
- function dfs3(v, depth) {
1279
- var children = g.children(v);
1280
- if (children && children.length) {
1281
- _.forEach(children, function(child) {
1282
- dfs3(child, depth + 1);
1283
- });
1284
- }
1285
- depths[v] = depth;
1286
- }
1287
- _.forEach(g.children(), function(v) {
1288
- dfs3(v, 1);
1289
- });
1290
- return depths;
1291
- }
1292
- function sumWeights(g) {
1293
- return _.reduce(
1294
- g.edges(),
1295
- function(acc, e) {
1296
- return acc + g.edge(e).weight;
1297
- },
1298
- 0
1299
- );
1300
- }
1301
- function cleanup(g) {
1302
- var graphLabel = g.graph();
1303
- g.removeNode(graphLabel.nestingRoot);
1304
- delete graphLabel.nestingRoot;
1305
- _.forEach(g.edges(), function(e) {
1306
- var edge = g.edge(e);
1307
- if (edge.nestingEdge) {
1308
- g.removeEdge(e);
1309
- }
1310
- });
1311
- }
1312
-
1313
- // src/dagre/order/add-subgraph-constraints.js
1314
- function addSubgraphConstraints(g, cg, vs) {
1315
- var prev = {}, rootPrev;
1316
- _.forEach(vs, function(v) {
1317
- var child = g.parent(v), parent, prevChild;
1318
- while (child) {
1319
- parent = g.parent(child);
1320
- if (parent) {
1321
- prevChild = prev[parent];
1322
- prev[parent] = child;
1323
- } else {
1324
- prevChild = rootPrev;
1325
- rootPrev = child;
1326
- }
1327
- if (prevChild && prevChild !== child) {
1328
- cg.setEdge(prevChild, child);
1329
- return;
1330
- }
1331
- child = parent;
1332
- }
1333
- });
1334
- }
1335
-
1336
- // src/dagre/order/build-layer-graph.js
1337
- function buildLayerGraph(g, rank2, relationship) {
1338
- var root = createRootNode(g), result = new Graph({ compound: true }).setGraph({ root }).setDefaultNodeLabel(function(v) {
1339
- return g.node(v);
1340
- });
1341
- _.forEach(g.nodes(), function(v) {
1342
- var node = g.node(v), parent = g.parent(v);
1343
- if (node.rank === rank2 || node.minRank <= rank2 && rank2 <= node.maxRank) {
1344
- result.setNode(v);
1345
- result.setParent(v, parent || root);
1346
- _.forEach(g[relationship](v), function(e) {
1347
- var u = e.v === v ? e.w : e.v, edge = result.edge(u, v), weight = !_.isUndefined(edge) ? edge.weight : 0;
1348
- result.setEdge(u, v, { weight: g.edge(e).weight + weight });
1349
- });
1350
- if (_.has(node, "minRank")) {
1351
- result.setNode(v, {
1352
- borderLeft: node.borderLeft[rank2],
1353
- borderRight: node.borderRight[rank2]
1354
- });
1355
- }
1356
- }
1357
- });
1358
- return result;
1359
- }
1360
- function createRootNode(g) {
1361
- var v;
1362
- while (g.hasNode(v = _.uniqueId("_root"))) ;
1363
- return v;
1364
- }
1365
-
1366
- // src/dagre/order/cross-count.js
1367
- function crossCount(g, layering) {
1368
- var cc = 0;
1369
- for (var i = 1; i < layering.length; ++i) {
1370
- cc += twoLayerCrossCount(g, layering[i - 1], layering[i]);
1055
+ // src/dagre/order/cross-count.js
1056
+ function crossCount(g, layering) {
1057
+ var cc = 0;
1058
+ for (var i = 1; i < layering.length; ++i) {
1059
+ cc += twoLayerCrossCount(g, layering[i - 1], layering[i]);
1371
1060
  }
1372
1061
  return cc;
1373
1062
  }
1374
1063
  function twoLayerCrossCount(g, northLayer, southLayer) {
1375
1064
  var southPos = _.zipObject(
1376
1065
  southLayer,
1377
- _.map(southLayer, function(v, i) {
1378
- return i;
1379
- })
1066
+ _.map(southLayer, (_v, i) => i)
1380
1067
  );
1381
1068
  var southEntries = _.flatten(
1382
- _.map(northLayer, function(v) {
1383
- return _.sortBy(
1384
- _.map(g.outEdges(v), function(e) {
1385
- return { pos: southPos[e.w], weight: g.edge(e).weight };
1386
- }),
1069
+ _.map(
1070
+ northLayer,
1071
+ (v) => _.sortBy(
1072
+ _.map(g.outEdges(v), (e) => ({
1073
+ pos: southPos[e.w],
1074
+ weight: g.edge(e).weight
1075
+ })),
1387
1076
  "pos"
1388
- );
1389
- })
1077
+ )
1078
+ )
1390
1079
  );
1391
1080
  var firstIndex = 1;
1392
1081
  while (firstIndex < southLayer.length) firstIndex <<= 1;
1393
1082
  var treeSize = 2 * firstIndex - 1;
1394
1083
  firstIndex -= 1;
1395
- var tree = _.map(new Array(treeSize), function() {
1396
- return 0;
1397
- });
1084
+ var tree = _.map(new Array(treeSize), () => 0);
1398
1085
  var cc = 0;
1399
1086
  _.forEach(
1400
1087
  // @ts-expect-error
1401
- southEntries.forEach(function(entry) {
1088
+ southEntries.forEach((entry) => {
1402
1089
  var index = entry.pos + firstIndex;
1403
1090
  tree[index] += entry.weight;
1404
1091
  var weightSum = 0;
@@ -1418,17 +1105,9 @@ function twoLayerCrossCount(g, northLayer, southLayer) {
1418
1105
  // src/dagre/order/init-order.js
1419
1106
  function initOrder(g) {
1420
1107
  var visited = {};
1421
- var simpleNodes = _.filter(g.nodes(), function(v) {
1422
- return !g.children(v).length;
1423
- });
1424
- var maxRank2 = _.max(
1425
- _.map(simpleNodes, function(v) {
1426
- return g.node(v).rank;
1427
- })
1428
- );
1429
- var layers = _.map(_.range(maxRank2 + 1), function() {
1430
- return [];
1431
- });
1108
+ var simpleNodes = _.filter(g.nodes(), (v) => !g.children(v).length);
1109
+ var maxRank2 = _.max(_.map(simpleNodes, (v) => g.node(v).rank));
1110
+ var layers = _.map(_.range(maxRank2 + 1), () => []);
1432
1111
  function dfs3(v) {
1433
1112
  if (_.has(visited, v)) return;
1434
1113
  visited[v] = true;
@@ -1436,23 +1115,21 @@ function initOrder(g) {
1436
1115
  layers[node.rank].push(v);
1437
1116
  _.forEach(g.successors(v), dfs3);
1438
1117
  }
1439
- var orderedVs = _.sortBy(simpleNodes, function(v) {
1440
- return g.node(v).rank;
1441
- });
1118
+ var orderedVs = _.sortBy(simpleNodes, (v) => g.node(v).rank);
1442
1119
  _.forEach(orderedVs, dfs3);
1443
1120
  return layers;
1444
1121
  }
1445
1122
 
1446
1123
  // src/dagre/order/barycenter.js
1447
1124
  function barycenter(g, movable) {
1448
- return _.map(movable, function(v) {
1125
+ return _.map(movable, (v) => {
1449
1126
  var inV = g.inEdges(v);
1450
1127
  if (!inV.length) {
1451
1128
  return { v };
1452
1129
  } else {
1453
1130
  var result = _.reduce(
1454
1131
  inV,
1455
- function(acc, e) {
1132
+ (acc, e) => {
1456
1133
  var edge = g.edge(e), nodeU = g.node(e.v);
1457
1134
  return {
1458
1135
  sum: acc.sum + edge.weight * nodeU.order,
@@ -1473,7 +1150,7 @@ function barycenter(g, movable) {
1473
1150
  // src/dagre/order/resolve-conflicts.js
1474
1151
  function resolveConflicts(entries, cg) {
1475
1152
  var mappedEntries = {};
1476
- _.forEach(entries, function(entry, i) {
1153
+ _.forEach(entries, (entry, i) => {
1477
1154
  var tmp = mappedEntries[entry.v] = {
1478
1155
  indegree: 0,
1479
1156
  in: [],
@@ -1486,7 +1163,7 @@ function resolveConflicts(entries, cg) {
1486
1163
  tmp.weight = entry.weight;
1487
1164
  }
1488
1165
  });
1489
- _.forEach(cg.edges(), function(e) {
1166
+ _.forEach(cg.edges(), (e) => {
1490
1167
  var entryV = mappedEntries[e.v];
1491
1168
  var entryW = mappedEntries[e.w];
1492
1169
  if (!_.isUndefined(entryV) && !_.isUndefined(entryW)) {
@@ -1494,7 +1171,7 @@ function resolveConflicts(entries, cg) {
1494
1171
  entryV.out.push(mappedEntries[e.w]);
1495
1172
  }
1496
1173
  });
1497
- var sourceSet = _.filter(mappedEntries, function(entry) {
1174
+ var sourceSet = _.filter(mappedEntries, (entry) => {
1498
1175
  return !entry.indegree;
1499
1176
  });
1500
1177
  return doResolveConflicts(sourceSet);
@@ -1502,7 +1179,7 @@ function resolveConflicts(entries, cg) {
1502
1179
  function doResolveConflicts(sourceSet) {
1503
1180
  var entries = [];
1504
1181
  function handleIn(vEntry) {
1505
- return function(uEntry) {
1182
+ return (uEntry) => {
1506
1183
  if (uEntry.merged) {
1507
1184
  return;
1508
1185
  }
@@ -1512,8 +1189,8 @@ function doResolveConflicts(sourceSet) {
1512
1189
  };
1513
1190
  }
1514
1191
  function handleOut(vEntry) {
1515
- return function(wEntry) {
1516
- wEntry["in"].push(vEntry);
1192
+ return (wEntry) => {
1193
+ wEntry.in.push(vEntry);
1517
1194
  if (--wEntry.indegree === 0) {
1518
1195
  sourceSet.push(wEntry);
1519
1196
  }
@@ -1522,16 +1199,12 @@ function doResolveConflicts(sourceSet) {
1522
1199
  while (sourceSet.length) {
1523
1200
  var entry = sourceSet.pop();
1524
1201
  entries.push(entry);
1525
- _.forEach(entry["in"].reverse(), handleIn(entry));
1202
+ _.forEach(entry.in.reverse(), handleIn(entry));
1526
1203
  _.forEach(entry.out, handleOut(entry));
1527
1204
  }
1528
1205
  return _.map(
1529
- _.filter(entries, function(entry2) {
1530
- return !entry2.merged;
1531
- }),
1532
- function(entry2) {
1533
- return _.pick(entry2, ["vs", "i", "barycenter", "weight"]);
1534
- }
1206
+ _.filter(entries, (entry2) => !entry2.merged),
1207
+ (entry2) => _.pick(entry2, ["vs", "i", "barycenter", "weight"])
1535
1208
  );
1536
1209
  }
1537
1210
  function mergeEntries(target, source) {
@@ -1554,15 +1227,11 @@ function mergeEntries(target, source) {
1554
1227
 
1555
1228
  // src/dagre/order/sort.js
1556
1229
  function sort(entries, biasRight) {
1557
- var parts = partition(entries, function(entry) {
1558
- return _.has(entry, "barycenter");
1559
- });
1560
- var sortable = parts.lhs, unsortable = _.sortBy(parts.rhs, function(entry) {
1561
- return -entry.i;
1562
- }), vs = [], sum = 0, weight = 0, vsIndex = 0;
1230
+ var parts = partition(entries, (entry) => _.has(entry, "barycenter"));
1231
+ var sortable = parts.lhs, unsortable = _.sortBy(parts.rhs, (entry) => -entry.i), vs = [], sum = 0, weight = 0, vsIndex = 0;
1563
1232
  sortable.sort(compareWithBias(!!biasRight));
1564
1233
  vsIndex = consumeUnsortable(vs, unsortable, vsIndex);
1565
- _.forEach(sortable, function(entry) {
1234
+ _.forEach(sortable, (entry) => {
1566
1235
  vsIndex += entry.vs.length;
1567
1236
  vs.push(entry.vs);
1568
1237
  sum += entry.barycenter * entry.weight;
@@ -1586,7 +1255,7 @@ function consumeUnsortable(vs, unsortable, index) {
1586
1255
  return index;
1587
1256
  }
1588
1257
  function compareWithBias(bias) {
1589
- return function(entryV, entryW) {
1258
+ return (entryV, entryW) => {
1590
1259
  if (entryV.barycenter < entryW.barycenter) {
1591
1260
  return -1;
1592
1261
  } else if (entryV.barycenter > entryW.barycenter) {
@@ -1604,12 +1273,10 @@ function sortSubgraph(g, v, cg, biasRight) {
1604
1273
  var br = node ? node.borderRight : void 0;
1605
1274
  var subgraphs = {};
1606
1275
  if (bl) {
1607
- movable = _.filter(movable, function(w) {
1608
- return w !== bl && w !== br;
1609
- });
1276
+ movable = _.filter(movable, (w) => w !== bl && w !== br);
1610
1277
  }
1611
1278
  var barycenters = barycenter(g, movable);
1612
- _.forEach(barycenters, function(entry) {
1279
+ _.forEach(barycenters, (entry) => {
1613
1280
  if (g.children(entry.v).length) {
1614
1281
  var subgraphResult = sortSubgraph(g, entry.v, cg, biasRight);
1615
1282
  subgraphs[entry.v] = subgraphResult;
@@ -1636,9 +1303,9 @@ function sortSubgraph(g, v, cg, biasRight) {
1636
1303
  return result;
1637
1304
  }
1638
1305
  function expandSubgraphs(entries, subgraphs) {
1639
- _.forEach(entries, function(entry) {
1306
+ _.forEach(entries, (entry) => {
1640
1307
  entry.vs = _.flatten(
1641
- entry.vs.map(function(v) {
1308
+ entry.vs.map((v) => {
1642
1309
  if (subgraphs[v]) {
1643
1310
  return subgraphs[v].vs;
1644
1311
  }
@@ -1659,7 +1326,11 @@ function mergeBarycenters(target, other) {
1659
1326
 
1660
1327
  // src/dagre/order/index.js
1661
1328
  function order(g) {
1662
- var maxRank2 = maxRank(g), downLayerGraphs = buildLayerGraphs(g, _.range(1, maxRank2 + 1), "inEdges"), upLayerGraphs = buildLayerGraphs(g, _.range(maxRank2 - 1, -1, -1), "outEdges");
1329
+ var maxRank2 = maxRank(g), downLayerGraphs = buildLayerGraphs(g, _.range(1, maxRank2 + 1), "inEdges"), upLayerGraphs = buildLayerGraphs(
1330
+ g,
1331
+ _.range(maxRank2 - 1, -1, -1),
1332
+ "outEdges"
1333
+ );
1663
1334
  var layering = initOrder(g);
1664
1335
  assignOrder(g, layering);
1665
1336
  var bestCC = Number.POSITIVE_INFINITY, best;
@@ -1676,24 +1347,22 @@ function order(g) {
1676
1347
  assignOrder(g, best);
1677
1348
  }
1678
1349
  function buildLayerGraphs(g, ranks, relationship) {
1679
- return _.map(ranks, function(rank2) {
1680
- return buildLayerGraph(g, rank2, relationship);
1681
- });
1350
+ return _.map(ranks, (rank2) => buildLayerGraph(g, rank2, relationship));
1682
1351
  }
1683
1352
  function sweepLayerGraphs(layerGraphs, biasRight) {
1684
1353
  var cg = new Graph();
1685
- _.forEach(layerGraphs, function(lg) {
1354
+ _.forEach(layerGraphs, (lg) => {
1686
1355
  var root = lg.graph().root;
1687
1356
  var sorted = sortSubgraph(lg, root, cg, biasRight);
1688
- _.forEach(sorted.vs, function(v, i) {
1357
+ _.forEach(sorted.vs, (v, i) => {
1689
1358
  lg.node(v).order = i;
1690
1359
  });
1691
1360
  addSubgraphConstraints(lg, cg, sorted.vs);
1692
1361
  });
1693
1362
  }
1694
1363
  function assignOrder(g, layering) {
1695
- _.forEach(layering, function(layer) {
1696
- _.forEach(layer, function(v, i) {
1364
+ _.forEach(layering, (layer) => {
1365
+ _.forEach(layer, (v, i) => {
1697
1366
  g.node(v).order = i;
1698
1367
  });
1699
1368
  });
@@ -1701,8 +1370,8 @@ function assignOrder(g, layering) {
1701
1370
 
1702
1371
  // src/dagre/parent-dummy-chains.js
1703
1372
  function parentDummyChains(g) {
1704
- var postorderNums = postorder2(g);
1705
- _.forEach(g.graph().dummyChains, function(v) {
1373
+ var postorderNums = postorder(g);
1374
+ _.forEach(g.graph().dummyChains, (v) => {
1706
1375
  var node = g.node(v);
1707
1376
  var edgeObj = node.edgeObj;
1708
1377
  var pathData = findPath(g, postorderNums, edgeObj.v, edgeObj.w);
@@ -1727,450 +1396,720 @@ function parentDummyChains(g) {
1727
1396
  }
1728
1397
  pathV = path[pathIdx];
1729
1398
  }
1730
- g.setParent(v, pathV);
1731
- v = g.successors(v)[0];
1399
+ g.setParent(v, pathV);
1400
+ v = g.successors(v)[0];
1401
+ }
1402
+ });
1403
+ }
1404
+ function findPath(g, postorderNums, v, w) {
1405
+ var vPath = [];
1406
+ var wPath = [];
1407
+ var low = Math.min(postorderNums[v].low, postorderNums[w].low);
1408
+ var lim = Math.max(postorderNums[v].lim, postorderNums[w].lim);
1409
+ var parent;
1410
+ var lca;
1411
+ parent = v;
1412
+ do {
1413
+ parent = g.parent(parent);
1414
+ vPath.push(parent);
1415
+ } while (parent && (postorderNums[parent].low > low || lim > postorderNums[parent].lim));
1416
+ lca = parent;
1417
+ parent = w;
1418
+ while ((parent = g.parent(parent)) !== lca) {
1419
+ wPath.push(parent);
1420
+ }
1421
+ return { path: vPath.concat(wPath.reverse()), lca };
1422
+ }
1423
+ function postorder(g) {
1424
+ var result = {};
1425
+ var lim = 0;
1426
+ function dfs3(v) {
1427
+ var low = lim;
1428
+ _.forEach(g.children(v), dfs3);
1429
+ result[v] = { low, lim: lim++ };
1430
+ }
1431
+ _.forEach(g.children(), dfs3);
1432
+ return result;
1433
+ }
1434
+
1435
+ // src/dagre/position/bk.js
1436
+ function findType1Conflicts(g, layering) {
1437
+ var conflicts = {};
1438
+ function visitLayer(prevLayer, layer) {
1439
+ var k0 = 0, scanPos = 0, prevLayerLength = prevLayer.length, lastNode = _.last(layer);
1440
+ _.forEach(layer, (v, i) => {
1441
+ var w = findOtherInnerSegmentNode(g, v), k1 = w ? g.node(w).order : prevLayerLength;
1442
+ if (w || v === lastNode) {
1443
+ _.forEach(layer.slice(scanPos, i + 1), (scanNode) => {
1444
+ _.forEach(g.predecessors(scanNode), (u) => {
1445
+ var uLabel = g.node(u), uPos = uLabel.order;
1446
+ if ((uPos < k0 || k1 < uPos) && !(uLabel.dummy && g.node(scanNode).dummy)) {
1447
+ addConflict(conflicts, u, scanNode);
1448
+ }
1449
+ });
1450
+ });
1451
+ scanPos = i + 1;
1452
+ k0 = k1;
1453
+ }
1454
+ });
1455
+ return layer;
1456
+ }
1457
+ _.reduce(layering, visitLayer);
1458
+ return conflicts;
1459
+ }
1460
+ function findType2Conflicts(g, layering) {
1461
+ var conflicts = {};
1462
+ function scan(south, southPos, southEnd, prevNorthBorder, nextNorthBorder) {
1463
+ var v;
1464
+ _.forEach(_.range(southPos, southEnd), (i) => {
1465
+ v = south[i];
1466
+ if (g.node(v).dummy) {
1467
+ _.forEach(g.predecessors(v), (u) => {
1468
+ var uNode = g.node(u);
1469
+ if (uNode.dummy && (uNode.order < prevNorthBorder || uNode.order > nextNorthBorder)) {
1470
+ addConflict(conflicts, u, v);
1471
+ }
1472
+ });
1473
+ }
1474
+ });
1475
+ }
1476
+ function visitLayer(north, south) {
1477
+ var prevNorthPos = -1, nextNorthPos, southPos = 0;
1478
+ _.forEach(south, (v, southLookahead) => {
1479
+ if (g.node(v).dummy === "border") {
1480
+ var predecessors = g.predecessors(v);
1481
+ if (predecessors.length) {
1482
+ nextNorthPos = g.node(predecessors[0]).order;
1483
+ scan(south, southPos, southLookahead, prevNorthPos, nextNorthPos);
1484
+ southPos = southLookahead;
1485
+ prevNorthPos = nextNorthPos;
1486
+ }
1487
+ }
1488
+ scan(south, southPos, south.length, nextNorthPos, north.length);
1489
+ });
1490
+ return south;
1491
+ }
1492
+ _.reduce(layering, visitLayer);
1493
+ return conflicts;
1494
+ }
1495
+ function findOtherInnerSegmentNode(g, v) {
1496
+ if (g.node(v).dummy) {
1497
+ return _.find(g.predecessors(v), (u) => g.node(u).dummy);
1498
+ }
1499
+ }
1500
+ function addConflict(conflicts, v, w) {
1501
+ if (v > w) {
1502
+ var tmp = v;
1503
+ v = w;
1504
+ w = tmp;
1505
+ }
1506
+ var conflictsV = conflicts[v];
1507
+ if (!conflictsV) {
1508
+ conflicts[v] = conflictsV = {};
1509
+ }
1510
+ conflictsV[w] = true;
1511
+ }
1512
+ function hasConflict(conflicts, v, w) {
1513
+ if (v > w) {
1514
+ var tmp = v;
1515
+ v = w;
1516
+ w = tmp;
1517
+ }
1518
+ return _.has(conflicts[v], w);
1519
+ }
1520
+ function verticalAlignment(_g, layering, conflicts, neighborFn) {
1521
+ var root = {}, align = {}, pos = {};
1522
+ _.forEach(layering, (layer) => {
1523
+ _.forEach(layer, (v, order2) => {
1524
+ root[v] = v;
1525
+ align[v] = v;
1526
+ pos[v] = order2;
1527
+ });
1528
+ });
1529
+ _.forEach(layering, (layer) => {
1530
+ var prevIdx = -1;
1531
+ _.forEach(layer, (v) => {
1532
+ var ws = neighborFn(v);
1533
+ if (ws.length) {
1534
+ ws = _.sortBy(ws, (w2) => pos[w2]);
1535
+ var mp = (ws.length - 1) / 2;
1536
+ for (var i = Math.floor(mp), il = Math.ceil(mp); i <= il; ++i) {
1537
+ var w = ws[i];
1538
+ if (align[v] === v && prevIdx < pos[w] && !hasConflict(conflicts, v, w)) {
1539
+ align[w] = v;
1540
+ align[v] = root[v] = root[w];
1541
+ prevIdx = pos[w];
1542
+ }
1543
+ }
1544
+ }
1545
+ });
1546
+ });
1547
+ return { root, align };
1548
+ }
1549
+ function horizontalCompaction(g, layering, root, align, reverseSep) {
1550
+ var xs = {}, blockG = buildBlockGraph(g, layering, root, reverseSep), borderType = reverseSep ? "borderLeft" : "borderRight";
1551
+ function iterate(setXsFunc, nextNodesFunc) {
1552
+ var stack = blockG.nodes();
1553
+ var elem = stack.pop();
1554
+ var visited = {};
1555
+ while (elem) {
1556
+ if (visited[elem]) {
1557
+ setXsFunc(elem);
1558
+ } else {
1559
+ visited[elem] = true;
1560
+ stack.push(elem);
1561
+ stack = stack.concat(nextNodesFunc(elem));
1562
+ }
1563
+ elem = stack.pop();
1564
+ }
1565
+ }
1566
+ function pass1(elem) {
1567
+ xs[elem] = blockG.inEdges(elem).reduce((acc, e) => Math.max(acc, xs[e.v] + blockG.edge(e)), 0);
1568
+ }
1569
+ function pass2(elem) {
1570
+ var min = blockG.outEdges(elem).reduce(
1571
+ (acc, e) => Math.min(acc, xs[e.w] - blockG.edge(e)),
1572
+ Number.POSITIVE_INFINITY
1573
+ );
1574
+ var node = g.node(elem);
1575
+ if (min !== Number.POSITIVE_INFINITY && node.borderType !== borderType) {
1576
+ xs[elem] = Math.max(xs[elem], min);
1577
+ }
1578
+ }
1579
+ iterate(pass1, blockG.predecessors.bind(blockG));
1580
+ iterate(pass2, blockG.successors.bind(blockG));
1581
+ _.forEach(align, (v) => {
1582
+ xs[v] = xs[root[v]];
1583
+ });
1584
+ return xs;
1585
+ }
1586
+ function buildBlockGraph(g, layering, root, reverseSep) {
1587
+ var blockGraph = new Graph(), graphLabel = g.graph(), sepFn = sep(graphLabel.nodesep, graphLabel.edgesep, reverseSep);
1588
+ _.forEach(layering, (layer) => {
1589
+ var u;
1590
+ _.forEach(layer, (v) => {
1591
+ var vRoot = root[v];
1592
+ blockGraph.setNode(vRoot);
1593
+ if (u) {
1594
+ var uRoot = root[u], prevMax = blockGraph.edge(uRoot, vRoot);
1595
+ blockGraph.setEdge(
1596
+ uRoot,
1597
+ vRoot,
1598
+ Math.max(sepFn(g, v, u), prevMax || 0)
1599
+ );
1600
+ }
1601
+ u = v;
1602
+ });
1603
+ });
1604
+ return blockGraph;
1605
+ }
1606
+ function findSmallestWidthAlignment(g, xss) {
1607
+ return _.minBy(_.values(xss), (xs) => {
1608
+ var max = Number.NEGATIVE_INFINITY;
1609
+ var min = Number.POSITIVE_INFINITY;
1610
+ _.forIn(xs, (x, v) => {
1611
+ var halfWidth = width(g, v) / 2;
1612
+ max = Math.max(x + halfWidth, max);
1613
+ min = Math.min(x - halfWidth, min);
1614
+ });
1615
+ return max - min;
1616
+ });
1617
+ }
1618
+ function alignCoordinates(xss, alignTo) {
1619
+ var alignToVals = _.values(alignTo), alignToMin = _.min(alignToVals), alignToMax = _.max(alignToVals);
1620
+ _.forEach(["u", "d"], (vert) => {
1621
+ _.forEach(["l", "r"], (horiz) => {
1622
+ var alignment = vert + horiz, xs = xss[alignment], delta;
1623
+ if (xs === alignTo) return;
1624
+ var xsVals = _.values(xs);
1625
+ delta = horiz === "l" ? alignToMin - _.min(xsVals) : alignToMax - _.max(xsVals);
1626
+ if (delta) {
1627
+ xss[alignment] = _.mapValues(xs, (x) => x + delta);
1628
+ }
1629
+ });
1630
+ });
1631
+ }
1632
+ function balance(xss, align) {
1633
+ return _.mapValues(xss.ul, (_ignore, v) => {
1634
+ if (align) {
1635
+ return xss[align.toLowerCase()][v];
1636
+ } else {
1637
+ var xs = _.sortBy(_.map(xss, v));
1638
+ return (xs[1] + xs[2]) / 2;
1639
+ }
1640
+ });
1641
+ }
1642
+ function positionX(g) {
1643
+ var layering = buildLayerMatrix(g);
1644
+ var conflicts = _.merge(
1645
+ findType1Conflicts(g, layering),
1646
+ findType2Conflicts(g, layering)
1647
+ );
1648
+ var xss = {};
1649
+ var adjustedLayering;
1650
+ _.forEach(["u", "d"], (vert) => {
1651
+ adjustedLayering = vert === "u" ? layering : _.values(layering).reverse();
1652
+ _.forEach(["l", "r"], (horiz) => {
1653
+ if (horiz === "r") {
1654
+ adjustedLayering = _.map(
1655
+ adjustedLayering,
1656
+ (inner) => _.values(inner).reverse()
1657
+ );
1658
+ }
1659
+ var neighborFn = (vert === "u" ? g.predecessors : g.successors).bind(g);
1660
+ var align = verticalAlignment(g, adjustedLayering, conflicts, neighborFn);
1661
+ var xs = horizontalCompaction(
1662
+ g,
1663
+ adjustedLayering,
1664
+ align.root,
1665
+ align.align,
1666
+ horiz === "r"
1667
+ );
1668
+ if (horiz === "r") {
1669
+ xs = _.mapValues(xs, (x) => -x);
1670
+ }
1671
+ xss[vert + horiz] = xs;
1672
+ });
1673
+ });
1674
+ var smallestWidth = findSmallestWidthAlignment(g, xss);
1675
+ alignCoordinates(xss, smallestWidth);
1676
+ return balance(xss, g.graph().align);
1677
+ }
1678
+ function sep(nodeSep, edgeSep, reverseSep) {
1679
+ return (g, v, w) => {
1680
+ var vLabel = g.node(v);
1681
+ var wLabel = g.node(w);
1682
+ var sum = 0;
1683
+ var delta;
1684
+ sum += vLabel.width / 2;
1685
+ if (_.has(vLabel, "labelpos")) {
1686
+ switch (vLabel.labelpos.toLowerCase()) {
1687
+ case "l":
1688
+ delta = -vLabel.width / 2;
1689
+ break;
1690
+ case "r":
1691
+ delta = vLabel.width / 2;
1692
+ break;
1693
+ }
1694
+ }
1695
+ if (delta) {
1696
+ sum += reverseSep ? delta : -delta;
1697
+ }
1698
+ delta = 0;
1699
+ sum += (vLabel.dummy ? edgeSep : nodeSep) / 2;
1700
+ sum += (wLabel.dummy ? edgeSep : nodeSep) / 2;
1701
+ sum += wLabel.width / 2;
1702
+ if (_.has(wLabel, "labelpos")) {
1703
+ switch (wLabel.labelpos.toLowerCase()) {
1704
+ case "l":
1705
+ delta = wLabel.width / 2;
1706
+ break;
1707
+ case "r":
1708
+ delta = -wLabel.width / 2;
1709
+ break;
1710
+ }
1732
1711
  }
1712
+ if (delta) {
1713
+ sum += reverseSep ? delta : -delta;
1714
+ }
1715
+ delta = 0;
1716
+ return sum;
1717
+ };
1718
+ }
1719
+ function width(g, v) {
1720
+ return g.node(v).width;
1721
+ }
1722
+
1723
+ // src/dagre/position/index.js
1724
+ function position(g) {
1725
+ g = asNonCompoundGraph(g);
1726
+ positionY(g);
1727
+ _.forOwn(positionX(g), (x, v) => {
1728
+ g.node(v).x = x;
1733
1729
  });
1734
1730
  }
1735
- function findPath(g, postorderNums, v, w) {
1736
- var vPath = [];
1737
- var wPath = [];
1738
- var low = Math.min(postorderNums[v].low, postorderNums[w].low);
1739
- var lim = Math.max(postorderNums[v].lim, postorderNums[w].lim);
1740
- var parent;
1741
- var lca;
1742
- parent = v;
1743
- do {
1744
- parent = g.parent(parent);
1745
- vPath.push(parent);
1746
- } while (parent && (postorderNums[parent].low > low || lim > postorderNums[parent].lim));
1747
- lca = parent;
1748
- parent = w;
1749
- while ((parent = g.parent(parent)) !== lca) {
1750
- wPath.push(parent);
1751
- }
1752
- return { path: vPath.concat(wPath.reverse()), lca };
1731
+ function positionY(g) {
1732
+ var layering = buildLayerMatrix(g);
1733
+ var rankSep = g.graph().ranksep;
1734
+ var prevY = 0;
1735
+ _.forEach(layering, (layer) => {
1736
+ var maxHeight = _.max(_.map(layer, (v) => g.node(v).height));
1737
+ _.forEach(layer, (v) => {
1738
+ g.node(v).y = prevY + maxHeight / 2;
1739
+ });
1740
+ prevY += maxHeight + rankSep;
1741
+ });
1753
1742
  }
1754
- function postorder2(g) {
1755
- var result = {};
1756
- var lim = 0;
1743
+
1744
+ // src/dagre/rank/util.js
1745
+ function longestPath(g) {
1746
+ var visited = {};
1757
1747
  function dfs3(v) {
1758
- var low = lim;
1759
- _.forEach(g.children(v), dfs3);
1760
- result[v] = { low, lim: lim++ };
1748
+ var label = g.node(v);
1749
+ if (_.has(visited, v)) {
1750
+ return label.rank;
1751
+ }
1752
+ visited[v] = true;
1753
+ var rank2 = _.min(_.map(g.outEdges(v), (e) => dfs3(e.w) - g.edge(e).minlen));
1754
+ if (rank2 === Number.POSITIVE_INFINITY || // return value of _.map([]) for Lodash 3
1755
+ rank2 === void 0 || // return value of _.map([]) for Lodash 4
1756
+ rank2 === null) {
1757
+ rank2 = 0;
1758
+ }
1759
+ return label.rank = rank2;
1761
1760
  }
1762
- _.forEach(g.children(), dfs3);
1763
- return result;
1761
+ _.forEach(g.sources(), dfs3);
1762
+ }
1763
+ function slack(g, e) {
1764
+ return g.node(e.w).rank - g.node(e.v).rank - g.edge(e).minlen;
1764
1765
  }
1765
1766
 
1766
- // src/dagre/position/bk.js
1767
- function findType1Conflicts(g, layering) {
1768
- var conflicts = {};
1769
- function visitLayer(prevLayer, layer) {
1770
- var k0 = 0, scanPos = 0, prevLayerLength = prevLayer.length, lastNode = _.last(layer);
1771
- _.forEach(layer, function(v, i) {
1772
- var w = findOtherInnerSegmentNode(g, v), k1 = w ? g.node(w).order : prevLayerLength;
1773
- if (w || v === lastNode) {
1774
- _.forEach(layer.slice(scanPos, i + 1), function(scanNode) {
1775
- _.forEach(g.predecessors(scanNode), function(u) {
1776
- var uLabel = g.node(u), uPos = uLabel.order;
1777
- if ((uPos < k0 || k1 < uPos) && !(uLabel.dummy && g.node(scanNode).dummy)) {
1778
- addConflict(conflicts, u, scanNode);
1779
- }
1780
- });
1781
- });
1782
- scanPos = i + 1;
1783
- k0 = k1;
1784
- }
1785
- });
1786
- return layer;
1767
+ // src/dagre/rank/feasible-tree.js
1768
+ function feasibleTree(g) {
1769
+ var t = new Graph({ directed: false });
1770
+ var start = g.nodes()[0];
1771
+ var size = g.nodeCount();
1772
+ t.setNode(start, {});
1773
+ var edge, delta;
1774
+ while (tightTree(t, g) < size) {
1775
+ edge = findMinSlackEdge(t, g);
1776
+ delta = t.hasNode(edge.v) ? slack(g, edge) : -slack(g, edge);
1777
+ shiftRanks(t, g, delta);
1787
1778
  }
1788
- _.reduce(layering, visitLayer);
1789
- return conflicts;
1779
+ return t;
1790
1780
  }
1791
- function findType2Conflicts(g, layering) {
1792
- var conflicts = {};
1793
- function scan(south, southPos, southEnd, prevNorthBorder, nextNorthBorder) {
1794
- var v;
1795
- _.forEach(_.range(southPos, southEnd), function(i) {
1796
- v = south[i];
1797
- if (g.node(v).dummy) {
1798
- _.forEach(g.predecessors(v), function(u) {
1799
- var uNode = g.node(u);
1800
- if (uNode.dummy && (uNode.order < prevNorthBorder || uNode.order > nextNorthBorder)) {
1801
- addConflict(conflicts, u, v);
1802
- }
1803
- });
1781
+ function tightTree(t, g) {
1782
+ function dfs3(v) {
1783
+ _.forEach(g.nodeEdges(v), (e) => {
1784
+ var edgeV = e.v, w = v === edgeV ? e.w : edgeV;
1785
+ if (!t.hasNode(w) && !slack(g, e)) {
1786
+ t.setNode(w, {});
1787
+ t.setEdge(v, w, {});
1788
+ dfs3(w);
1804
1789
  }
1805
1790
  });
1806
1791
  }
1807
- function visitLayer(north, south) {
1808
- var prevNorthPos = -1, nextNorthPos, southPos = 0;
1809
- _.forEach(south, function(v, southLookahead) {
1810
- if (g.node(v).dummy === "border") {
1811
- var predecessors = g.predecessors(v);
1812
- if (predecessors.length) {
1813
- nextNorthPos = g.node(predecessors[0]).order;
1814
- scan(south, southPos, southLookahead, prevNorthPos, nextNorthPos);
1815
- southPos = southLookahead;
1816
- prevNorthPos = nextNorthPos;
1817
- }
1818
- }
1819
- scan(south, southPos, south.length, nextNorthPos, north.length);
1820
- });
1821
- return south;
1792
+ _.forEach(t.nodes(), dfs3);
1793
+ return t.nodeCount();
1794
+ }
1795
+ function findMinSlackEdge(t, g) {
1796
+ return _.minBy(g.edges(), (e) => {
1797
+ if (t.hasNode(e.v) !== t.hasNode(e.w)) {
1798
+ return slack(g, e);
1799
+ }
1800
+ });
1801
+ }
1802
+ function shiftRanks(t, g, delta) {
1803
+ _.forEach(t.nodes(), (v) => {
1804
+ g.node(v).rank += delta;
1805
+ });
1806
+ }
1807
+
1808
+ // src/graphlib/alg/dijkstra.js
1809
+ _.constant(1);
1810
+
1811
+ // src/graphlib/alg/floyd-warshall.js
1812
+ _.constant(1);
1813
+ function CycleException() {
1814
+ }
1815
+ CycleException.prototype = new Error();
1816
+
1817
+ // src/graphlib/alg/dfs.js
1818
+ function dfs2(g, vs, order2) {
1819
+ if (!_.isArray(vs)) {
1820
+ vs = [vs];
1822
1821
  }
1823
- _.reduce(layering, visitLayer);
1824
- return conflicts;
1822
+ var navigation = (g.isDirected() ? g.successors : g.neighbors).bind(g);
1823
+ var acc = [];
1824
+ var visited = {};
1825
+ _.each(vs, (v) => {
1826
+ if (!g.hasNode(v)) {
1827
+ throw new Error(`Graph does not have node: ${v}`);
1828
+ }
1829
+ doDfs(g, v, order2 === "post", visited, navigation, acc);
1830
+ });
1831
+ return acc;
1825
1832
  }
1826
- function findOtherInnerSegmentNode(g, v) {
1827
- if (g.node(v).dummy) {
1828
- return _.find(g.predecessors(v), function(u) {
1829
- return g.node(u).dummy;
1833
+ function doDfs(g, v, postorder3, visited, navigation, acc) {
1834
+ if (!_.has(visited, v)) {
1835
+ visited[v] = true;
1836
+ if (!postorder3) {
1837
+ acc.push(v);
1838
+ }
1839
+ _.each(navigation(v), (w) => {
1840
+ doDfs(g, w, postorder3, visited, navigation, acc);
1830
1841
  });
1842
+ if (postorder3) {
1843
+ acc.push(v);
1844
+ }
1831
1845
  }
1832
1846
  }
1833
- function addConflict(conflicts, v, w) {
1834
- if (v > w) {
1835
- var tmp = v;
1836
- v = w;
1837
- w = tmp;
1838
- }
1839
- var conflictsV = conflicts[v];
1840
- if (!conflictsV) {
1841
- conflicts[v] = conflictsV = {};
1842
- }
1843
- conflictsV[w] = true;
1847
+
1848
+ // src/graphlib/alg/postorder.js
1849
+ function postorder2(g, vs) {
1850
+ return dfs2(g, vs, "post");
1844
1851
  }
1845
- function hasConflict(conflicts, v, w) {
1846
- if (v > w) {
1847
- var tmp = v;
1848
- v = w;
1849
- w = tmp;
1852
+
1853
+ // src/graphlib/alg/preorder.js
1854
+ function preorder(g, vs) {
1855
+ return dfs2(g, vs, "pre");
1856
+ }
1857
+
1858
+ // src/dagre/rank/network-simplex.js
1859
+ networkSimplex.initLowLimValues = initLowLimValues;
1860
+ networkSimplex.initCutValues = initCutValues;
1861
+ networkSimplex.calcCutValue = calcCutValue;
1862
+ networkSimplex.leaveEdge = leaveEdge;
1863
+ networkSimplex.enterEdge = enterEdge;
1864
+ networkSimplex.exchangeEdges = exchangeEdges;
1865
+ function networkSimplex(g) {
1866
+ g = simplify(g);
1867
+ longestPath(g);
1868
+ var t = feasibleTree(g);
1869
+ initLowLimValues(t);
1870
+ initCutValues(t, g);
1871
+ var e, f;
1872
+ while (e = leaveEdge(t)) {
1873
+ f = enterEdge(t, g, e);
1874
+ exchangeEdges(t, g, e, f);
1850
1875
  }
1851
- return _.has(conflicts[v], w);
1852
1876
  }
1853
- function verticalAlignment(g, layering, conflicts, neighborFn) {
1854
- var root = {}, align = {}, pos = {};
1855
- _.forEach(layering, function(layer) {
1856
- _.forEach(layer, function(v, order2) {
1857
- root[v] = v;
1858
- align[v] = v;
1859
- pos[v] = order2;
1860
- });
1861
- });
1862
- _.forEach(layering, function(layer) {
1863
- var prevIdx = -1;
1864
- _.forEach(layer, function(v) {
1865
- var ws = neighborFn(v);
1866
- if (ws.length) {
1867
- ws = _.sortBy(ws, function(w2) {
1868
- return pos[w2];
1869
- });
1870
- var mp = (ws.length - 1) / 2;
1871
- for (var i = Math.floor(mp), il = Math.ceil(mp); i <= il; ++i) {
1872
- var w = ws[i];
1873
- if (align[v] === v && prevIdx < pos[w] && !hasConflict(conflicts, v, w)) {
1874
- align[w] = v;
1875
- align[v] = root[v] = root[w];
1876
- prevIdx = pos[w];
1877
- }
1878
- }
1879
- }
1880
- });
1877
+ function initCutValues(t, g) {
1878
+ var vs = postorder2(t, t.nodes());
1879
+ vs = vs.slice(0, vs.length - 1);
1880
+ _.forEach(vs, (v) => {
1881
+ assignCutValue(t, g, v);
1881
1882
  });
1882
- return { root, align };
1883
1883
  }
1884
- function horizontalCompaction(g, layering, root, align, reverseSep) {
1885
- var xs = {}, blockG = buildBlockGraph(g, layering, root, reverseSep), borderType = reverseSep ? "borderLeft" : "borderRight";
1886
- function iterate(setXsFunc, nextNodesFunc) {
1887
- var stack = blockG.nodes();
1888
- var elem = stack.pop();
1889
- var visited = {};
1890
- while (elem) {
1891
- if (visited[elem]) {
1892
- setXsFunc(elem);
1893
- } else {
1894
- visited[elem] = true;
1895
- stack.push(elem);
1896
- stack = stack.concat(nextNodesFunc(elem));
1884
+ function assignCutValue(t, g, child) {
1885
+ var childLab = t.node(child);
1886
+ var parent = childLab.parent;
1887
+ t.edge(child, parent).cutvalue = calcCutValue(t, g, child);
1888
+ }
1889
+ function calcCutValue(t, g, child) {
1890
+ var childLab = t.node(child);
1891
+ var parent = childLab.parent;
1892
+ var childIsTail = true;
1893
+ var graphEdge = g.edge(child, parent);
1894
+ var cutValue = 0;
1895
+ if (!graphEdge) {
1896
+ childIsTail = false;
1897
+ graphEdge = g.edge(parent, child);
1898
+ }
1899
+ cutValue = graphEdge.weight;
1900
+ _.forEach(g.nodeEdges(child), (e) => {
1901
+ var isOutEdge = e.v === child, other = isOutEdge ? e.w : e.v;
1902
+ if (other !== parent) {
1903
+ var pointsToHead = isOutEdge === childIsTail, otherWeight = g.edge(e).weight;
1904
+ cutValue += pointsToHead ? otherWeight : -otherWeight;
1905
+ if (isTreeEdge(t, child, other)) {
1906
+ var otherCutValue = t.edge(child, other).cutvalue;
1907
+ cutValue += pointsToHead ? -otherCutValue : otherCutValue;
1897
1908
  }
1898
- elem = stack.pop();
1899
1909
  }
1910
+ });
1911
+ return cutValue;
1912
+ }
1913
+ function initLowLimValues(tree, root) {
1914
+ if (arguments.length < 2) {
1915
+ root = tree.nodes()[0];
1900
1916
  }
1901
- function pass1(elem) {
1902
- xs[elem] = blockG.inEdges(elem).reduce(function(acc, e) {
1903
- return Math.max(acc, xs[e.v] + blockG.edge(e));
1904
- }, 0);
1905
- }
1906
- function pass2(elem) {
1907
- var min = blockG.outEdges(elem).reduce(function(acc, e) {
1908
- return Math.min(acc, xs[e.w] - blockG.edge(e));
1909
- }, Number.POSITIVE_INFINITY);
1910
- var node = g.node(elem);
1911
- if (min !== Number.POSITIVE_INFINITY && node.borderType !== borderType) {
1912
- xs[elem] = Math.max(xs[elem], min);
1917
+ dfsAssignLowLim(tree, {}, 1, root);
1918
+ }
1919
+ function dfsAssignLowLim(tree, visited, nextLim, v, parent) {
1920
+ var low = nextLim;
1921
+ var label = tree.node(v);
1922
+ visited[v] = true;
1923
+ _.forEach(tree.neighbors(v), (w) => {
1924
+ if (!_.has(visited, w)) {
1925
+ nextLim = dfsAssignLowLim(tree, visited, nextLim, w, v);
1913
1926
  }
1914
- }
1915
- iterate(pass1, blockG.predecessors.bind(blockG));
1916
- iterate(pass2, blockG.successors.bind(blockG));
1917
- _.forEach(align, function(v) {
1918
- xs[v] = xs[root[v]];
1919
1927
  });
1920
- return xs;
1928
+ label.low = low;
1929
+ label.lim = nextLim++;
1930
+ if (parent) {
1931
+ label.parent = parent;
1932
+ } else {
1933
+ delete label.parent;
1934
+ }
1935
+ return nextLim;
1921
1936
  }
1922
- function buildBlockGraph(g, layering, root, reverseSep) {
1923
- var blockGraph = new Graph(), graphLabel = g.graph(), sepFn = sep(graphLabel.nodesep, graphLabel.edgesep, reverseSep);
1924
- _.forEach(layering, function(layer) {
1925
- var u;
1926
- _.forEach(layer, function(v) {
1927
- var vRoot = root[v];
1928
- blockGraph.setNode(vRoot);
1929
- if (u) {
1930
- var uRoot = root[u], prevMax = blockGraph.edge(uRoot, vRoot);
1931
- blockGraph.setEdge(uRoot, vRoot, Math.max(sepFn(g, v, u), prevMax || 0));
1932
- }
1933
- u = v;
1934
- });
1935
- });
1936
- return blockGraph;
1937
+ function leaveEdge(tree) {
1938
+ return _.find(tree.edges(), (e) => tree.edge(e).cutvalue < 0);
1937
1939
  }
1938
- function findSmallestWidthAlignment(g, xss) {
1939
- return _.minBy(_.values(xss), function(xs) {
1940
- var max = Number.NEGATIVE_INFINITY;
1941
- var min = Number.POSITIVE_INFINITY;
1942
- _.forIn(xs, function(x, v) {
1943
- var halfWidth = width(g, v) / 2;
1944
- max = Math.max(x + halfWidth, max);
1945
- min = Math.min(x - halfWidth, min);
1946
- });
1947
- return max - min;
1948
- });
1940
+ function enterEdge(t, g, edge) {
1941
+ var v = edge.v;
1942
+ var w = edge.w;
1943
+ if (!g.hasEdge(v, w)) {
1944
+ v = edge.w;
1945
+ w = edge.v;
1946
+ }
1947
+ var vLabel = t.node(v);
1948
+ var wLabel = t.node(w);
1949
+ var tailLabel = vLabel;
1950
+ var flip = false;
1951
+ if (vLabel.lim > wLabel.lim) {
1952
+ tailLabel = wLabel;
1953
+ flip = true;
1954
+ }
1955
+ var candidates = _.filter(
1956
+ g.edges(),
1957
+ (edge2) => flip === isDescendant(t, t.node(edge2.v), tailLabel) && flip !== isDescendant(t, t.node(edge2.w), tailLabel)
1958
+ );
1959
+ return _.minBy(candidates, (edge2) => slack(g, edge2));
1949
1960
  }
1950
- function alignCoordinates(xss, alignTo) {
1951
- var alignToVals = _.values(alignTo), alignToMin = _.min(alignToVals), alignToMax = _.max(alignToVals);
1952
- _.forEach(["u", "d"], function(vert) {
1953
- _.forEach(["l", "r"], function(horiz) {
1954
- var alignment = vert + horiz, xs = xss[alignment], delta;
1955
- if (xs === alignTo) return;
1956
- var xsVals = _.values(xs);
1957
- delta = horiz === "l" ? alignToMin - _.min(xsVals) : alignToMax - _.max(xsVals);
1958
- if (delta) {
1959
- xss[alignment] = _.mapValues(xs, function(x) {
1960
- return x + delta;
1961
- });
1962
- }
1963
- });
1964
- });
1961
+ function exchangeEdges(t, g, e, f) {
1962
+ var v = e.v;
1963
+ var w = e.w;
1964
+ t.removeEdge(v, w);
1965
+ t.setEdge(f.v, f.w, {});
1966
+ initLowLimValues(t);
1967
+ initCutValues(t, g);
1968
+ updateRanks(t, g);
1965
1969
  }
1966
- function balance(xss, align) {
1967
- return _.mapValues(xss.ul, function(ignore, v) {
1968
- if (align) {
1969
- return xss[align.toLowerCase()][v];
1970
- } else {
1971
- var xs = _.sortBy(_.map(xss, v));
1972
- return (xs[1] + xs[2]) / 2;
1970
+ function updateRanks(t, g) {
1971
+ var root = _.find(t.nodes(), (v) => !g.node(v).parent);
1972
+ var vs = preorder(t, root);
1973
+ vs = vs.slice(1);
1974
+ _.forEach(vs, (v) => {
1975
+ var parent = t.node(v).parent, edge = g.edge(v, parent), flipped = false;
1976
+ if (!edge) {
1977
+ edge = g.edge(parent, v);
1978
+ flipped = true;
1973
1979
  }
1980
+ g.node(v).rank = g.node(parent).rank + (flipped ? edge.minlen : -edge.minlen);
1974
1981
  });
1975
1982
  }
1976
- function positionX(g) {
1977
- var layering = buildLayerMatrix(g);
1978
- var conflicts = _.merge(findType1Conflicts(g, layering), findType2Conflicts(g, layering));
1979
- var xss = {};
1980
- var adjustedLayering;
1981
- _.forEach(["u", "d"], function(vert) {
1982
- adjustedLayering = vert === "u" ? layering : _.values(layering).reverse();
1983
- _.forEach(["l", "r"], function(horiz) {
1984
- if (horiz === "r") {
1985
- adjustedLayering = _.map(adjustedLayering, function(inner) {
1986
- return _.values(inner).reverse();
1987
- });
1988
- }
1989
- var neighborFn = (vert === "u" ? g.predecessors : g.successors).bind(g);
1990
- var align = verticalAlignment(g, adjustedLayering, conflicts, neighborFn);
1991
- var xs = horizontalCompaction(g, adjustedLayering, align.root, align.align, horiz === "r");
1992
- if (horiz === "r") {
1993
- xs = _.mapValues(xs, function(x) {
1994
- return -x;
1995
- });
1996
- }
1997
- xss[vert + horiz] = xs;
1998
- });
1999
- });
2000
- var smallestWidth = findSmallestWidthAlignment(g, xss);
2001
- alignCoordinates(xss, smallestWidth);
2002
- return balance(xss, g.graph().align);
2003
- }
2004
- function sep(nodeSep, edgeSep, reverseSep) {
2005
- return function(g, v, w) {
2006
- var vLabel = g.node(v);
2007
- var wLabel = g.node(w);
2008
- var sum = 0;
2009
- var delta;
2010
- sum += vLabel.width / 2;
2011
- if (_.has(vLabel, "labelpos")) {
2012
- switch (vLabel.labelpos.toLowerCase()) {
2013
- case "l":
2014
- delta = -vLabel.width / 2;
2015
- break;
2016
- case "r":
2017
- delta = vLabel.width / 2;
2018
- break;
2019
- }
2020
- }
2021
- if (delta) {
2022
- sum += reverseSep ? delta : -delta;
2023
- }
2024
- delta = 0;
2025
- sum += (vLabel.dummy ? edgeSep : nodeSep) / 2;
2026
- sum += (wLabel.dummy ? edgeSep : nodeSep) / 2;
2027
- sum += wLabel.width / 2;
2028
- if (_.has(wLabel, "labelpos")) {
2029
- switch (wLabel.labelpos.toLowerCase()) {
2030
- case "l":
2031
- delta = wLabel.width / 2;
2032
- break;
2033
- case "r":
2034
- delta = -wLabel.width / 2;
2035
- break;
2036
- }
2037
- }
2038
- if (delta) {
2039
- sum += reverseSep ? delta : -delta;
2040
- }
2041
- delta = 0;
2042
- return sum;
2043
- };
1983
+ function isTreeEdge(tree, u, v) {
1984
+ return tree.hasEdge(u, v);
2044
1985
  }
2045
- function width(g, v) {
2046
- return g.node(v).width;
1986
+ function isDescendant(_tree, vLabel, rootLabel) {
1987
+ return rootLabel.low <= vLabel.lim && vLabel.lim <= rootLabel.lim;
2047
1988
  }
2048
1989
 
2049
- // src/dagre/position/index.js
2050
- function position(g) {
2051
- g = asNonCompoundGraph(g);
2052
- positionY(g);
2053
- _.forOwn(positionX(g), function(x, v) {
2054
- g.node(v).x = x;
2055
- });
1990
+ // src/dagre/rank/index.js
1991
+ function rank(g) {
1992
+ switch (g.graph().ranker) {
1993
+ case "network-simplex":
1994
+ networkSimplexRanker(g);
1995
+ break;
1996
+ case "tight-tree":
1997
+ tightTreeRanker(g);
1998
+ break;
1999
+ case "longest-path":
2000
+ longestPathRanker(g);
2001
+ break;
2002
+ default:
2003
+ networkSimplexRanker(g);
2004
+ }
2056
2005
  }
2057
- function positionY(g) {
2058
- var layering = buildLayerMatrix(g);
2059
- var rankSep = g.graph().ranksep;
2060
- var prevY = 0;
2061
- _.forEach(layering, function(layer) {
2062
- var maxHeight = _.max(
2063
- _.map(layer, function(v) {
2064
- return g.node(v).height;
2065
- })
2066
- );
2067
- _.forEach(layer, function(v) {
2068
- g.node(v).y = prevY + maxHeight / 2;
2069
- });
2070
- prevY += maxHeight + rankSep;
2071
- });
2006
+ var longestPathRanker = longestPath;
2007
+ function tightTreeRanker(g) {
2008
+ longestPath(g);
2009
+ feasibleTree(g);
2010
+ }
2011
+ function networkSimplexRanker(g) {
2012
+ networkSimplex(g);
2072
2013
  }
2073
2014
 
2074
2015
  // src/dagre/layout.js
2075
2016
  function layout(g, opts) {
2076
- var time2 = opts && opts.debugTiming ? time : notime;
2077
- time2("layout", function() {
2078
- var layoutGraph = time2(" buildLayoutGraph", function() {
2079
- return buildLayoutGraph(g);
2080
- });
2081
- time2(" runLayout", function() {
2017
+ var time2 = opts?.debugTiming ? time : notime;
2018
+ time2("layout", () => {
2019
+ var layoutGraph = time2(" buildLayoutGraph", () => buildLayoutGraph(g));
2020
+ time2(" runLayout", () => {
2082
2021
  runLayout(layoutGraph, time2);
2083
2022
  });
2084
- time2(" updateInputGraph", function() {
2023
+ time2(" updateInputGraph", () => {
2085
2024
  updateInputGraph(g, layoutGraph);
2086
2025
  });
2087
2026
  });
2088
2027
  }
2089
2028
  function runLayout(g, time2) {
2090
- time2(" makeSpaceForEdgeLabels", function() {
2029
+ time2(" makeSpaceForEdgeLabels", () => {
2091
2030
  makeSpaceForEdgeLabels(g);
2092
2031
  });
2093
- time2(" removeSelfEdges", function() {
2032
+ time2(" removeSelfEdges", () => {
2094
2033
  removeSelfEdges(g);
2095
2034
  });
2096
- time2(" acyclic", function() {
2035
+ time2(" acyclic", () => {
2097
2036
  run(g);
2098
2037
  });
2099
- time2(" nestingGraph.run", function() {
2100
- run3(g);
2038
+ time2(" nestingGraph.run", () => {
2039
+ run2(g);
2101
2040
  });
2102
- time2(" rank", function() {
2041
+ time2(" rank", () => {
2103
2042
  rank(asNonCompoundGraph(g));
2104
2043
  });
2105
- time2(" injectEdgeLabelProxies", function() {
2044
+ time2(" injectEdgeLabelProxies", () => {
2106
2045
  injectEdgeLabelProxies(g);
2107
2046
  });
2108
- time2(" removeEmptyRanks", function() {
2047
+ time2(" removeEmptyRanks", () => {
2109
2048
  removeEmptyRanks(g);
2110
2049
  });
2111
- time2(" nestingGraph.cleanup", function() {
2050
+ time2(" nestingGraph.cleanup", () => {
2112
2051
  cleanup(g);
2113
2052
  });
2114
- time2(" normalizeRanks", function() {
2053
+ time2(" normalizeRanks", () => {
2115
2054
  normalizeRanks(g);
2116
2055
  });
2117
- time2(" assignRankMinMax", function() {
2056
+ time2(" assignRankMinMax", () => {
2118
2057
  assignRankMinMax(g);
2119
2058
  });
2120
- time2(" removeEdgeLabelProxies", function() {
2059
+ time2(" removeEdgeLabelProxies", () => {
2121
2060
  removeEdgeLabelProxies(g);
2122
2061
  });
2123
- time2(" normalize.run", function() {
2124
- run2(g);
2062
+ time2(" normalize.run", () => {
2063
+ run3(g);
2125
2064
  });
2126
- time2(" parentDummyChains", function() {
2065
+ time2(" parentDummyChains", () => {
2127
2066
  parentDummyChains(g);
2128
2067
  });
2129
- time2(" addBorderSegments", function() {
2068
+ time2(" addBorderSegments", () => {
2130
2069
  addBorderSegments(g);
2131
2070
  });
2132
- time2(" order", function() {
2071
+ time2(" order", () => {
2133
2072
  order(g);
2134
2073
  });
2135
- time2(" insertSelfEdges", function() {
2074
+ time2(" insertSelfEdges", () => {
2136
2075
  insertSelfEdges(g);
2137
2076
  });
2138
- time2(" adjustCoordinateSystem", function() {
2077
+ time2(" adjustCoordinateSystem", () => {
2139
2078
  adjust(g);
2140
2079
  });
2141
- time2(" position", function() {
2080
+ time2(" position", () => {
2142
2081
  position(g);
2143
2082
  });
2144
- time2(" positionSelfEdges", function() {
2083
+ time2(" positionSelfEdges", () => {
2145
2084
  positionSelfEdges(g);
2146
2085
  });
2147
- time2(" removeBorderNodes", function() {
2086
+ time2(" removeBorderNodes", () => {
2148
2087
  removeBorderNodes(g);
2149
2088
  });
2150
- time2(" normalize.undo", function() {
2089
+ time2(" normalize.undo", () => {
2151
2090
  undo3(g);
2152
2091
  });
2153
- time2(" fixupEdgeLabelCoords", function() {
2092
+ time2(" fixupEdgeLabelCoords", () => {
2154
2093
  fixupEdgeLabelCoords(g);
2155
2094
  });
2156
- time2(" undoCoordinateSystem", function() {
2157
- undo(g);
2095
+ time2(" undoCoordinateSystem", () => {
2096
+ undo2(g);
2158
2097
  });
2159
- time2(" translateGraph", function() {
2098
+ time2(" translateGraph", () => {
2160
2099
  translateGraph(g);
2161
2100
  });
2162
- time2(" assignNodeIntersects", function() {
2101
+ time2(" assignNodeIntersects", () => {
2163
2102
  assignNodeIntersects(g);
2164
2103
  });
2165
- time2(" reversePoints", function() {
2104
+ time2(" reversePoints", () => {
2166
2105
  reversePointsForReversedEdges(g);
2167
2106
  });
2168
- time2(" acyclic.undo", function() {
2169
- undo2(g);
2107
+ time2(" acyclic.undo", () => {
2108
+ undo(g);
2170
2109
  });
2171
2110
  }
2172
2111
  function updateInputGraph(inputGraph, layoutGraph) {
2173
- _.forEach(inputGraph.nodes(), function(v) {
2112
+ _.forEach(inputGraph.nodes(), (v) => {
2174
2113
  var inputLabel = inputGraph.node(v);
2175
2114
  var layoutLabel = layoutGraph.node(v);
2176
2115
  if (inputLabel) {
@@ -2182,7 +2121,7 @@ function updateInputGraph(inputGraph, layoutGraph) {
2182
2121
  }
2183
2122
  }
2184
2123
  });
2185
- _.forEach(inputGraph.edges(), function(e) {
2124
+ _.forEach(inputGraph.edges(), (e) => {
2186
2125
  var inputLabel = inputGraph.edge(e);
2187
2126
  var layoutLabel = layoutGraph.edge(e);
2188
2127
  inputLabel.points = layoutLabel.points;
@@ -2213,18 +2152,31 @@ function buildLayoutGraph(inputGraph) {
2213
2152
  var g = new Graph({ multigraph: true, compound: true });
2214
2153
  var graph = canonicalize(inputGraph.graph());
2215
2154
  g.setGraph(
2216
- _.merge({}, graphDefaults, selectNumberAttrs(graph, graphNumAttrs), _.pick(graph, graphAttrs))
2155
+ _.merge(
2156
+ {},
2157
+ graphDefaults,
2158
+ selectNumberAttrs(graph, graphNumAttrs),
2159
+ _.pick(graph, graphAttrs)
2160
+ )
2217
2161
  );
2218
- _.forEach(inputGraph.nodes(), function(v) {
2162
+ _.forEach(inputGraph.nodes(), (v) => {
2219
2163
  var node = canonicalize(inputGraph.node(v));
2220
- g.setNode(v, _.defaults(selectNumberAttrs(node, nodeNumAttrs), nodeDefaults));
2164
+ g.setNode(
2165
+ v,
2166
+ _.defaults(selectNumberAttrs(node, nodeNumAttrs), nodeDefaults)
2167
+ );
2221
2168
  g.setParent(v, inputGraph.parent(v));
2222
2169
  });
2223
- _.forEach(inputGraph.edges(), function(e) {
2170
+ _.forEach(inputGraph.edges(), (e) => {
2224
2171
  var edge = canonicalize(inputGraph.edge(e));
2225
2172
  g.setEdge(
2226
2173
  e,
2227
- _.merge({}, edgeDefaults, selectNumberAttrs(edge, edgeNumAttrs), _.pick(edge, edgeAttrs))
2174
+ _.merge(
2175
+ {},
2176
+ edgeDefaults,
2177
+ selectNumberAttrs(edge, edgeNumAttrs),
2178
+ _.pick(edge, edgeAttrs)
2179
+ )
2228
2180
  );
2229
2181
  });
2230
2182
  return g;
@@ -2232,7 +2184,7 @@ function buildLayoutGraph(inputGraph) {
2232
2184
  function makeSpaceForEdgeLabels(g) {
2233
2185
  var graph = g.graph();
2234
2186
  graph.ranksep /= 2;
2235
- _.forEach(g.edges(), function(e) {
2187
+ _.forEach(g.edges(), (e) => {
2236
2188
  var edge = g.edge(e);
2237
2189
  edge.minlen *= 2;
2238
2190
  if (edge.labelpos.toLowerCase() !== "c") {
@@ -2245,7 +2197,7 @@ function makeSpaceForEdgeLabels(g) {
2245
2197
  });
2246
2198
  }
2247
2199
  function injectEdgeLabelProxies(g) {
2248
- _.forEach(g.edges(), function(e) {
2200
+ _.forEach(g.edges(), (e) => {
2249
2201
  var edge = g.edge(e);
2250
2202
  if (edge.width && edge.height) {
2251
2203
  var v = g.node(e.v);
@@ -2257,7 +2209,7 @@ function injectEdgeLabelProxies(g) {
2257
2209
  }
2258
2210
  function assignRankMinMax(g) {
2259
2211
  var maxRank2 = 0;
2260
- _.forEach(g.nodes(), function(v) {
2212
+ _.forEach(g.nodes(), (v) => {
2261
2213
  var node = g.node(v);
2262
2214
  if (node.borderTop) {
2263
2215
  node.minRank = g.node(node.borderTop).rank;
@@ -2268,7 +2220,7 @@ function assignRankMinMax(g) {
2268
2220
  g.graph().maxRank = maxRank2;
2269
2221
  }
2270
2222
  function removeEdgeLabelProxies(g) {
2271
- _.forEach(g.nodes(), function(v) {
2223
+ _.forEach(g.nodes(), (v) => {
2272
2224
  var node = g.node(v);
2273
2225
  if (node.dummy === "edge-proxy") {
2274
2226
  g.edge(node.e).labelRank = node.rank;
@@ -2294,10 +2246,10 @@ function translateGraph(g) {
2294
2246
  minY = Math.min(minY, y - h / 2);
2295
2247
  maxY = Math.max(maxY, y + h / 2);
2296
2248
  }
2297
- _.forEach(g.nodes(), function(v) {
2249
+ _.forEach(g.nodes(), (v) => {
2298
2250
  getExtremes(g.node(v));
2299
2251
  });
2300
- _.forEach(g.edges(), function(e) {
2252
+ _.forEach(g.edges(), (e) => {
2301
2253
  var edge = g.edge(e);
2302
2254
  if (_.has(edge, "x")) {
2303
2255
  getExtremes(edge);
@@ -2305,14 +2257,14 @@ function translateGraph(g) {
2305
2257
  });
2306
2258
  minX -= marginX;
2307
2259
  minY -= marginY;
2308
- _.forEach(g.nodes(), function(v) {
2260
+ _.forEach(g.nodes(), (v) => {
2309
2261
  var node = g.node(v);
2310
2262
  node.x -= minX;
2311
2263
  node.y -= minY;
2312
2264
  });
2313
- _.forEach(g.edges(), function(e) {
2265
+ _.forEach(g.edges(), (e) => {
2314
2266
  var edge = g.edge(e);
2315
- _.forEach(edge.points, function(p) {
2267
+ _.forEach(edge.points, (p) => {
2316
2268
  p.x -= minX;
2317
2269
  p.y -= minY;
2318
2270
  });
@@ -2327,7 +2279,7 @@ function translateGraph(g) {
2327
2279
  graphLabel.height = maxY - minY + marginY;
2328
2280
  }
2329
2281
  function assignNodeIntersects(g) {
2330
- _.forEach(g.edges(), function(e) {
2282
+ _.forEach(g.edges(), (e) => {
2331
2283
  var edge = g.edge(e);
2332
2284
  var nodeV = g.node(e.v);
2333
2285
  var nodeW = g.node(e.w);
@@ -2345,7 +2297,7 @@ function assignNodeIntersects(g) {
2345
2297
  });
2346
2298
  }
2347
2299
  function fixupEdgeLabelCoords(g) {
2348
- _.forEach(g.edges(), function(e) {
2300
+ _.forEach(g.edges(), (e) => {
2349
2301
  var edge = g.edge(e);
2350
2302
  if (_.has(edge, "x")) {
2351
2303
  if (edge.labelpos === "l" || edge.labelpos === "r") {
@@ -2363,7 +2315,7 @@ function fixupEdgeLabelCoords(g) {
2363
2315
  });
2364
2316
  }
2365
2317
  function reversePointsForReversedEdges(g) {
2366
- _.forEach(g.edges(), function(e) {
2318
+ _.forEach(g.edges(), (e) => {
2367
2319
  var edge = g.edge(e);
2368
2320
  if (edge.reversed) {
2369
2321
  edge.points.reverse();
@@ -2371,7 +2323,7 @@ function reversePointsForReversedEdges(g) {
2371
2323
  });
2372
2324
  }
2373
2325
  function removeBorderNodes(g) {
2374
- _.forEach(g.nodes(), function(v) {
2326
+ _.forEach(g.nodes(), (v) => {
2375
2327
  if (g.children(v).length) {
2376
2328
  var node = g.node(v);
2377
2329
  var t = g.node(node.borderTop);
@@ -2384,14 +2336,14 @@ function removeBorderNodes(g) {
2384
2336
  node.y = t.y + node.height / 2;
2385
2337
  }
2386
2338
  });
2387
- _.forEach(g.nodes(), function(v) {
2339
+ _.forEach(g.nodes(), (v) => {
2388
2340
  if (g.node(v).dummy === "border") {
2389
2341
  g.removeNode(v);
2390
2342
  }
2391
2343
  });
2392
2344
  }
2393
2345
  function removeSelfEdges(g) {
2394
- _.forEach(g.edges(), function(e) {
2346
+ _.forEach(g.edges(), (e) => {
2395
2347
  if (e.v === e.w) {
2396
2348
  var node = g.node(e.v);
2397
2349
  if (!node.selfEdges) {
@@ -2404,12 +2356,12 @@ function removeSelfEdges(g) {
2404
2356
  }
2405
2357
  function insertSelfEdges(g) {
2406
2358
  var layers = buildLayerMatrix(g);
2407
- _.forEach(layers, function(layer) {
2359
+ _.forEach(layers, (layer) => {
2408
2360
  var orderShift = 0;
2409
- _.forEach(layer, function(v, i) {
2361
+ _.forEach(layer, (v, i) => {
2410
2362
  var node = g.node(v);
2411
2363
  node.order = i + orderShift;
2412
- _.forEach(node.selfEdges, function(selfEdge) {
2364
+ _.forEach(node.selfEdges, (selfEdge) => {
2413
2365
  addDummyNode(
2414
2366
  g,
2415
2367
  "selfedge",
@@ -2429,7 +2381,7 @@ function insertSelfEdges(g) {
2429
2381
  });
2430
2382
  }
2431
2383
  function positionSelfEdges(g) {
2432
- _.forEach(g.nodes(), function(v) {
2384
+ _.forEach(g.nodes(), (v) => {
2433
2385
  var node = g.node(v);
2434
2386
  if (node.dummy === "selfedge") {
2435
2387
  var selfNode = g.node(node.e.v);
@@ -2456,7 +2408,7 @@ function selectNumberAttrs(obj, attrs) {
2456
2408
  }
2457
2409
  function canonicalize(attrs) {
2458
2410
  var newAttrs = {};
2459
- _.forEach(attrs, function(v, k) {
2411
+ _.forEach(attrs, (v, k) => {
2460
2412
  newAttrs[k.toLowerCase()] = v;
2461
2413
  });
2462
2414
  return newAttrs;
@@ -2475,7 +2427,7 @@ function buildFlatCharts({
2475
2427
  vertical = false,
2476
2428
  direction
2477
2429
  }) {
2478
- let prevLodash = getLodash();
2430
+ const prevLodash = getLodash();
2479
2431
  try {
2480
2432
  setLodash(lodash);
2481
2433
  const rankdir = direction || (vertical ? "tb" : "lr");
@@ -2697,7 +2649,7 @@ function getGraphParamsProvider({
2697
2649
  transitionsFontSize = fontSize,
2698
2650
  transitionsTextPadding = 0,
2699
2651
  getStateLabel = (state) => state,
2700
- getTransitionLabel = (fromState, event, toState) => event
2652
+ getTransitionLabel = (_fromState, event, _toState) => event
2701
2653
  } = {}) {
2702
2654
  return {
2703
2655
  getStateParams: (stateKey, state = stateKey) => {