@foblex/flow-elk-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 (52) hide show
  1. package/README.md +155 -0
  2. package/esm2022/foblex-flow-elk-layout.mjs +5 -0
  3. package/esm2022/lib/configurations/default-elk-layout-engine-options.mjs +12 -0
  4. package/esm2022/lib/configurations/index.mjs +2 -0
  5. package/esm2022/lib/engines/elk-layout-engine.mjs +149 -0
  6. package/esm2022/lib/engines/index.mjs +2 -0
  7. package/esm2022/lib/enums/e-elk-layout-algorithm.mjs +16 -0
  8. package/esm2022/lib/enums/index.mjs +2 -0
  9. package/esm2022/lib/index.mjs +5 -0
  10. package/esm2022/lib/models/i-elk-layout-edge.mjs +2 -0
  11. package/esm2022/lib/models/i-elk-layout-engine-options.mjs +2 -0
  12. package/esm2022/lib/models/i-elk-layout-instance.mjs +2 -0
  13. package/esm2022/lib/models/i-elk-layout-module.mjs +2 -0
  14. package/esm2022/lib/models/i-elk-layout-node.mjs +2 -0
  15. package/esm2022/lib/models/i-elk-layout-positioned-node.mjs +2 -0
  16. package/esm2022/lib/models/i-elk-layout-response.mjs +2 -0
  17. package/esm2022/lib/models/index.mjs +8 -0
  18. package/esm2022/public-api.mjs +2 -0
  19. package/fesm2022/foblex-flow-elk-layout.mjs +179 -0
  20. package/fesm2022/foblex-flow-elk-layout.mjs.map +1 -0
  21. package/index.d.ts +5 -0
  22. package/lib/configurations/default-elk-layout-engine-options.d.ts +2 -0
  23. package/lib/configurations/index.d.ts +1 -0
  24. package/lib/engines/elk-layout-engine.d.ts +18 -0
  25. package/lib/engines/index.d.ts +1 -0
  26. package/lib/enums/e-elk-layout-algorithm.d.ts +14 -0
  27. package/lib/enums/index.d.ts +1 -0
  28. package/lib/index.d.ts +4 -0
  29. package/lib/models/i-elk-layout-edge.d.ts +5 -0
  30. package/lib/models/i-elk-layout-engine-options.d.ts +5 -0
  31. package/lib/models/i-elk-layout-instance.d.ts +3 -0
  32. package/lib/models/i-elk-layout-module.d.ts +4 -0
  33. package/lib/models/i-elk-layout-node.d.ts +7 -0
  34. package/lib/models/i-elk-layout-positioned-node.d.ts +4 -0
  35. package/lib/models/i-elk-layout-response.d.ts +4 -0
  36. package/lib/models/index.d.ts +7 -0
  37. package/package.json +53 -0
  38. package/public-api.d.ts +1 -0
  39. package/schematics/collection.json +15 -0
  40. package/schematics/ng-add/index.d.ts +3 -0
  41. package/schematics/ng-add/index.js +107 -0
  42. package/schematics/ng-add/index.js.map +1 -0
  43. package/schematics/ng-add/schema.json +13 -0
  44. package/schematics/shared/foblex-flow-dependencies.d.ts +4 -0
  45. package/schematics/shared/foblex-flow-dependencies.js +11 -0
  46. package/schematics/shared/foblex-flow-dependencies.js.map +1 -0
  47. package/schematics/shared/i-ng-add-schema.d.ts +3 -0
  48. package/schematics/shared/i-ng-add-schema.js +3 -0
  49. package/schematics/shared/i-ng-add-schema.js.map +1 -0
  50. package/schematics/shared/package-json.d.ts +2 -0
  51. package/schematics/shared/package-json.js +18 -0
  52. package/schematics/shared/package-json.js.map +1 -0
package/README.md ADDED
@@ -0,0 +1,155 @@
1
+ # @foblex/flow-elk-layout
2
+
3
+ `@foblex/flow-elk-layout` adds a manual layout adapter for [ELK.js](https://github.com/kieler/elkjs) in [Foblex Flow](https://flow.foblex.com).
4
+
5
+ Use this package when you need richer layout strategies than a simple directed tree and want access to layered, radial, force-style, or other ELK.js algorithms while still rendering and interacting through Foblex Flow.
6
+
7
+ ## Install
8
+
9
+ The easiest path is:
10
+
11
+ ```bash
12
+ ng add @foblex/flow-elk-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-elk-layout --skipTheme
19
+ ```
20
+
21
+ For Nx workspaces:
22
+
23
+ ```bash
24
+ nx g @foblex/flow-elk-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 ELK.js 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-elk-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 `elkjs` 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
+ `ElkLayoutEngine` calculates node positions from:
49
+
50
+ - node ids
51
+ - optional node sizes
52
+ - source/target connections
53
+ - shared layout options such as direction, spacing, and algorithm
54
+ - optional ELK.js-specific `layoutOptions`
55
+
56
+ The engine returns only calculated node positions. Your app remains responsible for state management and for applying those positions to your own graph model.
57
+
58
+ For non-directional algorithms such as force, radial, random, or packing-oriented modes, the example integration can switch connectors into calculate mode so connection anchors follow the actual node geometry instead of a fixed left/right or top/bottom rule.
59
+
60
+ ## Minimal Setup
61
+
62
+ ```ts
63
+ import { Component, inject } from '@angular/core';
64
+ import {
65
+ EFLayoutDirection,
66
+ IFLayoutConnection,
67
+ IFLayoutNode,
68
+ provideFLayout,
69
+ } from '@foblex/flow';
70
+ import {
71
+ EElkLayoutAlgorithm,
72
+ ElkLayoutEngine,
73
+ } from '@foblex/flow-elk-layout';
74
+
75
+ @Component({
76
+ standalone: true,
77
+ providers: [provideFLayout(ElkLayoutEngine)],
78
+ template: '',
79
+ })
80
+ export class WorkflowLayoutExample {
81
+ private readonly _layout = inject(ElkLayoutEngine);
82
+
83
+ protected async relayout(): Promise<void> {
84
+ const nodes: IFLayoutNode[] = [
85
+ { id: 'A' },
86
+ { id: 'B' },
87
+ { id: 'C' },
88
+ ];
89
+ const connections: IFLayoutConnection[] = [
90
+ { source: 'A', target: 'B' },
91
+ { source: 'A', target: 'C' },
92
+ ];
93
+
94
+ const result = await this._layout.calculate(nodes, connections, {
95
+ direction: EFLayoutDirection.TOP_BOTTOM,
96
+ algorithm: EElkLayoutAlgorithm.LAYERED,
97
+ nodeGap: 32,
98
+ layerGap: 48,
99
+ layoutOptions: {
100
+ 'elk.layered.spacing.nodeNodeBetweenLayers': '64',
101
+ },
102
+ });
103
+
104
+ const positions = new Map(result.nodes.map((node) => [node.id, node.position]));
105
+
106
+ console.log(positions.get('A'));
107
+ }
108
+ }
109
+ ```
110
+
111
+ ## Main Options
112
+
113
+ - `direction`: `EFLayoutDirection`
114
+ - `algorithm`: `EElkLayoutAlgorithm`
115
+ - `nodeGap`: spacing between nodes
116
+ - `layerGap`: spacing between layout layers
117
+ - `defaultNodeSize`: fallback size when a node does not provide `size`
118
+ - `layoutOptions`: raw ELK.js options passed through to the engine
119
+
120
+ Available algorithms:
121
+
122
+ - `EElkLayoutAlgorithm.FIXED`
123
+ - `EElkLayoutAlgorithm.BOX`
124
+ - `EElkLayoutAlgorithm.RANDOM`
125
+ - `EElkLayoutAlgorithm.LAYERED`
126
+ - `EElkLayoutAlgorithm.STRESS`
127
+ - `EElkLayoutAlgorithm.MRTREE`
128
+ - `EElkLayoutAlgorithm.RADIAL`
129
+ - `EElkLayoutAlgorithm.FORCE`
130
+ - `EElkLayoutAlgorithm.DISCO`
131
+ - `EElkLayoutAlgorithm.SPORE_OVERLAP`
132
+ - `EElkLayoutAlgorithm.SPORE_COMPACTION`
133
+ - `EElkLayoutAlgorithm.RECT_PACKING`
134
+
135
+ ## Typical Integration Flow
136
+
137
+ 1. Build your own graph data.
138
+ 2. Convert it to `IFLayoutNode[]` and `IFLayoutConnection[]`.
139
+ 3. Call `calculate(...)`.
140
+ 4. Merge returned positions into your view model.
141
+ 5. Render nodes in `f-flow`.
142
+
143
+ ## Example
144
+
145
+ - Live example: [https://flow.foblex.com/examples/elkjs-layout](https://flow.foblex.com/examples/elkjs-layout)
146
+ - Example source: [libs/f-examples/plugins/elk-layout](https://github.com/Foblex/f-flow/tree/main/libs/f-examples/plugins/elk-layout)
147
+
148
+ ## When To Choose ELK.js
149
+
150
+ Choose ELK.js when you want:
151
+
152
+ - more layout algorithms
153
+ - richer spacing and routing controls
154
+ - denser or less tree-like graphs
155
+ - an engine you can tune further through raw ELK.js options
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ibGV4LWZsb3ctZWxrLWxheW91dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYnMvZi1sYXlvdXQvZWxrL3NyYy9mb2JsZXgtZmxvdy1lbGstbGF5b3V0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vcHVibGljLWFwaSc7XG4iXX0=
@@ -0,0 +1,12 @@
1
+ import { SizeExtensions } from '@foblex/2d';
2
+ import { EFLayoutDirection } from '@foblex/flow';
3
+ import { EElkLayoutAlgorithm } from '../enums';
4
+ export const DEFAULT_ELK_LAYOUT_ENGINE_OPTIONS = {
5
+ direction: EFLayoutDirection.TOP_BOTTOM,
6
+ nodeGap: 48,
7
+ layerGap: 48,
8
+ algorithm: EElkLayoutAlgorithm.LAYERED,
9
+ defaultNodeSize: SizeExtensions.initialize(120, 72),
10
+ layoutOptions: {},
11
+ };
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC1lbGstbGF5b3V0LWVuZ2luZS1vcHRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9mLWxheW91dC9lbGsvc3JjL2xpYi9jb25maWd1cmF0aW9ucy9kZWZhdWx0LWVsay1sYXlvdXQtZW5naW5lLW9wdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUM1QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDakQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRy9DLE1BQU0sQ0FBQyxNQUFNLGlDQUFpQyxHQUE0QjtJQUN4RSxTQUFTLEVBQUUsaUJBQWlCLENBQUMsVUFBVTtJQUN2QyxPQUFPLEVBQUUsRUFBRTtJQUNYLFFBQVEsRUFBRSxFQUFFO0lBQ1osU0FBUyxFQUFFLG1CQUFtQixDQUFDLE9BQU87SUFDdEMsZUFBZSxFQUFFLGNBQWMsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQztJQUNuRCxhQUFhLEVBQUUsRUFBRTtDQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2l6ZUV4dGVuc2lvbnMgfSBmcm9tICdAZm9ibGV4LzJkJztcbmltcG9ydCB7IEVGTGF5b3V0RGlyZWN0aW9uIH0gZnJvbSAnQGZvYmxleC9mbG93JztcbmltcG9ydCB7IEVFbGtMYXlvdXRBbGdvcml0aG0gfSBmcm9tICcuLi9lbnVtcyc7XG5pbXBvcnQgeyBJRWxrTGF5b3V0RW5naW5lT3B0aW9ucyB9IGZyb20gJy4uL21vZGVscyc7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0VMS19MQVlPVVRfRU5HSU5FX09QVElPTlM6IElFbGtMYXlvdXRFbmdpbmVPcHRpb25zID0ge1xuICBkaXJlY3Rpb246IEVGTGF5b3V0RGlyZWN0aW9uLlRPUF9CT1RUT00sXG4gIG5vZGVHYXA6IDQ4LFxuICBsYXllckdhcDogNDgsXG4gIGFsZ29yaXRobTogRUVsa0xheW91dEFsZ29yaXRobS5MQVlFUkVELFxuICBkZWZhdWx0Tm9kZVNpemU6IFNpemVFeHRlbnNpb25zLmluaXRpYWxpemUoMTIwLCA3MiksXG4gIGxheW91dE9wdGlvbnM6IHt9LFxufTtcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export * from './default-elk-layout-engine-options';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2YtbGF5b3V0L2Vsay9zcmMvbGliL2NvbmZpZ3VyYXRpb25zL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMscUNBQXFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2RlZmF1bHQtZWxrLWxheW91dC1lbmdpbmUtb3B0aW9ucyc7XG4iXX0=
@@ -0,0 +1,149 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { PointExtensions, SizeExtensions } from '@foblex/2d';
3
+ import { EFLayoutDirection, FLayoutEngine, mergeLayoutNodes, } from '@foblex/flow';
4
+ import { DEFAULT_ELK_LAYOUT_ENGINE_OPTIONS } from '../configurations';
5
+ import { EElkLayoutAlgorithm } from '../enums';
6
+ import * as i0 from "@angular/core";
7
+ export class ElkLayoutEngine extends FLayoutEngine {
8
+ _elkCtor;
9
+ constructor() {
10
+ super(DEFAULT_ELK_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
+ layoutOptions: {
20
+ ...(currentOptions.layoutOptions || {}),
21
+ ...(nextOptions.layoutOptions || {}),
22
+ },
23
+ };
24
+ }
25
+ async calculate(nodes, connections, options) {
26
+ const layoutOptions = this.resolveLayoutOptions(options);
27
+ const elkModule = await this._loadElk();
28
+ const layout = (await new elkModule.default().layout(this._buildLayoutConfiguration(nodes, connections, layoutOptions)));
29
+ const positions = new Map();
30
+ layout.children?.forEach((node) => {
31
+ positions.set(node.id, PointExtensions.initialize(node.x, node.y));
32
+ });
33
+ return {
34
+ nodes: mergeLayoutNodes(nodes, positions),
35
+ };
36
+ }
37
+ _buildLayoutConfiguration(nodes, connections, options) {
38
+ const layoutOptions = {
39
+ 'elk.algorithm': this._mapAlgorithm(options.algorithm),
40
+ 'elk.direction': this._mapDirection(options.direction),
41
+ 'spacing.nodeNode': `${options.nodeGap}`,
42
+ 'spacing.nodeNodeBetweenLayers': `${options.layerGap}`,
43
+ ...(options.layoutOptions || {}),
44
+ };
45
+ const graphNodes = nodes.map((node) => this._buildGraphNode(node, options.defaultNodeSize));
46
+ const graphEdges = connections.reduce((result, connection, index) => {
47
+ if (!graphNodes.some((node) => node.id === connection.source)) {
48
+ return result;
49
+ }
50
+ if (!graphNodes.some((node) => node.id === connection.target)) {
51
+ return result;
52
+ }
53
+ result.push({
54
+ id: this._createEdgeId(connection, index),
55
+ sources: [connection.source],
56
+ targets: [connection.target],
57
+ });
58
+ return result;
59
+ }, []);
60
+ return {
61
+ id: 'root',
62
+ layoutOptions,
63
+ children: graphNodes,
64
+ edges: graphEdges,
65
+ };
66
+ }
67
+ _buildGraphNode(node, defaultNodeSize) {
68
+ const size = node.size ?? defaultNodeSize;
69
+ const graphNode = {
70
+ id: node.id,
71
+ width: size.width,
72
+ height: size.height,
73
+ };
74
+ const position = this._getNodePosition(node);
75
+ if (!position) {
76
+ return graphNode;
77
+ }
78
+ return {
79
+ ...graphNode,
80
+ x: position.x,
81
+ y: position.y,
82
+ };
83
+ }
84
+ _loadElk() {
85
+ if (!this._elkCtor) {
86
+ this._elkCtor = import('elkjs/lib/elk.bundled');
87
+ }
88
+ return this._elkCtor;
89
+ }
90
+ _getNodePosition(node) {
91
+ const positionedNode = node;
92
+ if (!positionedNode.position) {
93
+ return null;
94
+ }
95
+ return positionedNode.position;
96
+ }
97
+ _mapAlgorithm(algorithm) {
98
+ switch (algorithm) {
99
+ case EElkLayoutAlgorithm.FIXED:
100
+ return 'fixed';
101
+ case EElkLayoutAlgorithm.BOX:
102
+ return 'box';
103
+ case EElkLayoutAlgorithm.RANDOM:
104
+ return 'random';
105
+ case EElkLayoutAlgorithm.LAYERED:
106
+ return 'layered';
107
+ case EElkLayoutAlgorithm.STRESS:
108
+ return 'stress';
109
+ case EElkLayoutAlgorithm.MRTREE:
110
+ return 'mrtree';
111
+ case EElkLayoutAlgorithm.RADIAL:
112
+ return 'radial';
113
+ case EElkLayoutAlgorithm.FORCE:
114
+ return 'force';
115
+ case EElkLayoutAlgorithm.DISCO:
116
+ return 'disco';
117
+ case EElkLayoutAlgorithm.SPORE_OVERLAP:
118
+ return 'sporeOverlap';
119
+ case EElkLayoutAlgorithm.SPORE_COMPACTION:
120
+ return 'sporeCompaction';
121
+ case EElkLayoutAlgorithm.RECT_PACKING:
122
+ return 'rectpacking';
123
+ default:
124
+ return 'layered';
125
+ }
126
+ }
127
+ _createEdgeId(connection, index) {
128
+ return `${connection.source}->${connection.target}-${index}`;
129
+ }
130
+ _mapDirection(direction) {
131
+ switch (direction) {
132
+ case EFLayoutDirection.BOTTOM_TOP:
133
+ return 'UP';
134
+ case EFLayoutDirection.LEFT_RIGHT:
135
+ return 'RIGHT';
136
+ case EFLayoutDirection.RIGHT_LEFT:
137
+ return 'LEFT';
138
+ case EFLayoutDirection.TOP_BOTTOM:
139
+ default:
140
+ return 'DOWN';
141
+ }
142
+ }
143
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ElkLayoutEngine, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
144
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ElkLayoutEngine });
145
+ }
146
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ElkLayoutEngine, decorators: [{
147
+ type: Injectable
148
+ }], ctorParameters: () => [] });
149
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxrLWxheW91dC1lbmdpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2YtbGF5b3V0L2Vsay9zcmMvbGliL2VuZ2luZXMvZWxrLWxheW91dC1lbmdpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQVUsZUFBZSxFQUFFLGNBQWMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNyRSxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLGFBQWEsRUFLYixnQkFBZ0IsR0FDakIsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDdEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sVUFBVSxDQUFDOztBQVUvQyxNQUFNLE9BQU8sZUFBZ0IsU0FBUSxhQUFzQztJQUNqRSxRQUFRLENBQTZCO0lBRTdDO1FBQ0UsS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVrQixZQUFZLENBQzdCLGNBQXVDLEVBQ3ZDLGNBQWdELEVBQUU7UUFFbEQsT0FBTztZQUNMLEdBQUcsY0FBYztZQUNqQixHQUFHLFdBQVc7WUFDZCxlQUFlLEVBQUUsV0FBVyxDQUFDLGVBQWU7Z0JBQzFDLENBQUMsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUN2QixXQUFXLENBQUMsZUFBZSxDQUFDLEtBQUssRUFDakMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQ25DO2dCQUNILENBQUMsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUN2QixjQUFjLENBQUMsZUFBZSxDQUFDLEtBQUssRUFDcEMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQ3RDO1lBQ0wsYUFBYSxFQUFFO2dCQUNiLEdBQUcsQ0FBQyxjQUFjLENBQUMsYUFBYSxJQUFJLEVBQUUsQ0FBQztnQkFDdkMsR0FBRyxDQUFD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QUFLLGlCQUFpQixDQUFDLFVBQVUsQ0FBQztZQUNsQztnQkFDRSxPQUFPLE1BQU0sQ0FBQztRQUNsQixDQUFDO0lBQ0gsQ0FBQzt3R0F2TFUsZUFBZTs0R0FBZixlQUFlOzs0RkFBZixlQUFlO2tCQUQzQixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSVBvaW50LCBQb2ludEV4dGVuc2lvbnMsIFNpemVFeHRlbnNpb25zIH0gZnJvbSAnQGZvYmxleC8yZCc7XG5pbXBvcnQge1xuICBFRkxheW91dERpcmVjdGlvbixcbiAgRkxheW91dEVuZ2luZSxcbiAgSUZMYXlvdXRDYWxjdWxhdGlvbk9wdGlvbnMsXG4gIElGTGF5b3V0Q29ubmVjdGlvbixcbiAgSUZMYXlvdXROb2RlLFxuICBJRkxheW91dFJlc3VsdCxcbiAgbWVyZ2VMYXlvdXROb2Rlcyxcbn0gZnJvbSAnQGZvYmxleC9mbG93JztcbmltcG9ydCB7IERFRkFVTFRfRUxLX0xBWU9VVF9FTkdJTkVfT1BUSU9OUyB9IGZyb20gJy4uL2NvbmZpZ3VyYXRpb25zJztcbmltcG9ydCB7IEVFbGtMYXlvdXRBbGdvcml0aG0gfSBmcm9tICcuLi9lbnVtcyc7XG5pbXBvcnQge1xuICBJRWxrTGF5b3V0RWRnZSxcbiAgSUVsa0xheW91dEVuZ2luZU9wdGlvbnMsXG4gIElFbGtMYXlvdXRNb2R1bGUsXG4gIElFbGtMYXlvdXROb2RlLFxuICBJRWxrTGF5b3V0UmVzcG9uc2UsXG59IGZyb20gJy4uL21vZGVscyc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBFbGtMYXlvdXRFbmdpbmUgZXh0ZW5kcyBGTGF5b3V0RW5naW5lPElFbGtMYXlvdXRFbmdpbmVPcHRpb25zPiB7XG4gIHByaXZhdGUgX2Vsa0N0b3I/OiBQcm9taXNlPElFbGtMYXlvdXRNb2R1bGU+O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihERUZBVUxUX0VMS19MQVlPVVRfRU5HSU5FX09QVElPTlMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIG1lcmdlT3B0aW9ucyhcbiAgICBjdXJyZW50T3B0aW9uczogSUVsa0xheW91dEVuZ2luZU9wdGlvbnMsXG4gICAgbmV4dE9wdGlvbnM6IFBhcnRpYWw8SUVsa0xheW91dEVuZ2luZU9wdGlvbnM+ID0ge30sXG4gICk6IElFbGtMYXlvdXRFbmdpbmVPcHRpb25zIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uY3VycmVudE9wdGlvbnMsXG4gICAgICAuLi5uZXh0T3B0aW9ucyxcbiAgICAgIGRlZmF1bHROb2RlU2l6ZTogbmV4dE9wdGlvbnMuZGVmYXVsdE5vZGVTaXplXG4gICAgICAgID8gU2l6ZUV4dGVuc2lvbnMuaW5pdGlhbGl6ZShcbiAgICAgICAgICAgIG5leHRPcHRpb25zLmRlZmF1bHROb2RlU2l6ZS53aWR0aCxcbiAgICAgICAgICAgIG5leHRPcHRpb25zLmRlZmF1bHROb2RlU2l6ZS5oZWlnaHQsXG4gICAgICAgICAgKVxuICAgICAgICA6IFNpemVFeHRlbnNpb25zLmluaXRpYWxpemUoXG4gICAgICAgICAgICBjdXJyZW50T3B0aW9ucy5kZWZhdWx0Tm9kZVNpemUud2lkdGgsXG4gICAgICAgICAgICBjdXJyZW50T3B0aW9ucy5kZWZhdWx0Tm9kZVNpemUuaGVpZ2h0LFxuICAgICAgICAgICksXG4gICAgICBsYXlvdXRPcHRpb25zOiB7XG4gICAgICAgIC4uLihjdXJyZW50T3B0aW9ucy5sYXlvdXRPcHRpb25zIHx8IHt9KSxcbiAgICAgICAgLi4uKG5leHRPcHRpb25zLmxheW91dE9wdGlvbnMgfHwge30pLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGFzeW5jIGNhbGN1bGF0ZShcbiAgICBub2RlczogSUZMYXlvdXROb2RlW10sXG4gICAgY29ubmVjdGlvbnM6IElGTGF5b3V0Q29ubmVjdGlvbltdLFxuICAgIG9wdGlvbnM/OiBJRkxheW91dENhbGN1bGF0aW9uT3B0aW9uczxJRWxrTGF5b3V0RW5naW5lT3B0aW9ucz4sXG4gICk6IFByb21pc2U8SUZMYXlvdXRSZXN1bHQ+IHtcbiAgICBjb25zdCBsYXlvdXRPcHRpb25zID0gdGhpcy5yZXNvbHZlTGF5b3V0T3B0aW9ucyhvcHRpb25zKTtcbiAgICBjb25zdCBlbGtNb2R1bGUgPSBhd2FpdCB0aGlzLl9sb2FkRWxrKCk7XG4gICAgY29uc3QgbGF5b3V0ID0gKGF3YWl0IG5ldyBlbGtNb2R1bGUuZGVmYXVsdCgpLmxheW91dChcbiAgICAgIHRoaXMuX2J1aWxkTGF5b3V0Q29uZmlndXJhdGlvbihub2RlcywgY29ubmVjdGlvbnMsIGxheW91dE9wdGlvbnMpLFxuICAgICkpIGFzIElFbGtMYXlvdXRSZXNwb25zZTtcbiAgICBjb25zdCBwb3NpdGlvbnMgPSBuZXcgTWFwPHN0cmluZywgSVBvaW50PigpO1xuXG4gICAgbGF5b3V0LmNoaWxkcmVuPy5mb3JFYWNoKChub2RlKSA9PiB7XG4gICAgICBwb3NpdGlvbnMuc2V0KG5vZGUuaWQsIFBvaW50RXh0ZW5zaW9ucy5pbml0aWFsaXplKG5vZGUueCwgbm9kZS55KSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbm9kZXM6IG1lcmdlTGF5b3V0Tm9kZXMobm9kZXMsIHBvc2l0aW9ucyksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX2J1aWxkTGF5b3V0Q29uZmlndXJhdGlvbihcbiAgICBub2RlczogSUZMYXlvdXROb2RlW10sXG4gICAgY29ubmVjdGlvbnM6IElGTGF5b3V0Q29ubmVjdGlvbltdLFxuICAgIG9wdGlvbnM6IElFbGtMYXlvdXRFbmdpbmVPcHRpb25zLFxuICApOiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBsYXlvdXRPcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIGNoaWxkcmVuOiBJRWxrTGF5b3V0Tm9kZVtdO1xuICAgIGVkZ2VzOiBJRWxrTGF5b3V0RWRnZVtdO1xuICB9IHtcbiAgICBjb25zdCBsYXlvdXRPcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgJ2Vsay5hbGdvcml0aG0nOiB0aGlzLl9tYXBBbGdvcml0aG0ob3B0aW9ucy5hbGdvcml0aG0pLFxuICAgICAgJ2Vsay5kaXJlY3Rpb24nOiB0aGlzLl9tYXBEaXJlY3Rpb24ob3B0aW9ucy5kaXJlY3Rpb24pLFxuICAgICAgJ3NwYWNpbmcubm9kZU5vZGUnOiBgJHtvcHRpb25zLm5vZGVHYXB9YCxcbiAgICAgICdzcGFjaW5nLm5vZGVOb2RlQmV0d2VlbkxheWVycyc6IGAke29wdGlvbnMubGF5ZXJHYXB9YCxcbiAgICAgIC4uLihvcHRpb25zLmxheW91dE9wdGlvbnMgfHwge30pLFxuICAgIH07XG4gICAgY29uc3QgZ3JhcGhOb2RlcyA9IG5vZGVzLm1hcCgobm9kZSkgPT4gdGhpcy5fYnVpbGRHcmFwaE5vZGUobm9kZSwgb3B0aW9ucy5kZWZhdWx0Tm9kZVNpemUpKTtcbiAgICBjb25zdCBncmFwaEVkZ2VzID0gY29ubmVjdGlvbnMucmVkdWNlPElFbGtMYXlvdXRFZGdlW10+KChyZXN1bHQsIGNvbm5lY3Rpb24sIGluZGV4KSA9PiB7XG4gICAgICBpZiAoIWdyYXBoTm9kZXMuc29tZSgobm9kZSkgPT4gbm9kZS5pZCA9PT0gY29ubmVjdGlvbi5zb3VyY2UpKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIGlmICghZ3JhcGhOb2Rlcy5zb21lKChub2RlKSA9PiBub2RlLmlkID09PSBjb25uZWN0aW9uLnRhcmdldCkpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICBpZDogdGhpcy5fY3JlYXRlRWRnZUlkKGNvbm5lY3Rpb24sIGluZGV4KSxcbiAgICAgICAgc291cmNlczogW2Nvbm5lY3Rpb24uc291cmNlXSxcbiAgICAgICAgdGFyZ2V0czogW2Nvbm5lY3Rpb24udGFyZ2V0XSxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sIFtdKTtcblxuICAgIHJldHVybiB7XG4gICAgICBpZDogJ3Jvb3QnLFxuICAgICAgbGF5b3V0T3B0aW9ucyxcbiAgICAgIGNoaWxkcmVuOiBncmFwaE5vZGVzLFxuICAgICAgZWRnZXM6IGdyYXBoRWRnZXMsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX2J1aWxkR3JhcGhOb2RlKFxuICAgIG5vZGU6IElGTGF5b3V0Tm9kZSxcbiAgICBkZWZhdWx0Tm9kZVNpemU6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSxcbiAgKTogSUVsa0xheW91dE5vZGUge1xuICAgIGNvbnN0IHNpemUgPSBub2RlLnNpemUgPz8gZGVmYXVsdE5vZGVTaXplO1xuICAgIGNvbnN0IGdyYXBoTm9kZTogSUVsa0xheW91dE5vZGUgPSB7XG4gICAgICBpZDogbm9kZS5pZCxcbiAgICAgIHdpZHRoOiBzaXplLndpZHRoLFxuICAgICAgaGVpZ2h0OiBzaXplLmhlaWdodCxcbiAgICB9O1xuICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5fZ2V0Tm9kZVBvc2l0aW9uKG5vZGUpO1xuXG4gICAgaWYgKCFwb3NpdGlvbikge1xuICAgICAgcmV0dXJuIGdyYXBoTm9kZTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uZ3JhcGhOb2RlLFxuICAgICAgeDogcG9zaXRpb24ueCxcbiAgICAgIHk6IHBvc2l0aW9uLnksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX2xvYWRFbGsoKTogUHJvbWlzZTxJRWxrTGF5b3V0TW9kdWxlPiB7XG4gICAgaWYgKCF0aGlzLl9lbGtDdG9yKSB7XG4gICAgICB0aGlzLl9lbGtDdG9yID0gaW1wb3J0KCdlbGtqcy9saWIvZWxrLmJ1bmRsZWQnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fZWxrQ3RvcjtcbiAgfVxuXG4gIHByaXZhdGUgX2dldE5vZGVQb3NpdGlvbihub2RlOiBJRkxheW91dE5vZGUpOiBJUG9pbnQgfCBudWxsIHtcbiAgICBjb25zdCBwb3NpdGlvbmVkTm9kZSA9IG5vZGUgYXMgSUZMYXlvdXROb2RlICYgeyBwb3NpdGlvbj86IElQb2ludCB9O1xuXG4gICAgaWYgKCFwb3NpdGlvbmVkTm9kZS5wb3NpdGlvbikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBvc2l0aW9uZWROb2RlLnBvc2l0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBfbWFwQWxnb3JpdGhtKGFsZ29yaXRobTogRUVsa0xheW91dEFsZ29yaXRobSk6IHN0cmluZyB7XG4gICAgc3dpdGNoIChhbGdvcml0aG0pIHtcbiAgICAgIGNhc2UgRUVsa0xheW91dEFsZ29yaXRobS5GSVhFRDpcbiAgICAgICAgcmV0dXJuICdmaXhlZCc7XG4gICAgICBjYXNlIEVFbGtMYXlvdXRBbGdvcml0aG0uQk9YOlxuICAgICAgICByZXR1cm4gJ2JveCc7XG4gICAgICBjYXNlIEVFbGtMYXlvdXRBbGdvcml0aG0uUkFORE9NOlxuICAgICAgICByZXR1cm4gJ3JhbmRvbSc7XG4gICAgICBjYXNlIEVFbGtMYXlvdXRBbGdvcml0aG0uTEFZRVJFRDpcbiAgICAgICAgcmV0dXJuICdsYXllcmVkJztcbiAgICAgIGNhc2UgRUVsa0xheW91dEFsZ29yaXRobS5TVFJFU1M6XG4gICAgICAgIHJldHVybiAnc3RyZXNzJztcbiAgICAgIGNhc2UgRUVsa0xheW91dEFsZ29yaXRobS5NUlRSRUU6XG4gICAgICAgIHJldHVybiAnbXJ0cmVlJztcbiAgICAgIGNhc2UgRUVsa0xheW91dEFsZ29yaXRobS5SQURJQUw6XG4gICAgICAgIHJldHVybiAncmFkaWFsJztcbiAgICAgIGNhc2UgRUVsa0xheW91dEFsZ29yaXRobS5GT1JDRTpcbiAgICAgICAgcmV0dXJuICdmb3JjZSc7XG4gICAgICBjYXNlIEVFbGtMYXlvdXRBbGdvcml0aG0uRElTQ086XG4gICAgICAgIHJldHVybiAnZGlzY28nO1xuICAgICAgY2FzZSBFRWxrTGF5b3V0QWxnb3JpdGhtLlNQT1JFX09WRVJMQVA6XG4gICAgICAgIHJldHVybiAnc3BvcmVPdmVybGFwJztcbiAgICAgIGNhc2UgRUVsa0xheW91dEFsZ29yaXRobS5TUE9SRV9DT01QQUNUSU9OOlxuICAgICAgICByZXR1cm4gJ3Nwb3JlQ29tcGFjdGlvbic7XG4gICAgICBjYXNlIEVFbGtMYXlvdXRBbGdvcml0aG0uUkVDVF9QQUNLSU5HOlxuICAgICAgICByZXR1cm4gJ3JlY3RwYWNraW5nJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnbGF5ZXJlZCc7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfY3JlYXRlRWRnZUlkKGNvbm5lY3Rpb246IElGTGF5b3V0Q29ubmVjdGlvbiwgaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke2Nvbm5lY3Rpb24uc291cmNlfS0+JHtjb25uZWN0aW9uLnRhcmdldH0tJHtpbmRleH1gO1xuICB9XG5cbiAgcHJpdmF0ZSBfbWFwRGlyZWN0aW9uKGRpcmVjdGlvbjogRUZMYXlvdXREaXJlY3Rpb24pOiAnRE9XTicgfCAnVVAnIHwgJ1JJR0hUJyB8ICdMRUZUJyB7XG4gICAgc3dpdGNoIChkaXJlY3Rpb24pIHtcbiAgICAgIGNhc2UgRUZMYXlvdXREaXJlY3Rpb24uQk9UVE9NX1RPUDpcbiAgICAgICAgcmV0dXJuICdVUCc7XG4gICAgICBjYXNlIEVGTGF5b3V0RGlyZWN0aW9uLkxFRlRfUklHSFQ6XG4gICAgICAgIHJldHVybiAnUklHSFQnO1xuICAgICAgY2FzZSBFRkxheW91dERpcmVjdGlvbi5SSUdIVF9MRUZUOlxuICAgICAgICByZXR1cm4gJ0xFRlQnO1xuICAgICAgY2FzZSBFRkxheW91dERpcmVjdGlvbi5UT1BfQk9UVE9NOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICdET1dOJztcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export * from './elk-layout-engine';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2YtbGF5b3V0L2Vsay9zcmMvbGliL2VuZ2luZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxxQkFBcUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vZWxrLWxheW91dC1lbmdpbmUnO1xuIl19
@@ -0,0 +1,16 @@
1
+ export var EElkLayoutAlgorithm;
2
+ (function (EElkLayoutAlgorithm) {
3
+ EElkLayoutAlgorithm["FIXED"] = "fixed";
4
+ EElkLayoutAlgorithm["BOX"] = "box";
5
+ EElkLayoutAlgorithm["RANDOM"] = "random";
6
+ EElkLayoutAlgorithm["LAYERED"] = "layered";
7
+ EElkLayoutAlgorithm["STRESS"] = "stress";
8
+ EElkLayoutAlgorithm["MRTREE"] = "mrtree";
9
+ EElkLayoutAlgorithm["RADIAL"] = "radial";
10
+ EElkLayoutAlgorithm["FORCE"] = "force";
11
+ EElkLayoutAlgorithm["DISCO"] = "disco";
12
+ EElkLayoutAlgorithm["SPORE_OVERLAP"] = "sporeOverlap";
13
+ EElkLayoutAlgorithm["SPORE_COMPACTION"] = "sporeCompaction";
14
+ EElkLayoutAlgorithm["RECT_PACKING"] = "rectpacking";
15
+ })(EElkLayoutAlgorithm || (EElkLayoutAlgorithm = {}));
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZS1lbGstbGF5b3V0LWFsZ29yaXRobS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvZi1sYXlvdXQvZWxrL3NyYy9saWIvZW51bXMvZS1lbGstbGF5b3V0LWFsZ29yaXRobS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQU4sSUFBWSxtQkFhWDtBQWJELFdBQVksbUJBQW1CO0lBQzdCLHNDQUFlLENBQUE7SUFDZixrQ0FBVyxDQUFBO0lBQ1gsd0NBQWlCLENBQUE7SUFDakIsMENBQW1CLENBQUE7SUFDbkIsd0NBQWlCLENBQUE7SUFDakIsd0NBQWlCLENBQUE7SUFDakIsd0NBQWlCLENBQUE7SUFDakIsc0NBQWUsQ0FBQTtJQUNmLHNDQUFlLENBQUE7SUFDZixxREFBOEIsQ0FBQTtJQUM5QiwyREFBb0MsQ0FBQTtJQUNwQyxtREFBNEIsQ0FBQTtBQUM5QixDQUFDLEVBYlcsbUJBQW1CLEtBQW5CLG1CQUFtQixRQWE5QiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBlbnVtIEVFbGtMYXlvdXRBbGdvcml0aG0ge1xuICBGSVhFRCA9ICdmaXhlZCcsXG4gIEJPWCA9ICdib3gnLFxuICBSQU5ET00gPSAncmFuZG9tJyxcbiAgTEFZRVJFRCA9ICdsYXllcmVkJyxcbiAgU1RSRVNTID0gJ3N0cmVzcycsXG4gIE1SVFJFRSA9ICdtcnRyZWUnLFxuICBSQURJQUwgPSAncmFkaWFsJyxcbiAgRk9SQ0UgPSAnZm9yY2UnLFxuICBESVNDTyA9ICdkaXNjbycsXG4gIFNQT1JFX09WRVJMQVAgPSAnc3BvcmVPdmVybGFwJyxcbiAgU1BPUkVfQ09NUEFDVElPTiA9ICdzcG9yZUNvbXBhY3Rpb24nLFxuICBSRUNUX1BBQ0tJTkcgPSAncmVjdHBhY2tpbmcnLFxufVxuIl19
@@ -0,0 +1,2 @@
1
+ export * from './e-elk-layout-algorithm';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2YtbGF5b3V0L2Vsay9zcmMvbGliL2VudW1zL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsMEJBQTBCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2UtZWxrLWxheW91dC1hbGdvcml0aG0nO1xuIl19
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzL2YtbGF5b3V0L2Vsay9zcmMvbGliL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyxXQUFXLENBQUM7QUFDMUIsY0FBYyxTQUFTLENBQUM7QUFDeEIsY0FBYyxVQUFVLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2NvbmZpZ3VyYXRpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vZW5naW5lcyc7XG5leHBvcnQgKiBmcm9tICcuL2VudW1zJztcbmV4cG9ydCAqIGZyb20gJy4vbW9kZWxzJztcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaS1lbGstbGF5b3V0LWVkZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2YtbGF5b3V0L2Vsay9zcmMvbGliL21vZGVscy9pLWVsay1sYXlvdXQtZWRnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBJRWxrTGF5b3V0RWRnZSB7XG4gIGlkOiBzdHJpbmc7XG4gIHNvdXJjZXM6IHN0cmluZ1tdO1xuICB0YXJnZXRzOiBzdHJpbmdbXTtcbn1cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaS1lbGstbGF5b3V0LWVuZ2luZS1vcHRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9mLWxheW91dC9lbGsvc3JjL2xpYi9tb2RlbHMvaS1lbGstbGF5b3V0LWVuZ2luZS1vcHRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJRkxheW91dEFsZ29yaXRobU9wdGlvbnMgfSBmcm9tICdAZm9ibGV4L2Zsb3cnO1xuaW1wb3J0IHsgRUVsa0xheW91dEFsZ29yaXRobSB9IGZyb20gJy4uL2VudW1zJztcblxuZXhwb3J0IGludGVyZmFjZSBJRWxrTGF5b3V0RW5naW5lT3B0aW9ucyBleHRlbmRzIElGTGF5b3V0QWxnb3JpdGhtT3B0aW9uczxFRWxrTGF5b3V0QWxnb3JpdGhtPiB7XG4gIGxheW91dE9wdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xufVxuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaS1lbGstbGF5b3V0LWluc3RhbmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9mLWxheW91dC9lbGsvc3JjL2xpYi9tb2RlbHMvaS1lbGstbGF5b3V0LWluc3RhbmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIElFbGtMYXlvdXRJbnN0YW5jZSB7XG4gIGxheW91dChjb25maWc6IHVua25vd24pOiBQcm9taXNlPHVua25vd24+O1xufVxuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaS1lbGstbGF5b3V0LW1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvZi1sYXlvdXQvZWxrL3NyYy9saWIvbW9kZWxzL2ktZWxrLWxheW91dC1tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElFbGtMYXlvdXRJbnN0YW5jZSB9IGZyb20gJy4vaS1lbGstbGF5b3V0LWluc3RhbmNlJztcblxuZXhwb3J0IGludGVyZmFjZSBJRWxrTGF5b3V0TW9kdWxlIHtcbiAgZGVmYXVsdDogbmV3ICgpID0+IElFbGtMYXlvdXRJbnN0YW5jZTtcbn1cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaS1lbGstbGF5b3V0LW5vZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2YtbGF5b3V0L2Vsay9zcmMvbGliL21vZGVscy9pLWVsay1sYXlvdXQtbm9kZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBJRWxrTGF5b3V0Tm9kZSB7XG4gIGlkOiBzdHJpbmc7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xuICB4PzogbnVtYmVyO1xuICB5PzogbnVtYmVyO1xufVxuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaS1lbGstbGF5b3V0LXBvc2l0aW9uZWQtbm9kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvZi1sYXlvdXQvZWxrL3NyYy9saWIvbW9kZWxzL2ktZWxrLWxheW91dC1wb3NpdGlvbmVkLW5vZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElQb2ludCB9IGZyb20gJ0Bmb2JsZXgvMmQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElFbGtMYXlvdXRQb3NpdGlvbmVkTm9kZSBleHRlbmRzIElQb2ludCB7XG4gIGlkOiBzdHJpbmc7XG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaS1lbGstbGF5b3V0LXJlc3BvbnNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9mLWxheW91dC9lbGsvc3JjL2xpYi9tb2RlbHMvaS1lbGstbGF5b3V0LXJlc3BvbnNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJRWxrTGF5b3V0UG9zaXRpb25lZE5vZGUgfSBmcm9tICcuL2ktZWxrLWxheW91dC1wb3NpdGlvbmVkLW5vZGUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElFbGtMYXlvdXRSZXNwb25zZSB7XG4gIGNoaWxkcmVuPzogSUVsa0xheW91dFBvc2l0aW9uZWROb2RlW107XG59XG4iXX0=
@@ -0,0 +1,8 @@
1
+ export * from './i-elk-layout-edge';
2
+ export * from './i-elk-layout-engine-options';
3
+ export * from './i-elk-layout-instance';
4
+ export * from './i-elk-layout-module';
5
+ export * from './i-elk-layout-node';
6
+ export * from './i-elk-layout-positioned-node';
7
+ export * from './i-elk-layout-response';
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2YtbGF5b3V0L2Vsay9zcmMvbGliL21vZGVscy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsK0JBQStCLENBQUM7QUFDOUMsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxnQ0FBZ0MsQ0FBQztBQUMvQyxjQUFjLHlCQUF5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9pLWVsay1sYXlvdXQtZWRnZSc7XG5leHBvcnQgKiBmcm9tICcuL2ktZWxrLWxheW91dC1lbmdpbmUtb3B0aW9ucyc7XG5leHBvcnQgKiBmcm9tICcuL2ktZWxrLWxheW91dC1pbnN0YW5jZSc7XG5leHBvcnQgKiBmcm9tICcuL2ktZWxrLWxheW91dC1tb2R1bGUnO1xuZXhwb3J0ICogZnJvbSAnLi9pLWVsay1sYXlvdXQtbm9kZSc7XG5leHBvcnQgKiBmcm9tICcuL2ktZWxrLWxheW91dC1wb3NpdGlvbmVkLW5vZGUnO1xuZXhwb3J0ICogZnJvbSAnLi9pLWVsay1sYXlvdXQtcmVzcG9uc2UnO1xuIl19
@@ -0,0 +1,2 @@
1
+ export * from './lib';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYnMvZi1sYXlvdXQvZWxrL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsT0FBTyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9saWInO1xuIl19
@@ -0,0 +1,179 @@
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
+
6
+ var EElkLayoutAlgorithm;
7
+ (function (EElkLayoutAlgorithm) {
8
+ EElkLayoutAlgorithm["FIXED"] = "fixed";
9
+ EElkLayoutAlgorithm["BOX"] = "box";
10
+ EElkLayoutAlgorithm["RANDOM"] = "random";
11
+ EElkLayoutAlgorithm["LAYERED"] = "layered";
12
+ EElkLayoutAlgorithm["STRESS"] = "stress";
13
+ EElkLayoutAlgorithm["MRTREE"] = "mrtree";
14
+ EElkLayoutAlgorithm["RADIAL"] = "radial";
15
+ EElkLayoutAlgorithm["FORCE"] = "force";
16
+ EElkLayoutAlgorithm["DISCO"] = "disco";
17
+ EElkLayoutAlgorithm["SPORE_OVERLAP"] = "sporeOverlap";
18
+ EElkLayoutAlgorithm["SPORE_COMPACTION"] = "sporeCompaction";
19
+ EElkLayoutAlgorithm["RECT_PACKING"] = "rectpacking";
20
+ })(EElkLayoutAlgorithm || (EElkLayoutAlgorithm = {}));
21
+
22
+ const DEFAULT_ELK_LAYOUT_ENGINE_OPTIONS = {
23
+ direction: EFLayoutDirection.TOP_BOTTOM,
24
+ nodeGap: 48,
25
+ layerGap: 48,
26
+ algorithm: EElkLayoutAlgorithm.LAYERED,
27
+ defaultNodeSize: SizeExtensions.initialize(120, 72),
28
+ layoutOptions: {},
29
+ };
30
+
31
+ class ElkLayoutEngine extends FLayoutEngine {
32
+ _elkCtor;
33
+ constructor() {
34
+ super(DEFAULT_ELK_LAYOUT_ENGINE_OPTIONS);
35
+ }
36
+ mergeOptions(currentOptions, nextOptions = {}) {
37
+ return {
38
+ ...currentOptions,
39
+ ...nextOptions,
40
+ defaultNodeSize: nextOptions.defaultNodeSize
41
+ ? SizeExtensions.initialize(nextOptions.defaultNodeSize.width, nextOptions.defaultNodeSize.height)
42
+ : SizeExtensions.initialize(currentOptions.defaultNodeSize.width, currentOptions.defaultNodeSize.height),
43
+ layoutOptions: {
44
+ ...(currentOptions.layoutOptions || {}),
45
+ ...(nextOptions.layoutOptions || {}),
46
+ },
47
+ };
48
+ }
49
+ async calculate(nodes, connections, options) {
50
+ const layoutOptions = this.resolveLayoutOptions(options);
51
+ const elkModule = await this._loadElk();
52
+ const layout = (await new elkModule.default().layout(this._buildLayoutConfiguration(nodes, connections, layoutOptions)));
53
+ const positions = new Map();
54
+ layout.children?.forEach((node) => {
55
+ positions.set(node.id, PointExtensions.initialize(node.x, node.y));
56
+ });
57
+ return {
58
+ nodes: mergeLayoutNodes(nodes, positions),
59
+ };
60
+ }
61
+ _buildLayoutConfiguration(nodes, connections, options) {
62
+ const layoutOptions = {
63
+ 'elk.algorithm': this._mapAlgorithm(options.algorithm),
64
+ 'elk.direction': this._mapDirection(options.direction),
65
+ 'spacing.nodeNode': `${options.nodeGap}`,
66
+ 'spacing.nodeNodeBetweenLayers': `${options.layerGap}`,
67
+ ...(options.layoutOptions || {}),
68
+ };
69
+ const graphNodes = nodes.map((node) => this._buildGraphNode(node, options.defaultNodeSize));
70
+ const graphEdges = connections.reduce((result, connection, index) => {
71
+ if (!graphNodes.some((node) => node.id === connection.source)) {
72
+ return result;
73
+ }
74
+ if (!graphNodes.some((node) => node.id === connection.target)) {
75
+ return result;
76
+ }
77
+ result.push({
78
+ id: this._createEdgeId(connection, index),
79
+ sources: [connection.source],
80
+ targets: [connection.target],
81
+ });
82
+ return result;
83
+ }, []);
84
+ return {
85
+ id: 'root',
86
+ layoutOptions,
87
+ children: graphNodes,
88
+ edges: graphEdges,
89
+ };
90
+ }
91
+ _buildGraphNode(node, defaultNodeSize) {
92
+ const size = node.size ?? defaultNodeSize;
93
+ const graphNode = {
94
+ id: node.id,
95
+ width: size.width,
96
+ height: size.height,
97
+ };
98
+ const position = this._getNodePosition(node);
99
+ if (!position) {
100
+ return graphNode;
101
+ }
102
+ return {
103
+ ...graphNode,
104
+ x: position.x,
105
+ y: position.y,
106
+ };
107
+ }
108
+ _loadElk() {
109
+ if (!this._elkCtor) {
110
+ this._elkCtor = import('elkjs/lib/elk.bundled');
111
+ }
112
+ return this._elkCtor;
113
+ }
114
+ _getNodePosition(node) {
115
+ const positionedNode = node;
116
+ if (!positionedNode.position) {
117
+ return null;
118
+ }
119
+ return positionedNode.position;
120
+ }
121
+ _mapAlgorithm(algorithm) {
122
+ switch (algorithm) {
123
+ case EElkLayoutAlgorithm.FIXED:
124
+ return 'fixed';
125
+ case EElkLayoutAlgorithm.BOX:
126
+ return 'box';
127
+ case EElkLayoutAlgorithm.RANDOM:
128
+ return 'random';
129
+ case EElkLayoutAlgorithm.LAYERED:
130
+ return 'layered';
131
+ case EElkLayoutAlgorithm.STRESS:
132
+ return 'stress';
133
+ case EElkLayoutAlgorithm.MRTREE:
134
+ return 'mrtree';
135
+ case EElkLayoutAlgorithm.RADIAL:
136
+ return 'radial';
137
+ case EElkLayoutAlgorithm.FORCE:
138
+ return 'force';
139
+ case EElkLayoutAlgorithm.DISCO:
140
+ return 'disco';
141
+ case EElkLayoutAlgorithm.SPORE_OVERLAP:
142
+ return 'sporeOverlap';
143
+ case EElkLayoutAlgorithm.SPORE_COMPACTION:
144
+ return 'sporeCompaction';
145
+ case EElkLayoutAlgorithm.RECT_PACKING:
146
+ return 'rectpacking';
147
+ default:
148
+ return 'layered';
149
+ }
150
+ }
151
+ _createEdgeId(connection, index) {
152
+ return `${connection.source}->${connection.target}-${index}`;
153
+ }
154
+ _mapDirection(direction) {
155
+ switch (direction) {
156
+ case EFLayoutDirection.BOTTOM_TOP:
157
+ return 'UP';
158
+ case EFLayoutDirection.LEFT_RIGHT:
159
+ return 'RIGHT';
160
+ case EFLayoutDirection.RIGHT_LEFT:
161
+ return 'LEFT';
162
+ case EFLayoutDirection.TOP_BOTTOM:
163
+ default:
164
+ return 'DOWN';
165
+ }
166
+ }
167
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ElkLayoutEngine, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
168
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ElkLayoutEngine });
169
+ }
170
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ElkLayoutEngine, decorators: [{
171
+ type: Injectable
172
+ }], ctorParameters: () => [] });
173
+
174
+ /**
175
+ * Generated bundle index. Do not edit.
176
+ */
177
+
178
+ export { DEFAULT_ELK_LAYOUT_ENGINE_OPTIONS, EElkLayoutAlgorithm, ElkLayoutEngine };
179
+ //# sourceMappingURL=foblex-flow-elk-layout.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"foblex-flow-elk-layout.mjs","sources":["../../../libs/f-layout/elk/src/lib/enums/e-elk-layout-algorithm.ts","../../../libs/f-layout/elk/src/lib/configurations/default-elk-layout-engine-options.ts","../../../libs/f-layout/elk/src/lib/engines/elk-layout-engine.ts","../../../libs/f-layout/elk/src/foblex-flow-elk-layout.ts"],"sourcesContent":["export enum EElkLayoutAlgorithm {\n FIXED = 'fixed',\n BOX = 'box',\n RANDOM = 'random',\n LAYERED = 'layered',\n STRESS = 'stress',\n MRTREE = 'mrtree',\n RADIAL = 'radial',\n FORCE = 'force',\n DISCO = 'disco',\n SPORE_OVERLAP = 'sporeOverlap',\n SPORE_COMPACTION = 'sporeCompaction',\n RECT_PACKING = 'rectpacking',\n}\n","import { SizeExtensions } from '@foblex/2d';\nimport { EFLayoutDirection } from '@foblex/flow';\nimport { EElkLayoutAlgorithm } from '../enums';\nimport { IElkLayoutEngineOptions } from '../models';\n\nexport const DEFAULT_ELK_LAYOUT_ENGINE_OPTIONS: IElkLayoutEngineOptions = {\n direction: EFLayoutDirection.TOP_BOTTOM,\n nodeGap: 48,\n layerGap: 48,\n algorithm: EElkLayoutAlgorithm.LAYERED,\n defaultNodeSize: SizeExtensions.initialize(120, 72),\n layoutOptions: {},\n};\n","import { Injectable } from '@angular/core';\nimport { IPoint, PointExtensions, SizeExtensions } from '@foblex/2d';\nimport {\n EFLayoutDirection,\n FLayoutEngine,\n IFLayoutCalculationOptions,\n IFLayoutConnection,\n IFLayoutNode,\n IFLayoutResult,\n mergeLayoutNodes,\n} from '@foblex/flow';\nimport { DEFAULT_ELK_LAYOUT_ENGINE_OPTIONS } from '../configurations';\nimport { EElkLayoutAlgorithm } from '../enums';\nimport {\n IElkLayoutEdge,\n IElkLayoutEngineOptions,\n IElkLayoutModule,\n IElkLayoutNode,\n IElkLayoutResponse,\n} from '../models';\n\n@Injectable()\nexport class ElkLayoutEngine extends FLayoutEngine<IElkLayoutEngineOptions> {\n private _elkCtor?: Promise<IElkLayoutModule>;\n\n public constructor() {\n super(DEFAULT_ELK_LAYOUT_ENGINE_OPTIONS);\n }\n\n protected override mergeOptions(\n currentOptions: IElkLayoutEngineOptions,\n nextOptions: Partial<IElkLayoutEngineOptions> = {},\n ): IElkLayoutEngineOptions {\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 layoutOptions: {\n ...(currentOptions.layoutOptions || {}),\n ...(nextOptions.layoutOptions || {}),\n },\n };\n }\n\n public override async calculate(\n nodes: IFLayoutNode[],\n connections: IFLayoutConnection[],\n options?: IFLayoutCalculationOptions<IElkLayoutEngineOptions>,\n ): Promise<IFLayoutResult> {\n const layoutOptions = this.resolveLayoutOptions(options);\n const elkModule = await this._loadElk();\n const layout = (await new elkModule.default().layout(\n this._buildLayoutConfiguration(nodes, connections, layoutOptions),\n )) as IElkLayoutResponse;\n const positions = new Map<string, IPoint>();\n\n layout.children?.forEach((node) => {\n positions.set(node.id, PointExtensions.initialize(node.x, node.y));\n });\n\n return {\n nodes: mergeLayoutNodes(nodes, positions),\n };\n }\n\n private _buildLayoutConfiguration(\n nodes: IFLayoutNode[],\n connections: IFLayoutConnection[],\n options: IElkLayoutEngineOptions,\n ): {\n id: string;\n layoutOptions: Record<string, string>;\n children: IElkLayoutNode[];\n edges: IElkLayoutEdge[];\n } {\n const layoutOptions: Record<string, string> = {\n 'elk.algorithm': this._mapAlgorithm(options.algorithm),\n 'elk.direction': this._mapDirection(options.direction),\n 'spacing.nodeNode': `${options.nodeGap}`,\n 'spacing.nodeNodeBetweenLayers': `${options.layerGap}`,\n ...(options.layoutOptions || {}),\n };\n const graphNodes = nodes.map((node) => this._buildGraphNode(node, options.defaultNodeSize));\n const graphEdges = connections.reduce<IElkLayoutEdge[]>((result, connection, index) => {\n if (!graphNodes.some((node) => node.id === connection.source)) {\n return result;\n }\n\n if (!graphNodes.some((node) => node.id === connection.target)) {\n return result;\n }\n\n result.push({\n id: this._createEdgeId(connection, index),\n sources: [connection.source],\n targets: [connection.target],\n });\n\n return result;\n }, []);\n\n return {\n id: 'root',\n layoutOptions,\n children: graphNodes,\n edges: graphEdges,\n };\n }\n\n private _buildGraphNode(\n node: IFLayoutNode,\n defaultNodeSize: { width: number; height: number },\n ): IElkLayoutNode {\n const size = node.size ?? defaultNodeSize;\n const graphNode: IElkLayoutNode = {\n id: node.id,\n width: size.width,\n height: size.height,\n };\n const position = this._getNodePosition(node);\n\n if (!position) {\n return graphNode;\n }\n\n return {\n ...graphNode,\n x: position.x,\n y: position.y,\n };\n }\n\n private _loadElk(): Promise<IElkLayoutModule> {\n if (!this._elkCtor) {\n this._elkCtor = import('elkjs/lib/elk.bundled');\n }\n\n return this._elkCtor;\n }\n\n private _getNodePosition(node: IFLayoutNode): IPoint | null {\n const positionedNode = node as IFLayoutNode & { position?: IPoint };\n\n if (!positionedNode.position) {\n return null;\n }\n\n return positionedNode.position;\n }\n\n private _mapAlgorithm(algorithm: EElkLayoutAlgorithm): string {\n switch (algorithm) {\n case EElkLayoutAlgorithm.FIXED:\n return 'fixed';\n case EElkLayoutAlgorithm.BOX:\n return 'box';\n case EElkLayoutAlgorithm.RANDOM:\n return 'random';\n case EElkLayoutAlgorithm.LAYERED:\n return 'layered';\n case EElkLayoutAlgorithm.STRESS:\n return 'stress';\n case EElkLayoutAlgorithm.MRTREE:\n return 'mrtree';\n case EElkLayoutAlgorithm.RADIAL:\n return 'radial';\n case EElkLayoutAlgorithm.FORCE:\n return 'force';\n case EElkLayoutAlgorithm.DISCO:\n return 'disco';\n case EElkLayoutAlgorithm.SPORE_OVERLAP:\n return 'sporeOverlap';\n case EElkLayoutAlgorithm.SPORE_COMPACTION:\n return 'sporeCompaction';\n case EElkLayoutAlgorithm.RECT_PACKING:\n return 'rectpacking';\n default:\n return 'layered';\n }\n }\n\n private _createEdgeId(connection: IFLayoutConnection, index: number): string {\n return `${connection.source}->${connection.target}-${index}`;\n }\n\n private _mapDirection(direction: EFLayoutDirection): 'DOWN' | 'UP' | 'RIGHT' | 'LEFT' {\n switch (direction) {\n case EFLayoutDirection.BOTTOM_TOP:\n return 'UP';\n case EFLayoutDirection.LEFT_RIGHT:\n return 'RIGHT';\n case EFLayoutDirection.RIGHT_LEFT:\n return 'LEFT';\n case EFLayoutDirection.TOP_BOTTOM:\n default:\n return 'DOWN';\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;IAAY,oBAaX;AAbD,CAAA,UAAY,mBAAmB,EAAA;AAC7B,IAAA,mBAAA,CAAA,OAAA,CAAA,GAAA,OAAe,CAAA;AACf,IAAA,mBAAA,CAAA,KAAA,CAAA,GAAA,KAAW,CAAA;AACX,IAAA,mBAAA,CAAA,QAAA,CAAA,GAAA,QAAiB,CAAA;AACjB,IAAA,mBAAA,CAAA,SAAA,CAAA,GAAA,SAAmB,CAAA;AACnB,IAAA,mBAAA,CAAA,QAAA,CAAA,GAAA,QAAiB,CAAA;AACjB,IAAA,mBAAA,CAAA,QAAA,CAAA,GAAA,QAAiB,CAAA;AACjB,IAAA,mBAAA,CAAA,QAAA,CAAA,GAAA,QAAiB,CAAA;AACjB,IAAA,mBAAA,CAAA,OAAA,CAAA,GAAA,OAAe,CAAA;AACf,IAAA,mBAAA,CAAA,OAAA,CAAA,GAAA,OAAe,CAAA;AACf,IAAA,mBAAA,CAAA,eAAA,CAAA,GAAA,cAA8B,CAAA;AAC9B,IAAA,mBAAA,CAAA,kBAAA,CAAA,GAAA,iBAAoC,CAAA;AACpC,IAAA,mBAAA,CAAA,cAAA,CAAA,GAAA,aAA4B,CAAA;AAC9B,CAAC,EAbW,mBAAmB,KAAnB,mBAAmB,GAa9B,EAAA,CAAA,CAAA;;ACRY,MAAA,iCAAiC,GAA4B;IACxE,SAAS,EAAE,iBAAiB,CAAC,UAAU;AACvC,IAAA,OAAO,EAAE,EAAE;AACX,IAAA,QAAQ,EAAE,EAAE;IACZ,SAAS,EAAE,mBAAmB,CAAC,OAAO;IACtC,eAAe,EAAE,cAAc,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC;AACnD,IAAA,aAAa,EAAE,EAAE;;;ACWb,MAAO,eAAgB,SAAQ,aAAsC,CAAA;AACjE,IAAA,QAAQ,CAA6B;AAE7C,IAAA,WAAA,GAAA;QACE,KAAK,CAAC,iCAAiC,CAAC,CAAC;KAC1C;AAEkB,IAAA,YAAY,CAC7B,cAAuC,EACvC,WAAA,GAAgD,EAAE,EAAA;QAElD,OAAO;AACL,YAAA,GAAG,cAAc;AACjB,YAAA,GAAG,WAAW;YACd,eAAe,EAAE,WAAW,CAAC,eAAe;AAC1C,kBAAE,cAAc,CAAC,UAAU,CACvB,WAAW,CAAC,eAAe,CAAC,KAAK,EACjC,WAAW,CAAC,eAAe,CAAC,MAAM,CACnC;AACH,kBAAE,cAAc,CAAC,UAAU,CACvB,cAAc,CAAC,eAAe,CAAC,KAAK,EACpC,cAAc,CAAC,eAAe,CAAC,MAAM,CACtC;AACL,YAAA,aAAa,EAAE;AACb,gBAAA,IAAI,cAAc,CAAC,aAAa,IAAI,EAAE,CAAC;AACvC,gBAAA,IAAI,WAAW,CAAC,aAAa,IAAI,EAAE,CAAC;AACrC,aAAA;SACF,CAAC;KACH;AAEe,IAAA,MAAM,SAAS,CAC7B,KAAqB,EACrB,WAAiC,EACjC,OAA6D,EAAA;QAE7D,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;AACzD,QAAA,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACxC,MAAM,MAAM,IAAI,MAAM,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC,MAAM,CAClD,IAAI,CAAC,yBAAyB,CAAC,KAAK,EAAE,WAAW,EAAE,aAAa,CAAC,CAClE,CAAuB,CAAC;AACzB,QAAA,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;QAE5C,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,KAAI;YAChC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,eAAe,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACrE,SAAC,CAAC,CAAC;QAEH,OAAO;AACL,YAAA,KAAK,EAAE,gBAAgB,CAAC,KAAK,EAAE,SAAS,CAAC;SAC1C,CAAC;KACH;AAEO,IAAA,yBAAyB,CAC/B,KAAqB,EACrB,WAAiC,EACjC,OAAgC,EAAA;AAOhC,QAAA,MAAM,aAAa,GAA2B;YAC5C,eAAe,EAAE,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,SAAS,CAAC;YACtD,eAAe,EAAE,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,SAAS,CAAC;AACtD,YAAA,kBAAkB,EAAE,CAAA,EAAG,OAAO,CAAC,OAAO,CAAE,CAAA;AACxC,YAAA,+BAA+B,EAAE,CAAA,EAAG,OAAO,CAAC,QAAQ,CAAE,CAAA;AACtD,YAAA,IAAI,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC;SACjC,CAAC;QACF,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC;AAC5F,QAAA,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,CAAmB,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,KAAI;AACpF,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,UAAU,CAAC,MAAM,CAAC,EAAE;AAC7D,gBAAA,OAAO,MAAM,CAAC;aACf;AAED,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,UAAU,CAAC,MAAM,CAAC,EAAE;AAC7D,gBAAA,OAAO,MAAM,CAAC;aACf;YAED,MAAM,CAAC,IAAI,CAAC;gBACV,EAAE,EAAE,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,KAAK,CAAC;AACzC,gBAAA,OAAO,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;AAC5B,gBAAA,OAAO,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;AAC7B,aAAA,CAAC,CAAC;AAEH,YAAA,OAAO,MAAM,CAAC;SACf,EAAE,EAAE,CAAC,CAAC;QAEP,OAAO;AACL,YAAA,EAAE,EAAE,MAAM;YACV,aAAa;AACb,YAAA,QAAQ,EAAE,UAAU;AACpB,YAAA,KAAK,EAAE,UAAU;SAClB,CAAC;KACH;IAEO,eAAe,CACrB,IAAkB,EAClB,eAAkD,EAAA;AAElD,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,eAAe,CAAC;AAC1C,QAAA,MAAM,SAAS,GAAmB;YAChC,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC;QACF,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAE7C,IAAI,CAAC,QAAQ,EAAE;AACb,YAAA,OAAO,SAAS,CAAC;SAClB;QAED,OAAO;AACL,YAAA,GAAG,SAAS;YACZ,CAAC,EAAE,QAAQ,CAAC,CAAC;YACb,CAAC,EAAE,QAAQ,CAAC,CAAC;SACd,CAAC;KACH;IAEO,QAAQ,GAAA;AACd,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;AAClB,YAAA,IAAI,CAAC,QAAQ,GAAG,OAAO,uBAAuB,CAAC,CAAC;SACjD;QAED,OAAO,IAAI,CAAC,QAAQ,CAAC;KACtB;AAEO,IAAA,gBAAgB,CAAC,IAAkB,EAAA;QACzC,MAAM,cAAc,GAAG,IAA4C,CAAC;AAEpE,QAAA,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE;AAC5B,YAAA,OAAO,IAAI,CAAC;SACb;QAED,OAAO,cAAc,CAAC,QAAQ,CAAC;KAChC;AAEO,IAAA,aAAa,CAAC,SAA8B,EAAA;QAClD,QAAQ,SAAS;YACf,KAAK,mBAAmB,CAAC,KAAK;AAC5B,gBAAA,OAAO,OAAO,CAAC;YACjB,KAAK,mBAAmB,CAAC,GAAG;AAC1B,gBAAA,OAAO,KAAK,CAAC;YACf,KAAK,mBAAmB,CAAC,MAAM;AAC7B,gBAAA,OAAO,QAAQ,CAAC;YAClB,KAAK,mBAAmB,CAAC,OAAO;AAC9B,gBAAA,OAAO,SAAS,CAAC;YACnB,KAAK,mBAAmB,CAAC,MAAM;AAC7B,gBAAA,OAAO,QAAQ,CAAC;YAClB,KAAK,mBAAmB,CAAC,MAAM;AAC7B,gBAAA,OAAO,QAAQ,CAAC;YAClB,KAAK,mBAAmB,CAAC,MAAM;AAC7B,gBAAA,OAAO,QAAQ,CAAC;YAClB,KAAK,mBAAmB,CAAC,KAAK;AAC5B,gBAAA,OAAO,OAAO,CAAC;YACjB,KAAK,mBAAmB,CAAC,KAAK;AAC5B,gBAAA,OAAO,OAAO,CAAC;YACjB,KAAK,mBAAmB,CAAC,aAAa;AACpC,gBAAA,OAAO,cAAc,CAAC;YACxB,KAAK,mBAAmB,CAAC,gBAAgB;AACvC,gBAAA,OAAO,iBAAiB,CAAC;YAC3B,KAAK,mBAAmB,CAAC,YAAY;AACnC,gBAAA,OAAO,aAAa,CAAC;AACvB,YAAA;AACE,gBAAA,OAAO,SAAS,CAAC;SACpB;KACF;IAEO,aAAa,CAAC,UAA8B,EAAE,KAAa,EAAA;QACjE,OAAO,CAAA,EAAG,UAAU,CAAC,MAAM,CAAA,EAAA,EAAK,UAAU,CAAC,MAAM,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,CAAC;KAC9D;AAEO,IAAA,aAAa,CAAC,SAA4B,EAAA;QAChD,QAAQ,SAAS;YACf,KAAK,iBAAiB,CAAC,UAAU;AAC/B,gBAAA,OAAO,IAAI,CAAC;YACd,KAAK,iBAAiB,CAAC,UAAU;AAC/B,gBAAA,OAAO,OAAO,CAAC;YACjB,KAAK,iBAAiB,CAAC,UAAU;AAC/B,gBAAA,OAAO,MAAM,CAAC;YAChB,KAAK,iBAAiB,CAAC,UAAU,CAAC;AAClC,YAAA;AACE,gBAAA,OAAO,MAAM,CAAC;SACjB;KACF;wGAvLU,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;4GAAf,eAAe,EAAA,CAAA,CAAA;;4FAAf,eAAe,EAAA,UAAA,EAAA,CAAA;kBAD3B,UAAU;;;ACrBX;;AAEG;;;;"}
package/index.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ /// <amd-module name="@foblex/flow-elk-layout" />
5
+ export * from './public-api';
@@ -0,0 +1,2 @@
1
+ import { IElkLayoutEngineOptions } from '../models';
2
+ export declare const DEFAULT_ELK_LAYOUT_ENGINE_OPTIONS: IElkLayoutEngineOptions;
@@ -0,0 +1 @@
1
+ export * from './default-elk-layout-engine-options';
@@ -0,0 +1,18 @@
1
+ import { FLayoutEngine, IFLayoutCalculationOptions, IFLayoutConnection, IFLayoutNode, IFLayoutResult } from '@foblex/flow';
2
+ import { IElkLayoutEngineOptions } from '../models';
3
+ import * as i0 from "@angular/core";
4
+ export declare class ElkLayoutEngine extends FLayoutEngine<IElkLayoutEngineOptions> {
5
+ private _elkCtor?;
6
+ constructor();
7
+ protected mergeOptions(currentOptions: IElkLayoutEngineOptions, nextOptions?: Partial<IElkLayoutEngineOptions>): IElkLayoutEngineOptions;
8
+ calculate(nodes: IFLayoutNode[], connections: IFLayoutConnection[], options?: IFLayoutCalculationOptions<IElkLayoutEngineOptions>): Promise<IFLayoutResult>;
9
+ private _buildLayoutConfiguration;
10
+ private _buildGraphNode;
11
+ private _loadElk;
12
+ private _getNodePosition;
13
+ private _mapAlgorithm;
14
+ private _createEdgeId;
15
+ private _mapDirection;
16
+ static ɵfac: i0.ɵɵFactoryDeclaration<ElkLayoutEngine, never>;
17
+ static ɵprov: i0.ɵɵInjectableDeclaration<ElkLayoutEngine>;
18
+ }
@@ -0,0 +1 @@
1
+ export * from './elk-layout-engine';
@@ -0,0 +1,14 @@
1
+ export declare enum EElkLayoutAlgorithm {
2
+ FIXED = "fixed",
3
+ BOX = "box",
4
+ RANDOM = "random",
5
+ LAYERED = "layered",
6
+ STRESS = "stress",
7
+ MRTREE = "mrtree",
8
+ RADIAL = "radial",
9
+ FORCE = "force",
10
+ DISCO = "disco",
11
+ SPORE_OVERLAP = "sporeOverlap",
12
+ SPORE_COMPACTION = "sporeCompaction",
13
+ RECT_PACKING = "rectpacking"
14
+ }
@@ -0,0 +1 @@
1
+ export * from './e-elk-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,5 @@
1
+ export interface IElkLayoutEdge {
2
+ id: string;
3
+ sources: string[];
4
+ targets: string[];
5
+ }
@@ -0,0 +1,5 @@
1
+ import { IFLayoutAlgorithmOptions } from '@foblex/flow';
2
+ import { EElkLayoutAlgorithm } from '../enums';
3
+ export interface IElkLayoutEngineOptions extends IFLayoutAlgorithmOptions<EElkLayoutAlgorithm> {
4
+ layoutOptions?: Record<string, string>;
5
+ }
@@ -0,0 +1,3 @@
1
+ export interface IElkLayoutInstance {
2
+ layout(config: unknown): Promise<unknown>;
3
+ }
@@ -0,0 +1,4 @@
1
+ import { IElkLayoutInstance } from './i-elk-layout-instance';
2
+ export interface IElkLayoutModule {
3
+ default: new () => IElkLayoutInstance;
4
+ }
@@ -0,0 +1,7 @@
1
+ export interface IElkLayoutNode {
2
+ id: string;
3
+ width: number;
4
+ height: number;
5
+ x?: number;
6
+ y?: number;
7
+ }
@@ -0,0 +1,4 @@
1
+ import { IPoint } from '@foblex/2d';
2
+ export interface IElkLayoutPositionedNode extends IPoint {
3
+ id: string;
4
+ }
@@ -0,0 +1,4 @@
1
+ import { IElkLayoutPositionedNode } from './i-elk-layout-positioned-node';
2
+ export interface IElkLayoutResponse {
3
+ children?: IElkLayoutPositionedNode[];
4
+ }
@@ -0,0 +1,7 @@
1
+ export * from './i-elk-layout-edge';
2
+ export * from './i-elk-layout-engine-options';
3
+ export * from './i-elk-layout-instance';
4
+ export * from './i-elk-layout-module';
5
+ export * from './i-elk-layout-node';
6
+ export * from './i-elk-layout-positioned-node';
7
+ export * from './i-elk-layout-response';
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "@foblex/flow-elk-layout",
3
+ "version": "18.5.0",
4
+ "description": "ELK.js 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/elkjs-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
+ "elk",
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
+ "elkjs": "^0.9.3",
37
+ "tslib": "^2.3.0"
38
+ },
39
+ "sideEffects": false,
40
+ "module": "fesm2022/foblex-flow-elk-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-elk-layout.mjs",
49
+ "esm": "./esm2022/foblex-flow-elk-layout.mjs",
50
+ "default": "./fesm2022/foblex-flow-elk-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-elk-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-elk-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-elk-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('ELK.js support is ready.');
103
+ context.logger.info('Next step: provide ElkLayoutEngine 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/elk/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": "FoblexFlowElkLayoutNgAddSchema",
4
+ "title": "@foblex/flow-elk-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/elk/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/elk/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/elk/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"}