@logicflow/core 2.0.13 → 2.0.14

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 (58) hide show
  1. package/.turbo/turbo-build$colon$dev.log +2 -2
  2. package/.turbo/turbo-build.log +6 -6
  3. package/CHANGELOG.md +6 -0
  4. package/__tests__/algorithm/index.test.ts +22 -17
  5. package/__tests__/algorithm/outline.test.ts +9 -9
  6. package/__tests__/event/event.test.ts +18 -18
  7. package/__tests__/history/history.test.ts +23 -23
  8. package/__tests__/logicflow.test.ts +236 -228
  9. package/__tests__/model/graphmodel.test.ts +51 -31
  10. package/__tests__/util/compatible.test.ts +5 -5
  11. package/__tests__/util/geometry.test.ts +10 -10
  12. package/__tests__/util/graph.test.ts +12 -12
  13. package/__tests__/util/matrix.test.ts +26 -26
  14. package/__tests__/util/node.test.ts +22 -22
  15. package/__tests__/util/sampling.test.ts +6 -10
  16. package/__tests__/util/vector.test.ts +36 -36
  17. package/__tests__/util/zIndex.test.ts +6 -6
  18. package/dist/index.min.js +1 -1
  19. package/dist/index.min.js.map +1 -1
  20. package/es/LogicFlow.d.ts +24 -4
  21. package/es/LogicFlow.js +28 -6
  22. package/es/model/GraphModel.d.ts +34 -1
  23. package/es/model/GraphModel.js +36 -5
  24. package/es/model/node/RectNodeModel.js +3 -0
  25. package/es/options.d.ts +1 -0
  26. package/es/util/theme.d.ts +67 -2
  27. package/es/util/theme.js +189 -2
  28. package/es/view/edge/BaseEdge.d.ts +4 -0
  29. package/es/view/edge/BaseEdge.js +45 -3
  30. package/es/view/overlay/Grid.js +3 -2
  31. package/es/view/shape/Polygon.d.ts +8 -0
  32. package/es/view/shape/Polygon.js +50 -3
  33. package/lib/LogicFlow.d.ts +24 -4
  34. package/lib/LogicFlow.js +27 -5
  35. package/lib/model/GraphModel.d.ts +34 -1
  36. package/lib/model/GraphModel.js +34 -3
  37. package/lib/model/node/RectNodeModel.js +3 -0
  38. package/lib/options.d.ts +1 -0
  39. package/lib/util/theme.d.ts +67 -2
  40. package/lib/util/theme.js +192 -2
  41. package/lib/view/edge/BaseEdge.d.ts +4 -0
  42. package/lib/view/edge/BaseEdge.js +45 -3
  43. package/lib/view/overlay/Grid.js +3 -2
  44. package/lib/view/shape/Polygon.d.ts +8 -0
  45. package/lib/view/shape/Polygon.js +52 -4
  46. package/package.json +1 -1
  47. package/src/LogicFlow.tsx +48 -6
  48. package/src/model/GraphModel.ts +48 -3
  49. package/src/model/edge/index.ts +4 -4
  50. package/src/model/index.ts +7 -7
  51. package/src/model/node/RectNodeModel.ts +2 -1
  52. package/src/model/node/index.ts +8 -8
  53. package/src/options.ts +1 -0
  54. package/src/util/theme.ts +198 -3
  55. package/src/view/edge/BaseEdge.tsx +96 -12
  56. package/src/view/overlay/Grid.tsx +2 -1
  57. package/src/view/shape/Polygon.tsx +56 -4
  58. package/stats.html +1 -1
@@ -1,11 +1,11 @@
1
- import type { NodeConfig, TextConfig } from '../../src/index';
2
- import { LogicFlow } from '../../src/index';
1
+ import type { NodeConfig, TextConfig } from '../../src/index'
2
+ import { LogicFlow } from '../../src/index'
3
3
 
4
- type NodeConfigTextObj = NodeConfig & { text: TextConfig };
4
+ type NodeConfigTextObj = NodeConfig & { text: TextConfig }
5
5
  describe('graphmodel', () => {
6
- const dom = document.createElement('div');
7
- dom.id = 'main-graph';
8
- document.body.appendChild(dom);
6
+ const dom = document.createElement('div')
7
+ dom.id = 'main-graph'
8
+ document.body.appendChild(dom)
9
9
  const lf = new LogicFlow({
10
10
  container: dom,
11
11
  width: 1000,
@@ -17,7 +17,7 @@ describe('graphmodel', () => {
17
17
  metaKeyMultipleSelected: true,
18
18
  grid: true,
19
19
  snapline: true,
20
- });
20
+ })
21
21
 
22
22
  // 将node节点位置进行grid修正,同时处理node内文字的偏移量,返回一个位置修正过的复制节点NodeModel
23
23
  test('getModelAfterSnapToGrid', () => {
@@ -35,33 +35,53 @@ describe('graphmodel', () => {
35
35
  },
36
36
  },
37
37
  ],
38
- };
39
- lf.render(rawData);
38
+ }
39
+ lf.render(rawData)
40
40
 
41
- const originNode = lf.getDataById('node1') as NodeConfigTextObj;
41
+ const originNode = lf.getDataById('node1') as NodeConfigTextObj
42
42
 
43
43
  // grid=true 默认 gridSize=20
44
- const newNode = lf.graphModel.getModelAfterSnapToGrid(originNode) as NodeConfigTextObj;
45
- expect(originNode.x - originNode.text.x).toEqual(newNode.x - newNode.text.x);
46
- expect(originNode.y - originNode.text.y).toEqual(newNode.y - newNode.text.y);
47
- expect(originNode.text.value).toEqual(newNode.text.value);
44
+ const newNode = lf.graphModel.getModelAfterSnapToGrid(
45
+ originNode,
46
+ ) as NodeConfigTextObj
47
+ expect(originNode.x - originNode.text.x).toEqual(newNode.x - newNode.text.x)
48
+ expect(originNode.y - originNode.text.y).toEqual(newNode.y - newNode.text.y)
49
+ expect(originNode.text.value).toEqual(newNode.text.value)
48
50
 
49
- lf.graphModel.gridSize = 40;
50
- const newNode1 = lf.graphModel.getModelAfterSnapToGrid(originNode) as NodeConfigTextObj;
51
- expect(originNode.x - originNode.text.x).toEqual(newNode1.x - newNode1.text.x);
52
- expect(originNode.y - originNode.text.y).toEqual(newNode1.y - newNode1.text.y);
53
- expect(originNode.text.value).toEqual(newNode1.text.value);
51
+ lf.graphModel.gridSize = 40
52
+ const newNode1 = lf.graphModel.getModelAfterSnapToGrid(
53
+ originNode,
54
+ ) as NodeConfigTextObj
55
+ expect(originNode.x - originNode.text.x).toEqual(
56
+ newNode1.x - newNode1.text.x,
57
+ )
58
+ expect(originNode.y - originNode.text.y).toEqual(
59
+ newNode1.y - newNode1.text.y,
60
+ )
61
+ expect(originNode.text.value).toEqual(newNode1.text.value)
54
62
 
55
- lf.graphModel.gridSize = 1;
56
- const newNode2 = lf.graphModel.getModelAfterSnapToGrid(originNode) as NodeConfigTextObj;
57
- expect(originNode.x - originNode.text.x).toEqual(newNode2.x - newNode2.text.x);
58
- expect(originNode.y - originNode.text.y).toEqual(newNode2.y - newNode2.text.y);
59
- expect(originNode.text.value).toEqual(newNode2.text.value);
63
+ lf.graphModel.gridSize = 1
64
+ const newNode2 = lf.graphModel.getModelAfterSnapToGrid(
65
+ originNode,
66
+ ) as NodeConfigTextObj
67
+ expect(originNode.x - originNode.text.x).toEqual(
68
+ newNode2.x - newNode2.text.x,
69
+ )
70
+ expect(originNode.y - originNode.text.y).toEqual(
71
+ newNode2.y - newNode2.text.y,
72
+ )
73
+ expect(originNode.text.value).toEqual(newNode2.text.value)
60
74
 
61
- lf.graphModel.gridSize = 17;
62
- const newNode3 = lf.graphModel.getModelAfterSnapToGrid(originNode) as NodeConfigTextObj;
63
- expect(originNode.x - originNode.text.x).toEqual(newNode3.x - newNode3.text.x);
64
- expect(originNode.y - originNode.text.y).toEqual(newNode3.y - newNode3.text.y);
65
- expect(originNode.text.value).toEqual(newNode3.text.value);
66
- });
67
- });
75
+ lf.graphModel.gridSize = 17
76
+ const newNode3 = lf.graphModel.getModelAfterSnapToGrid(
77
+ originNode,
78
+ ) as NodeConfigTextObj
79
+ expect(originNode.x - originNode.text.x).toEqual(
80
+ newNode3.x - newNode3.text.x,
81
+ )
82
+ expect(originNode.y - originNode.text.y).toEqual(
83
+ newNode3.y - newNode3.text.y,
84
+ )
85
+ expect(originNode.text.value).toEqual(newNode3.text.value)
86
+ })
87
+ })
@@ -1,4 +1,4 @@
1
- import { formatData } from '../../src/util/compatible';
1
+ import { formatData } from '../../src/util/compatible'
2
2
 
3
3
  describe('util/compatible', () => {
4
4
  test('formatData', () => {
@@ -22,7 +22,7 @@ describe('util/compatible', () => {
22
22
  c: null,
23
23
  d: [],
24
24
  },
25
- };
25
+ }
26
26
  expect(formatData(data)).toEqual({
27
27
  nodes: [
28
28
  {
@@ -43,6 +43,6 @@ describe('util/compatible', () => {
43
43
  c: null,
44
44
  d: [],
45
45
  },
46
- });
47
- });
48
- });
46
+ })
47
+ })
48
+ })
@@ -1,14 +1,14 @@
1
- import { snapToGrid, getGridOffset } from '../../src/util';
1
+ import { snapToGrid, getGridOffset } from '../../src/util'
2
2
 
3
3
  describe('util/geometry', () => {
4
4
  test('snapToGrid', () => {
5
- const point = 2.5;
6
- const grid = 1.5;
7
- expect(snapToGrid(point, grid) - 3 < Number.EPSILON).toBeTruthy();
8
- });
5
+ const point = 2.5
6
+ const grid = 1.5
7
+ expect(snapToGrid(point, grid) - 3 < Number.EPSILON).toBeTruthy()
8
+ })
9
9
  test('getGridOffset', () => {
10
- const distance = 3;
11
- const grid = 1.5;
12
- expect(getGridOffset(distance, grid) - 2 < Number.EPSILON).toBeTruthy();
13
- });
14
- });
10
+ const distance = 3
11
+ const grid = 1.5
12
+ expect(getGridOffset(distance, grid) - 2 < Number.EPSILON).toBeTruthy()
13
+ })
14
+ })
@@ -1,16 +1,16 @@
1
- import { isPointInArea } from '../../src/util/graph';
1
+ import { isPointInArea } from '../../src/util/graph'
2
2
 
3
3
  describe('util/graph', () => {
4
4
  test('if element is in an area, truthy', () => {
5
- const point: [number, number] = [1, 1];
6
- const leftTopPoint: [number, number] = [0, 0];
7
- const rightBottomPoint: [number, number] = [2, 2];
8
- expect(isPointInArea(point, leftTopPoint, rightBottomPoint)).toBeTruthy();
9
- });
5
+ const point: [number, number] = [1, 1]
6
+ const leftTopPoint: [number, number] = [0, 0]
7
+ const rightBottomPoint: [number, number] = [2, 2]
8
+ expect(isPointInArea(point, leftTopPoint, rightBottomPoint)).toBeTruthy()
9
+ })
10
10
  test('if element is in an area, falsy', () => {
11
- const point: [number, number] = [1, 1];
12
- const leftTopPoint: [number, number] = [2, 2];
13
- const rightBottomPoint: [number, number] = [4, 4];
14
- expect(isPointInArea(point, leftTopPoint, rightBottomPoint)).toBeFalsy();
15
- });
16
- });
11
+ const point: [number, number] = [1, 1]
12
+ const leftTopPoint: [number, number] = [2, 2]
13
+ const rightBottomPoint: [number, number] = [4, 4]
14
+ expect(isPointInArea(point, leftTopPoint, rightBottomPoint)).toBeFalsy()
15
+ })
16
+ })
@@ -1,41 +1,41 @@
1
- import { Matrix } from '../../src/util/matrix';
1
+ import { Matrix } from '../../src/util/matrix'
2
2
 
3
3
  describe('util/matrix', () => {
4
4
  test('construct', () => {
5
- const m = new Matrix([1, 2, 3], [4, 5, 6], [7, 8, 9]);
6
- expect(m[0]).toEqual([1, 2, 3]);
7
- expect(m[1]).toEqual([4, 5, 6]);
8
- expect(m[2]).toEqual([7, 8, 9]);
9
- });
5
+ const m = new Matrix([1, 2, 3], [4, 5, 6], [7, 8, 9])
6
+ expect(m[0]).toEqual([1, 2, 3])
7
+ expect(m[1]).toEqual([4, 5, 6])
8
+ expect(m[2]).toEqual([7, 8, 9])
9
+ })
10
10
  test('cross', () => {
11
- const m = new Matrix([1, 2, 3], [4, 5, 6], [7, 8, 9]);
12
- const n = new Matrix([9, 8, 7], [6, 5, 4], [3, 2, 1]);
11
+ const m = new Matrix([1, 2, 3], [4, 5, 6], [7, 8, 9])
12
+ const n = new Matrix([9, 8, 7], [6, 5, 4], [3, 2, 1])
13
13
  expect(m.cross(n)).toEqual(
14
14
  new Matrix([30, 24, 18], [84, 69, 54], [138, 114, 90]),
15
- );
16
- });
15
+ )
16
+ })
17
17
  test('transpose', () => {
18
- const m = new Matrix([1, 2, 3], [4, 5, 6], [7, 8, 9]);
19
- expect(m.transpose()).toEqual(new Matrix([1, 4, 7], [2, 5, 8], [3, 6, 9]));
20
- });
18
+ const m = new Matrix([1, 2, 3], [4, 5, 6], [7, 8, 9])
19
+ expect(m.transpose()).toEqual(new Matrix([1, 4, 7], [2, 5, 8], [3, 6, 9]))
20
+ })
21
21
  test('translate', () => {
22
- const m = new Matrix([1, 0, 0], [0, 1, 0], [0, 0, 1]);
22
+ const m = new Matrix([1, 0, 0], [0, 1, 0], [0, 0, 1])
23
23
  expect(m.translate(2, 3)).toEqual(
24
24
  new Matrix([1, 0, 0], [0, 1, 0], [2, 3, 1]),
25
- );
26
- });
25
+ )
26
+ })
27
27
  test('rotate', () => {
28
- const m = new Matrix([1, 0, 0], [0, 1, 0], [0, 0, 1]);
28
+ const m = new Matrix([1, 0, 0], [0, 1, 0], [0, 0, 1])
29
29
  expect(m.rotate(Math.PI / 2)).toEqual(
30
30
  new Matrix([0, 1, 0], [-1, 0, 0], [0, 0, 1]),
31
- );
32
- });
31
+ )
32
+ })
33
33
  test('scale', () => {
34
- const m = new Matrix([1, 0, 0], [0, 1, 0], [0, 0, 1]);
35
- expect(m.scale(2, 3)).toEqual(new Matrix([2, 0, 0], [0, 3, 0], [0, 0, 1]));
36
- });
34
+ const m = new Matrix([1, 0, 0], [0, 1, 0], [0, 0, 1])
35
+ expect(m.scale(2, 3)).toEqual(new Matrix([2, 0, 0], [0, 3, 0], [0, 0, 1]))
36
+ })
37
37
  test('toString', () => {
38
- const m = new Matrix([1, 0, 0], [0, 1, 0], [1, 1, 1]);
39
- expect(m.toString()).toEqual('matrix(1 0 0 1 1 1)');
40
- });
41
- });
38
+ const m = new Matrix([1, 0, 0], [0, 1, 0], [1, 1, 1])
39
+ expect(m.toString()).toEqual('matrix(1 0 0 1 1 1)')
40
+ })
41
+ })
@@ -3,66 +3,66 @@ import {
3
3
  isInNode,
4
4
  getCrossPointWithCircle,
5
5
  getCrossPointWithEllipse,
6
- } from '../../src/util/node';
6
+ } from '../../src/util/node'
7
7
 
8
8
  describe('util/node', () => {
9
9
  test('get closest anchor', () => {
10
- const position = { x: 0, y: 0 };
10
+ const position = { x: 0, y: 0 }
11
11
  const node = {
12
12
  anchors: [
13
13
  { x: 0, y: 0, id: '1' },
14
14
  { x: 1, y: 1, id: '2' },
15
15
  { x: 2, y: 2, id: '3' },
16
16
  ],
17
- };
17
+ }
18
18
  expect(getClosestAnchor(position, node)).toEqual({
19
19
  anchor: { x: 0, y: 0, id: '1' },
20
20
  index: 0,
21
- });
22
- });
21
+ })
22
+ })
23
23
  test('is point inside the node', () => {
24
- const position1 = { x: 0, y: 0 };
25
- const position2 = { x: 110, y: 110 };
24
+ const position1 = { x: 0, y: 0 }
25
+ const position2 = { x: 110, y: 110 }
26
26
  const node = {
27
27
  x: 0,
28
28
  y: 0,
29
29
  width: 100,
30
30
  height: 100,
31
- };
32
- expect(isInNode(position1, node)).toBeTruthy();
33
- expect(isInNode(position2, node)).toBeFalsy();
34
- });
31
+ }
32
+ expect(isInNode(position1, node)).toBeTruthy()
33
+ expect(isInNode(position2, node)).toBeFalsy()
34
+ })
35
35
  test('get cross point with circle', () => {
36
- const position = { x: 0, y: 0 };
36
+ const position = { x: 0, y: 0 }
37
37
  const node = {
38
38
  x: 0,
39
39
  y: 0,
40
40
  r: 10,
41
- };
41
+ }
42
42
  expect(getCrossPointWithCircle(position, 'horizontal', node)).toEqual({
43
43
  x: 10,
44
44
  y: 0,
45
- });
45
+ })
46
46
  expect(getCrossPointWithCircle(position, 'vertical', node)).toEqual({
47
47
  x: 0,
48
48
  y: 10,
49
- });
50
- });
49
+ })
50
+ })
51
51
  test('get cross point with ellipse', () => {
52
- const position = { x: 0, y: 0 };
52
+ const position = { x: 0, y: 0 }
53
53
  const node = {
54
54
  x: 0,
55
55
  y: 0,
56
56
  rx: 10,
57
57
  ry: 5,
58
- };
58
+ }
59
59
  expect(getCrossPointWithEllipse(position, 'horizontal', node)).toEqual({
60
60
  x: 10,
61
61
  y: 0,
62
- });
62
+ })
63
63
  expect(getCrossPointWithEllipse(position, 'vertical', node)).toEqual({
64
64
  x: 0,
65
65
  y: 5,
66
- });
67
- });
68
- });
66
+ })
67
+ })
68
+ })
@@ -1,16 +1,12 @@
1
- import {
2
- degrees,
3
- getThetaOfVector,
4
- Vector,
5
- } from '../../src/util';
1
+ import { degrees, getThetaOfVector, Vector } from '../../src/util'
6
2
 
7
3
  describe('util/sampling', () => {
8
4
  test('degrees', () => {
9
- expect(degrees(1)).toBe(57.29577951308232);
10
- });
5
+ expect(degrees(1)).toBe(57.29577951308232)
6
+ })
11
7
  test('getThetaOfVector', () => {
12
8
  expect(
13
9
  getThetaOfVector(new Vector(1, 1)) - 45 < Number.EPSILON,
14
- ).toBeTruthy();
15
- });
16
- });
10
+ ).toBeTruthy()
11
+ })
12
+ })
@@ -1,50 +1,50 @@
1
- import { Vector } from '../../src/util/vector';
1
+ import { Vector } from '../../src/util/vector'
2
2
 
3
3
  describe('util/vector', () => {
4
4
  test('construct', () => {
5
- const v = new Vector(1, 2);
6
- expect(v.x).toEqual(1);
7
- expect(v[0]).toEqual(1);
5
+ const v = new Vector(1, 2)
6
+ expect(v.x).toEqual(1)
7
+ expect(v[0]).toEqual(1)
8
8
 
9
- expect(v.y).toEqual(2);
10
- expect(v[1]).toEqual(2);
9
+ expect(v.y).toEqual(2)
10
+ expect(v[1]).toEqual(2)
11
11
 
12
- expect(v.z).toEqual(0);
13
- expect(v[2]).toEqual(0);
14
- });
12
+ expect(v.z).toEqual(0)
13
+ expect(v[2]).toEqual(0)
14
+ })
15
15
  test('add', () => {
16
- const v = new Vector(1, 2);
17
- const v1 = new Vector(3, 4);
18
- expect(v.add(v1)).toEqual(new Vector(4, 6));
19
- });
16
+ const v = new Vector(1, 2)
17
+ const v1 = new Vector(3, 4)
18
+ expect(v.add(v1)).toEqual(new Vector(4, 6))
19
+ })
20
20
  test('subtract', () => {
21
- const v = new Vector(1, 2);
22
- const v1 = new Vector(3, 4);
23
- expect(v.subtract(v1)).toEqual(new Vector(-2, -2));
24
- });
21
+ const v = new Vector(1, 2)
22
+ const v1 = new Vector(3, 4)
23
+ expect(v.subtract(v1)).toEqual(new Vector(-2, -2))
24
+ })
25
25
  test('dot', () => {
26
- const v = new Vector(1, 2);
27
- const v1 = new Vector(3, 4);
28
- expect(v.dot(v1)).toEqual(11);
29
- });
26
+ const v = new Vector(1, 2)
27
+ const v1 = new Vector(3, 4)
28
+ expect(v.dot(v1)).toEqual(11)
29
+ })
30
30
  test('cross', () => {
31
- const v = new Vector(1, 2);
32
- const v1 = new Vector(3, 4);
33
- expect(v.cross(v1)).toEqual(new Vector(0, 0, -2));
34
- });
31
+ const v = new Vector(1, 2)
32
+ const v1 = new Vector(3, 4)
33
+ expect(v.cross(v1)).toEqual(new Vector(0, 0, -2))
34
+ })
35
35
  test('getLength', () => {
36
- const v = new Vector(1, 2);
37
- expect(v.getLength()).toEqual(Math.sqrt(5));
38
- });
36
+ const v = new Vector(1, 2)
37
+ expect(v.getLength()).toEqual(Math.sqrt(5))
38
+ })
39
39
  test('normalize', () => {
40
- const v = new Vector(1, 2);
40
+ const v = new Vector(1, 2)
41
41
  expect(v.normalize()).toEqual(
42
42
  new Vector(1 / Math.sqrt(5), 2 / Math.sqrt(5)),
43
- );
44
- });
43
+ )
44
+ })
45
45
  test('angle', () => {
46
- const v = new Vector(1, 1);
47
- const v1 = new Vector(0, 1);
48
- expect(v.angle(v1) - Math.PI / 4 < Number.EPSILON).toBeTruthy();
49
- });
50
- });
46
+ const v = new Vector(1, 1)
47
+ const v1 = new Vector(0, 1)
48
+ expect(v.angle(v1) - Math.PI / 4 < Number.EPSILON).toBeTruthy()
49
+ })
50
+ })
@@ -1,10 +1,10 @@
1
- import { getZIndex, getMinIndex } from '../../src/util/zIndex';
1
+ import { getZIndex, getMinIndex } from '../../src/util/zIndex'
2
2
 
3
3
  describe('util/zIndex', () => {
4
4
  test('getZIndex', () => {
5
- expect(getZIndex()).toBe(1001);
6
- });
5
+ expect(getZIndex()).toBe(1001)
6
+ })
7
7
  test('getMinIndex', () => {
8
- expect(getMinIndex()).toBe(998);
9
- });
10
- });
8
+ expect(getMinIndex()).toBe(998)
9
+ })
10
+ })