@datalayer/lexical-loro 0.1.0 → 0.2.2
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.
- package/README.md +1 -1
- package/package.json +7 -7
- package/lib/App.d.ts +0 -2
- package/lib/App.js +0 -141
- package/lib/Editor.d.ts +0 -2
- package/lib/Editor.js +0 -111
- package/lib/Settings.d.ts +0 -2
- package/lib/Settings.js +0 -57
- package/lib/appSettings.d.ts +0 -36
- package/lib/appSettings.js +0 -44
- package/lib/collab/loro/Bindings.d.ts +0 -41
- package/lib/collab/loro/Bindings.js +0 -95
- package/lib/collab/loro/Debug.d.ts +0 -33
- package/lib/collab/loro/Debug.js +0 -448
- package/lib/collab/loro/LexicalCollaborationContext.d.ts +0 -19
- package/lib/collab/loro/LexicalCollaborationContext.js +0 -48
- package/lib/collab/loro/LexicalCollaborationPlugin.d.ts +0 -24
- package/lib/collab/loro/LexicalCollaborationPlugin.js +0 -83
- package/lib/collab/loro/State.d.ts +0 -53
- package/lib/collab/loro/State.js +0 -90
- package/lib/collab/loro/components/LoroCollaborationUI.d.ts +0 -13
- package/lib/collab/loro/components/LoroCollaborationUI.js +0 -9
- package/lib/collab/loro/components/LoroCollaborators.d.ts +0 -8
- package/lib/collab/loro/components/LoroCollaborators.js +0 -97
- package/lib/collab/loro/components/index.d.ts +0 -2
- package/lib/collab/loro/components/index.js +0 -2
- package/lib/collab/loro/index.d.ts +0 -6
- package/lib/collab/loro/index.js +0 -6
- package/lib/collab/loro/integrators/BaseIntegrator.d.ts +0 -14
- package/lib/collab/loro/integrators/BaseIntegrator.js +0 -1
- package/lib/collab/loro/integrators/CounterIntegrator.d.ts +0 -23
- package/lib/collab/loro/integrators/CounterIntegrator.js +0 -40
- package/lib/collab/loro/integrators/ListIntegrator.d.ts +0 -23
- package/lib/collab/loro/integrators/ListIntegrator.js +0 -49
- package/lib/collab/loro/integrators/MapIntegrator.d.ts +0 -24
- package/lib/collab/loro/integrators/MapIntegrator.js +0 -177
- package/lib/collab/loro/integrators/TextIntegrator.d.ts +0 -25
- package/lib/collab/loro/integrators/TextIntegrator.js +0 -51
- package/lib/collab/loro/integrators/TreeIntegrator.d.ts +0 -25
- package/lib/collab/loro/integrators/TreeIntegrator.js +0 -201
- package/lib/collab/loro/nodes/NodeFactory.d.ts +0 -8
- package/lib/collab/loro/nodes/NodeFactory.js +0 -105
- package/lib/collab/loro/nodes/NodesMapper.d.ts +0 -111
- package/lib/collab/loro/nodes/NodesMapper.js +0 -258
- package/lib/collab/loro/propagators/DecoratorNodePropagator.d.ts +0 -60
- package/lib/collab/loro/propagators/DecoratorNodePropagator.js +0 -302
- package/lib/collab/loro/propagators/ElementNodePropagator.d.ts +0 -62
- package/lib/collab/loro/propagators/ElementNodePropagator.js +0 -335
- package/lib/collab/loro/propagators/LineBreakNodePropagator.d.ts +0 -57
- package/lib/collab/loro/propagators/LineBreakNodePropagator.js +0 -196
- package/lib/collab/loro/propagators/RootNodePropagator.d.ts +0 -55
- package/lib/collab/loro/propagators/RootNodePropagator.js +0 -168
- package/lib/collab/loro/propagators/TextNodePropagator.d.ts +0 -60
- package/lib/collab/loro/propagators/TextNodePropagator.js +0 -434
- package/lib/collab/loro/propagators/index.d.ts +0 -49
- package/lib/collab/loro/propagators/index.js +0 -32
- package/lib/collab/loro/provider/websocket.d.ts +0 -116
- package/lib/collab/loro/provider/websocket.js +0 -907
- package/lib/collab/loro/servers/index.d.ts +0 -0
- package/lib/collab/loro/servers/index.js +0 -0
- package/lib/collab/loro/servers/ws/callback.d.ts +0 -5
- package/lib/collab/loro/servers/ws/callback.js +0 -85
- package/lib/collab/loro/servers/ws/server.d.ts +0 -2
- package/lib/collab/loro/servers/ws/server.js +0 -25
- package/lib/collab/loro/servers/ws/utils.d.ts +0 -40
- package/lib/collab/loro/servers/ws/utils.js +0 -513
- package/lib/collab/loro/sync/SyncCursors.d.ts +0 -32
- package/lib/collab/loro/sync/SyncCursors.js +0 -435
- package/lib/collab/loro/sync/SyncLexicalToLoro.d.ts +0 -4
- package/lib/collab/loro/sync/SyncLexicalToLoro.js +0 -80
- package/lib/collab/loro/sync/SyncLoroToLexical.d.ts +0 -5
- package/lib/collab/loro/sync/SyncLoroToLexical.js +0 -96
- package/lib/collab/loro/types/LexicalNodeData.d.ts +0 -32
- package/lib/collab/loro/types/LexicalNodeData.js +0 -71
- package/lib/collab/loro/useCollaboration.d.ts +0 -12
- package/lib/collab/loro/useCollaboration.js +0 -248
- package/lib/collab/loro/utils/InitialContent.d.ts +0 -64
- package/lib/collab/loro/utils/InitialContent.js +0 -109
- package/lib/collab/loro/utils/LexicalToLoro.d.ts +0 -18
- package/lib/collab/loro/utils/LexicalToLoro.js +0 -96
- package/lib/collab/loro/utils/Utils.d.ts +0 -44
- package/lib/collab/loro/utils/Utils.js +0 -153
- package/lib/collab/loro/wsProvider.d.ts +0 -8
- package/lib/collab/loro/wsProvider.js +0 -31
- package/lib/collab/utils/invariant.d.ts +0 -1
- package/lib/collab/utils/invariant.js +0 -11
- package/lib/collab/utils/simpleDiffWithCursor.d.ts +0 -5
- package/lib/collab/utils/simpleDiffWithCursor.js +0 -31
- package/lib/collab/yjs/Bindings.d.ts +0 -23
- package/lib/collab/yjs/Bindings.js +0 -26
- package/lib/collab/yjs/Debug.d.ts +0 -23
- package/lib/collab/yjs/Debug.js +0 -213
- package/lib/collab/yjs/LexicalCollaborationContext.d.ts +0 -10
- package/lib/collab/yjs/LexicalCollaborationContext.js +0 -37
- package/lib/collab/yjs/LexicalCollaborationPlugin.d.ts +0 -21
- package/lib/collab/yjs/LexicalCollaborationPlugin.js +0 -63
- package/lib/collab/yjs/State.d.ts +0 -51
- package/lib/collab/yjs/State.js +0 -35
- package/lib/collab/yjs/nodes/AnyCollabNode.d.ts +0 -5
- package/lib/collab/yjs/nodes/AnyCollabNode.js +0 -1
- package/lib/collab/yjs/nodes/CollabDecoratorNode.d.ts +0 -22
- package/lib/collab/yjs/nodes/CollabDecoratorNode.js +0 -64
- package/lib/collab/yjs/nodes/CollabElementNode.d.ts +0 -40
- package/lib/collab/yjs/nodes/CollabElementNode.js +0 -462
- package/lib/collab/yjs/nodes/CollabLineBreakNode.d.ts +0 -19
- package/lib/collab/yjs/nodes/CollabLineBreakNode.js +0 -44
- package/lib/collab/yjs/nodes/CollabTextNode.d.ts +0 -25
- package/lib/collab/yjs/nodes/CollabTextNode.js +0 -103
- package/lib/collab/yjs/provider/websocket.d.ts +0 -88
- package/lib/collab/yjs/provider/websocket.js +0 -415
- package/lib/collab/yjs/servers/index.d.ts +0 -0
- package/lib/collab/yjs/servers/index.js +0 -0
- package/lib/collab/yjs/servers/ws/callback.d.ts +0 -5
- package/lib/collab/yjs/servers/ws/callback.js +0 -72
- package/lib/collab/yjs/servers/ws/server.d.ts +0 -2
- package/lib/collab/yjs/servers/ws/server.js +0 -25
- package/lib/collab/yjs/servers/ws/utils.d.ts +0 -49
- package/lib/collab/yjs/servers/ws/utils.js +0 -284
- package/lib/collab/yjs/sync/SyncCursors.d.ts +0 -39
- package/lib/collab/yjs/sync/SyncCursors.js +0 -351
- package/lib/collab/yjs/sync/SyncEditorStates.d.ts +0 -10
- package/lib/collab/yjs/sync/SyncEditorStates.js +0 -200
- package/lib/collab/yjs/useCollaboration.d.ts +0 -12
- package/lib/collab/yjs/useCollaboration.js +0 -255
- package/lib/collab/yjs/utils/Utils.d.ts +0 -25
- package/lib/collab/yjs/utils/Utils.js +0 -402
- package/lib/collab/yjs/wsProvider.d.ts +0 -3
- package/lib/collab/yjs/wsProvider.js +0 -21
- package/lib/commenting/index.d.ts +0 -41
- package/lib/commenting/index.js +0 -324
- package/lib/context/FlashMessageContext.d.ts +0 -7
- package/lib/context/FlashMessageContext.js +0 -24
- package/lib/context/SettingsContext.d.ts +0 -12
- package/lib/context/SettingsContext.js +0 -38
- package/lib/context/SharedHistoryContext.d.ts +0 -11
- package/lib/context/SharedHistoryContext.js +0 -11
- package/lib/context/ToolbarContext.d.ts +0 -65
- package/lib/context/ToolbarContext.js +0 -84
- package/lib/demo.d.ts +0 -12
- package/lib/demo.js +0 -41
- package/lib/hooks/useFlashMessage.d.ts +0 -2
- package/lib/hooks/useFlashMessage.js +0 -4
- package/lib/hooks/useModal.d.ts +0 -5
- package/lib/hooks/useModal.js +0 -26
- package/lib/hooks/useReport.d.ts +0 -1
- package/lib/hooks/useReport.js +0 -46
- package/lib/index.d.ts +0 -1
- package/lib/index.js +0 -1
- package/lib/nodes/AutocompleteNode.d.ts +0 -27
- package/lib/nodes/AutocompleteNode.js +0 -56
- package/lib/nodes/CounterComponent.d.ts +0 -6
- package/lib/nodes/CounterComponent.js +0 -137
- package/lib/nodes/CounterNode.d.ts +0 -23
- package/lib/nodes/CounterNode.js +0 -47
- package/lib/nodes/DateTimeNode/DateTimeComponent.d.ts +0 -8
- package/lib/nodes/DateTimeNode/DateTimeComponent.js +0 -119
- package/lib/nodes/DateTimeNode/DateTimeNode.d.ts +0 -27
- package/lib/nodes/DateTimeNode/DateTimeNode.js +0 -82
- package/lib/nodes/EmojiNode.d.ts +0 -18
- package/lib/nodes/EmojiNode.js +0 -50
- package/lib/nodes/EquationComponent.d.ts +0 -9
- package/lib/nodes/EquationComponent.js +0 -75
- package/lib/nodes/EquationNode.d.ts +0 -26
- package/lib/nodes/EquationNode.js +0 -109
- package/lib/nodes/ExcalidrawNode/ExcalidrawComponent.d.ts +0 -8
- package/lib/nodes/ExcalidrawNode/ExcalidrawComponent.js +0 -110
- package/lib/nodes/ExcalidrawNode/ExcalidrawImage.d.ts +0 -50
- package/lib/nodes/ExcalidrawNode/ExcalidrawImage.js +0 -55
- package/lib/nodes/ExcalidrawNode/index.d.ts +0 -32
- package/lib/nodes/ExcalidrawNode/index.js +0 -117
- package/lib/nodes/FigmaNode.d.ts +0 -20
- package/lib/nodes/FigmaNode.js +0 -52
- package/lib/nodes/ImageComponent.d.ts +0 -16
- package/lib/nodes/ImageComponent.js +0 -272
- package/lib/nodes/ImageNode.d.ts +0 -50
- package/lib/nodes/ImageNode.js +0 -151
- package/lib/nodes/InlineImageNode/InlineImageComponent.d.ts +0 -26
- package/lib/nodes/InlineImageNode/InlineImageComponent.js +0 -161
- package/lib/nodes/InlineImageNode/InlineImageNode.d.ts +0 -59
- package/lib/nodes/InlineImageNode/InlineImageNode.js +0 -162
- package/lib/nodes/KeywordNode.d.ts +0 -14
- package/lib/nodes/KeywordNode.js +0 -33
- package/lib/nodes/LayoutContainerNode.d.ts +0 -24
- package/lib/nodes/LayoutContainerNode.js +0 -91
- package/lib/nodes/LayoutItemNode.d.ts +0 -16
- package/lib/nodes/LayoutItemNode.js +0 -65
- package/lib/nodes/MentionNode.d.ts +0 -20
- package/lib/nodes/MentionNode.js +0 -81
- package/lib/nodes/PageBreakNode/index.d.ts +0 -17
- package/lib/nodes/PageBreakNode/index.js +0 -83
- package/lib/nodes/PlaygroundNodes.d.ts +0 -3
- package/lib/nodes/PlaygroundNodes.js +0 -71
- package/lib/nodes/PollComponent.d.ts +0 -9
- package/lib/nodes/PollComponent.js +0 -85
- package/lib/nodes/PollNode.d.ts +0 -43
- package/lib/nodes/PollNode.js +0 -153
- package/lib/nodes/SpecialTextNode.d.ts +0 -24
- package/lib/nodes/SpecialTextNode.js +0 -50
- package/lib/nodes/StickyComponent.d.ts +0 -10
- package/lib/nodes/StickyComponent.js +0 -162
- package/lib/nodes/StickyNode.d.ts +0 -31
- package/lib/nodes/StickyNode.js +0 -76
- package/lib/nodes/TweetNode.d.ts +0 -21
- package/lib/nodes/TweetNode.js +0 -119
- package/lib/nodes/YouTubeNode.d.ts +0 -22
- package/lib/nodes/YouTubeNode.js +0 -84
- package/lib/plugins/ActionsPlugin/index.d.ts +0 -5
- package/lib/plugins/ActionsPlugin/index.js +0 -168
- package/lib/plugins/AutoEmbedPlugin/index.d.ts +0 -19
- package/lib/plugins/AutoEmbedPlugin/index.js +0 -158
- package/lib/plugins/AutoLinkPlugin/index.d.ts +0 -2
- package/lib/plugins/AutoLinkPlugin/index.js +0 -15
- package/lib/plugins/AutocompletePlugin/index.d.ts +0 -10
- package/lib/plugins/AutocompletePlugin/index.js +0 -2473
- package/lib/plugins/CodeActionMenuPlugin/components/CopyButton/index.d.ts +0 -7
- package/lib/plugins/CodeActionMenuPlugin/components/CopyButton/index.js +0 -42
- package/lib/plugins/CodeActionMenuPlugin/components/PrettierButton/index.d.ts +0 -17
- package/lib/plugins/CodeActionMenuPlugin/components/PrettierButton/index.js +0 -111
- package/lib/plugins/CodeActionMenuPlugin/index.d.ts +0 -5
- package/lib/plugins/CodeActionMenuPlugin/index.js +0 -104
- package/lib/plugins/CodeActionMenuPlugin/utils.d.ts +0 -1
- package/lib/plugins/CodeActionMenuPlugin/utils.js +0 -18
- package/lib/plugins/CodeHighlightPrismPlugin/index.d.ts +0 -2
- package/lib/plugins/CodeHighlightPrismPlugin/index.js +0 -10
- package/lib/plugins/CodeHighlightShikiPlugin/index.d.ts +0 -2
- package/lib/plugins/CodeHighlightShikiPlugin/index.js +0 -10
- package/lib/plugins/CollapsiblePlugin/CollapsibleContainerNode.d.ts +0 -25
- package/lib/plugins/CollapsiblePlugin/CollapsibleContainerNode.js +0 -131
- package/lib/plugins/CollapsiblePlugin/CollapsibleContentNode.d.ts +0 -16
- package/lib/plugins/CollapsiblePlugin/CollapsibleContentNode.js +0 -79
- package/lib/plugins/CollapsiblePlugin/CollapsibleTitleNode.d.ts +0 -16
- package/lib/plugins/CollapsiblePlugin/CollapsibleTitleNode.js +0 -81
- package/lib/plugins/CollapsiblePlugin/CollapsibleUtils.d.ts +0 -2
- package/lib/plugins/CollapsiblePlugin/CollapsibleUtils.js +0 -8
- package/lib/plugins/CollapsiblePlugin/index.d.ts +0 -3
- package/lib/plugins/CollapsiblePlugin/index.js +0 -128
- package/lib/plugins/CommentPlugin/index.d.ts +0 -9
- package/lib/plugins/CommentPlugin/index.js +0 -460
- package/lib/plugins/ComponentPickerPlugin/index.d.ts +0 -2
- package/lib/plugins/ComponentPickerPlugin/index.js +0 -276
- package/lib/plugins/ContextMenuPlugin/index.d.ts +0 -2
- package/lib/plugins/ContextMenuPlugin/index.js +0 -112
- package/lib/plugins/CounterPlugin/index.d.ts +0 -3
- package/lib/plugins/CounterPlugin/index.js +0 -20
- package/lib/plugins/DatalayerPlugin/index.d.ts +0 -2
- package/lib/plugins/DatalayerPlugin/index.js +0 -218
- package/lib/plugins/DateTimePlugin/index.d.ts +0 -8
- package/lib/plugins/DateTimePlugin/index.js +0 -24
- package/lib/plugins/DocsPlugin/index.d.ts +0 -2
- package/lib/plugins/DocsPlugin/index.js +0 -4
- package/lib/plugins/DragDropPastePlugin/index.d.ts +0 -1
- package/lib/plugins/DragDropPastePlugin/index.js +0 -33
- package/lib/plugins/DraggableBlockPlugin/index.d.ts +0 -12
- package/lib/plugins/DraggableBlockPlugin/index.js +0 -36
- package/lib/plugins/EmojiPickerPlugin/index.d.ts +0 -1
- package/lib/plugins/EmojiPickerPlugin/index.js +0 -80
- package/lib/plugins/EmojisPlugin/index.d.ts +0 -2
- package/lib/plugins/EmojisPlugin/index.js +0 -52
- package/lib/plugins/EquationsPlugin/index.d.ts +0 -14
- package/lib/plugins/EquationsPlugin/index.js +0 -34
- package/lib/plugins/ExcalidrawPlugin/index.d.ts +0 -5
- package/lib/plugins/ExcalidrawPlugin/index.js +0 -44
- package/lib/plugins/FigmaPlugin/index.d.ts +0 -4
- package/lib/plugins/FigmaPlugin/index.js +0 -20
- package/lib/plugins/FloatingLinkEditorPlugin/index.d.ts +0 -15
- package/lib/plugins/FloatingLinkEditorPlugin/index.js +0 -280
- package/lib/plugins/FloatingTextFormatToolbarPlugin/index.d.ts +0 -7
- package/lib/plugins/FloatingTextFormatToolbarPlugin/index.js +0 -219
- package/lib/plugins/ImagesPlugin/index.d.ts +0 -24
- package/lib/plugins/ImagesPlugin/index.js +0 -195
- package/lib/plugins/InlineImagePlugin/index.d.ts +0 -17
- package/lib/plugins/InlineImagePlugin/index.js +0 -180
- package/lib/plugins/KeywordsPlugin/index.d.ts +0 -2
- package/lib/plugins/KeywordsPlugin/index.js +0 -31
- package/lib/plugins/LayoutPlugin/InsertLayoutDialog.d.ts +0 -6
- package/lib/plugins/LayoutPlugin/InsertLayoutDialog.js +0 -21
- package/lib/plugins/LayoutPlugin/LayoutPlugin.d.ts +0 -7
- package/lib/plugins/LayoutPlugin/LayoutPlugin.js +0 -131
- package/lib/plugins/LinkPlugin/index.d.ts +0 -6
- package/lib/plugins/LinkPlugin/index.js +0 -11
- package/lib/plugins/MarkdownShortcutPlugin/index.d.ts +0 -2
- package/lib/plugins/MarkdownShortcutPlugin/index.js +0 -6
- package/lib/plugins/MarkdownTransformers/index.d.ts +0 -8
- package/lib/plugins/MarkdownTransformers/index.js +0 -234
- package/lib/plugins/MaxLengthPlugin/index.d.ts +0 -3
- package/lib/plugins/MaxLengthPlugin/index.js +0 -37
- package/lib/plugins/MentionsPlugin/index.d.ts +0 -2
- package/lib/plugins/MentionsPlugin/index.js +0 -564
- package/lib/plugins/PageBreakPlugin/index.d.ts +0 -4
- package/lib/plugins/PageBreakPlugin/index.js +0 -27
- package/lib/plugins/PasteLogPlugin/index.d.ts +0 -2
- package/lib/plugins/PasteLogPlugin/index.js +0 -27
- package/lib/plugins/PollPlugin/index.d.ts +0 -8
- package/lib/plugins/PollPlugin/index.js +0 -38
- package/lib/plugins/ShortcutsPlugin/index.d.ts +0 -6
- package/lib/plugins/ShortcutsPlugin/index.js +0 -112
- package/lib/plugins/ShortcutsPlugin/shortcuts.d.ts +0 -59
- package/lib/plugins/ShortcutsPlugin/shortcuts.js +0 -169
- package/lib/plugins/SpecialTextPlugin/index.d.ts +0 -2
- package/lib/plugins/SpecialTextPlugin/index.js +0 -46
- package/lib/plugins/SpeechToTextPlugin/index.d.ts +0 -5
- package/lib/plugins/SpeechToTextPlugin/index.js +0 -82
- package/lib/plugins/StickyPlugin/index.d.ts +0 -2
- package/lib/plugins/StickyPlugin/index.js +0 -12
- package/lib/plugins/TabFocusPlugin/index.d.ts +0 -1
- package/lib/plugins/TabFocusPlugin/index.js +0 -34
- package/lib/plugins/TableActionMenuPlugin/index.d.ts +0 -5
- package/lib/plugins/TableActionMenuPlugin/index.js +0 -492
- package/lib/plugins/TableCellResizer/index.d.ts +0 -3
- package/lib/plugins/TableCellResizer/index.js +0 -297
- package/lib/plugins/TableHoverActionsPlugin/index.d.ts +0 -4
- package/lib/plugins/TableHoverActionsPlugin/index.js +0 -188
- package/lib/plugins/TableOfContentsPlugin/index.d.ts +0 -2
- package/lib/plugins/TableOfContentsPlugin/index.js +0 -116
- package/lib/plugins/TablePlugin.d.ts +0 -31
- package/lib/plugins/TablePlugin.js +0 -63
- package/lib/plugins/TestRecorderPlugin/index.d.ts +0 -3
- package/lib/plugins/TestRecorderPlugin/index.js +0 -346
- package/lib/plugins/ToolbarPlugin/fontSize.d.ts +0 -9
- package/lib/plugins/ToolbarPlugin/fontSize.js +0 -80
- package/lib/plugins/ToolbarPlugin/index.d.ts +0 -9
- package/lib/plugins/ToolbarPlugin/index.js +0 -500
- package/lib/plugins/ToolbarPlugin/utils.d.ts +0 -26
- package/lib/plugins/ToolbarPlugin/utils.js +0 -243
- package/lib/plugins/TreeViewPlugin/index.d.ts +0 -2
- package/lib/plugins/TreeViewPlugin/index.js +0 -7
- package/lib/plugins/TwitterPlugin/index.d.ts +0 -4
- package/lib/plugins/TwitterPlugin/index.js +0 -20
- package/lib/plugins/TypingPerfPlugin/index.d.ts +0 -2
- package/lib/plugins/TypingPerfPlugin/index.js +0 -93
- package/lib/plugins/YouTubePlugin/index.d.ts +0 -4
- package/lib/plugins/YouTubePlugin/index.js +0 -20
- package/lib/server/validation.d.ts +0 -1
- package/lib/server/validation.js +0 -111
- package/lib/setupEnv.d.ts +0 -2
- package/lib/setupEnv.js +0 -25
- package/lib/themes/CommentEditorTheme.d.ts +0 -4
- package/lib/themes/CommentEditorTheme.js +0 -7
- package/lib/themes/PlaygroundEditorTheme.d.ts +0 -4
- package/lib/themes/PlaygroundEditorTheme.js +0 -120
- package/lib/themes/StickyEditorTheme.d.ts +0 -4
- package/lib/themes/StickyEditorTheme.js +0 -7
- package/lib/tyes.dt.d.ts +0 -12
- package/lib/tyes.dt.js +0 -0
- package/lib/ui/Button.d.ts +0 -12
- package/lib/ui/Button.js +0 -6
- package/lib/ui/ColorPicker.d.ts +0 -14
- package/lib/ui/ColorPicker.js +0 -219
- package/lib/ui/ContentEditable.d.ts +0 -9
- package/lib/ui/ContentEditable.js +0 -6
- package/lib/ui/Dialog.d.ts +0 -10
- package/lib/ui/Dialog.js +0 -8
- package/lib/ui/DropDown.d.ts +0 -18
- package/lib/ui/DropDown.js +0 -133
- package/lib/ui/DropdownColorPicker.d.ts +0 -13
- package/lib/ui/DropdownColorPicker.js +0 -6
- package/lib/ui/EquationEditor.d.ts +0 -8
- package/lib/ui/EquationEditor.js +0 -11
- package/lib/ui/ExcalidrawModal.d.ts +0 -42
- package/lib/ui/ExcalidrawModal.js +0 -103
- package/lib/ui/FileInput.d.ts +0 -10
- package/lib/ui/FileInput.js +0 -5
- package/lib/ui/FlashMessage.d.ts +0 -7
- package/lib/ui/FlashMessage.js +0 -6
- package/lib/ui/ImageResizer.d.ts +0 -17
- package/lib/ui/ImageResizer.js +0 -171
- package/lib/ui/KatexEquationAlterer.d.ts +0 -8
- package/lib/ui/KatexEquationAlterer.js +0 -23
- package/lib/ui/KatexRenderer.d.ts +0 -6
- package/lib/ui/KatexRenderer.js +0 -24
- package/lib/ui/Modal.d.ts +0 -9
- package/lib/ui/Modal.js +0 -48
- package/lib/ui/Select.d.ts +0 -8
- package/lib/ui/Select.js +0 -5
- package/lib/ui/Switch.d.ts +0 -8
- package/lib/ui/Switch.js +0 -6
- package/lib/ui/TextInput.d.ts +0 -13
- package/lib/ui/TextInput.js +0 -7
- package/lib/utils/docSerialization.d.ts +0 -3
- package/lib/utils/docSerialization.js +0 -56
- package/lib/utils/emoji-list.d.ts +0 -20
- package/lib/utils/emoji-list.js +0 -16605
- package/lib/utils/getDOMRangeRect.d.ts +0 -8
- package/lib/utils/getDOMRangeRect.js +0 -22
- package/lib/utils/getSelectedNode.d.ts +0 -2
- package/lib/utils/getSelectedNode.js +0 -24
- package/lib/utils/getThemeSelector.d.ts +0 -2
- package/lib/utils/getThemeSelector.js +0 -10
- package/lib/utils/isMobileWidth.d.ts +0 -7
- package/lib/utils/isMobileWidth.js +0 -7
- package/lib/utils/joinClasses.d.ts +0 -1
- package/lib/utils/joinClasses.js +0 -3
- package/lib/utils/setFloatingElemPosition.d.ts +0 -1
- package/lib/utils/setFloatingElemPosition.js +0 -55
- package/lib/utils/setFloatingElemPositionForLinkEditor.d.ts +0 -1
- package/lib/utils/setFloatingElemPositionForLinkEditor.js +0 -32
- package/lib/utils/swipe.d.ts +0 -4
- package/lib/utils/swipe.js +0 -90
- package/lib/utils/url.d.ts +0 -2
- package/lib/utils/url.js +0 -27
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { LexicalNode } from 'lexical';
|
|
2
|
-
/**
|
|
3
|
-
* Data structure stored in Loro tree node data
|
|
4
|
-
*/
|
|
5
|
-
export interface LexicalNodeData {
|
|
6
|
-
lexicalNode: LexicalNode;
|
|
7
|
-
}
|
|
8
|
-
/**
|
|
9
|
-
* Helper functions for working with LexicalNodeData
|
|
10
|
-
*/
|
|
11
|
-
export declare class LexicalNodeDataHelper {
|
|
12
|
-
/**
|
|
13
|
-
* Create LexicalNodeData from a Lexical node
|
|
14
|
-
*/
|
|
15
|
-
static create(lexicalNode: LexicalNode): LexicalNodeData;
|
|
16
|
-
/**
|
|
17
|
-
* Serialize LexicalNodeData for storage in Loro
|
|
18
|
-
*/
|
|
19
|
-
static serialize(data: LexicalNodeData): string;
|
|
20
|
-
/**
|
|
21
|
-
* Deserialize LexicalNodeData from Loro storage
|
|
22
|
-
*/
|
|
23
|
-
static deserialize(serialized: string): LexicalNodeData | null;
|
|
24
|
-
/**
|
|
25
|
-
* Extract the LexicalNode from LexicalNodeData
|
|
26
|
-
*/
|
|
27
|
-
static getLexicalNode(data: LexicalNodeData): LexicalNode;
|
|
28
|
-
/**
|
|
29
|
-
* Get node type from LexicalNodeData
|
|
30
|
-
*/
|
|
31
|
-
static getNodeType(data: LexicalNodeData): string;
|
|
32
|
-
}
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Helper functions for working with LexicalNodeData
|
|
3
|
-
*/
|
|
4
|
-
export class LexicalNodeDataHelper {
|
|
5
|
-
/**
|
|
6
|
-
* Create LexicalNodeData from a Lexical node
|
|
7
|
-
*/
|
|
8
|
-
static create(lexicalNode) {
|
|
9
|
-
return {
|
|
10
|
-
lexicalNode
|
|
11
|
-
};
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* Serialize LexicalNodeData for storage in Loro
|
|
15
|
-
*/
|
|
16
|
-
static serialize(data) {
|
|
17
|
-
try {
|
|
18
|
-
return JSON.stringify({
|
|
19
|
-
lexicalNode: data.lexicalNode.exportJSON()
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
catch (error) {
|
|
23
|
-
console.warn('Failed to serialize LexicalNodeData:', error);
|
|
24
|
-
return JSON.stringify({
|
|
25
|
-
lexicalNode: {
|
|
26
|
-
type: data.lexicalNode.getType(),
|
|
27
|
-
key: data.lexicalNode.getKey()
|
|
28
|
-
}
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Deserialize LexicalNodeData from Loro storage
|
|
34
|
-
*/
|
|
35
|
-
static deserialize(serialized) {
|
|
36
|
-
try {
|
|
37
|
-
const parsed = JSON.parse(serialized);
|
|
38
|
-
// Validate that we have the expected structure
|
|
39
|
-
if (!parsed || !parsed.lexicalNode) {
|
|
40
|
-
console.warn('Invalid LexicalNodeData structure:', parsed);
|
|
41
|
-
return null;
|
|
42
|
-
}
|
|
43
|
-
return {
|
|
44
|
-
lexicalNode: parsed.lexicalNode
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
catch (error) {
|
|
48
|
-
console.warn('Failed to deserialize LexicalNodeData:', error);
|
|
49
|
-
return null;
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* Extract the LexicalNode from LexicalNodeData
|
|
54
|
-
*/
|
|
55
|
-
static getLexicalNode(data) {
|
|
56
|
-
return data.lexicalNode;
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* Get node type from LexicalNodeData
|
|
60
|
-
*/
|
|
61
|
-
static getNodeType(data) {
|
|
62
|
-
// Handle both actual Lexical nodes (with getType method) and deserialized JSON objects
|
|
63
|
-
if (typeof data.lexicalNode.getType === 'function') {
|
|
64
|
-
return data.lexicalNode.getType();
|
|
65
|
-
}
|
|
66
|
-
else {
|
|
67
|
-
// Fallback to direct property access for deserialized JSON
|
|
68
|
-
return data.lexicalNode.__type || 'unknown';
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import * as React from 'react';
|
|
2
|
-
import type { JSX } from 'react';
|
|
3
|
-
import type { LexicalEditor } from 'lexical';
|
|
4
|
-
import { InitialEditorStateType } from '@lexical/react/LexicalComposer';
|
|
5
|
-
import { LoroDoc } from 'loro-crdt';
|
|
6
|
-
import type { Provider } from './State';
|
|
7
|
-
import { Binding } from './Bindings';
|
|
8
|
-
import { SyncCursorPositionsFn } from './sync/SyncCursors';
|
|
9
|
-
export type CursorsContainerRef = React.MutableRefObject<HTMLElement | null>;
|
|
10
|
-
export declare function useCollaboration(editor: LexicalEditor, id: string, provider: Provider, docMap: Map<string, LoroDoc>, name: string, color: string, shouldBootstrap: boolean, binding: Binding, setDoc: React.Dispatch<React.SetStateAction<LoroDoc | undefined>>, cursorsContainerRef?: CursorsContainerRef, initialEditorState?: InitialEditorStateType, awarenessData?: object, syncCursorPositionsFn?: SyncCursorPositionsFn, onInitialization?: (isInitialized: boolean) => void): JSX.Element;
|
|
11
|
-
export declare function useFocusTracking(editor: LexicalEditor, provider: Provider, name: string, color: string, awarenessData?: object): void;
|
|
12
|
-
export declare function useHistory(editor: LexicalEditor, binding: Binding): () => void;
|
|
@@ -1,248 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import * as React from 'react';
|
|
3
|
-
import { useCallback, useEffect, useMemo, useRef } from 'react';
|
|
4
|
-
import { createPortal } from 'react-dom';
|
|
5
|
-
import { mergeRegister } from '@lexical/utils';
|
|
6
|
-
import { $getRoot, BLUR_COMMAND, CAN_REDO_COMMAND, CAN_UNDO_COMMAND, COMMAND_PRIORITY_EDITOR, FOCUS_COMMAND, HISTORY_MERGE_TAG, REDO_COMMAND, SKIP_COLLAB_TAG, UNDO_COMMAND, } from 'lexical';
|
|
7
|
-
import { CONNECTED_COMMAND, createUndoManager, initLocalState, setLocalStateFocus, TOGGLE_CONNECT_COMMAND, } from './State';
|
|
8
|
-
import { syncLexicalToLoro } from './sync/SyncLexicalToLoro';
|
|
9
|
-
import { syncLoroToLexical } from './sync/SyncLoroToLexical';
|
|
10
|
-
import { syncCursorPositions } from './sync/SyncCursors';
|
|
11
|
-
export function useCollaboration(editor, id, provider, docMap, name, color, shouldBootstrap, binding, setDoc, cursorsContainerRef, initialEditorState, awarenessData, syncCursorPositionsFn = syncCursorPositions, onInitialization) {
|
|
12
|
-
const isReloadingDoc = useRef(false);
|
|
13
|
-
const connect = useCallback(() => provider.connect(), [provider]);
|
|
14
|
-
const disconnect = useCallback(() => {
|
|
15
|
-
try {
|
|
16
|
-
provider.disconnect();
|
|
17
|
-
}
|
|
18
|
-
catch (e) {
|
|
19
|
-
// Do nothing
|
|
20
|
-
}
|
|
21
|
-
}, [provider]);
|
|
22
|
-
useEffect(() => {
|
|
23
|
-
const { awareness } = provider;
|
|
24
|
-
const onStatus = ({ status }) => {
|
|
25
|
-
editor.dispatchCommand(CONNECTED_COMMAND, status === 'connected');
|
|
26
|
-
};
|
|
27
|
-
const onSync = (isSynced) => {
|
|
28
|
-
if (shouldBootstrap &&
|
|
29
|
-
isSynced &&
|
|
30
|
-
isReloadingDoc.current === false) {
|
|
31
|
-
initializeEditor(editor, initialEditorState);
|
|
32
|
-
// Call the initialization callback after initializing the editor
|
|
33
|
-
if (onInitialization) {
|
|
34
|
-
console.log('🎉 Editor initialized after sync, calling onInitialization callback');
|
|
35
|
-
onInitialization(true);
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
isReloadingDoc.current = false;
|
|
39
|
-
};
|
|
40
|
-
const onAwarenessUpdate = () => {
|
|
41
|
-
syncCursorPositionsFn(binding, provider);
|
|
42
|
-
};
|
|
43
|
-
initLocalState(provider, name, color, document.activeElement === editor.getRootElement(), awarenessData || {});
|
|
44
|
-
const onProviderDocReload = (doc) => {
|
|
45
|
-
clearEditorSkipCollab(editor, binding);
|
|
46
|
-
setDoc(doc);
|
|
47
|
-
docMap.set(id, doc);
|
|
48
|
-
isReloadingDoc.current = true;
|
|
49
|
-
};
|
|
50
|
-
provider.on('reload', onProviderDocReload);
|
|
51
|
-
provider.on('status', onStatus);
|
|
52
|
-
provider.on('sync', onSync);
|
|
53
|
-
awareness.on('update', onAwarenessUpdate);
|
|
54
|
-
const onLoroUpdates = (eventBatch) => {
|
|
55
|
-
// Only skip if the origin is from this specific editor's changes.
|
|
56
|
-
// We set 'lexical-edit' as origin when making changes from this editor.
|
|
57
|
-
// So we should skip only if the origin is 'lexical-edit' (our own changes).
|
|
58
|
-
if (eventBatch.origin !== binding.doc.peerIdStr) {
|
|
59
|
-
// Check if this change is from the undo manager
|
|
60
|
-
// const isFromUndoManger = origin instanceof UndoManager;
|
|
61
|
-
const isFromUndoManager = false;
|
|
62
|
-
syncLoroToLexical(binding, provider, eventBatch, isFromUndoManager, syncCursorPositionsFn);
|
|
63
|
-
}
|
|
64
|
-
};
|
|
65
|
-
// This updates the local editor state when we receive updates from other clients.
|
|
66
|
-
const unsubscribe = binding.doc.subscribe(onLoroUpdates);
|
|
67
|
-
const removeListener = editor.registerUpdateListener((update) => {
|
|
68
|
-
if (update.tags.has(SKIP_COLLAB_TAG) === false) {
|
|
69
|
-
syncLexicalToLoro(binding, provider, update);
|
|
70
|
-
}
|
|
71
|
-
});
|
|
72
|
-
const connectionPromise = connect();
|
|
73
|
-
return () => {
|
|
74
|
-
if (isReloadingDoc.current === false) {
|
|
75
|
-
if (connectionPromise) {
|
|
76
|
-
connectionPromise.then(disconnect);
|
|
77
|
-
}
|
|
78
|
-
else {
|
|
79
|
-
// Workaround for race condition in StrictMode. It's possible there
|
|
80
|
-
// is a different race for the above case where connect returns a
|
|
81
|
-
// promise, but we don't have an example of that in-repo.
|
|
82
|
-
// It's possible that there is a similar issue with
|
|
83
|
-
// TOGGLE_CONNECT_COMMAND below when the provider connect returns a
|
|
84
|
-
// promise.
|
|
85
|
-
// https://github.com/facebook/lexical/issues/6640
|
|
86
|
-
disconnect();
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
provider.off('sync', onSync);
|
|
90
|
-
provider.off('status', onStatus);
|
|
91
|
-
provider.off('reload', onProviderDocReload);
|
|
92
|
-
awareness.off('update', onAwarenessUpdate);
|
|
93
|
-
// Unsubscribe from Loro document changes
|
|
94
|
-
unsubscribe?.();
|
|
95
|
-
docMap.delete(id);
|
|
96
|
-
removeListener();
|
|
97
|
-
};
|
|
98
|
-
}, [
|
|
99
|
-
binding,
|
|
100
|
-
color,
|
|
101
|
-
connect,
|
|
102
|
-
disconnect,
|
|
103
|
-
docMap,
|
|
104
|
-
editor,
|
|
105
|
-
id,
|
|
106
|
-
initialEditorState,
|
|
107
|
-
name,
|
|
108
|
-
provider,
|
|
109
|
-
shouldBootstrap,
|
|
110
|
-
awarenessData,
|
|
111
|
-
setDoc,
|
|
112
|
-
syncCursorPositionsFn,
|
|
113
|
-
onInitialization,
|
|
114
|
-
]);
|
|
115
|
-
const cursorsContainer = useMemo(() => {
|
|
116
|
-
const ref = (element) => {
|
|
117
|
-
binding.cursorsContainer = element;
|
|
118
|
-
};
|
|
119
|
-
return createPortal(_jsx("div", { ref: ref }), (cursorsContainerRef && cursorsContainerRef.current) || document.body);
|
|
120
|
-
}, [binding, cursorsContainerRef]);
|
|
121
|
-
useEffect(() => {
|
|
122
|
-
return editor.registerCommand(TOGGLE_CONNECT_COMMAND, (payload) => {
|
|
123
|
-
const shouldConnect = payload;
|
|
124
|
-
if (shouldConnect) {
|
|
125
|
-
connect();
|
|
126
|
-
}
|
|
127
|
-
else {
|
|
128
|
-
disconnect();
|
|
129
|
-
}
|
|
130
|
-
return true;
|
|
131
|
-
}, COMMAND_PRIORITY_EDITOR);
|
|
132
|
-
}, [connect, disconnect, editor]);
|
|
133
|
-
return cursorsContainer;
|
|
134
|
-
}
|
|
135
|
-
export function useFocusTracking(editor, provider, name, color, awarenessData) {
|
|
136
|
-
useEffect(() => {
|
|
137
|
-
return mergeRegister(editor.registerCommand(FOCUS_COMMAND, () => {
|
|
138
|
-
setLocalStateFocus(provider, name, color, true, awarenessData || {});
|
|
139
|
-
return false;
|
|
140
|
-
}, COMMAND_PRIORITY_EDITOR), editor.registerCommand(BLUR_COMMAND, () => {
|
|
141
|
-
setLocalStateFocus(provider, name, color, false, awarenessData || {});
|
|
142
|
-
return false;
|
|
143
|
-
}, COMMAND_PRIORITY_EDITOR));
|
|
144
|
-
}, [color, editor, name, provider, awarenessData]);
|
|
145
|
-
}
|
|
146
|
-
export function useHistory(editor, binding) {
|
|
147
|
-
const undoManager = useMemo(() => createUndoManager(binding), [binding]);
|
|
148
|
-
useEffect(() => {
|
|
149
|
-
const undo = () => {
|
|
150
|
-
undoManager.undo();
|
|
151
|
-
};
|
|
152
|
-
const redo = () => {
|
|
153
|
-
undoManager.redo();
|
|
154
|
-
};
|
|
155
|
-
return mergeRegister(editor.registerCommand(UNDO_COMMAND, () => {
|
|
156
|
-
undo();
|
|
157
|
-
return true;
|
|
158
|
-
}, COMMAND_PRIORITY_EDITOR), editor.registerCommand(REDO_COMMAND, () => {
|
|
159
|
-
redo();
|
|
160
|
-
return true;
|
|
161
|
-
}, COMMAND_PRIORITY_EDITOR));
|
|
162
|
-
});
|
|
163
|
-
const clearHistory = useCallback(() => {
|
|
164
|
-
undoManager.clear();
|
|
165
|
-
}, [undoManager]);
|
|
166
|
-
// Exposing undo and redo states
|
|
167
|
-
React.useEffect(() => {
|
|
168
|
-
const updateUndoRedoStates = () => {
|
|
169
|
-
editor.dispatchCommand(CAN_UNDO_COMMAND, undoManager.canUndo());
|
|
170
|
-
editor.dispatchCommand(CAN_REDO_COMMAND, undoManager.canRedo());
|
|
171
|
-
};
|
|
172
|
-
// Initial state update
|
|
173
|
-
updateUndoRedoStates();
|
|
174
|
-
// Loro UndoManager doesn't have event listeners like YJS
|
|
175
|
-
// We would need to check state periodically or after operations
|
|
176
|
-
// For now, update after each operation
|
|
177
|
-
return () => {
|
|
178
|
-
// No cleanup needed for Loro UndoManager events
|
|
179
|
-
};
|
|
180
|
-
}, [editor, undoManager]);
|
|
181
|
-
return clearHistory;
|
|
182
|
-
}
|
|
183
|
-
function initializeEditor(editor, initialEditorState) {
|
|
184
|
-
editor.update(() => {
|
|
185
|
-
const root = $getRoot();
|
|
186
|
-
if (root.isEmpty()) {
|
|
187
|
-
if (initialEditorState) {
|
|
188
|
-
switch (typeof initialEditorState) {
|
|
189
|
-
case 'string': {
|
|
190
|
-
const parsedEditorState = editor.parseEditorState(initialEditorState);
|
|
191
|
-
editor.setEditorState(parsedEditorState, {
|
|
192
|
-
tag: HISTORY_MERGE_TAG,
|
|
193
|
-
});
|
|
194
|
-
break;
|
|
195
|
-
}
|
|
196
|
-
case 'object': {
|
|
197
|
-
editor.setEditorState(initialEditorState, {
|
|
198
|
-
tag: HISTORY_MERGE_TAG,
|
|
199
|
-
});
|
|
200
|
-
break;
|
|
201
|
-
}
|
|
202
|
-
case 'function': {
|
|
203
|
-
editor.update(() => {
|
|
204
|
-
const root1 = $getRoot();
|
|
205
|
-
if (root1.isEmpty()) {
|
|
206
|
-
initialEditorState(editor);
|
|
207
|
-
}
|
|
208
|
-
}, { tag: HISTORY_MERGE_TAG });
|
|
209
|
-
break;
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
}, { tag: HISTORY_MERGE_TAG });
|
|
215
|
-
}
|
|
216
|
-
function clearEditorSkipCollab(editor, binding) {
|
|
217
|
-
// reset editor state
|
|
218
|
-
editor.update(() => {
|
|
219
|
-
const root = $getRoot();
|
|
220
|
-
root.clear();
|
|
221
|
-
root.select();
|
|
222
|
-
}, {
|
|
223
|
-
tag: SKIP_COLLAB_TAG,
|
|
224
|
-
});
|
|
225
|
-
if (binding.cursors == null) {
|
|
226
|
-
return;
|
|
227
|
-
}
|
|
228
|
-
const cursors = binding.cursors;
|
|
229
|
-
if (cursors == null) {
|
|
230
|
-
return;
|
|
231
|
-
}
|
|
232
|
-
const cursorsContainer = binding.cursorsContainer;
|
|
233
|
-
if (cursorsContainer == null) {
|
|
234
|
-
return;
|
|
235
|
-
}
|
|
236
|
-
// reset cursors in dom
|
|
237
|
-
const cursorsArr = Array.from(cursors.values());
|
|
238
|
-
for (let i = 0; i < cursorsArr.length; i++) {
|
|
239
|
-
const cursor = cursorsArr[i];
|
|
240
|
-
const selection = cursor.selection;
|
|
241
|
-
if (selection && selection.selections != null) {
|
|
242
|
-
const selections = selection.selections;
|
|
243
|
-
for (let j = 0; j < selections.length; j++) {
|
|
244
|
-
cursorsContainer.removeChild(selections[i]);
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
}
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import { LoroDoc } from 'loro-crdt';
|
|
2
|
-
/**
|
|
3
|
-
* Initial Lexical JSON structure that matches what the Python server uses
|
|
4
|
-
*/
|
|
5
|
-
export declare const INITIAL_LEXICAL_JSON: {
|
|
6
|
-
root: {
|
|
7
|
-
children: ({
|
|
8
|
-
children: {
|
|
9
|
-
detail: number;
|
|
10
|
-
format: number;
|
|
11
|
-
mode: string;
|
|
12
|
-
style: string;
|
|
13
|
-
text: string;
|
|
14
|
-
type: string;
|
|
15
|
-
version: number;
|
|
16
|
-
}[];
|
|
17
|
-
direction: any;
|
|
18
|
-
format: string;
|
|
19
|
-
indent: number;
|
|
20
|
-
type: string;
|
|
21
|
-
version: number;
|
|
22
|
-
tag: string;
|
|
23
|
-
textFormat?: undefined;
|
|
24
|
-
textStyle?: undefined;
|
|
25
|
-
} | {
|
|
26
|
-
children: {
|
|
27
|
-
detail: number;
|
|
28
|
-
format: number;
|
|
29
|
-
mode: string;
|
|
30
|
-
style: string;
|
|
31
|
-
text: string;
|
|
32
|
-
type: string;
|
|
33
|
-
version: number;
|
|
34
|
-
}[];
|
|
35
|
-
direction: any;
|
|
36
|
-
format: string;
|
|
37
|
-
indent: number;
|
|
38
|
-
type: string;
|
|
39
|
-
version: number;
|
|
40
|
-
textFormat: number;
|
|
41
|
-
textStyle: string;
|
|
42
|
-
tag?: undefined;
|
|
43
|
-
})[];
|
|
44
|
-
direction: any;
|
|
45
|
-
format: string;
|
|
46
|
-
indent: number;
|
|
47
|
-
type: string;
|
|
48
|
-
version: number;
|
|
49
|
-
};
|
|
50
|
-
};
|
|
51
|
-
/**
|
|
52
|
-
* Initialize a new Loro document with the initial Lexical content
|
|
53
|
-
* This ensures consistent starting state across all clients
|
|
54
|
-
*/
|
|
55
|
-
export declare function initializeLoroDocWithLexicalContent(doc: LoroDoc): void;
|
|
56
|
-
/**
|
|
57
|
-
* Check if a Loro document is empty (has no tree content)
|
|
58
|
-
*/
|
|
59
|
-
export declare function isLoroDocumentEmpty(doc: LoroDoc): boolean;
|
|
60
|
-
/**
|
|
61
|
-
* Check if a Loro document should be initialized (more robust check)
|
|
62
|
-
* This helps prevent race conditions where multiple clients try to initialize
|
|
63
|
-
*/
|
|
64
|
-
export declare function shouldInitializeLoroDoc(doc: LoroDoc): boolean;
|
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
import { lexicalToLoroTree } from './LexicalToLoro';
|
|
2
|
-
/**
|
|
3
|
-
* Initial Lexical JSON structure that matches what the Python server uses
|
|
4
|
-
*/
|
|
5
|
-
export const INITIAL_LEXICAL_JSON = {
|
|
6
|
-
"root": {
|
|
7
|
-
"children": [
|
|
8
|
-
{
|
|
9
|
-
"children": [
|
|
10
|
-
{
|
|
11
|
-
"detail": 0,
|
|
12
|
-
"format": 0,
|
|
13
|
-
"mode": "normal",
|
|
14
|
-
"style": "",
|
|
15
|
-
"text": "Lexical with Loro",
|
|
16
|
-
"type": "text",
|
|
17
|
-
"version": 1
|
|
18
|
-
}
|
|
19
|
-
],
|
|
20
|
-
"direction": null,
|
|
21
|
-
"format": "",
|
|
22
|
-
"indent": 0,
|
|
23
|
-
"type": "heading",
|
|
24
|
-
"version": 1,
|
|
25
|
-
"tag": "h1"
|
|
26
|
-
},
|
|
27
|
-
{
|
|
28
|
-
"children": [
|
|
29
|
-
{
|
|
30
|
-
"detail": 0,
|
|
31
|
-
"format": 0,
|
|
32
|
-
"mode": "normal",
|
|
33
|
-
"style": "",
|
|
34
|
-
"text": "Type something...",
|
|
35
|
-
"type": "text",
|
|
36
|
-
"version": 1
|
|
37
|
-
}
|
|
38
|
-
],
|
|
39
|
-
"direction": null,
|
|
40
|
-
"format": "",
|
|
41
|
-
"indent": 0,
|
|
42
|
-
"type": "paragraph",
|
|
43
|
-
"version": 1,
|
|
44
|
-
"textFormat": 0,
|
|
45
|
-
"textStyle": ""
|
|
46
|
-
}
|
|
47
|
-
],
|
|
48
|
-
"direction": null,
|
|
49
|
-
"format": "",
|
|
50
|
-
"indent": 0,
|
|
51
|
-
"type": "root",
|
|
52
|
-
"version": 1
|
|
53
|
-
}
|
|
54
|
-
};
|
|
55
|
-
/**
|
|
56
|
-
* Initialize a new Loro document with the initial Lexical content
|
|
57
|
-
* This ensures consistent starting state across all clients
|
|
58
|
-
*/
|
|
59
|
-
export function initializeLoroDocWithLexicalContent(doc) {
|
|
60
|
-
const tree = doc.getTree('tree');
|
|
61
|
-
tree.enableFractionalIndex(0.001);
|
|
62
|
-
// Convert the initial Lexical JSON to Loro tree structure
|
|
63
|
-
lexicalToLoroTree(INITIAL_LEXICAL_JSON, tree);
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* Check if a Loro document is empty (has no tree content)
|
|
67
|
-
*/
|
|
68
|
-
export function isLoroDocumentEmpty(doc) {
|
|
69
|
-
const tree = doc.getTree('tree');
|
|
70
|
-
try {
|
|
71
|
-
// Get all root nodes
|
|
72
|
-
const roots = tree.roots();
|
|
73
|
-
// Also check if the document has any nodes at all
|
|
74
|
-
const allNodes = tree.nodes();
|
|
75
|
-
return roots.length === 0 && allNodes.length === 0;
|
|
76
|
-
}
|
|
77
|
-
catch (error) {
|
|
78
|
-
// If there's an error accessing roots, consider it empty
|
|
79
|
-
return true;
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Check if a Loro document should be initialized (more robust check)
|
|
84
|
-
* This helps prevent race conditions where multiple clients try to initialize
|
|
85
|
-
*/
|
|
86
|
-
export function shouldInitializeLoroDoc(doc) {
|
|
87
|
-
const tree = doc.getTree('tree');
|
|
88
|
-
try {
|
|
89
|
-
const allNodes = tree.nodes();
|
|
90
|
-
const roots = tree.roots();
|
|
91
|
-
// Only initialize if there are truly no nodes
|
|
92
|
-
const isEmpty = allNodes.length === 0;
|
|
93
|
-
// Additional check: look for any existing root nodes with our content
|
|
94
|
-
if (!isEmpty) {
|
|
95
|
-
// Check if any root has the expected initial structure
|
|
96
|
-
for (const root of roots) {
|
|
97
|
-
const data = Object.fromEntries(root.data.entries());
|
|
98
|
-
if (data.elementType === 'root') {
|
|
99
|
-
return false;
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
return isEmpty;
|
|
104
|
-
}
|
|
105
|
-
catch (error) {
|
|
106
|
-
console.warn('Error checking if doc should be initialized:', error);
|
|
107
|
-
return false; // Don't initialize if there's an error
|
|
108
|
-
}
|
|
109
|
-
}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { LoroTree, TreeID } from 'loro-crdt';
|
|
2
|
-
/**
|
|
3
|
-
* Utility to convert Lexical JSON structure to Loro tree
|
|
4
|
-
*/
|
|
5
|
-
interface LexicalNodeJSON {
|
|
6
|
-
type: string;
|
|
7
|
-
children?: LexicalNodeJSON[];
|
|
8
|
-
[key: string]: any;
|
|
9
|
-
}
|
|
10
|
-
interface LexicalJSON {
|
|
11
|
-
root: LexicalNodeJSON;
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* Convert a Lexical JSON structure to a Loro tree
|
|
15
|
-
* This is used to initialize a Loro tree from existing Lexical content
|
|
16
|
-
*/
|
|
17
|
-
export declare function lexicalToLoroTree(lexicalJson: string | LexicalJSON, tree: LoroTree): TreeID;
|
|
18
|
-
export {};
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Convert a Lexical JSON structure to a Loro tree
|
|
3
|
-
* This is used to initialize a Loro tree from existing Lexical content
|
|
4
|
-
*/
|
|
5
|
-
export function lexicalToLoroTree(lexicalJson, tree) {
|
|
6
|
-
let parsedJson;
|
|
7
|
-
if (typeof lexicalJson === 'string') {
|
|
8
|
-
try {
|
|
9
|
-
parsedJson = JSON.parse(lexicalJson);
|
|
10
|
-
}
|
|
11
|
-
catch (error) {
|
|
12
|
-
throw new Error(`Failed to parse Lexical JSON: ${error}`);
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
else {
|
|
16
|
-
parsedJson = lexicalJson;
|
|
17
|
-
}
|
|
18
|
-
// Start with the root node - create it without a parent
|
|
19
|
-
const rootTreeNode = tree.createNode();
|
|
20
|
-
const rootTreeID = rootTreeNode.id;
|
|
21
|
-
processLexicalNode(parsedJson.root, tree, rootTreeNode);
|
|
22
|
-
return rootTreeID;
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Recursively process a Lexical node and add it to the Loro tree
|
|
26
|
-
*/
|
|
27
|
-
function processLexicalNode(lexicalNode, tree, treeNode) {
|
|
28
|
-
// Store the lexical data in the tree node
|
|
29
|
-
const nodeData = treeNode.data;
|
|
30
|
-
if (nodeData) {
|
|
31
|
-
// Store element type for quick access
|
|
32
|
-
nodeData.set('elementType', lexicalNode.type);
|
|
33
|
-
// Store lexical node data directly as JSON object
|
|
34
|
-
const lexicalNodeData = createLexicalNodeFromJSON(lexicalNode);
|
|
35
|
-
const lexicalNodeJSON = lexicalNodeData.lexicalNode.exportJSON();
|
|
36
|
-
// Remove all key-related fields to avoid duplication (TreeID serves as the key)
|
|
37
|
-
if ('__key' in lexicalNodeJSON || 'key' in lexicalNodeJSON || 'lexicalKey' in lexicalNodeJSON) {
|
|
38
|
-
const { __key, key, lexicalKey, ...cleanedData } = lexicalNodeJSON;
|
|
39
|
-
nodeData.set('lexical', cleanedData);
|
|
40
|
-
}
|
|
41
|
-
else {
|
|
42
|
-
nodeData.set('lexical', lexicalNodeJSON);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
// Process children if they exist
|
|
46
|
-
if (lexicalNode.children && Array.isArray(lexicalNode.children)) {
|
|
47
|
-
lexicalNode.children.forEach((child, childIndex) => {
|
|
48
|
-
// Create child node under current node
|
|
49
|
-
const childTreeNode = tree.createNode(treeNode.id, childIndex);
|
|
50
|
-
processLexicalNode(child, tree, childTreeNode);
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Create a minimal Lexical node representation from JSON data
|
|
56
|
-
* This doesn't create actual Lexical nodes, just the data structure needed for serialization
|
|
57
|
-
*/
|
|
58
|
-
function createLexicalNodeFromJSON(nodeJson) {
|
|
59
|
-
// Create a minimal node-like object with the essential properties
|
|
60
|
-
const nodeData = {
|
|
61
|
-
__key: generateNodeKey(), // Generate a temporary key
|
|
62
|
-
__type: nodeJson.type,
|
|
63
|
-
__parent: null, // Will be set during tree construction
|
|
64
|
-
__text: nodeJson.text || undefined,
|
|
65
|
-
__format: nodeJson.format || 0,
|
|
66
|
-
__style: nodeJson.style || '',
|
|
67
|
-
__mode: nodeJson.mode || undefined,
|
|
68
|
-
__detail: nodeJson.detail || undefined,
|
|
69
|
-
__indent: nodeJson.indent || 0,
|
|
70
|
-
__direction: nodeJson.direction || null,
|
|
71
|
-
__tag: nodeJson.tag || undefined,
|
|
72
|
-
__textFormat: nodeJson.textFormat || undefined,
|
|
73
|
-
__textStyle: nodeJson.textStyle || undefined,
|
|
74
|
-
__version: nodeJson.version || 1
|
|
75
|
-
};
|
|
76
|
-
// Remove undefined properties
|
|
77
|
-
Object.keys(nodeData).forEach(key => {
|
|
78
|
-
if (nodeData[key] === undefined) {
|
|
79
|
-
delete nodeData[key];
|
|
80
|
-
}
|
|
81
|
-
});
|
|
82
|
-
// Return in the format expected by LexicalNodeDataHelper
|
|
83
|
-
return {
|
|
84
|
-
lexicalNode: {
|
|
85
|
-
getType: () => nodeJson.type,
|
|
86
|
-
exportJSON: () => nodeData,
|
|
87
|
-
getKey: () => nodeData.__key
|
|
88
|
-
}
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
/**
|
|
92
|
-
* Generate a simple node key for temporary use
|
|
93
|
-
*/
|
|
94
|
-
function generateNodeKey() {
|
|
95
|
-
return Math.random().toString(36).substr(2, 9);
|
|
96
|
-
}
|