@deck.gl-community/graph-layers 9.2.0-beta.2 → 9.2.0-beta.4

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 (313) hide show
  1. package/dist/_deprecated/old-constants.d.ts +1 -0
  2. package/dist/_deprecated/old-constants.js +1 -0
  3. package/dist/core/cache.d.ts +1 -0
  4. package/dist/core/cache.js +1 -0
  5. package/dist/core/constants.d.ts +2 -1
  6. package/dist/core/constants.js +1 -0
  7. package/dist/core/graph-engine.d.ts +64 -21
  8. package/dist/core/graph-engine.d.ts.map +1 -1
  9. package/dist/core/graph-engine.js +158 -77
  10. package/dist/core/graph-engine.js.map +1 -1
  11. package/dist/core/graph-layout.d.ts +23 -18
  12. package/dist/core/graph-layout.d.ts.map +1 -1
  13. package/dist/core/graph-layout.js +35 -19
  14. package/dist/core/graph-layout.js.map +1 -1
  15. package/dist/core/interaction-manager.d.ts +5 -4
  16. package/dist/core/interaction-manager.d.ts.map +1 -1
  17. package/dist/core/interaction-manager.js +10 -7
  18. package/dist/core/interaction-manager.js.map +1 -1
  19. package/dist/graph/arrow-graph.d.ts +70 -0
  20. package/dist/graph/arrow-graph.d.ts.map +1 -0
  21. package/dist/graph/arrow-graph.js +514 -0
  22. package/dist/graph/arrow-graph.js.map +1 -0
  23. package/dist/graph/classic-graph.d.ts +170 -0
  24. package/dist/graph/classic-graph.d.ts.map +1 -0
  25. package/dist/graph/classic-graph.js +391 -0
  26. package/dist/graph/classic-graph.js.map +1 -0
  27. package/dist/graph/edge.d.ts +8 -7
  28. package/dist/graph/edge.d.ts.map +1 -1
  29. package/dist/graph/edge.js +1 -0
  30. package/dist/graph/edge.js.map +1 -1
  31. package/dist/graph/functions/arrow-utils.d.ts +7 -0
  32. package/dist/graph/functions/arrow-utils.d.ts.map +1 -0
  33. package/dist/graph/functions/arrow-utils.js +68 -0
  34. package/dist/graph/functions/arrow-utils.js.map +1 -0
  35. package/dist/graph/functions/create-graph-from-data.d.ts +4 -0
  36. package/dist/graph/functions/create-graph-from-data.d.ts.map +1 -0
  37. package/dist/graph/functions/create-graph-from-data.js +13 -0
  38. package/dist/graph/functions/create-graph-from-data.js.map +1 -0
  39. package/dist/graph/graph-normalization.d.ts +11 -0
  40. package/dist/graph/graph-normalization.d.ts.map +1 -0
  41. package/dist/graph/graph-normalization.js +66 -0
  42. package/dist/graph/graph-normalization.js.map +1 -0
  43. package/dist/graph/graph.d.ts +63 -155
  44. package/dist/graph/graph.d.ts.map +1 -1
  45. package/dist/graph/graph.js +12 -300
  46. package/dist/graph/graph.js.map +1 -1
  47. package/dist/graph/node.d.ts +8 -7
  48. package/dist/graph/node.d.ts.map +1 -1
  49. package/dist/graph/node.js +3 -2
  50. package/dist/graph/node.js.map +1 -1
  51. package/dist/graph-data/arrow-graph-data-builder.d.ts +22 -0
  52. package/dist/graph-data/arrow-graph-data-builder.d.ts.map +1 -0
  53. package/dist/graph-data/arrow-graph-data-builder.js +106 -0
  54. package/dist/graph-data/arrow-graph-data-builder.js.map +1 -0
  55. package/dist/graph-data/graph-data-builder.d.ts +7 -0
  56. package/dist/graph-data/graph-data-builder.d.ts.map +1 -0
  57. package/dist/graph-data/graph-data-builder.js +2 -0
  58. package/dist/graph-data/graph-data-builder.js.map +1 -0
  59. package/dist/graph-data/graph-data.d.ts +41 -0
  60. package/dist/graph-data/graph-data.d.ts.map +1 -0
  61. package/dist/graph-data/graph-data.js +12 -0
  62. package/dist/graph-data/graph-data.js.map +1 -0
  63. package/dist/graph-data/plain-graph-data-builder.d.ts +21 -0
  64. package/dist/graph-data/plain-graph-data-builder.d.ts.map +1 -0
  65. package/dist/graph-data/plain-graph-data-builder.js +106 -0
  66. package/dist/graph-data/plain-graph-data-builder.js.map +1 -0
  67. package/dist/graph-style-schema.cdn.js +1 -1
  68. package/dist/graph-style-schema.json +1 -1
  69. package/dist/index.cjs +6905 -4576
  70. package/dist/index.cjs.map +4 -4
  71. package/dist/index.d.ts +36 -28
  72. package/dist/index.d.ts.map +1 -1
  73. package/dist/index.js +43 -29
  74. package/dist/index.js.map +1 -1
  75. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-fragment.glsl.d.ts +1 -0
  76. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-fragment.glsl.js +1 -0
  77. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex-tf.glsl.d.ts +1 -0
  78. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex-tf.glsl.js +1 -0
  79. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex.glsl.d.ts +1 -0
  80. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex.glsl.js +1 -0
  81. package/dist/layers/common-layers/flow-path-layer/flow-path-layer.d.ts +1 -0
  82. package/dist/layers/common-layers/flow-path-layer/flow-path-layer.d.ts.map +1 -1
  83. package/dist/layers/common-layers/flow-path-layer/flow-path-layer.js +2 -2
  84. package/dist/layers/common-layers/flow-path-layer/flow-path-layer.js.map +1 -1
  85. package/dist/layers/common-layers/grid-layer/grid-layer.d.ts +84 -0
  86. package/dist/layers/common-layers/grid-layer/grid-layer.d.ts.map +1 -0
  87. package/dist/layers/common-layers/grid-layer/grid-layer.js +134 -0
  88. package/dist/layers/common-layers/grid-layer/grid-layer.js.map +1 -0
  89. package/dist/layers/common-layers/marker-layer/atlas-data-url.d.ts +1 -0
  90. package/dist/layers/common-layers/marker-layer/atlas-data-url.js +1 -0
  91. package/dist/layers/common-layers/marker-layer/marker-layer.d.ts +1 -0
  92. package/dist/layers/common-layers/marker-layer/marker-layer.js +3 -2
  93. package/dist/layers/common-layers/marker-layer/marker-list.d.ts +1 -0
  94. package/dist/layers/common-layers/marker-layer/marker-list.js +1 -0
  95. package/dist/layers/common-layers/marker-layer/marker-mapping.d.ts +1 -0
  96. package/dist/layers/common-layers/marker-layer/marker-mapping.js +1 -0
  97. package/dist/layers/common-layers/spline-layer/spline-layer.d.ts +1 -0
  98. package/dist/layers/common-layers/spline-layer/spline-layer.js +1 -0
  99. package/dist/layers/common-layers/zoomable-text-layer/zoomable-text-layer.d.ts +1 -0
  100. package/dist/layers/common-layers/zoomable-text-layer/zoomable-text-layer.js +1 -0
  101. package/dist/layers/edge-attachment-helper.d.ts +4 -3
  102. package/dist/layers/edge-attachment-helper.d.ts.map +1 -1
  103. package/dist/layers/edge-attachment-helper.js +4 -4
  104. package/dist/layers/edge-attachment-helper.js.map +1 -1
  105. package/dist/layers/edge-layer.d.ts +1 -0
  106. package/dist/layers/edge-layer.js +4 -3
  107. package/dist/layers/edge-layers/arrow-2d-geometry.d.ts +1 -0
  108. package/dist/layers/edge-layers/arrow-2d-geometry.js +1 -0
  109. package/dist/layers/edge-layers/curved-edge-layer.d.ts +2 -1
  110. package/dist/layers/edge-layers/curved-edge-layer.js +2 -1
  111. package/dist/layers/edge-layers/edge-arrow-layer.d.ts +1 -0
  112. package/dist/layers/edge-layers/edge-arrow-layer.js +2 -1
  113. package/dist/layers/edge-layers/edge-label-layer.d.ts +2 -1
  114. package/dist/layers/edge-layers/edge-label-layer.js +2 -1
  115. package/dist/layers/edge-layers/flow-layer.d.ts +2 -1
  116. package/dist/layers/edge-layers/flow-layer.js +2 -1
  117. package/dist/layers/edge-layers/path-edge-layer.d.ts +1 -0
  118. package/dist/layers/edge-layers/path-edge-layer.js +1 -0
  119. package/dist/layers/edge-layers/straight-line-edge-layer.d.ts +1 -0
  120. package/dist/layers/edge-layers/straight-line-edge-layer.js +1 -0
  121. package/dist/layers/graph-layer.d.ts +75 -17
  122. package/dist/layers/graph-layer.d.ts.map +1 -1
  123. package/dist/layers/graph-layer.js +450 -64
  124. package/dist/layers/graph-layer.js.map +1 -1
  125. package/dist/layers/node-layers/circle-layer.d.ts +1 -0
  126. package/dist/layers/node-layers/circle-layer.js +1 -0
  127. package/dist/layers/node-layers/image-layer.d.ts +1 -0
  128. package/dist/layers/node-layers/image-layer.js +1 -0
  129. package/dist/layers/node-layers/label-layer.d.ts +2 -1
  130. package/dist/layers/node-layers/label-layer.js +2 -1
  131. package/dist/layers/node-layers/path-rounded-rectangle-layer.d.ts +1 -0
  132. package/dist/layers/node-layers/path-rounded-rectangle-layer.js +2 -1
  133. package/dist/layers/node-layers/rectangle-layer.d.ts +1 -0
  134. package/dist/layers/node-layers/rectangle-layer.js +1 -0
  135. package/dist/layers/node-layers/rounded-rectangle-layer-fragment.d.ts +1 -0
  136. package/dist/layers/node-layers/rounded-rectangle-layer-fragment.js +1 -0
  137. package/dist/layers/node-layers/rounded-rectangle-layer.d.ts +2 -1
  138. package/dist/layers/node-layers/rounded-rectangle-layer.js +3 -2
  139. package/dist/layers/node-layers/zoomable-marker-layer.d.ts +2 -1
  140. package/dist/layers/node-layers/zoomable-marker-layer.js +2 -1
  141. package/dist/layouts/d3-dag/collapsable-d3-dag-layout.d.ts +25 -0
  142. package/dist/layouts/d3-dag/collapsable-d3-dag-layout.d.ts.map +1 -0
  143. package/dist/layouts/d3-dag/collapsable-d3-dag-layout.js +252 -0
  144. package/dist/layouts/d3-dag/collapsable-d3-dag-layout.js.map +1 -0
  145. package/dist/layouts/d3-dag/d3-dag-layout.d.ts +48 -62
  146. package/dist/layouts/d3-dag/d3-dag-layout.d.ts.map +1 -1
  147. package/dist/layouts/d3-dag/d3-dag-layout.js +89 -273
  148. package/dist/layouts/d3-dag/d3-dag-layout.js.map +1 -1
  149. package/dist/layouts/d3-force/d3-force-layout.d.ts +22 -9
  150. package/dist/layouts/d3-force/d3-force-layout.d.ts.map +1 -1
  151. package/dist/layouts/d3-force/d3-force-layout.js +42 -22
  152. package/dist/layouts/d3-force/d3-force-layout.js.map +1 -1
  153. package/dist/layouts/d3-force/worker.d.ts +1 -0
  154. package/dist/layouts/d3-force/worker.js +1 -0
  155. package/dist/layouts/experimental/force-multi-graph-layout.d.ts +21 -16
  156. package/dist/layouts/experimental/force-multi-graph-layout.d.ts.map +1 -1
  157. package/dist/layouts/experimental/force-multi-graph-layout.js +49 -39
  158. package/dist/layouts/experimental/force-multi-graph-layout.js.map +1 -1
  159. package/dist/layouts/experimental/hive-plot-layout.d.ts +20 -16
  160. package/dist/layouts/experimental/hive-plot-layout.d.ts.map +1 -1
  161. package/dist/layouts/experimental/hive-plot-layout.js +35 -35
  162. package/dist/layouts/experimental/hive-plot-layout.js.map +1 -1
  163. package/dist/layouts/experimental/radial-layout.d.ts +14 -8
  164. package/dist/layouts/experimental/radial-layout.d.ts.map +1 -1
  165. package/dist/layouts/experimental/radial-layout.js +33 -15
  166. package/dist/layouts/experimental/radial-layout.js.map +1 -1
  167. package/dist/layouts/gpu-force/gpu-force-layout.d.ts +13 -9
  168. package/dist/layouts/gpu-force/gpu-force-layout.d.ts.map +1 -1
  169. package/dist/layouts/gpu-force/gpu-force-layout.js +61 -57
  170. package/dist/layouts/gpu-force/gpu-force-layout.js.map +1 -1
  171. package/dist/layouts/gpu-force/worker.d.ts +1 -0
  172. package/dist/layouts/gpu-force/worker.js +1 -0
  173. package/dist/layouts/simple-layout.d.ts +10 -26
  174. package/dist/layouts/simple-layout.d.ts.map +1 -1
  175. package/dist/layouts/simple-layout.js +15 -18
  176. package/dist/layouts/simple-layout.js.map +1 -1
  177. package/dist/loaders/dot-graph-loader.d.ts +26 -0
  178. package/dist/loaders/dot-graph-loader.d.ts.map +1 -0
  179. package/dist/loaders/dot-graph-loader.js +669 -0
  180. package/dist/loaders/dot-graph-loader.js.map +1 -0
  181. package/dist/loaders/json-graph-loader.d.ts +7 -0
  182. package/dist/loaders/json-graph-loader.d.ts.map +1 -0
  183. package/dist/loaders/json-graph-loader.js +32 -0
  184. package/dist/loaders/json-graph-loader.js.map +1 -0
  185. package/dist/loaders/parsers/edge-parsers.d.ts +3 -0
  186. package/dist/loaders/parsers/edge-parsers.d.ts.map +1 -0
  187. package/dist/loaders/{edge-parsers.js → parsers/edge-parsers.js} +2 -1
  188. package/dist/loaders/parsers/edge-parsers.js.map +1 -0
  189. package/dist/loaders/parsers/node-parsers.d.ts +3 -0
  190. package/dist/loaders/parsers/node-parsers.d.ts.map +1 -0
  191. package/dist/loaders/{node-parsers.js → parsers/node-parsers.js} +2 -1
  192. package/dist/loaders/parsers/node-parsers.js.map +1 -0
  193. package/dist/loaders/parsers/parse-json-graph.d.ts +30 -0
  194. package/dist/loaders/parsers/parse-json-graph.d.ts.map +1 -0
  195. package/dist/loaders/parsers/parse-json-graph.js +79 -0
  196. package/dist/loaders/parsers/parse-json-graph.js.map +1 -0
  197. package/dist/style/graph-layer-stylesheet.d.ts +3 -2
  198. package/dist/style/graph-layer-stylesheet.js +1 -0
  199. package/dist/style/graph-style-accessor-map.d.ts +1 -0
  200. package/dist/style/graph-style-accessor-map.js +1 -0
  201. package/dist/style/graph-style-engine.d.ts +6 -3
  202. package/dist/style/graph-style-engine.d.ts.map +1 -1
  203. package/dist/style/graph-style-engine.js +7 -5
  204. package/dist/style/graph-style-engine.js.map +1 -1
  205. package/dist/style/graph-stylesheet.schema.d.ts +1 -0
  206. package/dist/style/graph-stylesheet.schema.js +1 -0
  207. package/dist/style/style-property.d.ts +1 -0
  208. package/dist/style/style-property.js +2 -1
  209. package/dist/style/{style-engine.d.ts → stylesheet-engine.d.ts} +5 -4
  210. package/dist/style/stylesheet-engine.d.ts.map +1 -0
  211. package/dist/style/{style-engine.js → stylesheet-engine.js} +4 -3
  212. package/dist/style/stylesheet-engine.js.map +1 -0
  213. package/dist/utils/collapsed-chains.d.ts +10 -9
  214. package/dist/utils/collapsed-chains.d.ts.map +1 -1
  215. package/dist/utils/collapsed-chains.js +2 -6
  216. package/dist/utils/collapsed-chains.js.map +1 -1
  217. package/dist/utils/layer-utils.d.ts +1 -0
  218. package/dist/utils/layer-utils.js +1 -0
  219. package/dist/utils/log.d.ts +1 -0
  220. package/dist/utils/log.js +1 -0
  221. package/dist/utils/node-boundary.d.ts +1 -0
  222. package/dist/utils/node-boundary.js +1 -0
  223. package/dist/utils/polygon-calculations.d.ts +1 -0
  224. package/dist/utils/polygon-calculations.js +1 -0
  225. package/dist/utils/rank-grid.d.ts +31 -0
  226. package/dist/utils/rank-grid.d.ts.map +1 -0
  227. package/dist/utils/rank-grid.js +307 -0
  228. package/dist/utils/rank-grid.js.map +1 -0
  229. package/package.json +7 -11
  230. package/src/_disabled/arrow-graph-data.ts.disabled +18 -0
  231. package/src/_disabled/columnar-graph-data-builder.ts.disabled +250 -0
  232. package/src/_disabled/graph-runtime-layout.ts.disabled +29 -0
  233. package/src/core/graph-engine.ts +201 -84
  234. package/src/core/graph-layout.ts +52 -29
  235. package/src/core/interaction-manager.ts +20 -20
  236. package/src/graph/arrow-graph.ts +648 -0
  237. package/src/graph/classic-graph.ts +447 -0
  238. package/src/graph/edge.ts +7 -7
  239. package/src/graph/functions/arrow-utils.ts +72 -0
  240. package/src/graph/functions/convert-arrow-graph-to-classic-graph.ts.disabled +47 -0
  241. package/src/graph/functions/convert-plain-graph-to-arrow-graph.ts.disabled +119 -0
  242. package/src/graph/functions/create-graph-from-data.ts +16 -0
  243. package/src/graph/functions/create-plain-graph-from-data.ts.disabled +176 -0
  244. package/src/graph/graph-normalization.ts +87 -0
  245. package/src/graph/graph.ts +68 -339
  246. package/src/graph/node.ts +9 -9
  247. package/src/graph/tabular-graph.ts.disabled +761 -0
  248. package/src/graph-data/arrow-graph-data-builder.ts +165 -0
  249. package/src/graph-data/graph-data-builder.ts +7 -0
  250. package/src/graph-data/graph-data.ts +57 -0
  251. package/src/graph-data/plain-graph-data-builder.ts +132 -0
  252. package/src/index.ts +53 -13
  253. package/src/layers/common-layers/flow-path-layer/flow-path-layer.ts +1 -2
  254. package/src/layers/common-layers/grid-layer/grid-layer.ts +237 -0
  255. package/src/layers/edge-attachment-helper.ts +22 -16
  256. package/src/layers/graph-layer.ts +642 -62
  257. package/src/layouts/d3-dag/collapsable-d3-dag-layout.ts +330 -0
  258. package/src/layouts/d3-dag/d3-dag-layout.ts +166 -396
  259. package/src/layouts/d3-force/d3-force-layout.ts +52 -30
  260. package/src/layouts/experimental/force-multi-graph-layout.ts +55 -49
  261. package/src/layouts/experimental/hive-plot-layout.ts +41 -42
  262. package/src/layouts/experimental/radial-layout.ts +39 -20
  263. package/src/layouts/gpu-force/gpu-force-layout.ts +72 -70
  264. package/src/layouts/simple-layout.ts +20 -44
  265. package/src/loaders/{create-graph.ts → deprecated/create-graph.ts.disabled} +6 -6
  266. package/src/loaders/deprecated/json-classic-graph-loader.ts.disabled +33 -0
  267. package/src/loaders/{simple-json-graph-loader.ts → deprecated/simple-json-graph-loader.ts.disabled} +3 -3
  268. package/src/loaders/{table-graph-loader.ts → deprecated/table-graph-loader.ts.disabled} +8 -8
  269. package/src/loaders/dot-graph-loader.ts +860 -0
  270. package/src/loaders/json-graph-loader.ts +48 -0
  271. package/src/loaders/parsers/create-graph-data.ts.disabled +45 -0
  272. package/src/loaders/{edge-parsers.ts → parsers/edge-parsers.ts} +2 -2
  273. package/src/loaders/{node-parsers.ts → parsers/node-parsers.ts} +2 -2
  274. package/src/loaders/parsers/parse-json-graph.ts +134 -0
  275. package/src/style/graph-style-engine.ts +5 -2
  276. package/src/style/{style-engine.ts → stylesheet-engine.ts} +3 -3
  277. package/src/utils/collapsed-chains.ts +11 -17
  278. package/src/utils/rank-grid.ts +426 -0
  279. package/dist/loaders/create-graph.d.ts +0 -12
  280. package/dist/loaders/create-graph.d.ts.map +0 -1
  281. package/dist/loaders/create-graph.js +0 -38
  282. package/dist/loaders/create-graph.js.map +0 -1
  283. package/dist/loaders/edge-parsers.d.ts +0 -2
  284. package/dist/loaders/edge-parsers.d.ts.map +0 -1
  285. package/dist/loaders/edge-parsers.js.map +0 -1
  286. package/dist/loaders/json-loader.d.ts +0 -7
  287. package/dist/loaders/json-loader.d.ts.map +0 -1
  288. package/dist/loaders/json-loader.js +0 -16
  289. package/dist/loaders/json-loader.js.map +0 -1
  290. package/dist/loaders/node-parsers.d.ts +0 -2
  291. package/dist/loaders/node-parsers.d.ts.map +0 -1
  292. package/dist/loaders/node-parsers.js.map +0 -1
  293. package/dist/loaders/simple-json-graph-loader.d.ts +0 -11
  294. package/dist/loaders/simple-json-graph-loader.d.ts.map +0 -1
  295. package/dist/loaders/simple-json-graph-loader.js +0 -20
  296. package/dist/loaders/simple-json-graph-loader.js.map +0 -1
  297. package/dist/loaders/table-graph-loader.d.ts +0 -16
  298. package/dist/loaders/table-graph-loader.d.ts.map +0 -1
  299. package/dist/loaders/table-graph-loader.js +0 -91
  300. package/dist/loaders/table-graph-loader.js.map +0 -1
  301. package/dist/style/style-engine.d.ts.map +0 -1
  302. package/dist/style/style-engine.js.map +0 -1
  303. package/dist/widgets/long-press-button.d.ts +0 -12
  304. package/dist/widgets/long-press-button.d.ts.map +0 -1
  305. package/dist/widgets/long-press-button.js +0 -31
  306. package/dist/widgets/long-press-button.js.map +0 -1
  307. package/dist/widgets/view-control-widget.d.ts +0 -77
  308. package/dist/widgets/view-control-widget.d.ts.map +0 -1
  309. package/dist/widgets/view-control-widget.js +0 -197
  310. package/dist/widgets/view-control-widget.js.map +0 -1
  311. package/src/loaders/json-loader.ts +0 -19
  312. package/src/widgets/long-press-button.tsx +0 -50
  313. package/src/widgets/view-control-widget.tsx +0 -339
@@ -0,0 +1,250 @@
1
+ // deck.gl-community
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ import type {NodeState, EdgeState} from '../core/constants';
6
+ import type {GraphNodeData, GraphEdgeData} from './graph-data';
7
+ import {
8
+ cloneDataColumn,
9
+ cloneRecord,
10
+ normalizeEdgeState,
11
+ normalizeNodeState,
12
+ normalizeVersion
13
+ } from '../graph/graph-normalization';
14
+
15
+ export type ColumnarGraphDataBuilderOptions = {
16
+ nodeCapacity?: number;
17
+ edgeCapacity?: number;
18
+ version?: number;
19
+ };
20
+
21
+ export interface ColumnarGraphNodeColumns {
22
+ id: (string | number)[];
23
+ state?: NodeState[];
24
+ selectable?: boolean[];
25
+ highlightConnectedEdges?: boolean[];
26
+ data?: Record<string, unknown>[];
27
+ [columnName: string]: unknown;
28
+ }
29
+
30
+ export interface ColumnarGraphEdgeColumns {
31
+ id: (string | number)[];
32
+ sourceId: (string | number)[];
33
+ targetId: (string | number)[];
34
+ directed?: boolean[];
35
+ state?: EdgeState[];
36
+ data?: Record<string, unknown>[];
37
+ [columnName: string]: unknown;
38
+ }
39
+
40
+ export interface ColumnarGraphColumns {
41
+ type?: 'columnar-graph-data';
42
+ version?: number;
43
+ nodes: ColumnarGraphNodeColumns;
44
+ edges: ColumnarGraphEdgeColumns;
45
+ }
46
+
47
+ type MutableNodeColumns = {
48
+ id: (string | number)[];
49
+ state: NodeState[];
50
+ selectable: boolean[];
51
+ highlightConnectedEdges: boolean[];
52
+ data: Record<string, unknown>[];
53
+ };
54
+
55
+ type MutableEdgeColumns = {
56
+ id: (string | number)[];
57
+ sourceId: (string | number)[];
58
+ targetId: (string | number)[];
59
+ directed: boolean[];
60
+ state: EdgeState[];
61
+ data: Record<string, unknown>[];
62
+ };
63
+
64
+ export class ColumnarGraphDataBuilder {
65
+ private nodeColumns: MutableNodeColumns;
66
+ private edgeColumns: MutableEdgeColumns;
67
+
68
+ private nodeCapacity: number;
69
+ private edgeCapacity: number;
70
+
71
+ private nodeLength = 0;
72
+ private edgeLength = 0;
73
+
74
+ private _version: number;
75
+
76
+ constructor(options: ColumnarGraphDataBuilderOptions = {}) {
77
+ this.nodeCapacity = Math.max(0, options.nodeCapacity ?? 0);
78
+ this.edgeCapacity = Math.max(0, options.edgeCapacity ?? 0);
79
+ this.nodeColumns = createMutableNodeColumns(this.nodeCapacity);
80
+ this.edgeColumns = createMutableEdgeColumns(this.edgeCapacity);
81
+ this._version = normalizeVersion(options.version);
82
+ }
83
+
84
+ get version(): number {
85
+ return this._version;
86
+ }
87
+
88
+ setVersion(version: unknown): void {
89
+ this._version = normalizeVersion(version);
90
+ }
91
+
92
+ get nodeCount(): number {
93
+ return this.nodeLength;
94
+ }
95
+
96
+ get edgeCount(): number {
97
+ return this.edgeLength;
98
+ }
99
+
100
+ addNode(node: GraphNodeData): number {
101
+ if (typeof node?.id === 'undefined') {
102
+ throw new Error('Graph node requires an "id" field.');
103
+ }
104
+
105
+ this.ensureNodeCapacity(this.nodeLength + 1);
106
+
107
+ const index = this.nodeLength++;
108
+ const attributes = cloneRecord(node.attributes);
109
+
110
+ if (typeof node.label !== 'undefined') {
111
+ attributes.label = node.label;
112
+ }
113
+
114
+ if (typeof node.weight !== 'undefined') {
115
+ attributes.weight = node.weight;
116
+ }
117
+
118
+ const stateCandidate = node.state ?? (attributes.state as NodeState | undefined);
119
+ const selectableCandidate = node.selectable ?? (attributes.selectable as boolean | undefined);
120
+ const highlightCandidate =
121
+ node.highlightConnectedEdges ?? (attributes.highlightConnectedEdges as boolean | undefined);
122
+
123
+ this.nodeColumns.id[index] = node.id;
124
+ this.nodeColumns.state[index] = normalizeNodeState(stateCandidate);
125
+ this.nodeColumns.selectable[index] = Boolean(selectableCandidate);
126
+ this.nodeColumns.highlightConnectedEdges[index] = Boolean(highlightCandidate);
127
+ this.nodeColumns.data[index] = attributes;
128
+
129
+ return index;
130
+ }
131
+
132
+ addEdge(edge: GraphEdgeData): number {
133
+ if (
134
+ typeof edge?.id === 'undefined' ||
135
+ typeof edge?.sourceId === 'undefined' ||
136
+ typeof edge?.targetId === 'undefined'
137
+ ) {
138
+ throw new Error('Graph edge requires "id", "sourceId", and "targetId" fields.');
139
+ }
140
+
141
+ this.ensureEdgeCapacity(this.edgeLength + 1);
142
+
143
+ const index = this.edgeLength++;
144
+ const attributes = cloneRecord(edge.attributes);
145
+
146
+ if (typeof edge.label !== 'undefined') {
147
+ attributes.label = edge.label;
148
+ }
149
+
150
+ if (typeof edge.weight !== 'undefined') {
151
+ attributes.weight = edge.weight;
152
+ }
153
+
154
+ const stateCandidate = edge.state ?? (attributes.state as EdgeState | undefined);
155
+ const directedCandidate = edge.directed ?? (attributes.directed as boolean | undefined);
156
+
157
+ this.edgeColumns.id[index] = edge.id;
158
+ this.edgeColumns.sourceId[index] = edge.sourceId;
159
+ this.edgeColumns.targetId[index] = edge.targetId;
160
+ this.edgeColumns.directed[index] = Boolean(directedCandidate);
161
+ this.edgeColumns.state[index] = normalizeEdgeState(stateCandidate);
162
+ this.edgeColumns.data[index] = attributes;
163
+
164
+ return index;
165
+ }
166
+
167
+ build(): ColumnarGraphColumns {
168
+ return {
169
+ type: 'columnar-graph-data',
170
+ version: this._version,
171
+ nodes: {
172
+ id: this.nodeColumns.id.slice(0, this.nodeLength),
173
+ state: this.nodeColumns.state.slice(0, this.nodeLength),
174
+ selectable: this.nodeColumns.selectable.slice(0, this.nodeLength),
175
+ highlightConnectedEdges: this.nodeColumns.highlightConnectedEdges.slice(0, this.nodeLength),
176
+ data: cloneDataColumn(this.nodeColumns.data, this.nodeLength)
177
+ },
178
+ edges: {
179
+ id: this.edgeColumns.id.slice(0, this.edgeLength),
180
+ sourceId: this.edgeColumns.sourceId.slice(0, this.edgeLength),
181
+ targetId: this.edgeColumns.targetId.slice(0, this.edgeLength),
182
+ directed: this.edgeColumns.directed.slice(0, this.edgeLength),
183
+ state: this.edgeColumns.state.slice(0, this.edgeLength),
184
+ data: cloneDataColumn(this.edgeColumns.data, this.edgeLength)
185
+ }
186
+ };
187
+ }
188
+
189
+ private ensureNodeCapacity(minCapacity: number): void {
190
+ if (this.nodeCapacity >= minCapacity) {
191
+ return;
192
+ }
193
+
194
+ const nextCapacity = Math.max(8, this.nodeCapacity * 2, minCapacity);
195
+ const nextColumns = createMutableNodeColumns(nextCapacity);
196
+
197
+ for (let i = 0; i < this.nodeLength; i++) {
198
+ nextColumns.id[i] = this.nodeColumns.id[i];
199
+ nextColumns.state[i] = this.nodeColumns.state[i];
200
+ nextColumns.selectable[i] = this.nodeColumns.selectable[i];
201
+ nextColumns.highlightConnectedEdges[i] = this.nodeColumns.highlightConnectedEdges[i];
202
+ nextColumns.data[i] = this.nodeColumns.data[i];
203
+ }
204
+
205
+ this.nodeColumns = nextColumns;
206
+ this.nodeCapacity = nextCapacity;
207
+ }
208
+
209
+ private ensureEdgeCapacity(minCapacity: number): void {
210
+ if (this.edgeCapacity >= minCapacity) {
211
+ return;
212
+ }
213
+
214
+ const nextCapacity = Math.max(8, this.edgeCapacity * 2, minCapacity);
215
+ const nextColumns = createMutableEdgeColumns(nextCapacity);
216
+
217
+ for (let i = 0; i < this.edgeLength; i++) {
218
+ nextColumns.id[i] = this.edgeColumns.id[i];
219
+ nextColumns.sourceId[i] = this.edgeColumns.sourceId[i];
220
+ nextColumns.targetId[i] = this.edgeColumns.targetId[i];
221
+ nextColumns.directed[i] = this.edgeColumns.directed[i];
222
+ nextColumns.state[i] = this.edgeColumns.state[i];
223
+ nextColumns.data[i] = this.edgeColumns.data[i];
224
+ }
225
+
226
+ this.edgeColumns = nextColumns;
227
+ this.edgeCapacity = nextCapacity;
228
+ }
229
+ }
230
+
231
+ function createMutableNodeColumns(capacity: number): MutableNodeColumns {
232
+ return {
233
+ id: new Array<string | number>(capacity),
234
+ state: new Array<NodeState>(capacity),
235
+ selectable: new Array<boolean>(capacity),
236
+ highlightConnectedEdges: new Array<boolean>(capacity),
237
+ data: new Array<Record<string, unknown>>(capacity)
238
+ };
239
+ }
240
+
241
+ function createMutableEdgeColumns(capacity: number): MutableEdgeColumns {
242
+ return {
243
+ id: new Array<string | number>(capacity),
244
+ sourceId: new Array<string | number>(capacity),
245
+ targetId: new Array<string | number>(capacity),
246
+ directed: new Array<boolean>(capacity),
247
+ state: new Array<EdgeState>(capacity),
248
+ data: new Array<Record<string, unknown>>(capacity)
249
+ };
250
+ }
@@ -0,0 +1,29 @@
1
+ // deck.gl-community
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ import type {Bounds2D} from '@math.gl/types';
6
+
7
+ import type {GraphLayoutProps, GraphLayoutState} from './graph-layout';
8
+ import type {EdgeInterface, Graph, NodeInterface} from '../graph/graph';
9
+
10
+ export interface GraphRuntimeLayout {
11
+ readonly version: number;
12
+ readonly state: GraphLayoutState;
13
+ getProps(): GraphLayoutProps;
14
+ setProps(props: Partial<GraphLayoutProps>): void;
15
+ initializeGraph(graph: Graph): void;
16
+ updateGraph(graph: Graph): void;
17
+ start(): void;
18
+ update(): void;
19
+ resume(): void;
20
+ stop(): void;
21
+ getBounds(): Bounds2D | null;
22
+ getNodePosition(node: NodeInterface): [number, number] | null | undefined;
23
+ getEdgePosition(edge: EdgeInterface): unknown;
24
+ lockNodePosition(node: NodeInterface, x: number, y: number): void;
25
+ unlockNodePosition(node: NodeInterface): void;
26
+ destroy?(): void;
27
+ }
28
+
29
+ export type TabularGraphLayout = GraphRuntimeLayout;
@@ -4,67 +4,125 @@
4
4
 
5
5
  import type {Bounds2D} from '@math.gl/types';
6
6
 
7
- import type {Node} from '../graph/node';
8
- import {Edge} from '../graph/edge';
9
- import {Graph} from '../graph/graph';
7
+ import type {Graph, EdgeInterface, NodeInterface} from '../graph/graph';
8
+ import {ClassicGraph} from '../graph/classic-graph';
10
9
  import {GraphLayout, type GraphLayoutEventDetail} from './graph-layout';
11
10
  import {Cache} from './cache';
12
11
  import {log} from '../utils/log';
12
+ import {GraphStylesheetEngine, type GraphStylesheet} from '../style/graph-style-engine';
13
13
 
14
- export type GraphEngineProps = {
14
+ type ClassicGraphEngineProps = {
15
+ graph: ClassicGraph;
16
+ layout: GraphLayout;
17
+ onLayoutStart?: (detail?: GraphLayoutEventDetail) => void;
18
+ onLayoutChange?: (detail?: GraphLayoutEventDetail) => void;
19
+ onLayoutDone?: (detail?: GraphLayoutEventDetail) => void;
20
+ onLayoutError?: (error?: unknown) => void;
21
+ onTransactionStart?: () => void;
22
+ onTransactionEnd?: () => void;
23
+ onNodeAdded?: (node: NodeInterface) => void;
24
+ onNodeRemoved?: (node: NodeInterface) => void;
25
+ onNodeUpdated?: (node: NodeInterface) => void;
26
+ onEdgeAdded?: (edge: EdgeInterface) => void;
27
+ onEdgeRemoved?: (edge: EdgeInterface) => void;
28
+ onEdgeUpdated?: (edge: EdgeInterface) => void;
29
+ };
30
+
31
+ type InterfaceGraphEngineProps = {
15
32
  graph: Graph;
16
33
  layout: GraphLayout;
34
+ onLayoutStart?: (detail?: GraphLayoutEventDetail) => void;
35
+ onLayoutChange?: (detail?: GraphLayoutEventDetail) => void;
36
+ onLayoutDone?: (detail?: GraphLayoutEventDetail) => void;
37
+ onLayoutError?: (error?: unknown) => void;
38
+ onTransactionStart?: () => void;
39
+ onTransactionEnd?: () => void;
40
+ onNodeAdded?: (node: NodeInterface) => void;
41
+ onNodeRemoved?: (node: NodeInterface) => void;
42
+ onNodeUpdated?: (node: NodeInterface) => void;
43
+ onEdgeAdded?: (edge: EdgeInterface) => void;
44
+ onEdgeRemoved?: (edge: EdgeInterface) => void;
45
+ onEdgeUpdated?: (edge: EdgeInterface) => void;
17
46
  };
18
47
 
19
- /** Graph engine controls the graph data and layout calculation */
20
- export class GraphEngine extends EventTarget {
21
- props: Readonly<Required<GraphEngineProps>>;
48
+ export type GraphEngineProps = ClassicGraphEngineProps | InterfaceGraphEngineProps;
22
49
 
50
+ /** Graph engine controls the graph data and layout calculation */
51
+ export class GraphEngine {
52
+ private _props: GraphEngineProps;
23
53
  private readonly _graph: Graph;
24
54
  private readonly _layout: GraphLayout;
25
- private readonly _cache = new Cache<'nodes' | 'edges', Node[] | Edge[]>();
55
+ private readonly _cache = new Cache<'nodes' | 'edges', NodeInterface[] | EdgeInterface[]>();
26
56
  private _layoutDirty = false;
27
57
  private _transactionInProgress = false;
58
+ private _graphCallbacksAttached = false;
59
+ private _layoutCallbacksAttached = false;
28
60
 
29
61
  constructor(props: GraphEngineProps);
30
62
  /** @deprecated Use props constructor: new GraphEngine(props) */
31
- constructor(graph: Graph, layout: GraphLayout);
32
-
33
- constructor(props: GraphEngineProps | Graph, layout?: GraphLayout) {
34
- super();
35
- if (props instanceof Graph) {
36
- props = {
37
- graph: props,
38
- layout
39
- };
63
+ constructor(graph: ClassicGraph, layout: GraphLayout);
64
+
65
+ constructor(props: GraphEngineProps | ClassicGraph, layout?: GraphLayout) {
66
+ let normalizedProps: GraphEngineProps;
67
+ if (props instanceof ClassicGraph) {
68
+ if (!(layout instanceof GraphLayout)) {
69
+ throw new Error('GraphEngine: legacy graphs require a GraphLayout instance.');
70
+ }
71
+ normalizedProps = {graph: props, layout};
72
+ } else {
73
+ normalizedProps = props;
40
74
  }
41
75
 
42
- this.props = props;
43
- this._graph = props.graph;
44
- this._layout = props.layout;
76
+ this._props = {...normalizedProps};
77
+
78
+ this._graph = normalizedProps.graph;
79
+ this._layout = normalizedProps.layout;
80
+ }
81
+
82
+ get props(): GraphEngineProps {
83
+ return {...this._props};
84
+ }
85
+
86
+ setProps(props: Partial<Omit<GraphEngineProps, 'graph' | 'layout'>>): void {
87
+ this._props = {
88
+ ...this._props,
89
+ ...props,
90
+ graph: this._props.graph,
91
+ layout: this._props.layout
92
+ } as GraphEngineProps;
45
93
  }
46
94
 
47
95
  /** Getters */
48
96
 
49
- getNodes = (): Node[] => {
97
+ getNodes = (): NodeInterface[] => {
50
98
  this._updateCache('nodes', () =>
51
- this._graph.getNodes().filter((node) => this.getNodePosition(node))
99
+ Array.from(this._graph.getNodes()).filter((node) => {
100
+ const position = this.getNodePosition(node);
101
+ return position !== null && position !== undefined;
102
+ })
52
103
  );
53
104
 
54
- return this._cache.get('nodes') as Node[];
105
+ return (this._cache.get('nodes') as NodeInterface[]) ?? [];
55
106
  };
56
107
 
57
108
  getEdges = () => {
58
109
  this._updateCache('edges', () =>
59
- this._graph.getEdges().filter((edge) => this.getEdgePosition(edge))
110
+ Array.from(this._graph.getEdges()).filter((edge) => {
111
+ const layout = this.getEdgePosition(edge);
112
+ return layout !== null && layout !== undefined;
113
+ })
60
114
  );
61
115
 
62
- return this._cache.get('edges') as Edge[];
116
+ return (this._cache.get('edges') as EdgeInterface[]) ?? [];
63
117
  };
64
118
 
65
- getNodePosition = (node: Node) => this._layout.getNodePosition(node);
119
+ getNodePosition = (node: NodeInterface) => {
120
+ return this._layout.getNodePosition(node) ?? null;
121
+ };
66
122
 
67
- getEdgePosition = (edge: Edge) => this._layout.getEdgePosition(edge);
123
+ getEdgePosition = (edge: EdgeInterface) => {
124
+ return this._layout.getEdgePosition(edge) ?? null;
125
+ };
68
126
 
69
127
  getGraphVersion = () => this._graph.version;
70
128
 
@@ -72,77 +130,74 @@ export class GraphEngine extends EventTarget {
72
130
 
73
131
  getLayoutState = () => this._layout.state;
74
132
 
75
- getLayoutBounds = (): Bounds2D | null => this._layout.getBounds();
133
+ getLayoutBounds = (): Bounds2D | null => this._layout.getBounds() ?? null;
76
134
 
77
135
  /** Operations on the graph */
78
136
 
79
- lockNodePosition = (node, x, y) => this._layout.lockNodePosition(node, x, y);
137
+ lockNodePosition = (node: NodeInterface, x: number, y: number) => {
138
+ this._layout.lockNodePosition(node, x, y);
139
+ };
140
+
141
+ unlockNodePosition = (node: NodeInterface) => {
142
+ this._layout.unlockNodePosition(node);
143
+ };
144
+
145
+ findNode(nodeId: string | number): NodeInterface | undefined {
146
+ return this._graph.findNode?.(nodeId) ?? this._graph.findNodeById?.(nodeId);
147
+ }
80
148
 
81
- unlockNodePosition = (node) => this._layout.unlockNodePosition(node);
149
+ createStylesheetEngine(
150
+ style: GraphStylesheet,
151
+ options: {stateUpdateTrigger?: unknown} = {}
152
+ ): GraphStylesheetEngine {
153
+ return new GraphStylesheetEngine(style, options);
154
+ }
82
155
 
83
156
  /**
84
157
  * @fires GraphEngine#onLayoutStart
85
158
  */
86
- _onLayoutStart = (event: Event) => {
159
+ _onLayoutStart = (detail?: GraphLayoutEventDetail) => {
87
160
  log.log(0, 'GraphEngine: layout start')();
88
- const detail = event instanceof CustomEvent ? (event.detail as GraphLayoutEventDetail) : undefined;
89
- /**
90
- * @event GraphEngine#onLayoutStart
91
- * @type {CustomEvent}
92
- */
93
- this.dispatchEvent(new CustomEvent('onLayoutStart', {detail}));
161
+ this._props.onLayoutStart?.(detail);
94
162
  };
95
163
 
96
164
  /**
97
165
  * @fires GraphEngine#onLayoutChange
98
166
  */
99
- _onLayoutChange = (event: Event) => {
167
+ _onLayoutChange = (detail?: GraphLayoutEventDetail) => {
100
168
  log.log(0, 'GraphEngine: layout update event')();
101
- const detail = event instanceof CustomEvent ? (event.detail as GraphLayoutEventDetail) : undefined;
102
- /**
103
- * @event GraphEngine#onLayoutChange
104
- * @type {CustomEvent}
105
- */
106
- this.dispatchEvent(new CustomEvent('onLayoutChange', {detail}));
169
+ this._props.onLayoutChange?.(detail);
107
170
  };
108
171
 
109
172
  /**
110
173
  * @fires GraphEngine#onLayoutDone
111
174
  */
112
- _onLayoutDone = (event: Event) => {
175
+ _onLayoutDone = (detail?: GraphLayoutEventDetail) => {
113
176
  log.log(0, 'GraphEngine: layout end')();
114
- const detail = event instanceof CustomEvent ? (event.detail as GraphLayoutEventDetail) : undefined;
115
- /**
116
- * @event GraphEngine#onLayoutDone
117
- * @type {CustomEvent}
118
- */
119
- this.dispatchEvent(new CustomEvent('onLayoutDone', {detail}));
177
+ this._props.onLayoutDone?.(detail);
120
178
  };
121
179
 
122
180
  /**
123
181
  * @fires GraphEngine#onLayoutError
124
182
  */
125
- _onLayoutError = (event: Event) => {
126
- const detail = event instanceof CustomEvent ? event.detail : undefined;
127
- /**
128
- * @event GraphEngine#onLayoutError
129
- * @type {CustomEvent}
130
- */
131
- this.dispatchEvent(new CustomEvent('onLayoutError', {detail}));
183
+ _onLayoutError = (error?: unknown) => {
184
+ this._props.onLayoutError?.(error);
132
185
  };
133
186
 
134
- _onGraphStructureChanged = (entity) => {
187
+ _onGraphStructureChanged = () => {
135
188
  this._layoutDirty = true;
136
189
  this._graphChanged();
137
190
  };
138
191
 
139
192
  _onTransactionStart = () => {
140
193
  this._transactionInProgress = true;
194
+ this._props.onTransactionStart?.();
141
195
  };
142
196
 
143
197
  _onTransactionEnd = () => {
144
198
  this._transactionInProgress = false;
145
199
  this._graphChanged();
200
+ this._props.onTransactionEnd?.();
146
201
  };
147
202
 
148
203
  /** Layout calculations */
@@ -151,17 +206,8 @@ export class GraphEngine extends EventTarget {
151
206
  log.log(1, 'GraphEngine: run');
152
207
  // TODO: throw if running on a cleared engine
153
208
 
154
- this._graph.addEventListener('transactionStart', this._onTransactionStart);
155
- this._graph.addEventListener('transactionEnd', this._onTransactionEnd);
156
- this._graph.addEventListener('onNodeAdded', this._onGraphStructureChanged);
157
- this._graph.addEventListener('onNodeRemoved', this._onGraphStructureChanged);
158
- this._graph.addEventListener('onEdgeAdded', this._onGraphStructureChanged);
159
- this._graph.addEventListener('onEdgeRemoved', this._onGraphStructureChanged);
160
-
161
- this._layout.addEventListener('onLayoutStart', this._onLayoutStart);
162
- this._layout.addEventListener('onLayoutChange', this._onLayoutChange);
163
- this._layout.addEventListener('onLayoutDone', this._onLayoutDone);
164
- this._layout.addEventListener('onLayoutError', this._onLayoutError);
209
+ this._attachGraphCallbacks();
210
+ this._attachLayoutCallbacks();
165
211
 
166
212
  this._layout.initializeGraph(this._graph);
167
213
  this._layout.start();
@@ -169,22 +215,17 @@ export class GraphEngine extends EventTarget {
169
215
 
170
216
  clear = () => {
171
217
  log.log(1, 'GraphEngine: end');
172
- this._graph.removeEventListener('transactionStart', this._onTransactionStart);
173
- this._graph.removeEventListener('transactionEnd', this._onTransactionEnd);
174
- this._graph.removeEventListener('onNodeAdded', this._onGraphStructureChanged);
175
- this._graph.removeEventListener('onNodeRemoved', this._onGraphStructureChanged);
176
- this._graph.removeEventListener('onEdgeAdded', this._onGraphStructureChanged);
177
- this._graph.removeEventListener('onEdgeRemoved', this._onGraphStructureChanged);
178
-
179
- this._layout.removeEventListener('onLayoutStart', this._onLayoutStart);
180
- this._layout.removeEventListener('onLayoutChange', this._onLayoutChange);
181
- this._layout.removeEventListener('onLayoutDone', this._onLayoutDone);
182
- this._layout.removeEventListener('onLayoutError', this._onLayoutError);
218
+ this._detachGraphCallbacks();
219
+ this._detachLayoutCallbacks();
183
220
  };
184
221
 
185
- resume = () => this._layout.resume();
222
+ resume = () => {
223
+ this._layout.resume();
224
+ };
186
225
 
187
- stop = () => this._layout.stop();
226
+ stop = () => {
227
+ this._layout.stop();
228
+ };
188
229
 
189
230
  _graphChanged = () => {
190
231
  if (this._layoutDirty && !this._transactionInProgress) {
@@ -200,6 +241,82 @@ export class GraphEngine extends EventTarget {
200
241
  };
201
242
 
202
243
  _updateCache(key, updateValue) {
203
- this._cache.set(key, updateValue, this._graph.version + this._layout.version);
244
+ this._cache.set(key, updateValue, this.getGraphVersion() + this.getLayoutLastUpdate());
245
+ }
246
+
247
+ private _attachGraphCallbacks() {
248
+ if (this._graphCallbacksAttached) {
249
+ return;
250
+ }
251
+ this._graph.updateProps({
252
+ onTransactionStart: this._onTransactionStart,
253
+ onTransactionEnd: this._onTransactionEnd,
254
+ onNodeAdded: (node) => {
255
+ this._onGraphStructureChanged();
256
+ this._props.onNodeAdded?.(node);
257
+ },
258
+ onNodeRemoved: (node) => {
259
+ this._onGraphStructureChanged();
260
+ this._props.onNodeRemoved?.(node);
261
+ },
262
+ onNodeUpdated: (node) => {
263
+ this._props.onNodeUpdated?.(node);
264
+ },
265
+ onEdgeAdded: (edge) => {
266
+ this._onGraphStructureChanged();
267
+ this._props.onEdgeAdded?.(edge);
268
+ },
269
+ onEdgeRemoved: (edge) => {
270
+ this._onGraphStructureChanged();
271
+ this._props.onEdgeRemoved?.(edge);
272
+ },
273
+ onEdgeUpdated: (edge) => {
274
+ this._props.onEdgeUpdated?.(edge);
275
+ }
276
+ });
277
+ this._graphCallbacksAttached = true;
278
+ }
279
+
280
+ private _detachGraphCallbacks() {
281
+ if (!this._graphCallbacksAttached) {
282
+ return;
283
+ }
284
+ this._graph.updateProps({
285
+ onTransactionStart: undefined,
286
+ onTransactionEnd: undefined,
287
+ onNodeAdded: undefined,
288
+ onNodeRemoved: undefined,
289
+ onNodeUpdated: undefined,
290
+ onEdgeAdded: undefined,
291
+ onEdgeRemoved: undefined,
292
+ onEdgeUpdated: undefined
293
+ });
294
+ this._graphCallbacksAttached = false;
295
+ }
296
+
297
+ private _attachLayoutCallbacks() {
298
+ if (this._layoutCallbacksAttached) {
299
+ return;
300
+ }
301
+ this._layout.setProps({
302
+ onLayoutStart: this._onLayoutStart,
303
+ onLayoutChange: this._onLayoutChange,
304
+ onLayoutDone: this._onLayoutDone,
305
+ onLayoutError: this._onLayoutError
306
+ });
307
+ this._layoutCallbacksAttached = true;
308
+ }
309
+
310
+ private _detachLayoutCallbacks() {
311
+ if (!this._layoutCallbacksAttached) {
312
+ return;
313
+ }
314
+ this._layout.setProps({
315
+ onLayoutStart: undefined,
316
+ onLayoutChange: undefined,
317
+ onLayoutDone: undefined,
318
+ onLayoutError: undefined
319
+ });
320
+ this._layoutCallbacksAttached = false;
204
321
  }
205
322
  }