@liveblocks/react-tiptap 3.21.0-exp1 → 3.21.0-exp10
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/LiveblocksExtension.cjs +3 -2
- package/dist/LiveblocksExtension.cjs.map +1 -1
- package/dist/LiveblocksExtension.js +3 -2
- package/dist/LiveblocksExtension.js.map +1 -1
- package/dist/collaboration-liveblocks/cursors.cjs +10 -211
- package/dist/collaboration-liveblocks/cursors.cjs.map +1 -1
- package/dist/collaboration-liveblocks/cursors.js +6 -209
- package/dist/collaboration-liveblocks/cursors.js.map +1 -1
- package/dist/collaboration-liveblocks/plugin.cjs +13 -189
- package/dist/collaboration-liveblocks/plugin.cjs.map +1 -1
- package/dist/collaboration-liveblocks/plugin.js +12 -190
- package/dist/collaboration-liveblocks/plugin.js.map +1 -1
- package/dist/collaboration-liveblocks/schema.cjs +23 -139
- package/dist/collaboration-liveblocks/schema.cjs.map +1 -1
- package/dist/collaboration-liveblocks/schema.js +5 -128
- package/dist/collaboration-liveblocks/schema.js.map +1 -1
- package/dist/comments/CommentsExtension.cjs +3 -2
- package/dist/comments/CommentsExtension.cjs.map +1 -1
- package/dist/comments/CommentsExtension.js +2 -1
- package/dist/comments/CommentsExtension.js.map +1 -1
- package/dist/index.d.cts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/mentions/MentionExtension.cjs +6 -4
- package/dist/mentions/MentionExtension.cjs.map +1 -1
- package/dist/mentions/MentionExtension.js +5 -3
- package/dist/mentions/MentionExtension.js.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/version.cjs +1 -1
- package/dist/version.cjs.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +7 -6
- package/dist/collaboration-liveblocks/mapping.cjs +0 -218
- package/dist/collaboration-liveblocks/mapping.cjs.map +0 -1
- package/dist/collaboration-liveblocks/mapping.js +0 -207
- package/dist/collaboration-liveblocks/mapping.js.map +0 -1
- package/dist/collaboration-liveblocks/remote.cjs +0 -210
- package/dist/collaboration-liveblocks/remote.cjs.map +0 -1
- package/dist/collaboration-liveblocks/remote.js +0 -207
- package/dist/collaboration-liveblocks/remote.js.map +0 -1
- package/dist/collaboration-liveblocks/steps.cjs +0 -359
- package/dist/collaboration-liveblocks/steps.cjs.map +0 -1
- package/dist/collaboration-liveblocks/steps.js +0 -356
- package/dist/collaboration-liveblocks/steps.js.map +0 -1
|
@@ -1,210 +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 findNodeRangeForLiveText(index, text) {
|
|
40
|
-
return index.nodeRanges.find(
|
|
41
|
-
(range) => schema.getLiveblocksNodeText(range.node) === text
|
|
42
|
-
);
|
|
43
|
-
}
|
|
44
|
-
function applyRemoteStorageUpdates(view, liveRoot, updates) {
|
|
45
|
-
if (updates.length === 0) {
|
|
46
|
-
return { type: "unsupported" };
|
|
47
|
-
}
|
|
48
|
-
let tr = view.state.tr;
|
|
49
|
-
for (const update of updates) {
|
|
50
|
-
if (update.type === "LiveText") {
|
|
51
|
-
if (!(update.node instanceof client.LiveText)) {
|
|
52
|
-
return { type: "unsupported" };
|
|
53
|
-
}
|
|
54
|
-
for (const change of update.updates) {
|
|
55
|
-
const index = mapping.buildLiveblocksTreeIndex(tr.doc, liveRoot);
|
|
56
|
-
let range = mapping.findTextRangeByLiveText(index, update.node);
|
|
57
|
-
if (range === void 0 && change.type === "delete") {
|
|
58
|
-
const wrapperRange = findNodeRangeForLiveText(index, update.node);
|
|
59
|
-
if (wrapperRange !== void 0) {
|
|
60
|
-
const from2 = wrapperRange.from + change.index;
|
|
61
|
-
tr = tr.delete(from2, from2 + change.length);
|
|
62
|
-
continue;
|
|
63
|
-
}
|
|
64
|
-
return { type: "unsupported" };
|
|
65
|
-
}
|
|
66
|
-
if (range === void 0) {
|
|
67
|
-
return { type: "unsupported" };
|
|
68
|
-
}
|
|
69
|
-
const from = range.from + change.index - range.liveOffset;
|
|
70
|
-
if (change.type === "insert") {
|
|
71
|
-
tr = tr.insertText(change.text, from);
|
|
72
|
-
if (change.attributes !== void 0) {
|
|
73
|
-
applyMarksFromAttributes(
|
|
74
|
-
tr,
|
|
75
|
-
view.state.schema,
|
|
76
|
-
from,
|
|
77
|
-
from + change.text.length,
|
|
78
|
-
change.attributes
|
|
79
|
-
);
|
|
80
|
-
}
|
|
81
|
-
} else if (change.type === "delete") {
|
|
82
|
-
tr = tr.delete(from, from + change.length);
|
|
83
|
-
} else {
|
|
84
|
-
applyMarksFromAttributes(
|
|
85
|
-
tr,
|
|
86
|
-
view.state.schema,
|
|
87
|
-
from,
|
|
88
|
-
from + change.length,
|
|
89
|
-
change.attributes
|
|
90
|
-
);
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
continue;
|
|
94
|
-
}
|
|
95
|
-
if (update.type === "LiveList") {
|
|
96
|
-
for (const change of update.updates) {
|
|
97
|
-
const index = mapping.buildLiveblocksTreeIndex(tr.doc, liveRoot);
|
|
98
|
-
const range = mapping.findListRangeByLiveList(index, update.node);
|
|
99
|
-
if (range === void 0) {
|
|
100
|
-
return { type: "unsupported" };
|
|
101
|
-
}
|
|
102
|
-
if (change.type === "insert") {
|
|
103
|
-
if (!isLiveblocksTiptapNode(change.item)) {
|
|
104
|
-
return { type: "unsupported" };
|
|
105
|
-
}
|
|
106
|
-
const pos = mapping.getChildPosition(range.pmNode, range.from, change.index);
|
|
107
|
-
if (pos === void 0) {
|
|
108
|
-
return { type: "unsupported" };
|
|
109
|
-
}
|
|
110
|
-
tr = tr.replace(
|
|
111
|
-
pos,
|
|
112
|
-
pos,
|
|
113
|
-
createSliceFromLiveblocksNode(view.state.schema, change.item)
|
|
114
|
-
);
|
|
115
|
-
} else if (change.type === "delete") {
|
|
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.delete(from, to);
|
|
126
|
-
} else if (change.type === "set") {
|
|
127
|
-
if (!isLiveblocksTiptapNode(change.item)) {
|
|
128
|
-
return { type: "unsupported" };
|
|
129
|
-
}
|
|
130
|
-
const from = mapping.getChildPosition(range.pmNode, range.from, change.index);
|
|
131
|
-
const to = mapping.getChildPosition(
|
|
132
|
-
range.pmNode,
|
|
133
|
-
range.from,
|
|
134
|
-
change.index + 1
|
|
135
|
-
);
|
|
136
|
-
if (from === void 0 || to === void 0) {
|
|
137
|
-
return { type: "unsupported" };
|
|
138
|
-
}
|
|
139
|
-
tr = tr.replace(
|
|
140
|
-
from,
|
|
141
|
-
to,
|
|
142
|
-
createSliceFromLiveblocksNode(view.state.schema, change.item)
|
|
143
|
-
);
|
|
144
|
-
} else {
|
|
145
|
-
if (!isLiveblocksTiptapNode(change.item)) {
|
|
146
|
-
return { type: "unsupported" };
|
|
147
|
-
}
|
|
148
|
-
const from = mapping.getChildPosition(
|
|
149
|
-
range.pmNode,
|
|
150
|
-
range.from,
|
|
151
|
-
change.previousIndex
|
|
152
|
-
);
|
|
153
|
-
const to = mapping.getChildPosition(
|
|
154
|
-
range.pmNode,
|
|
155
|
-
range.from,
|
|
156
|
-
change.previousIndex + 1
|
|
157
|
-
);
|
|
158
|
-
const rawInsertPos = mapping.getChildPosition(
|
|
159
|
-
range.pmNode,
|
|
160
|
-
range.from,
|
|
161
|
-
change.index > change.previousIndex ? change.index + 1 : change.index
|
|
162
|
-
);
|
|
163
|
-
if (from === void 0 || to === void 0 || rawInsertPos === void 0) {
|
|
164
|
-
return { type: "unsupported" };
|
|
165
|
-
}
|
|
166
|
-
const slice = createSliceFromLiveblocksNode(
|
|
167
|
-
view.state.schema,
|
|
168
|
-
change.item
|
|
169
|
-
);
|
|
170
|
-
tr = tr.delete(from, to);
|
|
171
|
-
const insertPos = tr.mapping.map(rawInsertPos, -1);
|
|
172
|
-
tr = tr.replace(insertPos, insertPos, slice);
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
continue;
|
|
176
|
-
}
|
|
177
|
-
if (update.type === "LiveObject") {
|
|
178
|
-
if (!isLiveblocksTiptapNode(update.node)) {
|
|
179
|
-
return { type: "unsupported" };
|
|
180
|
-
}
|
|
181
|
-
const attrUpdate = update.updates.attrs;
|
|
182
|
-
if (attrUpdate === void 0) {
|
|
183
|
-
return { type: "unsupported" };
|
|
184
|
-
}
|
|
185
|
-
const index = mapping.buildLiveblocksTreeIndex(tr.doc, liveRoot);
|
|
186
|
-
const range = mapping.findNodeRangeByLiveNode(index, update.node);
|
|
187
|
-
if (range === void 0 || range.pmNode.type.name === "doc") {
|
|
188
|
-
return { type: "unsupported" };
|
|
189
|
-
}
|
|
190
|
-
tr = tr.setNodeMarkup(
|
|
191
|
-
range.from,
|
|
192
|
-
void 0,
|
|
193
|
-
attrUpdate.type === "delete" ? null : getLiveblocksNodeAttrs(update.node)
|
|
194
|
-
);
|
|
195
|
-
continue;
|
|
196
|
-
}
|
|
197
|
-
return { type: "unsupported" };
|
|
198
|
-
}
|
|
199
|
-
return { type: "applied", tr };
|
|
200
|
-
}
|
|
201
|
-
function applyRemoteLiveTextUpdates(view, liveRoot, updates) {
|
|
202
|
-
if (!updates.every((update) => update.type === "LiveText")) {
|
|
203
|
-
return { type: "unsupported" };
|
|
204
|
-
}
|
|
205
|
-
return applyRemoteStorageUpdates(view, liveRoot, updates);
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
exports.applyRemoteLiveTextUpdates = applyRemoteLiveTextUpdates;
|
|
209
|
-
exports.applyRemoteStorageUpdates = applyRemoteStorageUpdates;
|
|
210
|
-
//# 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 getLiveblocksNodeText,\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\nfunction findNodeRangeForLiveText(\n index: ReturnType<typeof buildLiveblocksTreeIndex>,\n text: LiveText\n) {\n return index.nodeRanges.find(\n (range) => getLiveblocksNodeText(range.node) === text\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 let range = findTextRangeByLiveText(index, update.node);\n\n if (range === undefined && change.type === \"delete\") {\n const wrapperRange = findNodeRangeForLiveText(index, update.node);\n if (wrapperRange !== undefined) {\n const from = wrapperRange.from + change.index;\n tr = tr.delete(from, from + change.length);\n continue;\n }\n\n return { type: \"unsupported\" };\n }\n\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","getLiveblocksNodeText","LiveText","buildLiveblocksTreeIndex","findTextRangeByLiveText","from","findListRangeByLiveList","getChildPosition","findNodeRangeByLiveNode"],"mappings":"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"}
|
|
@@ -1,207 +0,0 @@
|
|
|
1
|
-
import { LiveObject, LiveText } from '@liveblocks/client';
|
|
2
|
-
import { Slice, Fragment } from '@tiptap/pm/model';
|
|
3
|
-
import { buildLiveblocksTreeIndex, findTextRangeByLiveText, findListRangeByLiveList, getChildPosition, findNodeRangeByLiveNode } from './mapping.js';
|
|
4
|
-
import { liveblocksTiptapNodeToJsonNodes, attributesToMarks, getLiveblocksNodeText } from './schema.js';
|
|
5
|
-
|
|
6
|
-
function getMarkType(schema, type) {
|
|
7
|
-
return schema.marks[type];
|
|
8
|
-
}
|
|
9
|
-
function isJsonObject(value) {
|
|
10
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
11
|
-
}
|
|
12
|
-
function isLiveblocksTiptapNode(value) {
|
|
13
|
-
return value instanceof LiveObject && typeof value.get("id") === "string" && typeof value.get("type") === "string";
|
|
14
|
-
}
|
|
15
|
-
function getLiveblocksNodeAttrs(node) {
|
|
16
|
-
const attrs = node.get("attrs");
|
|
17
|
-
return isJsonObject(attrs) ? attrs : void 0;
|
|
18
|
-
}
|
|
19
|
-
function createSliceFromLiveblocksNode(schema, node) {
|
|
20
|
-
const nodes = liveblocksTiptapNodeToJsonNodes(node).map(
|
|
21
|
-
(jsonNode) => schema.nodeFromJSON(jsonNode)
|
|
22
|
-
);
|
|
23
|
-
return new Slice(Fragment.fromArray(nodes), 0, 0);
|
|
24
|
-
}
|
|
25
|
-
function applyMarksFromAttributes(tr, schema, from, to, attributes) {
|
|
26
|
-
const marks = attributesToMarks({ ...attributes });
|
|
27
|
-
for (const mark of marks ?? []) {
|
|
28
|
-
const markType = getMarkType(schema, mark.type);
|
|
29
|
-
if (markType !== void 0) {
|
|
30
|
-
tr.addMark(from, to, markType.create(mark.attrs));
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
if (marks === void 0) {
|
|
34
|
-
tr.removeMark(from, to);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
function findNodeRangeForLiveText(index, text) {
|
|
38
|
-
return index.nodeRanges.find(
|
|
39
|
-
(range) => getLiveblocksNodeText(range.node) === text
|
|
40
|
-
);
|
|
41
|
-
}
|
|
42
|
-
function applyRemoteStorageUpdates(view, liveRoot, updates) {
|
|
43
|
-
if (updates.length === 0) {
|
|
44
|
-
return { type: "unsupported" };
|
|
45
|
-
}
|
|
46
|
-
let tr = view.state.tr;
|
|
47
|
-
for (const update of updates) {
|
|
48
|
-
if (update.type === "LiveText") {
|
|
49
|
-
if (!(update.node instanceof LiveText)) {
|
|
50
|
-
return { type: "unsupported" };
|
|
51
|
-
}
|
|
52
|
-
for (const change of update.updates) {
|
|
53
|
-
const index = buildLiveblocksTreeIndex(tr.doc, liveRoot);
|
|
54
|
-
let range = findTextRangeByLiveText(index, update.node);
|
|
55
|
-
if (range === void 0 && change.type === "delete") {
|
|
56
|
-
const wrapperRange = findNodeRangeForLiveText(index, update.node);
|
|
57
|
-
if (wrapperRange !== void 0) {
|
|
58
|
-
const from2 = wrapperRange.from + change.index;
|
|
59
|
-
tr = tr.delete(from2, from2 + change.length);
|
|
60
|
-
continue;
|
|
61
|
-
}
|
|
62
|
-
return { type: "unsupported" };
|
|
63
|
-
}
|
|
64
|
-
if (range === void 0) {
|
|
65
|
-
return { type: "unsupported" };
|
|
66
|
-
}
|
|
67
|
-
const from = range.from + change.index - range.liveOffset;
|
|
68
|
-
if (change.type === "insert") {
|
|
69
|
-
tr = tr.insertText(change.text, from);
|
|
70
|
-
if (change.attributes !== void 0) {
|
|
71
|
-
applyMarksFromAttributes(
|
|
72
|
-
tr,
|
|
73
|
-
view.state.schema,
|
|
74
|
-
from,
|
|
75
|
-
from + change.text.length,
|
|
76
|
-
change.attributes
|
|
77
|
-
);
|
|
78
|
-
}
|
|
79
|
-
} else if (change.type === "delete") {
|
|
80
|
-
tr = tr.delete(from, from + change.length);
|
|
81
|
-
} else {
|
|
82
|
-
applyMarksFromAttributes(
|
|
83
|
-
tr,
|
|
84
|
-
view.state.schema,
|
|
85
|
-
from,
|
|
86
|
-
from + change.length,
|
|
87
|
-
change.attributes
|
|
88
|
-
);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
continue;
|
|
92
|
-
}
|
|
93
|
-
if (update.type === "LiveList") {
|
|
94
|
-
for (const change of update.updates) {
|
|
95
|
-
const index = buildLiveblocksTreeIndex(tr.doc, liveRoot);
|
|
96
|
-
const range = findListRangeByLiveList(index, update.node);
|
|
97
|
-
if (range === void 0) {
|
|
98
|
-
return { type: "unsupported" };
|
|
99
|
-
}
|
|
100
|
-
if (change.type === "insert") {
|
|
101
|
-
if (!isLiveblocksTiptapNode(change.item)) {
|
|
102
|
-
return { type: "unsupported" };
|
|
103
|
-
}
|
|
104
|
-
const pos = getChildPosition(range.pmNode, range.from, change.index);
|
|
105
|
-
if (pos === void 0) {
|
|
106
|
-
return { type: "unsupported" };
|
|
107
|
-
}
|
|
108
|
-
tr = tr.replace(
|
|
109
|
-
pos,
|
|
110
|
-
pos,
|
|
111
|
-
createSliceFromLiveblocksNode(view.state.schema, change.item)
|
|
112
|
-
);
|
|
113
|
-
} else if (change.type === "delete") {
|
|
114
|
-
const from = getChildPosition(range.pmNode, range.from, change.index);
|
|
115
|
-
const to = getChildPosition(
|
|
116
|
-
range.pmNode,
|
|
117
|
-
range.from,
|
|
118
|
-
change.index + 1
|
|
119
|
-
);
|
|
120
|
-
if (from === void 0 || to === void 0) {
|
|
121
|
-
return { type: "unsupported" };
|
|
122
|
-
}
|
|
123
|
-
tr = tr.delete(from, to);
|
|
124
|
-
} else if (change.type === "set") {
|
|
125
|
-
if (!isLiveblocksTiptapNode(change.item)) {
|
|
126
|
-
return { type: "unsupported" };
|
|
127
|
-
}
|
|
128
|
-
const from = getChildPosition(range.pmNode, range.from, change.index);
|
|
129
|
-
const to = getChildPosition(
|
|
130
|
-
range.pmNode,
|
|
131
|
-
range.from,
|
|
132
|
-
change.index + 1
|
|
133
|
-
);
|
|
134
|
-
if (from === void 0 || to === void 0) {
|
|
135
|
-
return { type: "unsupported" };
|
|
136
|
-
}
|
|
137
|
-
tr = tr.replace(
|
|
138
|
-
from,
|
|
139
|
-
to,
|
|
140
|
-
createSliceFromLiveblocksNode(view.state.schema, change.item)
|
|
141
|
-
);
|
|
142
|
-
} else {
|
|
143
|
-
if (!isLiveblocksTiptapNode(change.item)) {
|
|
144
|
-
return { type: "unsupported" };
|
|
145
|
-
}
|
|
146
|
-
const from = getChildPosition(
|
|
147
|
-
range.pmNode,
|
|
148
|
-
range.from,
|
|
149
|
-
change.previousIndex
|
|
150
|
-
);
|
|
151
|
-
const to = getChildPosition(
|
|
152
|
-
range.pmNode,
|
|
153
|
-
range.from,
|
|
154
|
-
change.previousIndex + 1
|
|
155
|
-
);
|
|
156
|
-
const rawInsertPos = getChildPosition(
|
|
157
|
-
range.pmNode,
|
|
158
|
-
range.from,
|
|
159
|
-
change.index > change.previousIndex ? change.index + 1 : change.index
|
|
160
|
-
);
|
|
161
|
-
if (from === void 0 || to === void 0 || rawInsertPos === void 0) {
|
|
162
|
-
return { type: "unsupported" };
|
|
163
|
-
}
|
|
164
|
-
const slice = createSliceFromLiveblocksNode(
|
|
165
|
-
view.state.schema,
|
|
166
|
-
change.item
|
|
167
|
-
);
|
|
168
|
-
tr = tr.delete(from, to);
|
|
169
|
-
const insertPos = tr.mapping.map(rawInsertPos, -1);
|
|
170
|
-
tr = tr.replace(insertPos, insertPos, slice);
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
continue;
|
|
174
|
-
}
|
|
175
|
-
if (update.type === "LiveObject") {
|
|
176
|
-
if (!isLiveblocksTiptapNode(update.node)) {
|
|
177
|
-
return { type: "unsupported" };
|
|
178
|
-
}
|
|
179
|
-
const attrUpdate = update.updates.attrs;
|
|
180
|
-
if (attrUpdate === void 0) {
|
|
181
|
-
return { type: "unsupported" };
|
|
182
|
-
}
|
|
183
|
-
const index = buildLiveblocksTreeIndex(tr.doc, liveRoot);
|
|
184
|
-
const range = findNodeRangeByLiveNode(index, update.node);
|
|
185
|
-
if (range === void 0 || range.pmNode.type.name === "doc") {
|
|
186
|
-
return { type: "unsupported" };
|
|
187
|
-
}
|
|
188
|
-
tr = tr.setNodeMarkup(
|
|
189
|
-
range.from,
|
|
190
|
-
void 0,
|
|
191
|
-
attrUpdate.type === "delete" ? null : getLiveblocksNodeAttrs(update.node)
|
|
192
|
-
);
|
|
193
|
-
continue;
|
|
194
|
-
}
|
|
195
|
-
return { type: "unsupported" };
|
|
196
|
-
}
|
|
197
|
-
return { type: "applied", tr };
|
|
198
|
-
}
|
|
199
|
-
function applyRemoteLiveTextUpdates(view, liveRoot, updates) {
|
|
200
|
-
if (!updates.every((update) => update.type === "LiveText")) {
|
|
201
|
-
return { type: "unsupported" };
|
|
202
|
-
}
|
|
203
|
-
return applyRemoteStorageUpdates(view, liveRoot, updates);
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
export { applyRemoteLiveTextUpdates, applyRemoteStorageUpdates };
|
|
207
|
-
//# sourceMappingURL=remote.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"remote.js","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 getLiveblocksNodeText,\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\nfunction findNodeRangeForLiveText(\n index: ReturnType<typeof buildLiveblocksTreeIndex>,\n text: LiveText\n) {\n return index.nodeRanges.find(\n (range) => getLiveblocksNodeText(range.node) === text\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 let range = findTextRangeByLiveText(index, update.node);\n\n if (range === undefined && change.type === \"delete\") {\n const wrapperRange = findNodeRangeForLiveText(index, update.node);\n if (wrapperRange !== undefined) {\n const from = wrapperRange.from + change.index;\n tr = tr.delete(from, from + change.length);\n continue;\n }\n\n return { type: \"unsupported\" };\n }\n\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":["from"],"mappings":"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"}
|