ngx-vflow 1.16.3 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +35 -69
- package/fesm2022/ngx-vflow-testing.mjs +77 -67
- package/fesm2022/ngx-vflow-testing.mjs.map +1 -1
- package/fesm2022/ngx-vflow.mjs +926 -559
- package/fesm2022/ngx-vflow.mjs.map +1 -1
- package/lib/vflow/components/custom-node-base/custom-node-base.component.d.ts +1 -1
- package/lib/vflow/components/vflow/vflow.component.d.ts +18 -9
- package/lib/vflow/directives/auto-pan.directive.d.ts +16 -0
- package/lib/vflow/directives/changes-controller.directive.d.ts +13 -87
- package/lib/vflow/directives/connection-controller.directive.d.ts +8 -10
- package/lib/vflow/directives/space-point-context.directive.d.ts +2 -1
- package/lib/vflow/interfaces/component-node-event.interface.d.ts +1 -2
- package/lib/vflow/interfaces/connection-events.interface.d.ts +66 -0
- package/lib/vflow/interfaces/connection-settings.interface.d.ts +7 -1
- package/lib/vflow/interfaces/connection.interface.d.ts +0 -5
- package/lib/vflow/interfaces/curve-factory.interface.d.ts +2 -2
- package/lib/vflow/interfaces/edge-label.interface.d.ts +0 -4
- package/lib/vflow/interfaces/edge.interface.d.ts +36 -8
- package/lib/vflow/interfaces/node.interface.d.ts +44 -63
- package/lib/vflow/interfaces/selection-strategy.interface.d.ts +16 -0
- package/lib/vflow/interfaces/template-context.interface.d.ts +8 -3
- package/lib/vflow/models/connection.model.d.ts +1 -1
- package/lib/vflow/models/edge.model.d.ts +20 -23
- package/lib/vflow/models/handle.model.d.ts +1 -1
- package/lib/vflow/models/node.model.d.ts +4 -7
- package/lib/vflow/public-components/custom-node/custom-node.component.d.ts +1 -1
- package/lib/vflow/public-components/custom-template-edge/custom-template-edge.component.d.ts +2 -1
- package/lib/vflow/public-components/minimap/minimap.component.d.ts +1 -1
- package/lib/vflow/services/draggable.service.d.ts +3 -0
- package/lib/vflow/services/flow-entities.service.d.ts +2 -2
- package/lib/vflow/services/flow-settings.service.d.ts +3 -0
- package/lib/vflow/services/flow-status.service.d.ts +35 -7
- package/lib/vflow/services/selection.service.d.ts +4 -1
- package/lib/vflow/strategies/default-selection.strategy.d.ts +6 -0
- package/lib/vflow/strategies/manual-selection.strategy.d.ts +5 -0
- package/lib/vflow/types/selection-mode.type.d.ts +1 -0
- package/lib/vflow/types/unwrap-signal.type.d.ts +4 -0
- package/lib/vflow/utils/adjust-direction.d.ts +2 -6
- package/lib/vflow/utils/identity-checker/reference-identity-checker.d.ts +2 -2
- package/lib/vflow/utils/is-vflow-component.d.ts +0 -2
- package/lib/vflow/utils/signals/to-lazy-signal.d.ts +4 -4
- package/package.json +3 -7
- package/public-api.d.ts +3 -2
- package/testing/component-mocks/vflow-mock.component.d.ts +8 -6
- package/testing/directive-mocks/connection-controller-mock.directive.d.ts +8 -6
- package/esm2022/lib/vflow/components/alignment-helper/alignment-helper.component.mjs +0 -103
- package/esm2022/lib/vflow/components/background/background.component.mjs +0 -121
- package/esm2022/lib/vflow/components/connection/connection.component.mjs +0 -157
- package/esm2022/lib/vflow/components/custom-node-base/custom-node-base.component.mjs +0 -57
- package/esm2022/lib/vflow/components/default-node/default-node.component.mjs +0 -16
- package/esm2022/lib/vflow/components/defs/defs.component.mjs +0 -16
- package/esm2022/lib/vflow/components/edge/edge.component.mjs +0 -54
- package/esm2022/lib/vflow/components/edge-label/edge-label.component.mjs +0 -76
- package/esm2022/lib/vflow/components/node/node.component.mjs +0 -107
- package/esm2022/lib/vflow/components/preview-flow/draw-node.mjs +0 -100
- package/esm2022/lib/vflow/components/preview-flow/preview-flow.component.mjs +0 -62
- package/esm2022/lib/vflow/components/vflow/vflow.component.mjs +0 -437
- package/esm2022/lib/vflow/constants/magic-number-to-fix-glitch-in-chrome.constant.mjs +0 -4
- package/esm2022/lib/vflow/decorators/microtask.decorator.mjs +0 -11
- package/esm2022/lib/vflow/directives/changes-controller.directive.mjs +0 -165
- package/esm2022/lib/vflow/directives/connection-controller.directive.mjs +0 -145
- package/esm2022/lib/vflow/directives/drag-handle.directive.mjs +0 -28
- package/esm2022/lib/vflow/directives/flow-size-controller.directive.mjs +0 -40
- package/esm2022/lib/vflow/directives/handle-size-controller.directive.mjs +0 -41
- package/esm2022/lib/vflow/directives/map-context.directive.mjs +0 -116
- package/esm2022/lib/vflow/directives/node-handles-controller.directive.mjs +0 -33
- package/esm2022/lib/vflow/directives/node-resize-controller.directive.mjs +0 -37
- package/esm2022/lib/vflow/directives/pointer.directive.mjs +0 -84
- package/esm2022/lib/vflow/directives/reference.directive.mjs +0 -17
- package/esm2022/lib/vflow/directives/root-pointer.directive.mjs +0 -58
- package/esm2022/lib/vflow/directives/root-svg-context.directive.mjs +0 -35
- package/esm2022/lib/vflow/directives/selectable.directive.mjs +0 -48
- package/esm2022/lib/vflow/directives/space-point-context.directive.mjs +0 -42
- package/esm2022/lib/vflow/directives/template.directive.mjs +0 -119
- package/esm2022/lib/vflow/interfaces/alignment-helper-settings.interface.mjs +0 -2
- package/esm2022/lib/vflow/interfaces/box.mjs +0 -2
- package/esm2022/lib/vflow/interfaces/component-node-event.interface.mjs +0 -2
- package/esm2022/lib/vflow/interfaces/connection-settings.interface.mjs +0 -2
- package/esm2022/lib/vflow/interfaces/connection.interface.mjs +0 -2
- package/esm2022/lib/vflow/interfaces/connection.internal.interface.mjs +0 -2
- package/esm2022/lib/vflow/interfaces/contextable.interface.mjs +0 -2
- package/esm2022/lib/vflow/interfaces/curve-factory.interface.mjs +0 -2
- package/esm2022/lib/vflow/interfaces/edge-label.interface.mjs +0 -2
- package/esm2022/lib/vflow/interfaces/edge.interface.mjs +0 -2
- package/esm2022/lib/vflow/interfaces/fit-view-options.interface.mjs +0 -2
- package/esm2022/lib/vflow/interfaces/flow-entity.interface.mjs +0 -2
- package/esm2022/lib/vflow/interfaces/intersecting-nodes-options.interface.mjs +0 -2
- package/esm2022/lib/vflow/interfaces/marker.interface.mjs +0 -2
- package/esm2022/lib/vflow/interfaces/node-preview.interface.mjs +0 -2
- package/esm2022/lib/vflow/interfaces/node.interface.mjs +0 -53
- package/esm2022/lib/vflow/interfaces/optimization.interface.mjs +0 -7
- package/esm2022/lib/vflow/interfaces/point.interface.mjs +0 -2
- package/esm2022/lib/vflow/interfaces/rect.mjs +0 -10
- package/esm2022/lib/vflow/interfaces/template-context.interface.mjs +0 -2
- package/esm2022/lib/vflow/interfaces/viewport.interface.mjs +0 -2
- package/esm2022/lib/vflow/math/edge-path/bezier-path.mjs +0 -66
- package/esm2022/lib/vflow/math/edge-path/smooth-step-path.mjs +0 -226
- package/esm2022/lib/vflow/math/edge-path/straigh-path.mjs +0 -12
- package/esm2022/lib/vflow/math/point-on-line-by-ratio.mjs +0 -12
- package/esm2022/lib/vflow/models/connection.model.mjs +0 -31
- package/esm2022/lib/vflow/models/edge-label.model.mjs +0 -8
- package/esm2022/lib/vflow/models/edge.model.mjs +0 -208
- package/esm2022/lib/vflow/models/handle.model.mjs +0 -98
- package/esm2022/lib/vflow/models/minimap.model.mjs +0 -7
- package/esm2022/lib/vflow/models/node.model.mjs +0 -181
- package/esm2022/lib/vflow/models/toolbar.model.mjs +0 -36
- package/esm2022/lib/vflow/public-components/custom-dynamic-node/custom-dynamic-node.component.mjs +0 -25
- package/esm2022/lib/vflow/public-components/custom-node/custom-node.component.mjs +0 -24
- package/esm2022/lib/vflow/public-components/custom-template-edge/custom-template-edge.component.mjs +0 -29
- package/esm2022/lib/vflow/public-components/handle/handle.component.mjs +0 -53
- package/esm2022/lib/vflow/public-components/minimap/minimap.component.mjs +0 -108
- package/esm2022/lib/vflow/public-components/node-toolbar/node-toolbar.component.mjs +0 -73
- package/esm2022/lib/vflow/public-components/resizable/resizable.component.mjs +0 -272
- package/esm2022/lib/vflow/services/component-event-bus.service.mjs +0 -18
- package/esm2022/lib/vflow/services/draggable.service.mjs +0 -124
- package/esm2022/lib/vflow/services/edge-changes.service.mjs +0 -43
- package/esm2022/lib/vflow/services/edge-rendering.service.mjs +0 -40
- package/esm2022/lib/vflow/services/flow-entities.service.mjs +0 -56
- package/esm2022/lib/vflow/services/flow-rendering.service.mjs +0 -41
- package/esm2022/lib/vflow/services/flow-settings.service.mjs +0 -33
- package/esm2022/lib/vflow/services/flow-status.service.mjs +0 -49
- package/esm2022/lib/vflow/services/handle.service.mjs +0 -30
- package/esm2022/lib/vflow/services/keyboard.service.mjs +0 -47
- package/esm2022/lib/vflow/services/node-accessor.service.mjs +0 -16
- package/esm2022/lib/vflow/services/node-changes.service.mjs +0 -41
- package/esm2022/lib/vflow/services/node-rendering.service.mjs +0 -66
- package/esm2022/lib/vflow/services/overlays.service.mjs +0 -35
- package/esm2022/lib/vflow/services/preview-flow-render-strategy.service.mjs +0 -21
- package/esm2022/lib/vflow/services/selection.service.mjs +0 -54
- package/esm2022/lib/vflow/services/viewport.service.mjs +0 -64
- package/esm2022/lib/vflow/types/background.type.mjs +0 -2
- package/esm2022/lib/vflow/types/connection-mode.type.mjs +0 -2
- package/esm2022/lib/vflow/types/edge-change.type.mjs +0 -2
- package/esm2022/lib/vflow/types/handle-type.type.mjs +0 -2
- package/esm2022/lib/vflow/types/keyboard-action.type.mjs +0 -2
- package/esm2022/lib/vflow/types/node-change.type.mjs +0 -2
- package/esm2022/lib/vflow/types/position.type.mjs +0 -2
- package/esm2022/lib/vflow/types/viewport-change-type.type.mjs +0 -2
- package/esm2022/lib/vflow/utils/add-nodes-to-edges.mjs +0 -11
- package/esm2022/lib/vflow/utils/adjust-direction.mjs +0 -30
- package/esm2022/lib/vflow/utils/align-number.mjs +0 -4
- package/esm2022/lib/vflow/utils/assert-injector.mjs +0 -27
- package/esm2022/lib/vflow/utils/event.mjs +0 -4
- package/esm2022/lib/vflow/utils/get-os.mjs +0 -24
- package/esm2022/lib/vflow/utils/get-overlapping-area.mjs +0 -6
- package/esm2022/lib/vflow/utils/get-space-points.mjs +0 -25
- package/esm2022/lib/vflow/utils/hash.mjs +0 -7
- package/esm2022/lib/vflow/utils/id.mjs +0 -5
- package/esm2022/lib/vflow/utils/identity-checker/reference-identity-checker.mjs +0 -28
- package/esm2022/lib/vflow/utils/is-callable.mjs +0 -10
- package/esm2022/lib/vflow/utils/is-defined.mjs +0 -4
- package/esm2022/lib/vflow/utils/is-group-node.mjs +0 -4
- package/esm2022/lib/vflow/utils/is-vflow-component.mjs +0 -9
- package/esm2022/lib/vflow/utils/nodes.mjs +0 -60
- package/esm2022/lib/vflow/utils/resizable.mjs +0 -11
- package/esm2022/lib/vflow/utils/round.mjs +0 -2
- package/esm2022/lib/vflow/utils/signals/extended-computed.mjs +0 -15
- package/esm2022/lib/vflow/utils/signals/to-lazy-signal.mjs +0 -35
- package/esm2022/lib/vflow/utils/to-unified-node.mjs +0 -24
- package/esm2022/lib/vflow/utils/transform-background.mjs +0 -4
- package/esm2022/lib/vflow/utils/viewport.mjs +0 -51
- package/esm2022/lib/vflow/vflow.mjs +0 -29
- package/esm2022/ngx-vflow.mjs +0 -5
- package/esm2022/public-api.mjs +0 -55
- package/esm2022/testing/component-mocks/custom-template-edge-mock.component.mjs +0 -16
- package/esm2022/testing/component-mocks/handle-mock.component.mjs +0 -26
- package/esm2022/testing/component-mocks/minimap-mock.component.mjs +0 -24
- package/esm2022/testing/component-mocks/node-toolbar-mock.component.mjs +0 -23
- package/esm2022/testing/component-mocks/resizable-mock.component.mjs +0 -27
- package/esm2022/testing/component-mocks/vflow-mock.component.mjs +0 -299
- package/esm2022/testing/directive-mocks/connection-controller-mock.directive.mjs +0 -29
- package/esm2022/testing/directive-mocks/drag-handle-mock.directive.mjs +0 -11
- package/esm2022/testing/directive-mocks/selectable-mock.directive.mjs +0 -14
- package/esm2022/testing/directive-mocks/template-mock.directive.mjs +0 -101
- package/esm2022/testing/ngx-vflow-testing.mjs +0 -5
- package/esm2022/testing/provide-custom-node-mocks.mjs +0 -60
- package/esm2022/testing/public-api.mjs +0 -13
- package/esm2022/testing/types.mjs +0 -2
- package/esm2022/testing/vflow-mocks.mjs +0 -28
- package/lib/vflow/public-components/custom-dynamic-node/custom-dynamic-node.component.d.ts +0 -13
- package/lib/vflow/utils/to-unified-node.d.ts +0 -2
|
@@ -1,226 +0,0 @@
|
|
|
1
|
-
const handleDirections = {
|
|
2
|
-
left: { x: -1, y: 0 },
|
|
3
|
-
right: { x: 1, y: 0 },
|
|
4
|
-
top: { x: 0, y: -1 },
|
|
5
|
-
bottom: { x: 0, y: 1 },
|
|
6
|
-
};
|
|
7
|
-
export function getEdgeCenter(source, target) {
|
|
8
|
-
const xOffset = Math.abs(target.x - source.x) / 2;
|
|
9
|
-
const centerX = target.x < source.x ? target.x + xOffset : target.x - xOffset;
|
|
10
|
-
const yOffset = Math.abs(target.y - source.y) / 2;
|
|
11
|
-
const centerY = target.y < source.y ? target.y + yOffset : target.y - yOffset;
|
|
12
|
-
return [centerX, centerY, xOffset, yOffset];
|
|
13
|
-
}
|
|
14
|
-
const getDirection = ({ source, sourcePosition = 'bottom', target, }) => {
|
|
15
|
-
if (sourcePosition === 'left' || sourcePosition === 'right') {
|
|
16
|
-
return source.x < target.x ? { x: 1, y: 0 } : { x: -1, y: 0 };
|
|
17
|
-
}
|
|
18
|
-
return source.y < target.y ? { x: 0, y: 1 } : { x: 0, y: -1 };
|
|
19
|
-
};
|
|
20
|
-
const distance = (a, b) => Math.sqrt(Math.pow(b.x - a.x, 2) + Math.pow(b.y - a.y, 2));
|
|
21
|
-
// ith this function we try to mimic a orthogonal edge routing behaviour
|
|
22
|
-
// It's not as good as a real orthogonal edge routing but it's faster and good enough as a default for step and smooth step edges
|
|
23
|
-
function getPoints({ source, sourcePosition = 'bottom', target, targetPosition = 'top', offset, }) {
|
|
24
|
-
const sourceDir = handleDirections[sourcePosition];
|
|
25
|
-
const targetDir = handleDirections[targetPosition];
|
|
26
|
-
const sourceGapped = { x: source.x + sourceDir.x * offset, y: source.y + sourceDir.y * offset };
|
|
27
|
-
const targetGapped = { x: target.x + targetDir.x * offset, y: target.y + targetDir.y * offset };
|
|
28
|
-
const dir = getDirection({
|
|
29
|
-
source: sourceGapped,
|
|
30
|
-
sourcePosition,
|
|
31
|
-
target: targetGapped,
|
|
32
|
-
});
|
|
33
|
-
const dirAccessor = dir.x !== 0 ? 'x' : 'y';
|
|
34
|
-
const currDir = dir[dirAccessor];
|
|
35
|
-
let points = [];
|
|
36
|
-
let centerX, centerY;
|
|
37
|
-
const sourceGapOffset = { x: 0, y: 0 };
|
|
38
|
-
const targetGapOffset = { x: 0, y: 0 };
|
|
39
|
-
const [defaultCenterX, defaultCenterY] = getEdgeCenter(source, target);
|
|
40
|
-
// opposite handle positions, default case
|
|
41
|
-
if (sourceDir[dirAccessor] * targetDir[dirAccessor] === -1) {
|
|
42
|
-
centerX = defaultCenterX;
|
|
43
|
-
centerY = defaultCenterY;
|
|
44
|
-
// --->
|
|
45
|
-
// |
|
|
46
|
-
// >---
|
|
47
|
-
const verticalSplit = [
|
|
48
|
-
{ x: centerX, y: sourceGapped.y },
|
|
49
|
-
{ x: centerX, y: targetGapped.y },
|
|
50
|
-
];
|
|
51
|
-
// |
|
|
52
|
-
// ---
|
|
53
|
-
// |
|
|
54
|
-
const horizontalSplit = [
|
|
55
|
-
{ x: sourceGapped.x, y: centerY },
|
|
56
|
-
{ x: targetGapped.x, y: centerY },
|
|
57
|
-
];
|
|
58
|
-
if (sourceDir[dirAccessor] === currDir) {
|
|
59
|
-
points = dirAccessor === 'x' ? verticalSplit : horizontalSplit;
|
|
60
|
-
}
|
|
61
|
-
else {
|
|
62
|
-
points = dirAccessor === 'x' ? horizontalSplit : verticalSplit;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
else {
|
|
66
|
-
// sourceTarget means we take x from source and y from target, targetSource is the opposite
|
|
67
|
-
const sourceTarget = [{ x: sourceGapped.x, y: targetGapped.y }];
|
|
68
|
-
const targetSource = [{ x: targetGapped.x, y: sourceGapped.y }];
|
|
69
|
-
// this handles edges with same handle positions
|
|
70
|
-
if (dirAccessor === 'x') {
|
|
71
|
-
points = sourceDir.x === currDir ? targetSource : sourceTarget;
|
|
72
|
-
}
|
|
73
|
-
else {
|
|
74
|
-
points = sourceDir.y === currDir ? sourceTarget : targetSource;
|
|
75
|
-
}
|
|
76
|
-
if (sourcePosition === targetPosition) {
|
|
77
|
-
const diff = Math.abs(source[dirAccessor] - target[dirAccessor]);
|
|
78
|
-
// if an edge goes from right to right for example (sourcePosition === targetPosition) and the distance between source.x and target.x is less than the offset, the added point and the gapped source/target will overlap. This leads to a weird edge path. To avoid this we add a gapOffset to the source/target
|
|
79
|
-
if (diff <= offset) {
|
|
80
|
-
const gapOffset = Math.min(offset - 1, offset - diff);
|
|
81
|
-
if (sourceDir[dirAccessor] === currDir) {
|
|
82
|
-
sourceGapOffset[dirAccessor] = (sourceGapped[dirAccessor] > source[dirAccessor] ? -1 : 1) * gapOffset;
|
|
83
|
-
}
|
|
84
|
-
else {
|
|
85
|
-
targetGapOffset[dirAccessor] = (targetGapped[dirAccessor] > target[dirAccessor] ? -1 : 1) * gapOffset;
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
// these are conditions for handling mixed handle positions like Right -> Bottom for example
|
|
90
|
-
if (sourcePosition !== targetPosition) {
|
|
91
|
-
const dirAccessorOpposite = dirAccessor === 'x' ? 'y' : 'x';
|
|
92
|
-
const isSameDir = sourceDir[dirAccessor] === targetDir[dirAccessorOpposite];
|
|
93
|
-
const sourceGtTargetOppo = sourceGapped[dirAccessorOpposite] > targetGapped[dirAccessorOpposite];
|
|
94
|
-
const sourceLtTargetOppo = sourceGapped[dirAccessorOpposite] < targetGapped[dirAccessorOpposite];
|
|
95
|
-
const flipSourceTarget = (sourceDir[dirAccessor] === 1 && ((!isSameDir && sourceGtTargetOppo) || (isSameDir && sourceLtTargetOppo))) ||
|
|
96
|
-
(sourceDir[dirAccessor] !== 1 && ((!isSameDir && sourceLtTargetOppo) || (isSameDir && sourceGtTargetOppo)));
|
|
97
|
-
if (flipSourceTarget) {
|
|
98
|
-
points = dirAccessor === 'x' ? sourceTarget : targetSource;
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
const sourceGapPoint = { x: sourceGapped.x + sourceGapOffset.x, y: sourceGapped.y + sourceGapOffset.y };
|
|
102
|
-
const targetGapPoint = { x: targetGapped.x + targetGapOffset.x, y: targetGapped.y + targetGapOffset.y };
|
|
103
|
-
const maxXDistance = Math.max(Math.abs(sourceGapPoint.x - points[0].x), Math.abs(targetGapPoint.x - points[0].x));
|
|
104
|
-
const maxYDistance = Math.max(Math.abs(sourceGapPoint.y - points[0].y), Math.abs(targetGapPoint.y - points[0].y));
|
|
105
|
-
// we want to place the label on the longest segment of the edge
|
|
106
|
-
if (maxXDistance >= maxYDistance) {
|
|
107
|
-
centerX = (sourceGapPoint.x + targetGapPoint.x) / 2;
|
|
108
|
-
centerY = points[0].y;
|
|
109
|
-
}
|
|
110
|
-
else {
|
|
111
|
-
centerX = points[0].x;
|
|
112
|
-
centerY = (sourceGapPoint.y + targetGapPoint.y) / 2;
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
const pathPoints = [
|
|
116
|
-
source,
|
|
117
|
-
{ x: sourceGapped.x + sourceGapOffset.x, y: sourceGapped.y + sourceGapOffset.y },
|
|
118
|
-
...points,
|
|
119
|
-
{ x: targetGapped.x + targetGapOffset.x, y: targetGapped.y + targetGapOffset.y },
|
|
120
|
-
target,
|
|
121
|
-
];
|
|
122
|
-
return [pathPoints, centerX, centerY];
|
|
123
|
-
}
|
|
124
|
-
function getBend(a, b, c, size) {
|
|
125
|
-
const bendSize = Math.min(distance(a, b) / 2, distance(b, c) / 2, size);
|
|
126
|
-
const { x, y } = b;
|
|
127
|
-
// no bend
|
|
128
|
-
if ((a.x === x && x === c.x) || (a.y === y && y === c.y)) {
|
|
129
|
-
return `L${x} ${y}`;
|
|
130
|
-
}
|
|
131
|
-
// first segment is horizontal
|
|
132
|
-
if (a.y === y) {
|
|
133
|
-
const xDir = a.x < c.x ? -1 : 1;
|
|
134
|
-
const yDir = a.y < c.y ? 1 : -1;
|
|
135
|
-
return `L ${x + bendSize * xDir},${y}Q ${x},${y} ${x},${y + bendSize * yDir}`;
|
|
136
|
-
}
|
|
137
|
-
const xDir = a.x < c.x ? 1 : -1;
|
|
138
|
-
const yDir = a.y < c.y ? -1 : 1;
|
|
139
|
-
return `L ${x},${y + bendSize * yDir}Q ${x},${y} ${x + bendSize * xDir},${y}`;
|
|
140
|
-
}
|
|
141
|
-
export function smoothStepPath({ sourcePoint, targetPoint, sourcePosition, targetPosition }, borderRadius = 5) {
|
|
142
|
-
const [points, labelX, labelY] = getPoints({
|
|
143
|
-
source: sourcePoint,
|
|
144
|
-
sourcePosition,
|
|
145
|
-
target: targetPoint,
|
|
146
|
-
targetPosition,
|
|
147
|
-
offset: 20,
|
|
148
|
-
});
|
|
149
|
-
const path = points.reduce((res, p, i) => {
|
|
150
|
-
let segment = '';
|
|
151
|
-
if (i > 0 && i < points.length - 1) {
|
|
152
|
-
segment = getBend(points[i - 1], p, points[i + 1], borderRadius);
|
|
153
|
-
}
|
|
154
|
-
else {
|
|
155
|
-
segment = `${i === 0 ? 'M' : 'L'}${p.x} ${p.y}`;
|
|
156
|
-
}
|
|
157
|
-
res += segment;
|
|
158
|
-
return res;
|
|
159
|
-
}, '');
|
|
160
|
-
// Performance optimization: Pre-calculate cumulative distances and use binary search
|
|
161
|
-
const n = points.length;
|
|
162
|
-
if (n < 2) {
|
|
163
|
-
return {
|
|
164
|
-
path,
|
|
165
|
-
labelPoints: {
|
|
166
|
-
start: { x: labelX, y: labelY },
|
|
167
|
-
center: { x: labelX, y: labelY },
|
|
168
|
-
end: { x: labelX, y: labelY },
|
|
169
|
-
},
|
|
170
|
-
};
|
|
171
|
-
}
|
|
172
|
-
// Pre-calculate segment lengths and cumulative distances in a single loop
|
|
173
|
-
const segmentLengths = new Array(n - 1);
|
|
174
|
-
const cumulativeDistances = new Array(n);
|
|
175
|
-
cumulativeDistances[0] = 0;
|
|
176
|
-
let totalLength = 0;
|
|
177
|
-
for (let i = 0; i < n - 1; i++) {
|
|
178
|
-
const dx = points[i + 1].x - points[i].x;
|
|
179
|
-
const dy = points[i + 1].y - points[i].y;
|
|
180
|
-
const len = Math.sqrt(dx * dx + dy * dy);
|
|
181
|
-
segmentLengths[i] = len;
|
|
182
|
-
totalLength += len;
|
|
183
|
-
cumulativeDistances[i + 1] = totalLength;
|
|
184
|
-
}
|
|
185
|
-
// Optimized helper function using binary search
|
|
186
|
-
const getPointAtRatio = (ratio) => {
|
|
187
|
-
const targetDistance = totalLength * ratio;
|
|
188
|
-
// Edge cases
|
|
189
|
-
if (targetDistance <= 0)
|
|
190
|
-
return points[0];
|
|
191
|
-
if (targetDistance >= totalLength)
|
|
192
|
-
return points[n - 1];
|
|
193
|
-
// Binary search for the correct segment
|
|
194
|
-
let low = 0;
|
|
195
|
-
let high = n - 1;
|
|
196
|
-
while (low < high - 1) {
|
|
197
|
-
const mid = (low + high) >>> 1; // Bitwise right shift is faster than Math.floor
|
|
198
|
-
if (cumulativeDistances[mid] < targetDistance) {
|
|
199
|
-
low = mid;
|
|
200
|
-
}
|
|
201
|
-
else {
|
|
202
|
-
high = mid;
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
// Calculate position within the segment
|
|
206
|
-
const segmentStartDistance = cumulativeDistances[low];
|
|
207
|
-
const localDistance = targetDistance - segmentStartDistance;
|
|
208
|
-
const t = localDistance / segmentLengths[low];
|
|
209
|
-
// Linear interpolation
|
|
210
|
-
const start = points[low];
|
|
211
|
-
const end = points[low + 1];
|
|
212
|
-
return {
|
|
213
|
-
x: start.x + (end.x - start.x) * t,
|
|
214
|
-
y: start.y + (end.y - start.y) * t,
|
|
215
|
-
};
|
|
216
|
-
};
|
|
217
|
-
return {
|
|
218
|
-
path,
|
|
219
|
-
labelPoints: {
|
|
220
|
-
start: getPointAtRatio(0.15),
|
|
221
|
-
center: { x: labelX, y: labelY },
|
|
222
|
-
end: getPointAtRatio(0.85),
|
|
223
|
-
},
|
|
224
|
-
};
|
|
225
|
-
}
|
|
226
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21vb3RoLXN0ZXAtcGF0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC12Zmxvdy1saWIvc3JjL2xpYi92Zmxvdy9tYXRoL2VkZ2UtcGF0aC9zbW9vdGgtc3RlcC1wYXRoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUlBLE1BQU0sZ0JBQWdCLEdBQUc7SUFDdkIsSUFBSSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDckIsS0FBSyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBQ3JCLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFO0lBQ3BCLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtDQUN2QixDQUFDO0FBRUYsTUFBTSxVQUFVLGFBQWEsQ0FBQyxNQUFhLEVBQUUsTUFBYTtJQUN4RCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsRCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztJQUU5RSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsRCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxD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QUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDekQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQsOEJBQThCO0lBQzlCLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNkLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoQyxNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEMsT0FBTyxLQUFLLENBQUMsR0FBRyxRQUFRLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsUUFBUSxHQUFHLElBQUksRUFBRSxDQUFDO0lBQ2hGLENBQUM7SUFFRCxNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hDLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLFFBQVEsR0FBRyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsUUFBUSxHQUFHLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUNoRixDQUFDO0FBRUQsTUFBTSxVQUFVLGNBQWMs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LENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUNsQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7U0FDbkMsQ0FBQztJQUNKLENBQUMsQ0FBQztJQUVGLE9BQU87UUFDTCxJQUFJO1FBQ0osV0FBVyxFQUFFO1lBQ1gsS0FBSyxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUM7WUFDNUIsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFO1lBQ2hDLEdBQUcsRUFBRSxlQUFlLENBQUMsSUFBSSxDQUFDO1NBQzNCO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDdXJ2ZUZhY3RvcnlQYXJhbXMsIEN1cnZlTGF5b3V0IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9jdXJ2ZS1mYWN0b3J5LmludGVyZmFjZSc7XG5pbXBvcnQgeyBQb2ludCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcG9pbnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IFBvc2l0aW9uIH0gZnJvbSAnLi4vLi4vdHlwZXMvcG9zaXRpb24udHlwZSc7XG5cbmNvbnN0IGhhbmRsZURpcmVjdGlvbnMgPSB7XG4gIGxlZnQ6IHsgeDogLTEsIHk6IDAgfSxcbiAgcmlnaHQ6IHsgeDogMSwgeTogMCB9LFxuICB0b3A6IHsgeDogMCwgeTogLTEgfSxcbiAgYm90dG9tOiB7IHg6IDAsIHk6IDEgfSxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFZGdlQ2VudGVyKHNvdXJjZTogUG9pbnQsIHRhcmdldDogUG9pbnQpOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSB7XG4gIGNvbnN0IHhPZmZzZXQgPSBNYXRoLmFicyh0YXJnZXQueCAtIHNvdXJjZS54KSAvIDI7XG4gIGNvbnN0IGNlbnRlclggPSB0YXJnZXQueCA8IHNvdXJjZS54ID8gdGFyZ2V0LnggKyB4T2Zmc2V0IDogdGFyZ2V0LnggLSB4T2Zmc2V0O1xuXG4gIGNvbnN0IHlPZmZzZXQgPSBNYXRoLmFicyh0YXJnZXQueSAtIHNvdXJjZS55KSAvIDI7XG4gIGNvbnN0IGNlbnRlclkgPSB0YXJnZXQueSA8IHNvdXJjZS55ID8gdGFyZ2V0LnkgKyB5T2Zmc2V0IDogdGFyZ2V0LnkgLSB5T2Zmc2V0O1xuXG4gIHJldHVybiBbY2VudGVyWCwgY2VudGVyWSwgeE9mZnNldCwgeU9mZnNldF07XG59XG5cbmNvbnN0IGdldERpcmVjdGlvbiA9ICh7XG4gIHNvdXJjZSxcbiAgc291cmNlUG9zaXRpb24gPSAnYm90dG9tJyxcbiAgdGFyZ2V0LFxufToge1xuICBzb3VyY2U6IFBvaW50O1xuICBzb3VyY2VQb3NpdGlvbjogUG9zaXRpb247XG4gIHRhcmdldDogUG9pbnQ7XG59KTogUG9pbnQgPT4ge1xuICBpZiAoc291cmNlUG9zaXRpb24gPT09ICdsZWZ0JyB8fCBzb3VyY2VQb3NpdGlvbiA9PT0gJ3JpZ2h0Jykge1xuICAgIHJldHVybiBzb3VyY2UueCA8IHRhcmdldC54ID8geyB4OiAxLCB5OiAwIH0gOiB7IHg6IC0xLCB5OiAwIH07XG4gIH1cbiAgcmV0dXJuIHNvdXJjZS55IDwgdGFyZ2V0LnkgPyB7IHg6IDAsIHk6IDEgfSA6IHsgeDogMCwgeTogLTEgfTtcbn07XG5cbmNvbnN0IGRpc3RhbmNlID0gKGE6IFBvaW50LCBiOiBQb2ludCkgPT4gTWF0aC5zcXJ0KE1hdGgucG93KGIueCAtIGEueCwgMikgKyBNYXRoLnBvdyhiLnkgLSBhLnksIDIpKTtcblxuLy8gaXRoIHRoaXMgZnVuY3Rpb24gd2UgdHJ5IHRvIG1pbWljIGEgb3J0aG9nb25hbCBlZGdlIHJvdXRpbmcgYmVoYXZpb3VyXG4vLyBJdCdzIG5vdCBhcyBnb29kIGFzIGEgcmVhbCBvcnRob2dvbmFsIGVkZ2Ugcm91dGluZyBidXQgaXQncyBmYXN0ZXIgYW5kIGdvb2QgZW5vdWdoIGFzIGEgZGVmYXVsdCBmb3Igc3RlcCBhbmQgc21vb3RoIHN0ZXAgZWRnZXNcbmZ1bmN0aW9uIGdldFBvaW50cyh7XG4gIHNvdXJjZSxcbiAgc291cmNlUG9zaXRpb24gPSAnYm90dG9tJyxcbiAgdGFyZ2V0LFxuICB0YXJnZXRQb3NpdGlvbiA9ICd0b3AnLFxuICBvZmZzZXQsXG59OiB7XG4gIHNvdXJjZTogUG9pbnQ7XG4gIHNvdXJjZVBvc2l0aW9uOiBQb3NpdGlvbjtcbiAgdGFyZ2V0OiBQb2ludDtcbiAgdGFyZ2V0UG9zaXRpb246IFBvc2l0aW9uO1xuICBvZmZzZXQ6IG51bWJlcjtcbn0pOiBbUG9pbnRbXSwgbnVtYmVyLCBudW1iZXJdIHtcbiAgY29uc3Qgc291cmNlRGlyID0gaGFuZGxlRGlyZWN0aW9uc1tzb3VyY2VQb3NpdGlvbl07XG4gIGNvbnN0IHRhcmdldERpciA9IGhhbmRsZURpcmVjdGlvbnNbdGFyZ2V0UG9zaXRpb25dO1xuICBjb25zdCBzb3VyY2VHYXBwZWQ6IFBvaW50ID0geyB4OiBzb3VyY2UueCArIHNvdXJjZURpci54ICogb2Zmc2V0LCB5OiBzb3VyY2UueSArIHNvdXJjZURpci55ICogb2Zmc2V0IH07XG4gIGNvbnN0IHRhcmdldEdhcHBlZDogUG9pbnQgPSB7IHg6IHRhcmdldC54ICsgdGFyZ2V0RGlyLnggKiBvZmZzZXQsIHk6IHRhcmdldC55ICsgdGFyZ2V0RGlyLnkgKiBvZmZzZXQgfTtcbiAgY29uc3QgZGlyID0gZ2V0RGlyZWN0aW9uKHtcbiAgICBzb3VyY2U6IHNvdXJjZUdhcHBlZCxcbiAgICBzb3VyY2VQb3NpdGlvbixcbiAgICB0YXJnZXQ6IHRhcmdldEdhcHBlZCxcbiAgfSk7XG4gIGNvbnN0IGRpckFjY2Vzc29yID0gZGlyLnggIT09IDAgPyAneCcgOiAneSc7XG4gIGNvbnN0IGN1cnJEaXIgPSBkaXJbZGlyQWNjZXNzb3JdO1xuXG4gIGxldCBwb2ludHM6IFBvaW50W10gPSBbXTtcbiAgbGV0IGNlbnRlclgsIGNlbnRlclk7XG4gIGNvbnN0IHNvdXJjZUdhcE9mZnNldCA9IHsgeDogMCwgeTogMCB9O1xuICBjb25zdCB0YXJnZXRHYXBPZmZzZXQgPSB7IHg6IDAsIHk6IDAgfTtcblxuICBjb25zdCBbZGVmYXVsdENlbnRlclgsIGRlZmF1bHRDZW50ZXJZXSA9IGdldEVkZ2VDZW50ZXIoc291cmNlLCB0YXJnZXQpO1xuXG4gIC8vIG9wcG9zaXRlIGhhbmRsZSBwb3NpdGlvbnMsIGRlZmF1bHQgY2FzZVxuICBpZiAoc291cmNlRGlyW2RpckFjY2Vzc29yXSAqIHRhcmdldERpcltkaXJBY2Nlc3Nvcl0gPT09IC0xKSB7XG4gICAgY2VudGVyWCA9IGRlZmF1bHRDZW50ZXJYO1xuICAgIGNlbnRlclkgPSBkZWZhdWx0Q2VudGVyWTtcbiAgICAvLyAgICAtLS0+XG4gICAgLy8gICAgfFxuICAgIC8vID4tLS1cbiAgICBjb25zdCB2ZXJ0aWNhbFNwbGl0OiBQb2ludFtdID0gW1xuICAgICAgeyB4OiBjZW50ZXJYLCB5OiBzb3VyY2VHYXBwZWQueSB9LFxuICAgICAgeyB4OiBjZW50ZXJYLCB5OiB0YXJnZXRHYXBwZWQueSB9LFxuICAgIF07XG4gICAgLy8gICAgfFxuICAgIC8vICAtLS1cbiAgICAvLyAgfFxuICAgIGNvbnN0IGhvcml6b250YWxTcGxpdDogUG9pbnRbXSA9IFtcbiAgICAgIHsgeDogc291cmNlR2FwcGVkLngsIHk6IGNlbnRlclkgfSxcbiAgICAgIHsgeDogdGFyZ2V0R2FwcGVkLngsIHk6IGNlbnRlclkgfSxcbiAgICBdO1xuXG4gICAgaWYgKHNvdXJjZURpcltkaXJBY2Nlc3Nvcl0gPT09IGN1cnJEaXIpIHtcbiAgICAgIHBvaW50cyA9IGRpckFjY2Vzc29yID09PSAneCcgPyB2ZXJ0aWNhbFNwbGl0IDogaG9yaXpvbnRhbFNwbGl0O1xuICAgIH0gZWxzZSB7XG4gICAgICBwb2ludHMgPSBkaXJBY2Nlc3NvciA9PT0gJ3gnID8gaG9yaXpvbnRhbFNwbGl0IDogdmVydGljYWxTcGxpdDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gc291cmNlVGFyZ2V0IG1lYW5zIHdlIHRha2UgeCBmcm9tIHNvdXJjZSBhbmQgeSBmcm9tIHRhcmdldCwgdGFyZ2V0U291cmNlIGlzIHRoZSBvcHBvc2l0ZVxuICAgIGNvbnN0IHNvdXJjZVRhcmdldDogUG9pbnRbXSA9IFt7IHg6IHNvdXJjZUdhcHBlZC54LCB5OiB0YXJnZXRHYXBwZWQueSB9XTtcbiAgICBjb25zdCB0YXJnZXRTb3VyY2U6IFBvaW50W10gPSBbeyB4OiB0YXJnZXRHYXBwZWQueCwgeTogc291cmNlR2FwcGVkLnkgfV07XG4gICAgLy8gdGhpcyBoYW5kbGVzIGVkZ2VzIHdpdGggc2FtZSBoYW5kbGUgcG9zaXRpb25zXG4gICAgaWYgKGRpckFjY2Vzc29yID09PSAneCcpIHtcbiAgICAgIHBvaW50cyA9IHNvdXJjZURpci54ID09PSBjdXJyRGlyID8gdGFyZ2V0U291cmNlIDogc291cmNlVGFyZ2V0O1xuICAgIH0gZWxzZSB7XG4gICAgICBwb2ludHMgPSBzb3VyY2VEaXIueSA9PT0gY3VyckRpciA/IHNvdXJjZVRhcmdldCA6IHRhcmdldFNvdXJjZTtcbiAgICB9XG5cbiAgICBpZiAoc291cmNlUG9zaXRpb24gPT09IHRhcmdldFBvc2l0aW9uKSB7XG4gICAgICBjb25zdCBkaWZmID0gTWF0aC5hYnMoc291cmNlW2RpckFjY2Vzc29yXSAtIHRhcmdldFtkaXJBY2Nlc3Nvcl0pO1xuXG4gICAgICAvLyBpZiBhbiBlZGdlIGdvZXMgZnJvbSByaWdodCB0byByaWdodCBmb3IgZXhhbXBsZSAoc291cmNlUG9zaXRpb24gPT09IHRhcmdldFBvc2l0aW9uKSBhbmQgdGhlIGRpc3RhbmNlIGJldHdlZW4gc291cmNlLnggYW5kIHRhcmdldC54IGlzIGxlc3MgdGhhbiB0aGUgb2Zmc2V0LCB0aGUgYWRkZWQgcG9pbnQgYW5kIHRoZSBnYXBwZWQgc291cmNlL3RhcmdldCB3aWxsIG92ZXJsYXAuIFRoaXMgbGVhZHMgdG8gYSB3ZWlyZCBlZGdlIHBhdGguIFRvIGF2b2lkIHRoaXMgd2UgYWRkIGEgZ2FwT2Zmc2V0IHRvIHRoZSBzb3VyY2UvdGFyZ2V0XG4gICAgICBpZiAoZGlmZiA8PSBvZmZzZXQpIHtcbiAgICAgICAgY29uc3QgZ2FwT2Zmc2V0ID0gTWF0aC5taW4ob2Zmc2V0IC0gMSwgb2Zmc2V0IC0gZGlmZik7XG4gICAgICAgIGlmIChzb3VyY2VEaXJbZGlyQWNjZXNzb3JdID09PSBjdXJyRGlyKSB7XG4gICAgICAgICAgc291cmNlR2FwT2Zmc2V0W2RpckFjY2Vzc29yXSA9IChzb3VyY2VHYXBwZWRbZGlyQWNjZXNzb3JdID4gc291cmNlW2RpckFjY2Vzc29yXSA/IC0xIDogMSkgKiBnYXBPZmZzZXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGFyZ2V0R2FwT2Zmc2V0W2RpckFjY2Vzc29yXSA9ICh0YXJnZXRHYXBwZWRbZGlyQWNjZXNzb3JdID4gdGFyZ2V0W2RpckFjY2Vzc29yXSA/IC0xIDogMSkgKiBnYXBPZmZzZXQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyB0aGVzZSBhcmUgY29uZGl0aW9ucyBmb3IgaGFuZGxpbmcgbWl4ZWQgaGFuZGxlIHBvc2l0aW9ucyBsaWtlIFJpZ2h0IC0+IEJvdHRvbSBmb3IgZXhhbXBsZVxuICAgIGlmIChzb3VyY2VQb3NpdGlvbiAhPT0gdGFyZ2V0UG9zaXRpb24pIHtcbiAgICAgIGNvbnN0IGRpckFjY2Vzc29yT3Bwb3NpdGUgPSBkaXJBY2Nlc3NvciA9PT0gJ3gnID8gJ3knIDogJ3gnO1xuICAgICAgY29uc3QgaXNTYW1lRGlyID0gc291cmNlRGlyW2RpckFjY2Vzc29yXSA9PT0gdGFyZ2V0RGlyW2RpckFjY2Vzc29yT3Bwb3NpdGVdO1xuICAgICAgY29uc3Qgc291cmNlR3RUYXJnZXRPcHBvID0gc291cmNlR2FwcGVkW2RpckFjY2Vzc29yT3Bwb3NpdGVdID4gdGFyZ2V0R2FwcGVkW2RpckFjY2Vzc29yT3Bwb3NpdGVdO1xuICAgICAgY29uc3Qgc291cmNlTHRUYXJnZXRPcHBvID0gc291cmNlR2FwcGVkW2RpckFjY2Vzc29yT3Bwb3NpdGVdIDwgdGFyZ2V0R2FwcGVkW2RpckFjY2Vzc29yT3Bwb3NpdGVdO1xuICAgICAgY29uc3QgZmxpcFNvdXJjZVRhcmdldCA9XG4gICAgICAgIChzb3VyY2VEaXJbZGlyQWNjZXNzb3JdID09PSAxICYmICgoIWlzU2FtZURpciAmJiBzb3VyY2VHdFRhcmdldE9wcG8pIHx8IChpc1NhbWVEaXIgJiYgc291cmNlTHRUYXJnZXRPcHBvKSkpIHx8XG4gICAgICAgIChzb3VyY2VEaXJbZGlyQWNjZXNzb3JdICE9PSAxICYmICgoIWlzU2FtZURpciAmJiBzb3VyY2VMdFRhcmdldE9wcG8pIHx8IChpc1NhbWVEaXIgJiYgc291cmNlR3RUYXJnZXRPcHBvKSkpO1xuXG4gICAgICBpZiAoZmxpcFNvdXJjZVRhcmdldCkge1xuICAgICAgICBwb2ludHMgPSBkaXJBY2Nlc3NvciA9PT0gJ3gnID8gc291cmNlVGFyZ2V0IDogdGFyZ2V0U291cmNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHNvdXJjZUdhcFBvaW50ID0geyB4OiBzb3VyY2VHYXBwZWQueCArIHNvdXJjZUdhcE9mZnNldC54LCB5OiBzb3VyY2VHYXBwZWQueSArIHNvdXJjZUdhcE9mZnNldC55IH07XG4gICAgY29uc3QgdGFyZ2V0R2FwUG9pbnQgPSB7IHg6IHRhcmdldEdhcHBlZC54ICsgdGFyZ2V0R2FwT2Zmc2V0LngsIHk6IHRhcmdldEdhcHBlZC55ICsgdGFyZ2V0R2FwT2Zmc2V0LnkgfTtcbiAgICBjb25zdCBtYXhYRGlzdGFuY2UgPSBNYXRoLm1heChNYXRoLmFicyhzb3VyY2VHYXBQb2ludC54IC0gcG9pbnRzWzBdLngpLCBNYXRoLmFicyh0YXJnZXRHYXBQb2ludC54IC0gcG9pbnRzWzBdLngpKTtcbiAgICBjb25zdCBtYXhZRGlzdGFuY2UgPSBNYXRoLm1heChNYXRoLmFicyhzb3VyY2VHYXBQb2ludC55IC0gcG9pbnRzWzBdLnkpLCBNYXRoLmFicyh0YXJnZXRHYXBQb2ludC55IC0gcG9pbnRzWzBdLnkpKTtcblxuICAgIC8vIHdlIHdhbnQgdG8gcGxhY2UgdGhlIGxhYmVsIG9uIHRoZSBsb25nZXN0IHNlZ21lbnQgb2YgdGhlIGVkZ2VcbiAgICBpZiAobWF4WERpc3RhbmNlID49IG1heFlEaXN0YW5jZSkge1xuICAgICAgY2VudGVyWCA9IChzb3VyY2VHYXBQb2ludC54ICsgdGFyZ2V0R2FwUG9pbnQueCkgLyAyO1xuICAgICAgY2VudGVyWSA9IHBvaW50c1swXS55O1xuICAgIH0gZWxzZSB7XG4gICAgICBjZW50ZXJYID0gcG9pbnRzWzBdLng7XG4gICAgICBjZW50ZXJZID0gKHNvdXJjZUdhcFBvaW50LnkgKyB0YXJnZXRHYXBQb2ludC55KSAvIDI7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcGF0aFBvaW50cyA9IFtcbiAgICBzb3VyY2UsXG4gICAgeyB4OiBzb3VyY2VHYXBwZWQueCArIHNvdXJjZUdhcE9mZnNldC54LCB5OiBzb3VyY2VHYXBwZWQueSArIHNvdXJjZUdhcE9mZnNldC55IH0sXG4gICAgLi4ucG9pbnRzLFxuICAgIHsgeDogdGFyZ2V0R2FwcGVkLnggKyB0YXJnZXRHYXBPZmZzZXQueCwgeTogdGFyZ2V0R2FwcGVkLnkgKyB0YXJnZXRHYXBPZmZzZXQueSB9LFxuICAgIHRhcmdldCxcbiAgXTtcblxuICByZXR1cm4gW3BhdGhQb2ludHMsIGNlbnRlclgsIGNlbnRlclldO1xufVxuXG5mdW5jdGlvbiBnZXRCZW5kKGE6IFBvaW50LCBiOiBQb2ludCwgYzogUG9pbnQsIHNpemU6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IGJlbmRTaXplID0gTWF0aC5taW4oZGlzdGFuY2UoYSwgYikgLyAyLCBkaXN0YW5jZShiLCBjKSAvIDIsIHNpemUpO1xuICBjb25zdCB7IHgsIHkgfSA9IGI7XG5cbiAgLy8gbm8gYmVuZFxuICBpZiAoKGEueCA9PT0geCAmJiB4ID09PSBjLngpIHx8IChhLnkgPT09IHkgJiYgeSA9PT0gYy55KSkge1xuICAgIHJldHVybiBgTCR7eH0gJHt5fWA7XG4gIH1cblxuICAvLyBmaXJzdCBzZWdtZW50IGlzIGhvcml6b250YWxcbiAgaWYgKGEueSA9PT0geSkge1xuICAgIGNvbnN0IHhEaXIgPSBhLnggPCBjLnggPyAtMSA6IDE7XG4gICAgY29uc3QgeURpciA9IGEueSA8IGMueSA/IDEgOiAtMTtcbiAgICByZXR1cm4gYEwgJHt4ICsgYmVuZFNpemUgKiB4RGlyfSwke3l9USAke3h9LCR7eX0gJHt4fSwke3kgKyBiZW5kU2l6ZSAqIHlEaXJ9YDtcbiAgfVxuXG4gIGNvbnN0IHhEaXIgPSBhLnggPCBjLnggPyAxIDogLTE7XG4gIGNvbnN0IHlEaXIgPSBhLnkgPCBjLnkgPyAtMSA6IDE7XG4gIHJldHVybiBgTCAke3h9LCR7eSArIGJlbmRTaXplICogeURpcn1RICR7eH0sJHt5fSAke3ggKyBiZW5kU2l6ZSAqIHhEaXJ9LCR7eX1gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc21vb3RoU3RlcFBhdGgoXG4gIHsgc291cmNlUG9pbnQsIHRhcmdldFBvaW50LCBzb3VyY2VQb3NpdGlvbiwgdGFyZ2V0UG9zaXRpb24gfTogQ3VydmVGYWN0b3J5UGFyYW1zLFxuICBib3JkZXJSYWRpdXM6IG51bWJlciA9IDUsXG4pOiBDdXJ2ZUxheW91dCB7XG4gIGNvbnN0IFtwb2ludHMsIGxhYmVsWCwgbGFiZWxZXSA9IGdldFBvaW50cyh7XG4gICAgc291cmNlOiBzb3VyY2VQb2ludCxcbiAgICBzb3VyY2VQb3NpdGlvbixcbiAgICB0YXJnZXQ6IHRhcmdldFBvaW50LFxuICAgIHRhcmdldFBvc2l0aW9uLFxuICAgIG9mZnNldDogMjAsXG4gIH0pO1xuXG4gIGNvbnN0IHBhdGggPSBwb2ludHMucmVkdWNlPHN0cmluZz4oKHJlcywgcCwgaSkgPT4ge1xuICAgIGxldCBzZWdtZW50ID0gJyc7XG5cbiAgICBpZiAoaSA+IDAgJiYgaSA8IHBvaW50cy5sZW5ndGggLSAxKSB7XG4gICAgICBzZWdtZW50ID0gZ2V0QmVuZChwb2ludHNbaSAtIDFdLCBwLCBwb2ludHNbaSArIDFdLCBib3JkZXJSYWRpdXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZWdtZW50ID0gYCR7aSA9PT0gMCA/ICdNJyA6ICdMJ30ke3AueH0gJHtwLnl9YDtcbiAgICB9XG5cbiAgICByZXMgKz0gc2VnbWVudDtcblxuICAgIHJldHVybiByZXM7XG4gIH0sICcnKTtcblxuICAvLyBQZXJmb3JtYW5jZSBvcHRpbWl6YXRpb246IFByZS1jYWxjdWxhdGUgY3VtdWxhdGl2ZSBkaXN0YW5jZXMgYW5kIHVzZSBiaW5hcnkgc2VhcmNoXG4gIGNvbnN0IG4gPSBwb2ludHMubGVuZ3RoO1xuICBpZiAobiA8IDIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGF0aCxcbiAgICAgIGxhYmVsUG9pbnRzOiB7XG4gICAgICAgIHN0YXJ0OiB7IHg6IGxhYmVsWCwgeTogbGFiZWxZIH0sXG4gICAgICAgIGNlbnRlcjogeyB4OiBsYWJlbFgsIHk6IGxhYmVsWSB9LFxuICAgICAgICBlbmQ6IHsgeDogbGFiZWxYLCB5OiBsYWJlbFkgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8vIFByZS1jYWxjdWxhdGUgc2VnbWVudCBsZW5ndGhzIGFuZCBjdW11bGF0aXZlIGRpc3RhbmNlcyBpbiBhIHNpbmdsZSBsb29wXG4gIGNvbnN0IHNlZ21lbnRMZW5ndGhzOiBudW1iZXJbXSA9IG5ldyBBcnJheShuIC0gMSk7XG4gIGNvbnN0IGN1bXVsYXRpdmVEaXN0YW5jZXM6IG51bWJlcltdID0gbmV3IEFycmF5KG4pO1xuICBjdW11bGF0aXZlRGlzdGFuY2VzWzBdID0gMDtcblxuICBsZXQgdG90YWxMZW5ndGggPSAwO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbiAtIDE7IGkrKykge1xuICAgIGNvbnN0IGR4ID0gcG9pbnRzW2kgKyAxXS54IC0gcG9pbnRzW2ldLng7XG4gICAgY29uc3QgZHkgPSBwb2ludHNbaSArIDFdLnkgLSBwb2ludHNbaV0ueTtcbiAgICBjb25zdCBsZW4gPSBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpO1xuICAgIHNlZ21lbnRMZW5ndGhzW2ldID0gbGVuO1xuICAgIHRvdGFsTGVuZ3RoICs9IGxlbjtcbiAgICBjdW11bGF0aXZlRGlzdGFuY2VzW2kgKyAxXSA9IHRvdGFsTGVuZ3RoO1xuICB9XG5cbiAgLy8gT3B0aW1pemVkIGhlbHBlciBmdW5jdGlvbiB1c2luZyBiaW5hcnkgc2VhcmNoXG4gIGNvbnN0IGdldFBvaW50QXRSYXRpbyA9IChyYXRpbzogbnVtYmVyKTogUG9pbnQgPT4ge1xuICAgIGNvbnN0IHRhcmdldERpc3RhbmNlID0gdG90YWxMZW5ndGggKiByYXRpbztcblxuICAgIC8vIEVkZ2UgY2FzZXNcbiAgICBpZiAodGFyZ2V0RGlzdGFuY2UgPD0gMCkgcmV0dXJuIHBvaW50c1swXTtcbiAgICBpZiAodGFyZ2V0RGlzdGFuY2UgPj0gdG90YWxMZW5ndGgpIHJldHVybiBwb2ludHNbbiAtIDFdO1xuXG4gICAgLy8gQmluYXJ5IHNlYXJjaCBmb3IgdGhlIGNvcnJlY3Qgc2VnbWVudFxuICAgIGxldCBsb3cgPSAwO1xuICAgIGxldCBoaWdoID0gbiAtIDE7XG5cbiAgICB3aGlsZSAobG93IDwgaGlnaCAtIDEpIHtcbiAgICAgIGNvbnN0IG1pZCA9IChsb3cgKyBoaWdoKSA+Pj4gMTsgLy8gQml0d2lzZSByaWdodCBzaGlmdCBpcyBmYXN0ZXIgdGhhbiBNYXRoLmZsb29yXG4gICAgICBpZiAoY3VtdWxhdGl2ZURpc3RhbmNlc1ttaWRdIDwgdGFyZ2V0RGlzdGFuY2UpIHtcbiAgICAgICAgbG93ID0gbWlkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaGlnaCA9IG1pZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDYWxjdWxhdGUgcG9zaXRpb24gd2l0aGluIHRoZSBzZWdtZW50XG4gICAgY29uc3Qgc2VnbWVudFN0YXJ0RGlzdGFuY2UgPSBjdW11bGF0aXZlRGlzdGFuY2VzW2xvd107XG4gICAgY29uc3QgbG9jYWxEaXN0YW5jZSA9IHRhcmdldERpc3RhbmNlIC0gc2VnbWVudFN0YXJ0RGlzdGFuY2U7XG4gICAgY29uc3QgdCA9IGxvY2FsRGlzdGFuY2UgLyBzZWdtZW50TGVuZ3Roc1tsb3ddO1xuXG4gICAgLy8gTGluZWFyIGludGVycG9sYXRpb25cbiAgICBjb25zdCBzdGFydCA9IHBvaW50c1tsb3ddO1xuICAgIGNvbnN0IGVuZCA9IHBvaW50c1tsb3cgKyAxXTtcblxuICAgIHJldHVybiB7XG4gICAgICB4OiBzdGFydC54ICsgKGVuZC54IC0gc3RhcnQueCkgKiB0LFxuICAgICAgeTogc3RhcnQueSArIChlbmQueSAtIHN0YXJ0LnkpICogdCxcbiAgICB9O1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgcGF0aCxcbiAgICBsYWJlbFBvaW50czoge1xuICAgICAgc3RhcnQ6IGdldFBvaW50QXRSYXRpbygwLjE1KSxcbiAgICAgIGNlbnRlcjogeyB4OiBsYWJlbFgsIHk6IGxhYmVsWSB9LFxuICAgICAgZW5kOiBnZXRQb2ludEF0UmF0aW8oMC44NSksXG4gICAgfSxcbiAgfTtcbn1cbiJdfQ==
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { getPointOnLineByRatio } from '../point-on-line-by-ratio';
|
|
2
|
-
export function straightPath({ sourcePoint, targetPoint }) {
|
|
3
|
-
return {
|
|
4
|
-
path: `M ${sourcePoint.x},${sourcePoint.y}L ${targetPoint.x},${targetPoint.y}`,
|
|
5
|
-
labelPoints: {
|
|
6
|
-
start: getPointOnLineByRatio(sourcePoint, targetPoint, 0.15),
|
|
7
|
-
center: getPointOnLineByRatio(sourcePoint, targetPoint, 0.5),
|
|
8
|
-
end: getPointOnLineByRatio(sourcePoint, targetPoint, 0.85),
|
|
9
|
-
},
|
|
10
|
-
};
|
|
11
|
-
}
|
|
12
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyYWlnaC1wYXRoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXZmbG93LWxpYi9zcmMvbGliL3ZmbG93L21hdGgvZWRnZS1wYXRoL3N0cmFpZ2gtcGF0aC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUVsRSxNQUFNLFVBQVUsWUFBWSxDQUFDLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBc0I7SUFDM0UsT0FBTztRQUNMLElBQUksRUFBRSxLQUFLLFdBQVcsQ0FBQyxDQUFDLElBQUksV0FBVyxDQUFDLENBQUMsS0FBSyxXQUFXLENBQUMsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxDQUFDLEVBQUU7UUFDOUUsV0FBVyxFQUFFO1lBQ1gsS0FBSyxFQUFFLHFCQUFxQixDQUFDLFdBQVcsRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDO1lBQzVELE1BQU0sRUFBRSxxQkFBcUIsQ0FBQyxXQUFXLEVBQUUsV0FBVyxFQUFFLEdBQUcsQ0FBQztZQUM1RCxHQUFHLEVBQUUscUJBQXFCLENBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUM7U0FDM0Q7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEN1cnZlRmFjdG9yeVBhcmFtcywgQ3VydmVMYXlvdXQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2N1cnZlLWZhY3RvcnkuaW50ZXJmYWNlJztcbmltcG9ydCB7IGdldFBvaW50T25MaW5lQnlSYXRpbyB9IGZyb20gJy4uL3BvaW50LW9uLWxpbmUtYnktcmF0aW8nO1xuXG5leHBvcnQgZnVuY3Rpb24gc3RyYWlnaHRQYXRoKHsgc291cmNlUG9pbnQsIHRhcmdldFBvaW50IH06IEN1cnZlRmFjdG9yeVBhcmFtcyk6IEN1cnZlTGF5b3V0IHtcbiAgcmV0dXJuIHtcbiAgICBwYXRoOiBgTSAke3NvdXJjZVBvaW50Lnh9LCR7c291cmNlUG9pbnQueX1MICR7dGFyZ2V0UG9pbnQueH0sJHt0YXJnZXRQb2ludC55fWAsXG4gICAgbGFiZWxQb2ludHM6IHtcbiAgICAgIHN0YXJ0OiBnZXRQb2ludE9uTGluZUJ5UmF0aW8oc291cmNlUG9pbnQsIHRhcmdldFBvaW50LCAwLjE1KSxcbiAgICAgIGNlbnRlcjogZ2V0UG9pbnRPbkxpbmVCeVJhdGlvKHNvdXJjZVBvaW50LCB0YXJnZXRQb2ludCwgMC41KSxcbiAgICAgIGVuZDogZ2V0UG9pbnRPbkxpbmVCeVJhdGlvKHNvdXJjZVBvaW50LCB0YXJnZXRQb2ludCwgMC44NSksXG4gICAgfSxcbiAgfTtcbn1cbiJdfQ==
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Get point on line
|
|
3
|
-
*
|
|
4
|
-
* https://math.stackexchange.com/questions/563566/how-do-i-find-the-middle1-2-1-3-1-4-etc-of-a-line
|
|
5
|
-
*/
|
|
6
|
-
export function getPointOnLineByRatio(start, end, ratio) {
|
|
7
|
-
return {
|
|
8
|
-
x: (1 - ratio) * start.x + ratio * end.x,
|
|
9
|
-
y: (1 - ratio) * start.y + ratio * end.y,
|
|
10
|
-
};
|
|
11
|
-
}
|
|
12
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9pbnQtb24tbGluZS1ieS1yYXRpby5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC12Zmxvdy1saWIvc3JjL2xpYi92Zmxvdy9tYXRoL3BvaW50LW9uLWxpbmUtYnktcmF0aW8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUE7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxLQUFZLEVBQUUsR0FBVSxFQUFFLEtBQWE7SUFDM0UsT0FBTztRQUNMLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxHQUFHLENBQUMsQ0FBQztRQUN4QyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsR0FBRyxDQUFDLENBQUM7S0FDekMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQb2ludCB9IGZyb20gJy4uL2ludGVyZmFjZXMvcG9pbnQuaW50ZXJmYWNlJztcblxuLyoqXG4gKiBHZXQgcG9pbnQgb24gbGluZVxuICpcbiAqIGh0dHBzOi8vbWF0aC5zdGFja2V4Y2hhbmdlLmNvbS9xdWVzdGlvbnMvNTYzNTY2L2hvdy1kby1pLWZpbmQtdGhlLW1pZGRsZTEtMi0xLTMtMS00LWV0Yy1vZi1hLWxpbmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBvaW50T25MaW5lQnlSYXRpbyhzdGFydDogUG9pbnQsIGVuZDogUG9pbnQsIHJhdGlvOiBudW1iZXIpOiBQb2ludCB7XG4gIHJldHVybiB7XG4gICAgeDogKDEgLSByYXRpbykgKiBzdGFydC54ICsgcmF0aW8gKiBlbmQueCxcbiAgICB5OiAoMSAtIHJhdGlvKSAqIHN0YXJ0LnkgKyByYXRpbyAqIGVuZC55LFxuICB9O1xufVxuIl19
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
export class ConnectionModel {
|
|
2
|
-
constructor(settings) {
|
|
3
|
-
this.settings = settings;
|
|
4
|
-
this.curve = settings.curve ?? 'bezier';
|
|
5
|
-
this.type = settings.type ?? 'default';
|
|
6
|
-
this.mode = settings.mode ?? 'strict';
|
|
7
|
-
const validatorsToRun = this.getValidators(settings);
|
|
8
|
-
this.validator = (connection) => validatorsToRun.every((v) => v(connection));
|
|
9
|
-
}
|
|
10
|
-
getValidators(settings) {
|
|
11
|
-
const validators = [];
|
|
12
|
-
validators.push(notSelfValidator);
|
|
13
|
-
if (this.mode === 'loose') {
|
|
14
|
-
validators.push(hasSourceAndTargetHandleValidator);
|
|
15
|
-
}
|
|
16
|
-
if (settings.validator) {
|
|
17
|
-
validators.push(settings.validator);
|
|
18
|
-
}
|
|
19
|
-
return validators;
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Internal validator that not allows self connections
|
|
24
|
-
*/
|
|
25
|
-
const notSelfValidator = (connection) => {
|
|
26
|
-
return connection.source !== connection.target;
|
|
27
|
-
};
|
|
28
|
-
const hasSourceAndTargetHandleValidator = (connection) => {
|
|
29
|
-
return connection.sourceHandle !== undefined && connection.targetHandle !== undefined;
|
|
30
|
-
};
|
|
31
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29ubmVjdGlvbi5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC12Zmxvdy1saWIvc3JjL2xpYi92Zmxvdy9tb2RlbHMvY29ubmVjdGlvbi5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFLQSxNQUFNLE9BQU8sZUFBZTtJQU0xQixZQUFtQixRQUE0QjtRQUE1QixhQUFRLEdBQVIsUUFBUSxDQUFvQjtRQUM3QyxJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLElBQUksUUFBUSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksSUFBSSxTQUFTLENBQUM7UUFDdkMsSUFBSSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsSUFBSSxJQUFJLFFBQVEsQ0FBQztRQUV0QyxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQy9FLENBQUM7SUFFTyxhQUFhLENBQUMsUUFBNEI7UUFDaEQsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBRXRCLFVBQVUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUVsQyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDMUIsVUFBVSxDQUFDLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO1FBQ3JELENBQUM7UUFFRCxJQUFJLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN2QixVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN0QyxDQUFDO1FBRUQsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztDQUNGO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLGdCQUFnQixHQUFHLENBQUMsVUFBc0IsRUFBRSxFQUFFO0lBQ2xELE9BQU8sVUFBVSxDQUFDLE1BQU0sS0FBSyxVQUFVLENBQUMsTUFBTSxDQUFDO0FBQ2pELENBQUMsQ0FBQztBQUVGLE1BQU0saUNBQWlDLEdBQUcsQ0FBQyxVQUFzQixFQUFFLEVBQUU7SUFDbkUsT0FBTyxVQUFVLENBQUMsWUFBWSxLQUFLLFNBQVMsSUFBSSxVQUFVLENBQUMsWUFBWSxLQUFLLFNBQVMsQ0FBQztBQUN4RixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb25uZWN0aW9uU2V0dGluZ3MsIENvbm5lY3Rpb25WYWxpZGF0b3JGbiB9IGZyb20gJy4uL2ludGVyZmFjZXMvY29ubmVjdGlvbi1zZXR0aW5ncy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQ29ubmVjdGlvbiB9IGZyb20gJy4uL2ludGVyZmFjZXMvY29ubmVjdGlvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQ3VydmUsIEVkZ2VUeXBlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9lZGdlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBDb25uZWN0aW9uTW9kZSB9IGZyb20gJy4uL3R5cGVzL2Nvbm5lY3Rpb24tbW9kZS50eXBlJztcblxuZXhwb3J0IGNsYXNzIENvbm5lY3Rpb25Nb2RlbCB7XG4gIHB1YmxpYyBjdXJ2ZTogQ3VydmU7XG4gIHB1YmxpYyB0eXBlOiBFZGdlVHlwZTtcbiAgcHVibGljIHZhbGlkYXRvcjogQ29ubmVjdGlvblZhbGlkYXRvckZuO1xuICBwdWJsaWMgbW9kZTogQ29ubmVjdGlvbk1vZGU7XG5cbiAgY29uc3RydWN0b3IocHVibGljIHNldHRpbmdzOiBDb25uZWN0aW9uU2V0dGluZ3MpIHtcbiAgICB0aGlzLmN1cnZlID0gc2V0dGluZ3MuY3VydmUgPz8gJ2Jlemllcic7XG4gICAgdGhpcy50eXBlID0gc2V0dGluZ3MudHlwZSA/PyAnZGVmYXVsdCc7XG4gICAgdGhpcy5tb2RlID0gc2V0dGluZ3MubW9kZSA/PyAnc3RyaWN0JztcblxuICAgIGNvbnN0IHZhbGlkYXRvcnNUb1J1biA9IHRoaXMuZ2V0VmFsaWRhdG9ycyhzZXR0aW5ncyk7XG4gICAgdGhpcy52YWxpZGF0b3IgPSAoY29ubmVjdGlvbikgPT4gdmFsaWRhdG9yc1RvUnVuLmV2ZXJ5KCh2KSA9PiB2KGNvbm5lY3Rpb24pKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VmFsaWRhdG9ycyhzZXR0aW5nczogQ29ubmVjdGlvblNldHRpbmdzKSB7XG4gICAgY29uc3QgdmFsaWRhdG9ycyA9IFtdO1xuXG4gICAgdmFsaWRhdG9ycy5wdXNoKG5vdFNlbGZWYWxpZGF0b3IpO1xuXG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ2xvb3NlJykge1xuICAgICAgdmFsaWRhdG9ycy5wdXNoKGhhc1NvdXJjZUFuZFRhcmdldEhhbmRsZVZhbGlkYXRvcik7XG4gICAgfVxuXG4gICAgaWYgKHNldHRpbmdzLnZhbGlkYXRvcikge1xuICAgICAgdmFsaWRhdG9ycy5wdXNoKHNldHRpbmdzLnZhbGlkYXRvcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbGlkYXRvcnM7XG4gIH1cbn1cblxuLyoqXG4gKiBJbnRlcm5hbCB2YWxpZGF0b3IgdGhhdCBub3QgYWxsb3dzIHNlbGYgY29ubmVjdGlvbnNcbiAqL1xuY29uc3Qgbm90U2VsZlZhbGlkYXRvciA9IChjb25uZWN0aW9uOiBDb25uZWN0aW9uKSA9PiB7XG4gIHJldHVybiBjb25uZWN0aW9uLnNvdXJjZSAhPT0gY29ubmVjdGlvbi50YXJnZXQ7XG59O1xuXG5jb25zdCBoYXNTb3VyY2VBbmRUYXJnZXRIYW5kbGVWYWxpZGF0b3IgPSAoY29ubmVjdGlvbjogQ29ubmVjdGlvbikgPT4ge1xuICByZXR1cm4gY29ubmVjdGlvbi5zb3VyY2VIYW5kbGUgIT09IHVuZGVmaW5lZCAmJiBjb25uZWN0aW9uLnRhcmdldEhhbmRsZSAhPT0gdW5kZWZpbmVkO1xufTtcbiJdfQ==
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { signal } from '@angular/core';
|
|
2
|
-
export class EdgeLabelModel {
|
|
3
|
-
constructor(edgeLabel) {
|
|
4
|
-
this.edgeLabel = edgeLabel;
|
|
5
|
-
this.size = signal({ width: 0, height: 0 });
|
|
6
|
-
}
|
|
7
|
-
}
|
|
8
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRnZS1sYWJlbC5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC12Zmxvdy1saWIvc3JjL2xpYi92Zmxvdy9tb2RlbHMvZWRnZS1sYWJlbC5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR3ZDLE1BQU0sT0FBTyxjQUFjO0lBR3pCLFlBQW1CLFNBQW9CO1FBQXBCLGNBQVMsR0FBVCxTQUFTLENBQVc7UUFGaEMsU0FBSSxHQUFHLE1BQU0sQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFSixDQUFDO0NBQzVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBFZGdlTGFiZWwgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2VkZ2UtbGFiZWwuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIEVkZ2VMYWJlbE1vZGVsIHtcbiAgcHVibGljIHNpemUgPSBzaWduYWwoeyB3aWR0aDogMCwgaGVpZ2h0OiAwIH0pO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBlZGdlTGFiZWw6IEVkZ2VMYWJlbCkge31cbn1cbiJdfQ==
|
|
@@ -1,208 +0,0 @@
|
|
|
1
|
-
import { computed, inject, signal } from '@angular/core';
|
|
2
|
-
import { EdgeLabelModel } from './edge-label.model';
|
|
3
|
-
import { straightPath } from '../math/edge-path/straigh-path';
|
|
4
|
-
import { bezierPath } from '../math/edge-path/bezier-path';
|
|
5
|
-
import { toObservable } from '@angular/core/rxjs-interop';
|
|
6
|
-
import { smoothStepPath } from '../math/edge-path/smooth-step-path';
|
|
7
|
-
import { hashCode } from '../utils/hash';
|
|
8
|
-
import { FlowEntitiesService } from '../services/flow-entities.service';
|
|
9
|
-
import { extendedComputed } from '../utils/signals/extended-computed';
|
|
10
|
-
export class EdgeModel {
|
|
11
|
-
constructor(edge) {
|
|
12
|
-
this.edge = edge;
|
|
13
|
-
this.flowEntitiesService = inject(FlowEntitiesService);
|
|
14
|
-
this.source = signal(undefined);
|
|
15
|
-
this.target = signal(undefined);
|
|
16
|
-
this.selected = signal(false);
|
|
17
|
-
this.selected$ = toObservable(this.selected);
|
|
18
|
-
this.shouldLoad = computed(() => (this.source()?.shouldLoad() ?? false) && (this.target()?.shouldLoad() ?? false));
|
|
19
|
-
this.renderOrder = signal(0);
|
|
20
|
-
this.detached = computed(() => {
|
|
21
|
-
const source = this.source();
|
|
22
|
-
const target = this.target();
|
|
23
|
-
if (!source || !target) {
|
|
24
|
-
return true;
|
|
25
|
-
}
|
|
26
|
-
let existsSourceHandle = false;
|
|
27
|
-
let existsTargetHandle = false;
|
|
28
|
-
if (this.edge.sourceHandle) {
|
|
29
|
-
existsSourceHandle = !!source.handles().find((handle) => handle.rawHandle.id === this.edge.sourceHandle);
|
|
30
|
-
}
|
|
31
|
-
else {
|
|
32
|
-
existsSourceHandle = !!source.handles().find((handle) => handle.rawHandle.type === 'source');
|
|
33
|
-
}
|
|
34
|
-
if (this.edge.targetHandle) {
|
|
35
|
-
existsTargetHandle = !!target.handles().find((handle) => handle.rawHandle.id === this.edge.targetHandle);
|
|
36
|
-
}
|
|
37
|
-
else {
|
|
38
|
-
existsTargetHandle = !!target.handles().find((handle) => handle.rawHandle.type === 'target');
|
|
39
|
-
}
|
|
40
|
-
return !existsSourceHandle || !existsTargetHandle;
|
|
41
|
-
});
|
|
42
|
-
this.detached$ = toObservable(this.detached);
|
|
43
|
-
this.path = computed(() => {
|
|
44
|
-
const source = this.sourceHandle();
|
|
45
|
-
const target = this.targetHandle();
|
|
46
|
-
// TODO: don't like this
|
|
47
|
-
if (!source || !target) {
|
|
48
|
-
return { path: '' };
|
|
49
|
-
}
|
|
50
|
-
const params = this.getPathFactoryParams(source, target);
|
|
51
|
-
switch (this.curve) {
|
|
52
|
-
case 'straight':
|
|
53
|
-
return straightPath(params);
|
|
54
|
-
case 'bezier':
|
|
55
|
-
return bezierPath(params);
|
|
56
|
-
case 'smooth-step':
|
|
57
|
-
return smoothStepPath(params);
|
|
58
|
-
case 'step':
|
|
59
|
-
return smoothStepPath(params, 0);
|
|
60
|
-
default:
|
|
61
|
-
return this.curve(params);
|
|
62
|
-
}
|
|
63
|
-
});
|
|
64
|
-
this.sourceHandle = extendedComputed((previousHandle) => {
|
|
65
|
-
let handle = null;
|
|
66
|
-
if (this.floating) {
|
|
67
|
-
handle = this.closestHandles().sourceHandle;
|
|
68
|
-
}
|
|
69
|
-
else {
|
|
70
|
-
if (this.edge.sourceHandle) {
|
|
71
|
-
handle =
|
|
72
|
-
this.source()
|
|
73
|
-
?.handles()
|
|
74
|
-
.find((handle) => handle.rawHandle.id === this.edge.sourceHandle) ?? null;
|
|
75
|
-
}
|
|
76
|
-
else {
|
|
77
|
-
handle =
|
|
78
|
-
this.source()
|
|
79
|
-
?.handles()
|
|
80
|
-
.find((handle) => handle.rawHandle.type === 'source') ?? null;
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
// In case of virtual scrolling, if the node is scrolled out of view the handle may disappear
|
|
84
|
-
// which could lead to the edge not being rendered
|
|
85
|
-
// so we return the previous handle if the current one is null
|
|
86
|
-
// TODO: check if this breaks anything
|
|
87
|
-
if (handle === null) {
|
|
88
|
-
return previousHandle;
|
|
89
|
-
}
|
|
90
|
-
return handle;
|
|
91
|
-
});
|
|
92
|
-
this.targetHandle = extendedComputed((previousHandle) => {
|
|
93
|
-
let handle = null;
|
|
94
|
-
if (this.floating) {
|
|
95
|
-
handle = this.closestHandles().targetHandle;
|
|
96
|
-
}
|
|
97
|
-
else {
|
|
98
|
-
if (this.edge.targetHandle) {
|
|
99
|
-
handle =
|
|
100
|
-
this.target()
|
|
101
|
-
?.handles()
|
|
102
|
-
.find((handle) => handle.rawHandle.id === this.edge.targetHandle) ?? null;
|
|
103
|
-
}
|
|
104
|
-
else {
|
|
105
|
-
handle =
|
|
106
|
-
this.target()
|
|
107
|
-
?.handles()
|
|
108
|
-
.find((handle) => handle.rawHandle.type === 'target') ?? null;
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
// In case of virtual scrolling, if the node is scrolled out of view the handle may disappear
|
|
112
|
-
// which could lead to the edge not being rendered
|
|
113
|
-
// so we return the previous handle if the current one is null
|
|
114
|
-
// TODO: check if this breaks anything
|
|
115
|
-
if (handle === null) {
|
|
116
|
-
return previousHandle;
|
|
117
|
-
}
|
|
118
|
-
return handle;
|
|
119
|
-
});
|
|
120
|
-
this.closestHandles = computed(() => {
|
|
121
|
-
const source = this.source();
|
|
122
|
-
const target = this.target();
|
|
123
|
-
if (!source || !target) {
|
|
124
|
-
return { sourceHandle: null, targetHandle: null };
|
|
125
|
-
}
|
|
126
|
-
// Get all source handles from source node
|
|
127
|
-
const sourceHandles = this.flowEntitiesService.connection().mode === 'strict'
|
|
128
|
-
? source.handles().filter((h) => h.rawHandle.type === 'source')
|
|
129
|
-
: source.handles();
|
|
130
|
-
// Get all target handles from target node
|
|
131
|
-
const targetHandles = this.flowEntitiesService.connection().mode === 'strict'
|
|
132
|
-
? target.handles().filter((h) => h.rawHandle.type === 'target')
|
|
133
|
-
: target.handles();
|
|
134
|
-
if (sourceHandles.length === 0 || targetHandles.length === 0) {
|
|
135
|
-
return { sourceHandle: null, targetHandle: null };
|
|
136
|
-
}
|
|
137
|
-
let minDistance = Infinity;
|
|
138
|
-
let closestSourceHandle = null;
|
|
139
|
-
let closestTargetHandle = null;
|
|
140
|
-
// Check all combinations of source and target handles
|
|
141
|
-
for (const sourceHandle of sourceHandles) {
|
|
142
|
-
for (const targetHandle of targetHandles) {
|
|
143
|
-
const sourcePoint = sourceHandle.pointAbsolute();
|
|
144
|
-
const targetPoint = targetHandle.pointAbsolute();
|
|
145
|
-
const distance = Math.sqrt(Math.pow(sourcePoint.x - targetPoint.x, 2) + Math.pow(sourcePoint.y - targetPoint.y, 2));
|
|
146
|
-
if (distance < minDistance) {
|
|
147
|
-
minDistance = distance;
|
|
148
|
-
closestSourceHandle = sourceHandle;
|
|
149
|
-
closestTargetHandle = targetHandle;
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
return {
|
|
154
|
-
sourceHandle: closestSourceHandle,
|
|
155
|
-
targetHandle: closestTargetHandle,
|
|
156
|
-
};
|
|
157
|
-
});
|
|
158
|
-
/**
|
|
159
|
-
* TODO: not reactive
|
|
160
|
-
*/
|
|
161
|
-
this.markerStartUrl = computed(() => {
|
|
162
|
-
const marker = this.edge.markers?.start;
|
|
163
|
-
return marker ? `url(#${hashCode(JSON.stringify(marker))})` : '';
|
|
164
|
-
});
|
|
165
|
-
/**
|
|
166
|
-
* TODO: not reactive
|
|
167
|
-
*/
|
|
168
|
-
this.markerEndUrl = computed(() => {
|
|
169
|
-
const marker = this.edge.markers?.end;
|
|
170
|
-
return marker ? `url(#${hashCode(JSON.stringify(marker))})` : '';
|
|
171
|
-
});
|
|
172
|
-
this.context = {
|
|
173
|
-
$implicit: {
|
|
174
|
-
// TODO: check if edge could change
|
|
175
|
-
edge: this.edge,
|
|
176
|
-
path: computed(() => this.path().path),
|
|
177
|
-
markerStart: this.markerStartUrl,
|
|
178
|
-
markerEnd: this.markerEndUrl,
|
|
179
|
-
selected: this.selected.asReadonly(),
|
|
180
|
-
shouldLoad: this.shouldLoad,
|
|
181
|
-
},
|
|
182
|
-
};
|
|
183
|
-
this.edgeLabels = {};
|
|
184
|
-
this.type = edge.type ?? 'default';
|
|
185
|
-
this.curve = edge.curve ?? 'bezier';
|
|
186
|
-
this.reconnectable = edge.reconnectable ?? false;
|
|
187
|
-
this.floating = edge.floating ?? false;
|
|
188
|
-
if (edge.edgeLabels?.start)
|
|
189
|
-
this.edgeLabels.start = new EdgeLabelModel(edge.edgeLabels.start);
|
|
190
|
-
if (edge.edgeLabels?.center)
|
|
191
|
-
this.edgeLabels.center = new EdgeLabelModel(edge.edgeLabels.center);
|
|
192
|
-
if (edge.edgeLabels?.end)
|
|
193
|
-
this.edgeLabels.end = new EdgeLabelModel(edge.edgeLabels.end);
|
|
194
|
-
}
|
|
195
|
-
getPathFactoryParams(source, target) {
|
|
196
|
-
return {
|
|
197
|
-
mode: 'edge',
|
|
198
|
-
edge: this.edge,
|
|
199
|
-
sourcePoint: source.pointAbsolute(),
|
|
200
|
-
targetPoint: target.pointAbsolute(),
|
|
201
|
-
sourcePosition: source.rawHandle.position,
|
|
202
|
-
targetPosition: target.rawHandle.position,
|
|
203
|
-
allEdges: this.flowEntitiesService.rawEdges(),
|
|
204
|
-
allNodes: this.flowEntitiesService.rawNodes(),
|
|
205
|
-
};
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRnZS5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC12Zmxvdy1saWIvc3JjL2xpYi92Zmxvdy9tb2RlbHMvZWRnZS5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHekQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXBELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM5RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRTFELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBS3pDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRXRFLE1BQU0sT0FBTyxTQUFTO0lBcU5wQixZQUFtQixJQUFVO1FBQVYsU0FBSSxHQUFKLElBQUksQ0FBTTtRQXBOWix3QkFBbUIsR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUU1RCxXQUFNLEdBQUcsTUFBTSxDQUF3QixTQUFTLENBQUMsQ0FBQztRQUNsRCxXQUFNLEdBQUcsTUFBTSxDQUF3QixTQUFTLENBQUMsQ0FBQztRQU1sRCxhQUFRLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pCLGNBQVMsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXhDLGVBQVUsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FB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QUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pHLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxHQUFHO1lBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEdBQUcsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMxRixDQUFDO0lBRU8sb0JBQW9CLENBQUMsTUFBbUIsRUFBRSxNQUFtQjtRQUNuRSxPQUFPO1lBQ0wsSUFBSSxFQUFFLE1BQU07WUFDWixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZixXQUFXLEVBQUUsTUFBTSxDQUFDLGFBQWEsRUFBRTtZQUNuQyxXQUFXLEVBQUUsTUFBTSxDQUFDLGFBQWEsRUFBRTtZQUNuQyxjQUFjLEVBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRO1lBQ3pDLGNBQWMsRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVE7WUFDekMsUUFBUSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUU7WUFDN0MsUUFBUSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUU7U0FDOUMsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvbXB1dGVkLCBpbmplY3QsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRWRnZUxhYmVsUG9zaXRpb24gfSBmcm9tICcuLi9pbnRlcmZhY2VzL2VkZ2UtbGFiZWwuaW50ZXJmYWNlJztcbmltcG9ydCB7IEVkZ2UsIEN1cnZlLCBFZGdlVHlwZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvZWRnZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRWRnZUxhYmVsTW9kZWwgfSBmcm9tICcuL2VkZ2UtbGFiZWwubW9kZWwnO1xuaW1wb3J0IHsgTm9kZU1vZGVsIH0gZnJvbSAnLi9ub2RlLm1vZGVsJztcbmltcG9ydCB7IHN0cmFpZ2h0UGF0aCB9IGZyb20gJy4uL21hdGgvZWRnZS1wYXRoL3N0cmFpZ2gtcGF0aCc7XG5pbXBvcnQgeyBiZXppZXJQYXRoIH0gZnJvbSAnLi4vbWF0aC9lZGdlLXBhdGgvYmV6aWVyLXBhdGgnO1xuaW1wb3J0IHsgdG9PYnNlcnZhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgRmxvd0VudGl0eSB9IGZyb20gJy4uL2ludGVyZmFjZXMvZmxvdy1lbnRpdHkuaW50ZXJmYWNlJztcbmltcG9ydCB7IHNtb290aFN0ZXBQYXRoIH0gZnJvbSAnLi4vbWF0aC9lZGdlLXBhdGgvc21vb3RoLXN0ZXAtcGF0aCc7XG5pbXBvcnQgeyBoYXNoQ29kZSB9IGZyb20gJy4uL3V0aWxzL2hhc2gnO1xuaW1wb3J0IHsgQ29udGV4dGFibGUgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2NvbnRleHRhYmxlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBFZGdlQ29udGV4dCB9IGZyb20gJy4uL2ludGVyZmFjZXMvdGVtcGxhdGUtY29udGV4dC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSGFuZGxlTW9kZWwgfSBmcm9tICcuL2hhbmRsZS5tb2RlbCc7XG5pbXBvcnQgeyBDdXJ2ZUZhY3RvcnlQYXJhbXMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2N1cnZlLWZhY3RvcnkuaW50ZXJmYWNlJztcbmltcG9ydCB7IEZsb3dFbnRpdGllc1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9mbG93LWVudGl0aWVzLnNlcnZpY2UnO1xuaW1wb3J0IHsgZXh0ZW5kZWRDb21wdXRlZCB9IGZyb20gJy4uL3V0aWxzL3NpZ25hbHMvZXh0ZW5kZWQtY29tcHV0ZWQnO1xuXG5leHBvcnQgY2xhc3MgRWRnZU1vZGVsIGltcGxlbWVudHMgRmxvd0VudGl0eSwgQ29udGV4dGFibGU8RWRnZUNvbnRleHQ+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBmbG93RW50aXRpZXNTZXJ2aWNlID0gaW5qZWN0KEZsb3dFbnRpdGllc1NlcnZpY2UpO1xuXG4gIHB1YmxpYyBzb3VyY2UgPSBzaWduYWw8Tm9kZU1vZGVsIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwdWJsaWMgdGFyZ2V0ID0gc2lnbmFsPE5vZGVNb2RlbCB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHVibGljIGN1cnZlOiBDdXJ2ZTtcbiAgcHVibGljIHR5cGU6IEVkZ2VUeXBlO1xuICBwdWJsaWMgcmVjb25uZWN0YWJsZTogYm9vbGVhbiB8ICdzb3VyY2UnIHwgJ3RhcmdldCc7XG4gIHB1YmxpYyBmbG9hdGluZzogYm9vbGVhbjtcblxuICBwdWJsaWMgc2VsZWN0ZWQgPSBzaWduYWwoZmFsc2UpO1xuICBwdWJsaWMgc2VsZWN0ZWQkID0gdG9PYnNlcnZhYmxlKHRoaXMuc2VsZWN0ZWQpO1xuXG4gIHB1YmxpYyBzaG91bGRMb2FkID0gY29tcHV0ZWQoKCkgPT4gKHRoaXMuc291cmNlKCk/LnNob3VsZExvYWQoKSA/PyBmYWxzZSkgJiYgKHRoaXMudGFyZ2V0KCk/LnNob3VsZExvYWQoKSA/PyBmYWxzZSkpO1xuXG4gIHB1YmxpYyByZW5kZXJPcmRlciA9IHNpZ25hbCgwKTtcblxuICBwdWJsaWMgZGV0YWNoZWQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3Qgc291cmNlID0gdGhpcy5zb3VyY2UoKTtcbiAgICBjb25zdCB0YXJnZXQgPSB0aGlzLnRhcmdldCgpO1xuXG4gICAgaWYgKCFzb3VyY2UgfHwgIXRhcmdldCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgbGV0IGV4aXN0c1NvdXJjZUhhbmRsZSA9IGZhbHNlO1xuICAgIGxldCBleGlzdHNUYXJnZXRIYW5kbGUgPSBmYWxzZTtcblxuICAgIGlmICh0aGlzLmVkZ2Uuc291cmNlSGFuZGxlKSB7XG4gICAgICBleGlzdHNTb3VyY2VIYW5kbGUgPSAhIXNvdXJjZS5oYW5kbGVzKCkuZmluZCgoaGFuZGxlKSA9PiBoYW5kbGUucmF3SGFuZGxlLmlkID09PSB0aGlzLmVkZ2Uuc291cmNlSGFuZGxlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXhpc3RzU291cmNlSGFuZGxlID0gISFzb3VyY2UuaGFuZGxlcygpLmZpbmQoKGhhbmRsZSkgPT4gaGFuZGxlLnJhd0hhbmRsZS50eXBlID09PSAnc291cmNlJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZWRnZS50YXJnZXRIYW5kbGUpIHtcbiAgICAgIGV4aXN0c1RhcmdldEhhbmRsZSA9ICEhdGFyZ2V0LmhhbmRsZXMoKS5maW5kKChoYW5kbGUpID0+IGhhbmRsZS5yYXdIYW5kbGUuaWQgPT09IHRoaXMuZWRnZS50YXJnZXRIYW5kbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBleGlzdHNUYXJnZXRIYW5kbGUgPSAhIXRhcmdldC5oYW5kbGVzKCkuZmluZCgoaGFuZGxlKSA9PiBoYW5kbGUucmF3SGFuZGxlLnR5cGUgPT09ICd0YXJnZXQnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gIWV4aXN0c1NvdXJjZUhhbmRsZSB8fCAhZXhpc3RzVGFyZ2V0SGFuZGxlO1xuICB9KTtcblxuICBwdWJsaWMgZGV0YWNoZWQkID0gdG9PYnNlcnZhYmxlKHRoaXMuZGV0YWNoZWQpO1xuXG4gIHB1YmxpYyBwYXRoID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuc291cmNlSGFuZGxlKCk7XG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpcy50YXJnZXRIYW5kbGUoKTtcblxuICAgIC8vIFRPRE86IGRvbid0IGxpa2UgdGhpc1xuICAgIGlmICghc291cmNlIHx8ICF0YXJnZXQpIHtcbiAgICAgIHJldHVybiB7IHBhdGg6ICcnIH07XG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1zID0gdGhpcy5nZXRQYXRoRmFjdG9yeVBhcmFtcyhzb3VyY2UsIHRhcmdldCk7XG5cbiAgICBzd2l0Y2ggKHRoaXMuY3VydmUpIHtcbiAgICAgIGNhc2UgJ3N0cmFpZ2h0JzpcbiAgICAgICAgcmV0dXJuIHN0cmFpZ2h0UGF0aChwYXJhbXMpO1xuICAgICAgY2FzZSAnYmV6aWVyJzpcbiAgICAgICAgcmV0dXJuIGJlemllclBhdGgocGFyYW1zKTtcbiAgICAgIGNhc2UgJ3Ntb290aC1zdGVwJzpcbiAgICAgICAgcmV0dXJuIHNtb290aFN0ZXBQYXRoKHBhcmFtcyk7XG4gICAgICBjYXNlICdzdGVwJzpcbiAgICAgICAgcmV0dXJuIHNtb290aFN0ZXBQYXRoKHBhcmFtcywgMCk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdGhpcy5jdXJ2ZShwYXJhbXMpO1xuICAgIH1cbiAgfSk7XG5cbiAgcHVibGljIHNvdXJjZUhhbmRsZSA9IGV4dGVuZGVkQ29tcHV0ZWQ8SGFuZGxlTW9kZWwgfCBudWxsPigocHJldmlvdXNIYW5kbGUpID0+IHtcbiAgICBsZXQgaGFuZGxlOiBIYW5kbGVNb2RlbCB8IG51bGwgPSBudWxsO1xuXG4gICAgaWYgKHRoaXMuZmxvYXRpbmcpIHtcbiAgICAgIGhhbmRsZSA9IHRoaXMuY2xvc2VzdEhhbmRsZXMoKS5zb3VyY2VIYW5kbGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmVkZ2Uuc291cmNlSGFuZGxlKSB7XG4gICAgICAgIGhhbmRsZSA9XG4gICAgICAgICAgdGhpcy5zb3VyY2UoKVxuICAgICAgICAgICAgPy5oYW5kbGVzKClcbiAgICAgICAgICAgIC5maW5kKChoYW5kbGUpID0+IGhhbmRsZS5yYXdIYW5kbGUuaWQgPT09IHRoaXMuZWRnZS5zb3VyY2VIYW5kbGUpID8/IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoYW5kbGUgPVxuICAgICAgICAgIHRoaXMuc291cmNlKClcbiAgICAgICAgICAgID8uaGFuZGxlcygpXG4gICAgICAgICAgICAuZmluZCgoaGFuZGxlKSA9PiBoYW5kbGUucmF3SGFuZGxlLnR5cGUgPT09ICdzb3VyY2UnKSA/PyBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEluIGNhc2Ugb2YgdmlydHVhbCBzY3JvbGxpbmcsIGlmIHRoZSBub2RlIGlzIHNjcm9sbGVkIG91dCBvZiB2aWV3IHRoZSBoYW5kbGUgbWF5IGRpc2FwcGVhclxuICAgIC8vIHdoaWNoIGNvdWxkIGxlYWQgdG8gdGhlIGVkZ2Ugbm90IGJlaW5nIHJlbmRlcmVkXG4gICAgLy8gc28gd2UgcmV0dXJuIHRoZSBwcmV2aW91cyBoYW5kbGUgaWYgdGhlIGN1cnJlbnQgb25lIGlzIG51bGxcbiAgICAvLyBUT0RPOiBjaGVjayBpZiB0aGlzIGJyZWFrcyBhbnl0aGluZ1xuICAgIGlmIChoYW5kbGUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBwcmV2aW91c0hhbmRsZTtcbiAgICB9XG5cbiAgICByZXR1cm4gaGFuZGxlO1xuICB9KTtcblxuICBwdWJsaWMgdGFyZ2V0SGFuZGxlID0gZXh0ZW5kZWRDb21wdXRlZDxIYW5kbGVNb2RlbCB8IG51bGw+KChwcmV2aW91c0hhbmRsZSkgPT4ge1xuICAgIGxldCBoYW5kbGU6IEhhbmRsZU1vZGVsIHwgbnVsbCA9IG51bGw7XG5cbiAgICBpZiAodGhpcy5mbG9hdGluZykge1xuICAgICAgaGFuZGxlID0gdGhpcy5jbG9zZXN0SGFuZGxlcygpLnRhcmdldEhhbmRsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuZWRnZS50YXJnZXRIYW5kbGUpIHtcbiAgICAgICAgaGFuZGxlID1cbiAgICAgICAgICB0aGlzLnRhcmdldCgpXG4gICAgICAgICAgICA/LmhhbmRsZXMoKVxuICAgICAgICAgICAgLmZpbmQoKGhhbmRsZSkgPT4gaGFuZGxlLnJhd0hhbmRsZS5pZCA9PT0gdGhpcy5lZGdlLnRhcmdldEhhbmRsZSkgPz8gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhhbmRsZSA9XG4gICAgICAgICAgdGhpcy50YXJnZXQoKVxuICAgICAgICAgICAgPy5oYW5kbGVzKClcbiAgICAgICAgICAgIC5maW5kKChoYW5kbGUpID0+IGhhbmRsZS5yYXdIYW5kbGUudHlwZSA9PT0gJ3RhcmdldCcpID8/IG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSW4gY2FzZSBvZiB2aXJ0dWFsIHNjcm9sbGluZywgaWYgdGhlIG5vZGUgaXMgc2Nyb2xsZWQgb3V0IG9mIHZpZXcgdGhlIGhhbmRsZSBtYXkgZGlzYXBwZWFyXG4gICAgLy8gd2hpY2ggY291bGQgbGVhZCB0byB0aGUgZWRnZSBub3QgYmVpbmcgcmVuZGVyZWRcbiAgICAvLyBzbyB3ZSByZXR1cm4gdGhlIHByZXZpb3VzIGhhbmRsZSBpZiB0aGUgY3VycmVudCBvbmUgaXMgbnVsbFxuICAgIC8vIFRPRE86IGNoZWNrIGlmIHRoaXMgYnJlYWtzIGFueXRoaW5nXG4gICAgaWYgKGhhbmRsZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHByZXZpb3VzSGFuZGxlO1xuICAgIH1cblxuICAgIHJldHVybiBoYW5kbGU7XG4gIH0pO1xuXG4gIHB1YmxpYyBjbG9zZXN0SGFuZGxlcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBzb3VyY2UgPSB0aGlzLnNvdXJjZSgpO1xuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMudGFyZ2V0KCk7XG5cbiAgICBpZiAoIXNvdXJjZSB8fCAhdGFyZ2V0KSB7XG4gICAgICByZXR1cm4geyBzb3VyY2VIYW5kbGU6IG51bGwsIHRhcmdldEhhbmRsZTogbnVsbCB9O1xuICAgIH1cblxuICAgIC8vIEdldCBhbGwgc291cmNlIGhhbmRsZXMgZnJvbSBzb3VyY2Ugbm9kZVxuICAgIGNvbnN0IHNvdXJjZUhhbmRsZXMgPVxuICAgICAgdGhpcy5mbG93RW50aXRpZXNTZXJ2aWNlLmNvbm5lY3Rpb24oKS5tb2RlID09PSAnc3RyaWN0J1xuICAgICAgICA/IHNvdXJjZS5oYW5kbGVzKCkuZmlsdGVyKChoKSA9PiBoLnJhd0hhbmRsZS50eXBlID09PSAnc291cmNlJylcbiAgICAgICAgOiBzb3VyY2UuaGFuZGxlcygpO1xuICAgIC8vIEdldCBhbGwgdGFyZ2V0IGhhbmRsZXMgZnJvbSB0YXJnZXQgbm9kZVxuICAgIGNvbnN0IHRhcmdldEhhbmRsZXMgPVxuICAgICAgdGhpcy5mbG93RW50aXRpZXNTZXJ2aWNlLmNvbm5lY3Rpb24oKS5tb2RlID09PSAnc3RyaWN0J1xuICAgICAgICA/IHRhcmdldC5oYW5kbGVzKCkuZmlsdGVyKChoKSA9PiBoLnJhd0hhbmRsZS50eXBlID09PSAndGFyZ2V0JylcbiAgICAgICAgOiB0YXJnZXQuaGFuZGxlcygpO1xuXG4gICAgaWYgKHNvdXJjZUhhbmRsZXMubGVuZ3RoID09PSAwIHx8IHRhcmdldEhhbmRsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4geyBzb3VyY2VIYW5kbGU6IG51bGwsIHRhcmdldEhhbmRsZTogbnVsbCB9O1xuICAgIH1cblxuICAgIGxldCBtaW5EaXN0YW5jZSA9IEluZmluaXR5O1xuICAgIGxldCBjbG9zZXN0U291cmNlSGFuZGxlOiBIYW5kbGVNb2RlbCB8IG51bGwgPSBudWxsO1xuICAgIGxldCBjbG9zZXN0VGFyZ2V0SGFuZGxlOiBIYW5kbGVNb2RlbCB8IG51bGwgPSBudWxsO1xuXG4gICAgLy8gQ2hlY2sgYWxsIGNvbWJpbmF0aW9ucyBvZiBzb3VyY2UgYW5kIHRhcmdldCBoYW5kbGVzXG4gICAgZm9yIChjb25zdCBzb3VyY2VIYW5kbGUgb2Ygc291cmNlSGFuZGxlcykge1xuICAgICAgZm9yIChjb25zdCB0YXJnZXRIYW5kbGUgb2YgdGFyZ2V0SGFuZGxlcykge1xuICAgICAgICBjb25zdCBzb3VyY2VQb2ludCA9IHNvdXJjZUhhbmRsZS5wb2ludEFic29sdXRlKCk7XG4gICAgICAgIGNvbnN0IHRhcmdldFBvaW50ID0gdGFyZ2V0SGFuZGxlLnBvaW50QWJzb2x1dGUoKTtcblxuICAgICAgICBjb25zdCBkaXN0YW5jZSA9IE1hdGguc3FydChcbiAgICAgICAgICBNYXRoLnBvdyhzb3VyY2VQb2ludC54IC0gdGFyZ2V0UG9pbnQueCwgMikgKyBNYXRoLnBvdyhzb3VyY2VQb2ludC55IC0gdGFyZ2V0UG9pbnQueSwgMiksXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGRpc3RhbmNlIDwgbWluRGlzdGFuY2UpIHtcbiAgICAgICAgICBtaW5EaXN0YW5jZSA9IGRpc3RhbmNlO1xuICAgICAgICAgIGNsb3Nlc3RTb3VyY2VIYW5kbGUgPSBzb3VyY2VIYW5kbGU7XG4gICAgICAgICAgY2xvc2VzdFRhcmdldEhhbmRsZSA9IHRhcmdldEhhbmRsZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzb3VyY2VIYW5kbGU6IGNsb3Nlc3RTb3VyY2VIYW5kbGUsXG4gICAgICB0YXJnZXRIYW5kbGU6IGNsb3Nlc3RUYXJnZXRIYW5kbGUsXG4gICAgfTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqIFRPRE86IG5vdCByZWFjdGl2ZVxuICAgKi9cbiAgcHVibGljIG1hcmtlclN0YXJ0VXJsID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IG1hcmtlciA9IHRoaXMuZWRnZS5tYXJrZXJzPy5zdGFydDtcblxuICAgIHJldHVybiBtYXJrZXIgPyBgdXJsKCMke2hhc2hDb2RlKEpTT04uc3RyaW5naWZ5KG1hcmtlcikpfSlgIDogJyc7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBUT0RPOiBub3QgcmVhY3RpdmVcbiAgICovXG4gIHB1YmxpYyBtYXJrZXJFbmRVcmwgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgbWFya2VyID0gdGhpcy5lZGdlLm1hcmtlcnM/LmVuZDtcblxuICAgIHJldHVybiBtYXJrZXIgPyBgdXJsKCMke2hhc2hDb2RlKEpTT04uc3RyaW5naWZ5KG1hcmtlcikpfSlgIDogJyc7XG4gIH0pO1xuXG4gIHB1YmxpYyBjb250ZXh0ID0ge1xuICAgICRpbXBsaWNpdDoge1xuICAgICAgLy8gVE9ETzogY2hlY2sgaWYgZWRnZSBjb3VsZCBjaGFuZ2VcbiAgICAgIGVkZ2U6IHRoaXMuZWRnZSxcbiAgICAgIHBhdGg6IGNvbXB1dGVkKCgpID0+IHRoaXMucGF0aCgpLnBhdGgpLFxuICAgICAgbWFya2VyU3RhcnQ6IHRoaXMubWFya2VyU3RhcnRVcmwsXG4gICAgICBtYXJrZXJFbmQ6IHRoaXMubWFya2VyRW5kVXJsLFxuICAgICAgc2VsZWN0ZWQ6IHRoaXMuc2VsZWN0ZWQuYXNSZWFkb25seSgpLFxuICAgICAgc2hvdWxkTG9hZDogdGhpcy5zaG91bGRMb2FkLFxuICAgIH0sXG4gIH07XG5cbiAgcHVibGljIGVkZ2VMYWJlbHM6IHsgW3Bvc2l0aW9uIGluIEVkZ2VMYWJlbFBvc2l0aW9uXT86IEVkZ2VMYWJlbE1vZGVsIH0gPSB7fTtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgZWRnZTogRWRnZSkge1xuICAgIHRoaXMudHlwZSA9IGVkZ2UudHlwZSA/PyAnZGVmYXVsdCc7XG4gICAgdGhpcy5jdXJ2ZSA9IGVkZ2UuY3VydmUgPz8gJ2Jlemllcic7XG4gICAgdGhpcy5yZWNvbm5lY3RhYmxlID0gZWRnZS5yZWNvbm5lY3RhYmxlID8/IGZhbHNlO1xuICAgIHRoaXMuZmxvYXRpbmcgPSBlZGdlLmZsb2F0aW5nID8/IGZhbHNlO1xuXG4gICAgaWYgKGVkZ2UuZWRnZUxhYmVscz8uc3RhcnQpIHRoaXMuZWRnZUxhYmVscy5zdGFydCA9IG5ldyBFZGdlTGFiZWxNb2RlbChlZGdlLmVkZ2VMYWJlbHMuc3RhcnQpO1xuICAgIGlmIChlZGdlLmVkZ2VMYWJlbHM/LmNlbnRlcikgdGhpcy5lZGdlTGFiZWxzLmNlbnRlciA9IG5ldyBFZGdlTGFiZWxNb2RlbChlZGdlLmVkZ2VMYWJlbHMuY2VudGVyKTtcbiAgICBpZiAoZWRnZS5lZGdlTGFiZWxzPy5lbmQpIHRoaXMuZWRnZUxhYmVscy5lbmQgPSBuZXcgRWRnZUxhYmVsTW9kZWwoZWRnZS5lZGdlTGFiZWxzLmVuZCk7XG4gIH1cblxuICBwcml2YXRlIGdldFBhdGhGYWN0b3J5UGFyYW1zKHNvdXJjZTogSGFuZGxlTW9kZWwsIHRhcmdldDogSGFuZGxlTW9kZWwpOiBDdXJ2ZUZhY3RvcnlQYXJhbXMge1xuICAgIHJldHVybiB7XG4gICAgICBtb2RlOiAnZWRnZScsXG4gICAgICBlZGdlOiB0aGlzLmVkZ2UsXG4gICAgICBzb3VyY2VQb2ludDogc291cmNlLnBvaW50QWJzb2x1dGUoKSxcbiAgICAgIHRhcmdldFBvaW50OiB0YXJnZXQucG9pbnRBYnNvbHV0ZSgpLFxuICAgICAgc291cmNlUG9zaXRpb246IHNvdXJjZS5yYXdIYW5kbGUucG9zaXRpb24sXG4gICAgICB0YXJnZXRQb3NpdGlvbjogdGFyZ2V0LnJhd0hhbmRsZS5wb3NpdGlvbixcbiAgICAgIGFsbEVkZ2VzOiB0aGlzLmZsb3dFbnRpdGllc1NlcnZpY2UucmF3RWRnZXMoKSxcbiAgICAgIGFsbE5vZGVzOiB0aGlzLmZsb3dFbnRpdGllc1NlcnZpY2UucmF3Tm9kZXMoKSxcbiAgICB9O1xuICB9XG59XG4iXX0=
|