@liveblocks/node-lexical 2.18.3 → 2.18.4-uns2
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.mjs → index.cjs} +46 -46
- package/dist/index.cjs.map +1 -0
- package/dist/index.js +45 -45
- package/dist/index.js.map +1 -1
- package/package.json +11 -11
- package/dist/index.mjs.map +0 -1
- /package/dist/{index.d.mts → index.d.cts} +0 -0
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
// src/index.ts
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }// src/index.ts
|
|
2
|
+
var _headless = require('@lexical/headless');
|
|
3
|
+
var _markdown = require('@lexical/markdown');
|
|
4
|
+
var _yjs = require('@lexical/yjs');
|
|
5
|
+
var _core = require('@liveblocks/core');
|
|
6
|
+
var _lexical = require('lexical');
|
|
7
|
+
var _yjs3 = require('yjs');
|
|
8
8
|
|
|
9
9
|
// src/collab.ts
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
17
|
function registerCollaborationListeners(editor, provider, binding) {
|
|
18
18
|
const unsubscribeUpdateListener = editor.registerUpdateListener(
|
|
19
19
|
({
|
|
@@ -25,7 +25,7 @@ function registerCollaborationListeners(editor, provider, binding) {
|
|
|
25
25
|
tags
|
|
26
26
|
}) => {
|
|
27
27
|
if (tags.has("skip-collab") === false) {
|
|
28
|
-
syncLexicalUpdateToYjs(
|
|
28
|
+
_yjs.syncLexicalUpdateToYjs.call(void 0,
|
|
29
29
|
binding,
|
|
30
30
|
provider,
|
|
31
31
|
prevEditorState,
|
|
@@ -40,7 +40,7 @@ function registerCollaborationListeners(editor, provider, binding) {
|
|
|
40
40
|
);
|
|
41
41
|
const observer = (events, transaction) => {
|
|
42
42
|
if (transaction.origin !== binding) {
|
|
43
|
-
syncYjsChangesToLexical(binding, provider, events, false);
|
|
43
|
+
_yjs.syncYjsChangesToLexical.call(void 0, binding, provider, events, false);
|
|
44
44
|
}
|
|
45
45
|
};
|
|
46
46
|
binding.root.getSharedType().observeDeep(observer);
|
|
@@ -68,9 +68,9 @@ function createNoOpProvider() {
|
|
|
68
68
|
}
|
|
69
69
|
|
|
70
70
|
// src/MentionNodeLite.ts
|
|
71
|
-
|
|
72
|
-
var MentionNode = class _MentionNode extends DecoratorNode {
|
|
73
|
-
|
|
71
|
+
|
|
72
|
+
var MentionNode = class _MentionNode extends _lexical.DecoratorNode {
|
|
73
|
+
|
|
74
74
|
constructor(value, key) {
|
|
75
75
|
super(key);
|
|
76
76
|
this.__id = value;
|
|
@@ -83,7 +83,7 @@ var MentionNode = class _MentionNode extends DecoratorNode {
|
|
|
83
83
|
}
|
|
84
84
|
static importJSON(serializedNode) {
|
|
85
85
|
const node = new _MentionNode(serializedNode.value);
|
|
86
|
-
return
|
|
86
|
+
return _lexical.$applyNodeReplacement.call(void 0, node);
|
|
87
87
|
}
|
|
88
88
|
exportJSON() {
|
|
89
89
|
return {
|
|
@@ -102,10 +102,10 @@ var MentionNode = class _MentionNode extends DecoratorNode {
|
|
|
102
102
|
};
|
|
103
103
|
|
|
104
104
|
// src/ThreadNodeLite.ts
|
|
105
|
-
|
|
106
|
-
var ThreadMarkNode = class _ThreadMarkNode extends ElementNode {
|
|
105
|
+
|
|
106
|
+
var ThreadMarkNode = class _ThreadMarkNode extends _lexical.ElementNode {
|
|
107
107
|
/** @internal */
|
|
108
|
-
|
|
108
|
+
|
|
109
109
|
// The ids of the threads that this mark is associated with
|
|
110
110
|
static getType() {
|
|
111
111
|
return "lb-thread-mark";
|
|
@@ -114,7 +114,7 @@ var ThreadMarkNode = class _ThreadMarkNode extends ElementNode {
|
|
|
114
114
|
return new _ThreadMarkNode(Array.from(node.__ids), node.__key);
|
|
115
115
|
}
|
|
116
116
|
static importJSON(serializedNode) {
|
|
117
|
-
const node =
|
|
117
|
+
const node = _lexical.$applyNodeReplacement.call(void 0,
|
|
118
118
|
new _ThreadMarkNode(serializedNode.ids)
|
|
119
119
|
);
|
|
120
120
|
node.setFormat(serializedNode.format);
|
|
@@ -151,7 +151,7 @@ var ThreadMarkNode = class _ThreadMarkNode extends ElementNode {
|
|
|
151
151
|
return true;
|
|
152
152
|
}
|
|
153
153
|
extractWithChild(_, selection, destination) {
|
|
154
|
-
if (
|
|
154
|
+
if (!_lexical.$isRangeSelection.call(void 0, selection) || destination === "html") {
|
|
155
155
|
return false;
|
|
156
156
|
}
|
|
157
157
|
const anchor = selection.anchor;
|
|
@@ -169,27 +169,27 @@ 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.18.
|
|
173
|
-
var PKG_FORMAT = "
|
|
172
|
+
var PKG_VERSION = "2.18.4-uns2";
|
|
173
|
+
var PKG_FORMAT = "cjs";
|
|
174
174
|
|
|
175
175
|
// src/index.ts
|
|
176
|
-
|
|
177
|
-
detectDupes(PKG_NAME, PKG_VERSION, PKG_FORMAT);
|
|
176
|
+
|
|
177
|
+
_core.detectDupes.call(void 0, PKG_NAME, PKG_VERSION, PKG_FORMAT);
|
|
178
178
|
var LIVEBLOCKS_NODES = [ThreadMarkNode, MentionNode];
|
|
179
179
|
async function withLexicalDocument({ roomId, nodes, client }, callback) {
|
|
180
180
|
const update = new Uint8Array(
|
|
181
181
|
await client.getYjsDocumentAsBinaryUpdate(roomId)
|
|
182
182
|
);
|
|
183
|
-
const editor =
|
|
184
|
-
nodes: [...LIVEBLOCKS_NODES, ...nodes
|
|
183
|
+
const editor = _headless.createHeadlessEditor.call(void 0, {
|
|
184
|
+
nodes: [...LIVEBLOCKS_NODES, ..._nullishCoalesce(nodes, () => ( []))]
|
|
185
185
|
});
|
|
186
186
|
const id = "root";
|
|
187
|
-
const doc = new
|
|
187
|
+
const doc = new (0, _yjs3.Doc)();
|
|
188
188
|
const docMap = /* @__PURE__ */ new Map([[id, doc]]);
|
|
189
189
|
const provider = createNoOpProvider();
|
|
190
|
-
const binding =
|
|
190
|
+
const binding = _yjs.createBinding.call(void 0, editor, provider, id, doc, docMap);
|
|
191
191
|
const unsubscribe = registerCollaborationListeners(editor, provider, binding);
|
|
192
|
-
applyUpdate(binding.doc, update);
|
|
192
|
+
_yjs3.applyUpdate.call(void 0, binding.doc, update);
|
|
193
193
|
editor.update(() => {
|
|
194
194
|
}, { discrete: true });
|
|
195
195
|
const val = await callback({
|
|
@@ -200,7 +200,7 @@ async function withLexicalDocument({ roomId, nodes, client }, callback) {
|
|
|
200
200
|
const latest = new Uint8Array(
|
|
201
201
|
await client.getYjsDocumentAsBinaryUpdate(roomId)
|
|
202
202
|
);
|
|
203
|
-
applyUpdate(binding.doc, latest);
|
|
203
|
+
_yjs3.applyUpdate.call(void 0, binding.doc, latest);
|
|
204
204
|
editor.update(() => {
|
|
205
205
|
}, { discrete: true });
|
|
206
206
|
},
|
|
@@ -210,14 +210,14 @@ async function withLexicalDocument({ roomId, nodes, client }, callback) {
|
|
|
210
210
|
update: async (modifyFn) => {
|
|
211
211
|
editor.update(() => {
|
|
212
212
|
}, { discrete: true });
|
|
213
|
-
const beforeVector = encodeStateVector(binding.doc);
|
|
213
|
+
const beforeVector = _yjs3.encodeStateVector.call(void 0, binding.doc);
|
|
214
214
|
editor.update(
|
|
215
215
|
() => {
|
|
216
216
|
modifyFn();
|
|
217
217
|
},
|
|
218
218
|
{ discrete: true }
|
|
219
219
|
);
|
|
220
|
-
const diffUpdate = encodeStateAsUpdate(binding.doc, beforeVector);
|
|
220
|
+
const diffUpdate = _yjs3.encodeStateAsUpdate.call(void 0, binding.doc, beforeVector);
|
|
221
221
|
return client.sendYjsBinaryUpdate(roomId, diffUpdate);
|
|
222
222
|
},
|
|
223
223
|
/**
|
|
@@ -226,7 +226,7 @@ async function withLexicalDocument({ roomId, nodes, client }, callback) {
|
|
|
226
226
|
getTextContent: () => {
|
|
227
227
|
let content = "";
|
|
228
228
|
editor.getEditorState().read(() => {
|
|
229
|
-
content =
|
|
229
|
+
content = _lexical.$getRoot.call(void 0, ).getTextContent();
|
|
230
230
|
});
|
|
231
231
|
return content;
|
|
232
232
|
},
|
|
@@ -242,7 +242,7 @@ async function withLexicalDocument({ roomId, nodes, client }, callback) {
|
|
|
242
242
|
toMarkdown: () => {
|
|
243
243
|
let markdown = "";
|
|
244
244
|
editor.getEditorState().read(() => {
|
|
245
|
-
markdown =
|
|
245
|
+
markdown = _markdown.$convertToMarkdownString.call(void 0, _markdown.TRANSFORMERS);
|
|
246
246
|
});
|
|
247
247
|
return markdown;
|
|
248
248
|
},
|
|
@@ -262,10 +262,10 @@ async function withLexicalDocument({ roomId, nodes, client }, callback) {
|
|
|
262
262
|
unsubscribe();
|
|
263
263
|
return val;
|
|
264
264
|
}
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
//# sourceMappingURL=index.
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
exports.$createParagraphNode = _lexical.$createParagraphNode; exports.$createTextNode = _lexical.$createTextNode; exports.$getRoot = _lexical.$getRoot; exports.withLexicalDocument = withLexicalDocument;
|
|
271
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +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"]}
|
package/dist/index.js
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
// src/index.ts
|
|
2
|
+
import { createHeadlessEditor as createHeadlessEditor2 } from "@lexical/headless";
|
|
3
|
+
import { $convertToMarkdownString, TRANSFORMERS } from "@lexical/markdown";
|
|
4
|
+
import { createBinding as createBinding2 } from "@lexical/yjs";
|
|
5
|
+
import { detectDupes } from "@liveblocks/core";
|
|
6
|
+
import { $getRoot } from "lexical";
|
|
7
|
+
import { applyUpdate, Doc as Doc2, encodeStateAsUpdate, encodeStateVector } from "yjs";
|
|
8
8
|
|
|
9
9
|
// src/collab.ts
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
10
|
+
import { createHeadlessEditor } from "@lexical/headless";
|
|
11
|
+
import {
|
|
12
|
+
createBinding,
|
|
13
|
+
syncLexicalUpdateToYjs,
|
|
14
|
+
syncYjsChangesToLexical
|
|
15
|
+
} from "@lexical/yjs";
|
|
16
|
+
import { Doc } from "yjs";
|
|
17
17
|
function registerCollaborationListeners(editor, provider, binding) {
|
|
18
18
|
const unsubscribeUpdateListener = editor.registerUpdateListener(
|
|
19
19
|
({
|
|
@@ -25,7 +25,7 @@ function registerCollaborationListeners(editor, provider, binding) {
|
|
|
25
25
|
tags
|
|
26
26
|
}) => {
|
|
27
27
|
if (tags.has("skip-collab") === false) {
|
|
28
|
-
|
|
28
|
+
syncLexicalUpdateToYjs(
|
|
29
29
|
binding,
|
|
30
30
|
provider,
|
|
31
31
|
prevEditorState,
|
|
@@ -40,7 +40,7 @@ function registerCollaborationListeners(editor, provider, binding) {
|
|
|
40
40
|
);
|
|
41
41
|
const observer = (events, transaction) => {
|
|
42
42
|
if (transaction.origin !== binding) {
|
|
43
|
-
|
|
43
|
+
syncYjsChangesToLexical(binding, provider, events, false);
|
|
44
44
|
}
|
|
45
45
|
};
|
|
46
46
|
binding.root.getSharedType().observeDeep(observer);
|
|
@@ -68,9 +68,9 @@ function createNoOpProvider() {
|
|
|
68
68
|
}
|
|
69
69
|
|
|
70
70
|
// src/MentionNodeLite.ts
|
|
71
|
-
|
|
72
|
-
var MentionNode = class _MentionNode extends
|
|
73
|
-
|
|
71
|
+
import { $applyNodeReplacement, DecoratorNode } from "lexical";
|
|
72
|
+
var MentionNode = class _MentionNode extends DecoratorNode {
|
|
73
|
+
__id;
|
|
74
74
|
constructor(value, key) {
|
|
75
75
|
super(key);
|
|
76
76
|
this.__id = value;
|
|
@@ -83,7 +83,7 @@ var MentionNode = class _MentionNode extends _lexical.DecoratorNode {
|
|
|
83
83
|
}
|
|
84
84
|
static importJSON(serializedNode) {
|
|
85
85
|
const node = new _MentionNode(serializedNode.value);
|
|
86
|
-
return
|
|
86
|
+
return $applyNodeReplacement(node);
|
|
87
87
|
}
|
|
88
88
|
exportJSON() {
|
|
89
89
|
return {
|
|
@@ -102,10 +102,10 @@ var MentionNode = class _MentionNode extends _lexical.DecoratorNode {
|
|
|
102
102
|
};
|
|
103
103
|
|
|
104
104
|
// src/ThreadNodeLite.ts
|
|
105
|
-
|
|
106
|
-
var ThreadMarkNode = class _ThreadMarkNode extends
|
|
105
|
+
import { $applyNodeReplacement as $applyNodeReplacement2, $isRangeSelection, ElementNode } from "lexical";
|
|
106
|
+
var ThreadMarkNode = class _ThreadMarkNode extends ElementNode {
|
|
107
107
|
/** @internal */
|
|
108
|
-
|
|
108
|
+
__ids;
|
|
109
109
|
// The ids of the threads that this mark is associated with
|
|
110
110
|
static getType() {
|
|
111
111
|
return "lb-thread-mark";
|
|
@@ -114,7 +114,7 @@ var ThreadMarkNode = class _ThreadMarkNode extends _lexical.ElementNode {
|
|
|
114
114
|
return new _ThreadMarkNode(Array.from(node.__ids), node.__key);
|
|
115
115
|
}
|
|
116
116
|
static importJSON(serializedNode) {
|
|
117
|
-
const node =
|
|
117
|
+
const node = $applyNodeReplacement2(
|
|
118
118
|
new _ThreadMarkNode(serializedNode.ids)
|
|
119
119
|
);
|
|
120
120
|
node.setFormat(serializedNode.format);
|
|
@@ -151,7 +151,7 @@ var ThreadMarkNode = class _ThreadMarkNode extends _lexical.ElementNode {
|
|
|
151
151
|
return true;
|
|
152
152
|
}
|
|
153
153
|
extractWithChild(_, selection, destination) {
|
|
154
|
-
if (
|
|
154
|
+
if (!$isRangeSelection(selection) || destination === "html") {
|
|
155
155
|
return false;
|
|
156
156
|
}
|
|
157
157
|
const anchor = selection.anchor;
|
|
@@ -169,27 +169,27 @@ 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.18.
|
|
173
|
-
var PKG_FORMAT = "
|
|
172
|
+
var PKG_VERSION = "2.18.4-uns2";
|
|
173
|
+
var PKG_FORMAT = "esm";
|
|
174
174
|
|
|
175
175
|
// src/index.ts
|
|
176
|
-
|
|
177
|
-
|
|
176
|
+
import { $createParagraphNode, $createTextNode, $getRoot as $getRoot2 } from "lexical";
|
|
177
|
+
detectDupes(PKG_NAME, PKG_VERSION, PKG_FORMAT);
|
|
178
178
|
var LIVEBLOCKS_NODES = [ThreadMarkNode, MentionNode];
|
|
179
179
|
async function withLexicalDocument({ roomId, nodes, client }, callback) {
|
|
180
180
|
const update = new Uint8Array(
|
|
181
181
|
await client.getYjsDocumentAsBinaryUpdate(roomId)
|
|
182
182
|
);
|
|
183
|
-
const editor =
|
|
184
|
-
nodes: [...LIVEBLOCKS_NODES, ...
|
|
183
|
+
const editor = createHeadlessEditor2({
|
|
184
|
+
nodes: [...LIVEBLOCKS_NODES, ...nodes ?? []]
|
|
185
185
|
});
|
|
186
186
|
const id = "root";
|
|
187
|
-
const doc = new (
|
|
187
|
+
const doc = new Doc2();
|
|
188
188
|
const docMap = /* @__PURE__ */ new Map([[id, doc]]);
|
|
189
189
|
const provider = createNoOpProvider();
|
|
190
|
-
const binding =
|
|
190
|
+
const binding = createBinding2(editor, provider, id, doc, docMap);
|
|
191
191
|
const unsubscribe = registerCollaborationListeners(editor, provider, binding);
|
|
192
|
-
|
|
192
|
+
applyUpdate(binding.doc, update);
|
|
193
193
|
editor.update(() => {
|
|
194
194
|
}, { discrete: true });
|
|
195
195
|
const val = await callback({
|
|
@@ -200,7 +200,7 @@ async function withLexicalDocument({ roomId, nodes, client }, callback) {
|
|
|
200
200
|
const latest = new Uint8Array(
|
|
201
201
|
await client.getYjsDocumentAsBinaryUpdate(roomId)
|
|
202
202
|
);
|
|
203
|
-
|
|
203
|
+
applyUpdate(binding.doc, latest);
|
|
204
204
|
editor.update(() => {
|
|
205
205
|
}, { discrete: true });
|
|
206
206
|
},
|
|
@@ -210,14 +210,14 @@ async function withLexicalDocument({ roomId, nodes, client }, callback) {
|
|
|
210
210
|
update: async (modifyFn) => {
|
|
211
211
|
editor.update(() => {
|
|
212
212
|
}, { discrete: true });
|
|
213
|
-
const beforeVector =
|
|
213
|
+
const beforeVector = encodeStateVector(binding.doc);
|
|
214
214
|
editor.update(
|
|
215
215
|
() => {
|
|
216
216
|
modifyFn();
|
|
217
217
|
},
|
|
218
218
|
{ discrete: true }
|
|
219
219
|
);
|
|
220
|
-
const diffUpdate =
|
|
220
|
+
const diffUpdate = encodeStateAsUpdate(binding.doc, beforeVector);
|
|
221
221
|
return client.sendYjsBinaryUpdate(roomId, diffUpdate);
|
|
222
222
|
},
|
|
223
223
|
/**
|
|
@@ -226,7 +226,7 @@ async function withLexicalDocument({ roomId, nodes, client }, callback) {
|
|
|
226
226
|
getTextContent: () => {
|
|
227
227
|
let content = "";
|
|
228
228
|
editor.getEditorState().read(() => {
|
|
229
|
-
content =
|
|
229
|
+
content = $getRoot().getTextContent();
|
|
230
230
|
});
|
|
231
231
|
return content;
|
|
232
232
|
},
|
|
@@ -242,7 +242,7 @@ async function withLexicalDocument({ roomId, nodes, client }, callback) {
|
|
|
242
242
|
toMarkdown: () => {
|
|
243
243
|
let markdown = "";
|
|
244
244
|
editor.getEditorState().read(() => {
|
|
245
|
-
markdown =
|
|
245
|
+
markdown = $convertToMarkdownString(TRANSFORMERS);
|
|
246
246
|
});
|
|
247
247
|
return markdown;
|
|
248
248
|
},
|
|
@@ -262,10 +262,10 @@ async function withLexicalDocument({ roomId, nodes, client }, callback) {
|
|
|
262
262
|
unsubscribe();
|
|
263
263
|
return val;
|
|
264
264
|
}
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
265
|
+
export {
|
|
266
|
+
$createParagraphNode,
|
|
267
|
+
$createTextNode,
|
|
268
|
+
$getRoot2 as $getRoot,
|
|
269
|
+
withLexicalDocument
|
|
270
|
+
};
|
|
271
271
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/liveblocks/liveblocks/packages/liveblocks-node-lexical/dist/index.js","../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.js","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":["../src/index.ts","../src/collab.ts","../src/MentionNodeLite.ts","../src/ThreadNodeLite.ts","../src/version.ts"],"sourcesContent":["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"],"mappings":"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","names":["createHeadlessEditor","createBinding","Doc","$applyNodeReplacement","$getRoot","createHeadlessEditor","Doc","createBinding"]}
|
package/package.json
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@liveblocks/node-lexical",
|
|
3
|
-
"version": "2.18.
|
|
3
|
+
"version": "2.18.4-uns2",
|
|
4
4
|
"description": "A server-side utility that lets you modify lexical documents hosted in Liveblocks.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
|
-
"type": "
|
|
7
|
-
"main": "./dist/index.
|
|
8
|
-
"types": "./dist/index.d.
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "./dist/index.cjs",
|
|
8
|
+
"types": "./dist/index.d.cts",
|
|
9
9
|
"exports": {
|
|
10
10
|
".": {
|
|
11
11
|
"import": {
|
|
12
|
-
"types": "./dist/index.d.mts",
|
|
13
|
-
"default": "./dist/index.mjs"
|
|
14
|
-
},
|
|
15
|
-
"require": {
|
|
16
12
|
"types": "./dist/index.d.ts",
|
|
17
|
-
"module": "./dist/index.mjs",
|
|
18
13
|
"default": "./dist/index.js"
|
|
14
|
+
},
|
|
15
|
+
"require": {
|
|
16
|
+
"types": "./dist/index.d.cts",
|
|
17
|
+
"module": "./dist/index.js",
|
|
18
|
+
"default": "./dist/index.cjs"
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
21
|
},
|
|
@@ -34,8 +34,8 @@
|
|
|
34
34
|
"test:watch": "jest --silent --verbose --color=always --watch"
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@liveblocks/core": "2.18.
|
|
38
|
-
"@liveblocks/node": "2.18.
|
|
37
|
+
"@liveblocks/core": "2.18.4-uns2",
|
|
38
|
+
"@liveblocks/node": "2.18.4-uns2",
|
|
39
39
|
"yjs": "^13.6.18"
|
|
40
40
|
},
|
|
41
41
|
"peerDependencies": {
|
package/dist/index.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/collab.ts","../src/MentionNodeLite.ts","../src/ThreadNodeLite.ts","../src/version.ts"],"sourcesContent":["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"],"mappings":"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","names":["createHeadlessEditor","createBinding","Doc","$applyNodeReplacement","$getRoot","createHeadlessEditor","Doc","createBinding"]}
|
|
File without changes
|