@logicflow/extension 1.2.18 → 1.2.20

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.
@@ -1,252 +0,0 @@
1
- "use strict";
2
- /* eslint-disable operator-linebreak */
3
- /* eslint-disable implicit-arrow-linebreak */
4
- /**
5
- * 快照插件,生成视图
6
- */
7
- Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.Snapshot = void 0;
9
- var Snapshot = /** @class */ (function () {
10
- function Snapshot(_a) {
11
- var _this = this;
12
- var lf = _a.lf;
13
- this.lf = lf;
14
- this.customCssRules = '';
15
- this.useGlobalRules = true;
16
- /* 下载快照 */
17
- lf.getSnapshot = function (fileName, backgroundColor) {
18
- _this.getSnapshot(fileName, backgroundColor);
19
- };
20
- /* 获取Blob对象,用户图片上传 */
21
- lf.getSnapshotBlob = function (backgroundColor) {
22
- return _this.getSnapshotBlob(backgroundColor);
23
- };
24
- /* 获取Base64对象,用户图片上传 */
25
- lf.getSnapshotBase64 = function (backgroundColor) {
26
- return _this.getSnapshotBase64(backgroundColor);
27
- };
28
- }
29
- /* 获取svgRoot对象 */
30
- Snapshot.prototype.getSvgRootElement = function (lf) {
31
- var svgRootElement = lf.container.querySelector('.lf-canvas-overlay');
32
- return svgRootElement;
33
- };
34
- Snapshot.prototype.triggerDownload = function (imgURI) {
35
- var evt = new MouseEvent('click', {
36
- view: window,
37
- bubbles: false,
38
- cancelable: true,
39
- });
40
- var a = document.createElement('a');
41
- a.setAttribute('download', this.fileName);
42
- a.setAttribute('href', imgURI);
43
- a.setAttribute('target', '_blank');
44
- a.dispatchEvent(evt);
45
- };
46
- Snapshot.prototype.removeAnchor = function (element) {
47
- var childNodes = element.childNodes;
48
- var childLength = element.childNodes && element.childNodes.length;
49
- for (var i = 0; i < childLength; i++) {
50
- var child = childNodes[i];
51
- var classList = (child.classList && Array.from(child.classList)) || [];
52
- if (classList.indexOf('lf-anchor') > -1) {
53
- element.removeChild(element.childNodes[i]);
54
- childLength--;
55
- i--;
56
- }
57
- }
58
- };
59
- Snapshot.prototype.removeRotateControl = function (element) {
60
- var childNodes = element.childNodes;
61
- var childLength = element.childNodes && element.childNodes.length;
62
- for (var i = 0; i < childLength; i++) {
63
- var child = childNodes[i];
64
- var classList = (child.classList && Array.from(child.classList)) || [];
65
- if (classList.indexOf('lf-rotate-control') > -1) {
66
- element.removeChild(element.childNodes[i]);
67
- childLength--;
68
- i--;
69
- }
70
- }
71
- };
72
- /* 下载图片 */
73
- Snapshot.prototype.getSnapshot = function (fileName, backgroundColor) {
74
- var _this = this;
75
- this.fileName = fileName || "logic-flow." + Date.now() + ".png";
76
- var svg = this.getSvgRootElement(this.lf);
77
- this.getCanvasData(svg, backgroundColor).then(function (canvas) {
78
- var imgURI = canvas
79
- .toDataURL('image/png')
80
- .replace('image/png', 'image/octet-stream');
81
- _this.triggerDownload(imgURI);
82
- });
83
- };
84
- /* 获取base64对象 */
85
- Snapshot.prototype.getSnapshotBase64 = function (backgroundColor) {
86
- var _this = this;
87
- var svg = this.getSvgRootElement(this.lf);
88
- return new Promise(function (resolve) {
89
- _this.getCanvasData(svg, backgroundColor).then(function (canvas) {
90
- var base64 = canvas.toDataURL('image/png');
91
- // 输出图片数据以及图片宽高
92
- resolve({ data: base64, width: canvas.width, height: canvas.height });
93
- });
94
- });
95
- };
96
- /* 获取Blob对象 */
97
- Snapshot.prototype.getSnapshotBlob = function (backgroundColor) {
98
- var _this = this;
99
- var svg = this.getSvgRootElement(this.lf);
100
- return new Promise(function (resolve) {
101
- _this.getCanvasData(svg, backgroundColor).then(function (canvas) {
102
- canvas.toBlob(function (blob) {
103
- // 输出图片数据以及图片宽高
104
- resolve({ data: blob, width: canvas.width, height: canvas.height });
105
- }, 'image/png');
106
- });
107
- });
108
- };
109
- Snapshot.prototype.getClassRules = function () {
110
- var rules = '';
111
- if (this.useGlobalRules) {
112
- var styleSheets = document.styleSheets;
113
- for (var i = 0; i < styleSheets.length; i++) {
114
- var sheet = styleSheets[i];
115
- for (var j = 0; j < sheet.cssRules.length; j++) {
116
- rules += sheet.cssRules[j].cssText;
117
- }
118
- }
119
- }
120
- if (this.customCssRules) {
121
- rules += this.customCssRules;
122
- }
123
- return rules;
124
- };
125
- // 获取图片生成中中间产物canvas对象,用户转换为其他需要的格式
126
- Snapshot.prototype.getCanvasData = function (svg, backgroundColor) {
127
- var _this = this;
128
- var copy = svg.cloneNode(true);
129
- var graph = copy.lastChild;
130
- var childLength = graph.childNodes && graph.childNodes.length;
131
- if (childLength) {
132
- for (var i = 0; i < childLength; i++) {
133
- var lfLayer = graph.childNodes[i];
134
- // 只保留包含节点和边的基础图层进行下载,其他图层删除
135
- var layerClassList = lfLayer.classList && Array.from(lfLayer.classList);
136
- if (layerClassList && layerClassList.indexOf('lf-base') < 0) {
137
- graph.removeChild(graph.childNodes[i]);
138
- childLength--;
139
- i--;
140
- }
141
- else {
142
- // 删除锚点
143
- var lfBase = graph.childNodes[i];
144
- lfBase &&
145
- lfBase.childNodes.forEach(function (item) {
146
- var element = item;
147
- _this.removeAnchor(element.firstChild);
148
- _this.removeRotateControl(element.firstChild);
149
- });
150
- }
151
- }
152
- }
153
- var dpr = window.devicePixelRatio || 1;
154
- if (dpr < 1) {
155
- // https://github.com/didi/LogicFlow/issues/1222
156
- // canvas.width = bboxWidth * dpr配合ctx.scale(dpr, dpr)是为了解决绘制模糊
157
- // 比如dpr=2,先让canvas.width放大到等同于屏幕的物理像素宽高,然后自适应缩放适配canvas.style.width
158
- // 由于所有元素都缩放了一半,因此需要ctx.scale(dpr, dpr)放大2倍整体绘制的内容
159
- // 当用户缩放浏览器时,window.devicePixelRatio会随着变小
160
- // 当window.devicePixelRatio变小到一定程度,会导致canvas.width<canvas.style.width
161
- // 由于导出图片的svg的大小是canvas.style.width+canvas.style.height
162
- // 因此会导致导出的svg图片无法完整绘制到canvas(因为canvas.width小于svg的宽)
163
- // 从而导致canvas导出图片是缺失的svg
164
- // 而dpr>=1就能保证canvas.width>=canvas.style.width
165
- // 当dpr小于1的时候,我们强制转化为1,并不会产生绘制模糊等问题
166
- dpr = 1;
167
- }
168
- var canvas = document.createElement('canvas');
169
- /*
170
- 为了计算真实宽高需要取图的真实dom
171
- 真实dom存在缩放影响其宽高数值
172
- 在得到真实宽高后除以缩放比例即可得到正常宽高
173
- */
174
- var base = this.lf.graphModel.rootEl.querySelector('.lf-base');
175
- var bbox = base.getBoundingClientRect();
176
- var layout = document
177
- .querySelector('.lf-canvas-overlay')
178
- .getBoundingClientRect();
179
- var offsetX = bbox.x - layout.x;
180
- var offsetY = bbox.y - layout.y;
181
- var graphModel = this.lf.graphModel;
182
- var transformModel = graphModel.transformModel;
183
- var SCALE_X = transformModel.SCALE_X, SCALE_Y = transformModel.SCALE_Y, TRANSLATE_X = transformModel.TRANSLATE_X, TRANSLATE_Y = transformModel.TRANSLATE_Y;
184
- // offset值加10,保证图形不会紧贴着下载图片的左边和上边
185
- copy.lastChild.style.transform = "matrix(1, 0, 0, 1, " + ((-offsetX + TRANSLATE_X) * (1 / SCALE_X) + 10) + ", " + ((-offsetY + TRANSLATE_Y) * (1 / SCALE_Y) + 10) + ")";
186
- var bboxWidth = Math.ceil(bbox.width / SCALE_X);
187
- var bboxHeight = Math.ceil(bbox.height / SCALE_Y);
188
- // width,height 值加40,保证图形不会紧贴着下载图片的右边和下边
189
- canvas.style.width = bboxWidth + "px";
190
- canvas.style.height = bboxHeight + "px";
191
- canvas.width = bboxWidth * dpr + 80;
192
- canvas.height = bboxHeight * dpr + 80;
193
- var ctx = canvas.getContext('2d');
194
- ctx.clearRect(0, 0, canvas.width, canvas.height);
195
- ctx.scale(dpr, dpr);
196
- // 如果有背景色,设置流程图导出的背景色
197
- if (backgroundColor) {
198
- ctx.fillStyle = backgroundColor;
199
- ctx.fillRect(0, 0, bboxWidth * dpr + 80, bboxHeight * dpr + 80);
200
- }
201
- else {
202
- ctx.clearRect(0, 0, bboxWidth, bboxHeight);
203
- }
204
- var img = new Image();
205
- var style = document.createElement('style');
206
- style.innerHTML = this.getClassRules();
207
- var foreignObject = document.createElement('foreignObject');
208
- foreignObject.appendChild(style);
209
- copy.appendChild(foreignObject);
210
- return new Promise(function (resolve) {
211
- img.onload = function () {
212
- var isFirefox = navigator.userAgent.indexOf('Firefox') > -1;
213
- try {
214
- if (isFirefox) {
215
- createImageBitmap(img, {
216
- resizeWidth: canvas.width,
217
- resizeHeight: canvas.height,
218
- }).then(function (imageBitmap) {
219
- // 在回调函数中使用 drawImage() 方法绘制图像
220
- ctx.drawImage(imageBitmap, 0, 0);
221
- resolve(canvas);
222
- });
223
- }
224
- else {
225
- ctx.drawImage(img, 0, 0);
226
- resolve(canvas);
227
- }
228
- }
229
- catch (e) {
230
- ctx.drawImage(img, 0, 0);
231
- resolve(canvas);
232
- }
233
- };
234
- /*
235
- 因为svg中存在dom存放在foreignObject元素中
236
- SVG图形转成img对象
237
- todo: 会导致一些清晰度问题这个需要再解决
238
- fixme: XMLSerializer的中的css background url不会下载图片
239
- */
240
- var svg2Img = "data:image/svg+xml;charset=utf-8," + new XMLSerializer().serializeToString(copy);
241
- var imgSrc = svg2Img
242
- .replace(/\n/g, '')
243
- .replace(/\t/g, '')
244
- .replace(/#/g, '%23');
245
- img.src = imgSrc;
246
- });
247
- };
248
- Snapshot.pluginName = 'snapshot';
249
- return Snapshot;
250
- }());
251
- exports.Snapshot = Snapshot;
252
- exports.default = Snapshot;
@@ -1,40 +0,0 @@
1
- /**
2
- * 自动布局插件
3
- * 依赖flowPath插件
4
- * 未完善
5
- */
6
- import LogicFlow from '@logicflow/core';
7
- declare class AutoLayout {
8
- lf: LogicFlow;
9
- levelHeight: any[];
10
- newNodeMap: Map<string, any>;
11
- trunk: any[];
12
- static pluginName: string;
13
- constructor({ lf }: {
14
- lf: any;
15
- });
16
- layout(data: any, path: any): void;
17
- private setNodePosition;
18
- /**
19
- * 1. 处理边上的文本
20
- * 2. 主干节点之间直接的边
21
- * 3. 一个节点被多个连接作为目标节点,合理分配锚点位置。
22
- */
23
- private getEdgeDataPoints;
24
- /**
25
- * 获取边的连接节点相对位置。
26
- * source一定在target左边。
27
- * 1. 如果source和target在同一x, y坐标内容。
28
- * 2. 如果source在target左上方。
29
- * 3. 如果source在target左下方。
30
- */
31
- private getRelativePosition;
32
- /**
33
- * 获取边节点图形的宽高。
34
- */
35
- private getShape;
36
- private formatData;
37
- addLevelHeight(level: any, height?: number, isNegative?: boolean): void;
38
- getLevelHeight(level: any, isNegative?: boolean): any;
39
- }
40
- export { AutoLayout };
@@ -1,266 +0,0 @@
1
- /**
2
- * 自动布局插件
3
- * 依赖flowPath插件
4
- * 未完善
5
- */
6
- var __assign = (this && this.__assign) || function () {
7
- __assign = Object.assign || function(t) {
8
- for (var s, i = 1, n = arguments.length; i < n; i++) {
9
- s = arguments[i];
10
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
11
- t[p] = s[p];
12
- }
13
- return t;
14
- };
15
- return __assign.apply(this, arguments);
16
- };
17
- var POSITION_TYPE = {
18
- LEFT_TOP: -1,
19
- LEFT: 0,
20
- LEFT_BOTTOM: 1,
21
- };
22
- var AutoLayout = /** @class */ (function () {
23
- function AutoLayout(_a) {
24
- var _this = this;
25
- var lf = _a.lf;
26
- this.lf = lf;
27
- /**
28
- * 用于记录上一次调用layout时计算出的trunk
29
- * 当旧trunk和新trunk长度一致时,用于选择旧trunk,
30
- * a->b->c->d
31
- * |->e
32
- * e后面新增f节点时候,旧逻辑会返回新trunk[a,b,e,f]
33
- * 界面布局变成
34
- * a->b->e->f
35
- * |->c->d
36
- * 其实只想要这样 尽量少变化
37
- * a->b->c->d
38
- * |->e->f
39
- * */
40
- this.trunk = [];
41
- // 给lf添加方法
42
- lf.layout = function (startNodeType) {
43
- var data = _this.lf.getGraphRawData();
44
- _this.lf.setStartNodeType(startNodeType);
45
- var path = _this.lf.getPathes();
46
- _this.levelHeight = [];
47
- _this.newNodeMap = new Map();
48
- return _this.layout(data, path);
49
- };
50
- }
51
- // 1) 将所有节点和边的坐标删除。节点上的文本改成偏移量。
52
- // 2) 找到长度最长的路径,作为基准路径。
53
- // 3) 依次计算
54
- // 拿到最长的路径。
55
- // nodes: [], edges: [],
56
- AutoLayout.prototype.layout = function (data, path) {
57
- var _this = this;
58
- var trunk = [];
59
- path.forEach(function (p) {
60
- var elements = p.elements;
61
- if (elements.length > trunk.length) {
62
- trunk = elements;
63
- }
64
- else if (elements.length === trunk.length) {
65
- // 考虑是否替换为旧的trunk
66
- if (JSON.stringify(elements) === JSON.stringify(_this.trunk)) {
67
- trunk = _this.trunk;
68
- }
69
- }
70
- });
71
- // 记录上一次trunk
72
- this.trunk = trunk;
73
- var nodeMap = this.formatData(data);
74
- var newGraphData = {
75
- nodes: [],
76
- edges: [],
77
- };
78
- // 从后向前布局
79
- for (var i = trunk.length - 1; i >= 0; i--) {
80
- this.setNodePosition(trunk[i], nodeMap, newGraphData, i, 1);
81
- }
82
- this.lf.graphModel.graphDataToModel(newGraphData);
83
- };
84
- // 1) 需要知道下一层级已占高度。
85
- // 2) 基于自己的高度,判断下一个层级的高度
86
- AutoLayout.prototype.setNodePosition = function (nodeId, nodeMap, newGraphData, xLevel, yLevel) {
87
- var _this = this;
88
- var n = nodeMap[nodeId];
89
- var text = n.text, type = n.type, next = n.next, properties = n.properties;
90
- var x = xLevel * 160 + 40;
91
- var y = yLevel * 120;
92
- var nodeData = {
93
- id: nodeId,
94
- x: x,
95
- text: text,
96
- y: y,
97
- type: type,
98
- properties: properties,
99
- };
100
- if (text && typeof text === 'object') {
101
- nodeData.text = __assign(__assign({}, text), { x: x + text.x, y: y + text.y });
102
- }
103
- this.newNodeMap.set(nodeData.id, {
104
- x: nodeData.x,
105
- y: nodeData.y,
106
- type: type,
107
- });
108
- newGraphData.nodes.push(nodeData);
109
- n.isFixed = true;
110
- this.addLevelHeight(xLevel, 1);
111
- if (next && next.length > 0) {
112
- next.forEach(function (nextInfo) {
113
- // 如果下一个节点还没有被定位,那么设置其定位
114
- var n1 = nodeMap[nextInfo.nodeId];
115
- if (!n1.isFixed) {
116
- var nextYLevel = _this.getLevelHeight(xLevel + 1);
117
- _this.addLevelHeight(xLevel, 1);
118
- _this.setNodePosition(nextInfo.nodeId, nodeMap, newGraphData, xLevel + 1, nextYLevel + 1);
119
- }
120
- else {
121
- // todo: 如果下一个节点是已经定位的,则需要考虑边的规避
122
- }
123
- // 设置连接到下一个节点的边
124
- // 1) 起始位置为source节点的下方,结束位置为target节点左边。
125
- // 2) 计算折线
126
- newGraphData.edges.push(__assign({ id: nextInfo.edgeId, type: nextInfo.edgeType, sourceNodeId: nodeId, targetNodeId: nextInfo.nodeId, properties: nextInfo.properties, text: nextInfo.text }, _this.getEdgeDataPoints(nodeId, nextInfo.nodeId)));
127
- });
128
- }
129
- return nodeData;
130
- };
131
- /**
132
- * 1. 处理边上的文本
133
- * 2. 主干节点之间直接的边
134
- * 3. 一个节点被多个连接作为目标节点,合理分配锚点位置。
135
- */
136
- AutoLayout.prototype.getEdgeDataPoints = function (sourceNodeId, targetNodeId) {
137
- var source = this.newNodeMap.get(sourceNodeId);
138
- var target = this.newNodeMap.get(targetNodeId);
139
- var _a = this.getShape(sourceNodeId), width = _a.width, height = _a.height;
140
- var _b = this.getShape(targetNodeId), targetWidth = _b.width, targetHeight = _b.height;
141
- var positionType = this.getRelativePosition(source, target);
142
- var startPoint = {
143
- x: source.x,
144
- y: source.y,
145
- };
146
- var endPoint = {
147
- x: target.x,
148
- y: target.y,
149
- };
150
- switch (positionType) {
151
- case POSITION_TYPE.LEFT:
152
- startPoint.x = source.x + width / 2;
153
- endPoint.x = target.x - targetWidth / 2;
154
- break;
155
- case POSITION_TYPE.LEFT_TOP:
156
- startPoint.y = source.y + height / 2;
157
- endPoint.x = target.x - targetWidth / 2;
158
- break;
159
- case POSITION_TYPE.LEFT_BOTTOM:
160
- startPoint.x = source.x + width / 2;
161
- endPoint.y = target.y + targetHeight / 2;
162
- break;
163
- default:
164
- break;
165
- }
166
- return {
167
- startPoint: startPoint,
168
- endPoint: endPoint,
169
- };
170
- };
171
- /**
172
- * 获取边的连接节点相对位置。
173
- * source一定在target左边。
174
- * 1. 如果source和target在同一x, y坐标内容。
175
- * 2. 如果source在target左上方。
176
- * 3. 如果source在target左下方。
177
- */
178
- AutoLayout.prototype.getRelativePosition = function (source, target) {
179
- var y = source.y;
180
- var y1 = target.y;
181
- var positionType;
182
- if (y < y1) {
183
- positionType = -1;
184
- }
185
- else if (y === y1) {
186
- positionType = 0;
187
- }
188
- else {
189
- positionType = 1;
190
- }
191
- return positionType;
192
- };
193
- /**
194
- * 获取边节点图形的宽高。
195
- */
196
- AutoLayout.prototype.getShape = function (nodeId) {
197
- var nodeModel = this.lf.getNodeModelById(nodeId);
198
- return {
199
- height: nodeModel.height,
200
- width: nodeModel.width,
201
- };
202
- };
203
- AutoLayout.prototype.formatData = function (data) {
204
- var nodeMap = data.nodes.reduce(function (nMap, node) {
205
- var type = node.type, properties = node.properties, text = node.text, x = node.x, y = node.y;
206
- if (text && typeof text === 'object') {
207
- // 坐标转换为偏移量
208
- text.x = text.x - x;
209
- text.y = text.y - y;
210
- }
211
- nMap[node.id] = {
212
- type: type,
213
- properties: properties,
214
- text: text,
215
- prev: [],
216
- next: [],
217
- };
218
- return nMap;
219
- }, {});
220
- data.edges.forEach(function (edge) {
221
- var sourceNodeId = edge.sourceNodeId, targetNodeId = edge.targetNodeId, id = edge.id, properties = edge.properties, text = edge.text;
222
- var newText = text;
223
- if (typeof text === 'object') {
224
- newText = text.value;
225
- }
226
- nodeMap[sourceNodeId].next.push({
227
- edgeId: id,
228
- nodeId: targetNodeId,
229
- edgeType: edge.type,
230
- properties: properties,
231
- text: newText,
232
- });
233
- nodeMap[targetNodeId].prev.push({
234
- edgeId: id,
235
- nodeId: sourceNodeId,
236
- properties: properties,
237
- text: newText,
238
- });
239
- });
240
- return nodeMap;
241
- };
242
- AutoLayout.prototype.addLevelHeight = function (level, height, isNegative) {
243
- if (height === void 0) { height = 1; }
244
- if (isNegative === void 0) { isNegative = false; }
245
- var l = this.levelHeight[level];
246
- if (!l) {
247
- l = {
248
- positiveHeight: 0,
249
- negativeHeight: 0,
250
- };
251
- this.levelHeight[level] = l;
252
- }
253
- isNegative ? (l.negativeHeight -= height) : (l.positiveHeight += height);
254
- };
255
- AutoLayout.prototype.getLevelHeight = function (level, isNegative) {
256
- if (isNegative === void 0) { isNegative = false; }
257
- var val = this.levelHeight[level];
258
- if (!val) {
259
- return 0;
260
- }
261
- return isNegative ? val.negativeHeight : val.positiveHeight;
262
- };
263
- AutoLayout.pluginName = 'AutoLayout';
264
- return AutoLayout;
265
- }());
266
- export { AutoLayout };
@@ -1,47 +0,0 @@
1
- /**
2
- * 路径插件,此插件支持获取绘制的图中所有的路径。
3
- * 需要指定开始节点类型。
4
- */
5
- import LogicFlow from '@logicflow/core';
6
- declare type Path = {
7
- routeId: string;
8
- name: string;
9
- elements: string[];
10
- type: number;
11
- };
12
- declare type RawPath = Path & {
13
- similarElement: RawPath;
14
- weight: number;
15
- };
16
- declare class FlowPath {
17
- lf: LogicFlow;
18
- pathes: RawPath[];
19
- startNodeType: string;
20
- static pluginName: string;
21
- constructor({ lf }: {
22
- lf: any;
23
- });
24
- setPathes(pathes: any): void;
25
- getPathes(): any[];
26
- private findPathElements;
27
- /**
28
- * 设置路径id
29
- * 如果存在原始路径Id, 则需要比较新路径是否在原始路径中存在相似路径
30
- * 如果有,则尽量使用原始路径。
31
- * 相似路径
32
- * 1. 如果所有的节点都相同,则必定为同一路径。(包括顺序不同)
33
- * 2. 如果新路径比原来路径少了或者多了部分节点,则记录为相似路径。基于不同的差异,标记不同的权重。
34
- * 3. 基于新路径在旧路径占用权限,设置新路径Id.
35
- * 4. 如果某一条旧路径被多条新路径标记为相同的权重,则这两条新路径都使用新Id.
36
- */
37
- private getNewPathes;
38
- private similar2Path;
39
- private getNewId;
40
- /**
41
- * 判断是否为循环路径
42
- * 由于前面进行了特殊处理,将循环部分单独提出来作为路径
43
- * 所有循环路径必定开始节点等于结束节点。
44
- */
45
- private isLoopPath;
46
- }
47
- export { FlowPath, };