@liveblocks/node-lexical 2.24.1 → 2.25.0-aiprivatebeta0
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/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -1
- package/package.json +3 -3
package/dist/index.cjs
CHANGED
|
@@ -169,7 +169,7 @@ var ThreadMarkNode = class _ThreadMarkNode extends _lexical.ElementNode {
|
|
|
169
169
|
|
|
170
170
|
// src/version.ts
|
|
171
171
|
var PKG_NAME = "@liveblocks/node-lexical";
|
|
172
|
-
var PKG_VERSION = "2.
|
|
172
|
+
var PKG_VERSION = "2.25.0-aiprivatebeta0";
|
|
173
173
|
var PKG_FORMAT = "cjs";
|
|
174
174
|
|
|
175
175
|
// src/index.ts
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/liveblocks/liveblocks/packages/liveblocks-node-lexical/dist/index.cjs","../src/index.ts","../src/collab.ts","../src/MentionNodeLite.ts","../src/ThreadNodeLite.ts","../src/version.ts"],"names":["$applyNodeReplacement","createHeadlessEditor","Doc","createBinding"],"mappings":"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","file":"/home/runner/work/liveblocks/liveblocks/packages/liveblocks-node-lexical/dist/index.cjs","sourcesContent":[null,"import { createHeadlessEditor } from \"@lexical/headless\";\nimport { $convertToMarkdownString, TRANSFORMERS } from \"@lexical/markdown\";\nimport { createBinding } from \"@lexical/yjs\";\nimport { detectDupes } from \"@liveblocks/core\";\nimport type { Liveblocks } from \"@liveblocks/node\";\nimport type {\n EditorState,\n Klass,\n LexicalEditor,\n LexicalNode,\n LexicalNodeReplacement,\n SerializedEditorState,\n SerializedLexicalNode,\n} from \"lexical\";\nimport { $getRoot } from \"lexical\";\nimport { applyUpdate, Doc, encodeStateAsUpdate, encodeStateVector } from \"yjs\";\n\nimport { createNoOpProvider, registerCollaborationListeners } from \"./collab\";\nimport { MentionNode } from \"./MentionNodeLite\";\nimport { ThreadMarkNode } from \"./ThreadNodeLite\";\nimport { PKG_FORMAT, PKG_NAME, PKG_VERSION } from \"./version\";\n\ndetectDupes(PKG_NAME, PKG_VERSION, PKG_FORMAT);\n\nconst LIVEBLOCKS_NODES = [ThreadMarkNode, MentionNode];\n\nexport { $createParagraphNode, $createTextNode, $getRoot } from \"lexical\";\n\nexport type LiveblocksLexicalOptions = {\n roomId: string;\n nodes?: ReadonlyArray<Klass<LexicalNode> | LexicalNodeReplacement>;\n client: Liveblocks;\n};\n\nexport type LiveblocksDocumentApi = {\n refresh: () => Promise<void>;\n update: (modifyFn: () => void) => Promise<void>;\n getTextContent: () => string;\n getEditorState: () => EditorState;\n getLexicalEditor: () => LexicalEditor;\n toJSON: () => SerializedEditorState<SerializedLexicalNode>;\n toMarkdown: () => string;\n};\n\n/**\n *\n * `withLexicalDocument` is the main entry point to access and modify Lexical documents on your backend.\n * This function internally instantiates a Lexical headless editor and allows you to modify and export its values asynchronously\n * with a simplified interface.\n *\n * @param options Specify the roomId, client, and nodes.\n * @param callback The call back function is optionally async and receives the document API as its only argument.\n *\n * @example\n *\n * import { Liveblocks } from \"@liveblocks/node\";\n * import { withLexicalDocument } from \"@liveblocks/node-lexical\";\n *\n * const client = new Liveblocks({secret: \"sk_your_secret_key\"});\n * const text = await withLexicalDocument(\n * { client, roomId: \"your-room\" },\n * async (doc) => {\n * await doc.update(() => {\n * const root = $getRoot();\n * const paragraphNode = $createParagraphNode();\n * const textNode = $createTextNode(\"Hello from node\");\n * paragraphNode.append(textNode);\n * root.append(paragraphNode);\n * });\n * return doc.getTextContent();\n * }\n * );\n *\n */\nexport async function withLexicalDocument<T>(\n { roomId, nodes, client }: LiveblocksLexicalOptions,\n callback: (api: LiveblocksDocumentApi) => Promise<T> | T\n): Promise<T> {\n const update = new Uint8Array(\n await client.getYjsDocumentAsBinaryUpdate(roomId)\n );\n const editor = createHeadlessEditor({\n nodes: [...LIVEBLOCKS_NODES, ...(nodes ?? [])],\n });\n const id = \"root\";\n const doc = new Doc();\n const docMap = new Map([[id, doc]]);\n const provider = createNoOpProvider();\n const binding = createBinding(editor, provider, id, doc, docMap);\n const unsubscribe = registerCollaborationListeners(editor, provider, binding);\n applyUpdate(binding.doc, update);\n editor.update(() => {}, { discrete: true });\n\n const val = await callback({\n /**\n * Fetches and resyncs the latest document with Liveblocks\n */\n refresh: async () => {\n const latest = new Uint8Array(\n await client.getYjsDocumentAsBinaryUpdate(roomId)\n );\n applyUpdate(binding.doc, latest);\n editor.update(() => {}, { discrete: true });\n },\n /**\n * Provide a callback to modify documetns with Lexical's standard api. All calls are discrete.\n */\n update: async (modifyFn) => {\n // Flush any pending updates (there really shouldn't be any?), this may be a NOOP\n editor.update(() => {}, { discrete: true });\n const beforeVector = encodeStateVector(binding.doc);\n editor.update(\n () => {\n modifyFn();\n },\n { discrete: true }\n );\n // grab update after diffing\n const diffUpdate = encodeStateAsUpdate(binding.doc, beforeVector);\n return client.sendYjsBinaryUpdate(roomId, diffUpdate);\n },\n /**\n * Helper function to easily provide the text content from the root, i.e. `$getRoot().getTextContent()`\n */\n getTextContent: () => {\n let content = \"\";\n editor.getEditorState().read(() => {\n content = $getRoot().getTextContent();\n });\n return content;\n },\n /**\n * Helper function to return editorState in JSON form\n */\n toJSON: () => {\n return editor.getEditorState().toJSON();\n },\n /**\n * Helper function to return editor state as Markdown\n */\n toMarkdown: () => {\n let markdown: string = \"\";\n editor.getEditorState().read(() => {\n markdown = $convertToMarkdownString(TRANSFORMERS);\n });\n return markdown;\n },\n /**\n * Helper function to return the editor's current state\n */\n getEditorState: () => {\n return editor.getEditorState();\n },\n /**\n * Helper function to return the current headless editor instance\n */\n getLexicalEditor: () => {\n return editor;\n },\n });\n unsubscribe();\n\n return val;\n}\n","import { createHeadlessEditor } from \"@lexical/headless\";\nimport type { Binding, Provider } from \"@lexical/yjs\";\nimport {\n createBinding,\n syncLexicalUpdateToYjs,\n syncYjsChangesToLexical,\n} from \"@lexical/yjs\";\nimport type {\n Klass,\n LexicalEditor,\n LexicalNode,\n LexicalNodeReplacement,\n} from \"lexical\";\nimport type { Transaction, YEvent } from \"yjs\";\nimport { Doc } from \"yjs\";\n\nexport function withHeadlessCollaborationEditor<T>(\n nodes: ReadonlyArray<Klass<LexicalNode> | LexicalNodeReplacement>,\n callback: (editor: LexicalEditor, binding: Binding, provider: Provider) => T\n): T {\n const editor = createHeadlessEditor({\n nodes,\n });\n\n const id = \"root\";\n const doc = new Doc();\n const docMap = new Map([[id, doc]]);\n const provider = createNoOpProvider();\n const binding = createBinding(editor, provider, id, doc, docMap);\n\n const unsubscribe = registerCollaborationListeners(editor, provider, binding);\n\n const res = callback(editor, binding, provider);\n\n unsubscribe();\n\n return res;\n}\n\nexport function registerCollaborationListeners(\n editor: LexicalEditor,\n provider: Provider,\n binding: Binding\n): () => void {\n const unsubscribeUpdateListener = editor.registerUpdateListener(\n ({\n dirtyElements,\n dirtyLeaves,\n editorState,\n normalizedNodes,\n prevEditorState,\n tags,\n }) => {\n if (tags.has(\"skip-collab\") === false) {\n syncLexicalUpdateToYjs(\n binding,\n provider,\n prevEditorState,\n editorState,\n dirtyElements,\n dirtyLeaves,\n normalizedNodes,\n tags\n );\n }\n }\n );\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const observer = (events: Array<YEvent<any>>, transaction: Transaction) => {\n if (transaction.origin !== binding) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n syncYjsChangesToLexical(binding, provider, events, false);\n }\n };\n\n binding.root.getSharedType().observeDeep(observer);\n\n return () => {\n unsubscribeUpdateListener();\n binding.root.getSharedType().unobserveDeep(observer);\n };\n}\n\nexport function createNoOpProvider(): Provider {\n const emptyFunction = () => {};\n\n return {\n awareness: {\n getLocalState: () => null,\n getStates: () => new Map(),\n off: emptyFunction,\n on: emptyFunction,\n setLocalState: emptyFunction,\n },\n connect: emptyFunction,\n disconnect: emptyFunction,\n off: emptyFunction,\n on: emptyFunction,\n };\n}\n","import type { NodeKey, SerializedLexicalNode, Spread } from \"lexical\";\nimport { $applyNodeReplacement, DecoratorNode } from \"lexical\";\n\nexport type SerializedMentionNode = Spread<\n {\n value: string;\n },\n SerializedLexicalNode\n>;\n\nexport class MentionNode extends DecoratorNode<null> {\n __id: string;\n\n constructor(value: string, key?: NodeKey) {\n super(key);\n this.__id = value;\n }\n\n static getType(): string {\n return \"lb-mention\";\n }\n\n static clone(node: MentionNode): MentionNode {\n return new MentionNode(node.__id);\n }\n\n static importJSON(serializedNode: SerializedMentionNode): MentionNode {\n const node = new MentionNode(serializedNode.value);\n return $applyNodeReplacement(node);\n }\n\n exportJSON(): SerializedMentionNode {\n return {\n value: this.getTextContent(),\n type: \"lb-mention\",\n version: 1,\n };\n }\n\n getTextContent(): string {\n const self = this.getLatest();\n return self.__id;\n }\n\n decorate(): null {\n return null;\n }\n}\n","import type {\n BaseSelection,\n LexicalNode,\n NodeKey,\n SerializedElementNode,\n Spread,\n} from \"lexical\";\nimport { $applyNodeReplacement, $isRangeSelection, ElementNode } from \"lexical\";\n\nexport type SerializedThreadMarkNode = Spread<\n {\n ids: Array<string>;\n },\n SerializedElementNode\n>;\n\nexport class ThreadMarkNode extends ElementNode {\n /** @internal */\n __ids: Array<string>; // The ids of the threads that this mark is associated with\n\n static getType(): string {\n return \"lb-thread-mark\";\n }\n\n static clone(node: ThreadMarkNode): ThreadMarkNode {\n return new ThreadMarkNode(Array.from(node.__ids), node.__key);\n }\n\n static importJSON(serializedNode: SerializedThreadMarkNode): ThreadMarkNode {\n const node = $applyNodeReplacement<ThreadMarkNode>(\n new ThreadMarkNode(serializedNode.ids)\n );\n node.setFormat(serializedNode.format);\n node.setIndent(serializedNode.indent);\n node.setDirection(serializedNode.direction);\n return node;\n }\n\n exportJSON(): SerializedThreadMarkNode {\n return {\n ...super.exportJSON(),\n ids: this.getIDs(),\n type: \"lb-thread-mark\",\n version: 1,\n };\n }\n\n getIDs(): Array<string> {\n const self = this.getLatest();\n return self instanceof ThreadMarkNode ? self.__ids : [];\n }\n\n constructor(ids: Array<string>, key?: NodeKey) {\n super(key);\n this.__ids = ids || [];\n }\n\n canInsertTextBefore(): false {\n return false;\n }\n\n canInsertTextAfter(): false {\n return false;\n }\n\n canBeEmpty(): false {\n return false;\n }\n\n isInline(): true {\n return true;\n }\n\n extractWithChild(\n _: LexicalNode,\n selection: BaseSelection,\n destination: \"clone\" | \"html\"\n ): boolean {\n if (!$isRangeSelection(selection) || destination === \"html\") {\n return false;\n }\n const anchor = selection.anchor;\n const focus = selection.focus;\n const anchorNode = anchor.getNode();\n const focusNode = focus.getNode();\n const isBackward = selection.isBackward();\n const selectionLength = isBackward\n ? anchor.offset - focus.offset\n : focus.offset - anchor.offset;\n return (\n this.isParentOf(anchorNode) &&\n this.isParentOf(focusNode) &&\n this.getTextContent().length === selectionLength\n );\n }\n\n excludeFromCopy(destination: \"clone\" | \"html\"): boolean {\n return destination !== \"clone\";\n }\n}\n","declare const __VERSION__: string;\ndeclare const TSUP_FORMAT: string;\n\nexport const PKG_NAME = \"@liveblocks/node-lexical\";\nexport const PKG_VERSION = typeof __VERSION__ === \"string\" && __VERSION__;\nexport const PKG_FORMAT = typeof TSUP_FORMAT === \"string\" && TSUP_FORMAT;\n"]}
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/liveblocks/liveblocks/packages/liveblocks-node-lexical/dist/index.cjs","../src/index.ts","../src/collab.ts","../src/MentionNodeLite.ts","../src/ThreadNodeLite.ts","../src/version.ts"],"names":["$applyNodeReplacement","createHeadlessEditor","Doc","createBinding"],"mappings":"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","file":"/home/runner/work/liveblocks/liveblocks/packages/liveblocks-node-lexical/dist/index.cjs","sourcesContent":[null,"import { createHeadlessEditor } from \"@lexical/headless\";\nimport { $convertToMarkdownString, TRANSFORMERS } from \"@lexical/markdown\";\nimport { createBinding } from \"@lexical/yjs\";\nimport { detectDupes } from \"@liveblocks/core\";\nimport type { Liveblocks } from \"@liveblocks/node\";\nimport type {\n EditorState,\n Klass,\n LexicalEditor,\n LexicalNode,\n LexicalNodeReplacement,\n SerializedEditorState,\n SerializedLexicalNode,\n} from \"lexical\";\nimport { $getRoot } from \"lexical\";\nimport { applyUpdate, Doc, encodeStateAsUpdate, encodeStateVector } from \"yjs\";\n\nimport { createNoOpProvider, registerCollaborationListeners } from \"./collab\";\nimport { MentionNode } from \"./MentionNodeLite\";\nimport { ThreadMarkNode } from \"./ThreadNodeLite\";\nimport { PKG_FORMAT, PKG_NAME, PKG_VERSION } from \"./version\";\n\ndetectDupes(PKG_NAME, PKG_VERSION, PKG_FORMAT);\n\nconst LIVEBLOCKS_NODES = [ThreadMarkNode, MentionNode];\n\nexport { $createParagraphNode, $createTextNode, $getRoot } from \"lexical\";\n\nexport type LiveblocksLexicalOptions = {\n roomId: string;\n nodes?: ReadonlyArray<Klass<LexicalNode> | LexicalNodeReplacement>;\n client: Liveblocks;\n};\n\nexport type LiveblocksDocumentApi = {\n refresh: () => Promise<void>;\n update: (modifyFn: () => void) => Promise<void>;\n getTextContent: () => string;\n getEditorState: () => EditorState;\n getLexicalEditor: () => LexicalEditor;\n toJSON: () => SerializedEditorState<SerializedLexicalNode>;\n toMarkdown: () => string;\n};\n\n/**\n *\n * `withLexicalDocument` is the main entry point to access and modify Lexical documents on your backend.\n * This function internally instantiates a Lexical headless editor and allows you to modify and export its values asynchronously\n * with a simplified interface.\n *\n * @param options Specify the roomId, client, and nodes.\n * @param callback The call back function is optionally async and receives the document API as its only argument.\n *\n * @example\n *\n * import { Liveblocks } from \"@liveblocks/node\";\n * import { withLexicalDocument } from \"@liveblocks/node-lexical\";\n *\n * const client = new Liveblocks({secret: \"sk_your_secret_key\"});\n * const text = await withLexicalDocument(\n * { client, roomId: \"your-room\" },\n * async (doc) => {\n * await doc.update(() => {\n * const root = $getRoot();\n * const paragraphNode = $createParagraphNode();\n * const textNode = $createTextNode(\"Hello from node\");\n * paragraphNode.append(textNode);\n * root.append(paragraphNode);\n * });\n * return doc.getTextContent();\n * }\n * );\n *\n */\nexport async function withLexicalDocument<T>(\n { roomId, nodes, client }: LiveblocksLexicalOptions,\n callback: (api: LiveblocksDocumentApi) => Promise<T> | T\n): Promise<T> {\n const update = new Uint8Array(\n await client.getYjsDocumentAsBinaryUpdate(roomId)\n );\n const editor = createHeadlessEditor({\n nodes: [...LIVEBLOCKS_NODES, ...(nodes ?? [])],\n });\n const id = \"root\";\n const doc = new Doc();\n const docMap = new Map([[id, doc]]);\n const provider = createNoOpProvider();\n const binding = createBinding(editor, provider, id, doc, docMap);\n const unsubscribe = registerCollaborationListeners(editor, provider, binding);\n applyUpdate(binding.doc, update);\n editor.update(() => {}, { discrete: true });\n\n const val = await callback({\n /**\n * Fetches and resyncs the latest document with Liveblocks\n */\n refresh: async () => {\n const latest = new Uint8Array(\n await client.getYjsDocumentAsBinaryUpdate(roomId)\n );\n applyUpdate(binding.doc, latest);\n editor.update(() => {}, { discrete: true });\n },\n /**\n * Provide a callback to modify documetns with Lexical's standard api. All calls are discrete.\n */\n update: async (modifyFn) => {\n // Flush any pending updates (there really shouldn't be any?), this may be a NOOP\n editor.update(() => {}, { discrete: true });\n const beforeVector = encodeStateVector(binding.doc);\n editor.update(\n () => {\n modifyFn();\n },\n { discrete: true }\n );\n // grab update after diffing\n const diffUpdate = encodeStateAsUpdate(binding.doc, beforeVector);\n return client.sendYjsBinaryUpdate(roomId, diffUpdate);\n },\n /**\n * Helper function to easily provide the text content from the root, i.e. `$getRoot().getTextContent()`\n */\n getTextContent: () => {\n let content = \"\";\n editor.getEditorState().read(() => {\n content = $getRoot().getTextContent();\n });\n return content;\n },\n /**\n * Helper function to return editorState in JSON form\n */\n toJSON: () => {\n return editor.getEditorState().toJSON();\n },\n /**\n * Helper function to return editor state as Markdown\n */\n toMarkdown: () => {\n let markdown: string = \"\";\n editor.getEditorState().read(() => {\n markdown = $convertToMarkdownString(TRANSFORMERS);\n });\n return markdown;\n },\n /**\n * Helper function to return the editor's current state\n */\n getEditorState: () => {\n return editor.getEditorState();\n },\n /**\n * Helper function to return the current headless editor instance\n */\n getLexicalEditor: () => {\n return editor;\n },\n });\n unsubscribe();\n\n return val;\n}\n","import { createHeadlessEditor } from \"@lexical/headless\";\nimport type { Binding, Provider } from \"@lexical/yjs\";\nimport {\n createBinding,\n syncLexicalUpdateToYjs,\n syncYjsChangesToLexical,\n} from \"@lexical/yjs\";\nimport type {\n Klass,\n LexicalEditor,\n LexicalNode,\n LexicalNodeReplacement,\n} from \"lexical\";\nimport type { Transaction, YEvent } from \"yjs\";\nimport { Doc } from \"yjs\";\n\nexport function withHeadlessCollaborationEditor<T>(\n nodes: ReadonlyArray<Klass<LexicalNode> | LexicalNodeReplacement>,\n callback: (editor: LexicalEditor, binding: Binding, provider: Provider) => T\n): T {\n const editor = createHeadlessEditor({\n nodes,\n });\n\n const id = \"root\";\n const doc = new Doc();\n const docMap = new Map([[id, doc]]);\n const provider = createNoOpProvider();\n const binding = createBinding(editor, provider, id, doc, docMap);\n\n const unsubscribe = registerCollaborationListeners(editor, provider, binding);\n\n const res = callback(editor, binding, provider);\n\n unsubscribe();\n\n return res;\n}\n\nexport function registerCollaborationListeners(\n editor: LexicalEditor,\n provider: Provider,\n binding: Binding\n): () => void {\n const unsubscribeUpdateListener = editor.registerUpdateListener(\n ({\n dirtyElements,\n dirtyLeaves,\n editorState,\n normalizedNodes,\n prevEditorState,\n tags,\n }) => {\n if (tags.has(\"skip-collab\") === false) {\n syncLexicalUpdateToYjs(\n binding,\n provider,\n prevEditorState,\n editorState,\n dirtyElements,\n dirtyLeaves,\n normalizedNodes,\n tags\n );\n }\n }\n );\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const observer = (events: Array<YEvent<any>>, transaction: Transaction) => {\n if (transaction.origin !== binding) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n syncYjsChangesToLexical(binding, provider, events, false);\n }\n };\n\n binding.root.getSharedType().observeDeep(observer);\n\n return () => {\n unsubscribeUpdateListener();\n binding.root.getSharedType().unobserveDeep(observer);\n };\n}\n\nexport function createNoOpProvider(): Provider {\n const emptyFunction = () => {};\n\n return {\n awareness: {\n getLocalState: () => null,\n getStates: () => new Map(),\n off: emptyFunction,\n on: emptyFunction,\n setLocalState: emptyFunction,\n },\n connect: emptyFunction,\n disconnect: emptyFunction,\n off: emptyFunction,\n on: emptyFunction,\n };\n}\n","import type { NodeKey, SerializedLexicalNode, Spread } from \"lexical\";\nimport { $applyNodeReplacement, DecoratorNode } from \"lexical\";\n\nexport type SerializedMentionNode = Spread<\n {\n value: string;\n },\n SerializedLexicalNode\n>;\n\nexport class MentionNode extends DecoratorNode<null> {\n __id: string;\n\n constructor(value: string, key?: NodeKey) {\n super(key);\n this.__id = value;\n }\n\n static getType(): string {\n return \"lb-mention\";\n }\n\n static clone(node: MentionNode): MentionNode {\n return new MentionNode(node.__id);\n }\n\n static importJSON(serializedNode: SerializedMentionNode): MentionNode {\n const node = new MentionNode(serializedNode.value);\n return $applyNodeReplacement(node);\n }\n\n exportJSON(): SerializedMentionNode {\n return {\n value: this.getTextContent(),\n type: \"lb-mention\",\n version: 1,\n };\n }\n\n getTextContent(): string {\n const self = this.getLatest();\n return self.__id;\n }\n\n decorate(): null {\n return null;\n }\n}\n","import type {\n BaseSelection,\n LexicalNode,\n NodeKey,\n SerializedElementNode,\n Spread,\n} from \"lexical\";\nimport { $applyNodeReplacement, $isRangeSelection, ElementNode } from \"lexical\";\n\nexport type SerializedThreadMarkNode = Spread<\n {\n ids: Array<string>;\n },\n SerializedElementNode\n>;\n\nexport class ThreadMarkNode extends ElementNode {\n /** @internal */\n __ids: Array<string>; // The ids of the threads that this mark is associated with\n\n static getType(): string {\n return \"lb-thread-mark\";\n }\n\n static clone(node: ThreadMarkNode): ThreadMarkNode {\n return new ThreadMarkNode(Array.from(node.__ids), node.__key);\n }\n\n static importJSON(serializedNode: SerializedThreadMarkNode): ThreadMarkNode {\n const node = $applyNodeReplacement<ThreadMarkNode>(\n new ThreadMarkNode(serializedNode.ids)\n );\n node.setFormat(serializedNode.format);\n node.setIndent(serializedNode.indent);\n node.setDirection(serializedNode.direction);\n return node;\n }\n\n exportJSON(): SerializedThreadMarkNode {\n return {\n ...super.exportJSON(),\n ids: this.getIDs(),\n type: \"lb-thread-mark\",\n version: 1,\n };\n }\n\n getIDs(): Array<string> {\n const self = this.getLatest();\n return self instanceof ThreadMarkNode ? self.__ids : [];\n }\n\n constructor(ids: Array<string>, key?: NodeKey) {\n super(key);\n this.__ids = ids || [];\n }\n\n canInsertTextBefore(): false {\n return false;\n }\n\n canInsertTextAfter(): false {\n return false;\n }\n\n canBeEmpty(): false {\n return false;\n }\n\n isInline(): true {\n return true;\n }\n\n extractWithChild(\n _: LexicalNode,\n selection: BaseSelection,\n destination: \"clone\" | \"html\"\n ): boolean {\n if (!$isRangeSelection(selection) || destination === \"html\") {\n return false;\n }\n const anchor = selection.anchor;\n const focus = selection.focus;\n const anchorNode = anchor.getNode();\n const focusNode = focus.getNode();\n const isBackward = selection.isBackward();\n const selectionLength = isBackward\n ? anchor.offset - focus.offset\n : focus.offset - anchor.offset;\n return (\n this.isParentOf(anchorNode) &&\n this.isParentOf(focusNode) &&\n this.getTextContent().length === selectionLength\n );\n }\n\n excludeFromCopy(destination: \"clone\" | \"html\"): boolean {\n return destination !== \"clone\";\n }\n}\n","declare const __VERSION__: string;\ndeclare const TSUP_FORMAT: string;\n\nexport const PKG_NAME = \"@liveblocks/node-lexical\";\nexport const PKG_VERSION = typeof __VERSION__ === \"string\" && __VERSION__;\nexport const PKG_FORMAT = typeof TSUP_FORMAT === \"string\" && TSUP_FORMAT;\n"]}
|
package/dist/index.js
CHANGED
|
@@ -169,7 +169,7 @@ var ThreadMarkNode = class _ThreadMarkNode extends ElementNode {
|
|
|
169
169
|
|
|
170
170
|
// src/version.ts
|
|
171
171
|
var PKG_NAME = "@liveblocks/node-lexical";
|
|
172
|
-
var PKG_VERSION = "2.
|
|
172
|
+
var PKG_VERSION = "2.25.0-aiprivatebeta0";
|
|
173
173
|
var PKG_FORMAT = "esm";
|
|
174
174
|
|
|
175
175
|
// src/index.ts
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@liveblocks/node-lexical",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.25.0-aiprivatebeta0",
|
|
4
4
|
"description": "A server-side utility that lets you modify lexical documents hosted in Liveblocks.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
@@ -34,8 +34,8 @@
|
|
|
34
34
|
"test:watch": "jest --silent --verbose --color=always --watch"
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@liveblocks/core": "2.
|
|
38
|
-
"@liveblocks/node": "2.
|
|
37
|
+
"@liveblocks/core": "2.25.0-aiprivatebeta0",
|
|
38
|
+
"@liveblocks/node": "2.25.0-aiprivatebeta0",
|
|
39
39
|
"yjs": "^13.6.18"
|
|
40
40
|
},
|
|
41
41
|
"peerDependencies": {
|