Skip to content

Commit 97ff366

Browse files
authored
feat: add basic APIs (#6)
* feat: add basie APIs and tests * feat: implement reduceChanges() * feat: implement bsf, dsf and clone methods * chore: fix esm export * chore: add umd bundle * feat: change `update*Data` to support overloading usage. * fix: change filename to camel-case format * chore: add unpkg support
1 parent 698d7a7 commit 97ff366

13 files changed

+1981
-29
lines changed

Diff for: .gitignore

+3
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@
1414
/esm
1515
/dist
1616

17+
# docs
18+
/docs
19+
1720
# Bundle visualizer
1821
stats.html
1922

Diff for: __tests__/edge.spec.ts

+110
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
import { Graph } from '../src';
2+
3+
test('Edge related methods', () => {
4+
const graph = new Graph({
5+
nodes: [
6+
{ id: 'Node1', data: {} },
7+
{ id: 'Node2', data: {} },
8+
{ id: 'Node3', data: {} },
9+
{ id: 'Node4', data: {} },
10+
],
11+
});
12+
expect(graph.getAllEdges()).toEqual([]);
13+
14+
// addEdge()
15+
// addEdges()
16+
graph.addEdge({ id: 'Edge1', source: 'Node1', target: 'Node2', data: {} });
17+
graph.addEdges([
18+
{ id: 'Edge2', source: 'Node1', target: 'Node3', data: {} },
19+
{ id: 'Edge3', source: 'Node2', target: 'Node3', data: {} },
20+
]);
21+
expect(graph.getAllEdges()).toEqual([
22+
{ id: 'Edge1', source: 'Node1', target: 'Node2', data: {} },
23+
{ id: 'Edge2', source: 'Node1', target: 'Node3', data: {} },
24+
{ id: 'Edge3', source: 'Node2', target: 'Node3', data: {} },
25+
]);
26+
expect(() => {
27+
graph.addEdge({ id: 'Edge1', source: 'Node1', target: 'Node2', data: {} });
28+
}).toThrow('Edge already exists');
29+
30+
// hasEdge()
31+
expect(graph.hasEdge('Edge1')).toBe(true);
32+
expect(graph.hasEdge('Edge999')).toBe(false);
33+
34+
// getEdge()
35+
// getEdgeDetail()
36+
expect(graph.getEdge('Edge1')).toEqual({
37+
id: 'Edge1',
38+
source: 'Node1',
39+
target: 'Node2',
40+
data: {},
41+
});
42+
expect(graph.getEdgeDetail('Edge1')).toEqual({
43+
edge: { id: 'Edge1', source: 'Node1', target: 'Node2', data: {} },
44+
source: { id: 'Node1', data: {} },
45+
target: { id: 'Node2', data: {} },
46+
});
47+
expect(() => {
48+
graph.getEdge('Edge999');
49+
}).toThrow('Edge not found');
50+
51+
// updateEdgeData(id, propertyName, value)
52+
graph.updateEdgeData('Edge1', 'foo', 1);
53+
expect(graph.getEdge('Edge1').data).toEqual({ foo: 1 });
54+
graph.updateEdgeData('Edge1', 'foo', 2);
55+
expect(graph.getEdge('Edge1').data).toEqual({ foo: 2 });
56+
57+
// updateEdgeData(id, data)
58+
graph.updateEdgeData('Edge1', { bar: 1 });
59+
expect(graph.getEdge('Edge1').data).toEqual({ bar: 1 });
60+
61+
// updateEdgeData(id, oldData => newData);
62+
graph.updateEdgeData('Edge1', (data) => ({ foo: Number(data.bar) + 1 }));
63+
expect(graph.getEdge('Edge1').data).toEqual({ foo: 2 });
64+
65+
// mergeEdgeData()
66+
graph.mergeEdgeData('Edge1', { bar: '1' });
67+
expect(graph.getEdge('Edge1').data).toEqual({ foo: 2, bar: '1' });
68+
graph.mergeEdgeData('Edge1', { foo: 3, bar: '2' });
69+
expect(graph.getEdge('Edge1').data).toEqual({ foo: 3, bar: '2' });
70+
71+
// updateEdgeSource()
72+
graph.updateEdgeSource('Edge1', 'Node3');
73+
expect(graph.getEdge('Edge1').source).toEqual('Node3');
74+
expect(graph.getEdge('Edge1').target).toEqual('Node2');
75+
expect(graph.getRelatedEdges('Node1').map((edge) => edge.id)).toEqual([
76+
'Edge2',
77+
]);
78+
expect(graph.getRelatedEdges('Node3').map((edge) => edge.id)).toEqual([
79+
'Edge2',
80+
'Edge3',
81+
'Edge1',
82+
]);
83+
graph.updateEdgeSource('Edge1', 'Node1'); // Reset the source.
84+
85+
// updateEdgeTarget()
86+
graph.updateEdgeTarget('Edge1', 'Node3');
87+
expect(graph.getEdge('Edge1').source).toEqual('Node1');
88+
expect(graph.getEdge('Edge1').target).toEqual('Node3');
89+
expect(graph.getRelatedEdges('Node1').map((edge) => edge.id)).toEqual([
90+
'Edge2',
91+
'Edge1',
92+
]);
93+
expect(graph.getRelatedEdges('Node2').map((edge) => edge.id)).toEqual([
94+
'Edge3',
95+
]);
96+
graph.updateEdgeTarget('Edge1', 'Node2'); // Reset the target.
97+
98+
// removeEdge()
99+
// removeEdges()
100+
graph.removeEdge('Edge1');
101+
expect(graph.getAllEdges()).toEqual([
102+
{ id: 'Edge2', source: 'Node1', target: 'Node3', data: {} },
103+
{ id: 'Edge3', source: 'Node2', target: 'Node3', data: {} },
104+
]);
105+
graph.removeEdges(['Edge2', 'Edge3']);
106+
expect(graph.getAllEdges()).toEqual([]);
107+
expect(() => {
108+
graph.removeEdge('Edge999');
109+
}).toThrow('Edge not found');
110+
});

0 commit comments

Comments
 (0)