@liveblocks/react-tiptap 3.19.4-test1 → 3.20.0-rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/dist/LiveblocksExtension.cjs +5 -51
  2. package/dist/LiveblocksExtension.cjs.map +1 -1
  3. package/dist/LiveblocksExtension.js +5 -51
  4. package/dist/LiveblocksExtension.js.map +1 -1
  5. package/dist/ai/AiExtension.cjs +1 -2
  6. package/dist/ai/AiExtension.cjs.map +1 -1
  7. package/dist/ai/AiExtension.js +1 -2
  8. package/dist/ai/AiExtension.js.map +1 -1
  9. package/dist/comments/CommentsExtension.cjs +1 -7
  10. package/dist/comments/CommentsExtension.cjs.map +1 -1
  11. package/dist/comments/CommentsExtension.js +1 -7
  12. package/dist/comments/CommentsExtension.js.map +1 -1
  13. package/dist/index.d.cts +0 -5
  14. package/dist/index.d.ts +0 -5
  15. package/dist/mentions/MentionExtension.cjs +1 -4
  16. package/dist/mentions/MentionExtension.cjs.map +1 -1
  17. package/dist/mentions/MentionExtension.js +1 -4
  18. package/dist/mentions/MentionExtension.js.map +1 -1
  19. package/dist/types.cjs.map +1 -1
  20. package/dist/types.js.map +1 -1
  21. package/dist/version.cjs +1 -1
  22. package/dist/version.cjs.map +1 -1
  23. package/dist/version.js +1 -1
  24. package/dist/version.js.map +1 -1
  25. package/package.json +6 -6
  26. package/src/styles/index.css +4 -12
  27. package/styles.css +1 -1
  28. package/styles.css.map +1 -1
  29. package/dist/collaboration-liveblocks/cursors.cjs +0 -267
  30. package/dist/collaboration-liveblocks/cursors.cjs.map +0 -1
  31. package/dist/collaboration-liveblocks/cursors.js +0 -264
  32. package/dist/collaboration-liveblocks/cursors.js.map +0 -1
  33. package/dist/collaboration-liveblocks/mapping.cjs +0 -218
  34. package/dist/collaboration-liveblocks/mapping.cjs.map +0 -1
  35. package/dist/collaboration-liveblocks/mapping.js +0 -207
  36. package/dist/collaboration-liveblocks/mapping.js.map +0 -1
  37. package/dist/collaboration-liveblocks/plugin.cjs +0 -250
  38. package/dist/collaboration-liveblocks/plugin.cjs.map +0 -1
  39. package/dist/collaboration-liveblocks/plugin.js +0 -247
  40. package/dist/collaboration-liveblocks/plugin.js.map +0 -1
  41. package/dist/collaboration-liveblocks/remote.cjs +0 -196
  42. package/dist/collaboration-liveblocks/remote.cjs.map +0 -1
  43. package/dist/collaboration-liveblocks/remote.js +0 -193
  44. package/dist/collaboration-liveblocks/remote.js.map +0 -1
  45. package/dist/collaboration-liveblocks/schema.cjs +0 -150
  46. package/dist/collaboration-liveblocks/schema.cjs.map +0 -1
  47. package/dist/collaboration-liveblocks/schema.js +0 -135
  48. package/dist/collaboration-liveblocks/schema.js.map +0 -1
  49. package/dist/collaboration-liveblocks/steps.cjs +0 -359
  50. package/dist/collaboration-liveblocks/steps.cjs.map +0 -1
  51. package/dist/collaboration-liveblocks/steps.js +0 -356
  52. package/dist/collaboration-liveblocks/steps.js.map +0 -1
@@ -1,247 +0,0 @@
1
- import { LiveObject } from '@liveblocks/client';
2
- import { Extension } from '@tiptap/core';
3
- import { Slice } from '@tiptap/pm/model';
4
- import { PluginKey, Plugin } from '@tiptap/pm/state';
5
- import { applyRemoteStorageUpdates } from './remote.js';
6
- import { createDefaultDocument, createLiveblocksTiptapNode, liveblocksTiptapNodeToJson, stringifyDocument } from './schema.js';
7
- import { classifyTransaction, applyIncrementalOperations } from './steps.js';
8
-
9
- const LIVEBLOCKS_COLLABORATION_PLUGIN_KEY = new PluginKey("liveblocks-collaboration");
10
- function isProseMirrorJsonNode(value) {
11
- return typeof value === "object" && value !== null && typeof value.type === "string";
12
- }
13
- function getInitialDocument(initialContent, view) {
14
- if (isProseMirrorJsonNode(initialContent)) {
15
- return initialContent;
16
- }
17
- const currentDocument = view.state.doc.toJSON();
18
- if (isProseMirrorJsonNode(currentDocument)) {
19
- return currentDocument;
20
- }
21
- return createDefaultDocument();
22
- }
23
- function replaceEditorDocument(view, document) {
24
- const nextDocument = view.state.schema.nodeFromJSON(document);
25
- const diffStart = view.state.doc.content.findDiffStart(nextDocument.content);
26
- if (diffStart === null || !view.state.tr) {
27
- return;
28
- }
29
- const diffEnd = view.state.doc.content.findDiffEnd(nextDocument.content);
30
- const tr = diffEnd === null ? view.state.tr.replace(
31
- 0,
32
- view.state.doc.content.size,
33
- new Slice(nextDocument.content, 0, 0)
34
- ) : view.state.tr.replace(
35
- diffStart,
36
- diffEnd.a,
37
- nextDocument.slice(diffStart, diffEnd.b)
38
- );
39
- tr.setMeta(LIVEBLOCKS_COLLABORATION_PLUGIN_KEY, { isRemote: true }).setMeta(
40
- "addToHistory",
41
- false
42
- );
43
- view.dispatch(tr);
44
- }
45
- function getDocumentRoot(root, field) {
46
- const documentRoot = root.get(field);
47
- if (!(documentRoot instanceof LiveObject)) {
48
- return void 0;
49
- }
50
- return documentRoot;
51
- }
52
- function setDocumentRoot(root, field, document) {
53
- root.set(field, createLiveblocksTiptapNode(document));
54
- }
55
- function createLiveblocksCollaborationPlugin(options) {
56
- const room = options.room;
57
- if (room === void 0) {
58
- throw new Error(
59
- "[Liveblocks] The Liveblocks collaboration plugin requires a room."
60
- );
61
- }
62
- let view;
63
- let root;
64
- let unsubscribe;
65
- let destroyed = false;
66
- let isApplyingRemoteUpdate = false;
67
- let isApplyingLocalUpdate = false;
68
- let lastDocument = "";
69
- const applyStorageToEditor = (updates) => {
70
- if (view === void 0 || root === void 0) {
71
- return;
72
- }
73
- const documentRoot = getDocumentRoot(root, options.field);
74
- if (documentRoot === void 0) {
75
- return;
76
- }
77
- if (isApplyingLocalUpdate) {
78
- return;
79
- }
80
- const document = liveblocksTiptapNodeToJson(documentRoot);
81
- const serializedDocument = stringifyDocument(document);
82
- if (serializedDocument === lastDocument) {
83
- return;
84
- }
85
- if (updates !== void 0) {
86
- const result = applyRemoteStorageUpdates(view, documentRoot, updates);
87
- if (result.type === "applied") {
88
- lastDocument = serializedDocument;
89
- isApplyingRemoteUpdate = true;
90
- try {
91
- view.dispatch(
92
- result.tr.setMeta(LIVEBLOCKS_COLLABORATION_PLUGIN_KEY, { isRemote: true }).setMeta("addToHistory", false)
93
- );
94
- } finally {
95
- isApplyingRemoteUpdate = false;
96
- }
97
- return;
98
- }
99
- }
100
- lastDocument = serializedDocument;
101
- isApplyingRemoteUpdate = true;
102
- try {
103
- replaceEditorDocument(view, document);
104
- } finally {
105
- isApplyingRemoteUpdate = false;
106
- }
107
- };
108
- return new Plugin({
109
- key: LIVEBLOCKS_COLLABORATION_PLUGIN_KEY,
110
- state: {
111
- init: () => ({ isReady: false }),
112
- apply(tr, state) {
113
- const meta = tr.getMeta(LIVEBLOCKS_COLLABORATION_PLUGIN_KEY);
114
- return meta?.isReady !== void 0 ? { ...state, isReady: meta.isReady } : state;
115
- }
116
- },
117
- appendTransaction(transactions, oldState, newState) {
118
- if (root === void 0 || isApplyingRemoteUpdate || !transactions.some((transaction) => transaction.docChanged) || transactions.some(
119
- (transaction) => Boolean(transaction.getMeta(LIVEBLOCKS_COLLABORATION_PLUGIN_KEY))
120
- )) {
121
- return null;
122
- }
123
- const currentRoot = root;
124
- const documentRoot = getDocumentRoot(currentRoot, options.field);
125
- const classified = documentRoot !== void 0 ? classifyTransaction(
126
- transactions,
127
- oldState.doc,
128
- newState.doc,
129
- documentRoot
130
- ) : { type: "unsupported" };
131
- room.batch(() => {
132
- if (classified.type === "incremental") {
133
- isApplyingLocalUpdate = true;
134
- try {
135
- applyIncrementalOperations(classified.operations);
136
- } finally {
137
- isApplyingLocalUpdate = false;
138
- }
139
- } else {
140
- const document = newState.doc.toJSON();
141
- if (!isProseMirrorJsonNode(document)) {
142
- return;
143
- }
144
- const serializedDocument = stringifyDocument(document);
145
- if (serializedDocument === lastDocument) {
146
- return;
147
- }
148
- lastDocument = serializedDocument;
149
- setDocumentRoot(currentRoot, options.field, document);
150
- }
151
- });
152
- return null;
153
- },
154
- view(editorView) {
155
- view = editorView;
156
- room.getStorage().then(({ root: storageRoot }) => {
157
- if (destroyed) {
158
- return;
159
- }
160
- root = storageRoot;
161
- if (getDocumentRoot(storageRoot, options.field) === void 0) {
162
- const initialDocument = getInitialDocument(
163
- options.initialContent,
164
- editorView
165
- );
166
- room.history.disable(() => {
167
- setDocumentRoot(storageRoot, options.field, initialDocument);
168
- });
169
- }
170
- applyStorageToEditor();
171
- const tr = editorView.state.tr.setMeta(
172
- LIVEBLOCKS_COLLABORATION_PLUGIN_KEY,
173
- { isReady: true }
174
- );
175
- editorView.dispatch(tr);
176
- unsubscribe = room.subscribe(storageRoot, applyStorageToEditor, {
177
- isDeep: true
178
- });
179
- });
180
- return {
181
- update(nextView) {
182
- view = nextView;
183
- },
184
- destroy() {
185
- destroyed = true;
186
- unsubscribe?.();
187
- unsubscribe = void 0;
188
- view = void 0;
189
- root = void 0;
190
- }
191
- };
192
- }
193
- });
194
- }
195
- const LiveblocksCollaboration = Extension.create({
196
- name: "collaboration",
197
- priority: 1e3,
198
- addOptions() {
199
- return {
200
- room: void 0,
201
- field: "default",
202
- initialContent: void 0
203
- };
204
- },
205
- addStorage() {
206
- return {
207
- isDisabled: false
208
- };
209
- },
210
- addCommands() {
211
- return {
212
- undo: () => ({ dispatch, tr }) => {
213
- tr.setMeta("preventDispatch", true);
214
- if (this.options.room === void 0 || !this.options.room.history.canUndo()) {
215
- return false;
216
- }
217
- if (dispatch) {
218
- this.options.room.history.undo();
219
- }
220
- return true;
221
- },
222
- redo: () => ({ dispatch, tr }) => {
223
- tr.setMeta("preventDispatch", true);
224
- if (this.options.room === void 0 || !this.options.room.history.canRedo()) {
225
- return false;
226
- }
227
- if (dispatch) {
228
- this.options.room.history.redo();
229
- }
230
- return true;
231
- }
232
- };
233
- },
234
- addKeyboardShortcuts() {
235
- return {
236
- "Mod-z": () => this.editor.commands.undo(),
237
- "Mod-y": () => this.editor.commands.redo(),
238
- "Shift-Mod-z": () => this.editor.commands.redo()
239
- };
240
- },
241
- addProseMirrorPlugins() {
242
- return [createLiveblocksCollaborationPlugin(this.options)];
243
- }
244
- });
245
-
246
- export { LIVEBLOCKS_COLLABORATION_PLUGIN_KEY, LiveblocksCollaboration };
247
- //# sourceMappingURL=plugin.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"plugin.js","sources":["../../src/collaboration-liveblocks/plugin.ts"],"sourcesContent":["import type { LsonObject, StorageUpdate } from \"@liveblocks/client\";\nimport { LiveObject } from \"@liveblocks/client\";\nimport type { Content } from \"@tiptap/core\";\nimport { Extension } from \"@tiptap/core\";\nimport { Slice } from \"@tiptap/pm/model\";\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\";\nimport type { EditorView } from \"@tiptap/pm/view\";\n\nimport { applyRemoteStorageUpdates } from \"./remote\";\nimport {\n createDefaultDocument,\n createLiveblocksTiptapNode,\n type LiveblocksTiptapNode,\n liveblocksTiptapNodeToJson,\n type ProseMirrorJsonNode,\n stringifyDocument,\n} from \"./schema\";\nimport { applyIncrementalOperations, classifyTransaction } from \"./steps\";\nimport type { LiveblocksTiptapRoom } from \"./types\";\n\nexport const LIVEBLOCKS_COLLABORATION_PLUGIN_KEY = new PluginKey<{\n isReady: boolean;\n}>(\"liveblocks-collaboration\");\n\ntype LiveblocksCollaborationOptions = {\n room?: LiveblocksTiptapRoom;\n field: string;\n initialContent?: Content;\n};\n\ntype LiveblocksCollaborationStorage = {\n isDisabled: boolean;\n};\n\nfunction isProseMirrorJsonNode(value: unknown): value is ProseMirrorJsonNode {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as { type?: unknown }).type === \"string\"\n );\n}\n\nfunction getInitialDocument(\n initialContent: Content | undefined,\n view: EditorView\n): ProseMirrorJsonNode {\n if (isProseMirrorJsonNode(initialContent)) {\n return initialContent;\n }\n\n const currentDocument: unknown = view.state.doc.toJSON();\n if (isProseMirrorJsonNode(currentDocument)) {\n return currentDocument;\n }\n\n return createDefaultDocument();\n}\n\nfunction replaceEditorDocument(\n view: EditorView,\n document: ProseMirrorJsonNode\n): void {\n const nextDocument = view.state.schema.nodeFromJSON(document);\n const diffStart = view.state.doc.content.findDiffStart(nextDocument.content);\n\n if (diffStart === null || !view.state.tr) {\n return;\n }\n\n const diffEnd = view.state.doc.content.findDiffEnd(nextDocument.content);\n const tr =\n diffEnd === null\n ? view.state.tr.replace(\n 0,\n view.state.doc.content.size,\n new Slice(nextDocument.content, 0, 0)\n )\n : view.state.tr.replace(\n diffStart,\n diffEnd.a,\n nextDocument.slice(diffStart, diffEnd.b)\n );\n\n tr.setMeta(LIVEBLOCKS_COLLABORATION_PLUGIN_KEY, { isRemote: true }).setMeta(\n \"addToHistory\",\n false\n );\n\n view.dispatch(tr);\n}\n\nfunction getDocumentRoot(\n root: LiveObject<LsonObject>,\n field: string\n): LiveblocksTiptapNode | undefined {\n const documentRoot = root.get(field);\n if (!(documentRoot instanceof LiveObject)) {\n return undefined;\n }\n\n return documentRoot as LiveblocksTiptapNode;\n}\n\nfunction setDocumentRoot(\n root: LiveObject<LsonObject>,\n field: string,\n document: ProseMirrorJsonNode\n): void {\n root.set(field, createLiveblocksTiptapNode(document));\n}\n\nfunction createLiveblocksCollaborationPlugin(\n options: LiveblocksCollaborationOptions\n): Plugin {\n const room = options.room;\n if (room === undefined) {\n throw new Error(\n \"[Liveblocks] The Liveblocks collaboration plugin requires a room.\"\n );\n }\n\n let view: EditorView | undefined;\n let root: LiveObject<LsonObject> | undefined;\n let unsubscribe: (() => void) | undefined;\n let destroyed = false;\n let isApplyingRemoteUpdate = false;\n let isApplyingLocalUpdate = false;\n let lastDocument = \"\";\n\n const applyStorageToEditor = (updates?: StorageUpdate[]) => {\n if (view === undefined || root === undefined) {\n return;\n }\n\n const documentRoot = getDocumentRoot(root, options.field);\n if (documentRoot === undefined) {\n return;\n }\n\n if (isApplyingLocalUpdate) {\n return;\n }\n\n const document = liveblocksTiptapNodeToJson(documentRoot);\n const serializedDocument = stringifyDocument(document);\n\n if (serializedDocument === lastDocument) {\n return;\n }\n\n if (updates !== undefined) {\n const result = applyRemoteStorageUpdates(view, documentRoot, updates);\n if (result.type === \"applied\") {\n lastDocument = serializedDocument;\n isApplyingRemoteUpdate = true;\n try {\n view.dispatch(\n result.tr\n .setMeta(LIVEBLOCKS_COLLABORATION_PLUGIN_KEY, { isRemote: true })\n .setMeta(\"addToHistory\", false)\n );\n } finally {\n isApplyingRemoteUpdate = false;\n }\n return;\n }\n }\n\n lastDocument = serializedDocument;\n isApplyingRemoteUpdate = true;\n try {\n replaceEditorDocument(view, document);\n } finally {\n isApplyingRemoteUpdate = false;\n }\n };\n\n return new Plugin({\n key: LIVEBLOCKS_COLLABORATION_PLUGIN_KEY,\n state: {\n init: () => ({ isReady: false }),\n apply(tr, state) {\n const meta = tr.getMeta(LIVEBLOCKS_COLLABORATION_PLUGIN_KEY) as\n | { isReady?: boolean }\n | undefined;\n\n return meta?.isReady !== undefined\n ? { ...state, isReady: meta.isReady }\n : state;\n },\n },\n appendTransaction(transactions, oldState, newState) {\n if (\n root === undefined ||\n isApplyingRemoteUpdate ||\n !transactions.some((transaction) => transaction.docChanged) ||\n transactions.some((transaction) =>\n Boolean(transaction.getMeta(LIVEBLOCKS_COLLABORATION_PLUGIN_KEY))\n )\n ) {\n return null;\n }\n\n const currentRoot = root;\n\n const documentRoot = getDocumentRoot(currentRoot, options.field);\n const classified =\n documentRoot !== undefined\n ? classifyTransaction(\n transactions,\n oldState.doc,\n newState.doc,\n documentRoot\n )\n : { type: \"unsupported\" as const };\n\n room.batch(() => {\n if (classified.type === \"incremental\") {\n isApplyingLocalUpdate = true;\n try {\n applyIncrementalOperations(classified.operations);\n } finally {\n isApplyingLocalUpdate = false;\n }\n } else {\n const document: unknown = newState.doc.toJSON();\n if (!isProseMirrorJsonNode(document)) {\n return;\n }\n\n const serializedDocument = stringifyDocument(document);\n if (serializedDocument === lastDocument) {\n return;\n }\n\n lastDocument = serializedDocument;\n setDocumentRoot(currentRoot, options.field, document);\n }\n });\n\n return null;\n },\n view(editorView) {\n view = editorView;\n\n room.getStorage().then(({ root: storageRoot }) => {\n if (destroyed) {\n return;\n }\n\n root = storageRoot;\n\n if (getDocumentRoot(storageRoot, options.field) === undefined) {\n const initialDocument = getInitialDocument(\n options.initialContent,\n editorView\n );\n room.history.disable(() => {\n setDocumentRoot(storageRoot, options.field, initialDocument);\n });\n }\n\n applyStorageToEditor();\n\n const tr = editorView.state.tr.setMeta(\n LIVEBLOCKS_COLLABORATION_PLUGIN_KEY,\n { isReady: true }\n );\n editorView.dispatch(tr);\n\n unsubscribe = room.subscribe(storageRoot, applyStorageToEditor, {\n isDeep: true,\n });\n });\n\n return {\n update(nextView) {\n view = nextView;\n },\n destroy() {\n destroyed = true;\n unsubscribe?.();\n unsubscribe = undefined;\n view = undefined;\n root = undefined;\n },\n };\n },\n });\n}\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n collaboration: {\n undo: () => ReturnType;\n redo: () => ReturnType;\n };\n }\n}\n\nexport const LiveblocksCollaboration = Extension.create<\n LiveblocksCollaborationOptions,\n LiveblocksCollaborationStorage\n>({\n name: \"collaboration\",\n priority: 1000,\n\n addOptions() {\n return {\n room: undefined,\n field: \"default\",\n initialContent: undefined,\n };\n },\n\n addStorage() {\n return {\n isDisabled: false,\n };\n },\n\n addCommands() {\n return {\n undo:\n () =>\n ({ dispatch, tr }) => {\n tr.setMeta(\"preventDispatch\", true);\n\n if (\n this.options.room === undefined ||\n !this.options.room.history.canUndo()\n ) {\n return false;\n }\n\n if (dispatch) {\n this.options.room.history.undo();\n }\n\n return true;\n },\n redo:\n () =>\n ({ dispatch, tr }) => {\n tr.setMeta(\"preventDispatch\", true);\n\n if (\n this.options.room === undefined ||\n !this.options.room.history.canRedo()\n ) {\n return false;\n }\n\n if (dispatch) {\n this.options.room.history.redo();\n }\n\n return true;\n },\n };\n },\n\n addKeyboardShortcuts() {\n return {\n \"Mod-z\": () => this.editor.commands.undo(),\n \"Mod-y\": () => this.editor.commands.redo(),\n \"Shift-Mod-z\": () => this.editor.commands.redo(),\n };\n },\n\n addProseMirrorPlugins() {\n return [createLiveblocksCollaborationPlugin(this.options)];\n },\n});\n"],"names":[],"mappings":"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"}
@@ -1,196 +0,0 @@
1
- 'use strict';
2
-
3
- var client = require('@liveblocks/client');
4
- var model = require('@tiptap/pm/model');
5
- var mapping = require('./mapping.cjs');
6
- var schema = require('./schema.cjs');
7
-
8
- function getMarkType(schema, type) {
9
- return schema.marks[type];
10
- }
11
- function isJsonObject(value) {
12
- return typeof value === "object" && value !== null && !Array.isArray(value);
13
- }
14
- function isLiveblocksTiptapNode(value) {
15
- return value instanceof client.LiveObject && typeof value.get("id") === "string" && typeof value.get("type") === "string";
16
- }
17
- function getLiveblocksNodeAttrs(node) {
18
- const attrs = node.get("attrs");
19
- return isJsonObject(attrs) ? attrs : void 0;
20
- }
21
- function createSliceFromLiveblocksNode(schema$1, node) {
22
- const nodes = schema.liveblocksTiptapNodeToJsonNodes(node).map(
23
- (jsonNode) => schema$1.nodeFromJSON(jsonNode)
24
- );
25
- return new model.Slice(model.Fragment.fromArray(nodes), 0, 0);
26
- }
27
- function applyMarksFromAttributes(tr, schema$1, from, to, attributes) {
28
- const marks = schema.attributesToMarks({ ...attributes });
29
- for (const mark of marks ?? []) {
30
- const markType = getMarkType(schema$1, mark.type);
31
- if (markType !== void 0) {
32
- tr.addMark(from, to, markType.create(mark.attrs));
33
- }
34
- }
35
- if (marks === void 0) {
36
- tr.removeMark(from, to);
37
- }
38
- }
39
- function applyRemoteStorageUpdates(view, liveRoot, updates) {
40
- if (updates.length === 0) {
41
- return { type: "unsupported" };
42
- }
43
- let tr = view.state.tr;
44
- for (const update of updates) {
45
- if (update.type === "LiveText") {
46
- if (!(update.node instanceof client.LiveText)) {
47
- return { type: "unsupported" };
48
- }
49
- for (const change of update.updates) {
50
- const index = mapping.buildLiveblocksTreeIndex(tr.doc, liveRoot);
51
- const range = mapping.findTextRangeByLiveText(index, update.node);
52
- if (range === void 0) {
53
- return { type: "unsupported" };
54
- }
55
- const from = range.from + change.index - range.liveOffset;
56
- if (change.type === "insert") {
57
- tr = tr.insertText(change.text, from);
58
- if (change.attributes !== void 0) {
59
- applyMarksFromAttributes(
60
- tr,
61
- view.state.schema,
62
- from,
63
- from + change.text.length,
64
- change.attributes
65
- );
66
- }
67
- } else if (change.type === "delete") {
68
- tr = tr.delete(from, from + change.length);
69
- } else {
70
- applyMarksFromAttributes(
71
- tr,
72
- view.state.schema,
73
- from,
74
- from + change.length,
75
- change.attributes
76
- );
77
- }
78
- }
79
- continue;
80
- }
81
- if (update.type === "LiveList") {
82
- for (const change of update.updates) {
83
- const index = mapping.buildLiveblocksTreeIndex(tr.doc, liveRoot);
84
- const range = mapping.findListRangeByLiveList(index, update.node);
85
- if (range === void 0) {
86
- return { type: "unsupported" };
87
- }
88
- if (change.type === "insert") {
89
- if (!isLiveblocksTiptapNode(change.item)) {
90
- return { type: "unsupported" };
91
- }
92
- const pos = mapping.getChildPosition(range.pmNode, range.from, change.index);
93
- if (pos === void 0) {
94
- return { type: "unsupported" };
95
- }
96
- tr = tr.replace(
97
- pos,
98
- pos,
99
- createSliceFromLiveblocksNode(view.state.schema, change.item)
100
- );
101
- } else if (change.type === "delete") {
102
- const from = mapping.getChildPosition(range.pmNode, range.from, change.index);
103
- const to = mapping.getChildPosition(
104
- range.pmNode,
105
- range.from,
106
- change.index + 1
107
- );
108
- if (from === void 0 || to === void 0) {
109
- return { type: "unsupported" };
110
- }
111
- tr = tr.delete(from, to);
112
- } else if (change.type === "set") {
113
- if (!isLiveblocksTiptapNode(change.item)) {
114
- return { type: "unsupported" };
115
- }
116
- const from = mapping.getChildPosition(range.pmNode, range.from, change.index);
117
- const to = mapping.getChildPosition(
118
- range.pmNode,
119
- range.from,
120
- change.index + 1
121
- );
122
- if (from === void 0 || to === void 0) {
123
- return { type: "unsupported" };
124
- }
125
- tr = tr.replace(
126
- from,
127
- to,
128
- createSliceFromLiveblocksNode(view.state.schema, change.item)
129
- );
130
- } else {
131
- if (!isLiveblocksTiptapNode(change.item)) {
132
- return { type: "unsupported" };
133
- }
134
- const from = mapping.getChildPosition(
135
- range.pmNode,
136
- range.from,
137
- change.previousIndex
138
- );
139
- const to = mapping.getChildPosition(
140
- range.pmNode,
141
- range.from,
142
- change.previousIndex + 1
143
- );
144
- const rawInsertPos = mapping.getChildPosition(
145
- range.pmNode,
146
- range.from,
147
- change.index > change.previousIndex ? change.index + 1 : change.index
148
- );
149
- if (from === void 0 || to === void 0 || rawInsertPos === void 0) {
150
- return { type: "unsupported" };
151
- }
152
- const slice = createSliceFromLiveblocksNode(
153
- view.state.schema,
154
- change.item
155
- );
156
- tr = tr.delete(from, to);
157
- const insertPos = tr.mapping.map(rawInsertPos, -1);
158
- tr = tr.replace(insertPos, insertPos, slice);
159
- }
160
- }
161
- continue;
162
- }
163
- if (update.type === "LiveObject") {
164
- if (!isLiveblocksTiptapNode(update.node)) {
165
- return { type: "unsupported" };
166
- }
167
- const attrUpdate = update.updates.attrs;
168
- if (attrUpdate === void 0) {
169
- return { type: "unsupported" };
170
- }
171
- const index = mapping.buildLiveblocksTreeIndex(tr.doc, liveRoot);
172
- const range = mapping.findNodeRangeByLiveNode(index, update.node);
173
- if (range === void 0 || range.pmNode.type.name === "doc") {
174
- return { type: "unsupported" };
175
- }
176
- tr = tr.setNodeMarkup(
177
- range.from,
178
- void 0,
179
- attrUpdate.type === "delete" ? null : getLiveblocksNodeAttrs(update.node)
180
- );
181
- continue;
182
- }
183
- return { type: "unsupported" };
184
- }
185
- return { type: "applied", tr };
186
- }
187
- function applyRemoteLiveTextUpdates(view, liveRoot, updates) {
188
- if (!updates.every((update) => update.type === "LiveText")) {
189
- return { type: "unsupported" };
190
- }
191
- return applyRemoteStorageUpdates(view, liveRoot, updates);
192
- }
193
-
194
- exports.applyRemoteLiveTextUpdates = applyRemoteLiveTextUpdates;
195
- exports.applyRemoteStorageUpdates = applyRemoteStorageUpdates;
196
- //# sourceMappingURL=remote.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"remote.cjs","sources":["../../src/collaboration-liveblocks/remote.ts"],"sourcesContent":["import {\n type Json,\n type JsonObject,\n LiveObject,\n LiveText,\n type StorageUpdate,\n} from \"@liveblocks/client\";\nimport { Fragment, type MarkType, type Schema, Slice } from \"@tiptap/pm/model\";\nimport type { Transaction } from \"@tiptap/pm/state\";\nimport type { EditorView } from \"@tiptap/pm/view\";\n\nimport {\n buildLiveblocksTreeIndex,\n findListRangeByLiveList,\n findNodeRangeByLiveNode,\n findTextRangeByLiveText,\n getChildPosition,\n} from \"./mapping\";\nimport {\n attributesToMarks,\n type LiveblocksTiptapNode,\n liveblocksTiptapNodeToJsonNodes,\n} from \"./schema\";\n\ntype RemoteApplyResult =\n | {\n type: \"applied\";\n tr: Transaction;\n }\n | {\n type: \"unsupported\";\n };\n\nfunction getMarkType(schema: Schema, type: string): MarkType | undefined {\n return schema.marks[type];\n}\n\nfunction isJsonObject(value: unknown): value is JsonObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isLiveblocksTiptapNode(value: unknown): value is LiveblocksTiptapNode {\n return (\n value instanceof LiveObject &&\n typeof value.get(\"id\") === \"string\" &&\n typeof value.get(\"type\") === \"string\"\n );\n}\n\nfunction getLiveblocksNodeAttrs(\n node: LiveblocksTiptapNode\n): JsonObject | undefined {\n const attrs = node.get(\"attrs\");\n return isJsonObject(attrs) ? attrs : undefined;\n}\n\nfunction createSliceFromLiveblocksNode(\n schema: Schema,\n node: LiveblocksTiptapNode\n): Slice {\n const nodes = liveblocksTiptapNodeToJsonNodes(node).map((jsonNode) =>\n schema.nodeFromJSON(jsonNode)\n );\n\n return new Slice(Fragment.fromArray(nodes), 0, 0);\n}\n\nfunction applyMarksFromAttributes(\n tr: Transaction,\n schema: Schema,\n from: number,\n to: number,\n attributes: Record<string, Json | null>\n): void {\n const marks = attributesToMarks({ ...attributes });\n\n for (const mark of marks ?? []) {\n const markType = getMarkType(schema, mark.type);\n if (markType !== undefined) {\n tr.addMark(from, to, markType.create(mark.attrs));\n }\n }\n\n if (marks === undefined) {\n tr.removeMark(from, to);\n }\n}\n\nexport function applyRemoteStorageUpdates(\n view: EditorView,\n liveRoot: LiveblocksTiptapNode,\n updates: readonly StorageUpdate[]\n): RemoteApplyResult {\n if (updates.length === 0) {\n return { type: \"unsupported\" };\n }\n\n let tr = view.state.tr;\n\n for (const update of updates) {\n if (update.type === \"LiveText\") {\n if (!(update.node instanceof LiveText)) {\n return { type: \"unsupported\" };\n }\n\n for (const change of update.updates) {\n const index = buildLiveblocksTreeIndex(tr.doc, liveRoot);\n const range = findTextRangeByLiveText(index, update.node);\n if (range === undefined) {\n return { type: \"unsupported\" };\n }\n\n const from = range.from + change.index - range.liveOffset;\n\n if (change.type === \"insert\") {\n tr = tr.insertText(change.text, from);\n if (change.attributes !== undefined) {\n applyMarksFromAttributes(\n tr,\n view.state.schema,\n from,\n from + change.text.length,\n change.attributes\n );\n }\n } else if (change.type === \"delete\") {\n tr = tr.delete(from, from + change.length);\n } else {\n applyMarksFromAttributes(\n tr,\n view.state.schema,\n from,\n from + change.length,\n change.attributes\n );\n }\n }\n\n continue;\n }\n\n if (update.type === \"LiveList\") {\n for (const change of update.updates) {\n const index = buildLiveblocksTreeIndex(tr.doc, liveRoot);\n const range = findListRangeByLiveList(index, update.node);\n if (range === undefined) {\n return { type: \"unsupported\" };\n }\n\n if (change.type === \"insert\") {\n if (!isLiveblocksTiptapNode(change.item)) {\n return { type: \"unsupported\" };\n }\n\n const pos = getChildPosition(range.pmNode, range.from, change.index);\n if (pos === undefined) {\n return { type: \"unsupported\" };\n }\n\n tr = tr.replace(\n pos,\n pos,\n createSliceFromLiveblocksNode(view.state.schema, change.item)\n );\n } else if (change.type === \"delete\") {\n const from = getChildPosition(range.pmNode, range.from, change.index);\n const to = getChildPosition(\n range.pmNode,\n range.from,\n change.index + 1\n );\n if (from === undefined || to === undefined) {\n return { type: \"unsupported\" };\n }\n\n tr = tr.delete(from, to);\n } else if (change.type === \"set\") {\n if (!isLiveblocksTiptapNode(change.item)) {\n return { type: \"unsupported\" };\n }\n\n const from = getChildPosition(range.pmNode, range.from, change.index);\n const to = getChildPosition(\n range.pmNode,\n range.from,\n change.index + 1\n );\n if (from === undefined || to === undefined) {\n return { type: \"unsupported\" };\n }\n\n tr = tr.replace(\n from,\n to,\n createSliceFromLiveblocksNode(view.state.schema, change.item)\n );\n } else {\n if (!isLiveblocksTiptapNode(change.item)) {\n return { type: \"unsupported\" };\n }\n\n const from = getChildPosition(\n range.pmNode,\n range.from,\n change.previousIndex\n );\n const to = getChildPosition(\n range.pmNode,\n range.from,\n change.previousIndex + 1\n );\n const rawInsertPos = getChildPosition(\n range.pmNode,\n range.from,\n change.index > change.previousIndex\n ? change.index + 1\n : change.index\n );\n if (\n from === undefined ||\n to === undefined ||\n rawInsertPos === undefined\n ) {\n return { type: \"unsupported\" };\n }\n\n const slice = createSliceFromLiveblocksNode(\n view.state.schema,\n change.item\n );\n tr = tr.delete(from, to);\n const insertPos = tr.mapping.map(rawInsertPos, -1);\n tr = tr.replace(insertPos, insertPos, slice);\n }\n }\n\n continue;\n }\n\n if (update.type === \"LiveObject\") {\n if (!isLiveblocksTiptapNode(update.node)) {\n return { type: \"unsupported\" };\n }\n\n const attrUpdate = update.updates.attrs;\n if (attrUpdate === undefined) {\n return { type: \"unsupported\" };\n }\n\n const index = buildLiveblocksTreeIndex(tr.doc, liveRoot);\n const range = findNodeRangeByLiveNode(index, update.node);\n if (range === undefined || range.pmNode.type.name === \"doc\") {\n return { type: \"unsupported\" };\n }\n\n tr = tr.setNodeMarkup(\n range.from,\n undefined,\n attrUpdate.type === \"delete\" ? null : getLiveblocksNodeAttrs(update.node)\n );\n\n continue;\n }\n\n return { type: \"unsupported\" };\n }\n\n return { type: \"applied\", tr };\n}\n\nexport function applyRemoteLiveTextUpdates(\n view: EditorView,\n liveRoot: LiveblocksTiptapNode,\n updates: readonly StorageUpdate[]\n): RemoteApplyResult {\n if (!updates.every((update) => update.type === \"LiveText\")) {\n return { type: \"unsupported\" };\n }\n\n return applyRemoteStorageUpdates(view, liveRoot, updates);\n}\n\n"],"names":["LiveObject","schema","liveblocksTiptapNodeToJsonNodes","Slice","Fragment","attributesToMarks","LiveText","buildLiveblocksTreeIndex","findTextRangeByLiveText","findListRangeByLiveList","getChildPosition","findNodeRangeByLiveNode"],"mappings":"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"}