@graph-render/core 1.0.1

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 (161) hide show
  1. package/.eslintrc.json +6 -0
  2. package/CHANGELOG.md +45 -0
  3. package/dist/edges/collision.d.ts +8 -0
  4. package/dist/edges/collision.d.ts.map +1 -0
  5. package/dist/edges/collision.js +26 -0
  6. package/dist/edges/collision.js.map +1 -0
  7. package/dist/edges/geometry.d.ts +22 -0
  8. package/dist/edges/geometry.d.ts.map +1 -0
  9. package/dist/edges/geometry.js +75 -0
  10. package/dist/edges/geometry.js.map +1 -0
  11. package/dist/edges/index.d.ts +4 -0
  12. package/dist/edges/index.d.ts.map +1 -0
  13. package/dist/edges/index.js +4 -0
  14. package/dist/edges/index.js.map +1 -0
  15. package/dist/edges/pathBuilder.d.ts +11 -0
  16. package/dist/edges/pathBuilder.d.ts.map +1 -0
  17. package/dist/edges/pathBuilder.js +114 -0
  18. package/dist/edges/pathBuilder.js.map +1 -0
  19. package/dist/edges/pathCalculation.d.ts +14 -0
  20. package/dist/edges/pathCalculation.d.ts.map +1 -0
  21. package/dist/edges/pathCalculation.js +47 -0
  22. package/dist/edges/pathCalculation.js.map +1 -0
  23. package/dist/edges/routing.d.ts +6 -0
  24. package/dist/edges/routing.d.ts.map +1 -0
  25. package/dist/edges/routing.js +243 -0
  26. package/dist/edges/routing.js.map +1 -0
  27. package/dist/edges/sideSelection.d.ts +17 -0
  28. package/dist/edges/sideSelection.d.ts.map +1 -0
  29. package/dist/edges/sideSelection.js +45 -0
  30. package/dist/edges/sideSelection.js.map +1 -0
  31. package/dist/index.d.ts +7 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +6 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/layouts/centered.d.ts +6 -0
  36. package/dist/layouts/centered.d.ts.map +1 -0
  37. package/dist/layouts/centered.js +69 -0
  38. package/dist/layouts/centered.js.map +1 -0
  39. package/dist/layouts/compactBracket.d.ts +3 -0
  40. package/dist/layouts/compactBracket.d.ts.map +1 -0
  41. package/dist/layouts/compactBracket.js +7 -0
  42. package/dist/layouts/compactBracket.js.map +1 -0
  43. package/dist/layouts/dag.d.ts +3 -0
  44. package/dist/layouts/dag.d.ts.map +1 -0
  45. package/dist/layouts/dag.js +52 -0
  46. package/dist/layouts/dag.js.map +1 -0
  47. package/dist/layouts/forceDirected.d.ts +3 -0
  48. package/dist/layouts/forceDirected.d.ts.map +1 -0
  49. package/dist/layouts/forceDirected.js +176 -0
  50. package/dist/layouts/forceDirected.js.map +1 -0
  51. package/dist/layouts/grid.d.ts +6 -0
  52. package/dist/layouts/grid.d.ts.map +1 -0
  53. package/dist/layouts/grid.js +34 -0
  54. package/dist/layouts/grid.js.map +1 -0
  55. package/dist/layouts/index.d.ts +12 -0
  56. package/dist/layouts/index.d.ts.map +1 -0
  57. package/dist/layouts/index.js +88 -0
  58. package/dist/layouts/index.js.map +1 -0
  59. package/dist/layouts/orthogonalFlow.d.ts +3 -0
  60. package/dist/layouts/orthogonalFlow.d.ts.map +1 -0
  61. package/dist/layouts/orthogonalFlow.js +81 -0
  62. package/dist/layouts/orthogonalFlow.js.map +1 -0
  63. package/dist/layouts/radialTree.d.ts +3 -0
  64. package/dist/layouts/radialTree.d.ts.map +1 -0
  65. package/dist/layouts/radialTree.js +45 -0
  66. package/dist/layouts/radialTree.js.map +1 -0
  67. package/dist/layouts/tree.d.ts +6 -0
  68. package/dist/layouts/tree.d.ts.map +1 -0
  69. package/dist/layouts/tree.js +19 -0
  70. package/dist/layouts/tree.js.map +1 -0
  71. package/dist/layouts/treeAlignment.d.ts +10 -0
  72. package/dist/layouts/treeAlignment.d.ts.map +1 -0
  73. package/dist/layouts/treeAlignment.js +69 -0
  74. package/dist/layouts/treeAlignment.js.map +1 -0
  75. package/dist/layouts/treePositioning.d.ts +14 -0
  76. package/dist/layouts/treePositioning.d.ts.map +1 -0
  77. package/dist/layouts/treePositioning.js +30 -0
  78. package/dist/layouts/treePositioning.js.map +1 -0
  79. package/dist/layouts/treeTopology.d.ts +29 -0
  80. package/dist/layouts/treeTopology.d.ts.map +1 -0
  81. package/dist/layouts/treeTopology.js +137 -0
  82. package/dist/layouts/treeTopology.js.map +1 -0
  83. package/dist/rendering/defaultRenderers.d.ts +10 -0
  84. package/dist/rendering/defaultRenderers.d.ts.map +1 -0
  85. package/dist/rendering/defaultRenderers.js +85 -0
  86. package/dist/rendering/defaultRenderers.js.map +1 -0
  87. package/dist/rendering/index.d.ts +4 -0
  88. package/dist/rendering/index.d.ts.map +1 -0
  89. package/dist/rendering/index.js +4 -0
  90. package/dist/rendering/index.js.map +1 -0
  91. package/dist/rendering/svg.d.ts +7 -0
  92. package/dist/rendering/svg.d.ts.map +1 -0
  93. package/dist/rendering/svg.js +256 -0
  94. package/dist/rendering/svg.js.map +1 -0
  95. package/dist/rendering/utils.d.ts +5 -0
  96. package/dist/rendering/utils.d.ts.map +1 -0
  97. package/dist/rendering/utils.js +33 -0
  98. package/dist/rendering/utils.js.map +1 -0
  99. package/dist/utils/config.d.ts +36 -0
  100. package/dist/utils/config.d.ts.map +1 -0
  101. package/dist/utils/config.js +115 -0
  102. package/dist/utils/config.js.map +1 -0
  103. package/dist/utils/constants.d.ts +15 -0
  104. package/dist/utils/constants.d.ts.map +1 -0
  105. package/dist/utils/constants.js +19 -0
  106. package/dist/utils/constants.js.map +1 -0
  107. package/dist/utils/graphParser.d.ts +16 -0
  108. package/dist/utils/graphParser.d.ts.map +1 -0
  109. package/dist/utils/graphParser.js +277 -0
  110. package/dist/utils/graphParser.js.map +1 -0
  111. package/dist/utils/graphTraversal.d.ts +13 -0
  112. package/dist/utils/graphTraversal.d.ts.map +1 -0
  113. package/dist/utils/graphTraversal.js +28 -0
  114. package/dist/utils/graphTraversal.js.map +1 -0
  115. package/dist/utils/index.d.ts +8 -0
  116. package/dist/utils/index.d.ts.map +1 -0
  117. package/dist/utils/index.js +7 -0
  118. package/dist/utils/index.js.map +1 -0
  119. package/dist/utils/nodeMetrics.d.ts +8 -0
  120. package/dist/utils/nodeMetrics.d.ts.map +1 -0
  121. package/dist/utils/nodeMetrics.js +12 -0
  122. package/dist/utils/nodeMetrics.js.map +1 -0
  123. package/dist/utils/nodeSizing.d.ts +3 -0
  124. package/dist/utils/nodeSizing.d.ts.map +1 -0
  125. package/dist/utils/nodeSizing.js +77 -0
  126. package/dist/utils/nodeSizing.js.map +1 -0
  127. package/package.json +29 -0
  128. package/project.json +32 -0
  129. package/src/edges/collision.ts +31 -0
  130. package/src/edges/geometry.ts +85 -0
  131. package/src/edges/index.ts +3 -0
  132. package/src/edges/pathBuilder.ts +136 -0
  133. package/src/edges/pathCalculation.ts +69 -0
  134. package/src/edges/routing.ts +459 -0
  135. package/src/edges/sideSelection.ts +67 -0
  136. package/src/index.ts +50 -0
  137. package/src/layouts/centered.ts +114 -0
  138. package/src/layouts/compactBracket.ts +14 -0
  139. package/src/layouts/dag.ts +76 -0
  140. package/src/layouts/forceDirected.ts +224 -0
  141. package/src/layouts/grid.ts +50 -0
  142. package/src/layouts/index.ts +148 -0
  143. package/src/layouts/orthogonalFlow.ts +112 -0
  144. package/src/layouts/radialTree.ts +77 -0
  145. package/src/layouts/tree.ts +35 -0
  146. package/src/layouts/treeAlignment.ts +107 -0
  147. package/src/layouts/treePositioning.ts +55 -0
  148. package/src/layouts/treeTopology.ts +184 -0
  149. package/src/rendering/defaultRenderers.ts +110 -0
  150. package/src/rendering/index.ts +3 -0
  151. package/src/rendering/svg.ts +346 -0
  152. package/src/rendering/utils.ts +41 -0
  153. package/src/utils/config.ts +198 -0
  154. package/src/utils/constants.ts +24 -0
  155. package/src/utils/graphParser.ts +495 -0
  156. package/src/utils/graphTraversal.ts +32 -0
  157. package/src/utils/index.ts +19 -0
  158. package/src/utils/nodeMetrics.ts +23 -0
  159. package/src/utils/nodeSizing.ts +97 -0
  160. package/tsconfig.json +11 -0
  161. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,277 @@
1
+ import { EdgeType } from '@graph-render/types';
2
+ const isPlainObject = (value) => {
3
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
4
+ };
5
+ const isFiniteNumber = (value) => typeof value === 'number' && Number.isFinite(value);
6
+ const sanitizeNodeId = (value, kind) => {
7
+ const normalized = value.trim();
8
+ if (!normalized) {
9
+ throw new TypeError(`Graph ${kind} identifiers must be non-empty strings.`);
10
+ }
11
+ return normalized;
12
+ };
13
+ const sanitizePoint = (value) => {
14
+ if (!isPlainObject(value) || !isFiniteNumber(value.x) || !isFiniteNumber(value.y)) {
15
+ return undefined;
16
+ }
17
+ return { x: value.x, y: value.y };
18
+ };
19
+ const sanitizeSize = (value) => {
20
+ if (!isPlainObject(value) || !isFiniteNumber(value.width) || !isFiniteNumber(value.height)) {
21
+ return undefined;
22
+ }
23
+ return value.width > 0 && value.height > 0
24
+ ? { width: value.width, height: value.height }
25
+ : undefined;
26
+ };
27
+ const sanitizeRecord = (value) => {
28
+ return isPlainObject(value) ? value : undefined;
29
+ };
30
+ const sanitizeMeasurementHints = (value) => {
31
+ if (!isPlainObject(value))
32
+ return undefined;
33
+ // FIX: was a bare cast `(value as NodeData['measurementHints'])` that let
34
+ // non-numeric values (e.g., paddingX: "8px") flow into layout arithmetic and
35
+ // produce NaN node sizes. Each field is now validated individually.
36
+ return {
37
+ label: typeof value.label === 'string' ? value.label : undefined,
38
+ paddingX: isFiniteNumber(value.paddingX) && value.paddingX >= 0
39
+ ? value.paddingX
40
+ : undefined,
41
+ paddingY: isFiniteNumber(value.paddingY) && value.paddingY >= 0
42
+ ? value.paddingY
43
+ : undefined,
44
+ estimatedCharWidth: isFiniteNumber(value.estimatedCharWidth) && value.estimatedCharWidth > 0
45
+ ? value.estimatedCharWidth
46
+ : undefined,
47
+ lineHeight: isFiniteNumber(value.lineHeight) && value.lineHeight > 0
48
+ ? value.lineHeight
49
+ : undefined,
50
+ };
51
+ };
52
+ const sanitizeNodeData = (id, attrs) => {
53
+ const position = sanitizePoint(attrs.position);
54
+ const size = sanitizeSize(attrs.size);
55
+ const measuredSize = sanitizeSize(attrs.measuredSize);
56
+ const measurementHints = sanitizeMeasurementHints(attrs.measurementHints);
57
+ return {
58
+ id,
59
+ label: attrs.label,
60
+ position,
61
+ size,
62
+ measuredSize,
63
+ sizeMode: attrs.sizeMode === 'fixed' || attrs.sizeMode === 'label' || attrs.sizeMode === 'measured'
64
+ ? attrs.sizeMode
65
+ : undefined,
66
+ measurementHints,
67
+ data: attrs.data,
68
+ meta: sanitizeRecord(attrs.meta),
69
+ };
70
+ };
71
+ const sanitizeEdgePoints = (value) => {
72
+ if (!Array.isArray(value)) {
73
+ return undefined;
74
+ }
75
+ const points = value
76
+ .map((point) => sanitizePoint(point))
77
+ .filter((point) => point !== undefined);
78
+ return points.length >= 2 ? points : undefined;
79
+ };
80
+ const assertUniqueEdgeId = (candidate, usedEdgeIds) => {
81
+ if (usedEdgeIds.has(candidate)) {
82
+ throw new TypeError(`Graph edge identifiers must be unique. Duplicate edge id "${candidate}" was provided.`);
83
+ }
84
+ usedEdgeIds.add(candidate);
85
+ return candidate;
86
+ };
87
+ const assertValidGraphInput = (graph) => {
88
+ if (!isPlainObject(graph)) {
89
+ throw new TypeError('Graph input must be a plain object.');
90
+ }
91
+ if (!isPlainObject(graph.adj)) {
92
+ throw new TypeError('Graph input must include an adjacency map in `adj`.');
93
+ }
94
+ if (graph.nodes != null && !isPlainObject(graph.nodes)) {
95
+ throw new TypeError('Graph `nodes` must be a record of node attributes when provided.');
96
+ }
97
+ for (const [source, neighbors] of Object.entries(graph.adj)) {
98
+ if (!isPlainObject(neighbors)) {
99
+ throw new TypeError(`Adjacency entry for node "${source}" must be an object.`);
100
+ }
101
+ for (const [target, rawAttrs] of Object.entries(neighbors)) {
102
+ const attrsList = Array.isArray(rawAttrs) ? rawAttrs : [rawAttrs];
103
+ if (!attrsList.length) {
104
+ throw new TypeError(`Adjacency entry for edge "${source}" -> "${target}" must not be an empty array.`);
105
+ }
106
+ attrsList.forEach((attrs, index) => {
107
+ if (attrs != null && !isPlainObject(attrs)) {
108
+ throw new TypeError(`Edge attributes for "${source}" -> "${target}" at index ${index} must be an object.`);
109
+ }
110
+ });
111
+ }
112
+ }
113
+ };
114
+ /**
115
+ * Build node map from graph node definitions
116
+ */
117
+ const buildNodeMap = (graph) => {
118
+ const nodeMap = new Map();
119
+ if (graph.nodes) {
120
+ for (const [id, attrs] of Object.entries(graph.nodes)) {
121
+ if (attrs != null && !isPlainObject(attrs)) {
122
+ throw new TypeError(`Node attributes for "${id}" must be an object when provided.`);
123
+ }
124
+ const sanitizedId = sanitizeNodeId(id, 'node');
125
+ nodeMap.set(sanitizedId, sanitizeNodeData(sanitizedId, attrs ?? {}));
126
+ }
127
+ }
128
+ return nodeMap;
129
+ };
130
+ const hasExplicitNodeDefinitions = (graph) => {
131
+ return Boolean(graph.nodes && Object.keys(graph.nodes).length > 0);
132
+ };
133
+ /**
134
+ * Ensure a node exists in the map, creating it if necessary
135
+ */
136
+ const ensureNodeExists = (nodeMap, nodeId) => {
137
+ const sanitizedNodeId = sanitizeNodeId(nodeId, 'edge-endpoint');
138
+ if (!nodeMap.has(sanitizedNodeId)) {
139
+ nodeMap.set(sanitizedNodeId, { id: sanitizedNodeId });
140
+ }
141
+ };
142
+ const assertNodeExists = (nodeMap, nodeId, graph, kind) => {
143
+ const sanitizedNodeId = sanitizeNodeId(nodeId, 'edge-endpoint');
144
+ if (!hasExplicitNodeDefinitions(graph)) {
145
+ ensureNodeExists(nodeMap, sanitizedNodeId);
146
+ return;
147
+ }
148
+ if (!nodeMap.has(sanitizedNodeId)) {
149
+ throw new TypeError(`Graph edge ${kind} "${sanitizedNodeId}" must exist in graph.nodes when explicit node definitions are provided.`);
150
+ }
151
+ };
152
+ /**
153
+ * Normalize edge attributes to array format
154
+ */
155
+ const normalizeEdgeAttributes = (rawAttrs) => {
156
+ return Array.isArray(rawAttrs) ? rawAttrs : [rawAttrs];
157
+ };
158
+ /**
159
+ * Generate unique key for undirected edge deduplication
160
+ */
161
+ const createUndirectedEdgeKey = (source, target, index) => {
162
+ return `${[source, target].sort().join('|')}|${index}`;
163
+ };
164
+ /**
165
+ * Generate default edge ID
166
+ */
167
+ const generateEdgeId = (source, target, index) => {
168
+ return `${source}-${target}-${index}`;
169
+ };
170
+ /**
171
+ * Check if undirected edge was already processed
172
+ */
173
+ const isUndirectedEdgeSeen = (edgeType, source, target, index, seenSet) => {
174
+ if (edgeType !== EdgeType.Undirected)
175
+ return false;
176
+ const key = createUndirectedEdgeKey(source, target, index);
177
+ if (seenSet.has(key))
178
+ return true;
179
+ seenSet.add(key);
180
+ return false;
181
+ };
182
+ /**
183
+ * Create edge data object from attributes
184
+ */
185
+ const createEdgeData = (source, target, index, attrs, defaultEdgeType, usedEdgeIds) => {
186
+ const { id, type, points, meta, ...rest } = attrs ?? {};
187
+ const edgeType = type ?? defaultEdgeType;
188
+ const baseId = sanitizeNodeId(String(id ?? generateEdgeId(source, target, index)), 'node');
189
+ return {
190
+ id: assertUniqueEdgeId(baseId, usedEdgeIds),
191
+ source,
192
+ target,
193
+ type: edgeType === EdgeType.Directed || edgeType === EdgeType.Undirected
194
+ ? edgeType
195
+ : defaultEdgeType,
196
+ points: sanitizeEdgePoints(points),
197
+ meta: sanitizeRecord(meta),
198
+ ...rest,
199
+ };
200
+ };
201
+ const createTypedEdgeData = (source, target, index, attrs, defaultEdgeType, usedEdgeIds) => {
202
+ const edgeData = createEdgeData(source, target, index, attrs, defaultEdgeType, usedEdgeIds);
203
+ return edgeData;
204
+ };
205
+ /**
206
+ * Process edges from adjacency list for a source node
207
+ */
208
+ const processNodeEdges = (source, neighbors, defaultEdgeType, graph, nodeMap, undirectedSeen, usedEdgeIds) => {
209
+ const edges = [];
210
+ for (const [target, rawAttrs] of Object.entries(neighbors)) {
211
+ const sanitizedTarget = sanitizeNodeId(target, 'edge-endpoint');
212
+ assertNodeExists(nodeMap, sanitizedTarget, graph, 'target');
213
+ const attrsList = normalizeEdgeAttributes(rawAttrs);
214
+ attrsList.forEach((attrs, idx) => {
215
+ const edgeData = createEdgeData(source, sanitizedTarget, idx, attrs, defaultEdgeType, usedEdgeIds);
216
+ // Skip if undirected edge already seen from other direction
217
+ if (!isUndirectedEdgeSeen(edgeData.type, source, sanitizedTarget, idx, undirectedSeen)) {
218
+ edges.push(edgeData);
219
+ }
220
+ });
221
+ }
222
+ return edges;
223
+ };
224
+ const processTypedNodeEdges = (source, neighbors, defaultEdgeType, graph, nodeMap, undirectedSeen, usedEdgeIds) => {
225
+ const edges = [];
226
+ for (const [target, rawAttrs] of Object.entries(neighbors)) {
227
+ const sanitizedTarget = sanitizeNodeId(target, 'edge-endpoint');
228
+ assertNodeExists(nodeMap, sanitizedTarget, graph, 'target');
229
+ const attrsList = normalizeEdgeAttributes(rawAttrs);
230
+ attrsList.forEach((attrs, idx) => {
231
+ const edgeData = createTypedEdgeData(source, sanitizedTarget, idx, attrs, defaultEdgeType, usedEdgeIds);
232
+ // Skip if undirected edge already seen from other direction
233
+ if (!isUndirectedEdgeSeen(edgeData.type, source, sanitizedTarget, idx, undirectedSeen)) {
234
+ edges.push(edgeData);
235
+ }
236
+ });
237
+ }
238
+ return edges;
239
+ };
240
+ /**
241
+ * Parse NetworkX-style graph input to internal format
242
+ */
243
+ export const fromNxGraph = (graph, defaultEdgeType = EdgeType.Undirected) => {
244
+ assertValidGraphInput(graph);
245
+ const nodeMap = buildNodeMap(graph);
246
+ const undirectedSeen = new Set();
247
+ const usedEdgeIds = new Set();
248
+ const edges = [];
249
+ for (const [source, neighbors] of Object.entries(graph.adj)) {
250
+ const sanitizedSource = sanitizeNodeId(source, 'edge-endpoint');
251
+ assertNodeExists(nodeMap, sanitizedSource, graph, 'source');
252
+ const nodeEdges = processNodeEdges(sanitizedSource, neighbors, defaultEdgeType, graph, nodeMap, undirectedSeen, usedEdgeIds);
253
+ edges.push(...nodeEdges);
254
+ }
255
+ return {
256
+ nodes: Array.from(nodeMap.values()),
257
+ edges,
258
+ };
259
+ };
260
+ export const fromTypedNxGraph = (graph, defaultEdgeType = EdgeType.Undirected) => {
261
+ assertValidGraphInput(graph);
262
+ const nodeMap = buildNodeMap(graph);
263
+ const undirectedSeen = new Set();
264
+ const usedEdgeIds = new Set();
265
+ const edges = [];
266
+ for (const [source, neighbors] of Object.entries(graph.adj)) {
267
+ const sanitizedSource = sanitizeNodeId(source, 'edge-endpoint');
268
+ assertNodeExists(nodeMap, sanitizedSource, graph, 'source');
269
+ const nodeEdges = processTypedNodeEdges(sanitizedSource, neighbors, defaultEdgeType, graph, nodeMap, undirectedSeen, usedEdgeIds);
270
+ edges.push(...nodeEdges);
271
+ }
272
+ return {
273
+ nodes: Array.from(nodeMap.values()),
274
+ edges,
275
+ };
276
+ };
277
+ //# sourceMappingURL=graphParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphParser.js","sourceRoot":"","sources":["../../src/utils/graphParser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { PositionedEdge } from '@graph-render/types';
2
+ /**
3
+ * Group edges by their target node
4
+ */
5
+ export declare const groupEdgesByTarget: (edges: PositionedEdge[]) => Map<string, PositionedEdge[]>;
6
+ /**
7
+ * Sort edges by their source node position (y first, then x)
8
+ */
9
+ export declare const sortEdgesBySourcePosition: (edges: PositionedEdge[], nodePositions: Map<string, {
10
+ x: number;
11
+ y: number;
12
+ }>) => PositionedEdge[];
13
+ //# sourceMappingURL=graphTraversal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphTraversal.d.ts","sourceRoot":"","sources":["../../src/utils/graphTraversal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD;;GAEG;AACH,eAAO,MAAM,kBAAkB,GAAI,OAAO,cAAc,EAAE,KAAG,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,CAQxF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,yBAAyB,GACpC,OAAO,cAAc,EAAE,EACvB,eAAe,GAAG,CAAC,MAAM,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,KACnD,cAAc,EAUhB,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Group edges by their target node
3
+ */
4
+ export const groupEdgesByTarget = (edges) => {
5
+ const map = new Map();
6
+ edges.forEach((edge) => {
7
+ const arr = map.get(edge.target) ?? [];
8
+ arr.push(edge);
9
+ map.set(edge.target, arr);
10
+ });
11
+ return map;
12
+ };
13
+ /**
14
+ * Sort edges by their source node position (y first, then x)
15
+ */
16
+ export const sortEdgesBySourcePosition = (edges, nodePositions) => {
17
+ return [...edges].sort((a, b) => {
18
+ const pa = nodePositions.get(a.source);
19
+ const pb = nodePositions.get(b.source);
20
+ if (pa && pb) {
21
+ if (pa.y !== pb.y)
22
+ return pa.y - pb.y;
23
+ return pa.x - pb.x;
24
+ }
25
+ return 0;
26
+ });
27
+ };
28
+ //# sourceMappingURL=graphTraversal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphTraversal.js","sourceRoot":"","sources":["../../src/utils/graphTraversal.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,KAAuB,EAAiC,EAAE;IAC3F,MAAM,GAAG,GAAG,IAAI,GAAG,EAA4B,CAAC;IAChD,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QACrB,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACvC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IACH,OAAO,GAAG,CAAC;AACb,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CACvC,KAAuB,EACvB,aAAoD,EAClC,EAAE;IACpB,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC9B,MAAM,EAAE,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACvC,MAAM,EAAE,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;YACb,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;gBAAE,OAAO,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACtC,OAAO,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC,CAAC,CAAC;AACL,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ export { fromNxGraph, fromTypedNxGraph } from './graphParser';
2
+ export { DEFAULT_THEME, DEFAULT_NODE_SIZE, DEFAULT_NODE_GAP, DEFAULT_PADDING, DEFAULT_NODE_WIDTH, DEFAULT_NODE_HEIGHT, DEFAULT_NODE_RADIUS, DEFAULT_NODE_FILL, DEFAULT_NODE_STROKE, DEFAULT_TEXT_FILL, DEFAULT_TEXT_SIZE, } from './constants';
3
+ export { groupEdgesByTarget, sortEdgesBySourcePosition } from './graphTraversal';
4
+ export { applyNodeSizing } from './nodeSizing';
5
+ export { getMaxNodeDimensions, getMaxNodeHeight, getMaxNodeWidth } from './nodeMetrics';
6
+ export { normalizeGraphConfig } from './config';
7
+ export type { NormalizedGraphConfig } from './config';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACxF,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAChD,YAAY,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,7 @@
1
+ export { fromNxGraph, fromTypedNxGraph } from './graphParser';
2
+ export { DEFAULT_THEME, DEFAULT_NODE_SIZE, DEFAULT_NODE_GAP, DEFAULT_PADDING, DEFAULT_NODE_WIDTH, DEFAULT_NODE_HEIGHT, DEFAULT_NODE_RADIUS, DEFAULT_NODE_FILL, DEFAULT_NODE_STROKE, DEFAULT_TEXT_FILL, DEFAULT_TEXT_SIZE, } from './constants';
3
+ export { groupEdgesByTarget, sortEdgesBySourcePosition } from './graphTraversal';
4
+ export { applyNodeSizing } from './nodeSizing';
5
+ export { getMaxNodeDimensions, getMaxNodeHeight, getMaxNodeWidth } from './nodeMetrics';
6
+ export { normalizeGraphConfig } from './config';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACxF,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { NodeData } from '@graph-render/types';
2
+ export declare const getMaxNodeWidth: (nodes: NodeData[]) => number;
3
+ export declare const getMaxNodeHeight: (nodes: NodeData[]) => number;
4
+ export declare const getMaxNodeDimensions: (nodes: NodeData[]) => {
5
+ maxWidth: number;
6
+ maxHeight: number;
7
+ };
8
+ //# sourceMappingURL=nodeMetrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodeMetrics.d.ts","sourceRoot":"","sources":["../../src/utils/nodeMetrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAG/C,eAAO,MAAM,eAAe,GAAI,OAAO,QAAQ,EAAE,KAAG,MAKnD,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,OAAO,QAAQ,EAAE,KAAG,MAKpD,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAC/B,OAAO,QAAQ,EAAE,KAChB;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAGtC,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { DEFAULT_NODE_SIZE } from './constants';
2
+ export const getMaxNodeWidth = (nodes) => {
3
+ return nodes.reduce((max, node) => Math.max(max, node.size?.width ?? DEFAULT_NODE_SIZE.width), 0);
4
+ };
5
+ export const getMaxNodeHeight = (nodes) => {
6
+ return nodes.reduce((max, node) => Math.max(max, node.size?.height ?? DEFAULT_NODE_SIZE.height), 0);
7
+ };
8
+ export const getMaxNodeDimensions = (nodes) => ({
9
+ maxWidth: getMaxNodeWidth(nodes),
10
+ maxHeight: getMaxNodeHeight(nodes),
11
+ });
12
+ //# sourceMappingURL=nodeMetrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodeMetrics.js","sourceRoot":"","sources":["../../src/utils/nodeMetrics.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,KAAiB,EAAU,EAAE;IAC3D,OAAO,KAAK,CAAC,MAAM,CACjB,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,iBAAiB,CAAC,KAAK,CAAC,EACzE,CAAC,CACF,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAiB,EAAU,EAAE;IAC5D,OAAO,KAAK,CAAC,MAAM,CACjB,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,IAAI,iBAAiB,CAAC,MAAM,CAAC,EAC3E,CAAC,CACF,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,KAAiB,EACwB,EAAE,CAAC,CAAC;IAC7C,QAAQ,EAAE,eAAe,CAAC,KAAK,CAAC;IAChC,SAAS,EAAE,gBAAgB,CAAC,KAAK,CAAC;CACnC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { LayoutOptions, NodeData } from '@graph-render/types';
2
+ export declare const applyNodeSizing: (nodes: NodeData[], options: LayoutOptions) => NodeData[];
3
+ //# sourceMappingURL=nodeSizing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodeSizing.d.ts","sourceRoot":"","sources":["../../src/utils/nodeSizing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAQ,MAAM,qBAAqB,CAAC;AA2FpE,eAAO,MAAM,eAAe,GAAI,OAAO,QAAQ,EAAE,EAAE,SAAS,aAAa,KAAG,QAAQ,EAKnF,CAAC"}
@@ -0,0 +1,77 @@
1
+ import { DEFAULT_NODE_SIZE } from './constants';
2
+ const DEFAULT_PADDING_X = 18;
3
+ const DEFAULT_PADDING_Y = 12;
4
+ const DEFAULT_CHAR_WIDTH = 8;
5
+ const DEFAULT_LINE_HEIGHT = 18;
6
+ const MAX_MEASUREMENT_TEXT_LENGTH = 4000;
7
+ const MAX_MEASUREMENT_LINES = 200;
8
+ const MAX_MEASUREMENT_CHARS_PER_LINE = 400;
9
+ const clampSize = (value, fallback) => ({
10
+ width: Number.isFinite(value.width) && value.width > 0 ? value.width : fallback.width,
11
+ height: Number.isFinite(value.height) && value.height > 0 ? value.height : fallback.height,
12
+ });
13
+ const getNodeLabel = (node) => {
14
+ if (typeof node.measurementHints?.label === 'string') {
15
+ return node.measurementHints.label;
16
+ }
17
+ if (typeof node.label === 'string' || typeof node.label === 'number') {
18
+ return String(node.label);
19
+ }
20
+ return node.id;
21
+ };
22
+ const getMeasuredLines = (label) => {
23
+ const truncatedLabel = label.slice(0, MAX_MEASUREMENT_TEXT_LENGTH);
24
+ const rawLines = truncatedLabel.split(/\r?\n/);
25
+ const measuredLines = [];
26
+ for (let index = 0; index < rawLines.length && measuredLines.length < MAX_MEASUREMENT_LINES; index += 1) {
27
+ const codePoints = Array.from(rawLines[index]);
28
+ if (!codePoints.length) {
29
+ continue;
30
+ }
31
+ measuredLines.push(codePoints.slice(0, MAX_MEASUREMENT_CHARS_PER_LINE).join(''));
32
+ }
33
+ return measuredLines.length ? measuredLines : [''];
34
+ };
35
+ const estimateLabelSize = (node, options) => {
36
+ const label = getNodeLabel(node);
37
+ const lines = getMeasuredLines(label);
38
+ const paddingX = node.measurementHints?.paddingX ?? options.labelMeasurementPaddingX ?? DEFAULT_PADDING_X;
39
+ const paddingY = node.measurementHints?.paddingY ?? options.labelMeasurementPaddingY ?? DEFAULT_PADDING_Y;
40
+ const charWidth = node.measurementHints?.estimatedCharWidth ??
41
+ options.labelMeasurementCharWidth ??
42
+ DEFAULT_CHAR_WIDTH;
43
+ const lineHeight = node.measurementHints?.lineHeight ?? options.labelMeasurementLineHeight ?? DEFAULT_LINE_HEIGHT;
44
+ let maxChars = 1;
45
+ for (const line of lines) {
46
+ const lineLength = Array.from(line).length;
47
+ if (lineLength > maxChars) {
48
+ maxChars = lineLength;
49
+ }
50
+ }
51
+ const lineCount = Math.max(1, lines.length);
52
+ return {
53
+ width: Math.max(DEFAULT_NODE_SIZE.width, Math.ceil(maxChars * charWidth + paddingX * 2)),
54
+ height: Math.max(DEFAULT_NODE_SIZE.height, Math.ceil(lineCount * lineHeight + paddingY * 2)),
55
+ };
56
+ };
57
+ const getResolvedSize = (node, options) => {
58
+ const mode = node.sizeMode ?? options.nodeSizing ?? 'fixed';
59
+ const fixedSize = options.fixedNodeSize ?? DEFAULT_NODE_SIZE;
60
+ const explicitSize = node.size ? clampSize(node.size, fixedSize) : null;
61
+ const measuredSize = node.measuredSize ? clampSize(node.measuredSize, fixedSize) : null;
62
+ const estimatedSize = estimateLabelSize(node, options);
63
+ if (mode === 'measured') {
64
+ return measuredSize ?? explicitSize ?? estimatedSize;
65
+ }
66
+ if (mode === 'label') {
67
+ return explicitSize ?? estimatedSize;
68
+ }
69
+ return explicitSize ?? fixedSize;
70
+ };
71
+ export const applyNodeSizing = (nodes, options) => {
72
+ return nodes.map((node) => ({
73
+ ...node,
74
+ size: getResolvedSize(node, options),
75
+ }));
76
+ };
77
+ //# sourceMappingURL=nodeSizing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodeSizing.js","sourceRoot":"","sources":["../../src/utils/nodeSizing.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,29 @@
1
+ {
2
+ "name": "@graph-render/core",
3
+ "version": "1.0.1",
4
+ "private": false,
5
+ "publishConfig": {
6
+ "access": "public"
7
+ },
8
+ "type": "module",
9
+ "main": "dist/index.js",
10
+ "types": "dist/index.d.ts",
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/index.d.ts",
14
+ "import": "./dist/index.js"
15
+ }
16
+ },
17
+ "license": "MIT",
18
+ "scripts": {
19
+ "build": "tsc -p tsconfig.json"
20
+ },
21
+ "dependencies": {
22
+ "@graph-render/types": "1.0.1"
23
+ },
24
+ "devDependencies": {
25
+ "@types/node": "^20.10.7",
26
+ "ts-node": "^10.9.2",
27
+ "typescript": "^5.3.3"
28
+ }
29
+ }
package/project.json ADDED
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "@graph-render/core",
3
+ "$schema": "../../node_modules/nx/schemas/project-schema.json",
4
+ "sourceRoot": "src/core-graph-render/src",
5
+ "projectType": "library",
6
+ "targets": {
7
+ "build": {
8
+ "executor": "nx:run-commands",
9
+ "outputs": ["{projectRoot}/dist"],
10
+ "options": {
11
+ "command": "tsc -p tsconfig.json",
12
+ "cwd": "{projectRoot}"
13
+ },
14
+ "dependsOn": ["^build"]
15
+ },
16
+ "lint": {
17
+ "executor": "nx:run-commands",
18
+ "options": {
19
+ "command": "eslint src --ext .ts --ignore-path ../../.eslintignore",
20
+ "cwd": "{projectRoot}"
21
+ }
22
+ },
23
+ "format": {
24
+ "executor": "nx:run-commands",
25
+ "options": {
26
+ "command": "prettier --write src",
27
+ "cwd": "{projectRoot}"
28
+ }
29
+ }
30
+ },
31
+ "tags": ["type:library"]
32
+ }
@@ -0,0 +1,31 @@
1
+ import { Point } from '@graph-render/types';
2
+
3
+ export const segmentIntersectsRect = (
4
+ p1: Point,
5
+ p2: Point,
6
+ rect: { x: number; y: number; w: number; h: number }
7
+ ): boolean => {
8
+ const { x, y, w, h } = rect;
9
+ const minX = Math.min(p1.x, p2.x);
10
+ const maxX = Math.max(p1.x, p2.x);
11
+ const minY = Math.min(p1.y, p2.y);
12
+ const maxY = Math.max(p1.y, p2.y);
13
+ if (maxX < x || minX > x + w || maxY < y || minY > y + h) return false;
14
+
15
+ const inside = (px: number, py: number) => px >= x && px <= x + w && py >= y && py <= y + h;
16
+ if (inside(p1.x, p1.y) || inside(p2.x, p2.y)) return true;
17
+
18
+ const intersectsEdge = (x1: number, y1: number, x2: number, y2: number) => {
19
+ const denom = (p2.y - p1.y) * (x2 - x1) - (p2.x - p1.x) * (y2 - y1);
20
+ if (denom === 0) return false;
21
+ const ua = ((p2.x - p1.x) * (y1 - p1.y) - (p2.y - p1.y) * (x1 - p1.x)) / denom;
22
+ const ub = ((x2 - x1) * (y1 - p1.y) - (y2 - y1) * (x1 - p1.x)) / denom;
23
+ return ua >= 0 && ua <= 1 && ub >= 0 && ub <= 1;
24
+ };
25
+
26
+ const r1 = intersectsEdge(x, y, x + w, y);
27
+ const r2 = intersectsEdge(x + w, y, x + w, y + h);
28
+ const r3 = intersectsEdge(x + w, y + h, x, y + h);
29
+ const r4 = intersectsEdge(x, y + h, x, y);
30
+ return r1 || r2 || r3 || r4;
31
+ };