@deck.gl-community/graph-layers 9.0.0

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 (210) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +7 -0
  3. package/dist/core/base-layout.d.ts +71 -0
  4. package/dist/core/base-layout.js +133 -0
  5. package/dist/core/cache.d.ts +14 -0
  6. package/dist/core/cache.js +26 -0
  7. package/dist/core/constants.d.ts +101 -0
  8. package/dist/core/constants.js +48 -0
  9. package/dist/core/edge.d.ts +86 -0
  10. package/dist/core/edge.js +121 -0
  11. package/dist/core/graph-engine.d.ts +54 -0
  12. package/dist/core/graph-engine.js +128 -0
  13. package/dist/core/graph.d.ts +155 -0
  14. package/dist/core/graph.js +301 -0
  15. package/dist/core/interaction-manager.d.ts +40 -0
  16. package/dist/core/interaction-manager.js +169 -0
  17. package/dist/core/node.d.ts +103 -0
  18. package/dist/core/node.js +177 -0
  19. package/dist/index.cjs +3540 -0
  20. package/dist/index.cjs.map +7 -0
  21. package/dist/index.d.ts +19 -0
  22. package/dist/index.js +28 -0
  23. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-fragment.glsl.d.ts +1 -0
  24. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-fragment.glsl.js +49 -0
  25. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex-tf.glsl.d.ts +1 -0
  26. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex-tf.glsl.js +14 -0
  27. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex.glsl.d.ts +1 -0
  28. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex.glsl.js +73 -0
  29. package/dist/layers/common-layers/flow-path-layer/flow-path-layer.d.ts +20 -0
  30. package/dist/layers/common-layers/flow-path-layer/flow-path-layer.js +133 -0
  31. package/dist/layers/common-layers/marker-layer/atlas-data-url.d.ts +3 -0
  32. package/dist/layers/common-layers/marker-layer/atlas-data-url.js +8 -0
  33. package/dist/layers/common-layers/marker-layer/marker-layer.d.ts +13 -0
  34. package/dist/layers/common-layers/marker-layer/marker-layer.js +29 -0
  35. package/dist/layers/common-layers/marker-layer/marker-list.d.ts +62 -0
  36. package/dist/layers/common-layers/marker-layer/marker-list.js +67 -0
  37. package/dist/layers/common-layers/marker-layer/marker-mapping.d.ts +422 -0
  38. package/dist/layers/common-layers/marker-layer/marker-mapping.js +427 -0
  39. package/dist/layers/common-layers/spline-layer/spline-layer.d.ts +24 -0
  40. package/dist/layers/common-layers/spline-layer/spline-layer.js +68 -0
  41. package/dist/layers/common-layers/zoomable-text-layer/zoomable-text-layer.d.ts +16 -0
  42. package/dist/layers/common-layers/zoomable-text-layer/zoomable-text-layer.js +65 -0
  43. package/dist/layers/edge-layer.d.ts +25 -0
  44. package/dist/layers/edge-layer.js +75 -0
  45. package/dist/layers/edge-layers/curved-edge-layer.d.ts +6 -0
  46. package/dist/layers/edge-layers/curved-edge-layer.js +69 -0
  47. package/dist/layers/edge-layers/edge-label-layer.d.ts +6 -0
  48. package/dist/layers/edge-layers/edge-label-layer.js +42 -0
  49. package/dist/layers/edge-layers/flow-layer.d.ts +6 -0
  50. package/dist/layers/edge-layers/flow-layer.js +28 -0
  51. package/dist/layers/edge-layers/path-edge-layer.d.ts +6 -0
  52. package/dist/layers/edge-layers/path-edge-layer.js +27 -0
  53. package/dist/layers/edge-layers/straight-line-edge-layer.d.ts +6 -0
  54. package/dist/layers/edge-layers/straight-line-edge-layer.js +26 -0
  55. package/dist/layers/graph-layer.d.ts +32 -0
  56. package/dist/layers/graph-layer.js +193 -0
  57. package/dist/layers/node-layers/circle-layer.d.ts +6 -0
  58. package/dist/layers/node-layers/circle-layer.js +23 -0
  59. package/dist/layers/node-layers/image-layer.d.ts +6 -0
  60. package/dist/layers/node-layers/image-layer.js +23 -0
  61. package/dist/layers/node-layers/label-layer.d.ts +6 -0
  62. package/dist/layers/node-layers/label-layer.js +23 -0
  63. package/dist/layers/node-layers/path-rounded-rectange-layer.d.ts +6 -0
  64. package/dist/layers/node-layers/path-rounded-rectange-layer.js +46 -0
  65. package/dist/layers/node-layers/rectangle-layer.d.ts +6 -0
  66. package/dist/layers/node-layers/rectangle-layer.js +49 -0
  67. package/dist/layers/node-layers/rounded-rectangle-layer-fragment.d.ts +1 -0
  68. package/dist/layers/node-layers/rounded-rectangle-layer-fragment.js +30 -0
  69. package/dist/layers/node-layers/rounded-rectangle-layer.d.ts +8 -0
  70. package/dist/layers/node-layers/rounded-rectangle-layer.js +28 -0
  71. package/dist/layers/node-layers/zoomable-marker-layer.d.ts +10 -0
  72. package/dist/layers/node-layers/zoomable-marker-layer.js +40 -0
  73. package/dist/layouts/d3-force/d3-force-layout.d.ts +24 -0
  74. package/dist/layouts/d3-force/d3-force-layout.js +116 -0
  75. package/dist/layouts/d3-force/worker.d.ts +0 -0
  76. package/dist/layouts/d3-force/worker.js +46 -0
  77. package/dist/layouts/gpu-force/gpu-force-layout.d.ts +30 -0
  78. package/dist/layouts/gpu-force/gpu-force-layout.js +232 -0
  79. package/dist/layouts/gpu-force/worker.d.ts +0 -0
  80. package/dist/layouts/gpu-force/worker.js +116 -0
  81. package/dist/layouts/simple-layout/simple-layout.d.ts +22 -0
  82. package/dist/layouts/simple-layout/simple-layout.js +64 -0
  83. package/dist/loaders/edge-parsers.d.ts +6 -0
  84. package/dist/loaders/edge-parsers.js +17 -0
  85. package/dist/loaders/json-loader.d.ts +7 -0
  86. package/dist/loaders/json-loader.js +16 -0
  87. package/dist/loaders/node-parsers.d.ts +3 -0
  88. package/dist/loaders/node-parsers.js +11 -0
  89. package/dist/style/style-property.d.ts +14 -0
  90. package/dist/style/style-property.js +195 -0
  91. package/dist/style/style-sheet.d.ts +10 -0
  92. package/dist/style/style-sheet.js +252 -0
  93. package/dist/utils/create-graph.d.ts +8 -0
  94. package/dist/utils/create-graph.js +33 -0
  95. package/dist/utils/layer-utils.d.ts +1 -0
  96. package/dist/utils/layer-utils.js +20 -0
  97. package/dist/utils/log.d.ts +2 -0
  98. package/dist/utils/log.js +6 -0
  99. package/dist/utils/polygon-calculations.d.ts +1 -0
  100. package/dist/utils/polygon-calculations.js +102 -0
  101. package/package.json +55 -0
  102. package/src/core/base-layout.ts +154 -0
  103. package/src/core/cache.ts +31 -0
  104. package/src/core/constants.ts +58 -0
  105. package/src/core/edge.ts +145 -0
  106. package/src/core/graph-engine.ts +170 -0
  107. package/src/core/graph.ts +342 -0
  108. package/src/core/interaction-manager.ts +225 -0
  109. package/src/core/node.ts +205 -0
  110. package/src/index.ts +42 -0
  111. package/src/layers/common-layers/flow-path-layer/flow-path-layer-fragment.glsl.ts +50 -0
  112. package/src/layers/common-layers/flow-path-layer/flow-path-layer-vertex-tf.glsl.ts +15 -0
  113. package/src/layers/common-layers/flow-path-layer/flow-path-layer-vertex.glsl.ts +74 -0
  114. package/src/layers/common-layers/flow-path-layer/flow-path-layer.ts +154 -0
  115. package/src/layers/common-layers/marker-layer/atlas-data-url.ts +10 -0
  116. package/src/layers/common-layers/marker-layer/marker-atlas.png +0 -0
  117. package/src/layers/common-layers/marker-layer/marker-layer.ts +36 -0
  118. package/src/layers/common-layers/marker-layer/marker-list.ts +68 -0
  119. package/src/layers/common-layers/marker-layer/marker-mapping.ts +428 -0
  120. package/src/layers/common-layers/marker-layer/markers/bell-filled.png +0 -0
  121. package/src/layers/common-layers/marker-layer/markers/bell.png +0 -0
  122. package/src/layers/common-layers/marker-layer/markers/bookmark-filled.png +0 -0
  123. package/src/layers/common-layers/marker-layer/markers/bookmark.png +0 -0
  124. package/src/layers/common-layers/marker-layer/markers/cd-filled.png +0 -0
  125. package/src/layers/common-layers/marker-layer/markers/cd.png +0 -0
  126. package/src/layers/common-layers/marker-layer/markers/checkmark.png +0 -0
  127. package/src/layers/common-layers/marker-layer/markers/circle-check-filled.png +0 -0
  128. package/src/layers/common-layers/marker-layer/markers/circle-check.png +0 -0
  129. package/src/layers/common-layers/marker-layer/markers/circle-filled.png +0 -0
  130. package/src/layers/common-layers/marker-layer/markers/circle-i-filled.png +0 -0
  131. package/src/layers/common-layers/marker-layer/markers/circle-i.png +0 -0
  132. package/src/layers/common-layers/marker-layer/markers/circle-minus-filled.png +0 -0
  133. package/src/layers/common-layers/marker-layer/markers/circle-minus.png +0 -0
  134. package/src/layers/common-layers/marker-layer/markers/circle-plus-filled.png +0 -0
  135. package/src/layers/common-layers/marker-layer/markers/circle-plus.png +0 -0
  136. package/src/layers/common-layers/marker-layer/markers/circle-questionmark-filled.png +0 -0
  137. package/src/layers/common-layers/marker-layer/markers/circle-questionmark.png +0 -0
  138. package/src/layers/common-layers/marker-layer/markers/circle-slash-filled.png +0 -0
  139. package/src/layers/common-layers/marker-layer/markers/circle-slash.png +0 -0
  140. package/src/layers/common-layers/marker-layer/markers/circle-x-filled.png +0 -0
  141. package/src/layers/common-layers/marker-layer/markers/circle-x.png +0 -0
  142. package/src/layers/common-layers/marker-layer/markers/circle.png +0 -0
  143. package/src/layers/common-layers/marker-layer/markers/diamond-filled.png +0 -0
  144. package/src/layers/common-layers/marker-layer/markers/diamond.png +0 -0
  145. package/src/layers/common-layers/marker-layer/markers/flag-filled.png +0 -0
  146. package/src/layers/common-layers/marker-layer/markers/flag.png +0 -0
  147. package/src/layers/common-layers/marker-layer/markers/gear.png +0 -0
  148. package/src/layers/common-layers/marker-layer/markers/heart-filled.png +0 -0
  149. package/src/layers/common-layers/marker-layer/markers/heart.png +0 -0
  150. package/src/layers/common-layers/marker-layer/markers/location-marker-filled.png +0 -0
  151. package/src/layers/common-layers/marker-layer/markers/location-marker.png +0 -0
  152. package/src/layers/common-layers/marker-layer/markers/octagonal-star-filled.png +0 -0
  153. package/src/layers/common-layers/marker-layer/markers/octagonal-star.png +0 -0
  154. package/src/layers/common-layers/marker-layer/markers/person-filled.png +0 -0
  155. package/src/layers/common-layers/marker-layer/markers/person.png +0 -0
  156. package/src/layers/common-layers/marker-layer/markers/pin-filled.png +0 -0
  157. package/src/layers/common-layers/marker-layer/markers/pin.png +0 -0
  158. package/src/layers/common-layers/marker-layer/markers/plus-small.png +0 -0
  159. package/src/layers/common-layers/marker-layer/markers/plus.png +0 -0
  160. package/src/layers/common-layers/marker-layer/markers/rectangle-filled.png +0 -0
  161. package/src/layers/common-layers/marker-layer/markers/rectangle.png +0 -0
  162. package/src/layers/common-layers/marker-layer/markers/star-filled.png +0 -0
  163. package/src/layers/common-layers/marker-layer/markers/star.png +0 -0
  164. package/src/layers/common-layers/marker-layer/markers/tag-filled.png +0 -0
  165. package/src/layers/common-layers/marker-layer/markers/tag.png +0 -0
  166. package/src/layers/common-layers/marker-layer/markers/thumb-down-filled.png +0 -0
  167. package/src/layers/common-layers/marker-layer/markers/thumb-down.png +0 -0
  168. package/src/layers/common-layers/marker-layer/markers/thumb-up.png +0 -0
  169. package/src/layers/common-layers/marker-layer/markers/thumb_up-filled.png +0 -0
  170. package/src/layers/common-layers/marker-layer/markers/triangle-down-filled.png +0 -0
  171. package/src/layers/common-layers/marker-layer/markers/triangle-down.png +0 -0
  172. package/src/layers/common-layers/marker-layer/markers/triangle-left-filled.png +0 -0
  173. package/src/layers/common-layers/marker-layer/markers/triangle-left.png +0 -0
  174. package/src/layers/common-layers/marker-layer/markers/triangle-right-filled.png +0 -0
  175. package/src/layers/common-layers/marker-layer/markers/triangle-right.png +0 -0
  176. package/src/layers/common-layers/marker-layer/markers/triangle-up-filled.png +0 -0
  177. package/src/layers/common-layers/marker-layer/markers/triangle-up.png +0 -0
  178. package/src/layers/common-layers/marker-layer/markers/x-small.png +0 -0
  179. package/src/layers/common-layers/marker-layer/markers/x.png +0 -0
  180. package/src/layers/common-layers/spline-layer/spline-layer.ts +83 -0
  181. package/src/layers/common-layers/zoomable-text-layer/zoomable-text-layer.ts +90 -0
  182. package/src/layers/edge-layer.ts +88 -0
  183. package/src/layers/edge-layers/curved-edge-layer.ts +88 -0
  184. package/src/layers/edge-layers/edge-label-layer.ts +48 -0
  185. package/src/layers/edge-layers/flow-layer.ts +34 -0
  186. package/src/layers/edge-layers/path-edge-layer.ts +39 -0
  187. package/src/layers/edge-layers/straight-line-edge-layer.ts +38 -0
  188. package/src/layers/graph-layer.ts +225 -0
  189. package/src/layers/node-layers/circle-layer.ts +29 -0
  190. package/src/layers/node-layers/image-layer.ts +29 -0
  191. package/src/layers/node-layers/label-layer.ts +29 -0
  192. package/src/layers/node-layers/path-rounded-rectange-layer.ts +56 -0
  193. package/src/layers/node-layers/rectangle-layer.ts +58 -0
  194. package/src/layers/node-layers/rounded-rectangle-layer-fragment.ts +31 -0
  195. package/src/layers/node-layers/rounded-rectangle-layer.ts +32 -0
  196. package/src/layers/node-layers/zoomable-marker-layer.ts +49 -0
  197. package/src/layouts/d3-force/d3-force-layout.ts +145 -0
  198. package/src/layouts/d3-force/worker.ts +61 -0
  199. package/src/layouts/gpu-force/gpu-force-layout.ts +249 -0
  200. package/src/layouts/gpu-force/worker.ts +137 -0
  201. package/src/layouts/simple-layout/simple-layout.ts +87 -0
  202. package/src/loaders/edge-parsers.ts +21 -0
  203. package/src/loaders/json-loader.ts +19 -0
  204. package/src/loaders/node-parsers.ts +13 -0
  205. package/src/style/style-property.ts +229 -0
  206. package/src/style/style-sheet.ts +277 -0
  207. package/src/utils/create-graph.ts +38 -0
  208. package/src/utils/layer-utils.ts +23 -0
  209. package/src/utils/log.ts +9 -0
  210. package/src/utils/polygon-calculations.ts +154 -0
@@ -0,0 +1,116 @@
1
+ // deck.gl-community
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+ /* global importScripts GPU*/
5
+ importScripts('https://cdn.jsdelivr.net/npm/gpu.js@latest/dist/gpu-browser.js');
6
+ onmessage = function (event) {
7
+ const { nodes: sourceNodes, edges: sourceEdges } = event.data;
8
+ const { nBodyStrength, nBodyDistanceMin, nBodyDistanceMax, getCollisionRadius } = event.data.options;
9
+ // FIXME remove cpu mode
10
+ // @ts-expect-error TODO
11
+ const gpu = new GPU.GPU({
12
+ mode: 'cpu'
13
+ });
14
+ function getDistance(node1, node2) {
15
+ const dx = node1[1] - node2[1];
16
+ const dy = node1[2] - node2[2];
17
+ return Math.sqrt(dx * dx + dy * dy);
18
+ }
19
+ function isCollision(node1, node2, radius) {
20
+ return getDistance(node1, node2) < radius;
21
+ }
22
+ function forceCollide(nodes, currentNode, nodesSize, radius) {
23
+ let collisons = true;
24
+ while (collisons) {
25
+ collisons = false;
26
+ for (let i = 0; i < nodesSize; i++) {
27
+ while (nodes[i][0] !== currentNode[0] && isCollision(currentNode, nodes[i], radius)) {
28
+ collisons = true;
29
+ const xMove = currentNode[1] + Math.random() - 0.5;
30
+ currentNode[1] = currentNode[1] + xMove;
31
+ const yMove = currentNode[2] + Math.random() - 0.5;
32
+ currentNode[2] = currentNode[2] + yMove;
33
+ }
34
+ }
35
+ }
36
+ return [currentNode[1], currentNode[2]];
37
+ }
38
+ // FIXME correct lint errors
39
+ // eslint-disable-next-line max-params
40
+ function forceLink(nodes, edges, currentNode, nodesSize, edgesSize, radius) {
41
+ let x1 = currentNode[1];
42
+ let y1 = currentNode[2];
43
+ for (let i = 0; i < edgesSize; i++) {
44
+ const edge = edges[i];
45
+ if (edge[0] === currentNode[0] || edge[1] === currentNode[0]) {
46
+ const otherNodeId = edge[0] === currentNode[0] ? edge[1] : edge[0];
47
+ // FIXME: deal with the fact that GPUjs doesn't like array.find or undefined
48
+ for (let j = 0; j < nodesSize; j++) {
49
+ // eslint-disable-next-line max-depth
50
+ if (nodes[i][0] === otherNodeId) {
51
+ const otherNode = nodes[j];
52
+ const x2 = otherNode[1];
53
+ const y2 = otherNode[2];
54
+ const dx = x1 - x2;
55
+ const dy = y1 - y2;
56
+ const distance = Math.sqrt(dx * dx + dy * dy);
57
+ const force = 1;
58
+ // eslint-disable-next-line max-depth
59
+ if (distance > radius + force) {
60
+ x1 = dx > 0 ? x1 - force / 2 : x1 + force / 2;
61
+ y1 = dy > 0 ? y1 - force / 2 : y1 + force / 2;
62
+ }
63
+ }
64
+ }
65
+ }
66
+ }
67
+ return [x1, y1];
68
+ }
69
+ gpu.addFunction(forceCollide);
70
+ gpu.addFunction(forceLink);
71
+ gpu.addFunction(isCollision);
72
+ gpu.addFunction(getDistance);
73
+ const kernel = gpu.createKernel(function (kernelNodes, kernelEdges) {
74
+ const currentNode = kernelNodes[this.thread.x];
75
+ forceCollide(kernelNodes, currentNode, this.constants.nodesSize, this.constants.collisionRadius);
76
+ const forceLinkResult = forceLink(kernelNodes, kernelEdges, currentNode, this.constants.nodesSize, this.constants.edgesSize, this.constants.collisionRadius);
77
+ currentNode[1] = forceLinkResult[0];
78
+ currentNode[2] = forceLinkResult[1];
79
+ return [currentNode[1], currentNode[2]];
80
+ }, {
81
+ constants: {
82
+ nodesSize: sourceNodes.length,
83
+ edgesSize: sourceEdges.length,
84
+ collisionRadius: getCollisionRadius,
85
+ nBodyStrength,
86
+ nBodyDistanceMin,
87
+ nBodyDistanceMax
88
+ },
89
+ output: [sourceNodes.length]
90
+ });
91
+ const tempNodes = sourceNodes.map((node) => [node.id, node.x, node.y, node.locked ? 1 : 0]);
92
+ const tempEdges = sourceEdges.map((edge) => [edge.source.id, edge.target.id]);
93
+ kernel(tempNodes, tempEdges);
94
+ const newNodes = sourceNodes.map((node, index) => {
95
+ const updatedNode = tempNodes.find((n) => n[0] === node.id);
96
+ return {
97
+ ...node,
98
+ x: updatedNode[1],
99
+ y: updatedNode[2]
100
+ };
101
+ });
102
+ const newEdges = sourceEdges.map((edge) => {
103
+ return {
104
+ ...edge,
105
+ source: newNodes.find((node) => node.id === edge.source.id),
106
+ target: newNodes.find((node) => node.id === edge.target.id)
107
+ };
108
+ });
109
+ postMessage({
110
+ type: 'end',
111
+ nodes: newNodes,
112
+ edges: newEdges
113
+ });
114
+ // FIXME cleanup per gpu documentation
115
+ this.self.close();
116
+ };
@@ -0,0 +1,22 @@
1
+ import { BaseLayout } from '../../core/base-layout';
2
+ import { Node } from '../../core/node';
3
+ import { Graph } from '../../core/graph';
4
+ type AccessorVec2 = (node: Node) => [number, number];
5
+ export declare class SimpleLayout extends BaseLayout {
6
+ protected readonly _name = "SimpleLayout";
7
+ protected _graph: Graph | null;
8
+ protected _nodeMap: Record<string, Node>;
9
+ protected _nodePositionMap: Record<string, AccessorVec2>;
10
+ constructor(options?: {});
11
+ initializeGraph(graph: Graph): void;
12
+ _notifyLayoutComplete(): void;
13
+ start(): void;
14
+ update(): void;
15
+ resume(): void;
16
+ updateGraph(graph: Graph): void;
17
+ setNodePositionAccessor: (accessor: any) => void;
18
+ getNodePosition: (node: any) => any;
19
+ getEdgePosition: (edge: any) => any;
20
+ lockNodePosition: (node: any, x: any, y: any) => void;
21
+ }
22
+ export {};
@@ -0,0 +1,64 @@
1
+ // deck.gl-community
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+ import { BaseLayout } from '../../core/base-layout';
5
+ import { EDGE_TYPE } from '../../core/constants';
6
+ const defaultOptions = {
7
+ nodePositionAccessor: (node) => [node.getPropertyValue('x'), node.getPropertyValue('y')]
8
+ };
9
+ export class SimpleLayout extends BaseLayout {
10
+ _name = 'SimpleLayout';
11
+ _graph = null;
12
+ _nodeMap = {};
13
+ _nodePositionMap = {};
14
+ constructor(options = {}) {
15
+ super({ ...defaultOptions, ...options });
16
+ }
17
+ initializeGraph(graph) {
18
+ this.updateGraph(graph);
19
+ }
20
+ _notifyLayoutComplete() {
21
+ this._onLayoutStart();
22
+ this._onLayoutChange();
23
+ this._onLayoutDone();
24
+ }
25
+ start() {
26
+ this._notifyLayoutComplete();
27
+ }
28
+ update() {
29
+ this._notifyLayoutComplete();
30
+ }
31
+ resume() {
32
+ this._notifyLayoutComplete();
33
+ }
34
+ updateGraph(graph) {
35
+ this._graph = graph;
36
+ this._nodeMap = graph.getNodes().reduce((res, node) => {
37
+ res[node.getId()] = node;
38
+ return res;
39
+ }, {});
40
+ this._nodePositionMap = graph.getNodes().reduce((res, node) => {
41
+ res[node.getId()] = this._options.nodePositionAccessor(node);
42
+ return res;
43
+ }, {});
44
+ }
45
+ setNodePositionAccessor = (accessor) => {
46
+ this._options.nodePositionAccessor = accessor;
47
+ };
48
+ getNodePosition = (node) => this._nodePositionMap[node.getId()];
49
+ getEdgePosition = (edge) => {
50
+ const sourcePos = this._nodePositionMap[edge.getSourceNodeId()];
51
+ const targetPos = this._nodePositionMap[edge.getTargetNodeId()];
52
+ return {
53
+ type: EDGE_TYPE.LINE,
54
+ sourcePosition: sourcePos,
55
+ targetPosition: targetPos,
56
+ controlPoints: []
57
+ };
58
+ };
59
+ lockNodePosition = (node, x, y) => {
60
+ this._nodePositionMap[node.getId()] = [x, y];
61
+ this._onLayoutChange();
62
+ this._onLayoutDone();
63
+ };
64
+ }
@@ -0,0 +1,6 @@
1
+ export declare function basicEdgeParser(edge: any): {
2
+ id: any;
3
+ directed: any;
4
+ sourceId: any;
5
+ targetId: any;
6
+ };
@@ -0,0 +1,17 @@
1
+ // deck.gl-community
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+ import { log } from '../utils/log';
5
+ export function basicEdgeParser(edge) {
6
+ const { id, directed, sourceId, targetId } = edge;
7
+ if (sourceId === undefined || targetId === undefined) {
8
+ log.error('Invalid edge: sourceId or targetId is missing.')();
9
+ return null;
10
+ }
11
+ return {
12
+ id,
13
+ directed: directed || false,
14
+ sourceId,
15
+ targetId
16
+ };
17
+ }
@@ -0,0 +1,7 @@
1
+ import { basicNodeParser } from './node-parsers';
2
+ import { basicEdgeParser } from './edge-parsers';
3
+ export declare const JSONLoader: ({ json, nodeParser, edgeParser }: {
4
+ json: any;
5
+ nodeParser?: typeof basicNodeParser;
6
+ edgeParser?: typeof basicEdgeParser;
7
+ }) => import("..").Graph;
@@ -0,0 +1,16 @@
1
+ // deck.gl-community
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+ import { createGraph } from '../utils/create-graph';
5
+ import { basicNodeParser } from './node-parsers';
6
+ import { basicEdgeParser } from './edge-parsers';
7
+ import { log } from '../utils/log';
8
+ export const JSONLoader = ({ json, nodeParser = basicNodeParser, edgeParser = basicEdgeParser }) => {
9
+ const { name = 'default', nodes, edges } = json;
10
+ if (!nodes) {
11
+ log.error('Invalid graph: nodes is missing.')();
12
+ return null;
13
+ }
14
+ const graph = createGraph({ name, nodes, edges, nodeParser, edgeParser });
15
+ return graph;
16
+ };
@@ -0,0 +1,3 @@
1
+ export declare function basicNodeParser(node: any): {
2
+ id: any;
3
+ };
@@ -0,0 +1,11 @@
1
+ // deck.gl-community
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+ import { log } from '../utils/log';
5
+ export function basicNodeParser(node) {
6
+ if (node.id === undefined) {
7
+ log.error('Invalid node: id is missing.')();
8
+ return null;
9
+ }
10
+ return { id: node.id };
11
+ }
@@ -0,0 +1,14 @@
1
+ export declare class StyleProperty {
2
+ key: any;
3
+ _updateTrigger: boolean;
4
+ _value: any;
5
+ _valueType: any;
6
+ static getDefault(key: any): any;
7
+ constructor({ key, value, updateTrigger }: {
8
+ key: any;
9
+ value: any;
10
+ updateTrigger: any;
11
+ });
12
+ getValue(): any;
13
+ getUpdateTrigger(): boolean;
14
+ }
@@ -0,0 +1,195 @@
1
+ // deck.gl-community
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+ import Color from 'color';
5
+ import { log } from '../utils/log';
6
+ /* Utils for type check */
7
+ function getColor(value) {
8
+ if (typeof value === 'string') {
9
+ try {
10
+ const color = Color.rgb(value).array();
11
+ if (Number.isFinite(color[3])) {
12
+ color[3] *= 255;
13
+ }
14
+ return color;
15
+ }
16
+ catch (error) {
17
+ return [0, 0, 0];
18
+ }
19
+ }
20
+ if (Array.isArray(value) && Number.isFinite(value[0])) {
21
+ return value;
22
+ }
23
+ return [0, 0, 0];
24
+ }
25
+ function getNumber(value) {
26
+ switch (typeof value) {
27
+ case 'string':
28
+ value = Number(value);
29
+ return isNaN(value) ? null : value;
30
+ case 'number':
31
+ return value;
32
+ default:
33
+ return null;
34
+ }
35
+ }
36
+ function getBool(value) {
37
+ switch (typeof value) {
38
+ case 'boolean':
39
+ return value;
40
+ case 'string':
41
+ return value.toLowerCase() !== 'false';
42
+ case 'number':
43
+ return Boolean(value);
44
+ default:
45
+ return null;
46
+ }
47
+ }
48
+ function getOffset(value) {
49
+ if (typeof value === 'function') {
50
+ return value;
51
+ }
52
+ if (!Array.isArray(value) || value.length !== 2) {
53
+ return null;
54
+ }
55
+ return value.map(getNumber);
56
+ }
57
+ const IDENTITY = (x) => x;
58
+ const PROPERTY_FORMATTERS = {
59
+ opacity: getNumber,
60
+ zIndex: getNumber,
61
+ width: getNumber,
62
+ height: getNumber,
63
+ radius: getNumber,
64
+ fill: getColor,
65
+ stroke: getColor,
66
+ strokeWidth: getNumber,
67
+ // for marker
68
+ marker: String,
69
+ size: getNumber,
70
+ // text
71
+ color: getColor,
72
+ text: String,
73
+ fontSize: getNumber,
74
+ textAnchor: String,
75
+ alignmentBaseline: String,
76
+ angle: getNumber,
77
+ textMaxWidth: getNumber,
78
+ textWordBreak: String,
79
+ textSizeMinPixels: getNumber,
80
+ // edges
81
+ speed: getNumber,
82
+ tailLength: getNumber,
83
+ offset: getOffset,
84
+ scaleWithZoom: getBool
85
+ };
86
+ const DEFAULT_STYLES = {
87
+ opacity: 1,
88
+ zIndex: 0,
89
+ width: 0,
90
+ height: 0,
91
+ radius: 1,
92
+ fill: [0, 0, 0],
93
+ stroke: [0, 0, 0],
94
+ strokeWidth: 0,
95
+ marker: 'circle',
96
+ size: 12,
97
+ color: [0, 0, 0],
98
+ text: '',
99
+ fontSize: 12,
100
+ textAnchor: 'middle',
101
+ alignmentBaseline: 'center',
102
+ angle: 0,
103
+ textMaxWidth: -1,
104
+ textWordBreak: 'break-all',
105
+ textSizeMinPixels: 9,
106
+ speed: 0,
107
+ tailLength: 1,
108
+ offset: null,
109
+ scaleWithZoom: true
110
+ };
111
+ // code generation: generate a function as a layer accessor
112
+ function generateAccessor(key, value) {
113
+ const formatter = PROPERTY_FORMATTERS[key] || IDENTITY;
114
+ // ex: key = 'fill', value = {defaut: 'red', hover: 'blue'}
115
+ // valueMap => {defaut: [255, 0, 0], hover: [0, 0, 255]}
116
+ const valueMap = Object.keys(value).reduce((res, key0) => {
117
+ res[key0] = value[key0];
118
+ return res;
119
+ }, {});
120
+ return (node) => {
121
+ const statefulValue = valueMap[node.state];
122
+ if (!node.state || typeof statefulValue === 'undefined') {
123
+ return valueMap.default || DEFAULT_STYLES[key];
124
+ }
125
+ // else has stateful value
126
+ // check if the value is a function
127
+ if (typeof statefulValue === 'function') {
128
+ return formatter(statefulValue(node));
129
+ }
130
+ // or just a plain value
131
+ return formatter(statefulValue);
132
+ };
133
+ }
134
+ const VALUE_TYPE = {
135
+ ACCESSOR: 'ACCESSOR',
136
+ PLAIN_VALUE: 'PLAIN_VALUE'
137
+ };
138
+ export class StyleProperty {
139
+ key;
140
+ _updateTrigger;
141
+ _value;
142
+ _valueType;
143
+ // for getting default style
144
+ static getDefault(key) {
145
+ return DEFAULT_STYLES[key];
146
+ }
147
+ // pass the key and value of the property
148
+ // and format the value properly.
149
+ constructor({ key, value, updateTrigger }) {
150
+ this.key = key;
151
+ this._updateTrigger = false;
152
+ // statefule property, ex:
153
+ // fill: {default: 'red', hover: 'blue'}
154
+ // note that offset: [0, 1], the type of array is object, too.
155
+ if (typeof value === 'object' && !Array.isArray(value)) {
156
+ // generate accessor function
157
+ this._value = generateAccessor(key, value);
158
+ this._valueType = VALUE_TYPE.ACCESSOR;
159
+ this._updateTrigger = updateTrigger;
160
+ }
161
+ // default state property, but value = accessor
162
+ // fill: () => 'red'
163
+ else if (typeof value === 'function') {
164
+ const formatter = PROPERTY_FORMATTERS[key] || IDENTITY;
165
+ // the output of the function should be formated by
166
+ // the corresponding formatter again.
167
+ // Ex: colorAccessor might return '#f00', which needs to
168
+ // be formated as [255, 0, 0];
169
+ this._value = (d) => formatter(value(d));
170
+ this._valueType = VALUE_TYPE.ACCESSOR;
171
+ this._updateTrigger = value;
172
+ }
173
+ // default state property with plain value:
174
+ // fill: 'red'
175
+ else {
176
+ // format the value properly
177
+ const formatter = PROPERTY_FORMATTERS[key] || IDENTITY;
178
+ this._value = formatter(value);
179
+ this._valueType = VALUE_TYPE.PLAIN_VALUE;
180
+ this._updateTrigger = false;
181
+ }
182
+ // sanity check
183
+ if (this._value === null) {
184
+ log.warn(`Invalid ${key} value: ${value}`)();
185
+ throw new Error(`Invalid ${key} value: ${value}`);
186
+ }
187
+ }
188
+ // get the formatted value
189
+ getValue() {
190
+ return this._value;
191
+ }
192
+ getUpdateTrigger() {
193
+ return this._updateTrigger;
194
+ }
195
+ }
@@ -0,0 +1,10 @@
1
+ export declare class Stylesheet {
2
+ type: any;
3
+ properties: any;
4
+ constructor(style: any, updateTriggers: any);
5
+ _getProperty(deckglAccessor: any): any;
6
+ getDeckGLAccessor(deckglAccessor: any): any;
7
+ getDeckGLAccessorUpdateTrigger(deckglAccessor: any): any;
8
+ getDeckGLAccessors(): {};
9
+ getDeckGLUpdateTriggers(): {};
10
+ }