@foblex/flow-dagre-layout 18.5.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 (40) hide show
  1. package/README.md +139 -0
  2. package/esm2022/foblex-flow-dagre-layout.mjs +5 -0
  3. package/esm2022/lib/configurations/default-dagre-layout-engine-options.mjs +11 -0
  4. package/esm2022/lib/configurations/index.mjs +2 -0
  5. package/esm2022/lib/engines/dagre-layout-engine.mjs +93 -0
  6. package/esm2022/lib/engines/index.mjs +2 -0
  7. package/esm2022/lib/enums/e-dagre-layout-algorithm.mjs +7 -0
  8. package/esm2022/lib/enums/index.mjs +2 -0
  9. package/esm2022/lib/index.mjs +5 -0
  10. package/esm2022/lib/models/i-dagre-layout-engine-options.mjs +2 -0
  11. package/esm2022/lib/models/index.mjs +2 -0
  12. package/esm2022/public-api.mjs +2 -0
  13. package/fesm2022/foblex-flow-dagre-layout.mjs +113 -0
  14. package/fesm2022/foblex-flow-dagre-layout.mjs.map +1 -0
  15. package/index.d.ts +5 -0
  16. package/lib/configurations/default-dagre-layout-engine-options.d.ts +2 -0
  17. package/lib/configurations/index.d.ts +1 -0
  18. package/lib/engines/dagre-layout-engine.d.ts +13 -0
  19. package/lib/engines/index.d.ts +1 -0
  20. package/lib/enums/e-dagre-layout-algorithm.d.ts +5 -0
  21. package/lib/enums/index.d.ts +1 -0
  22. package/lib/index.d.ts +4 -0
  23. package/lib/models/i-dagre-layout-engine-options.d.ts +4 -0
  24. package/lib/models/index.d.ts +1 -0
  25. package/package.json +53 -0
  26. package/public-api.d.ts +1 -0
  27. package/schematics/collection.json +15 -0
  28. package/schematics/ng-add/index.d.ts +3 -0
  29. package/schematics/ng-add/index.js +107 -0
  30. package/schematics/ng-add/index.js.map +1 -0
  31. package/schematics/ng-add/schema.json +13 -0
  32. package/schematics/shared/foblex-flow-dependencies.d.ts +4 -0
  33. package/schematics/shared/foblex-flow-dependencies.js +11 -0
  34. package/schematics/shared/foblex-flow-dependencies.js.map +1 -0
  35. package/schematics/shared/i-ng-add-schema.d.ts +3 -0
  36. package/schematics/shared/i-ng-add-schema.js +3 -0
  37. package/schematics/shared/i-ng-add-schema.js.map +1 -0
  38. package/schematics/shared/package-json.d.ts +2 -0
  39. package/schematics/shared/package-json.js +18 -0
  40. package/schematics/shared/package-json.js.map +1 -0
package/README.md ADDED
@@ -0,0 +1,139 @@
1
+ # @foblex/flow-dagre-layout
2
+
3
+ `@foblex/flow-dagre-layout` adds a manual layout adapter for [Dagre](https://github.com/dagrejs/dagre) in [Foblex Flow](https://flow.foblex.com).
4
+
5
+ Use this package when your graph is mostly hierarchical and you want predictable left-to-right or top-to-bottom layout for workflows, trees, dependency maps, or org-chart style editors.
6
+
7
+ ## Install
8
+
9
+ The easiest path is:
10
+
11
+ ```bash
12
+ ng add @foblex/flow-dagre-layout
13
+ ```
14
+
15
+ If your app already manages Flow styles on its own, you can skip the default theme wiring:
16
+
17
+ ```bash
18
+ ng add @foblex/flow-dagre-layout --skipTheme
19
+ ```
20
+
21
+ For Nx workspaces:
22
+
23
+ ```bash
24
+ nx g @foblex/flow-dagre-layout:add
25
+ ```
26
+
27
+ `ng add` ensures these packages are present and only adds the missing ones:
28
+
29
+ - `@foblex/flow`
30
+ - `@foblex/platform`
31
+ - `@foblex/mediator`
32
+ - `@foblex/2d`
33
+ - `@foblex/utils`
34
+ - the Dagre package itself
35
+
36
+ It also adds `node_modules/@foblex/flow/styles/default.scss` to application styles when the theme entry is missing.
37
+
38
+ If you prefer manual installation:
39
+
40
+ ```bash
41
+ npm install @foblex/flow @foblex/flow-dagre-layout @foblex/platform@^1.0.4 @foblex/mediator@^1.1.3 @foblex/2d@^1.2.2 @foblex/utils@^1.1.1
42
+ ```
43
+
44
+ The underlying `dagre` package is shipped as a runtime dependency of this package, so you do not need to install it separately.
45
+
46
+ ## What The Engine Does
47
+
48
+ `DagreLayoutEngine` calculates node positions from:
49
+
50
+ - node ids
51
+ - optional node sizes
52
+ - source/target connections
53
+ - layout options such as direction, spacing, and algorithm
54
+
55
+ The engine returns only calculated node positions. Your app stays in charge of graph state and decides how to merge those positions back into your own node model.
56
+
57
+ ## Minimal Setup
58
+
59
+ ```ts
60
+ import { Component, inject } from '@angular/core';
61
+ import {
62
+ EFLayoutDirection,
63
+ IFLayoutConnection,
64
+ IFLayoutNode,
65
+ provideFLayout,
66
+ } from '@foblex/flow';
67
+ import {
68
+ DagreLayoutEngine,
69
+ EDagreLayoutAlgorithm,
70
+ } from '@foblex/flow-dagre-layout';
71
+
72
+ @Component({
73
+ standalone: true,
74
+ providers: [provideFLayout(DagreLayoutEngine)],
75
+ template: '',
76
+ })
77
+ export class WorkflowLayoutExample {
78
+ private readonly _layout = inject(DagreLayoutEngine);
79
+
80
+ protected async relayout(): Promise<void> {
81
+ const nodes: IFLayoutNode[] = [
82
+ { id: 'A' },
83
+ { id: 'B' },
84
+ { id: 'C' },
85
+ ];
86
+ const connections: IFLayoutConnection[] = [
87
+ { source: 'A', target: 'B' },
88
+ { source: 'B', target: 'C' },
89
+ ];
90
+
91
+ const result = await this._layout.calculate(nodes, connections, {
92
+ direction: EFLayoutDirection.LEFT_RIGHT,
93
+ algorithm: EDagreLayoutAlgorithm.NETWORK_SIMPLEX,
94
+ nodeGap: 32,
95
+ layerGap: 48,
96
+ });
97
+
98
+ const positions = new Map(result.nodes.map((node) => [node.id, node.position]));
99
+
100
+ console.log(positions.get('A'));
101
+ }
102
+ }
103
+ ```
104
+
105
+ ## Main Options
106
+
107
+ - `direction`: `EFLayoutDirection`
108
+ - `algorithm`: `EDagreLayoutAlgorithm`
109
+ - `nodeGap`: horizontal or sibling spacing
110
+ - `layerGap`: spacing between ranks or levels
111
+ - `defaultNodeSize`: fallback size when a node does not provide `size`
112
+
113
+ Available algorithms:
114
+
115
+ - `EDagreLayoutAlgorithm.NETWORK_SIMPLEX`
116
+ - `EDagreLayoutAlgorithm.TIGHT_TREE`
117
+ - `EDagreLayoutAlgorithm.LONGEST_PATH`
118
+
119
+ ## Typical Integration Flow
120
+
121
+ 1. Build your own graph data.
122
+ 2. Convert it to `IFLayoutNode[]` and `IFLayoutConnection[]`.
123
+ 3. Call `calculate(...)`.
124
+ 4. Merge returned positions into your view model.
125
+ 5. Render nodes in `f-flow`.
126
+
127
+ ## Example
128
+
129
+ - Live example: [https://flow.foblex.com/examples/dagre-layout](https://flow.foblex.com/examples/dagre-layout)
130
+ - Example source: [libs/f-examples/plugins/dagre-layout](https://github.com/Foblex/f-flow/tree/main/libs/f-examples/plugins/dagre-layout)
131
+
132
+ ## When To Choose Dagre
133
+
134
+ Choose Dagre when you want:
135
+
136
+ - fast directed layout
137
+ - tree-like or layered structure
138
+ - simple and predictable spacing controls
139
+ - a smaller option surface than ELK.js
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ibGV4LWZsb3ctZGFncmUtbGF5b3V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vbGlicy9mLWxheW91dC9kYWdyZS9zcmMvZm9ibGV4LWZsb3ctZGFncmUtbGF5b3V0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vcHVibGljLWFwaSc7XG4iXX0=
@@ -0,0 +1,11 @@
1
+ import { SizeExtensions } from '@foblex/2d';
2
+ import { EFLayoutDirection } from '@foblex/flow';
3
+ import { EDagreLayoutAlgorithm } from '../enums';
4
+ export const DEFAULT_DAGRE_LAYOUT_ENGINE_OPTIONS = {
5
+ direction: EFLayoutDirection.TOP_BOTTOM,
6
+ nodeGap: 48,
7
+ layerGap: 64,
8
+ algorithm: EDagreLayoutAlgorithm.NETWORK_SIMPLEX,
9
+ defaultNodeSize: SizeExtensions.initialize(120, 72),
10
+ };
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC1kYWdyZS1sYXlvdXQtZW5naW5lLW9wdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2YtbGF5b3V0L2RhZ3JlL3NyYy9saWIvY29uZmlndXJhdGlvbnMvZGVmYXVsdC1kYWdyZS1sYXlvdXQtZW5naW5lLW9wdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUM1QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDakQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBR2pELE1BQU0sQ0FBQyxNQUFNLG1DQUFtQyxHQUE4QjtJQUM1RSxTQUFTLEVBQUUsaUJBQWlCLENBQUMsVUFBVTtJQUN2QyxPQUFPLEVBQUUsRUFBRTtJQUNYLFFBQVEsRUFBRSxFQUFFO0lBQ1osU0FBUyxFQUFFLHFCQUFxQixDQUFDLGVBQWU7SUFDaEQsZUFBZSxFQUFFLGNBQWMsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQztDQUNwRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2l6ZUV4dGVuc2lvbnMgfSBmcm9tICdAZm9ibGV4LzJkJztcbmltcG9ydCB7IEVGTGF5b3V0RGlyZWN0aW9uIH0gZnJvbSAnQGZvYmxleC9mbG93JztcbmltcG9ydCB7IEVEYWdyZUxheW91dEFsZ29yaXRobSB9IGZyb20gJy4uL2VudW1zJztcbmltcG9ydCB7IElEYWdyZUxheW91dEVuZ2luZU9wdGlvbnMgfSBmcm9tICcuLi9tb2RlbHMnO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9EQUdSRV9MQVlPVVRfRU5HSU5FX09QVElPTlM6IElEYWdyZUxheW91dEVuZ2luZU9wdGlvbnMgPSB7XG4gIGRpcmVjdGlvbjogRUZMYXlvdXREaXJlY3Rpb24uVE9QX0JPVFRPTSxcbiAgbm9kZUdhcDogNDgsXG4gIGxheWVyR2FwOiA2NCxcbiAgYWxnb3JpdGhtOiBFRGFncmVMYXlvdXRBbGdvcml0aG0uTkVUV09SS19TSU1QTEVYLFxuICBkZWZhdWx0Tm9kZVNpemU6IFNpemVFeHRlbnNpb25zLmluaXRpYWxpemUoMTIwLCA3MiksXG59O1xuIl19
@@ -0,0 +1,2 @@
1
+ export * from './default-dagre-layout-engine-options';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2YtbGF5b3V0L2RhZ3JlL3NyYy9saWIvY29uZmlndXJhdGlvbnMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyx1Q0FBdUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vZGVmYXVsdC1kYWdyZS1sYXlvdXQtZW5naW5lLW9wdGlvbnMnO1xuIl19
@@ -0,0 +1,93 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { PointExtensions, SizeExtensions } from '@foblex/2d';
3
+ import * as dagre from 'dagre';
4
+ import { EFLayoutDirection, FLayoutEngine, mergeLayoutNodes, } from '@foblex/flow';
5
+ import { DEFAULT_DAGRE_LAYOUT_ENGINE_OPTIONS } from '../configurations';
6
+ import { EDagreLayoutAlgorithm } from '../enums';
7
+ import * as i0 from "@angular/core";
8
+ export class DagreLayoutEngine extends FLayoutEngine {
9
+ constructor() {
10
+ super(DEFAULT_DAGRE_LAYOUT_ENGINE_OPTIONS);
11
+ }
12
+ mergeOptions(currentOptions, nextOptions = {}) {
13
+ return {
14
+ ...currentOptions,
15
+ ...nextOptions,
16
+ defaultNodeSize: nextOptions.defaultNodeSize
17
+ ? SizeExtensions.initialize(nextOptions.defaultNodeSize.width, nextOptions.defaultNodeSize.height)
18
+ : SizeExtensions.initialize(currentOptions.defaultNodeSize.width, currentOptions.defaultNodeSize.height),
19
+ };
20
+ }
21
+ async calculate(nodes, connections, options) {
22
+ const layoutOptions = this.resolveLayoutOptions(options);
23
+ const graph = this._buildGraph(nodes, connections, layoutOptions);
24
+ const positions = new Map();
25
+ dagre.layout(graph);
26
+ graph.nodes().forEach((nodeId) => {
27
+ const graphNode = graph.node(nodeId);
28
+ const sourceNode = nodes.find((node) => node.id === nodeId);
29
+ if (!graphNode || !sourceNode) {
30
+ return;
31
+ }
32
+ const size = sourceNode.size ?? layoutOptions.defaultNodeSize;
33
+ positions.set(nodeId, PointExtensions.initialize(graphNode.x - size.width / 2, graphNode.y - size.height / 2));
34
+ });
35
+ return {
36
+ nodes: mergeLayoutNodes(nodes, positions),
37
+ };
38
+ }
39
+ _buildGraph(nodes, connections, options) {
40
+ const graph = new dagre.graphlib.Graph();
41
+ graph.setDefaultEdgeLabel(() => ({}));
42
+ graph.setGraph({
43
+ rankdir: this._mapDirection(options.direction),
44
+ nodesep: options.nodeGap,
45
+ ranksep: options.layerGap,
46
+ ranker: this._mapAlgorithm(options.algorithm),
47
+ });
48
+ nodes.forEach((node) => {
49
+ const size = node.size ?? options.defaultNodeSize;
50
+ graph.setNode(node.id, {
51
+ width: size.width,
52
+ height: size.height,
53
+ });
54
+ });
55
+ connections.forEach((connection) => {
56
+ if (!graph.hasNode(connection.source) || !graph.hasNode(connection.target)) {
57
+ return;
58
+ }
59
+ graph.setEdge(connection.source, connection.target, {});
60
+ });
61
+ return graph;
62
+ }
63
+ _mapAlgorithm(algorithm) {
64
+ switch (algorithm) {
65
+ case EDagreLayoutAlgorithm.TIGHT_TREE:
66
+ return 'tight-tree';
67
+ case EDagreLayoutAlgorithm.LONGEST_PATH:
68
+ return 'longest-path';
69
+ case EDagreLayoutAlgorithm.NETWORK_SIMPLEX:
70
+ default:
71
+ return 'network-simplex';
72
+ }
73
+ }
74
+ _mapDirection(direction) {
75
+ switch (direction) {
76
+ case EFLayoutDirection.BOTTOM_TOP:
77
+ return 'BT';
78
+ case EFLayoutDirection.LEFT_RIGHT:
79
+ return 'LR';
80
+ case EFLayoutDirection.RIGHT_LEFT:
81
+ return 'RL';
82
+ case EFLayoutDirection.TOP_BOTTOM:
83
+ default:
84
+ return 'TB';
85
+ }
86
+ }
87
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DagreLayoutEngine, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
88
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DagreLayoutEngine });
89
+ }
90
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DagreLayoutEngine, decorators: [{
91
+ type: Injectable
92
+ }], ctorParameters: () => [] });
93
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGFncmUtbGF5b3V0LWVuZ2luZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvZi1sYXlvdXQvZGFncmUvc3JjL2xpYi9lbmdpbmVzL2RhZ3JlLWxheW91dC1lbmdpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUM3RCxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUUvQixPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLGFBQWEsRUFLYixnQkFBZ0IsR0FDakIsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUFFLG1DQUFtQyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDeEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sVUFBVSxDQUFDOztBQUlqRCxNQUFNLE9BQU8saUJBQWtCLFNBQVEsYUFBd0M7SUFDN0U7UUFDRSxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRWtCLFlBQVksQ0FDN0IsY0FBeUMsRUFDekMsY0FBa0QsRUFBRTtRQUVwRCxPQUFPO1lBQ0wsR0FBRyxjQUFjO1lBQ2pCLEdBQUcsV0FBVztZQUNkLGVBQWUsRUFBRSxXQUFXLENBQUMsZUFBZTtnQkFDMUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQ3ZCLFdBQVcsQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUNqQyxXQUFXLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FDbkM7Z0JBQ0gsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQ3ZCLGNBQWMsQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUNwQyxjQUFjLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FDdEM7U0FDTixDQUFDO0lBQ0osQ0FBQztJQUVlLEtBQUssQ0FBQyxTQUFTLENBQzdCLEtBQXFCLEVBQ3JCLFdBQWlDLEVBQ2pDLE9BQStEO1FBRS9ELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN6RCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDbEUsTUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLEVBQW9DLENBQUM7UUFFOUQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVwQixLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDL0IsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNyQyxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLE1BQU0sQ0FBQyxDQUFDO1lBRTVELElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDOUIsT0FBTztZQUNULENBQUM7WUFFRCxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxJQUFJLGFBQWEsQ0FBQyxlQUFlLENBQUM7WUFFOUQsU0FBUyxDQUFDLEdBQUcsQ0FDWCxNQUFNLEVBQ04sZUFBZSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FDeEYsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTztZQUNMLEtBQUssRUFBRSxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDO1NBQzFDLENBQUM7SUFDSixDQUFDO0lBRU8sV0FBVyxDQUNqQixLQUFxQixFQUNyQixXQUFpQyxFQUNqQyxPQUFrQztRQUVsQyxNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFekMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN0QyxLQUFLLENBQUMsUUFBUSxDQUFDO1lBQ2IsT0FBTyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQztZQUM5QyxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87WUFDeEIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxRQUFRO1lBQ3pCLE1BQU0sRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7U0FDOUMsQ0FBQyxDQUFDO1FBRUgsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ3JCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLGVBQWUsQ0FBQztZQUVsRCxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUU7Z0JBQ3JCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztnQkFDakIsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO2FBQ3BCLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFO1lBQ2pDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQzNFLE9BQU87WUFDVCxDQUFDO1lBRUQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDMUQsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFTyxhQUFhLENBQ25CLFNBQWdDO1FBRWhDLFFBQVEsU0FBUyxFQUFFLENBQUM7WUFDbEIsS0FBSyxxQkFBcUIsQ0FBQyxVQUFVO2dCQUNuQyxPQUFPLFlBQVksQ0FBQztZQUN0QixLQUFLLHFCQUFxQixDQUFDLFlBQVk7Z0JBQ3JDLE9BQU8sY0FBYyxDQUFDO1lBQ3hCLEtBQUsscUJBQXFCLENBQUMsZUFBZSxDQUFDO1lBQzNDO2dCQUNFLE9BQU8saUJBQWlCLENBQUM7UUFDN0IsQ0FBQztJQUNILENBQUM7SUFFTyxhQUFhLENBQUMsU0FBNEI7UUFDaEQsUUFBUSxTQUFTLEVBQUUsQ0FBQztZQUNsQixLQUFLLGlCQUFpQixDQUFDLFVBQVU7Z0JBQy9CLE9BQU8sSUFBSSxDQUFDO1lBQ2QsS0FBSyxpQkFBaUIsQ0FBQyxVQUFVO2dCQUMvQixPQUFPLElBQUksQ0FBQztZQUNkLEtBQUssaUJBQWlCLENBQUMsVUFBVTtnQkFDL0IsT0FBTyxJQUFJLENBQUM7WUFDZCxLQUFLLGlCQUFpQixDQUFDLFVBQVUsQ0FBQztZQUNsQztnQkFDRSxPQUFPLElBQUksQ0FBQztRQUNoQixDQUFDO0lBQ0gsQ0FBQzt3R0FySFUsaUJBQWlCOzRHQUFqQixpQkFBaUI7OzRGQUFqQixpQkFBaUI7a0JBRDdCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBQb2ludEV4dGVuc2lvbnMsIFNpemVFeHRlbnNpb25zIH0gZnJvbSAnQGZvYmxleC8yZCc7XG5pbXBvcnQgKiBhcyBkYWdyZSBmcm9tICdkYWdyZSc7XG5pbXBvcnQgeyBncmFwaGxpYiB9IGZyb20gJ2RhZ3JlJztcbmltcG9ydCB7XG4gIEVGTGF5b3V0RGlyZWN0aW9uLFxuICBGTGF5b3V0RW5naW5lLFxuICBJRkxheW91dENhbGN1bGF0aW9uT3B0aW9ucyxcbiAgSUZMYXlvdXRDb25uZWN0aW9uLFxuICBJRkxheW91dE5vZGUsXG4gIElGTGF5b3V0UmVzdWx0LFxuICBtZXJnZUxheW91dE5vZGVzLFxufSBmcm9tICdAZm9ibGV4L2Zsb3cnO1xuaW1wb3J0IHsgREVGQVVMVF9EQUdSRV9MQVlPVVRfRU5HSU5FX09QVElPTlMgfSBmcm9tICcuLi9jb25maWd1cmF0aW9ucyc7XG5pbXBvcnQgeyBFRGFncmVMYXlvdXRBbGdvcml0aG0gfSBmcm9tICcuLi9lbnVtcyc7XG5pbXBvcnQgeyBJRGFncmVMYXlvdXRFbmdpbmVPcHRpb25zIH0gZnJvbSAnLi4vbW9kZWxzJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERhZ3JlTGF5b3V0RW5naW5lIGV4dGVuZHMgRkxheW91dEVuZ2luZTxJRGFncmVMYXlvdXRFbmdpbmVPcHRpb25zPiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihERUZBVUxUX0RBR1JFX0xBWU9VVF9FTkdJTkVfT1BUSU9OUyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgbWVyZ2VPcHRpb25zKFxuICAgIGN1cnJlbnRPcHRpb25zOiBJRGFncmVMYXlvdXRFbmdpbmVPcHRpb25zLFxuICAgIG5leHRPcHRpb25zOiBQYXJ0aWFsPElEYWdyZUxheW91dEVuZ2luZU9wdGlvbnM+ID0ge30sXG4gICk6IElEYWdyZUxheW91dEVuZ2luZU9wdGlvbnMge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5jdXJyZW50T3B0aW9ucyxcbiAgICAgIC4uLm5leHRPcHRpb25zLFxuICAgICAgZGVmYXVsdE5vZGVTaXplOiBuZXh0T3B0aW9ucy5kZWZhdWx0Tm9kZVNpemVcbiAgICAgICAgPyBTaXplRXh0ZW5zaW9ucy5pbml0aWFsaXplKFxuICAgICAgICAgICAgbmV4dE9wdGlvbnMuZGVmYXVsdE5vZGVTaXplLndpZHRoLFxuICAgICAgICAgICAgbmV4dE9wdGlvbnMuZGVmYXVsdE5vZGVTaXplLmhlaWdodCxcbiAgICAgICAgICApXG4gICAgICAgIDogU2l6ZUV4dGVuc2lvbnMuaW5pdGlhbGl6ZShcbiAgICAgICAgICAgIGN1cnJlbnRPcHRpb25zLmRlZmF1bHROb2RlU2l6ZS53aWR0aCxcbiAgICAgICAgICAgIGN1cnJlbnRPcHRpb25zLmRlZmF1bHROb2RlU2l6ZS5oZWlnaHQsXG4gICAgICAgICAgKSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGFzeW5jIGNhbGN1bGF0ZShcbiAgICBub2RlczogSUZMYXlvdXROb2RlW10sXG4gICAgY29ubmVjdGlvbnM6IElGTGF5b3V0Q29ubmVjdGlvbltdLFxuICAgIG9wdGlvbnM/OiBJRkxheW91dENhbGN1bGF0aW9uT3B0aW9uczxJRGFncmVMYXlvdXRFbmdpbmVPcHRpb25zPixcbiAgKTogUHJvbWlzZTxJRkxheW91dFJlc3VsdD4ge1xuICAgIGNvbnN0IGxheW91dE9wdGlvbnMgPSB0aGlzLnJlc29sdmVMYXlvdXRPcHRpb25zKG9wdGlvbnMpO1xuICAgIGNvbnN0IGdyYXBoID0gdGhpcy5fYnVpbGRHcmFwaChub2RlcywgY29ubmVjdGlvbnMsIGxheW91dE9wdGlvbnMpO1xuICAgIGNvbnN0IHBvc2l0aW9ucyA9IG5ldyBNYXA8c3RyaW5nLCB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0+KCk7XG5cbiAgICBkYWdyZS5sYXlvdXQoZ3JhcGgpO1xuXG4gICAgZ3JhcGgubm9kZXMoKS5mb3JFYWNoKChub2RlSWQpID0+IHtcbiAgICAgIGNvbnN0IGdyYXBoTm9kZSA9IGdyYXBoLm5vZGUobm9kZUlkKTtcbiAgICAgIGNvbnN0IHNvdXJjZU5vZGUgPSBub2Rlcy5maW5kKChub2RlKSA9PiBub2RlLmlkID09PSBub2RlSWQpO1xuXG4gICAgICBpZiAoIWdyYXBoTm9kZSB8fCAhc291cmNlTm9kZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNpemUgPSBzb3VyY2VOb2RlLnNpemUgPz8gbGF5b3V0T3B0aW9ucy5kZWZhdWx0Tm9kZVNpemU7XG5cbiAgICAgIHBvc2l0aW9ucy5zZXQoXG4gICAgICAgIG5vZGVJZCxcbiAgICAgICAgUG9pbnRFeHRlbnNpb25zLmluaXRpYWxpemUoZ3JhcGhOb2RlLnggLSBzaXplLndpZHRoIC8gMiwgZ3JhcGhOb2RlLnkgLSBzaXplLmhlaWdodCAvIDIpLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBub2RlczogbWVyZ2VMYXlvdXROb2Rlcyhub2RlcywgcG9zaXRpb25zKSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBfYnVpbGRHcmFwaChcbiAgICBub2RlczogSUZMYXlvdXROb2RlW10sXG4gICAgY29ubmVjdGlvbnM6IElGTGF5b3V0Q29ubmVjdGlvbltdLFxuICAgIG9wdGlvbnM6IElEYWdyZUxheW91dEVuZ2luZU9wdGlvbnMsXG4gICk6IGdyYXBobGliLkdyYXBoIHtcbiAgICBjb25zdCBncmFwaCA9IG5ldyBkYWdyZS5ncmFwaGxpYi5HcmFwaCgpO1xuXG4gICAgZ3JhcGguc2V0RGVmYXVsdEVkZ2VMYWJlbCgoKSA9PiAoe30pKTtcbiAgICBncmFwaC5zZXRHcmFwaCh7XG4gICAgICByYW5rZGlyOiB0aGlzLl9tYXBEaXJlY3Rpb24ob3B0aW9ucy5kaXJlY3Rpb24pLFxuICAgICAgbm9kZXNlcDogb3B0aW9ucy5ub2RlR2FwLFxuICAgICAgcmFua3NlcDogb3B0aW9ucy5sYXllckdhcCxcbiAgICAgIHJhbmtlcjogdGhpcy5fbWFwQWxnb3JpdGhtKG9wdGlvbnMuYWxnb3JpdGhtKSxcbiAgICB9KTtcblxuICAgIG5vZGVzLmZvckVhY2goKG5vZGUpID0+IHtcbiAgICAgIGNvbnN0IHNpemUgPSBub2RlLnNpemUgPz8gb3B0aW9ucy5kZWZhdWx0Tm9kZVNpemU7XG5cbiAgICAgIGdyYXBoLnNldE5vZGUobm9kZS5pZCwge1xuICAgICAgICB3aWR0aDogc2l6ZS53aWR0aCxcbiAgICAgICAgaGVpZ2h0OiBzaXplLmhlaWdodCxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY29ubmVjdGlvbnMuZm9yRWFjaCgoY29ubmVjdGlvbikgPT4ge1xuICAgICAgaWYgKCFncmFwaC5oYXNOb2RlKGNvbm5lY3Rpb24uc291cmNlKSB8fCAhZ3JhcGguaGFzTm9kZShjb25uZWN0aW9uLnRhcmdldCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBncmFwaC5zZXRFZGdlKGNvbm5lY3Rpb24uc291cmNlLCBjb25uZWN0aW9uLnRhcmdldCwge30pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGdyYXBoO1xuICB9XG5cbiAgcHJpdmF0ZSBfbWFwQWxnb3JpdGhtKFxuICAgIGFsZ29yaXRobTogRURhZ3JlTGF5b3V0QWxnb3JpdGhtLFxuICApOiAnbmV0d29yay1zaW1wbGV4JyB8ICd0aWdodC10cmVlJyB8ICdsb25nZXN0LXBhdGgnIHtcbiAgICBzd2l0Y2ggKGFsZ29yaXRobSkge1xuICAgICAgY2FzZSBFRGFncmVMYXlvdXRBbGdvcml0aG0uVElHSFRfVFJFRTpcbiAgICAgICAgcmV0dXJuICd0aWdodC10cmVlJztcbiAgICAgIGNhc2UgRURhZ3JlTGF5b3V0QWxnb3JpdGhtLkxPTkdFU1RfUEFUSDpcbiAgICAgICAgcmV0dXJuICdsb25nZXN0LXBhdGgnO1xuICAgICAgY2FzZSBFRGFncmVMYXlvdXRBbGdvcml0aG0uTkVUV09SS19TSU1QTEVYOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICduZXR3b3JrLXNpbXBsZXgnO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX21hcERpcmVjdGlvbihkaXJlY3Rpb246IEVGTGF5b3V0RGlyZWN0aW9uKTogJ1RCJyB8ICdCVCcgfCAnTFInIHwgJ1JMJyB7XG4gICAgc3dpdGNoIChkaXJlY3Rpb24pIHtcbiAgICAgIGNhc2UgRUZMYXlvdXREaXJlY3Rpb24uQk9UVE9NX1RPUDpcbiAgICAgICAgcmV0dXJuICdCVCc7XG4gICAgICBjYXNlIEVGTGF5b3V0RGlyZWN0aW9uLkxFRlRfUklHSFQ6XG4gICAgICAgIHJldHVybiAnTFInO1xuICAgICAgY2FzZSBFRkxheW91dERpcmVjdGlvbi5SSUdIVF9MRUZUOlxuICAgICAgICByZXR1cm4gJ1JMJztcbiAgICAgIGNhc2UgRUZMYXlvdXREaXJlY3Rpb24uVE9QX0JPVFRPTTpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnVEInO1xuICAgIH1cbiAgfVxufVxuIl19
@@ -0,0 +1,2 @@
1
+ export * from './dagre-layout-engine';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2YtbGF5b3V0L2RhZ3JlL3NyYy9saWIvZW5naW5lcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHVCQUF1QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9kYWdyZS1sYXlvdXQtZW5naW5lJztcbiJdfQ==
@@ -0,0 +1,7 @@
1
+ export var EDagreLayoutAlgorithm;
2
+ (function (EDagreLayoutAlgorithm) {
3
+ EDagreLayoutAlgorithm["NETWORK_SIMPLEX"] = "network-simplex";
4
+ EDagreLayoutAlgorithm["TIGHT_TREE"] = "tight-tree";
5
+ EDagreLayoutAlgorithm["LONGEST_PATH"] = "longest-path";
6
+ })(EDagreLayoutAlgorithm || (EDagreLayoutAlgorithm = {}));
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZS1kYWdyZS1sYXlvdXQtYWxnb3JpdGhtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9mLWxheW91dC9kYWdyZS9zcmMvbGliL2VudW1zL2UtZGFncmUtbGF5b3V0LWFsZ29yaXRobS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQU4sSUFBWSxxQkFJWDtBQUpELFdBQVkscUJBQXFCO0lBQy9CLDREQUFtQyxDQUFBO0lBQ25DLGtEQUF5QixDQUFBO0lBQ3pCLHNEQUE2QixDQUFBO0FBQy9CLENBQUMsRUFKVyxxQkFBcUIsS0FBckIscUJBQXFCLFFBSWhDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGVudW0gRURhZ3JlTGF5b3V0QWxnb3JpdGhtIHtcbiAgTkVUV09SS19TSU1QTEVYID0gJ25ldHdvcmstc2ltcGxleCcsXG4gIFRJR0hUX1RSRUUgPSAndGlnaHQtdHJlZScsXG4gIExPTkdFU1RfUEFUSCA9ICdsb25nZXN0LXBhdGgnLFxufVxuIl19
@@ -0,0 +1,2 @@
1
+ export * from './e-dagre-layout-algorithm';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2YtbGF5b3V0L2RhZ3JlL3NyYy9saWIvZW51bXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyw0QkFBNEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vZS1kYWdyZS1sYXlvdXQtYWxnb3JpdGhtJztcbiJdfQ==
@@ -0,0 +1,5 @@
1
+ export * from './configurations';
2
+ export * from './engines';
3
+ export * from './enums';
4
+ export * from './models';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzL2YtbGF5b3V0L2RhZ3JlL3NyYy9saWIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxrQkFBa0IsQ0FBQztBQUNqQyxjQUFjLFdBQVcsQ0FBQztBQUMxQixjQUFjLFNBQVMsQ0FBQztBQUN4QixjQUFjLFVBQVUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vY29uZmlndXJhdGlvbnMnO1xuZXhwb3J0ICogZnJvbSAnLi9lbmdpbmVzJztcbmV4cG9ydCAqIGZyb20gJy4vZW51bXMnO1xuZXhwb3J0ICogZnJvbSAnLi9tb2RlbHMnO1xuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaS1kYWdyZS1sYXlvdXQtZW5naW5lLW9wdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2YtbGF5b3V0L2RhZ3JlL3NyYy9saWIvbW9kZWxzL2ktZGFncmUtbGF5b3V0LWVuZ2luZS1vcHRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJRkxheW91dEFsZ29yaXRobU9wdGlvbnMgfSBmcm9tICdAZm9ibGV4L2Zsb3cnO1xuaW1wb3J0IHsgRURhZ3JlTGF5b3V0QWxnb3JpdGhtIH0gZnJvbSAnLi4vZW51bXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElEYWdyZUxheW91dEVuZ2luZU9wdGlvbnNcbiAgZXh0ZW5kcyBJRkxheW91dEFsZ29yaXRobU9wdGlvbnM8RURhZ3JlTGF5b3V0QWxnb3JpdGhtPiB7fVxuIl19
@@ -0,0 +1,2 @@
1
+ export * from './i-dagre-layout-engine-options';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2YtbGF5b3V0L2RhZ3JlL3NyYy9saWIvbW9kZWxzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsaUNBQWlDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2ktZGFncmUtbGF5b3V0LWVuZ2luZS1vcHRpb25zJztcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export * from './lib';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYnMvZi1sYXlvdXQvZGFncmUvc3JjL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxPQUFPLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2xpYic7XG4iXX0=
@@ -0,0 +1,113 @@
1
+ import { SizeExtensions, PointExtensions } from '@foblex/2d';
2
+ import { EFLayoutDirection, FLayoutEngine, mergeLayoutNodes } from '@foblex/flow';
3
+ import * as i0 from '@angular/core';
4
+ import { Injectable } from '@angular/core';
5
+ import * as dagre from 'dagre';
6
+
7
+ var EDagreLayoutAlgorithm;
8
+ (function (EDagreLayoutAlgorithm) {
9
+ EDagreLayoutAlgorithm["NETWORK_SIMPLEX"] = "network-simplex";
10
+ EDagreLayoutAlgorithm["TIGHT_TREE"] = "tight-tree";
11
+ EDagreLayoutAlgorithm["LONGEST_PATH"] = "longest-path";
12
+ })(EDagreLayoutAlgorithm || (EDagreLayoutAlgorithm = {}));
13
+
14
+ const DEFAULT_DAGRE_LAYOUT_ENGINE_OPTIONS = {
15
+ direction: EFLayoutDirection.TOP_BOTTOM,
16
+ nodeGap: 48,
17
+ layerGap: 64,
18
+ algorithm: EDagreLayoutAlgorithm.NETWORK_SIMPLEX,
19
+ defaultNodeSize: SizeExtensions.initialize(120, 72),
20
+ };
21
+
22
+ class DagreLayoutEngine extends FLayoutEngine {
23
+ constructor() {
24
+ super(DEFAULT_DAGRE_LAYOUT_ENGINE_OPTIONS);
25
+ }
26
+ mergeOptions(currentOptions, nextOptions = {}) {
27
+ return {
28
+ ...currentOptions,
29
+ ...nextOptions,
30
+ defaultNodeSize: nextOptions.defaultNodeSize
31
+ ? SizeExtensions.initialize(nextOptions.defaultNodeSize.width, nextOptions.defaultNodeSize.height)
32
+ : SizeExtensions.initialize(currentOptions.defaultNodeSize.width, currentOptions.defaultNodeSize.height),
33
+ };
34
+ }
35
+ async calculate(nodes, connections, options) {
36
+ const layoutOptions = this.resolveLayoutOptions(options);
37
+ const graph = this._buildGraph(nodes, connections, layoutOptions);
38
+ const positions = new Map();
39
+ dagre.layout(graph);
40
+ graph.nodes().forEach((nodeId) => {
41
+ const graphNode = graph.node(nodeId);
42
+ const sourceNode = nodes.find((node) => node.id === nodeId);
43
+ if (!graphNode || !sourceNode) {
44
+ return;
45
+ }
46
+ const size = sourceNode.size ?? layoutOptions.defaultNodeSize;
47
+ positions.set(nodeId, PointExtensions.initialize(graphNode.x - size.width / 2, graphNode.y - size.height / 2));
48
+ });
49
+ return {
50
+ nodes: mergeLayoutNodes(nodes, positions),
51
+ };
52
+ }
53
+ _buildGraph(nodes, connections, options) {
54
+ const graph = new dagre.graphlib.Graph();
55
+ graph.setDefaultEdgeLabel(() => ({}));
56
+ graph.setGraph({
57
+ rankdir: this._mapDirection(options.direction),
58
+ nodesep: options.nodeGap,
59
+ ranksep: options.layerGap,
60
+ ranker: this._mapAlgorithm(options.algorithm),
61
+ });
62
+ nodes.forEach((node) => {
63
+ const size = node.size ?? options.defaultNodeSize;
64
+ graph.setNode(node.id, {
65
+ width: size.width,
66
+ height: size.height,
67
+ });
68
+ });
69
+ connections.forEach((connection) => {
70
+ if (!graph.hasNode(connection.source) || !graph.hasNode(connection.target)) {
71
+ return;
72
+ }
73
+ graph.setEdge(connection.source, connection.target, {});
74
+ });
75
+ return graph;
76
+ }
77
+ _mapAlgorithm(algorithm) {
78
+ switch (algorithm) {
79
+ case EDagreLayoutAlgorithm.TIGHT_TREE:
80
+ return 'tight-tree';
81
+ case EDagreLayoutAlgorithm.LONGEST_PATH:
82
+ return 'longest-path';
83
+ case EDagreLayoutAlgorithm.NETWORK_SIMPLEX:
84
+ default:
85
+ return 'network-simplex';
86
+ }
87
+ }
88
+ _mapDirection(direction) {
89
+ switch (direction) {
90
+ case EFLayoutDirection.BOTTOM_TOP:
91
+ return 'BT';
92
+ case EFLayoutDirection.LEFT_RIGHT:
93
+ return 'LR';
94
+ case EFLayoutDirection.RIGHT_LEFT:
95
+ return 'RL';
96
+ case EFLayoutDirection.TOP_BOTTOM:
97
+ default:
98
+ return 'TB';
99
+ }
100
+ }
101
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DagreLayoutEngine, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
102
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DagreLayoutEngine });
103
+ }
104
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DagreLayoutEngine, decorators: [{
105
+ type: Injectable
106
+ }], ctorParameters: () => [] });
107
+
108
+ /**
109
+ * Generated bundle index. Do not edit.
110
+ */
111
+
112
+ export { DEFAULT_DAGRE_LAYOUT_ENGINE_OPTIONS, DagreLayoutEngine, EDagreLayoutAlgorithm };
113
+ //# sourceMappingURL=foblex-flow-dagre-layout.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"foblex-flow-dagre-layout.mjs","sources":["../../../libs/f-layout/dagre/src/lib/enums/e-dagre-layout-algorithm.ts","../../../libs/f-layout/dagre/src/lib/configurations/default-dagre-layout-engine-options.ts","../../../libs/f-layout/dagre/src/lib/engines/dagre-layout-engine.ts","../../../libs/f-layout/dagre/src/foblex-flow-dagre-layout.ts"],"sourcesContent":["export enum EDagreLayoutAlgorithm {\n NETWORK_SIMPLEX = 'network-simplex',\n TIGHT_TREE = 'tight-tree',\n LONGEST_PATH = 'longest-path',\n}\n","import { SizeExtensions } from '@foblex/2d';\nimport { EFLayoutDirection } from '@foblex/flow';\nimport { EDagreLayoutAlgorithm } from '../enums';\nimport { IDagreLayoutEngineOptions } from '../models';\n\nexport const DEFAULT_DAGRE_LAYOUT_ENGINE_OPTIONS: IDagreLayoutEngineOptions = {\n direction: EFLayoutDirection.TOP_BOTTOM,\n nodeGap: 48,\n layerGap: 64,\n algorithm: EDagreLayoutAlgorithm.NETWORK_SIMPLEX,\n defaultNodeSize: SizeExtensions.initialize(120, 72),\n};\n","import { Injectable } from '@angular/core';\nimport { PointExtensions, SizeExtensions } from '@foblex/2d';\nimport * as dagre from 'dagre';\nimport { graphlib } from 'dagre';\nimport {\n EFLayoutDirection,\n FLayoutEngine,\n IFLayoutCalculationOptions,\n IFLayoutConnection,\n IFLayoutNode,\n IFLayoutResult,\n mergeLayoutNodes,\n} from '@foblex/flow';\nimport { DEFAULT_DAGRE_LAYOUT_ENGINE_OPTIONS } from '../configurations';\nimport { EDagreLayoutAlgorithm } from '../enums';\nimport { IDagreLayoutEngineOptions } from '../models';\n\n@Injectable()\nexport class DagreLayoutEngine extends FLayoutEngine<IDagreLayoutEngineOptions> {\n public constructor() {\n super(DEFAULT_DAGRE_LAYOUT_ENGINE_OPTIONS);\n }\n\n protected override mergeOptions(\n currentOptions: IDagreLayoutEngineOptions,\n nextOptions: Partial<IDagreLayoutEngineOptions> = {},\n ): IDagreLayoutEngineOptions {\n return {\n ...currentOptions,\n ...nextOptions,\n defaultNodeSize: nextOptions.defaultNodeSize\n ? SizeExtensions.initialize(\n nextOptions.defaultNodeSize.width,\n nextOptions.defaultNodeSize.height,\n )\n : SizeExtensions.initialize(\n currentOptions.defaultNodeSize.width,\n currentOptions.defaultNodeSize.height,\n ),\n };\n }\n\n public override async calculate(\n nodes: IFLayoutNode[],\n connections: IFLayoutConnection[],\n options?: IFLayoutCalculationOptions<IDagreLayoutEngineOptions>,\n ): Promise<IFLayoutResult> {\n const layoutOptions = this.resolveLayoutOptions(options);\n const graph = this._buildGraph(nodes, connections, layoutOptions);\n const positions = new Map<string, { x: number; y: number }>();\n\n dagre.layout(graph);\n\n graph.nodes().forEach((nodeId) => {\n const graphNode = graph.node(nodeId);\n const sourceNode = nodes.find((node) => node.id === nodeId);\n\n if (!graphNode || !sourceNode) {\n return;\n }\n\n const size = sourceNode.size ?? layoutOptions.defaultNodeSize;\n\n positions.set(\n nodeId,\n PointExtensions.initialize(graphNode.x - size.width / 2, graphNode.y - size.height / 2),\n );\n });\n\n return {\n nodes: mergeLayoutNodes(nodes, positions),\n };\n }\n\n private _buildGraph(\n nodes: IFLayoutNode[],\n connections: IFLayoutConnection[],\n options: IDagreLayoutEngineOptions,\n ): graphlib.Graph {\n const graph = new dagre.graphlib.Graph();\n\n graph.setDefaultEdgeLabel(() => ({}));\n graph.setGraph({\n rankdir: this._mapDirection(options.direction),\n nodesep: options.nodeGap,\n ranksep: options.layerGap,\n ranker: this._mapAlgorithm(options.algorithm),\n });\n\n nodes.forEach((node) => {\n const size = node.size ?? options.defaultNodeSize;\n\n graph.setNode(node.id, {\n width: size.width,\n height: size.height,\n });\n });\n\n connections.forEach((connection) => {\n if (!graph.hasNode(connection.source) || !graph.hasNode(connection.target)) {\n return;\n }\n\n graph.setEdge(connection.source, connection.target, {});\n });\n\n return graph;\n }\n\n private _mapAlgorithm(\n algorithm: EDagreLayoutAlgorithm,\n ): 'network-simplex' | 'tight-tree' | 'longest-path' {\n switch (algorithm) {\n case EDagreLayoutAlgorithm.TIGHT_TREE:\n return 'tight-tree';\n case EDagreLayoutAlgorithm.LONGEST_PATH:\n return 'longest-path';\n case EDagreLayoutAlgorithm.NETWORK_SIMPLEX:\n default:\n return 'network-simplex';\n }\n }\n\n private _mapDirection(direction: EFLayoutDirection): 'TB' | 'BT' | 'LR' | 'RL' {\n switch (direction) {\n case EFLayoutDirection.BOTTOM_TOP:\n return 'BT';\n case EFLayoutDirection.LEFT_RIGHT:\n return 'LR';\n case EFLayoutDirection.RIGHT_LEFT:\n return 'RL';\n case EFLayoutDirection.TOP_BOTTOM:\n default:\n return 'TB';\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
package/index.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ /// <amd-module name="@foblex/flow-dagre-layout" />
5
+ export * from './public-api';
@@ -0,0 +1,2 @@
1
+ import { IDagreLayoutEngineOptions } from '../models';
2
+ export declare const DEFAULT_DAGRE_LAYOUT_ENGINE_OPTIONS: IDagreLayoutEngineOptions;
@@ -0,0 +1 @@
1
+ export * from './default-dagre-layout-engine-options';
@@ -0,0 +1,13 @@
1
+ import { FLayoutEngine, IFLayoutCalculationOptions, IFLayoutConnection, IFLayoutNode, IFLayoutResult } from '@foblex/flow';
2
+ import { IDagreLayoutEngineOptions } from '../models';
3
+ import * as i0 from "@angular/core";
4
+ export declare class DagreLayoutEngine extends FLayoutEngine<IDagreLayoutEngineOptions> {
5
+ constructor();
6
+ protected mergeOptions(currentOptions: IDagreLayoutEngineOptions, nextOptions?: Partial<IDagreLayoutEngineOptions>): IDagreLayoutEngineOptions;
7
+ calculate(nodes: IFLayoutNode[], connections: IFLayoutConnection[], options?: IFLayoutCalculationOptions<IDagreLayoutEngineOptions>): Promise<IFLayoutResult>;
8
+ private _buildGraph;
9
+ private _mapAlgorithm;
10
+ private _mapDirection;
11
+ static ɵfac: i0.ɵɵFactoryDeclaration<DagreLayoutEngine, never>;
12
+ static ɵprov: i0.ɵɵInjectableDeclaration<DagreLayoutEngine>;
13
+ }
@@ -0,0 +1 @@
1
+ export * from './dagre-layout-engine';
@@ -0,0 +1,5 @@
1
+ export declare enum EDagreLayoutAlgorithm {
2
+ NETWORK_SIMPLEX = "network-simplex",
3
+ TIGHT_TREE = "tight-tree",
4
+ LONGEST_PATH = "longest-path"
5
+ }
@@ -0,0 +1 @@
1
+ export * from './e-dagre-layout-algorithm';
package/lib/index.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ export * from './configurations';
2
+ export * from './engines';
3
+ export * from './enums';
4
+ export * from './models';
@@ -0,0 +1,4 @@
1
+ import { IFLayoutAlgorithmOptions } from '@foblex/flow';
2
+ import { EDagreLayoutAlgorithm } from '../enums';
3
+ export interface IDagreLayoutEngineOptions extends IFLayoutAlgorithmOptions<EDagreLayoutAlgorithm> {
4
+ }
@@ -0,0 +1 @@
1
+ export * from './i-dagre-layout-engine-options';
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "@foblex/flow-dagre-layout",
3
+ "version": "18.5.0",
4
+ "description": "Dagre layout engine adapter for Foblex Flow.",
5
+ "main": "index.js",
6
+ "types": "index.d.ts",
7
+ "author": "Siarhei Huzarevich",
8
+ "homepage": "https://flow.foblex.com",
9
+ "docs": "https://flow.foblex.com/examples/dagre-layout",
10
+ "repository": {
11
+ "type": "git",
12
+ "url": "git+https://github.com/Foblex/f-flow.git"
13
+ },
14
+ "license": "MIT",
15
+ "private": false,
16
+ "keywords": [
17
+ "angular",
18
+ "flow",
19
+ "dagre",
20
+ "layout",
21
+ "graph",
22
+ "diagram",
23
+ "foblex"
24
+ ],
25
+ "schematics": "./schematics/collection.json",
26
+ "ng-add": {
27
+ "save": "dependencies"
28
+ },
29
+ "peerDependencies": {
30
+ "@angular/common": ">=17.3.0",
31
+ "@angular/core": ">=17.3.0",
32
+ "@foblex/2d": "^1.2.2",
33
+ "@foblex/flow": "^18.4.0"
34
+ },
35
+ "dependencies": {
36
+ "dagre": "^0.8.5",
37
+ "tslib": "^2.3.0"
38
+ },
39
+ "sideEffects": false,
40
+ "module": "fesm2022/foblex-flow-dagre-layout.mjs",
41
+ "typings": "index.d.ts",
42
+ "exports": {
43
+ "./package.json": {
44
+ "default": "./package.json"
45
+ },
46
+ ".": {
47
+ "types": "./index.d.ts",
48
+ "esm2022": "./esm2022/foblex-flow-dagre-layout.mjs",
49
+ "esm": "./esm2022/foblex-flow-dagre-layout.mjs",
50
+ "default": "./fesm2022/foblex-flow-dagre-layout.mjs"
51
+ }
52
+ }
53
+ }
@@ -0,0 +1 @@
1
+ export * from './lib';
@@ -0,0 +1,15 @@
1
+ {
2
+ "$schema": "../../../node_modules/@angular-devkit/schematics/collection-schema.json",
3
+ "schematics": {
4
+ "ng-add": {
5
+ "description": "Installs @foblex/flow-dagre-layout and the required Foblex Flow dependencies",
6
+ "factory": "./ng-add/index#ngAdd",
7
+ "schema": "./ng-add/schema.json"
8
+ },
9
+ "add": {
10
+ "description": "Installs @foblex/flow-dagre-layout and the required Foblex Flow dependencies (alias for Nx users)",
11
+ "factory": "./ng-add/index#ngAdd",
12
+ "schema": "./ng-add/schema.json"
13
+ }
14
+ }
15
+ }
@@ -0,0 +1,3 @@
1
+ import { Rule } from '@angular-devkit/schematics';
2
+ import { INgAddSchema } from '../shared/i-ng-add-schema';
3
+ export declare function ngAdd(options: INgAddSchema): Rule;
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ngAdd = ngAdd;
4
+ const schematics_1 = require("@angular-devkit/schematics");
5
+ const tasks_1 = require("@angular-devkit/schematics/tasks");
6
+ const utility_1 = require("@schematics/angular/utility");
7
+ const dependencies_1 = require("@schematics/angular/utility/dependencies");
8
+ const foblex_flow_dependencies_1 = require("../shared/foblex-flow-dependencies");
9
+ const package_json_1 = require("../shared/package-json");
10
+ const DEFAULT_THEME_STYLE_PATH = 'node_modules/@foblex/flow/styles/default.scss';
11
+ const KNOWN_THEME_STYLE_PATHS = new Set([
12
+ DEFAULT_THEME_STYLE_PATH,
13
+ '@foblex/flow/styles/default.scss',
14
+ ]);
15
+ function ngAdd(options) {
16
+ const installationState = { hasNewDependencies: false };
17
+ return (0, schematics_1.chain)([
18
+ addDependencies(installationState),
19
+ addDefaultTheme(options),
20
+ installDependencies(installationState),
21
+ ]);
22
+ }
23
+ function addDependencies(installationState) {
24
+ return (tree, context) => {
25
+ context.logger.info('Installing dependencies for @foblex/flow-dagre-layout...');
26
+ foblex_flow_dependencies_1.FoblexFlowDependencies.forEach((dependency) => {
27
+ if ((0, package_json_1.hasPackageJsonDependency)(tree, dependency.name)) {
28
+ context.logger.info(`Skipped "${dependency.name}" because it is already present in package.json`);
29
+ return;
30
+ }
31
+ (0, dependencies_1.addPackageJsonDependency)(tree, {
32
+ type: dependencies_1.NodeDependencyType.Default,
33
+ name: dependency.name,
34
+ version: dependency.version,
35
+ });
36
+ installationState.hasNewDependencies = true;
37
+ context.logger.info(`Added "${dependency.name}" to package.json`);
38
+ });
39
+ return tree;
40
+ };
41
+ }
42
+ function addDefaultTheme(options) {
43
+ if (options.skipTheme) {
44
+ return (_tree, context) => {
45
+ context.logger.info('Skipped adding the default @foblex/flow theme.');
46
+ return _tree;
47
+ };
48
+ }
49
+ return (0, utility_1.updateWorkspace)((workspace) => {
50
+ for (const [, project] of workspace.projects) {
51
+ if (project.extensions['projectType'] !== 'application') {
52
+ continue;
53
+ }
54
+ addStyleToTarget(project.targets.get('build'));
55
+ addStyleToTarget(project.targets.get('test'));
56
+ }
57
+ });
58
+ }
59
+ function addStyleToTarget(target) {
60
+ var _a;
61
+ if (!target) {
62
+ return;
63
+ }
64
+ ensureThemeInStyles(((_a = target.options) !== null && _a !== void 0 ? _a : (target.options = {})));
65
+ if (!target.configurations) {
66
+ return;
67
+ }
68
+ Object.values(target.configurations).forEach((configuration) => {
69
+ if (!configuration) {
70
+ return;
71
+ }
72
+ ensureThemeInStyles(configuration);
73
+ });
74
+ }
75
+ function ensureThemeInStyles(options) {
76
+ const styles = Array.isArray(options['styles']) ? [...options['styles']] : [];
77
+ if (styles.some(isThemeStyleEntry)) {
78
+ return;
79
+ }
80
+ styles.push(DEFAULT_THEME_STYLE_PATH);
81
+ options['styles'] = styles;
82
+ }
83
+ function isThemeStyleEntry(entry) {
84
+ if (typeof entry === 'string') {
85
+ return KNOWN_THEME_STYLE_PATHS.has(entry);
86
+ }
87
+ if (!entry || typeof entry !== 'object' || Array.isArray(entry)) {
88
+ return false;
89
+ }
90
+ const input = entry['input'];
91
+ return typeof input === 'string' && KNOWN_THEME_STYLE_PATHS.has(input);
92
+ }
93
+ function installDependencies(installationState) {
94
+ return (_tree, context) => {
95
+ if (installationState.hasNewDependencies) {
96
+ context.addTask(new tasks_1.NodePackageInstallTask());
97
+ context.logger.info('Installed missing Foblex Flow dependencies.');
98
+ }
99
+ else {
100
+ context.logger.info('Skipped dependency installation because all required Foblex Flow packages are already present.');
101
+ }
102
+ context.logger.info('Dagre support is ready.');
103
+ context.logger.info('Next step: provide DagreLayoutEngine and call calculate(...) in your flow component.');
104
+ return _tree;
105
+ };
106
+ }
107
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../libs/f-layout/dagre/schematics/ng-add/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ {
2
+ "$schema": "http://json-schema.org/schema",
3
+ "$id": "FoblexFlowDagreLayoutNgAddSchema",
4
+ "title": "@foblex/flow-dagre-layout ng-add options",
5
+ "type": "object",
6
+ "properties": {
7
+ "skipTheme": {
8
+ "type": "boolean",
9
+ "description": "Do not add the default @foblex/flow theme to application styles.",
10
+ "default": false
11
+ }
12
+ }
13
+ }
@@ -0,0 +1,4 @@
1
+ export declare const FoblexFlowDependencies: {
2
+ name: string;
3
+ version: string;
4
+ }[];
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FoblexFlowDependencies = void 0;
4
+ exports.FoblexFlowDependencies = [
5
+ { name: '@foblex/flow', version: '^18.4.0' },
6
+ { name: '@foblex/platform', version: '^1.0.4' },
7
+ { name: '@foblex/mediator', version: '^1.1.3' },
8
+ { name: '@foblex/2d', version: '^1.2.2' },
9
+ { name: '@foblex/utils', version: '^1.1.1' },
10
+ ];
11
+ //# sourceMappingURL=foblex-flow-dependencies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"foblex-flow-dependencies.js","sourceRoot":"","sources":["../../../../libs/f-layout/dagre/schematics/shared/foblex-flow-dependencies.ts"],"names":[],"mappings":";;;AAAa,QAAA,sBAAsB,GAAG;IACpC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE;IAC5C,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,QAAQ,EAAE;IAC/C,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,QAAQ,EAAE;IAC/C,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE;IACzC,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,QAAQ,EAAE;CAC7C,CAAC"}
@@ -0,0 +1,3 @@
1
+ export interface INgAddSchema {
2
+ skipTheme?: boolean;
3
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=i-ng-add-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i-ng-add-schema.js","sourceRoot":"","sources":["../../../../libs/f-layout/dagre/schematics/shared/i-ng-add-schema.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ import { Tree } from '@angular-devkit/schematics';
2
+ export declare function hasPackageJsonDependency(tree: Tree, packageName: string): boolean;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.hasPackageJsonDependency = hasPackageJsonDependency;
4
+ const schematics_1 = require("@angular-devkit/schematics");
5
+ const PACKAGE_JSON_PATH = '/package.json';
6
+ function hasPackageJsonDependency(tree, packageName) {
7
+ var _a, _b, _c, _d, _e, _f, _g;
8
+ const packageJson = readPackageJson(tree);
9
+ return Boolean((_f = (_d = (_b = (_a = packageJson.dependencies) === null || _a === void 0 ? void 0 : _a[packageName]) !== null && _b !== void 0 ? _b : (_c = packageJson.devDependencies) === null || _c === void 0 ? void 0 : _c[packageName]) !== null && _d !== void 0 ? _d : (_e = packageJson.peerDependencies) === null || _e === void 0 ? void 0 : _e[packageName]) !== null && _f !== void 0 ? _f : (_g = packageJson.optionalDependencies) === null || _g === void 0 ? void 0 : _g[packageName]);
10
+ }
11
+ function readPackageJson(tree) {
12
+ const packageJsonBuffer = tree.read(PACKAGE_JSON_PATH);
13
+ if (!packageJsonBuffer) {
14
+ throw new schematics_1.SchematicsException('Could not find package.json in the workspace root.');
15
+ }
16
+ return JSON.parse(packageJsonBuffer.toString('utf-8'));
17
+ }
18
+ //# sourceMappingURL=package-json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-json.js","sourceRoot":"","sources":["../../../../libs/f-layout/dagre/schematics/shared/package-json.ts"],"names":[],"mappings":";;AAWA,4DASC;AApBD,2DAAuE;AASvE,MAAM,iBAAiB,GAAG,eAAe,CAAC;AAE1C,SAAgB,wBAAwB,CAAC,IAAU,EAAE,WAAmB;;IACtE,MAAM,WAAW,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IAE1C,OAAO,OAAO,CACZ,MAAA,MAAA,MAAA,MAAA,WAAW,CAAC,YAAY,0CAAG,WAAW,CAAC,mCACrC,MAAA,WAAW,CAAC,eAAe,0CAAG,WAAW,CAAC,mCAC1C,MAAA,WAAW,CAAC,gBAAgB,0CAAG,WAAW,CAAC,mCAC3C,MAAA,WAAW,CAAC,oBAAoB,0CAAG,WAAW,CAAC,CAClD,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,IAAU;IACjC,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAEvD,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,MAAM,IAAI,gCAAmB,CAAC,oDAAoD,CAAC,CAAC;IACtF,CAAC;IAED,OAAO,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAiB,CAAC;AACzE,CAAC"}