@yh-ui/flow 0.1.21

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/LICENSE +21 -0
  2. package/README.md +234 -0
  3. package/dist/Flow.d.vue.ts +306 -0
  4. package/dist/Flow.vue +959 -0
  5. package/dist/Flow.vue.d.ts +306 -0
  6. package/dist/__tests__/ai-workflow.ssr.test.cjs +352 -0
  7. package/dist/__tests__/ai-workflow.ssr.test.d.ts +1 -0
  8. package/dist/__tests__/ai-workflow.ssr.test.mjs +283 -0
  9. package/dist/__tests__/ai-workflow.test.cjs +109 -0
  10. package/dist/__tests__/ai-workflow.test.d.ts +1 -0
  11. package/dist/__tests__/ai-workflow.test.mjs +112 -0
  12. package/dist/__tests__/bpmn.ssr.test.cjs +278 -0
  13. package/dist/__tests__/bpmn.ssr.test.d.ts +1 -0
  14. package/dist/__tests__/bpmn.ssr.test.mjs +237 -0
  15. package/dist/__tests__/bpmn.test.cjs +103 -0
  16. package/dist/__tests__/bpmn.test.d.ts +1 -0
  17. package/dist/__tests__/bpmn.test.mjs +106 -0
  18. package/dist/__tests__/custom-types.test.cjs +300 -0
  19. package/dist/__tests__/custom-types.test.d.ts +1 -0
  20. package/dist/__tests__/custom-types.test.mjs +248 -0
  21. package/dist/__tests__/edge.test.cjs +56 -0
  22. package/dist/__tests__/edge.test.d.ts +1 -0
  23. package/dist/__tests__/edge.test.mjs +69 -0
  24. package/dist/__tests__/event-bus.test.cjs +80 -0
  25. package/dist/__tests__/event-bus.test.d.ts +1 -0
  26. package/dist/__tests__/event-bus.test.mjs +51 -0
  27. package/dist/__tests__/flow.ssr.test.cjs +156 -0
  28. package/dist/__tests__/flow.ssr.test.d.ts +1 -0
  29. package/dist/__tests__/flow.ssr.test.mjs +112 -0
  30. package/dist/__tests__/geometry.test.cjs +191 -0
  31. package/dist/__tests__/geometry.test.d.ts +1 -0
  32. package/dist/__tests__/geometry.test.mjs +105 -0
  33. package/dist/__tests__/graph.test.cjs +115 -0
  34. package/dist/__tests__/graph.test.d.ts +1 -0
  35. package/dist/__tests__/graph.test.mjs +85 -0
  36. package/dist/__tests__/history-plugin.test.cjs +191 -0
  37. package/dist/__tests__/history-plugin.test.d.ts +1 -0
  38. package/dist/__tests__/history-plugin.test.mjs +161 -0
  39. package/dist/__tests__/history.test.cjs +81 -0
  40. package/dist/__tests__/history.test.d.ts +1 -0
  41. package/dist/__tests__/history.test.mjs +43 -0
  42. package/dist/__tests__/layout.test.cjs +213 -0
  43. package/dist/__tests__/layout.test.d.ts +1 -0
  44. package/dist/__tests__/layout.test.mjs +170 -0
  45. package/dist/__tests__/node-edit-panel.ssr.test.cjs +168 -0
  46. package/dist/__tests__/node-edit-panel.ssr.test.d.ts +1 -0
  47. package/dist/__tests__/node-edit-panel.ssr.test.mjs +118 -0
  48. package/dist/__tests__/node-group-plugin.test.cjs +235 -0
  49. package/dist/__tests__/node-group-plugin.test.d.ts +1 -0
  50. package/dist/__tests__/node-group-plugin.test.mjs +187 -0
  51. package/dist/__tests__/node-handles.test.cjs +340 -0
  52. package/dist/__tests__/node-handles.test.d.ts +1 -0
  53. package/dist/__tests__/node-handles.test.mjs +230 -0
  54. package/dist/__tests__/plugin.test.cjs +151 -0
  55. package/dist/__tests__/plugin.test.d.ts +1 -0
  56. package/dist/__tests__/plugin.test.mjs +116 -0
  57. package/dist/__tests__/transform.test.cjs +58 -0
  58. package/dist/__tests__/transform.test.d.ts +1 -0
  59. package/dist/__tests__/transform.test.mjs +38 -0
  60. package/dist/__tests__/useAlignment.test.cjs +91 -0
  61. package/dist/__tests__/useAlignment.test.d.ts +1 -0
  62. package/dist/__tests__/useAlignment.test.mjs +52 -0
  63. package/dist/__tests__/useEdges.test.cjs +117 -0
  64. package/dist/__tests__/useEdges.test.d.ts +1 -0
  65. package/dist/__tests__/useEdges.test.mjs +80 -0
  66. package/dist/__tests__/useKeyboard.test.cjs +88 -0
  67. package/dist/__tests__/useKeyboard.test.d.ts +1 -0
  68. package/dist/__tests__/useKeyboard.test.mjs +56 -0
  69. package/dist/__tests__/useNodes.test.cjs +150 -0
  70. package/dist/__tests__/useNodes.test.d.ts +1 -0
  71. package/dist/__tests__/useNodes.test.mjs +80 -0
  72. package/dist/__tests__/useSelection.test.cjs +112 -0
  73. package/dist/__tests__/useSelection.test.d.ts +1 -0
  74. package/dist/__tests__/useSelection.test.mjs +76 -0
  75. package/dist/__tests__/useViewport.test.cjs +171 -0
  76. package/dist/__tests__/useViewport.test.d.ts +1 -0
  77. package/dist/__tests__/useViewport.test.mjs +82 -0
  78. package/dist/__tests__/utils/ssr.cjs +124 -0
  79. package/dist/__tests__/utils/ssr.d.ts +33 -0
  80. package/dist/__tests__/utils/ssr.mjs +129 -0
  81. package/dist/__tests__/validation.test.cjs +95 -0
  82. package/dist/__tests__/validation.test.d.ts +1 -0
  83. package/dist/__tests__/validation.test.mjs +36 -0
  84. package/dist/components/AiNodeEditPanel.d.vue.ts +13 -0
  85. package/dist/components/AiNodeEditPanel.vue +413 -0
  86. package/dist/components/AiNodeEditPanel.vue.d.ts +13 -0
  87. package/dist/components/EdgeEditPanel.d.vue.ts +14 -0
  88. package/dist/components/EdgeEditPanel.vue +205 -0
  89. package/dist/components/EdgeEditPanel.vue.d.ts +14 -0
  90. package/dist/components/NodeEditPanel.d.vue.ts +13 -0
  91. package/dist/components/NodeEditPanel.vue +214 -0
  92. package/dist/components/NodeEditPanel.vue.d.ts +13 -0
  93. package/dist/components/edges/BaseEdge.d.vue.ts +23 -0
  94. package/dist/components/edges/BaseEdge.vue +55 -0
  95. package/dist/components/edges/BaseEdge.vue.d.ts +23 -0
  96. package/dist/components/edges/BezierEdge.d.vue.ts +22 -0
  97. package/dist/components/edges/BezierEdge.vue +57 -0
  98. package/dist/components/edges/BezierEdge.vue.d.ts +22 -0
  99. package/dist/components/edges/DataFlowEdge.d.vue.ts +41 -0
  100. package/dist/components/edges/DataFlowEdge.vue +211 -0
  101. package/dist/components/edges/DataFlowEdge.vue.d.ts +41 -0
  102. package/dist/components/edges/SmoothEdge.d.vue.ts +22 -0
  103. package/dist/components/edges/SmoothEdge.vue +53 -0
  104. package/dist/components/edges/SmoothEdge.vue.d.ts +22 -0
  105. package/dist/components/edges/StepEdge.d.vue.ts +22 -0
  106. package/dist/components/edges/StepEdge.vue +42 -0
  107. package/dist/components/edges/StepEdge.vue.d.ts +22 -0
  108. package/dist/components/edges/index.cjs +41 -0
  109. package/dist/components/edges/index.d.ts +5 -0
  110. package/dist/components/edges/index.mjs +5 -0
  111. package/dist/components/nodes/BaseNode.d.vue.ts +25 -0
  112. package/dist/components/nodes/BaseNode.vue +93 -0
  113. package/dist/components/nodes/BaseNode.vue.d.ts +25 -0
  114. package/dist/components/nodes/CustomNode.d.vue.ts +36 -0
  115. package/dist/components/nodes/CustomNode.vue +44 -0
  116. package/dist/components/nodes/CustomNode.vue.d.ts +36 -0
  117. package/dist/components/nodes/DatabaseNode.d.vue.ts +19 -0
  118. package/dist/components/nodes/DatabaseNode.vue +62 -0
  119. package/dist/components/nodes/DatabaseNode.vue.d.ts +19 -0
  120. package/dist/components/nodes/DiamondNode.d.vue.ts +19 -0
  121. package/dist/components/nodes/DiamondNode.vue +62 -0
  122. package/dist/components/nodes/DiamondNode.vue.d.ts +19 -0
  123. package/dist/components/nodes/GroupNode.d.vue.ts +31 -0
  124. package/dist/components/nodes/GroupNode.vue +48 -0
  125. package/dist/components/nodes/GroupNode.vue.d.ts +31 -0
  126. package/dist/components/nodes/InputNode.d.vue.ts +23 -0
  127. package/dist/components/nodes/InputNode.vue +63 -0
  128. package/dist/components/nodes/InputNode.vue.d.ts +23 -0
  129. package/dist/components/nodes/NodeResizer.d.vue.ts +27 -0
  130. package/dist/components/nodes/NodeResizer.vue +89 -0
  131. package/dist/components/nodes/NodeResizer.vue.d.ts +27 -0
  132. package/dist/components/nodes/NodeToolbar.d.vue.ts +32 -0
  133. package/dist/components/nodes/NodeToolbar.vue +101 -0
  134. package/dist/components/nodes/NodeToolbar.vue.d.ts +32 -0
  135. package/dist/components/nodes/OutputNode.d.vue.ts +21 -0
  136. package/dist/components/nodes/OutputNode.vue +53 -0
  137. package/dist/components/nodes/OutputNode.vue.d.ts +21 -0
  138. package/dist/components/nodes/ai-workflow/AiAgentNode.d.vue.ts +20 -0
  139. package/dist/components/nodes/ai-workflow/AiAgentNode.vue +59 -0
  140. package/dist/components/nodes/ai-workflow/AiAgentNode.vue.d.ts +20 -0
  141. package/dist/components/nodes/ai-workflow/AiConditionNode.d.vue.ts +19 -0
  142. package/dist/components/nodes/ai-workflow/AiConditionNode.vue +65 -0
  143. package/dist/components/nodes/ai-workflow/AiConditionNode.vue.d.ts +19 -0
  144. package/dist/components/nodes/ai-workflow/AiEndNode.d.vue.ts +19 -0
  145. package/dist/components/nodes/ai-workflow/AiEndNode.vue +47 -0
  146. package/dist/components/nodes/ai-workflow/AiEndNode.vue.d.ts +19 -0
  147. package/dist/components/nodes/ai-workflow/AiLlmNode.d.vue.ts +19 -0
  148. package/dist/components/nodes/ai-workflow/AiLlmNode.vue +64 -0
  149. package/dist/components/nodes/ai-workflow/AiLlmNode.vue.d.ts +19 -0
  150. package/dist/components/nodes/ai-workflow/AiMemoryNode.d.vue.ts +19 -0
  151. package/dist/components/nodes/ai-workflow/AiMemoryNode.vue +59 -0
  152. package/dist/components/nodes/ai-workflow/AiMemoryNode.vue.d.ts +19 -0
  153. package/dist/components/nodes/ai-workflow/AiPromptNode.d.vue.ts +19 -0
  154. package/dist/components/nodes/ai-workflow/AiPromptNode.vue +61 -0
  155. package/dist/components/nodes/ai-workflow/AiPromptNode.vue.d.ts +19 -0
  156. package/dist/components/nodes/ai-workflow/AiStartNode.d.vue.ts +19 -0
  157. package/dist/components/nodes/ai-workflow/AiStartNode.vue +47 -0
  158. package/dist/components/nodes/ai-workflow/AiStartNode.vue.d.ts +19 -0
  159. package/dist/components/nodes/ai-workflow/AiToolNode.d.vue.ts +19 -0
  160. package/dist/components/nodes/ai-workflow/AiToolNode.vue +59 -0
  161. package/dist/components/nodes/ai-workflow/AiToolNode.vue.d.ts +19 -0
  162. package/dist/components/nodes/ai-workflow/index.cjs +109 -0
  163. package/dist/components/nodes/ai-workflow/index.d.ts +23 -0
  164. package/dist/components/nodes/ai-workflow/index.mjs +37 -0
  165. package/dist/components/nodes/bpmn/BpmnEndEvent.d.vue.ts +19 -0
  166. package/dist/components/nodes/bpmn/BpmnEndEvent.vue +50 -0
  167. package/dist/components/nodes/bpmn/BpmnEndEvent.vue.d.ts +19 -0
  168. package/dist/components/nodes/bpmn/BpmnExclusiveGateway.d.vue.ts +19 -0
  169. package/dist/components/nodes/bpmn/BpmnExclusiveGateway.vue +60 -0
  170. package/dist/components/nodes/bpmn/BpmnExclusiveGateway.vue.d.ts +19 -0
  171. package/dist/components/nodes/bpmn/BpmnInclusiveGateway.d.vue.ts +19 -0
  172. package/dist/components/nodes/bpmn/BpmnInclusiveGateway.vue +60 -0
  173. package/dist/components/nodes/bpmn/BpmnInclusiveGateway.vue.d.ts +19 -0
  174. package/dist/components/nodes/bpmn/BpmnParallelGateway.d.vue.ts +19 -0
  175. package/dist/components/nodes/bpmn/BpmnParallelGateway.vue +60 -0
  176. package/dist/components/nodes/bpmn/BpmnParallelGateway.vue.d.ts +19 -0
  177. package/dist/components/nodes/bpmn/BpmnServiceTask.d.vue.ts +19 -0
  178. package/dist/components/nodes/bpmn/BpmnServiceTask.vue +55 -0
  179. package/dist/components/nodes/bpmn/BpmnServiceTask.vue.d.ts +19 -0
  180. package/dist/components/nodes/bpmn/BpmnStartEvent.d.vue.ts +19 -0
  181. package/dist/components/nodes/bpmn/BpmnStartEvent.vue +50 -0
  182. package/dist/components/nodes/bpmn/BpmnStartEvent.vue.d.ts +19 -0
  183. package/dist/components/nodes/bpmn/BpmnTask.d.vue.ts +19 -0
  184. package/dist/components/nodes/bpmn/BpmnTask.vue +54 -0
  185. package/dist/components/nodes/bpmn/BpmnTask.vue.d.ts +19 -0
  186. package/dist/components/nodes/bpmn/BpmnUserTask.d.vue.ts +19 -0
  187. package/dist/components/nodes/bpmn/BpmnUserTask.vue +55 -0
  188. package/dist/components/nodes/bpmn/BpmnUserTask.vue.d.ts +19 -0
  189. package/dist/components/nodes/bpmn/index.cjs +109 -0
  190. package/dist/components/nodes/bpmn/index.d.ts +23 -0
  191. package/dist/components/nodes/bpmn/index.mjs +37 -0
  192. package/dist/components/nodes/index.cjs +246 -0
  193. package/dist/components/nodes/index.d.ts +13 -0
  194. package/dist/components/nodes/index.mjs +44 -0
  195. package/dist/core/FlowContext.cjs +21 -0
  196. package/dist/core/FlowContext.d.ts +10 -0
  197. package/dist/core/FlowContext.mjs +13 -0
  198. package/dist/core/index.cjs +104 -0
  199. package/dist/core/index.d.ts +9 -0
  200. package/dist/core/index.mjs +9 -0
  201. package/dist/core/useAlignment.cjs +81 -0
  202. package/dist/core/useAlignment.d.ts +33 -0
  203. package/dist/core/useAlignment.mjs +71 -0
  204. package/dist/core/useEdges.cjs +132 -0
  205. package/dist/core/useEdges.d.ts +29 -0
  206. package/dist/core/useEdges.mjs +89 -0
  207. package/dist/core/useFlow.cjs +40 -0
  208. package/dist/core/useFlow.d.ts +31 -0
  209. package/dist/core/useFlow.mjs +32 -0
  210. package/dist/core/useHistory.cjs +63 -0
  211. package/dist/core/useHistory.d.ts +15 -0
  212. package/dist/core/useHistory.mjs +54 -0
  213. package/dist/core/useKeyboard.cjs +54 -0
  214. package/dist/core/useKeyboard.d.ts +18 -0
  215. package/dist/core/useKeyboard.mjs +45 -0
  216. package/dist/core/useNodeDistribution.cjs +171 -0
  217. package/dist/core/useNodeDistribution.d.ts +12 -0
  218. package/dist/core/useNodeDistribution.mjs +145 -0
  219. package/dist/core/useNodes.cjs +146 -0
  220. package/dist/core/useNodes.d.ts +26 -0
  221. package/dist/core/useNodes.mjs +101 -0
  222. package/dist/core/useSelection.cjs +83 -0
  223. package/dist/core/useSelection.d.ts +18 -0
  224. package/dist/core/useSelection.mjs +53 -0
  225. package/dist/core/useViewport.cjs +157 -0
  226. package/dist/core/useViewport.d.ts +65 -0
  227. package/dist/core/useViewport.mjs +125 -0
  228. package/dist/flow.cjs +240 -0
  229. package/dist/flow.d.ts +276 -0
  230. package/dist/flow.mjs +230 -0
  231. package/dist/index.cjs +378 -0
  232. package/dist/index.d.ts +28 -0
  233. package/dist/index.mjs +50 -0
  234. package/dist/plugins/index.cjs +96 -0
  235. package/dist/plugins/index.d.ts +34 -0
  236. package/dist/plugins/index.mjs +47 -0
  237. package/dist/plugins/plugin.cjs +117 -0
  238. package/dist/plugins/plugin.d.ts +72 -0
  239. package/dist/plugins/plugin.mjs +110 -0
  240. package/dist/plugins/plugins/controls.cjs +38 -0
  241. package/dist/plugins/plugins/controls.d.ts +12 -0
  242. package/dist/plugins/plugins/controls.mjs +28 -0
  243. package/dist/plugins/plugins/export.cjs +102 -0
  244. package/dist/plugins/plugins/export.d.ts +12 -0
  245. package/dist/plugins/plugins/export.mjs +89 -0
  246. package/dist/plugins/plugins/grid.cjs +36 -0
  247. package/dist/plugins/plugins/grid.d.ts +11 -0
  248. package/dist/plugins/plugins/grid.mjs +26 -0
  249. package/dist/plugins/plugins/history.cjs +140 -0
  250. package/dist/plugins/plugins/history.d.ts +53 -0
  251. package/dist/plugins/plugins/history.mjs +132 -0
  252. package/dist/plugins/plugins/index.cjs +104 -0
  253. package/dist/plugins/plugins/index.d.ts +9 -0
  254. package/dist/plugins/plugins/index.mjs +9 -0
  255. package/dist/plugins/plugins/keyboard.cjs +27 -0
  256. package/dist/plugins/plugins/keyboard.d.ts +10 -0
  257. package/dist/plugins/plugins/keyboard.mjs +18 -0
  258. package/dist/plugins/plugins/layout.cjs +275 -0
  259. package/dist/plugins/plugins/layout.d.ts +34 -0
  260. package/dist/plugins/plugins/layout.mjs +246 -0
  261. package/dist/plugins/plugins/minimap.cjs +60 -0
  262. package/dist/plugins/plugins/minimap.d.ts +25 -0
  263. package/dist/plugins/plugins/minimap.mjs +50 -0
  264. package/dist/plugins/plugins/node-group.cjs +209 -0
  265. package/dist/plugins/plugins/node-group.d.ts +26 -0
  266. package/dist/plugins/plugins/node-group.mjs +178 -0
  267. package/dist/plugins/plugins/snap.cjs +36 -0
  268. package/dist/plugins/plugins/snap.d.ts +12 -0
  269. package/dist/plugins/plugins/snap.mjs +26 -0
  270. package/dist/renderer/AlignmentLines.d.vue.ts +5 -0
  271. package/dist/renderer/AlignmentLines.vue +113 -0
  272. package/dist/renderer/AlignmentLines.vue.d.ts +5 -0
  273. package/dist/renderer/Background.d.vue.ts +7 -0
  274. package/dist/renderer/Background.vue +86 -0
  275. package/dist/renderer/Background.vue.d.ts +7 -0
  276. package/dist/renderer/Controls.d.vue.ts +13 -0
  277. package/dist/renderer/Controls.vue +82 -0
  278. package/dist/renderer/Controls.vue.d.ts +13 -0
  279. package/dist/renderer/EdgeHandlesRenderer.d.vue.ts +11 -0
  280. package/dist/renderer/EdgeHandlesRenderer.vue +75 -0
  281. package/dist/renderer/EdgeHandlesRenderer.vue.d.ts +11 -0
  282. package/dist/renderer/EdgeRenderer.d.vue.ts +39 -0
  283. package/dist/renderer/EdgeRenderer.vue +204 -0
  284. package/dist/renderer/EdgeRenderer.vue.d.ts +39 -0
  285. package/dist/renderer/FlowBackground.d.vue.ts +11 -0
  286. package/dist/renderer/FlowBackground.vue +82 -0
  287. package/dist/renderer/FlowBackground.vue.d.ts +11 -0
  288. package/dist/renderer/Minimap.d.vue.ts +30 -0
  289. package/dist/renderer/Minimap.vue +290 -0
  290. package/dist/renderer/Minimap.vue.d.ts +30 -0
  291. package/dist/renderer/NodeRenderer.d.vue.ts +56 -0
  292. package/dist/renderer/NodeRenderer.vue +328 -0
  293. package/dist/renderer/NodeRenderer.vue.d.ts +56 -0
  294. package/dist/renderer/SelectionBox.d.vue.ts +11 -0
  295. package/dist/renderer/SelectionBox.vue +28 -0
  296. package/dist/renderer/SelectionBox.vue.d.ts +11 -0
  297. package/dist/types/edge.cjs +13 -0
  298. package/dist/types/edge.d.ts +65 -0
  299. package/dist/types/edge.mjs +6 -0
  300. package/dist/types/events.cjs +1 -0
  301. package/dist/types/events.d.ts +115 -0
  302. package/dist/types/events.mjs +0 -0
  303. package/dist/types/index.cjs +1 -0
  304. package/dist/types/index.d.ts +366 -0
  305. package/dist/types/index.mjs +0 -0
  306. package/dist/types/node.cjs +9 -0
  307. package/dist/types/node.d.ts +90 -0
  308. package/dist/types/node.mjs +3 -0
  309. package/dist/types/viewport.cjs +42 -0
  310. package/dist/types/viewport.d.ts +62 -0
  311. package/dist/types/viewport.mjs +36 -0
  312. package/dist/utils/bpmn-engine.cjs +390 -0
  313. package/dist/utils/bpmn-engine.d.ts +164 -0
  314. package/dist/utils/bpmn-engine.mjs +378 -0
  315. package/dist/utils/bpmn.cjs +492 -0
  316. package/dist/utils/bpmn.d.ts +53 -0
  317. package/dist/utils/bpmn.mjs +430 -0
  318. package/dist/utils/collaboration.cjs +537 -0
  319. package/dist/utils/collaboration.d.ts +189 -0
  320. package/dist/utils/collaboration.mjs +521 -0
  321. package/dist/utils/custom-types.cjs +138 -0
  322. package/dist/utils/custom-types.d.ts +78 -0
  323. package/dist/utils/custom-types.mjs +108 -0
  324. package/dist/utils/edge.cjs +235 -0
  325. package/dist/utils/edge.d.ts +79 -0
  326. package/dist/utils/edge.mjs +172 -0
  327. package/dist/utils/event-bus.cjs +91 -0
  328. package/dist/utils/event-bus.d.ts +39 -0
  329. package/dist/utils/event-bus.mjs +82 -0
  330. package/dist/utils/geometry.cjs +178 -0
  331. package/dist/utils/geometry.d.ts +186 -0
  332. package/dist/utils/geometry.mjs +144 -0
  333. package/dist/utils/graph.cjs +158 -0
  334. package/dist/utils/graph.d.ts +40 -0
  335. package/dist/utils/graph.mjs +147 -0
  336. package/dist/utils/index.cjs +137 -0
  337. package/dist/utils/index.d.ts +12 -0
  338. package/dist/utils/index.mjs +12 -0
  339. package/dist/utils/performance.cjs +94 -0
  340. package/dist/utils/performance.d.ts +18 -0
  341. package/dist/utils/performance.mjs +82 -0
  342. package/dist/utils/screenshot.cjs +87 -0
  343. package/dist/utils/screenshot.d.ts +22 -0
  344. package/dist/utils/screenshot.mjs +66 -0
  345. package/dist/utils/theme.cjs +228 -0
  346. package/dist/utils/theme.d.ts +92 -0
  347. package/dist/utils/theme.mjs +217 -0
  348. package/dist/utils/transform.cjs +76 -0
  349. package/dist/utils/transform.d.ts +45 -0
  350. package/dist/utils/transform.mjs +57 -0
  351. package/dist/utils/validation.cjs +107 -0
  352. package/dist/utils/validation.d.ts +29 -0
  353. package/dist/utils/validation.mjs +85 -0
  354. package/package.json +61 -0
@@ -0,0 +1,537 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.FlowCollaborationEngine = void 0;
7
+ exports.createCollaborationEngine = createCollaborationEngine;
8
+ class FlowCollaborationEngine {
9
+ roomId = "";
10
+ userId = "";
11
+ userName = "";
12
+ userColor = "";
13
+ state;
14
+ ws = null;
15
+ connectionState = "disconnected";
16
+ eventListeners = /* @__PURE__ */new Map();
17
+ reconnectAttempts = 0;
18
+ maxReconnectAttempts = 5;
19
+ reconnectDelay = 1e3;
20
+ pingInterval = null;
21
+ pendingOperations = /* @__PURE__ */new Map();
22
+ versionVector = /* @__PURE__ */new Map();
23
+ // 用户光标信息
24
+ cursors = /* @__PURE__ */new Map();
25
+ constructor() {
26
+ this.state = {
27
+ nodes: /* @__PURE__ */new Map(),
28
+ edges: /* @__PURE__ */new Map(),
29
+ viewport: {
30
+ x: 0,
31
+ y: 0,
32
+ zoom: 1
33
+ },
34
+ version: 0,
35
+ pendingOps: [],
36
+ acknowledgedOps: []
37
+ };
38
+ }
39
+ /**
40
+ * 连接到协作房间
41
+ */
42
+ async connect(options) {
43
+ const {
44
+ serverUrl,
45
+ roomId,
46
+ userId,
47
+ userName,
48
+ initialNodes = [],
49
+ initialEdges = []
50
+ } = options;
51
+ this.roomId = roomId;
52
+ this.userId = userId;
53
+ this.userName = userName;
54
+ this.userColor = this.generateUserColor(userId);
55
+ this.state.nodes = new Map(initialNodes.map(n => [n.id, n]));
56
+ this.state.edges = new Map(initialEdges.map(e => [e.id, e]));
57
+ return new Promise((resolve, reject) => {
58
+ try {
59
+ this.setConnectionState("connecting");
60
+ this.ws = new WebSocket(serverUrl);
61
+ this.ws.onopen = () => {
62
+ this.setConnectionState("connected");
63
+ this.reconnectAttempts = 0;
64
+ this.send({
65
+ type: "join",
66
+ roomId: this.roomId,
67
+ userId: this.userId,
68
+ payload: {
69
+ userName: this.userName,
70
+ userColor: this.userColor,
71
+ nodes: initialNodes,
72
+ edges: initialEdges
73
+ },
74
+ timestamp: Date.now()
75
+ });
76
+ this.startPing();
77
+ resolve();
78
+ };
79
+ this.ws.onmessage = event => {
80
+ const {
81
+ data
82
+ } = event;
83
+ if (typeof data !== "string") return;
84
+ try {
85
+ const message = JSON.parse(data);
86
+ if (this.isValidWSMessage(message)) {
87
+ this.handleMessage(message);
88
+ }
89
+ } catch {}
90
+ };
91
+ this.ws.onerror = error => {
92
+ console.error("WebSocket error:", error);
93
+ this.emitEvent("error", {
94
+ type: "error",
95
+ error,
96
+ timestamp: Date.now()
97
+ });
98
+ };
99
+ this.ws.onclose = () => {
100
+ this.setConnectionState("disconnected");
101
+ this.stopPing();
102
+ this.handleDisconnect();
103
+ };
104
+ } catch (error) {
105
+ this.setConnectionState("disconnected");
106
+ reject(error);
107
+ }
108
+ });
109
+ }
110
+ /**
111
+ * 断开连接
112
+ */
113
+ disconnect() {
114
+ if (this.ws) {
115
+ this.send({
116
+ type: "leave",
117
+ roomId: this.roomId,
118
+ userId: this.userId,
119
+ payload: {},
120
+ timestamp: Date.now()
121
+ });
122
+ this.ws.close();
123
+ this.ws = null;
124
+ }
125
+ this.setConnectionState("disconnected");
126
+ this.stopPing();
127
+ }
128
+ /**
129
+ * 添加节点
130
+ */
131
+ addNode(node) {
132
+ const operation = {
133
+ id: `op_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,
134
+ type: "node_add",
135
+ timestamp: Date.now(),
136
+ userId: this.userId,
137
+ nodeId: node.id,
138
+ data: node,
139
+ version: this.state.version + 1
140
+ };
141
+ this.applyOperation(operation);
142
+ this.broadcastOperation(operation);
143
+ }
144
+ /**
145
+ * 更新节点
146
+ */
147
+ updateNode(nodeId, updates) {
148
+ const operation = {
149
+ id: `op_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,
150
+ type: "node_update",
151
+ timestamp: Date.now(),
152
+ userId: this.userId,
153
+ nodeId,
154
+ data: updates,
155
+ version: this.state.version + 1
156
+ };
157
+ this.applyOperation(operation);
158
+ this.broadcastOperation(operation);
159
+ }
160
+ /**
161
+ * 删除节点
162
+ */
163
+ deleteNode(nodeId) {
164
+ const operation = {
165
+ id: `op_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,
166
+ type: "node_delete",
167
+ timestamp: Date.now(),
168
+ userId: this.userId,
169
+ nodeId,
170
+ version: this.state.version + 1
171
+ };
172
+ this.applyOperation(operation);
173
+ this.broadcastOperation(operation);
174
+ }
175
+ /**
176
+ * 添加边
177
+ */
178
+ addEdge(edge) {
179
+ const operation = {
180
+ id: `op_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,
181
+ type: "edge_add",
182
+ timestamp: Date.now(),
183
+ userId: this.userId,
184
+ edgeId: edge.id,
185
+ data: edge,
186
+ version: this.state.version + 1
187
+ };
188
+ this.applyOperation(operation);
189
+ this.broadcastOperation(operation);
190
+ }
191
+ /**
192
+ * 更新边
193
+ */
194
+ updateEdge(edgeId, updates) {
195
+ const operation = {
196
+ id: `op_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,
197
+ type: "edge_update",
198
+ timestamp: Date.now(),
199
+ userId: this.userId,
200
+ edgeId,
201
+ data: updates,
202
+ version: this.state.version + 1
203
+ };
204
+ this.applyOperation(operation);
205
+ this.broadcastOperation(operation);
206
+ }
207
+ /**
208
+ * 删除边
209
+ */
210
+ deleteEdge(edgeId) {
211
+ const operation = {
212
+ id: `op_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,
213
+ type: "edge_delete",
214
+ timestamp: Date.now(),
215
+ userId: this.userId,
216
+ edgeId,
217
+ version: this.state.version + 1
218
+ };
219
+ this.applyOperation(operation);
220
+ this.broadcastOperation(operation);
221
+ }
222
+ /**
223
+ * 更新视口
224
+ */
225
+ updateViewport(viewport) {
226
+ const operation = {
227
+ id: `op_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,
228
+ type: "viewport_change",
229
+ timestamp: Date.now(),
230
+ userId: this.userId,
231
+ data: viewport,
232
+ version: this.state.version + 1
233
+ };
234
+ this.state.viewport = viewport;
235
+ this.broadcastOperation(operation, true);
236
+ }
237
+ /**
238
+ * 更新光标位置
239
+ */
240
+ updateCursor(x, y) {
241
+ this.send({
242
+ type: "cursor",
243
+ roomId: this.roomId,
244
+ userId: this.userId,
245
+ payload: {
246
+ x,
247
+ y,
248
+ name: this.userName,
249
+ color: this.userColor
250
+ },
251
+ timestamp: Date.now()
252
+ });
253
+ }
254
+ /**
255
+ * 更新选区
256
+ */
257
+ updateSelection(nodeIds) {
258
+ this.send({
259
+ type: "selection",
260
+ roomId: this.roomId,
261
+ userId: this.userId,
262
+ payload: {
263
+ nodeIds
264
+ },
265
+ timestamp: Date.now()
266
+ });
267
+ }
268
+ /**
269
+ * 获取当前状态
270
+ */
271
+ getState() {
272
+ return {
273
+ nodes: Array.from(this.state.nodes.values()),
274
+ edges: Array.from(this.state.edges.values()),
275
+ viewport: this.state.viewport
276
+ };
277
+ }
278
+ /**
279
+ * 获取连接状态
280
+ */
281
+ getConnectionState() {
282
+ return this.connectionState;
283
+ }
284
+ /**
285
+ * 获取其他用户光标
286
+ */
287
+ getCursors() {
288
+ return this.cursors;
289
+ }
290
+ /**
291
+ * 注册事件监听
292
+ */
293
+ on(event, callback) {
294
+ const listeners = this.eventListeners.get(event) || [];
295
+ listeners.push(callback);
296
+ this.eventListeners.set(event, listeners);
297
+ }
298
+ /**
299
+ * 移除事件监听
300
+ */
301
+ off(event, callback) {
302
+ const listeners = this.eventListeners.get(event) || [];
303
+ const index = listeners.indexOf(callback);
304
+ if (index > -1) {
305
+ listeners.splice(index, 1);
306
+ }
307
+ }
308
+ // ==================== 私有方法 ====================
309
+ /**
310
+ * 严谨校验消息是否符合 WSMessage 协议结构
311
+ */
312
+ isValidWSMessage(message) {
313
+ if (message && typeof message === "object") {
314
+ const m = message;
315
+ return typeof m.type === "string" && typeof m.roomId === "string" && typeof m.userId === "string" && "payload" in m;
316
+ }
317
+ return false;
318
+ }
319
+ send(message) {
320
+ if (this.ws && this.ws.readyState === WebSocket.OPEN) {
321
+ this.ws.send(JSON.stringify(message));
322
+ }
323
+ }
324
+ handleMessage(message) {
325
+ switch (message.type) {
326
+ case "sync":
327
+ this.handleSync(message.payload);
328
+ break;
329
+ case "operation":
330
+ this.handleRemoteOperation(message.payload);
331
+ break;
332
+ case "cursor":
333
+ this.handleCursorUpdate(message.userId, message.payload);
334
+ break;
335
+ case "selection":
336
+ this.handleSelectionUpdate(message.userId, message.payload);
337
+ break;
338
+ case "join":
339
+ this.handleUserJoin(message.userId, message.payload);
340
+ break;
341
+ case "leave":
342
+ this.handleUserLeave(message.userId);
343
+ break;
344
+ }
345
+ }
346
+ handleSync(payload) {
347
+ this.state.nodes = new Map(payload.nodes.map(n => [n.id, n]));
348
+ this.state.edges = new Map(payload.edges.map(e => [e.id, e]));
349
+ this.state.viewport = payload.viewport;
350
+ this.state.version = payload.version;
351
+ this.emitEvent("sync", {
352
+ type: "sync",
353
+ data: payload,
354
+ timestamp: Date.now()
355
+ });
356
+ }
357
+ handleRemoteOperation(operation) {
358
+ if (operation.userId === this.userId) {
359
+ return;
360
+ }
361
+ this.applyOperation(operation);
362
+ this.emitEvent("operation", {
363
+ type: "operation",
364
+ userId: operation.userId,
365
+ data: operation,
366
+ timestamp: Date.now()
367
+ });
368
+ }
369
+ applyOperation(operation) {
370
+ switch (operation.type) {
371
+ case "node_add":
372
+ if (operation.nodeId && operation.data) {
373
+ this.state.nodes.set(operation.nodeId, operation.data);
374
+ }
375
+ break;
376
+ case "node_update":
377
+ if (operation.nodeId) {
378
+ const existing = this.state.nodes.get(operation.nodeId);
379
+ if (existing) {
380
+ this.state.nodes.set(operation.nodeId, {
381
+ ...existing,
382
+ ...operation.data
383
+ });
384
+ }
385
+ }
386
+ break;
387
+ case "node_delete":
388
+ if (operation.nodeId) {
389
+ this.state.nodes.delete(operation.nodeId);
390
+ for (const [edgeId, edge] of this.state.edges) {
391
+ if (edge.source === operation.nodeId || edge.target === operation.nodeId) {
392
+ this.state.edges.delete(edgeId);
393
+ }
394
+ }
395
+ }
396
+ break;
397
+ case "edge_add":
398
+ if (operation.edgeId && operation.data) {
399
+ this.state.edges.set(operation.edgeId, operation.data);
400
+ }
401
+ break;
402
+ case "edge_update":
403
+ if (operation.edgeId) {
404
+ const existing = this.state.edges.get(operation.edgeId);
405
+ if (existing) {
406
+ this.state.edges.set(operation.edgeId, {
407
+ ...existing,
408
+ ...operation.data
409
+ });
410
+ }
411
+ }
412
+ break;
413
+ case "edge_delete":
414
+ if (operation.edgeId) {
415
+ this.state.edges.delete(operation.edgeId);
416
+ }
417
+ break;
418
+ case "viewport_change":
419
+ if (operation.data) {
420
+ this.state.viewport = operation.data;
421
+ }
422
+ break;
423
+ }
424
+ this.state.version = operation.version;
425
+ this.versionVector.set(operation.userId, (this.versionVector.get(operation.userId) || 0) + 1);
426
+ }
427
+ broadcastOperation(operation, unreliable = false) {
428
+ this.pendingOperations.set(operation.id, operation);
429
+ this.send({
430
+ type: "operation",
431
+ roomId: this.roomId,
432
+ userId: this.userId,
433
+ payload: operation,
434
+ timestamp: Date.now()
435
+ });
436
+ if (unreliable) {
437
+ this.pendingOperations.delete(operation.id);
438
+ }
439
+ }
440
+ handleCursorUpdate(userId, payload) {
441
+ this.cursors.set(userId, {
442
+ x: payload.x,
443
+ y: payload.y,
444
+ name: payload.name,
445
+ color: payload.color
446
+ });
447
+ this.emitEvent("cursor_update", {
448
+ type: "cursor_update",
449
+ userId,
450
+ data: payload,
451
+ timestamp: Date.now()
452
+ });
453
+ }
454
+ handleSelectionUpdate(userId, payload) {
455
+ this.emitEvent("selection_update", {
456
+ type: "selection_update",
457
+ userId,
458
+ data: payload,
459
+ timestamp: Date.now()
460
+ });
461
+ }
462
+ handleUserJoin(userId, payload) {
463
+ this.emitEvent("user_joined", {
464
+ type: "user_joined",
465
+ userId,
466
+ data: payload,
467
+ timestamp: Date.now()
468
+ });
469
+ }
470
+ handleUserLeave(userId) {
471
+ this.cursors.delete(userId);
472
+ this.emitEvent("user_left", {
473
+ type: "user_left",
474
+ userId,
475
+ timestamp: Date.now()
476
+ });
477
+ }
478
+ setConnectionState(state) {
479
+ this.connectionState = state;
480
+ this.emitEvent(state, {
481
+ type: "sync",
482
+ timestamp: Date.now()
483
+ });
484
+ }
485
+ handleDisconnect() {
486
+ if (this.reconnectAttempts < this.maxReconnectAttempts) {
487
+ this.reconnectAttempts++;
488
+ const delay = this.reconnectDelay * Math.pow(2, this.reconnectAttempts - 1);
489
+ this.setConnectionState("reconnecting");
490
+ setTimeout(() => {
491
+ this.reconnect();
492
+ }, delay);
493
+ }
494
+ }
495
+ async reconnect() {
496
+ console.log(`Reconnect attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts}`);
497
+ }
498
+ startPing() {
499
+ this.pingInterval = window.setInterval(() => {
500
+ this.send({
501
+ type: "ping",
502
+ roomId: this.roomId,
503
+ userId: this.userId,
504
+ payload: {},
505
+ timestamp: Date.now()
506
+ });
507
+ }, 3e4);
508
+ }
509
+ stopPing() {
510
+ if (this.pingInterval) {
511
+ clearInterval(this.pingInterval);
512
+ this.pingInterval = null;
513
+ }
514
+ }
515
+ emitEvent(eventType, event) {
516
+ const listeners = this.eventListeners.get(eventType) || [];
517
+ for (const listener of listeners) {
518
+ listener(event);
519
+ }
520
+ const wildcardListeners = this.eventListeners.get("*") || [];
521
+ for (const listener of wildcardListeners) {
522
+ listener(event);
523
+ }
524
+ }
525
+ generateUserColor(userId) {
526
+ const colors = ["#f56565", "#ed8936", "#48bb78", "#4299e1", "#667eea", "#ed64a6", "#a0aec0", "#fc8181"];
527
+ let hash = 0;
528
+ for (let i = 0; i < userId.length; i++) {
529
+ hash = userId.charCodeAt(i) + ((hash << 5) - hash);
530
+ }
531
+ return colors[Math.abs(hash) % colors.length];
532
+ }
533
+ }
534
+ exports.FlowCollaborationEngine = FlowCollaborationEngine;
535
+ function createCollaborationEngine() {
536
+ return new FlowCollaborationEngine();
537
+ }
@@ -0,0 +1,189 @@
1
+ /**
2
+ * ============================================
3
+ * Flow Collaboration System
4
+ * Flow 实时协作系统 - CRDT + WebSocket 实现
5
+ * ============================================
6
+ */
7
+ import type { Node, Edge, ViewportTransform } from '../types';
8
+ export type OperationType = 'node_add' | 'node_update' | 'node_delete' | 'edge_add' | 'edge_update' | 'edge_delete' | 'viewport_change' | 'selection_change' | 'cursor_move';
9
+ export interface CollaborationOperation {
10
+ id: string;
11
+ type: OperationType;
12
+ timestamp: number;
13
+ userId: string;
14
+ nodeId?: string;
15
+ edgeId?: string;
16
+ data?: unknown;
17
+ version: number;
18
+ }
19
+ export interface CollaborationUser {
20
+ id: string;
21
+ name: string;
22
+ color: string;
23
+ cursor?: {
24
+ x: number;
25
+ y: number;
26
+ };
27
+ selection?: string[];
28
+ lastActive: number;
29
+ }
30
+ export interface CollaborationRoom {
31
+ id: string;
32
+ name: string;
33
+ ownerId: string;
34
+ users: Map<string, CollaborationUser>;
35
+ nodes: Map<string, Node>;
36
+ edges: Map<string, Edge>;
37
+ viewport: ViewportTransform;
38
+ version: number;
39
+ createdAt: number;
40
+ }
41
+ export interface CRDTState {
42
+ nodes: Map<string, Node>;
43
+ edges: Map<string, Edge>;
44
+ viewport: ViewportTransform;
45
+ version: number;
46
+ pendingOps: CollaborationOperation[];
47
+ acknowledgedOps: CollaborationOperation[];
48
+ }
49
+ export interface CollaborationEvent {
50
+ type: 'user_joined' | 'user_left' | 'operation' | 'sync' | 'cursor_update' | 'selection_update' | 'error' | 'disconnected' | 'connecting' | 'connected' | 'reconnecting';
51
+ userId?: string;
52
+ data?: unknown;
53
+ error?: unknown;
54
+ timestamp: number;
55
+ }
56
+ export interface WSMessage {
57
+ type: 'join' | 'leave' | 'operation' | 'sync' | 'cursor' | 'selection' | 'error' | 'ping';
58
+ roomId: string;
59
+ userId: string;
60
+ payload: unknown;
61
+ timestamp: number;
62
+ }
63
+ export type ConnectionState = 'disconnected' | 'connecting' | 'connected' | 'reconnecting';
64
+ /**
65
+ * 协作引擎核心类
66
+ */
67
+ export declare class FlowCollaborationEngine {
68
+ private roomId;
69
+ private userId;
70
+ private userName;
71
+ private userColor;
72
+ private state;
73
+ private ws;
74
+ private connectionState;
75
+ private eventListeners;
76
+ private reconnectAttempts;
77
+ private maxReconnectAttempts;
78
+ private reconnectDelay;
79
+ private pingInterval;
80
+ private pendingOperations;
81
+ private versionVector;
82
+ private cursors;
83
+ constructor();
84
+ /**
85
+ * 连接到协作房间
86
+ */
87
+ connect(options: {
88
+ serverUrl: string;
89
+ roomId: string;
90
+ userId: string;
91
+ userName: string;
92
+ initialNodes?: Node[];
93
+ initialEdges?: Edge[];
94
+ }): Promise<void>;
95
+ /**
96
+ * 断开连接
97
+ */
98
+ disconnect(): void;
99
+ /**
100
+ * 添加节点
101
+ */
102
+ addNode(node: Node): void;
103
+ /**
104
+ * 更新节点
105
+ */
106
+ updateNode(nodeId: string, updates: Partial<Node>): void;
107
+ /**
108
+ * 删除节点
109
+ */
110
+ deleteNode(nodeId: string): void;
111
+ /**
112
+ * 添加边
113
+ */
114
+ addEdge(edge: Edge): void;
115
+ /**
116
+ * 更新边
117
+ */
118
+ updateEdge(edgeId: string, updates: Partial<Edge>): void;
119
+ /**
120
+ * 删除边
121
+ */
122
+ deleteEdge(edgeId: string): void;
123
+ /**
124
+ * 更新视口
125
+ */
126
+ updateViewport(viewport: ViewportTransform): void;
127
+ /**
128
+ * 更新光标位置
129
+ */
130
+ updateCursor(x: number, y: number): void;
131
+ /**
132
+ * 更新选区
133
+ */
134
+ updateSelection(nodeIds: string[]): void;
135
+ /**
136
+ * 获取当前状态
137
+ */
138
+ getState(): {
139
+ nodes: Node[];
140
+ edges: Edge[];
141
+ viewport: ViewportTransform;
142
+ };
143
+ /**
144
+ * 获取连接状态
145
+ */
146
+ getConnectionState(): ConnectionState;
147
+ /**
148
+ * 获取其他用户光标
149
+ */
150
+ getCursors(): Map<string, {
151
+ x: number;
152
+ y: number;
153
+ name: string;
154
+ color: string;
155
+ }>;
156
+ /**
157
+ * 注册事件监听
158
+ */
159
+ on(event: string, callback: (event: CollaborationEvent) => void): void;
160
+ /**
161
+ * 移除事件监听
162
+ */
163
+ off(event: string, callback: (event: CollaborationEvent) => void): void;
164
+ /**
165
+ * 严谨校验消息是否符合 WSMessage 协议结构
166
+ */
167
+ private isValidWSMessage;
168
+ private send;
169
+ private handleMessage;
170
+ private handleSync;
171
+ private handleRemoteOperation;
172
+ private applyOperation;
173
+ private broadcastOperation;
174
+ private handleCursorUpdate;
175
+ private handleSelectionUpdate;
176
+ private handleUserJoin;
177
+ private handleUserLeave;
178
+ private setConnectionState;
179
+ private handleDisconnect;
180
+ private reconnect;
181
+ private startPing;
182
+ private stopPing;
183
+ private emitEvent;
184
+ private generateUserColor;
185
+ }
186
+ /**
187
+ * 创建协作引擎实例
188
+ */
189
+ export declare function createCollaborationEngine(): FlowCollaborationEngine;