system-canvas-react 0.2.13 → 0.2.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.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=selfLoop.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selfLoop.test.d.ts","sourceRoot":"","sources":["../../../src/hooks/__tests__/selfLoop.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,94 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { computeSelfLoopPath, computeEdgePath, computeEdgeMidpoint } from 'system-canvas';
3
+ function makeNode(overrides = {}) {
4
+ return {
5
+ id: 'n1',
6
+ type: 'text',
7
+ x: 100,
8
+ y: 100,
9
+ width: 200,
10
+ height: 100,
11
+ text: 'Node',
12
+ resolvedFill: '#fff',
13
+ resolvedStroke: '#000',
14
+ ...overrides,
15
+ };
16
+ }
17
+ function makeEdge(overrides = {}) {
18
+ return {
19
+ id: 'e1',
20
+ fromNode: 'n1',
21
+ toNode: 'n1',
22
+ ...overrides,
23
+ };
24
+ }
25
+ describe('computeSelfLoopPath', () => {
26
+ it('returns a non-empty SVG d string starting with M', () => {
27
+ const node = makeNode();
28
+ const path = computeSelfLoopPath(node);
29
+ expect(path).toBeTruthy();
30
+ expect(path.trimStart()).toMatch(/^M /);
31
+ });
32
+ it('contains a cubic bezier segment (C command)', () => {
33
+ const node = makeNode();
34
+ const path = computeSelfLoopPath(node);
35
+ expect(path).toContain(' C ');
36
+ });
37
+ it('scales loop size with node dimensions', () => {
38
+ const small = makeNode({ width: 100, height: 50 });
39
+ const large = makeNode({ width: 400, height: 200 });
40
+ const smallPath = computeSelfLoopPath(small);
41
+ const largePath = computeSelfLoopPath(large);
42
+ // cp1y is the 5th token in the path string (after "M x y C cp1x")
43
+ const getCP1Y = (d) => parseFloat(d.split(' ')[4]);
44
+ expect(Math.abs(getCP1Y(largePath))).toBeGreaterThan(Math.abs(getCP1Y(smallPath)));
45
+ });
46
+ it('respects the exitSide parameter', () => {
47
+ const node = makeNode();
48
+ const topPath = computeSelfLoopPath(node, 'top');
49
+ const rightPath = computeSelfLoopPath(node, 'right');
50
+ expect(topPath).not.toBe(rightPath);
51
+ });
52
+ });
53
+ describe('computeEdgePath with self-loop', () => {
54
+ it('returns same result as computeSelfLoopPath when fromNode === toNode', () => {
55
+ const node = makeNode();
56
+ const edge = makeEdge();
57
+ expect(computeEdgePath(edge, node, node)).toBe(computeSelfLoopPath(node, 'top'));
58
+ });
59
+ it('uses edge.fromSide to control loop exit direction', () => {
60
+ const node = makeNode();
61
+ const edgeTop = makeEdge({ fromSide: 'top' });
62
+ const edgeRight = makeEdge({ fromSide: 'right' });
63
+ expect(computeEdgePath(edgeTop, node, node)).toBe(computeSelfLoopPath(node, 'top'));
64
+ expect(computeEdgePath(edgeRight, node, node)).toBe(computeSelfLoopPath(node, 'right'));
65
+ });
66
+ it('does not regress on normal edges (fromNode !== toNode)', () => {
67
+ const from = makeNode({ id: 'a', x: 0, y: 0 });
68
+ const to = makeNode({ id: 'b', x: 400, y: 0 });
69
+ const edge = { id: 'e2', fromNode: 'a', toNode: 'b' };
70
+ const path = computeEdgePath(edge, from, to);
71
+ expect(path).toMatch(/^M /);
72
+ expect(path).not.toContain('NaN');
73
+ });
74
+ });
75
+ describe('computeEdgeMidpoint with self-loop', () => {
76
+ it('returns a point outside the node bounding box (the arc tip)', () => {
77
+ const node = makeNode({ x: 100, y: 100, width: 200, height: 100 });
78
+ const edge = makeEdge();
79
+ const mid = computeEdgeMidpoint(edge, node, node);
80
+ const outsideBox = mid.x < node.x ||
81
+ mid.x > node.x + node.width ||
82
+ mid.y < node.y ||
83
+ mid.y > node.y + node.height;
84
+ expect(outsideBox).toBe(true);
85
+ });
86
+ it('returns a valid finite numeric point', () => {
87
+ const node = makeNode();
88
+ const edge = makeEdge();
89
+ const mid = computeEdgeMidpoint(edge, node, node);
90
+ expect(Number.isFinite(mid.x)).toBe(true);
91
+ expect(Number.isFinite(mid.y)).toBe(true);
92
+ });
93
+ });
94
+ //# sourceMappingURL=selfLoop.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selfLoop.test.js","sourceRoot":"","sources":["../../../src/hooks/__tests__/selfLoop.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "system-canvas-react",
3
- "version": "0.2.13",
3
+ "version": "0.2.14",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -35,7 +35,7 @@
35
35
  "d3-selection": "^3.0.0",
36
36
  "d3-transition": "^3.0.0",
37
37
  "d3-zoom": "^3.0.0",
38
- "system-canvas": "^0.2.13"
38
+ "system-canvas": "^0.2.14"
39
39
  },
40
40
  "peerDependencies": {
41
41
  "react": "^18.0.0 || ^19.0.0",