@deck.gl-community/graph-layers 9.1.1 → 9.2.0-beta.3

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 (354) hide show
  1. package/dist/_deprecated/old-constants.d.ts +107 -0
  2. package/dist/_deprecated/old-constants.d.ts.map +1 -0
  3. package/dist/_deprecated/old-constants.js +111 -0
  4. package/dist/_deprecated/old-constants.js.map +1 -0
  5. package/dist/core/cache.d.ts +0 -1
  6. package/dist/core/cache.js +0 -1
  7. package/dist/core/constants.d.ts +12 -100
  8. package/dist/core/constants.d.ts.map +1 -1
  9. package/dist/core/constants.js +3 -44
  10. package/dist/core/constants.js.map +1 -1
  11. package/dist/core/graph-engine.d.ts +63 -20
  12. package/dist/core/graph-engine.d.ts.map +1 -1
  13. package/dist/core/graph-engine.js +163 -72
  14. package/dist/core/graph-engine.js.map +1 -1
  15. package/dist/core/graph-layout.d.ts +63 -32
  16. package/dist/core/graph-layout.d.ts.map +1 -1
  17. package/dist/core/graph-layout.js +118 -36
  18. package/dist/core/graph-layout.js.map +1 -1
  19. package/dist/core/interaction-manager.d.ts +7 -5
  20. package/dist/core/interaction-manager.d.ts.map +1 -1
  21. package/dist/core/interaction-manager.js +64 -20
  22. package/dist/core/interaction-manager.js.map +1 -1
  23. package/dist/graph/arrow-graph.d.ts +69 -0
  24. package/dist/graph/arrow-graph.d.ts.map +1 -0
  25. package/dist/graph/arrow-graph.js +513 -0
  26. package/dist/graph/arrow-graph.js.map +1 -0
  27. package/dist/graph/classic-graph.d.ts +169 -0
  28. package/dist/graph/classic-graph.d.ts.map +1 -0
  29. package/dist/graph/classic-graph.js +390 -0
  30. package/dist/graph/classic-graph.js.map +1 -0
  31. package/dist/graph/edge.d.ts +12 -12
  32. package/dist/graph/edge.d.ts.map +1 -1
  33. package/dist/graph/edge.js +3 -6
  34. package/dist/graph/edge.js.map +1 -1
  35. package/dist/graph/functions/arrow-utils.d.ts +6 -0
  36. package/dist/graph/functions/arrow-utils.d.ts.map +1 -0
  37. package/dist/graph/functions/arrow-utils.js +67 -0
  38. package/dist/graph/functions/arrow-utils.js.map +1 -0
  39. package/dist/graph/functions/create-graph-from-data.d.ts +3 -0
  40. package/dist/graph/functions/create-graph-from-data.d.ts.map +1 -0
  41. package/dist/graph/functions/create-graph-from-data.js +12 -0
  42. package/dist/graph/functions/create-graph-from-data.js.map +1 -0
  43. package/dist/graph/graph-normalization.d.ts +10 -0
  44. package/dist/graph/graph-normalization.d.ts.map +1 -0
  45. package/dist/graph/graph-normalization.js +65 -0
  46. package/dist/graph/graph-normalization.js.map +1 -0
  47. package/dist/graph/graph.d.ts +62 -156
  48. package/dist/graph/graph.d.ts.map +1 -1
  49. package/dist/graph/graph.js +11 -301
  50. package/dist/graph/graph.js.map +1 -1
  51. package/dist/graph/node.d.ts +12 -13
  52. package/dist/graph/node.d.ts.map +1 -1
  53. package/dist/graph/node.js +5 -7
  54. package/dist/graph/node.js.map +1 -1
  55. package/dist/graph-data/arrow-graph-data-builder.d.ts +21 -0
  56. package/dist/graph-data/arrow-graph-data-builder.d.ts.map +1 -0
  57. package/dist/graph-data/arrow-graph-data-builder.js +105 -0
  58. package/dist/graph-data/arrow-graph-data-builder.js.map +1 -0
  59. package/dist/graph-data/graph-data-builder.d.ts +6 -0
  60. package/dist/graph-data/graph-data-builder.d.ts.map +1 -0
  61. package/dist/graph-data/graph-data-builder.js +1 -0
  62. package/dist/graph-data/graph-data-builder.js.map +1 -0
  63. package/dist/graph-data/graph-data.d.ts +40 -0
  64. package/dist/graph-data/graph-data.d.ts.map +1 -0
  65. package/dist/graph-data/graph-data.js +11 -0
  66. package/dist/graph-data/graph-data.js.map +1 -0
  67. package/dist/graph-data/plain-graph-data-builder.d.ts +20 -0
  68. package/dist/graph-data/plain-graph-data-builder.d.ts.map +1 -0
  69. package/dist/graph-data/plain-graph-data-builder.js +105 -0
  70. package/dist/graph-data/plain-graph-data-builder.js.map +1 -0
  71. package/dist/graph-style-schema.cdn.d.ts +2 -0
  72. package/dist/graph-style-schema.cdn.js +2 -0
  73. package/dist/graph-style-schema.json +12 -0
  74. package/dist/index.cjs +7851 -3250
  75. package/dist/index.cjs.map +4 -4
  76. package/dist/index.d.ts +35 -22
  77. package/dist/index.d.ts.map +1 -1
  78. package/dist/index.js +42 -25
  79. package/dist/index.js.map +1 -1
  80. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-fragment.glsl.d.ts +0 -1
  81. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-fragment.glsl.js +0 -1
  82. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex-tf.glsl.d.ts +0 -1
  83. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex-tf.glsl.js +0 -1
  84. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex.glsl.d.ts +0 -1
  85. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex.glsl.js +0 -1
  86. package/dist/layers/common-layers/flow-path-layer/flow-path-layer.d.ts +0 -1
  87. package/dist/layers/common-layers/flow-path-layer/flow-path-layer.d.ts.map +1 -1
  88. package/dist/layers/common-layers/flow-path-layer/flow-path-layer.js +1 -3
  89. package/dist/layers/common-layers/flow-path-layer/flow-path-layer.js.map +1 -1
  90. package/dist/layers/common-layers/grid-layer/grid-layer.d.ts +83 -0
  91. package/dist/layers/common-layers/grid-layer/grid-layer.d.ts.map +1 -0
  92. package/dist/layers/common-layers/grid-layer/grid-layer.js +133 -0
  93. package/dist/layers/common-layers/grid-layer/grid-layer.js.map +1 -0
  94. package/dist/layers/common-layers/marker-layer/atlas-data-url.d.ts +0 -1
  95. package/dist/layers/common-layers/marker-layer/atlas-data-url.js +0 -1
  96. package/dist/layers/common-layers/marker-layer/marker-layer.d.ts +0 -1
  97. package/dist/layers/common-layers/marker-layer/marker-layer.js +2 -3
  98. package/dist/layers/common-layers/marker-layer/marker-list.d.ts +2 -63
  99. package/dist/layers/common-layers/marker-layer/marker-list.d.ts.map +1 -1
  100. package/dist/layers/common-layers/marker-layer/marker-list.js +1 -65
  101. package/dist/layers/common-layers/marker-layer/marker-list.js.map +1 -1
  102. package/dist/layers/common-layers/marker-layer/marker-mapping.d.ts +0 -1
  103. package/dist/layers/common-layers/marker-layer/marker-mapping.js +0 -1
  104. package/dist/layers/common-layers/spline-layer/spline-layer.d.ts +0 -1
  105. package/dist/layers/common-layers/spline-layer/spline-layer.js +0 -1
  106. package/dist/layers/common-layers/zoomable-text-layer/zoomable-text-layer.d.ts +0 -1
  107. package/dist/layers/common-layers/zoomable-text-layer/zoomable-text-layer.js +0 -1
  108. package/dist/layers/edge-attachment-helper.d.ts +15 -0
  109. package/dist/layers/edge-attachment-helper.d.ts.map +1 -0
  110. package/dist/layers/edge-attachment-helper.js +229 -0
  111. package/dist/layers/edge-attachment-helper.js.map +1 -0
  112. package/dist/layers/edge-layer.d.ts +1 -5
  113. package/dist/layers/edge-layer.d.ts.map +1 -1
  114. package/dist/layers/edge-layer.js +9 -11
  115. package/dist/layers/edge-layer.js.map +1 -1
  116. package/dist/layers/edge-layers/arrow-2d-geometry.d.ts +4 -0
  117. package/dist/layers/edge-layers/arrow-2d-geometry.d.ts.map +1 -0
  118. package/dist/layers/edge-layers/arrow-2d-geometry.js +42 -0
  119. package/dist/layers/edge-layers/arrow-2d-geometry.js.map +1 -0
  120. package/dist/layers/edge-layers/curved-edge-layer.d.ts +1 -2
  121. package/dist/layers/edge-layers/curved-edge-layer.js +1 -2
  122. package/dist/layers/edge-layers/edge-arrow-layer.d.ts +21 -0
  123. package/dist/layers/edge-layers/edge-arrow-layer.d.ts.map +1 -0
  124. package/dist/layers/edge-layers/edge-arrow-layer.js +131 -0
  125. package/dist/layers/edge-layers/edge-arrow-layer.js.map +1 -0
  126. package/dist/layers/edge-layers/edge-label-layer.d.ts +1 -2
  127. package/dist/layers/edge-layers/edge-label-layer.js +1 -2
  128. package/dist/layers/edge-layers/flow-layer.d.ts +1 -2
  129. package/dist/layers/edge-layers/flow-layer.js +1 -2
  130. package/dist/layers/edge-layers/path-edge-layer.d.ts +0 -1
  131. package/dist/layers/edge-layers/path-edge-layer.js +0 -1
  132. package/dist/layers/edge-layers/straight-line-edge-layer.d.ts +0 -1
  133. package/dist/layers/edge-layers/straight-line-edge-layer.js +0 -1
  134. package/dist/layers/graph-layer.d.ts +85 -29
  135. package/dist/layers/graph-layer.d.ts.map +1 -1
  136. package/dist/layers/graph-layer.js +635 -94
  137. package/dist/layers/graph-layer.js.map +1 -1
  138. package/dist/layers/node-layers/circle-layer.d.ts +0 -1
  139. package/dist/layers/node-layers/circle-layer.js +0 -1
  140. package/dist/layers/node-layers/image-layer.d.ts +0 -1
  141. package/dist/layers/node-layers/image-layer.js +0 -1
  142. package/dist/layers/node-layers/label-layer.d.ts +1 -2
  143. package/dist/layers/node-layers/label-layer.js +1 -2
  144. package/dist/layers/node-layers/path-rounded-rectangle-layer.d.ts +0 -1
  145. package/dist/layers/node-layers/path-rounded-rectangle-layer.js +1 -2
  146. package/dist/layers/node-layers/rectangle-layer.d.ts +0 -1
  147. package/dist/layers/node-layers/rectangle-layer.js +0 -1
  148. package/dist/layers/node-layers/rounded-rectangle-layer-fragment.d.ts +0 -1
  149. package/dist/layers/node-layers/rounded-rectangle-layer-fragment.js +0 -1
  150. package/dist/layers/node-layers/rounded-rectangle-layer.d.ts +1 -2
  151. package/dist/layers/node-layers/rounded-rectangle-layer.js +2 -3
  152. package/dist/layers/node-layers/zoomable-marker-layer.d.ts +1 -2
  153. package/dist/layers/node-layers/zoomable-marker-layer.js +1 -2
  154. package/dist/layouts/d3-dag/collapsable-d3-dag-layout.d.ts +24 -0
  155. package/dist/layouts/d3-dag/collapsable-d3-dag-layout.d.ts.map +1 -0
  156. package/dist/layouts/d3-dag/collapsable-d3-dag-layout.js +251 -0
  157. package/dist/layouts/d3-dag/collapsable-d3-dag-layout.js.map +1 -0
  158. package/dist/layouts/d3-dag/d3-dag-layout.d.ts +102 -0
  159. package/dist/layouts/d3-dag/d3-dag-layout.d.ts.map +1 -0
  160. package/dist/layouts/d3-dag/d3-dag-layout.js +531 -0
  161. package/dist/layouts/d3-dag/d3-dag-layout.js.map +1 -0
  162. package/dist/layouts/d3-force/d3-force-layout.d.ts +23 -11
  163. package/dist/layouts/d3-force/d3-force-layout.d.ts.map +1 -1
  164. package/dist/layouts/d3-force/d3-force-layout.js +63 -29
  165. package/dist/layouts/d3-force/d3-force-layout.js.map +1 -1
  166. package/dist/layouts/d3-force/worker.d.ts +0 -1
  167. package/dist/layouts/d3-force/worker.js +0 -1
  168. package/dist/layouts/experimental/force-multi-graph-layout.d.ts +25 -20
  169. package/dist/layouts/experimental/force-multi-graph-layout.d.ts.map +1 -1
  170. package/dist/layouts/experimental/force-multi-graph-layout.js +60 -47
  171. package/dist/layouts/experimental/force-multi-graph-layout.js.map +1 -1
  172. package/dist/layouts/experimental/hive-plot-layout.d.ts +26 -20
  173. package/dist/layouts/experimental/hive-plot-layout.d.ts.map +1 -1
  174. package/dist/layouts/experimental/hive-plot-layout.js +43 -39
  175. package/dist/layouts/experimental/hive-plot-layout.js.map +1 -1
  176. package/dist/layouts/experimental/radial-layout.d.ts +20 -12
  177. package/dist/layouts/experimental/radial-layout.d.ts.map +1 -1
  178. package/dist/layouts/experimental/radial-layout.js +41 -19
  179. package/dist/layouts/experimental/radial-layout.js.map +1 -1
  180. package/dist/layouts/gpu-force/gpu-force-layout.d.ts +15 -12
  181. package/dist/layouts/gpu-force/gpu-force-layout.d.ts.map +1 -1
  182. package/dist/layouts/gpu-force/gpu-force-layout.js +71 -59
  183. package/dist/layouts/gpu-force/gpu-force-layout.js.map +1 -1
  184. package/dist/layouts/gpu-force/worker.d.ts +0 -1
  185. package/dist/layouts/gpu-force/worker.js +0 -1
  186. package/dist/layouts/simple-layout.d.ts +21 -31
  187. package/dist/layouts/simple-layout.d.ts.map +1 -1
  188. package/dist/layouts/simple-layout.js +33 -26
  189. package/dist/layouts/simple-layout.js.map +1 -1
  190. package/dist/loaders/dot-graph-loader.d.ts +25 -0
  191. package/dist/loaders/dot-graph-loader.d.ts.map +1 -0
  192. package/dist/loaders/dot-graph-loader.js +668 -0
  193. package/dist/loaders/dot-graph-loader.js.map +1 -0
  194. package/dist/loaders/json-graph-loader.d.ts +6 -0
  195. package/dist/loaders/json-graph-loader.d.ts.map +1 -0
  196. package/dist/loaders/json-graph-loader.js +31 -0
  197. package/dist/loaders/json-graph-loader.js.map +1 -0
  198. package/dist/loaders/parsers/edge-parsers.d.ts +2 -0
  199. package/dist/loaders/parsers/edge-parsers.d.ts.map +1 -0
  200. package/dist/loaders/{edge-parsers.js → parsers/edge-parsers.js} +2 -3
  201. package/dist/loaders/parsers/edge-parsers.js.map +1 -0
  202. package/dist/loaders/parsers/node-parsers.d.ts +2 -0
  203. package/dist/loaders/parsers/node-parsers.d.ts.map +1 -0
  204. package/dist/loaders/{node-parsers.js → parsers/node-parsers.js} +2 -3
  205. package/dist/loaders/parsers/node-parsers.js.map +1 -0
  206. package/dist/loaders/parsers/parse-json-graph.d.ts +29 -0
  207. package/dist/loaders/parsers/parse-json-graph.d.ts.map +1 -0
  208. package/dist/loaders/parsers/parse-json-graph.js +78 -0
  209. package/dist/loaders/parsers/parse-json-graph.js.map +1 -0
  210. package/dist/style/graph-layer-stylesheet.d.ts +34 -0
  211. package/dist/style/graph-layer-stylesheet.d.ts.map +1 -0
  212. package/dist/style/graph-layer-stylesheet.js +39 -0
  213. package/dist/style/graph-layer-stylesheet.js.map +1 -0
  214. package/dist/style/graph-style-accessor-map.d.ts +93 -0
  215. package/dist/style/graph-style-accessor-map.d.ts.map +1 -0
  216. package/dist/style/graph-style-accessor-map.js +93 -0
  217. package/dist/style/graph-style-accessor-map.js.map +1 -0
  218. package/dist/style/graph-style-engine.d.ts +12 -0
  219. package/dist/style/graph-style-engine.d.ts.map +1 -0
  220. package/dist/style/graph-style-engine.js +164 -0
  221. package/dist/style/graph-style-engine.js.map +1 -0
  222. package/dist/style/graph-stylesheet.schema.d.ts +310 -0
  223. package/dist/style/graph-stylesheet.schema.d.ts.map +1 -0
  224. package/dist/style/graph-stylesheet.schema.js +237 -0
  225. package/dist/style/graph-stylesheet.schema.js.map +1 -0
  226. package/dist/style/style-property.d.ts +2 -3
  227. package/dist/style/style-property.d.ts.map +1 -1
  228. package/dist/style/style-property.js +224 -48
  229. package/dist/style/style-property.js.map +1 -1
  230. package/dist/style/stylesheet-engine.d.ts +33 -0
  231. package/dist/style/stylesheet-engine.d.ts.map +1 -0
  232. package/dist/style/stylesheet-engine.js +121 -0
  233. package/dist/style/stylesheet-engine.js.map +1 -0
  234. package/dist/utils/collapsed-chains.d.ts +17 -0
  235. package/dist/utils/collapsed-chains.d.ts.map +1 -0
  236. package/dist/utils/collapsed-chains.js +192 -0
  237. package/dist/utils/collapsed-chains.js.map +1 -0
  238. package/dist/utils/layer-utils.d.ts +0 -1
  239. package/dist/utils/layer-utils.d.ts.map +1 -1
  240. package/dist/utils/layer-utils.js +0 -1
  241. package/dist/utils/log.d.ts +2 -1
  242. package/dist/utils/log.d.ts.map +1 -1
  243. package/dist/utils/log.js +12 -2
  244. package/dist/utils/log.js.map +1 -1
  245. package/dist/utils/node-boundary.d.ts +10 -0
  246. package/dist/utils/node-boundary.d.ts.map +1 -0
  247. package/dist/utils/node-boundary.js +130 -0
  248. package/dist/utils/node-boundary.js.map +1 -0
  249. package/dist/utils/polygon-calculations.d.ts +0 -1
  250. package/dist/utils/polygon-calculations.js +0 -1
  251. package/dist/utils/rank-grid.d.ts +30 -0
  252. package/dist/utils/rank-grid.d.ts.map +1 -0
  253. package/dist/utils/rank-grid.js +306 -0
  254. package/dist/utils/rank-grid.js.map +1 -0
  255. package/package.json +25 -13
  256. package/src/_deprecated/old-constants.ts +122 -0
  257. package/src/_disabled/arrow-graph-data.ts.disabled +18 -0
  258. package/src/_disabled/columnar-graph-data-builder.ts.disabled +250 -0
  259. package/src/_disabled/graph-runtime-layout.ts.disabled +29 -0
  260. package/src/core/constants.ts +21 -43
  261. package/src/core/graph-engine.ts +212 -80
  262. package/src/core/graph-layout.ts +175 -47
  263. package/src/core/interaction-manager.ts +93 -33
  264. package/src/graph/arrow-graph.ts +648 -0
  265. package/src/graph/classic-graph.ts +447 -0
  266. package/src/graph/edge.ts +13 -13
  267. package/src/graph/functions/arrow-utils.ts +72 -0
  268. package/src/graph/functions/convert-arrow-graph-to-classic-graph.ts.disabled +47 -0
  269. package/src/graph/functions/convert-plain-graph-to-arrow-graph.ts.disabled +119 -0
  270. package/src/graph/functions/create-graph-from-data.ts +16 -0
  271. package/src/graph/functions/create-plain-graph-from-data.ts.disabled +176 -0
  272. package/src/graph/graph-normalization.ts +87 -0
  273. package/src/graph/graph.ts +68 -339
  274. package/src/graph/node.ts +15 -15
  275. package/src/graph/tabular-graph.ts.disabled +761 -0
  276. package/src/graph-data/arrow-graph-data-builder.ts +165 -0
  277. package/src/graph-data/graph-data-builder.ts +7 -0
  278. package/src/graph-data/graph-data.ts +57 -0
  279. package/src/graph-data/plain-graph-data-builder.ts +132 -0
  280. package/src/index.ts +82 -17
  281. package/src/layers/common-layers/flow-path-layer/flow-path-layer.ts +1 -2
  282. package/src/layers/common-layers/grid-layer/grid-layer.ts +237 -0
  283. package/src/layers/common-layers/marker-layer/marker-list.ts +62 -64
  284. package/src/layers/edge-attachment-helper.ts +361 -0
  285. package/src/layers/edge-layer.ts +6 -7
  286. package/src/layers/edge-layers/arrow-2d-geometry.ts +51 -0
  287. package/src/layers/edge-layers/edge-arrow-layer.ts +171 -0
  288. package/src/layers/graph-layer.ts +928 -130
  289. package/src/layouts/d3-dag/collapsable-d3-dag-layout.ts +330 -0
  290. package/src/layouts/d3-dag/d3-dag-layout.ts +739 -0
  291. package/src/layouts/d3-force/d3-force-layout.ts +83 -39
  292. package/src/layouts/experimental/force-multi-graph-layout.ts +72 -57
  293. package/src/layouts/experimental/hive-plot-layout.ts +60 -49
  294. package/src/layouts/experimental/radial-layout.ts +57 -26
  295. package/src/layouts/gpu-force/gpu-force-layout.ts +86 -72
  296. package/src/layouts/simple-layout.ts +51 -52
  297. package/src/loaders/{create-graph.ts → deprecated/create-graph.ts.disabled} +6 -6
  298. package/src/loaders/deprecated/json-classic-graph-loader.ts.disabled +33 -0
  299. package/src/loaders/{simple-json-graph-loader.ts → deprecated/simple-json-graph-loader.ts.disabled} +4 -4
  300. package/src/loaders/{table-graph-loader.ts → deprecated/table-graph-loader.ts.disabled} +9 -9
  301. package/src/loaders/dot-graph-loader.ts +860 -0
  302. package/src/loaders/json-graph-loader.ts +48 -0
  303. package/src/loaders/parsers/create-graph-data.ts.disabled +45 -0
  304. package/src/loaders/{edge-parsers.ts → parsers/edge-parsers.ts} +3 -3
  305. package/src/loaders/{node-parsers.ts → parsers/node-parsers.ts} +3 -3
  306. package/src/loaders/parsers/parse-json-graph.ts +134 -0
  307. package/src/style/graph-layer-stylesheet.ts +99 -0
  308. package/src/style/graph-style-accessor-map.ts +103 -0
  309. package/src/style/graph-style-engine.ts +232 -0
  310. package/src/style/graph-stylesheet.schema.ts +344 -0
  311. package/src/style/style-property.ts +314 -51
  312. package/src/style/stylesheet-engine.ts +168 -0
  313. package/src/utils/collapsed-chains.ts +255 -0
  314. package/src/utils/log.ts +15 -1
  315. package/src/utils/node-boundary.ts +238 -0
  316. package/src/utils/rank-grid.ts +426 -0
  317. package/dist/loaders/create-graph.d.ts +0 -13
  318. package/dist/loaders/create-graph.d.ts.map +0 -1
  319. package/dist/loaders/create-graph.js +0 -39
  320. package/dist/loaders/create-graph.js.map +0 -1
  321. package/dist/loaders/edge-parsers.d.ts +0 -3
  322. package/dist/loaders/edge-parsers.d.ts.map +0 -1
  323. package/dist/loaders/edge-parsers.js.map +0 -1
  324. package/dist/loaders/json-loader.d.ts +0 -8
  325. package/dist/loaders/json-loader.d.ts.map +0 -1
  326. package/dist/loaders/json-loader.js +0 -17
  327. package/dist/loaders/json-loader.js.map +0 -1
  328. package/dist/loaders/node-parsers.d.ts +0 -3
  329. package/dist/loaders/node-parsers.d.ts.map +0 -1
  330. package/dist/loaders/node-parsers.js.map +0 -1
  331. package/dist/loaders/simple-json-graph-loader.d.ts +0 -12
  332. package/dist/loaders/simple-json-graph-loader.d.ts.map +0 -1
  333. package/dist/loaders/simple-json-graph-loader.js +0 -21
  334. package/dist/loaders/simple-json-graph-loader.js.map +0 -1
  335. package/dist/loaders/table-graph-loader.d.ts +0 -17
  336. package/dist/loaders/table-graph-loader.d.ts.map +0 -1
  337. package/dist/loaders/table-graph-loader.js +0 -92
  338. package/dist/loaders/table-graph-loader.js.map +0 -1
  339. package/dist/style/style-sheet.d.ts +0 -11
  340. package/dist/style/style-sheet.d.ts.map +0 -1
  341. package/dist/style/style-sheet.js +0 -253
  342. package/dist/style/style-sheet.js.map +0 -1
  343. package/dist/widgets/long-press-button.d.ts +0 -13
  344. package/dist/widgets/long-press-button.d.ts.map +0 -1
  345. package/dist/widgets/long-press-button.js +0 -32
  346. package/dist/widgets/long-press-button.js.map +0 -1
  347. package/dist/widgets/view-control-widget.d.ts +0 -78
  348. package/dist/widgets/view-control-widget.d.ts.map +0 -1
  349. package/dist/widgets/view-control-widget.js +0 -195
  350. package/dist/widgets/view-control-widget.js.map +0 -1
  351. package/src/loaders/json-loader.ts +0 -19
  352. package/src/style/style-sheet.ts +0 -277
  353. package/src/widgets/long-press-button.tsx +0 -50
  354. package/src/widgets/view-control-widget.tsx +0 -337
@@ -0,0 +1,739 @@
1
+ // deck.gl-community
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ /* eslint-disable no-continue, complexity, max-statements */
6
+
7
+ import {GraphLayout, GraphLayoutProps} from '../../core/graph-layout';
8
+ import type {Graph, NodeInterface, EdgeInterface} from '../../graph/graph';
9
+ import {Node} from '../../graph/node';
10
+ import {
11
+ coordCenter,
12
+ coordGreedy,
13
+ coordQuad,
14
+ coordSimplex,
15
+ coordTopological,
16
+ decrossDfs,
17
+ decrossOpt,
18
+ decrossTwoLayer,
19
+ graph as createDagGraph,
20
+ graphConnect,
21
+ graphStratify,
22
+ grid,
23
+ layeringLongestPath,
24
+ layeringSimplex,
25
+ layeringTopological,
26
+ sugiyama,
27
+ zherebko,
28
+ // type Coord,
29
+ // type Decross,
30
+ type DefaultGrid,
31
+ type DefaultSugiyama,
32
+ type DefaultZherebko,
33
+ type LayoutResult,
34
+ type MutGraph,
35
+ type MutGraphNode,
36
+ type MutGraphLink,
37
+ type NodeSize
38
+ } from 'd3-dag';
39
+ import {log} from '../../utils/log';
40
+
41
+ export type D3DagLayoutProps = GraphLayoutProps & {
42
+ /** Which high-level layout operator to use. */
43
+ layout?: 'sugiyama' | 'grid' | 'zherebko';
44
+ /** Layering operator used by sugiyama layouts. */
45
+ layering?: 'simplex' | 'longestPath' | 'topological';
46
+ /** Accessor for node rank for layering */
47
+ nodeRank?: string | ((node: NodeInterface) => number | undefined);
48
+ /** Decrossing operator used by sugiyama layouts. */
49
+ decross?: 'twoLayer' | 'opt' | 'dfs';
50
+ /** Coordinate assignment operator used by sugiyama layouts. */
51
+ coord?: 'simplex' | 'greedy' | 'quad' | 'center' | 'topological';
52
+ /** Node sizing accessor passed to the active layout. */
53
+ nodeSize?: NodeSize<NodeInterface, EdgeInterface>;
54
+ /** Optional gap between nodes. Alias: separation. */
55
+ gap?: readonly [number, number];
56
+ /** Optional gap between nodes. */
57
+ separation?: readonly [number, number];
58
+ /** Orientation transform applied after the layout finishes. */
59
+ orientation?: 'TB' | 'BT' | 'LR' | 'RL';
60
+ /** Whether to center the layout along each axis. */
61
+ center?: boolean | {x?: boolean; y?: boolean};
62
+ /** How to convert the Graph into a DAG. */
63
+ dagBuilder?: 'graph' | 'connect' | 'stratify';
64
+
65
+ customDagBuilder?: DagBuilder;
66
+ customLayout?: D3DagLayoutOperator;
67
+ customLayering?: LayeringOperator;
68
+ customDecross?: DecrossOperator;
69
+ customCoord?: CoordOperator;
70
+ };
71
+
72
+ export type D3DagLayoutOperator =
73
+ | DefaultSugiyama
74
+ | DefaultGrid
75
+ | DefaultZherebko
76
+ | ((dag: MutGraph<NodeInterface, EdgeInterface>) => LayoutResult);
77
+
78
+ type DagBuilder = (graph: Graph) => MutGraph<NodeInterface, EdgeInterface>;
79
+
80
+ type LayeringOperator =
81
+ | ReturnType<typeof layeringSimplex>
82
+ | ReturnType<typeof layeringLongestPath>
83
+ | ReturnType<typeof layeringTopological>;
84
+ type DecrossOperator =
85
+ | ReturnType<typeof decrossTwoLayer>
86
+ | ReturnType<typeof decrossOpt>
87
+ | ReturnType<typeof decrossDfs>;
88
+ type CoordOperator =
89
+ | ReturnType<typeof coordCenter>
90
+ | ReturnType<typeof coordGreedy>
91
+ | ReturnType<typeof coordQuad>
92
+ | ReturnType<typeof coordSimplex>
93
+ | ReturnType<typeof coordTopological>;
94
+
95
+ type LayoutCallable = (dag: MutGraph<NodeInterface, EdgeInterface>) => LayoutResult;
96
+
97
+ type LayoutWithConfiguration = LayoutCallable & {
98
+ layering?: (layer?: any) => any;
99
+ decross?: (decross?: any) => any;
100
+ coord?: (coord?: any) => any;
101
+ nodeSize?: (size?: NodeSize<NodeInterface, EdgeInterface>) => any;
102
+ gap?: (gap?: readonly [number, number]) => any;
103
+ };
104
+
105
+ type DagBounds = {
106
+ minX: number;
107
+ maxX: number;
108
+ minY: number;
109
+ maxY: number;
110
+ centerX: number;
111
+ centerY: number;
112
+ };
113
+
114
+ const DAG_ID_SEPARATOR = '::';
115
+
116
+ const DEFAULT_NODE_SIZE: readonly [number, number] = [140, 120];
117
+ const DEFAULT_GAP: readonly [number, number] = [0, 0];
118
+
119
+ const LAYERING_FACTORIES = {
120
+ simplex: layeringSimplex,
121
+ longestPath: layeringLongestPath,
122
+ topological: layeringTopological
123
+ } as const satisfies Record<string, () => LayeringOperator>;
124
+
125
+ const DECROSS_FACTORIES = {
126
+ twoLayer: decrossTwoLayer,
127
+ opt: decrossOpt,
128
+ dfs: decrossDfs
129
+ } as const satisfies Record<string, () => DecrossOperator>;
130
+
131
+ const COORD_FACTORIES = {
132
+ simplex: coordSimplex,
133
+ greedy: coordGreedy,
134
+ quad: coordQuad,
135
+ center: coordCenter,
136
+ topological: coordTopological
137
+ } as const satisfies Record<string, () => CoordOperator>;
138
+
139
+ const LAYOUT_FACTORIES = {
140
+ sugiyama: () => sugiyama(),
141
+ grid: () => grid(),
142
+ zherebko: () => zherebko()
143
+ } as const satisfies Record<string, () => LayoutWithConfiguration>;
144
+
145
+ function isNodeInterface(value: unknown): value is NodeInterface {
146
+ return Boolean(value) && typeof value === 'object' && (value as NodeInterface).isNode === true;
147
+ }
148
+
149
+ function isEdgeInterface(value: unknown): value is EdgeInterface {
150
+ return Boolean(value) && typeof value === 'object' && (value as EdgeInterface).isEdge === true;
151
+ }
152
+
153
+ /**
154
+ * Layout that orchestrates d3-dag operators from declarative options.
155
+ */
156
+ export class D3DagLayout<PropsT extends D3DagLayoutProps = D3DagLayoutProps> extends GraphLayout<PropsT> {
157
+ static defaultProps: Readonly<Required<D3DagLayoutProps>> = {
158
+ ...GraphLayout.defaultProps,
159
+ layout: 'sugiyama',
160
+ layering: 'topological',
161
+ decross: 'twoLayer',
162
+ coord: 'greedy',
163
+ nodeRank: undefined,
164
+ nodeSize: DEFAULT_NODE_SIZE,
165
+ gap: DEFAULT_GAP,
166
+ separation: DEFAULT_GAP,
167
+ orientation: 'TB',
168
+ center: true,
169
+ dagBuilder: 'graph',
170
+
171
+ customLayout: undefined,
172
+ customLayering: undefined,
173
+ customDecross: undefined,
174
+ customCoord: undefined,
175
+ customDagBuilder: undefined
176
+ } as const;
177
+
178
+ protected readonly _name = 'D3DagLayout';
179
+
180
+ protected _graph: Graph | null = null;
181
+ private _dag: MutGraph<NodeInterface, EdgeInterface> | null = null;
182
+ private _layoutOperator: LayoutWithConfiguration | null = null;
183
+ private _rawNodePositions = new Map<string | number, [number, number]>();
184
+ private _rawEdgePoints = new Map<string | number, [number, number][]>();
185
+ private _nodePositions = new Map<string | number, [number, number]>();
186
+ private _edgePoints = new Map<string | number, [number, number][]>();
187
+ private _edgeControlPoints = new Map<string | number, [number, number][]>();
188
+ private _lockedNodePositions = new Map<string | number, [number, number]>();
189
+ private _dagBounds: DagBounds | null = null;
190
+
191
+ protected _nodeLookup = new Map<string | number, NodeInterface>();
192
+ protected _stringIdLookup = new Map<string, string | number>();
193
+ protected _edgeLookup = new Map<string, EdgeInterface>();
194
+ protected _incomingParentMap = new Map<string | number, (string | number)[]>();
195
+
196
+ constructor(props: D3DagLayoutProps, defaultProps?: Required<PropsT>) {
197
+ // @ts-expect-error TS2345 - Type 'Required<D3DagLayoutProps>' is not assignable to type 'Required<PropsT>'.
198
+ super(props, defaultProps || D3DagLayout.defaultProps);
199
+ }
200
+
201
+ setProps(options: Partial<D3DagLayoutProps>): void {
202
+ this.props = {...this.props, ...options};
203
+ if (
204
+ options.layout !== undefined ||
205
+ options.layering !== undefined ||
206
+ options.decross !== undefined ||
207
+ options.coord !== undefined ||
208
+ options.nodeSize !== undefined ||
209
+ options.gap !== undefined ||
210
+ options.separation !== undefined
211
+ ) {
212
+ this._layoutOperator = null;
213
+ }
214
+ }
215
+
216
+
217
+ initializeGraph(graph: Graph): void {
218
+ this.updateGraph(graph);
219
+ }
220
+
221
+ updateGraph(graph: Graph): void {
222
+ this._graph = graph;
223
+ this._nodeLookup = new Map();
224
+ this._stringIdLookup = new Map();
225
+ this._edgeLookup = new Map();
226
+ this._incomingParentMap = new Map();
227
+
228
+ for (const node of graph.getNodes()) {
229
+ const id = node.getId();
230
+ const key = this._toDagId(id);
231
+ this._nodeLookup.set(id, node);
232
+ this._stringIdLookup.set(key, id);
233
+ }
234
+
235
+ for (const edge of graph.getEdges()) {
236
+ if (!edge.isDirected()) {
237
+ continue;
238
+ }
239
+ const key = this._edgeKey(edge.getSourceNodeId(), edge.getTargetNodeId());
240
+ this._edgeLookup.set(key, edge);
241
+
242
+ const targetId = edge.getTargetNodeId();
243
+ const parents = this._incomingParentMap.get(targetId) ?? [];
244
+ parents.push(edge.getSourceNodeId());
245
+ this._incomingParentMap.set(targetId, parents);
246
+ }
247
+ }
248
+
249
+ start(): void {
250
+ this._runLayout();
251
+ }
252
+
253
+ update(): void {
254
+ this._runLayout();
255
+ }
256
+
257
+ resume(): void {
258
+ this._runLayout();
259
+ }
260
+
261
+ stop(): void {}
262
+
263
+ toggleCollapsedChain(chainId: string): void {
264
+ log.log(1, `D3DagLayout: toggleCollapsedChain(${chainId}) ignored (collapsing disabled)`);
265
+ }
266
+
267
+ setCollapsedChains(chainIds: Iterable<string>): void {
268
+ const desired = Array.isArray(chainIds) ? chainIds : Array.from(chainIds);
269
+ log.log(1, `D3DagLayout: setCollapsedChains(${desired.length}) ignored (collapsing disabled)`);
270
+ }
271
+
272
+ getNodePosition(node: NodeInterface): [number, number] | null {
273
+ if (this._shouldSkipNode(node.getId())) {
274
+ return null;
275
+ }
276
+ const mappedId = this._mapNodeId(node.getId());
277
+ return this._nodePositions.get(mappedId) || null;
278
+ }
279
+
280
+ getEdgePosition(edge: EdgeInterface):
281
+ | {
282
+ type: string;
283
+ sourcePosition: [number, number];
284
+ targetPosition: [number, number];
285
+ controlPoints: [number, number][];
286
+ }
287
+ | null {
288
+ const mappedSourceId = this._mapNodeId(edge.getSourceNodeId());
289
+ const mappedTargetId = this._mapNodeId(edge.getTargetNodeId());
290
+ if (mappedSourceId === mappedTargetId) {
291
+ return null;
292
+ }
293
+
294
+ const sourcePosition = this._nodePositions.get(mappedSourceId);
295
+ const targetPosition = this._nodePositions.get(mappedTargetId);
296
+ if (!sourcePosition || !targetPosition) {
297
+ return null;
298
+ }
299
+
300
+ if (!this._edgePoints.has(edge.getId())) {
301
+ return null;
302
+ }
303
+
304
+ // const points = this._edgePoints.get(edge.getId()) || [sourcePosition, targetPosition];
305
+ const controlPoints = this._edgeControlPoints.get(edge.getId()) || [];
306
+ const edgeType = controlPoints.length ? 'spline-curve' : 'line';
307
+
308
+ return {
309
+ type: edgeType,
310
+ sourcePosition,
311
+ targetPosition,
312
+ controlPoints
313
+ };
314
+ }
315
+
316
+ getLinkControlPoints(edge: EdgeInterface): [number, number][] {
317
+ return this._edgeControlPoints.get(edge.getId()) || [];
318
+ }
319
+
320
+ lockNodePosition(node: NodeInterface, x: number, y: number): void {
321
+ this._lockedNodePositions.set(node.getId(), [x, y]);
322
+ this._nodePositions.set(node.getId(), [x, y]);
323
+ this._onLayoutChange();
324
+ this._onLayoutDone();
325
+ }
326
+
327
+ unlockNodePosition(node: NodeInterface): void {
328
+ this._lockedNodePositions.delete(node.getId());
329
+ }
330
+
331
+ protected _runLayout(): void {
332
+ if (!this._graph) {
333
+ return;
334
+ }
335
+ this._refreshCollapsedChains();
336
+ this._onLayoutStart();
337
+
338
+ try {
339
+ this._dag = this._buildDag();
340
+ const layout = this._getLayoutOperator();
341
+ layout(this._dag);
342
+ this._cacheGeometry();
343
+ this._onLayoutChange();
344
+ this._onLayoutDone();
345
+ } catch (error) {
346
+ this._onLayoutError();
347
+ throw error;
348
+ }
349
+ }
350
+
351
+ protected _refreshCollapsedChains(): void {
352
+ this._updateCollapsedChainNodeMetadata();
353
+ }
354
+
355
+ private _buildDag(): MutGraph<NodeInterface, EdgeInterface> {
356
+ if (this.props.customDagBuilder) {
357
+ const dag = this.props.customDagBuilder(this._graph);
358
+ return this._ensureEdgeData(dag);
359
+ }
360
+
361
+ switch (this.props.dagBuilder) {
362
+ case 'connect':
363
+ return this._buildDagWithConnect();
364
+ case 'stratify':
365
+ return this._buildDagWithStratify();
366
+ case 'graph':
367
+ default:
368
+ return this._buildDagWithGraph();
369
+ }
370
+ }
371
+
372
+ private _buildDagWithGraph(): MutGraph<NodeInterface, EdgeInterface> {
373
+ const dag = createDagGraph<NodeInterface, EdgeInterface>();
374
+ const dagNodeLookup = new Map<string | number, MutGraphNode<NodeInterface, EdgeInterface>>();
375
+
376
+ for (const node of this._graph.getNodes()) {
377
+ if (this._shouldSkipNode(node.getId())) {
378
+ continue;
379
+ }
380
+ const dagNode = dag.node(node);
381
+ dagNodeLookup.set(node.getId(), dagNode);
382
+ }
383
+
384
+ for (const edge of this._graph.getEdges()) {
385
+ if (!edge.isDirected()) {
386
+ continue;
387
+ }
388
+ const sourceId = this._mapNodeId(edge.getSourceNodeId());
389
+ const targetId = this._mapNodeId(edge.getTargetNodeId());
390
+ if (sourceId === targetId) {
391
+ continue;
392
+ }
393
+ const source = dagNodeLookup.get(sourceId);
394
+ const target = dagNodeLookup.get(targetId);
395
+ if (!source || !target) {
396
+ continue;
397
+ }
398
+ dag.link(source, target, edge);
399
+ }
400
+
401
+ return dag;
402
+ }
403
+
404
+ private _buildDagWithConnect(): MutGraph<NodeInterface, EdgeInterface> {
405
+ type ConnectDatum = {source: string; target: string; edge: EdgeInterface};
406
+
407
+ const connect = graphConnect()
408
+ .sourceId(({source}: ConnectDatum): string => source)
409
+ .targetId(({target}: ConnectDatum): string => target)
410
+ .nodeDatum((id: string): NodeInterface => this._nodeLookup.get(this._fromDagId(id)) ?? new Node({id}))
411
+ .single(true);
412
+
413
+ const edges = Array.from(this._graph.getEdges());
414
+
415
+ const data: ConnectDatum[] = edges
416
+ .filter((edge) => edge.isDirected())
417
+ .map((edge) => {
418
+ const sourceId = this._mapNodeId(edge.getSourceNodeId());
419
+ const targetId = this._mapNodeId(edge.getTargetNodeId());
420
+ return {sourceId, targetId, edge};
421
+ })
422
+ .filter(({sourceId, targetId}) => sourceId !== targetId)
423
+ .map(({sourceId, targetId, edge}) => ({
424
+ source: this._toDagId(sourceId),
425
+ target: this._toDagId(targetId),
426
+ edge
427
+ }));
428
+
429
+ const dag = connect(data);
430
+
431
+ const seenIds = new Set<string | number>();
432
+ for (const dagNode of dag.nodes()) {
433
+ const datum = dagNode.data;
434
+ if (isNodeInterface(datum)) {
435
+ seenIds.add(datum.getId());
436
+ }
437
+ }
438
+
439
+ for (const node of this._graph.getNodes()) {
440
+ if (this._shouldSkipNode(node.getId())) {
441
+ continue;
442
+ }
443
+ if (!seenIds.has(node.getId())) {
444
+ dag.node(node);
445
+ }
446
+ }
447
+
448
+ return this._ensureEdgeData(dag);
449
+ }
450
+
451
+ private _buildDagWithStratify(): MutGraph<NodeInterface, EdgeInterface> {
452
+ const stratify = graphStratify()
453
+ .id((node: NodeInterface): string => this._toDagId(node.getId()))
454
+ .parentIds((node: NodeInterface): Iterable<string> => {
455
+ const parentIds = this._incomingParentMap.get(node.getId()) ?? [];
456
+ const mapped = new Set<string>();
457
+ for (const parentId of parentIds) {
458
+ if (!this._nodeLookup.has(parentId)) {
459
+ continue;
460
+ }
461
+ const mappedId = this._mapNodeId(parentId);
462
+ if (mappedId === node.getId()) {
463
+ continue;
464
+ }
465
+ mapped.add(this._toDagId(mappedId));
466
+ }
467
+ return mapped;
468
+ });
469
+
470
+ const nodes = Array.from(this._graph.getNodes());
471
+ const dag = stratify(nodes.filter((node) => !this._shouldSkipNode(node.getId())));
472
+ return this._ensureEdgeData(dag);
473
+ }
474
+
475
+ protected _shouldSkipNode(_nodeId: string | number): boolean {
476
+ return false;
477
+ }
478
+
479
+ protected _mapNodeId(nodeId: string | number): string | number {
480
+ return nodeId;
481
+ }
482
+
483
+ protected _updateCollapsedChainNodeMetadata(): void {
484
+ if (!this._graph) {
485
+ return;
486
+ }
487
+ for (const node of this._graph.getNodes()) {
488
+ node.setDataProperty('collapsedChainId', null);
489
+ node.setDataProperty('collapsedChainLength', 1);
490
+ node.setDataProperty('collapsedNodeIds', []);
491
+ node.setDataProperty('collapsedEdgeIds', []);
492
+ node.setDataProperty('collapsedChainRepresentativeId', null);
493
+ node.setDataProperty('isCollapsedChain', false);
494
+ }
495
+ }
496
+
497
+ protected _getIncomingEdges(node: NodeInterface): EdgeInterface[] {
498
+ const nodeId = node.getId();
499
+ return node
500
+ .getConnectedEdges()
501
+ .filter((edge) => edge.isDirected() && edge.getTargetNodeId() === nodeId);
502
+ }
503
+
504
+ protected _getOutgoingEdges(node: NodeInterface): EdgeInterface[] {
505
+ const nodeId = node.getId();
506
+ return node
507
+ .getConnectedEdges()
508
+ .filter((edge) => edge.isDirected() && edge.getSourceNodeId() === nodeId);
509
+ }
510
+
511
+ private _ensureEdgeData<T>(dag: MutGraph<NodeInterface, T>): MutGraph<NodeInterface, EdgeInterface> {
512
+ for (const link of dag.links()) {
513
+ if (isEdgeInterface(link.data)) {
514
+ continue;
515
+ }
516
+ const sourceNode = link.source.data;
517
+ const targetNode = link.target.data;
518
+ if (!isNodeInterface(sourceNode) || !isNodeInterface(targetNode)) {
519
+ continue;
520
+ }
521
+ const key = this._edgeKey(sourceNode.getId(), targetNode.getId());
522
+ const edge = this._edgeLookup.get(key);
523
+ if (edge) {
524
+ (link as unknown as MutGraphLink<NodeInterface, EdgeInterface>).data = edge;
525
+ }
526
+ }
527
+
528
+ return dag as unknown as MutGraph<NodeInterface, EdgeInterface>;
529
+ }
530
+
531
+ private _getLayoutOperator(): LayoutWithConfiguration {
532
+ if (this._layoutOperator) {
533
+ return this._layoutOperator;
534
+ }
535
+
536
+ const layoutOption = this.props.layout ?? D3DagLayout.defaultProps.layout;
537
+ let layout: LayoutWithConfiguration;
538
+
539
+ if (typeof layoutOption === 'string') {
540
+ layout = LAYOUT_FACTORIES[layoutOption]();
541
+ } else {
542
+ layout = layoutOption as LayoutWithConfiguration;
543
+ }
544
+
545
+ // TODO - is 'none' operator an option in d3-dag?
546
+ if (layout.layering && this.props.layering) {
547
+ let layeringOperator = this.props.customLayering || LAYERING_FACTORIES[this.props.layering]();
548
+ layout = layout.layering(layeringOperator);
549
+ const {nodeRank} = this.props;
550
+ if (nodeRank) {
551
+ // @ts-expect-error TS2345 - Argument of type '(dagNode: MutGraphNode<NodeInterface, EdgeInterface>) => number | undefined' is not assignable to parameter of type '(dagNode: MutGraphNode<NodeInterface, EdgeInterface>) => number'.
552
+ layeringOperator = layeringOperator.rank((dagNode) => {
553
+ const node = dagNode.data as NodeInterface;
554
+ const rank = typeof nodeRank === 'function' ? nodeRank?.(node) : node?.getPropertyValue(nodeRank) || undefined;
555
+ // if (rank !== undefined) {
556
+ // console.log(`Node ${node.getId()} assigned to rank ${rank}`);
557
+ // }
558
+ return rank;
559
+ });
560
+ }
561
+ layout = layout.layering(layeringOperator);
562
+ }
563
+
564
+ if (layout.decross && this.props.decross) {
565
+ const decrossOperator = this.props.customDecross || DECROSS_FACTORIES[this.props.decross]();
566
+ layout = layout.decross(decrossOperator);
567
+ }
568
+
569
+ if (layout.coord && this.props.coord) {
570
+ const coordOperator = this.props.customCoord || COORD_FACTORIES[this.props.coord]();
571
+ layout = layout.coord(coordOperator);
572
+ }
573
+
574
+ const nodeSize = this.props.nodeSize ?? DEFAULT_NODE_SIZE;
575
+ if (layout.nodeSize) {
576
+ layout = layout.nodeSize(nodeSize);
577
+ }
578
+
579
+ const gap = this.props.separation ?? this.props.gap ?? DEFAULT_GAP;
580
+ if (layout.gap) {
581
+ layout = layout.gap(gap);
582
+ }
583
+
584
+ this._layoutOperator = layout;
585
+ return layout;
586
+ }
587
+
588
+ private _cacheGeometry(): void {
589
+ this._rawNodePositions.clear();
590
+ this._rawEdgePoints.clear();
591
+
592
+ if (!this._dag) {
593
+ this._dagBounds = null;
594
+ this._bounds = null;
595
+ return;
596
+ }
597
+
598
+ let minX = Number.POSITIVE_INFINITY;
599
+ let maxX = Number.NEGATIVE_INFINITY;
600
+ let minY = Number.POSITIVE_INFINITY;
601
+ let maxY = Number.NEGATIVE_INFINITY;
602
+
603
+ for (const dagNode of this._dag.nodes()) {
604
+ const node = dagNode.data;
605
+ const id = node.getId();
606
+ const x = dagNode.x ?? 0;
607
+ const y = dagNode.y ?? 0;
608
+
609
+ minX = Math.min(minX, x);
610
+ maxX = Math.max(maxX, x);
611
+ minY = Math.min(minY, y);
612
+ maxY = Math.max(maxY, y);
613
+
614
+ this._rawNodePositions.set(id, [x, y]);
615
+ }
616
+
617
+ if (minX === Number.POSITIVE_INFINITY) {
618
+ this._dagBounds = null;
619
+ this._bounds = null;
620
+ this._nodePositions.clear();
621
+ this._edgePoints.clear();
622
+ this._edgeControlPoints.clear();
623
+ return;
624
+ }
625
+
626
+ this._dagBounds = {
627
+ minX,
628
+ maxX,
629
+ minY,
630
+ maxY,
631
+ centerX: (minX + maxX) / 2,
632
+ centerY: (minY + maxY) / 2
633
+ };
634
+
635
+ for (const link of this._dag.links()) {
636
+ const source = link.source.data;
637
+ const target = link.target.data;
638
+ if (!isNodeInterface(source) || !isNodeInterface(target)) {
639
+ continue;
640
+ }
641
+ const edge = isEdgeInterface(link.data)
642
+ ? link.data
643
+ : this._edgeLookup.get(this._edgeKey(source.getId(), target.getId()));
644
+ if (!edge) {
645
+ continue;
646
+ }
647
+ const points = (link.points && link.points.length ? link.points : [[link.source.x ?? 0, link.source.y ?? 0], [link.target.x ?? 0, link.target.y ?? 0]]);
648
+ this._rawEdgePoints.set(edge.getId(), points.map((point) => [...point] as [number, number]));
649
+ }
650
+
651
+ this._updateTransformedGeometry();
652
+ }
653
+
654
+ private _updateTransformedGeometry(): void {
655
+ this._nodePositions.clear();
656
+ this._edgePoints.clear();
657
+ this._edgeControlPoints.clear();
658
+
659
+ if (!this._dagBounds) {
660
+ this._bounds = null;
661
+ return;
662
+ }
663
+
664
+ const {offsetX, offsetY} = this._getOffsets();
665
+ const orientation = this.props.orientation ?? D3DagLayout.defaultProps.orientation;
666
+
667
+ const transform = (x: number, y: number): [number, number] => {
668
+ const localX = x - offsetX;
669
+ const localY = y - offsetY;
670
+ switch (orientation) {
671
+ case 'BT':
672
+ return [localX, localY];
673
+ case 'LR':
674
+ return [localY, localX];
675
+ case 'RL':
676
+ return [-localY, localX];
677
+ case 'TB':
678
+ default:
679
+ return [localX, -localY];
680
+ }
681
+ };
682
+
683
+ for (const [id, [x, y]] of this._rawNodePositions) {
684
+ this._nodePositions.set(id, transform(x, y));
685
+ }
686
+
687
+ for (const [edgeId, points] of this._rawEdgePoints) {
688
+ const transformed = points.map(([x, y]) => transform(x, y));
689
+ this._edgePoints.set(edgeId, transformed);
690
+ this._edgeControlPoints.set(
691
+ edgeId,
692
+ transformed.length > 2 ? transformed.slice(1, -1) : []
693
+ );
694
+ }
695
+
696
+ for (const [id, position] of this._lockedNodePositions) {
697
+ this._nodePositions.set(id, position);
698
+ }
699
+
700
+ this._bounds = this._calculateBounds(this._nodePositions.values());
701
+ }
702
+
703
+ private _getOffsets(): {offsetX: number; offsetY: number} {
704
+ if (!this._dagBounds) {
705
+ return {offsetX: 0, offsetY: 0};
706
+ }
707
+ const centerOption = this.props.center ?? true;
708
+ let offsetX = 0;
709
+ let offsetY = 0;
710
+ if (centerOption === true) {
711
+ offsetX = this._dagBounds.centerX;
712
+ offsetY = this._dagBounds.centerY;
713
+ } else if (centerOption && typeof centerOption === 'object') {
714
+ if (centerOption.x) {
715
+ offsetX = this._dagBounds.centerX;
716
+ }
717
+ if (centerOption.y) {
718
+ offsetY = this._dagBounds.centerY;
719
+ }
720
+ }
721
+ return {offsetX, offsetY};
722
+ }
723
+
724
+ protected override _updateBounds(): void {
725
+ this._bounds = this._calculateBounds(this._nodePositions.values());
726
+ }
727
+
728
+ protected _edgeKey(sourceId: string | number, targetId: string | number): string {
729
+ return `${this._toDagId(sourceId)}${DAG_ID_SEPARATOR}${this._toDagId(targetId)}`;
730
+ }
731
+
732
+ protected _toDagId(id: string | number): string {
733
+ return String(id);
734
+ }
735
+
736
+ protected _fromDagId(id: string): string | number {
737
+ return this._stringIdLookup.get(id) ?? id;
738
+ }
739
+ }