@datalayer/lexical-loro 1.0.2 → 1.0.5

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 (402) hide show
  1. package/README.md +2 -2
  2. package/lib/App.d.ts +2 -0
  3. package/lib/App.js +141 -0
  4. package/lib/Editor.d.ts +2 -0
  5. package/lib/Editor.js +116 -0
  6. package/lib/Settings.d.ts +2 -0
  7. package/lib/Settings.js +57 -0
  8. package/lib/appSettings.d.ts +36 -0
  9. package/lib/appSettings.js +48 -0
  10. package/lib/collab/loro/Bindings.d.ts +41 -0
  11. package/lib/collab/loro/Bindings.js +99 -0
  12. package/lib/collab/loro/Debug.d.ts +33 -0
  13. package/lib/collab/loro/Debug.js +452 -0
  14. package/lib/collab/loro/LexicalCollaborationContext.d.ts +19 -0
  15. package/lib/collab/loro/LexicalCollaborationContext.js +52 -0
  16. package/lib/collab/loro/LexicalCollaborationPlugin.d.ts +29 -0
  17. package/lib/collab/loro/LexicalCollaborationPlugin.js +111 -0
  18. package/lib/collab/loro/State.d.ts +53 -0
  19. package/lib/collab/loro/State.js +94 -0
  20. package/lib/collab/loro/components/LoroCollaborationUI.d.ts +13 -0
  21. package/lib/collab/loro/components/LoroCollaborationUI.js +9 -0
  22. package/lib/collab/loro/components/LoroCollaborators.d.ts +8 -0
  23. package/lib/collab/loro/components/LoroCollaborators.js +90 -0
  24. package/lib/collab/loro/components/index.d.ts +2 -0
  25. package/lib/collab/loro/components/index.js +6 -0
  26. package/lib/collab/loro/index.d.ts +6 -0
  27. package/lib/collab/loro/index.js +10 -0
  28. package/lib/collab/loro/integrators/BaseIntegrator.d.ts +14 -0
  29. package/lib/collab/loro/integrators/BaseIntegrator.js +5 -0
  30. package/lib/collab/loro/integrators/CounterIntegrator.d.ts +23 -0
  31. package/lib/collab/loro/integrators/CounterIntegrator.js +44 -0
  32. package/lib/collab/loro/integrators/ListIntegrator.d.ts +23 -0
  33. package/lib/collab/loro/integrators/ListIntegrator.js +53 -0
  34. package/lib/collab/loro/integrators/MapIntegrator.d.ts +24 -0
  35. package/lib/collab/loro/integrators/MapIntegrator.js +235 -0
  36. package/lib/collab/loro/integrators/TextIntegrator.d.ts +25 -0
  37. package/lib/collab/loro/integrators/TextIntegrator.js +55 -0
  38. package/lib/collab/loro/integrators/TreeIntegrator.d.ts +41 -0
  39. package/lib/collab/loro/integrators/TreeIntegrator.js +293 -0
  40. package/lib/collab/loro/nodes/NodeFactory.d.ts +15 -0
  41. package/lib/collab/loro/nodes/NodeFactory.js +80 -0
  42. package/lib/collab/loro/nodes/NodesMapper.d.ts +120 -0
  43. package/lib/collab/loro/nodes/NodesMapper.js +289 -0
  44. package/lib/collab/loro/propagators/DecoratorNodePropagator.d.ts +60 -0
  45. package/lib/collab/loro/propagators/DecoratorNodePropagator.js +306 -0
  46. package/lib/collab/loro/propagators/ElementNodePropagator.d.ts +62 -0
  47. package/lib/collab/loro/propagators/ElementNodePropagator.js +393 -0
  48. package/lib/collab/loro/propagators/LineBreakNodePropagator.d.ts +57 -0
  49. package/lib/collab/loro/propagators/LineBreakNodePropagator.js +200 -0
  50. package/lib/collab/loro/propagators/RootNodePropagator.d.ts +55 -0
  51. package/lib/collab/loro/propagators/RootNodePropagator.js +174 -0
  52. package/lib/collab/loro/propagators/TextNodePropagator.d.ts +60 -0
  53. package/lib/collab/loro/propagators/TextNodePropagator.js +450 -0
  54. package/lib/collab/loro/propagators/index.d.ts +49 -0
  55. package/lib/collab/loro/propagators/index.js +30 -0
  56. package/lib/collab/loro/provider/websocket.d.ts +117 -0
  57. package/lib/collab/loro/provider/websocket.js +946 -0
  58. package/lib/collab/loro/servers/index.d.ts +0 -0
  59. package/lib/collab/loro/servers/index.js +4 -0
  60. package/lib/collab/loro/servers/ws/callback.d.ts +5 -0
  61. package/lib/collab/loro/servers/ws/callback.js +89 -0
  62. package/lib/collab/loro/servers/ws/server.d.ts +2 -0
  63. package/lib/collab/loro/servers/ws/server.js +29 -0
  64. package/lib/collab/loro/servers/ws/utils.d.ts +40 -0
  65. package/lib/collab/loro/servers/ws/utils.js +517 -0
  66. package/lib/collab/loro/sync/SyncCursors.d.ts +32 -0
  67. package/lib/collab/loro/sync/SyncCursors.js +501 -0
  68. package/lib/collab/loro/sync/SyncLexicalToLoro.d.ts +4 -0
  69. package/lib/collab/loro/sync/SyncLexicalToLoro.js +152 -0
  70. package/lib/collab/loro/sync/SyncLoroToLexical.d.ts +5 -0
  71. package/lib/collab/loro/sync/SyncLoroToLexical.js +106 -0
  72. package/lib/collab/loro/types/LexicalNodeData.d.ts +32 -0
  73. package/lib/collab/loro/types/LexicalNodeData.js +75 -0
  74. package/lib/collab/loro/useCollaboration.d.ts +12 -0
  75. package/lib/collab/loro/useCollaboration.js +405 -0
  76. package/lib/collab/loro/utils/InitialContent.d.ts +64 -0
  77. package/lib/collab/loro/utils/InitialContent.js +113 -0
  78. package/lib/collab/loro/utils/Invariant.d.ts +15 -0
  79. package/lib/collab/loro/utils/Invariant.js +24 -0
  80. package/lib/collab/loro/utils/LexicalToLoro.d.ts +18 -0
  81. package/lib/collab/loro/utils/LexicalToLoro.js +100 -0
  82. package/lib/collab/loro/utils/Utils.d.ts +44 -0
  83. package/lib/collab/loro/utils/Utils.js +157 -0
  84. package/lib/collab/loro/wsProvider.d.ts +8 -0
  85. package/lib/collab/loro/wsProvider.js +52 -0
  86. package/lib/collab/utils/invariant.d.ts +1 -0
  87. package/lib/collab/utils/invariant.js +15 -0
  88. package/lib/collab/utils/simpleDiffWithCursor.d.ts +5 -0
  89. package/lib/collab/utils/simpleDiffWithCursor.js +35 -0
  90. package/lib/collab/yjs/Bindings.d.ts +23 -0
  91. package/lib/collab/yjs/Bindings.js +26 -0
  92. package/lib/collab/yjs/Debug.d.ts +23 -0
  93. package/lib/collab/yjs/Debug.js +213 -0
  94. package/lib/collab/yjs/LexicalCollaborationContext.d.ts +10 -0
  95. package/lib/collab/yjs/LexicalCollaborationContext.js +37 -0
  96. package/lib/collab/yjs/LexicalCollaborationPlugin.d.ts +21 -0
  97. package/lib/collab/yjs/LexicalCollaborationPlugin.js +63 -0
  98. package/lib/collab/yjs/State.d.ts +51 -0
  99. package/lib/collab/yjs/State.js +35 -0
  100. package/lib/collab/yjs/nodes/AnyCollabNode.d.ts +5 -0
  101. package/lib/collab/yjs/nodes/AnyCollabNode.js +1 -0
  102. package/lib/collab/yjs/nodes/CollabDecoratorNode.d.ts +22 -0
  103. package/lib/collab/yjs/nodes/CollabDecoratorNode.js +64 -0
  104. package/lib/collab/yjs/nodes/CollabElementNode.d.ts +40 -0
  105. package/lib/collab/yjs/nodes/CollabElementNode.js +462 -0
  106. package/lib/collab/yjs/nodes/CollabLineBreakNode.d.ts +19 -0
  107. package/lib/collab/yjs/nodes/CollabLineBreakNode.js +44 -0
  108. package/lib/collab/yjs/nodes/CollabTextNode.d.ts +25 -0
  109. package/lib/collab/yjs/nodes/CollabTextNode.js +103 -0
  110. package/lib/collab/yjs/provider/websocket.d.ts +88 -0
  111. package/lib/collab/yjs/provider/websocket.js +415 -0
  112. package/lib/collab/yjs/servers/index.d.ts +0 -0
  113. package/lib/collab/yjs/servers/index.js +0 -0
  114. package/lib/collab/yjs/servers/ws/callback.d.ts +5 -0
  115. package/lib/collab/yjs/servers/ws/callback.js +72 -0
  116. package/lib/collab/yjs/servers/ws/server.d.ts +2 -0
  117. package/lib/collab/yjs/servers/ws/server.js +25 -0
  118. package/lib/collab/yjs/servers/ws/utils.d.ts +49 -0
  119. package/lib/collab/yjs/servers/ws/utils.js +284 -0
  120. package/lib/collab/yjs/sync/SyncCursors.d.ts +39 -0
  121. package/lib/collab/yjs/sync/SyncCursors.js +351 -0
  122. package/lib/collab/yjs/sync/SyncEditorStates.d.ts +10 -0
  123. package/lib/collab/yjs/sync/SyncEditorStates.js +200 -0
  124. package/lib/collab/yjs/useCollaboration.d.ts +12 -0
  125. package/lib/collab/yjs/useCollaboration.js +255 -0
  126. package/lib/collab/yjs/utils/Utils.d.ts +25 -0
  127. package/lib/collab/yjs/utils/Utils.js +402 -0
  128. package/lib/collab/yjs/wsProvider.d.ts +3 -0
  129. package/lib/collab/yjs/wsProvider.js +21 -0
  130. package/lib/commenting/index.d.ts +41 -0
  131. package/lib/commenting/index.js +328 -0
  132. package/lib/context/FlashMessageContext.d.ts +7 -0
  133. package/lib/context/FlashMessageContext.js +24 -0
  134. package/lib/context/SettingsContext.d.ts +12 -0
  135. package/lib/context/SettingsContext.js +38 -0
  136. package/lib/context/SharedHistoryContext.d.ts +11 -0
  137. package/lib/context/SharedHistoryContext.js +11 -0
  138. package/lib/context/ToolbarContext.d.ts +65 -0
  139. package/lib/context/ToolbarContext.js +84 -0
  140. package/lib/demo.d.ts +12 -0
  141. package/lib/demo.js +45 -0
  142. package/lib/hooks/useFlashMessage.d.ts +2 -0
  143. package/lib/hooks/useFlashMessage.js +8 -0
  144. package/lib/hooks/useModal.d.ts +5 -0
  145. package/lib/hooks/useModal.js +26 -0
  146. package/lib/hooks/useReport.d.ts +1 -0
  147. package/lib/hooks/useReport.js +50 -0
  148. package/lib/index.d.ts +1 -0
  149. package/lib/index.js +5 -0
  150. package/lib/nodes/AutocompleteNode.d.ts +27 -0
  151. package/lib/nodes/AutocompleteNode.js +60 -0
  152. package/lib/nodes/CounterComponent.d.ts +6 -0
  153. package/lib/nodes/CounterComponent.js +137 -0
  154. package/lib/nodes/CounterNode.d.ts +23 -0
  155. package/lib/nodes/CounterNode.js +47 -0
  156. package/lib/nodes/DateTimeNode/DateTimeComponent.d.ts +8 -0
  157. package/lib/nodes/DateTimeNode/DateTimeComponent.js +119 -0
  158. package/lib/nodes/DateTimeNode/DateTimeNode.d.ts +27 -0
  159. package/lib/nodes/DateTimeNode/DateTimeNode.js +82 -0
  160. package/lib/nodes/EmojiNode.d.ts +18 -0
  161. package/lib/nodes/EmojiNode.js +54 -0
  162. package/lib/nodes/EquationComponent.d.ts +9 -0
  163. package/lib/nodes/EquationComponent.js +75 -0
  164. package/lib/nodes/EquationNode.d.ts +26 -0
  165. package/lib/nodes/EquationNode.js +109 -0
  166. package/lib/nodes/ExcalidrawNode/ExcalidrawComponent.d.ts +8 -0
  167. package/lib/nodes/ExcalidrawNode/ExcalidrawComponent.js +110 -0
  168. package/lib/nodes/ExcalidrawNode/ExcalidrawImage.d.ts +50 -0
  169. package/lib/nodes/ExcalidrawNode/ExcalidrawImage.js +55 -0
  170. package/lib/nodes/ExcalidrawNode/index.d.ts +32 -0
  171. package/lib/nodes/ExcalidrawNode/index.js +117 -0
  172. package/lib/nodes/FigmaNode.d.ts +20 -0
  173. package/lib/nodes/FigmaNode.js +52 -0
  174. package/lib/nodes/ImageComponent.d.ts +16 -0
  175. package/lib/nodes/ImageComponent.js +272 -0
  176. package/lib/nodes/ImageNode.d.ts +50 -0
  177. package/lib/nodes/ImageNode.js +151 -0
  178. package/lib/nodes/InlineImageNode/InlineImageComponent.d.ts +26 -0
  179. package/lib/nodes/InlineImageNode/InlineImageComponent.js +161 -0
  180. package/lib/nodes/InlineImageNode/InlineImageNode.d.ts +59 -0
  181. package/lib/nodes/InlineImageNode/InlineImageNode.js +162 -0
  182. package/lib/nodes/KeywordNode.d.ts +14 -0
  183. package/lib/nodes/KeywordNode.js +37 -0
  184. package/lib/nodes/LayoutContainerNode.d.ts +24 -0
  185. package/lib/nodes/LayoutContainerNode.js +95 -0
  186. package/lib/nodes/LayoutItemNode.d.ts +16 -0
  187. package/lib/nodes/LayoutItemNode.js +69 -0
  188. package/lib/nodes/MentionNode.d.ts +20 -0
  189. package/lib/nodes/MentionNode.js +85 -0
  190. package/lib/nodes/PageBreakNode/index.d.ts +17 -0
  191. package/lib/nodes/PageBreakNode/index.js +83 -0
  192. package/lib/nodes/PlaygroundNodes.d.ts +3 -0
  193. package/lib/nodes/PlaygroundNodes.js +75 -0
  194. package/lib/nodes/PollComponent.d.ts +9 -0
  195. package/lib/nodes/PollComponent.js +85 -0
  196. package/lib/nodes/PollNode.d.ts +43 -0
  197. package/lib/nodes/PollNode.js +153 -0
  198. package/lib/nodes/SpecialTextNode.d.ts +24 -0
  199. package/lib/nodes/SpecialTextNode.js +54 -0
  200. package/lib/nodes/StickyComponent.d.ts +10 -0
  201. package/lib/nodes/StickyComponent.js +162 -0
  202. package/lib/nodes/StickyNode.d.ts +31 -0
  203. package/lib/nodes/StickyNode.js +76 -0
  204. package/lib/nodes/TweetNode.d.ts +21 -0
  205. package/lib/nodes/TweetNode.js +119 -0
  206. package/lib/nodes/YouTubeNode.d.ts +22 -0
  207. package/lib/nodes/YouTubeNode.js +84 -0
  208. package/lib/plugins/ActionsPlugin/index.d.ts +5 -0
  209. package/lib/plugins/ActionsPlugin/index.js +168 -0
  210. package/lib/plugins/AutoEmbedPlugin/index.d.ts +19 -0
  211. package/lib/plugins/AutoEmbedPlugin/index.js +158 -0
  212. package/lib/plugins/AutoLinkPlugin/index.d.ts +2 -0
  213. package/lib/plugins/AutoLinkPlugin/index.js +15 -0
  214. package/lib/plugins/AutocompletePlugin/index.d.ts +10 -0
  215. package/lib/plugins/AutocompletePlugin/index.js +2477 -0
  216. package/lib/plugins/CodeActionMenuPlugin/components/CopyButton/index.d.ts +7 -0
  217. package/lib/plugins/CodeActionMenuPlugin/components/CopyButton/index.js +46 -0
  218. package/lib/plugins/CodeActionMenuPlugin/components/PrettierButton/index.d.ts +17 -0
  219. package/lib/plugins/CodeActionMenuPlugin/components/PrettierButton/index.js +115 -0
  220. package/lib/plugins/CodeActionMenuPlugin/index.d.ts +5 -0
  221. package/lib/plugins/CodeActionMenuPlugin/index.js +104 -0
  222. package/lib/plugins/CodeActionMenuPlugin/utils.d.ts +1 -0
  223. package/lib/plugins/CodeActionMenuPlugin/utils.js +22 -0
  224. package/lib/plugins/CodeHighlightPrismPlugin/index.d.ts +2 -0
  225. package/lib/plugins/CodeHighlightPrismPlugin/index.js +14 -0
  226. package/lib/plugins/CodeHighlightShikiPlugin/index.d.ts +2 -0
  227. package/lib/plugins/CodeHighlightShikiPlugin/index.js +14 -0
  228. package/lib/plugins/CollapsiblePlugin/CollapsibleContainerNode.d.ts +25 -0
  229. package/lib/plugins/CollapsiblePlugin/CollapsibleContainerNode.js +135 -0
  230. package/lib/plugins/CollapsiblePlugin/CollapsibleContentNode.d.ts +16 -0
  231. package/lib/plugins/CollapsiblePlugin/CollapsibleContentNode.js +83 -0
  232. package/lib/plugins/CollapsiblePlugin/CollapsibleTitleNode.d.ts +16 -0
  233. package/lib/plugins/CollapsiblePlugin/CollapsibleTitleNode.js +85 -0
  234. package/lib/plugins/CollapsiblePlugin/CollapsibleUtils.d.ts +2 -0
  235. package/lib/plugins/CollapsiblePlugin/CollapsibleUtils.js +12 -0
  236. package/lib/plugins/CollapsiblePlugin/index.d.ts +3 -0
  237. package/lib/plugins/CollapsiblePlugin/index.js +132 -0
  238. package/lib/plugins/CommentPlugin/index.d.ts +9 -0
  239. package/lib/plugins/CommentPlugin/index.js +460 -0
  240. package/lib/plugins/ComponentPickerPlugin/index.d.ts +2 -0
  241. package/lib/plugins/ComponentPickerPlugin/index.js +276 -0
  242. package/lib/plugins/ContextMenuPlugin/index.d.ts +2 -0
  243. package/lib/plugins/ContextMenuPlugin/index.js +112 -0
  244. package/lib/plugins/CounterPlugin/index.d.ts +3 -0
  245. package/lib/plugins/CounterPlugin/index.js +24 -0
  246. package/lib/plugins/DateTimePlugin/index.d.ts +8 -0
  247. package/lib/plugins/DateTimePlugin/index.js +28 -0
  248. package/lib/plugins/DebugPlugin/index.d.ts +3 -0
  249. package/lib/plugins/DebugPlugin/index.js +275 -0
  250. package/lib/plugins/DocsPlugin/index.d.ts +2 -0
  251. package/lib/plugins/DocsPlugin/index.js +4 -0
  252. package/lib/plugins/DragDropPastePlugin/index.d.ts +1 -0
  253. package/lib/plugins/DragDropPastePlugin/index.js +37 -0
  254. package/lib/plugins/DraggableBlockPlugin/index.d.ts +12 -0
  255. package/lib/plugins/DraggableBlockPlugin/index.js +36 -0
  256. package/lib/plugins/EmojiPickerPlugin/index.d.ts +1 -0
  257. package/lib/plugins/EmojiPickerPlugin/index.js +84 -0
  258. package/lib/plugins/EmojisPlugin/index.d.ts +2 -0
  259. package/lib/plugins/EmojisPlugin/index.js +56 -0
  260. package/lib/plugins/EquationsPlugin/index.d.ts +14 -0
  261. package/lib/plugins/EquationsPlugin/index.js +34 -0
  262. package/lib/plugins/ExcalidrawPlugin/index.d.ts +5 -0
  263. package/lib/plugins/ExcalidrawPlugin/index.js +44 -0
  264. package/lib/plugins/FigmaPlugin/index.d.ts +4 -0
  265. package/lib/plugins/FigmaPlugin/index.js +24 -0
  266. package/lib/plugins/FloatingLinkEditorPlugin/index.d.ts +15 -0
  267. package/lib/plugins/FloatingLinkEditorPlugin/index.js +280 -0
  268. package/lib/plugins/FloatingTextFormatToolbarPlugin/index.d.ts +7 -0
  269. package/lib/plugins/FloatingTextFormatToolbarPlugin/index.js +219 -0
  270. package/lib/plugins/ImagesPlugin/index.d.ts +24 -0
  271. package/lib/plugins/ImagesPlugin/index.js +195 -0
  272. package/lib/plugins/InlineImagePlugin/index.d.ts +17 -0
  273. package/lib/plugins/InlineImagePlugin/index.js +180 -0
  274. package/lib/plugins/KeywordsPlugin/index.d.ts +2 -0
  275. package/lib/plugins/KeywordsPlugin/index.js +35 -0
  276. package/lib/plugins/LayoutPlugin/InsertLayoutDialog.d.ts +6 -0
  277. package/lib/plugins/LayoutPlugin/InsertLayoutDialog.js +21 -0
  278. package/lib/plugins/LayoutPlugin/LayoutPlugin.d.ts +7 -0
  279. package/lib/plugins/LayoutPlugin/LayoutPlugin.js +135 -0
  280. package/lib/plugins/LinkPlugin/index.d.ts +6 -0
  281. package/lib/plugins/LinkPlugin/index.js +11 -0
  282. package/lib/plugins/MarkdownShortcutPlugin/index.d.ts +2 -0
  283. package/lib/plugins/MarkdownShortcutPlugin/index.js +6 -0
  284. package/lib/plugins/MarkdownTransformers/index.d.ts +8 -0
  285. package/lib/plugins/MarkdownTransformers/index.js +238 -0
  286. package/lib/plugins/MaxLengthPlugin/index.d.ts +3 -0
  287. package/lib/plugins/MaxLengthPlugin/index.js +41 -0
  288. package/lib/plugins/MentionsPlugin/index.d.ts +2 -0
  289. package/lib/plugins/MentionsPlugin/index.js +564 -0
  290. package/lib/plugins/PageBreakPlugin/index.d.ts +4 -0
  291. package/lib/plugins/PageBreakPlugin/index.js +31 -0
  292. package/lib/plugins/PasteLogPlugin/index.d.ts +2 -0
  293. package/lib/plugins/PasteLogPlugin/index.js +27 -0
  294. package/lib/plugins/PollPlugin/index.d.ts +8 -0
  295. package/lib/plugins/PollPlugin/index.js +38 -0
  296. package/lib/plugins/ShortcutsPlugin/index.d.ts +6 -0
  297. package/lib/plugins/ShortcutsPlugin/index.js +116 -0
  298. package/lib/plugins/ShortcutsPlugin/shortcuts.d.ts +59 -0
  299. package/lib/plugins/ShortcutsPlugin/shortcuts.js +173 -0
  300. package/lib/plugins/SpecialTextPlugin/index.d.ts +2 -0
  301. package/lib/plugins/SpecialTextPlugin/index.js +50 -0
  302. package/lib/plugins/SpeechToTextPlugin/index.d.ts +5 -0
  303. package/lib/plugins/SpeechToTextPlugin/index.js +86 -0
  304. package/lib/plugins/StickyPlugin/index.d.ts +2 -0
  305. package/lib/plugins/StickyPlugin/index.js +16 -0
  306. package/lib/plugins/TabFocusPlugin/index.d.ts +1 -0
  307. package/lib/plugins/TabFocusPlugin/index.js +38 -0
  308. package/lib/plugins/TableActionMenuPlugin/index.d.ts +5 -0
  309. package/lib/plugins/TableActionMenuPlugin/index.js +492 -0
  310. package/lib/plugins/TableCellResizer/index.d.ts +3 -0
  311. package/lib/plugins/TableCellResizer/index.js +297 -0
  312. package/lib/plugins/TableHoverActionsPlugin/index.d.ts +4 -0
  313. package/lib/plugins/TableHoverActionsPlugin/index.js +188 -0
  314. package/lib/plugins/TableOfContentsPlugin/index.d.ts +2 -0
  315. package/lib/plugins/TableOfContentsPlugin/index.js +116 -0
  316. package/lib/plugins/TablePlugin.d.ts +31 -0
  317. package/lib/plugins/TablePlugin.js +63 -0
  318. package/lib/plugins/TestRecorderPlugin/index.d.ts +3 -0
  319. package/lib/plugins/TestRecorderPlugin/index.js +346 -0
  320. package/lib/plugins/ToolbarPlugin/fontSize.d.ts +9 -0
  321. package/lib/plugins/ToolbarPlugin/fontSize.js +84 -0
  322. package/lib/plugins/ToolbarPlugin/index.d.ts +9 -0
  323. package/lib/plugins/ToolbarPlugin/index.js +500 -0
  324. package/lib/plugins/ToolbarPlugin/utils.d.ts +26 -0
  325. package/lib/plugins/ToolbarPlugin/utils.js +247 -0
  326. package/lib/plugins/TreeViewPlugin/index.d.ts +2 -0
  327. package/lib/plugins/TreeViewPlugin/index.js +7 -0
  328. package/lib/plugins/TwitterPlugin/index.d.ts +4 -0
  329. package/lib/plugins/TwitterPlugin/index.js +24 -0
  330. package/lib/plugins/TypingPerfPlugin/index.d.ts +2 -0
  331. package/lib/plugins/TypingPerfPlugin/index.js +97 -0
  332. package/lib/plugins/YouTubePlugin/index.d.ts +4 -0
  333. package/lib/plugins/YouTubePlugin/index.js +24 -0
  334. package/lib/server/validation.d.ts +1 -0
  335. package/lib/server/validation.js +115 -0
  336. package/lib/setupEnv.d.ts +2 -0
  337. package/lib/setupEnv.js +29 -0
  338. package/lib/themes/CommentEditorTheme.d.ts +4 -0
  339. package/lib/themes/CommentEditorTheme.js +11 -0
  340. package/lib/themes/PlaygroundEditorTheme.d.ts +4 -0
  341. package/lib/themes/PlaygroundEditorTheme.js +124 -0
  342. package/lib/themes/StickyEditorTheme.d.ts +4 -0
  343. package/lib/themes/StickyEditorTheme.js +11 -0
  344. package/lib/tyes.dt.d.ts +12 -0
  345. package/lib/tyes.dt.js +4 -0
  346. package/lib/ui/Button.d.ts +12 -0
  347. package/lib/ui/Button.js +6 -0
  348. package/lib/ui/ColorPicker.d.ts +14 -0
  349. package/lib/ui/ColorPicker.js +219 -0
  350. package/lib/ui/ContentEditable.d.ts +9 -0
  351. package/lib/ui/ContentEditable.js +6 -0
  352. package/lib/ui/Dialog.d.ts +10 -0
  353. package/lib/ui/Dialog.js +8 -0
  354. package/lib/ui/DropDown.d.ts +18 -0
  355. package/lib/ui/DropDown.js +133 -0
  356. package/lib/ui/DropdownColorPicker.d.ts +13 -0
  357. package/lib/ui/DropdownColorPicker.js +6 -0
  358. package/lib/ui/EquationEditor.d.ts +8 -0
  359. package/lib/ui/EquationEditor.js +11 -0
  360. package/lib/ui/ExcalidrawModal.d.ts +42 -0
  361. package/lib/ui/ExcalidrawModal.js +103 -0
  362. package/lib/ui/FileInput.d.ts +10 -0
  363. package/lib/ui/FileInput.js +5 -0
  364. package/lib/ui/FlashMessage.d.ts +7 -0
  365. package/lib/ui/FlashMessage.js +6 -0
  366. package/lib/ui/ImageResizer.d.ts +17 -0
  367. package/lib/ui/ImageResizer.js +171 -0
  368. package/lib/ui/KatexEquationAlterer.d.ts +8 -0
  369. package/lib/ui/KatexEquationAlterer.js +23 -0
  370. package/lib/ui/KatexRenderer.d.ts +6 -0
  371. package/lib/ui/KatexRenderer.js +24 -0
  372. package/lib/ui/Modal.d.ts +9 -0
  373. package/lib/ui/Modal.js +48 -0
  374. package/lib/ui/Select.d.ts +8 -0
  375. package/lib/ui/Select.js +5 -0
  376. package/lib/ui/Switch.d.ts +8 -0
  377. package/lib/ui/Switch.js +6 -0
  378. package/lib/ui/TextInput.d.ts +13 -0
  379. package/lib/ui/TextInput.js +7 -0
  380. package/lib/utils/docSerialization.d.ts +3 -0
  381. package/lib/utils/docSerialization.js +60 -0
  382. package/lib/utils/emoji-list.d.ts +20 -0
  383. package/lib/utils/emoji-list.js +16609 -0
  384. package/lib/utils/getDOMRangeRect.d.ts +8 -0
  385. package/lib/utils/getDOMRangeRect.js +26 -0
  386. package/lib/utils/getSelectedNode.d.ts +2 -0
  387. package/lib/utils/getSelectedNode.js +28 -0
  388. package/lib/utils/getThemeSelector.d.ts +2 -0
  389. package/lib/utils/getThemeSelector.js +14 -0
  390. package/lib/utils/isMobileWidth.d.ts +7 -0
  391. package/lib/utils/isMobileWidth.js +11 -0
  392. package/lib/utils/joinClasses.d.ts +1 -0
  393. package/lib/utils/joinClasses.js +7 -0
  394. package/lib/utils/setFloatingElemPosition.d.ts +1 -0
  395. package/lib/utils/setFloatingElemPosition.js +59 -0
  396. package/lib/utils/setFloatingElemPositionForLinkEditor.d.ts +1 -0
  397. package/lib/utils/setFloatingElemPositionForLinkEditor.js +36 -0
  398. package/lib/utils/swipe.d.ts +4 -0
  399. package/lib/utils/swipe.js +94 -0
  400. package/lib/utils/url.d.ts +2 -0
  401. package/lib/utils/url.js +31 -0
  402. package/package.json +4 -4
@@ -0,0 +1,80 @@
1
+ /*
2
+ * Copyright (c) 2025-2026 Datalayer, Inc.
3
+ * Distributed under the terms of the MIT License.
4
+ */
5
+ import { invariant } from '../utils/Invariant';
6
+ /**
7
+ * Resolve lexical data from Loro, handling Loro container objects.
8
+ * When a JS object is stored in a LoroMap, Loro may return a LoroMap
9
+ * container internally. This helper ensures we always get a plain JS object.
10
+ */
11
+ function resolveLexicalData(raw) {
12
+ if (raw && typeof raw === 'object' && typeof raw.toJSON === 'function') {
13
+ return raw.toJSON();
14
+ }
15
+ return raw;
16
+ }
17
+ /**
18
+ * Factory function to create Lexical nodes from Loro TreeID.
19
+ *
20
+ * Uses the registered node's static `importJSON()` method, which is the
21
+ * canonical Lexical API for restoring nodes from serialized data. This works
22
+ * generically for ALL node types — built-in (paragraph, heading, table,
23
+ * list, quote, code…), decorator (excalidraw, image, counter…), and any
24
+ * externally-defined custom nodes (e.g. JupyterCellNode) as long as they
25
+ * are registered with the editor and implement the standard `importJSON`
26
+ * static method required by Lexical's serialization contract.
27
+ */
28
+ export function createLexicalNodeFromLoro(treeId, loroTree, binding, parentKey, nodeDataFromDiff) {
29
+ // Get node data from Loro tree. A create op for a tree node that does not
30
+ // exist is a real inconsistency.
31
+ invariant(loroTree.has(treeId), 'NodeFactory: TreeID not present in Loro tree', { treeId });
32
+ const treeNode = loroTree.getNodeByID(treeId);
33
+ // First try nodeData passed from TreeDiff integrator (has immediate lexical data)
34
+ let lexicalData = resolveLexicalData(nodeDataFromDiff?.lexical);
35
+ // Fallback to tree node data
36
+ if (!lexicalData) {
37
+ lexicalData = resolveLexicalData(treeNode?.data.get('lexical'));
38
+ }
39
+ if (!lexicalData || typeof lexicalData !== 'object') {
40
+ // Last resort: reconstruct a minimal serialization from elementType metadata.
41
+ const fallbackType = nodeDataFromDiff?.elementType ||
42
+ treeNode?.data.get('elementType') ||
43
+ treeNode?.data.get('nodeType');
44
+ invariant(typeof fallbackType === 'string' && fallbackType.length > 0, 'NodeFactory: no lexical data or elementType for TreeID', { treeId });
45
+ lexicalData = { type: fallbackType, version: 1 };
46
+ }
47
+ const nodeType = lexicalData.type || lexicalData.__type;
48
+ invariant(!!nodeType, 'NodeFactory: no type field in lexical data for TreeID', { treeId });
49
+ // Get the registered node class from the editor.
50
+ const registeredNodes = binding.editor._nodes;
51
+ const nodeInfo = registeredNodes.get(nodeType);
52
+ invariant(nodeInfo != null, 'NodeFactory: node type is not registered in the editor', { treeId, nodeType });
53
+ // ---------- Generic creation via importJSON ----------
54
+ // Every Lexical node class must implement the static `importJSON` method.
55
+ // Using it guarantees that:
56
+ // • Constructor parameters are handled correctly (heading tag, excalidraw
57
+ // data, JupyterCellNode code/outputs, …)
58
+ // • Node state (Lexical 0.35+ `createState` / `$config`) is restored
59
+ // • Base properties (format, indent, direction, style, mode, detail, …)
60
+ // are applied via the chained `updateFromJSON` call
61
+ // This removes the need for any node-type-specific branching.
62
+ const serializedData = { ...lexicalData };
63
+ // Ensure required serialization fields.
64
+ if (!serializedData.type) {
65
+ serializedData.type = nodeType;
66
+ }
67
+ if (serializedData.version === undefined) {
68
+ serializedData.version = 1;
69
+ }
70
+ // Provide an empty children array for element-type nodes whose children are
71
+ // managed as separate Loro tree nodes (importJSON does not recurse into
72
+ // children — that is handled by TreeIntegrator).
73
+ if (!('children' in serializedData)) {
74
+ serializedData.children = [];
75
+ }
76
+ // Every registered Lexical node implements importJSON. If it throws, the
77
+ // serialized data is malformed — surface it instead of silently substituting
78
+ // a blank node via a constructor fallback (which hides the real problem).
79
+ return nodeInfo.klass.importJSON(serializedData);
80
+ }
@@ -0,0 +1,120 @@
1
+ import { LoroTree, LoroTreeNode, TreeID } from 'loro-crdt';
2
+ import { LexicalNode, NodeKey, EditorState } from 'lexical';
3
+ import { Binding } from '../Bindings';
4
+ /**
5
+ * Bidirectional mapping between Lexical NodeKeys and Loro TreeIDs
6
+ */
7
+ export declare class NodeMapper {
8
+ private lexicalToLoro;
9
+ private loroToLexical;
10
+ private tree;
11
+ constructor(binding: Binding);
12
+ /**
13
+ * Create a bidirectional mapping between Lexical NodeKey and Loro TreeID
14
+ */
15
+ private createMapping;
16
+ /**
17
+ * Remove bidirectional mapping
18
+ */
19
+ private removeMapping;
20
+ /**
21
+ * Get Loro TreeNode based on Lexical NodeKey
22
+ * If the node doesn't exist, create it with proper parent-child relationship
23
+ */
24
+ getLoroNodeByLexicalKey(nodeKey: NodeKey, lexicalNode?: LexicalNode, parentTreeID?: TreeID, index?: number): LoroTreeNode;
25
+ /**
26
+ * Get Lexical NodeKey based on Loro TreeID
27
+ * If the node doesn't exist in Lexical, it needs to be created externally
28
+ */
29
+ getLexicalKeyByLoroId(treeId: TreeID): NodeKey | null;
30
+ /**
31
+ * Get Lexical Node from EditorState based on Loro TreeID
32
+ */
33
+ getLexicalNodeByLoroId(treeId: TreeID, editorState: EditorState): LexicalNode | null;
34
+ /**
35
+ * Get Lexical parent node key for a Loro TreeID
36
+ * Returns null if no parent or if parent not found in Lexical
37
+ * Note: This method needs the LoroTree API to be clarified for parent relationships
38
+ */
39
+ getLexicalParentByLoroId(treeId: TreeID, loroTree: LoroTree): NodeKey | null;
40
+ /**
41
+ * Manually set bidirectional mapping between Lexical NodeKey and Loro TreeID
42
+ */
43
+ setMapping(nodeKey: NodeKey, treeId: TreeID): void;
44
+ /**
45
+ * Create a new Loro TreeNode and establish mapping
46
+ */
47
+ private createLoroNode;
48
+ /**
49
+ * Update the mapping when a node is moved or modified
50
+ */
51
+ updateMapping(oldNodeKey: NodeKey, newNodeKey: NodeKey): void;
52
+ /**
53
+ * Remove mapping when a node is deleted (also deletes from Loro tree).
54
+ * Use this on the ORIGINATING side (propagation) where the local peer
55
+ * is actively deleting a node.
56
+ */
57
+ deleteMapping(nodeKey: NodeKey): void;
58
+ /**
59
+ * Remove bidirectional mapping WITHOUT deleting from the Loro tree.
60
+ * Use this on the INTEGRATION side (receiving remote events) where the
61
+ * Loro tree has already been updated by the remote peer — we only need
62
+ * to clean up the local key↔TreeID association.
63
+ */
64
+ removeMappingForKey(nodeKey: NodeKey): void;
65
+ /**
66
+ * Get TreeID by Lexical NodeKey (without creating if not found)
67
+ */
68
+ getTreeIDByLexicalKey(nodeKey: NodeKey): TreeID | undefined;
69
+ /**
70
+ * Check if a mapping exists for a Lexical NodeKey
71
+ */
72
+ hasLexicalMapping(nodeKey: NodeKey): boolean;
73
+ /**
74
+ * Check if a mapping exists for a Loro TreeID
75
+ */
76
+ hasLoroMapping(treeId: TreeID): boolean;
77
+ /**
78
+ * Get all current mappings (for debugging)
79
+ */
80
+ getAllMappings(): {
81
+ lexicalToLoro: Map<NodeKey, TreeID>;
82
+ loroToLexical: Map<TreeID, NodeKey>;
83
+ };
84
+ /**
85
+ * Clear all mappings (useful for testing or reset)
86
+ */
87
+ clearMappings(): void;
88
+ /**
89
+ * Synchronize existing tree nodes with Lexical editor state
90
+ * This should be called during initialization to establish mappings
91
+ *
92
+ * Note: Since lexicalKey is no longer persisted in tree node data,
93
+ * this method now relies on the TreeIntegrator to create mappings
94
+ * as nodes are integrated from Loro tree operations.
95
+ */
96
+ syncExistingNodes(editorState: EditorState): void;
97
+ }
98
+ /**
99
+ * Initialize the global node mapper
100
+ */
101
+ export declare function initializeNodeMapper(binding: Binding): NodeMapper;
102
+ /**
103
+ * Get the global node mapper instance
104
+ */
105
+ export declare function getNodeMapper(): NodeMapper;
106
+ /**
107
+ * Utility functions for common operations
108
+ */
109
+ /**
110
+ * Get Loro TreeNode by Lexical NodeKey (using global mapper)
111
+ */
112
+ export declare function getLoroNodeByLexicalKey(nodeKey: NodeKey, lexicalNode?: LexicalNode, parentTreeID?: TreeID, index?: number): LoroTreeNode;
113
+ /**
114
+ * Get Lexical NodeKey by Loro TreeID (using global mapper)
115
+ */
116
+ export declare function getLexicalKeyByLoroId(treeId: TreeID): NodeKey | null;
117
+ /**
118
+ * Get Lexical Node by Loro TreeID (using global mapper)
119
+ */
120
+ export declare function getLexicalNodeByLoroId(treeId: TreeID, editorState: EditorState): LexicalNode | null;
@@ -0,0 +1,289 @@
1
+ /*
2
+ * Copyright (c) 2025-2026 Datalayer, Inc.
3
+ * Distributed under the terms of the MIT License.
4
+ */
5
+ import { invariant } from '../utils/Invariant';
6
+ /**
7
+ * Bidirectional mapping between Lexical NodeKeys and Loro TreeIDs
8
+ */
9
+ export class NodeMapper {
10
+ // Maps Lexical NodeKey to Loro TreeID
11
+ lexicalToLoro = new Map();
12
+ // Maps Loro TreeID to Lexical NodeKey
13
+ loroToLexical = new Map();
14
+ tree;
15
+ constructor(binding) {
16
+ this.tree = binding.tree;
17
+ }
18
+ /**
19
+ * Create a bidirectional mapping between Lexical NodeKey and Loro TreeID
20
+ */
21
+ createMapping(nodeKey, treeId) {
22
+ this.lexicalToLoro.set(nodeKey, treeId);
23
+ this.loroToLexical.set(treeId, nodeKey);
24
+ }
25
+ /**
26
+ * Remove bidirectional mapping
27
+ */
28
+ removeMapping(nodeKey, treeId) {
29
+ this.lexicalToLoro.delete(nodeKey);
30
+ this.loroToLexical.delete(treeId);
31
+ }
32
+ /**
33
+ * Get Loro TreeNode based on Lexical NodeKey
34
+ * If the node doesn't exist, create it with proper parent-child relationship
35
+ */
36
+ getLoroNodeByLexicalKey(nodeKey, lexicalNode, parentTreeID, index) {
37
+ // Check if mapping already exists
38
+ const existingTreeID = this.lexicalToLoro.get(nodeKey);
39
+ if (existingTreeID && this.tree.has(existingTreeID)) {
40
+ return this.tree.getNodeByID(existingTreeID);
41
+ }
42
+ // Get parent TreeID from Lexical node if not provided
43
+ if (!parentTreeID && lexicalNode) {
44
+ const lexicalParent = lexicalNode.getParent();
45
+ if (lexicalParent) {
46
+ const parentKey = lexicalParent.getKey();
47
+ parentTreeID = this.lexicalToLoro.get(parentKey);
48
+ // If parent doesn't exist in Loro, create it first
49
+ if (!parentTreeID) {
50
+ const parentLoroNode = this.getLoroNodeByLexicalKey(parentKey, lexicalParent, undefined, undefined);
51
+ parentTreeID = parentLoroNode.id;
52
+ }
53
+ }
54
+ }
55
+ // Get index from Lexical node if not provided
56
+ if (index === undefined && lexicalNode) {
57
+ index = lexicalNode.getIndexWithinParent();
58
+ }
59
+ // Create new tree node if it doesn't exist
60
+ const newTreeID = this.createLoroNode(nodeKey, lexicalNode, parentTreeID, index);
61
+ return this.tree.getNodeByID(newTreeID);
62
+ }
63
+ /**
64
+ * Get Lexical NodeKey based on Loro TreeID
65
+ * If the node doesn't exist in Lexical, it needs to be created externally
66
+ */
67
+ getLexicalKeyByLoroId(treeId) {
68
+ // Check if mapping exists
69
+ const existingNodeKey = this.loroToLexical.get(treeId);
70
+ if (existingNodeKey) {
71
+ return existingNodeKey;
72
+ }
73
+ // If no mapping exists, we can't create a Lexical node here
74
+ // The caller should integrate Lexical node creation
75
+ return null;
76
+ }
77
+ /**
78
+ * Get Lexical Node from EditorState based on Loro TreeID
79
+ */
80
+ getLexicalNodeByLoroId(treeId, editorState) {
81
+ const nodeKey = this.getLexicalKeyByLoroId(treeId);
82
+ if (!nodeKey) {
83
+ return null;
84
+ }
85
+ return editorState._nodeMap.get(nodeKey) || null;
86
+ }
87
+ /**
88
+ * Get Lexical parent node key for a Loro TreeID
89
+ * Returns null if no parent or if parent not found in Lexical
90
+ * Note: This method needs the LoroTree API to be clarified for parent relationships
91
+ */
92
+ getLexicalParentByLoroId(treeId, loroTree) {
93
+ // TODO: Implement once LoroTree parent API is confirmed
94
+ // For now, we'll rely on the bidirectional mapping without tree traversal
95
+ return null;
96
+ }
97
+ /**
98
+ * Manually set bidirectional mapping between Lexical NodeKey and Loro TreeID
99
+ */
100
+ setMapping(nodeKey, treeId) {
101
+ this.lexicalToLoro.set(nodeKey, treeId);
102
+ this.loroToLexical.set(treeId, nodeKey);
103
+ }
104
+ /**
105
+ * Create a new Loro TreeNode and establish mapping
106
+ */
107
+ createLoroNode(nodeKey, lexicalNode, parentTreeID, index) {
108
+ const insertionIndex = index;
109
+ // Loro requires the insertion index to be within [0, children.length]. An
110
+ // out-of-range index means the position was computed against stale/unsynced
111
+ // siblings; surface it instead of silently clamping (which would drop the
112
+ // node at the wrong position and hide the real ordering bug).
113
+ if (insertionIndex !== undefined) {
114
+ const parentNode = parentTreeID !== undefined ? this.tree.getNodeByID(parentTreeID) : null;
115
+ const childrenLength = parentNode
116
+ ? (parentNode.children()?.length ?? 0)
117
+ : this.tree.roots().length;
118
+ invariant(insertionIndex >= 0 && insertionIndex <= childrenLength, 'createLoroNode: insertion index out of range', { nodeKey, parentTreeID, insertionIndex, childrenLength });
119
+ }
120
+ // Create the tree node first
121
+ const treeNode = this.tree.createNode(parentTreeID, insertionIndex);
122
+ // Get the TreeID from the created node
123
+ const treeId = treeNode.id;
124
+ // A requested parent must actually become this node's parent. If it does
125
+ // not, the CRDT structure diverges from Lexical — surface it.
126
+ if (parentTreeID) {
127
+ const actualParent = treeNode.parent();
128
+ invariant(actualParent != null && actualParent.id === parentTreeID, 'createLoroNode: parent relationship not established', { nodeKey, expected: parentTreeID, actual: actualParent?.id ?? null });
129
+ }
130
+ // Store basic metadata
131
+ treeNode.data.set('createdAt', Date.now());
132
+ // Store complete lexical node data if lexical node is provided
133
+ if (lexicalNode) {
134
+ try {
135
+ const lexicalNodeJSON = lexicalNode.exportJSON();
136
+ // Remove all key-related fields to avoid duplication (TreeID serves as the key)
137
+ if ('key' in lexicalNodeJSON || '__key' in lexicalNodeJSON || 'lexicalKey' in lexicalNodeJSON) {
138
+ const { key, __key, lexicalKey, children, ...cleanedData } = lexicalNodeJSON;
139
+ treeNode.data.set('lexical', cleanedData);
140
+ }
141
+ else {
142
+ const { children, ...cleanedData } = lexicalNodeJSON;
143
+ treeNode.data.set('lexical', cleanedData);
144
+ }
145
+ }
146
+ catch (error) {
147
+ console.warn('Failed to export lexical node JSON in NodesMapper:', error);
148
+ }
149
+ }
150
+ // Create bidirectional mapping
151
+ this.createMapping(nodeKey, treeId);
152
+ return treeId;
153
+ }
154
+ /**
155
+ * Update the mapping when a node is moved or modified
156
+ */
157
+ updateMapping(oldNodeKey, newNodeKey) {
158
+ const treeId = this.lexicalToLoro.get(oldNodeKey);
159
+ if (treeId) {
160
+ this.removeMapping(oldNodeKey, treeId);
161
+ this.createMapping(newNodeKey, treeId);
162
+ // Update timestamp in tree node data
163
+ const treeNode = this.tree.getNodeByID(treeId);
164
+ if (treeNode) {
165
+ treeNode.data.set('updatedAt', Date.now());
166
+ }
167
+ }
168
+ }
169
+ /**
170
+ * Remove mapping when a node is deleted (also deletes from Loro tree).
171
+ * Use this on the ORIGINATING side (propagation) where the local peer
172
+ * is actively deleting a node.
173
+ */
174
+ deleteMapping(nodeKey) {
175
+ const treeId = this.lexicalToLoro.get(nodeKey);
176
+ if (treeId) {
177
+ this.removeMapping(nodeKey, treeId);
178
+ // Delete the tree node
179
+ if (this.tree.has(treeId)) {
180
+ this.tree.delete(treeId);
181
+ }
182
+ }
183
+ }
184
+ /**
185
+ * Remove bidirectional mapping WITHOUT deleting from the Loro tree.
186
+ * Use this on the INTEGRATION side (receiving remote events) where the
187
+ * Loro tree has already been updated by the remote peer — we only need
188
+ * to clean up the local key↔TreeID association.
189
+ */
190
+ removeMappingForKey(nodeKey) {
191
+ const treeId = this.lexicalToLoro.get(nodeKey);
192
+ if (treeId) {
193
+ this.removeMapping(nodeKey, treeId);
194
+ }
195
+ }
196
+ /**
197
+ * Get TreeID by Lexical NodeKey (without creating if not found)
198
+ */
199
+ getTreeIDByLexicalKey(nodeKey) {
200
+ return this.lexicalToLoro.get(nodeKey);
201
+ }
202
+ /**
203
+ * Check if a mapping exists for a Lexical NodeKey
204
+ */
205
+ hasLexicalMapping(nodeKey) {
206
+ return this.lexicalToLoro.has(nodeKey);
207
+ }
208
+ /**
209
+ * Check if a mapping exists for a Loro TreeID
210
+ */
211
+ hasLoroMapping(treeId) {
212
+ return this.loroToLexical.has(treeId);
213
+ }
214
+ /**
215
+ * Get all current mappings (for debugging)
216
+ */
217
+ getAllMappings() {
218
+ return {
219
+ lexicalToLoro: new Map(this.lexicalToLoro),
220
+ loroToLexical: new Map(this.loroToLexical)
221
+ };
222
+ }
223
+ /**
224
+ * Clear all mappings (useful for testing or reset)
225
+ */
226
+ clearMappings() {
227
+ this.lexicalToLoro.clear();
228
+ this.loroToLexical.clear();
229
+ }
230
+ /**
231
+ * Synchronize existing tree nodes with Lexical editor state
232
+ * This should be called during initialization to establish mappings
233
+ *
234
+ * Note: Since lexicalKey is no longer persisted in tree node data,
235
+ * this method now relies on the TreeIntegrator to create mappings
236
+ * as nodes are integrated from Loro tree operations.
237
+ */
238
+ syncExistingNodes(editorState) {
239
+ // Since we no longer persist lexicalKey in tree node data,
240
+ // we cannot automatically establish mappings from existing tree nodes.
241
+ //
242
+ // Instead, mappings will be established through:
243
+ // 1. TreeIntegrator processing tree diffs during initialization
244
+ // 2. Normal collaboration flow as nodes are created/updated
245
+ //
246
+ // This method is kept for compatibility but is now a no-op.
247
+ console.log(' syncExistingNodes: Skipping sync - mappings established through TreeIntegrator');
248
+ }
249
+ }
250
+ // Global instance to be shared across the application
251
+ let globalNodeMapper = null;
252
+ /**
253
+ * Initialize the global node mapper
254
+ */
255
+ export function initializeNodeMapper(binding) {
256
+ globalNodeMapper = new NodeMapper(binding);
257
+ return globalNodeMapper;
258
+ }
259
+ /**
260
+ * Get the global node mapper instance
261
+ */
262
+ export function getNodeMapper() {
263
+ if (!globalNodeMapper) {
264
+ throw new Error('NodeMapper not initialized. Call initializeNodeMapper() first.');
265
+ }
266
+ return globalNodeMapper;
267
+ }
268
+ /**
269
+ * Utility functions for common operations
270
+ */
271
+ /**
272
+ * Get Loro TreeNode by Lexical NodeKey (using global mapper)
273
+ */
274
+ export function getLoroNodeByLexicalKey(nodeKey, lexicalNode, parentTreeID, index) {
275
+ return getNodeMapper().getLoroNodeByLexicalKey(nodeKey, lexicalNode, parentTreeID, index);
276
+ }
277
+ /**
278
+ * Get Lexical NodeKey by Loro TreeID (using global mapper)
279
+ */
280
+ export function getLexicalKeyByLoroId(treeId) {
281
+ return getNodeMapper().getLexicalKeyByLoroId(treeId);
282
+ }
283
+ /**
284
+ * Get Lexical Node by Loro TreeID (using global mapper)
285
+ */
286
+ export function getLexicalNodeByLoroId(treeId, editorState) {
287
+ return getNodeMapper().getLexicalNodeByLoroId(treeId, editorState);
288
+ }
289
+ // createLexicalNodeFromLoro function is now imported from NodeFactory
@@ -0,0 +1,60 @@
1
+ import { TreeID, LoroTree } from 'loro-crdt';
2
+ import { DecoratorNode, UpdateListenerPayload, NodeKey, ElementNode } from 'lexical';
3
+ import { Binding } from '../Bindings';
4
+ /**
5
+ * DecoratorNode Propagator for Loro Tree Collaboration
6
+ *
7
+ * DecoratorNode characteristics:
8
+ * - Wraps arbitrary view (React components, DOM nodes, etc.)
9
+ * - Acts as opaque wrapper around external components
10
+ * - Cannot have children in the traditional sense
11
+ * - Renders through decorate() method which returns the view
12
+ * - Examples: Images, Videos, Tweets, Charts, Custom Widgets
13
+ */
14
+ export interface DecoratorNodeMutatorOptions {
15
+ binding: Binding;
16
+ tree: LoroTree;
17
+ peerId: number;
18
+ }
19
+ /**
20
+ * Create DecoratorNode in Loro tree
21
+ */
22
+ export declare function createDecoratorNodeInLoro(nodeKey: NodeKey, decoratorType: string, // 'image', 'video', 'tweet', 'chart', etc.
23
+ decoratorData: any, // The data needed to render the decorator
24
+ parentId?: TreeID, index?: number, metadata?: Record<string, any>, lexicalNodeJSON?: any, // JSON object from exportJSON()
25
+ options?: DecoratorNodeMutatorOptions): TreeID;
26
+ /**
27
+ * Update DecoratorNode in Loro tree
28
+ */
29
+ export declare function updateDecoratorNodeInLoro(nodeKey: NodeKey, decoratorType?: string, decoratorData?: any, parentId?: TreeID, index?: number, metadata?: Record<string, any>, lexicalNodeJSON?: any, // JSON object from exportJSON()
30
+ options?: DecoratorNodeMutatorOptions): void;
31
+ /**
32
+ * Delete DecoratorNode from Loro tree
33
+ */
34
+ export declare function deleteDecoratorNodeInLoro(nodeKey: NodeKey, options: DecoratorNodeMutatorOptions): void;
35
+ /**
36
+ * Create DecoratorNode in Lexical from Loro tree data
37
+ * Note: This is a generic implementation. In practice, you'd need
38
+ * specific decorator node classes for each type (ImageNode, VideoNode, etc.)
39
+ */
40
+ export declare function createDecoratorNodeFromLoro(treeId: TreeID, parentNode: ElementNode, index?: number, options?: DecoratorNodeMutatorOptions): DecoratorNode<any> | null;
41
+ /**
42
+ * Update DecoratorNode in Lexical from Loro tree data
43
+ */
44
+ export declare function updateDecoratorNodeFromLoro(treeId: TreeID, lexicalNode: DecoratorNode<any>, newParentNode?: ElementNode, newIndex?: number, options?: DecoratorNodeMutatorOptions): void;
45
+ /**
46
+ * Delete DecoratorNode from Lexical
47
+ */
48
+ export declare function deleteDecoratorNodeFromLoro(treeId: TreeID, lexicalNode: DecoratorNode<any>, options?: DecoratorNodeMutatorOptions): void;
49
+ /**
50
+ * Utility to check if a tree node represents a DecoratorNode
51
+ */
52
+ export declare function isDecoratorNodeInTree(treeId: TreeID, tree: LoroTree): boolean;
53
+ /**
54
+ * Get DecoratorNode data from Loro tree
55
+ */
56
+ export declare function getDecoratorNodeDataFromTree(treeId: TreeID, tree: LoroTree): any;
57
+ /**
58
+ * Main propagate method for DecoratorNode - propagates all mutation types
59
+ */
60
+ export declare function propagateDecoratorNode(update: UpdateListenerPayload, mutation: 'created' | 'updated' | 'destroyed', nodeKey: NodeKey, options: DecoratorNodeMutatorOptions): void;