@dagrejs/dagre 1.1.8 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/dagre.cjs.js +3 -0
  2. package/{index.js → dist/dagre.cjs.js.LEGAL.txt} +2 -12
  3. package/dist/dagre.cjs.js.map +7 -0
  4. package/dist/dagre.esm.js +3 -0
  5. package/dist/dagre.esm.js.LEGAL.txt +23 -0
  6. package/dist/dagre.esm.js.map +7 -0
  7. package/dist/dagre.js +3384 -4303
  8. package/dist/dagre.js.LEGAL.txt +23 -0
  9. package/dist/dagre.js.map +7 -0
  10. package/dist/dagre.min.js +3 -815
  11. package/dist/dagre.min.js.LEGAL.txt +23 -0
  12. package/dist/dagre.min.js.map +7 -0
  13. package/package.json +18 -23
  14. package/index.d.ts +0 -147
  15. package/lib/acyclic.js +0 -67
  16. package/lib/add-border-segments.js +0 -37
  17. package/lib/coordinate-system.js +0 -70
  18. package/lib/data/list.js +0 -58
  19. package/lib/debug.js +0 -31
  20. package/lib/greedy-fas.js +0 -124
  21. package/lib/layout.js +0 -405
  22. package/lib/nesting-graph.js +0 -126
  23. package/lib/normalize.js +0 -89
  24. package/lib/order/add-subgraph-constraints.js +0 -51
  25. package/lib/order/barycenter.js +0 -26
  26. package/lib/order/build-layer-graph.js +0 -79
  27. package/lib/order/cross-count.js +0 -66
  28. package/lib/order/index.js +0 -111
  29. package/lib/order/init-order.js +0 -37
  30. package/lib/order/resolve-conflicts.js +0 -118
  31. package/lib/order/sort-subgraph.js +0 -73
  32. package/lib/order/sort.js +0 -56
  33. package/lib/parent-dummy-chains.js +0 -84
  34. package/lib/position/bk.js +0 -424
  35. package/lib/position/index.js +0 -32
  36. package/lib/rank/feasible-tree.js +0 -95
  37. package/lib/rank/index.js +0 -54
  38. package/lib/rank/network-simplex.js +0 -235
  39. package/lib/rank/util.js +0 -67
  40. package/lib/util.js +0 -331
  41. package/lib/version.js +0 -1
package/index.d.ts DELETED
@@ -1,147 +0,0 @@
1
- // Type definitions for dagre 1.0.1
2
- // Project: https://github.com/dagrejs/dagre
3
- // Definitions by: Qinfeng Chen <https://github.com/qinfchen>
4
- // Pete Vilter <https://github.com/vilterp>
5
- // David Newell <https://github.com/rustedgrail>
6
- // Graham Lea <https://github.com/GrahamLea>
7
- // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
8
-
9
- declare module '@dagrejs/dagre' {
10
- export namespace graphlib {
11
- class Graph<T = {}> {
12
- constructor(opt?: { directed?: boolean | undefined; multigraph?: boolean | undefined; compound?: boolean | undefined });
13
-
14
- graph(): GraphLabel;
15
- isDirected(): boolean;
16
- isMultigraph(): boolean;
17
- setGraph(label: GraphLabel): Graph<T>;
18
-
19
- edge(edgeObj: Edge): GraphEdge;
20
- edge(outNodeName: string, inNodeName: string, name?: string): GraphEdge;
21
- edgeCount(): number;
22
- edges(): Edge[];
23
- hasEdge(edgeObj: Edge): boolean;
24
- hasEdge(outNodeName: string, inNodeName: string, name?: string): boolean;
25
- inEdges(inNodeName: string, outNodeName?: string): Edge[] | undefined;
26
- outEdges(outNodeName: string, inNodeName?: string): Edge[] | undefined;
27
- removeEdge(outNodeName: string, inNodeName: string, name?: string): Graph<T>;
28
- setDefaultEdgeLabel(callback: string | ((v: string, w: string, name?: string) => string | Label)): Graph<T>;
29
- setEdge(params: Edge, value?: string | { [key: string]: any }): Graph<T>;
30
- setEdge(sourceId: string, targetId: string, value?: string | Label, name?: string): Graph<T>;
31
-
32
- children(parentName: string): string[];
33
- hasNode(name: string): boolean;
34
- neighbors(name: string): string[] | undefined;
35
- node(id: string | Label): Node<T>;
36
- nodeCount(): number;
37
- nodes(): string[];
38
- parent(childName: string): string | undefined;
39
- predecessors(name: string): string[] | undefined;
40
- removeNode(name: string): Graph<T>;
41
- filterNodes(callback: (nodeId: string) => boolean): Graph<T>;
42
- setDefaultNodeLabel(callback: string | ((nodeId: string) => string | Label)): Graph<T>;
43
- setNode(name: string, label: string | Label): Graph<T>;
44
- setParent(childName: string, parentName: string): void;
45
- sinks(): Array<Node<T>>;
46
- sources(): Array<Node<T>>;
47
- successors(name: string): string[] | undefined;
48
- }
49
-
50
- namespace json {
51
- function read(graph: any): Graph;
52
- function write(graph: Graph): any;
53
- }
54
-
55
- namespace alg {
56
- function components(graph: Graph): string[][];
57
- function dijkstra(graph: Graph, source: string, weightFn?: WeightFn, edgeFn?: EdgeFn): any;
58
- function dijkstraAll(graph: Graph, weightFn?: WeightFn, edgeFn?: EdgeFn): any;
59
- function findCycles(graph: Graph): string[][];
60
- function floydWarshall(graph: Graph, weightFn?: WeightFn, edgeFn?: EdgeFn): any;
61
- function isAcyclic(graph: Graph): boolean;
62
- function postorder(graph: Graph, nodeNames: string | string[]): string[];
63
- function preorder(graph: Graph, nodeNames: string | string[]): string[];
64
- function prim<T>(graph: Graph<T>, weightFn?: WeightFn): Graph<T>;
65
- function tarjam(graph: Graph): string[][];
66
- function topsort(graph: Graph): string[];
67
- }
68
- }
69
-
70
- export interface Label {
71
- label?: string;
72
- width?: number;
73
- height?: number;
74
- minRank?: number;
75
- maxRank?: number;
76
- borderLeft?: string[];
77
- borderRight?: string[];
78
- [key: string]: any;
79
- }
80
- export type WeightFn = (edge: Edge) => number;
81
- export type EdgeFn = (outNodeName: string) => GraphEdge[];
82
-
83
- export interface GraphLabel {
84
- width?: number | undefined;
85
- height?: number | undefined;
86
- compound?: boolean | undefined;
87
- rankdir?: string | undefined;
88
- align?: string | undefined;
89
- nodesep?: number | undefined;
90
- edgesep?: number | undefined;
91
- ranksep?: number | undefined;
92
- marginx?: number | undefined;
93
- marginy?: number | undefined;
94
- acyclicer?: string | undefined;
95
- ranker?: string | undefined;
96
- }
97
-
98
- export interface NodeConfig {
99
- width?: number | undefined;
100
- height?: number | undefined;
101
- }
102
-
103
- export interface EdgeConfig {
104
- minlen?: number | undefined;
105
- weight?: number | undefined;
106
- width?: number | undefined;
107
- height?: number | undefined;
108
- labelpos?: 'l' | 'c' | 'r' | undefined;
109
- labeloffest?: number | undefined;
110
- }
111
-
112
- export interface LayoutConfig {
113
- customOrder?: (graph: graphlib.Graph, order: (graph: graphlib.Graph, opts: configUnion) => void) => void;
114
- disableOptimalOrderHeuristic?: boolean;
115
- }
116
-
117
- type configUnion = GraphLabel & NodeConfig & EdgeConfig & LayoutConfig;
118
-
119
- export function layout(graph: graphlib.Graph, layout?: configUnion): void;
120
-
121
- export interface Edge {
122
- v: string;
123
- w: string;
124
- name?: string | undefined;
125
- }
126
-
127
- export interface GraphEdge {
128
- points: Array<{ x: number; y: number }>;
129
- [key: string]: any;
130
- }
131
-
132
- export type Node<T = {}> = T & {
133
- x: number;
134
- y: number;
135
- width: number;
136
- height: number;
137
- class?: string | undefined;
138
- label?: string | undefined;
139
- padding?: number | undefined;
140
- paddingX?: number | undefined;
141
- paddingY?: number | undefined;
142
- rank?: number | undefined;
143
- rx?: number | undefined;
144
- ry?: number | undefined;
145
- shape?: string | undefined;
146
- };
147
- }
package/lib/acyclic.js DELETED
@@ -1,67 +0,0 @@
1
- "use strict";
2
-
3
- let greedyFAS = require("./greedy-fas");
4
- let uniqueId = require("./util").uniqueId;
5
-
6
- module.exports = {
7
- run: run,
8
- undo: undo
9
- };
10
-
11
- function run(g) {
12
- let fas = (g.graph().acyclicer === "greedy"
13
- ? greedyFAS(g, weightFn(g))
14
- : dfsFAS(g));
15
- fas.forEach(e => {
16
- let label = g.edge(e);
17
- g.removeEdge(e);
18
- label.forwardName = e.name;
19
- label.reversed = true;
20
- g.setEdge(e.w, e.v, label, uniqueId("rev"));
21
- });
22
-
23
- function weightFn(g) {
24
- return e => {
25
- return g.edge(e).weight;
26
- };
27
- }
28
- }
29
-
30
- function dfsFAS(g) {
31
- let fas = [];
32
- let stack = {};
33
- let visited = {};
34
-
35
- function dfs(v) {
36
- if (Object.hasOwn(visited, v)) {
37
- return;
38
- }
39
- visited[v] = true;
40
- stack[v] = true;
41
- g.outEdges(v).forEach(e => {
42
- if (Object.hasOwn(stack, e.w)) {
43
- fas.push(e);
44
- } else {
45
- dfs(e.w);
46
- }
47
- });
48
- delete stack[v];
49
- }
50
-
51
- g.nodes().forEach(dfs);
52
- return fas;
53
- }
54
-
55
- function undo(g) {
56
- g.edges().forEach(e => {
57
- let label = g.edge(e);
58
- if (label.reversed) {
59
- g.removeEdge(e);
60
-
61
- let forwardName = label.forwardName;
62
- delete label.reversed;
63
- delete label.forwardName;
64
- g.setEdge(e.w, e.v, label, forwardName);
65
- }
66
- });
67
- }
@@ -1,37 +0,0 @@
1
- let util = require("./util");
2
-
3
- module.exports = addBorderSegments;
4
-
5
- function addBorderSegments(g) {
6
- function dfs(v) {
7
- let children = g.children(v);
8
- let node = g.node(v);
9
- if (children.length) {
10
- children.forEach(dfs);
11
- }
12
-
13
- if (Object.hasOwn(node, "minRank")) {
14
- node.borderLeft = [];
15
- node.borderRight = [];
16
- for (let rank = node.minRank, maxRank = node.maxRank + 1;
17
- rank < maxRank;
18
- ++rank) {
19
- addBorderNode(g, "borderLeft", "_bl", v, node, rank);
20
- addBorderNode(g, "borderRight", "_br", v, node, rank);
21
- }
22
- }
23
- }
24
-
25
- g.children().forEach(dfs);
26
- }
27
-
28
- function addBorderNode(g, prop, prefix, sg, sgNode, rank) {
29
- let label = { width: 0, height: 0, rank: rank, borderType: prop };
30
- let prev = sgNode[prop][rank - 1];
31
- let curr = util.addDummyNode(g, "border", label, prefix);
32
- sgNode[prop][rank] = curr;
33
- g.setParent(curr, sg);
34
- if (prev) {
35
- g.setEdge(prev, curr, { weight: 1 });
36
- }
37
- }
@@ -1,70 +0,0 @@
1
- "use strict";
2
-
3
- module.exports = {
4
- adjust: adjust,
5
- undo: undo
6
- };
7
-
8
- function adjust(g) {
9
- let rankDir = g.graph().rankdir.toLowerCase();
10
- if (rankDir === "lr" || rankDir === "rl") {
11
- swapWidthHeight(g);
12
- }
13
- }
14
-
15
- function undo(g) {
16
- let rankDir = g.graph().rankdir.toLowerCase();
17
- if (rankDir === "bt" || rankDir === "rl") {
18
- reverseY(g);
19
- }
20
-
21
- if (rankDir === "lr" || rankDir === "rl") {
22
- swapXY(g);
23
- swapWidthHeight(g);
24
- }
25
- }
26
-
27
- function swapWidthHeight(g) {
28
- g.nodes().forEach(v => swapWidthHeightOne(g.node(v)));
29
- g.edges().forEach(e => swapWidthHeightOne(g.edge(e)));
30
- }
31
-
32
- function swapWidthHeightOne(attrs) {
33
- let w = attrs.width;
34
- attrs.width = attrs.height;
35
- attrs.height = w;
36
- }
37
-
38
- function reverseY(g) {
39
- g.nodes().forEach(v => reverseYOne(g.node(v)));
40
-
41
- g.edges().forEach(e => {
42
- let edge = g.edge(e);
43
- edge.points.forEach(reverseYOne);
44
- if (Object.hasOwn(edge, "y")) {
45
- reverseYOne(edge);
46
- }
47
- });
48
- }
49
-
50
- function reverseYOne(attrs) {
51
- attrs.y = -attrs.y;
52
- }
53
-
54
- function swapXY(g) {
55
- g.nodes().forEach(v => swapXYOne(g.node(v)));
56
-
57
- g.edges().forEach(e => {
58
- let edge = g.edge(e);
59
- edge.points.forEach(swapXYOne);
60
- if (Object.hasOwn(edge, "x")) {
61
- swapXYOne(edge);
62
- }
63
- });
64
- }
65
-
66
- function swapXYOne(attrs) {
67
- let x = attrs.x;
68
- attrs.x = attrs.y;
69
- attrs.y = x;
70
- }
package/lib/data/list.js DELETED
@@ -1,58 +0,0 @@
1
- /*
2
- * Simple doubly linked list implementation derived from Cormen, et al.,
3
- * "Introduction to Algorithms".
4
- */
5
-
6
- class List {
7
- constructor() {
8
- let sentinel = {};
9
- sentinel._next = sentinel._prev = sentinel;
10
- this._sentinel = sentinel;
11
- }
12
-
13
- dequeue() {
14
- let sentinel = this._sentinel;
15
- let entry = sentinel._prev;
16
- if (entry !== sentinel) {
17
- unlink(entry);
18
- return entry;
19
- }
20
- }
21
-
22
- enqueue(entry) {
23
- let sentinel = this._sentinel;
24
- if (entry._prev && entry._next) {
25
- unlink(entry);
26
- }
27
- entry._next = sentinel._next;
28
- sentinel._next._prev = entry;
29
- sentinel._next = entry;
30
- entry._prev = sentinel;
31
- }
32
-
33
- toString() {
34
- let strs = [];
35
- let sentinel = this._sentinel;
36
- let curr = sentinel._prev;
37
- while (curr !== sentinel) {
38
- strs.push(JSON.stringify(curr, filterOutLinks));
39
- curr = curr._prev;
40
- }
41
- return "[" + strs.join(", ") + "]";
42
- }
43
- }
44
-
45
- function unlink(entry) {
46
- entry._prev._next = entry._next;
47
- entry._next._prev = entry._prev;
48
- delete entry._next;
49
- delete entry._prev;
50
- }
51
-
52
- function filterOutLinks(k, v) {
53
- if (k !== "_next" && k !== "_prev") {
54
- return v;
55
- }
56
- }
57
-
58
- module.exports = List;
package/lib/debug.js DELETED
@@ -1,31 +0,0 @@
1
- let util = require("./util");
2
- let Graph = require("@dagrejs/graphlib").Graph;
3
-
4
- module.exports = {
5
- debugOrdering: debugOrdering
6
- };
7
-
8
- /* istanbul ignore next */
9
- function debugOrdering(g) {
10
- let layerMatrix = util.buildLayerMatrix(g);
11
-
12
- let h = new Graph({ compound: true, multigraph: true }).setGraph({});
13
-
14
- g.nodes().forEach(v => {
15
- h.setNode(v, { label: v });
16
- h.setParent(v, "layer" + g.node(v).rank);
17
- });
18
-
19
- g.edges().forEach(e => h.setEdge(e.v, e.w, {}, e.name));
20
-
21
- layerMatrix.forEach((layer, i) => {
22
- let layerV = "layer" + i;
23
- h.setNode(layerV, { rank: "same" });
24
- layer.reduce((u, v) => {
25
- h.setEdge(u, v, { style: "invis" });
26
- return v;
27
- });
28
- });
29
-
30
- return h;
31
- }
package/lib/greedy-fas.js DELETED
@@ -1,124 +0,0 @@
1
- let Graph = require("@dagrejs/graphlib").Graph;
2
- let List = require("./data/list");
3
-
4
- /*
5
- * A greedy heuristic for finding a feedback arc set for a graph. A feedback
6
- * arc set is a set of edges that can be removed to make a graph acyclic.
7
- * The algorithm comes from: P. Eades, X. Lin, and W. F. Smyth, "A fast and
8
- * effective heuristic for the feedback arc set problem." This implementation
9
- * adjusts that from the paper to allow for weighted edges.
10
- */
11
- module.exports = greedyFAS;
12
-
13
- let DEFAULT_WEIGHT_FN = () => 1;
14
-
15
- function greedyFAS(g, weightFn) {
16
- if (g.nodeCount() <= 1) {
17
- return [];
18
- }
19
- let state = buildState(g, weightFn || DEFAULT_WEIGHT_FN);
20
- let results = doGreedyFAS(state.graph, state.buckets, state.zeroIdx);
21
-
22
- // Expand multi-edges
23
- return results.flatMap(e => g.outEdges(e.v, e.w));
24
- }
25
-
26
- function doGreedyFAS(g, buckets, zeroIdx) {
27
- let results = [];
28
- let sources = buckets[buckets.length - 1];
29
- let sinks = buckets[0];
30
-
31
- let entry;
32
- while (g.nodeCount()) {
33
- while ((entry = sinks.dequeue())) { removeNode(g, buckets, zeroIdx, entry); }
34
- while ((entry = sources.dequeue())) { removeNode(g, buckets, zeroIdx, entry); }
35
- if (g.nodeCount()) {
36
- for (let i = buckets.length - 2; i > 0; --i) {
37
- entry = buckets[i].dequeue();
38
- if (entry) {
39
- results = results.concat(removeNode(g, buckets, zeroIdx, entry, true));
40
- break;
41
- }
42
- }
43
- }
44
- }
45
-
46
- return results;
47
- }
48
-
49
- function removeNode(g, buckets, zeroIdx, entry, collectPredecessors) {
50
- let results = collectPredecessors ? [] : undefined;
51
-
52
- g.inEdges(entry.v).forEach(edge => {
53
- let weight = g.edge(edge);
54
- let uEntry = g.node(edge.v);
55
-
56
- if (collectPredecessors) {
57
- results.push({ v: edge.v, w: edge.w });
58
- }
59
-
60
- uEntry.out -= weight;
61
- assignBucket(buckets, zeroIdx, uEntry);
62
- });
63
-
64
- g.outEdges(entry.v).forEach(edge => {
65
- let weight = g.edge(edge);
66
- let w = edge.w;
67
- let wEntry = g.node(w);
68
- wEntry["in"] -= weight;
69
- assignBucket(buckets, zeroIdx, wEntry);
70
- });
71
-
72
- g.removeNode(entry.v);
73
-
74
- return results;
75
- }
76
-
77
- function buildState(g, weightFn) {
78
- let fasGraph = new Graph();
79
- let maxIn = 0;
80
- let maxOut = 0;
81
-
82
- g.nodes().forEach(v => {
83
- fasGraph.setNode(v, { v: v, "in": 0, out: 0 });
84
- });
85
-
86
- // Aggregate weights on nodes, but also sum the weights across multi-edges
87
- // into a single edge for the fasGraph.
88
- g.edges().forEach(e => {
89
- let prevWeight = fasGraph.edge(e.v, e.w) || 0;
90
- let weight = weightFn(e);
91
- let edgeWeight = prevWeight + weight;
92
- fasGraph.setEdge(e.v, e.w, edgeWeight);
93
- maxOut = Math.max(maxOut, fasGraph.node(e.v).out += weight);
94
- maxIn = Math.max(maxIn, fasGraph.node(e.w)["in"] += weight);
95
- });
96
-
97
- let buckets = range(maxOut + maxIn + 3).map(() => new List());
98
- let zeroIdx = maxIn + 1;
99
-
100
- fasGraph.nodes().forEach(v => {
101
- assignBucket(buckets, zeroIdx, fasGraph.node(v));
102
- });
103
-
104
- return { graph: fasGraph, buckets: buckets, zeroIdx: zeroIdx };
105
- }
106
-
107
- function assignBucket(buckets, zeroIdx, entry) {
108
- if (!entry.out) {
109
- buckets[0].enqueue(entry);
110
- } else if (!entry["in"]) {
111
- buckets[buckets.length - 1].enqueue(entry);
112
- } else {
113
- buckets[entry.out - entry["in"] + zeroIdx].enqueue(entry);
114
- }
115
- }
116
-
117
- function range(limit) {
118
- const range = [];
119
- for (let i = 0; i < limit; i++) {
120
- range.push(i);
121
- }
122
-
123
- return range;
124
- }