@liveblocks/prosemirror 3.21.0-exp8 → 3.23.0-exp1

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/plugin.cjs CHANGED
@@ -150,33 +150,33 @@ function createLiveblocksCollaborationPlugin(options) {
150
150
  }
151
151
  const currentRoot = root;
152
152
  const documentRoot = getDocumentRoot(currentRoot, options.field);
153
+ const incomingDocument = newState.doc.toJSON();
154
+ if (!isProseMirrorJsonNode(incomingDocument)) {
155
+ return null;
156
+ }
157
+ const serializedIncoming = schema.stringifyDocument(incomingDocument);
158
+ if (serializedIncoming === lastDocument) {
159
+ return null;
160
+ }
153
161
  const classified = documentRoot !== void 0 ? steps.classifyTransaction(
154
162
  transactions,
155
163
  oldState.doc,
156
164
  newState.doc,
157
165
  documentRoot
158
166
  ) : { type: "unsupported" };
159
- room.batch(() => {
160
- if (classified.type === "incremental") {
161
- isApplyingLocalUpdate = true;
162
- try {
167
+ isApplyingLocalUpdate = true;
168
+ try {
169
+ room.batch(() => {
170
+ if (classified.type === "incremental") {
163
171
  steps.applyIncrementalOperations(classified.operations);
164
- } finally {
165
- isApplyingLocalUpdate = false;
166
- }
167
- } else {
168
- const document = newState.doc.toJSON();
169
- if (!isProseMirrorJsonNode(document)) {
170
- return;
172
+ } else {
173
+ setDocumentRoot(currentRoot, options.field, incomingDocument);
171
174
  }
172
- const serializedDocument = schema.stringifyDocument(document);
173
- if (serializedDocument === lastDocument) {
174
- return;
175
- }
176
- lastDocument = serializedDocument;
177
- setDocumentRoot(currentRoot, options.field, document);
178
- }
179
- });
175
+ });
176
+ lastDocument = serializedIncoming;
177
+ } finally {
178
+ isApplyingLocalUpdate = false;
179
+ }
180
180
  return null;
181
181
  },
182
182
  view(editorView) {
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.cjs","sources":["../src/plugin.ts"],"sourcesContent":["import type { LsonObject, StorageUpdate } from \"@liveblocks/client\";\nimport { LiveMap, LiveObject } from \"@liveblocks/client\";\nimport { kStorageUpdateSource } from \"@liveblocks/core\";\nimport { Slice } from \"prosemirror-model\";\nimport { Plugin, PluginKey } from \"prosemirror-state\";\nimport type { EditorView } from \"prosemirror-view\";\n\nimport { applyRemoteStorageUpdates } from \"./remote\";\nimport {\n createLiveblocksProsemirrorNode,\n type LiveblocksProsemirrorNode,\n liveblocksProsemirrorNodeToJson,\n type ProseMirrorJsonNode,\n stringifyDocument,\n} from \"./schema\";\nimport { applyIncrementalOperations, classifyTransaction } from \"./steps\";\nimport type { LiveblocksProsemirrorRoom } from \"./types\";\n\nexport const LIVEBLOCKS_COLLABORATION_PLUGIN_KEY = new PluginKey<{\n isReady: boolean;\n}>(\"liveblocks-collaboration\");\nexport const LIVEBLOCKS_TIPTAP_DOCUMENTS_KEY = \"_tiptap_docs\";\n\nexport type LiveblocksCollaborationOptions = {\n room?: LiveblocksProsemirrorRoom;\n field: string;\n initialContent?: ProseMirrorJsonNode;\n fallbackDocument?: () => ProseMirrorJsonNode;\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: ProseMirrorJsonNode | undefined,\n fallbackDocument: (() => ProseMirrorJsonNode) | 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 const fallback = fallbackDocument?.();\n if (isProseMirrorJsonNode(fallback)) {\n return fallback;\n }\n\n throw new Error(\n \"[Liveblocks] The Liveblocks collaboration plugin could not resolve an initial document.\"\n );\n}\n\nfunction replaceEditorDocument(\n view: EditorView,\n document: ProseMirrorJsonNode,\n fallbackDocument: (() => ProseMirrorJsonNode) | undefined\n): void {\n let nextDocument;\n try {\n nextDocument = view.state.schema.nodeFromJSON(document);\n } catch {\n const fallback = fallbackDocument?.();\n if (!isProseMirrorJsonNode(fallback)) {\n return;\n }\n\n nextDocument = view.state.schema.nodeFromJSON(fallback);\n }\n\n if (nextDocument.childCount === 0) {\n const fallback = fallbackDocument?.();\n if (!isProseMirrorJsonNode(fallback)) {\n return;\n }\n\n nextDocument = view.state.schema.nodeFromJSON(fallback);\n }\n\n const tr = view.state.tr.replace(\n 0,\n view.state.doc.content.size,\n new Slice(nextDocument.content, 0, 0)\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): LiveblocksProsemirrorNode | undefined {\n const documents = root.get(LIVEBLOCKS_TIPTAP_DOCUMENTS_KEY);\n if (!(documents instanceof LiveMap)) {\n return undefined;\n }\n\n const documentRoot = documents.get(field);\n if (!(documentRoot instanceof LiveObject)) {\n return undefined;\n }\n\n return documentRoot as LiveblocksProsemirrorNode;\n}\n\nfunction setDocumentRoot(\n root: LiveObject<LsonObject>,\n field: string,\n document: ProseMirrorJsonNode\n): void {\n let documents = root.get(LIVEBLOCKS_TIPTAP_DOCUMENTS_KEY);\n if (!(documents instanceof LiveMap)) {\n documents = new LiveMap<string, LiveblocksProsemirrorNode>();\n root.set(LIVEBLOCKS_TIPTAP_DOCUMENTS_KEY, documents);\n }\n\n documents.set(field, createLiveblocksProsemirrorNode(document));\n}\n\nexport function 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 = liveblocksProsemirrorNodeToJson(\n documentRoot,\n options.fallbackDocument\n );\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, options.fallbackDocument);\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 options.fallbackDocument,\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(\n storageRoot,\n (updates) => {\n if (\n updates.every((update) => {\n const source = update[kStorageUpdateSource];\n return source?.origin === \"local\" && source.via === \"mutation\";\n })\n ) {\n return;\n }\n\n applyStorageToEditor(updates);\n },\n {\n isDeep: true,\n }\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"],"names":["PluginKey","Slice","LiveMap","LiveObject","createLiveblocksProsemirrorNode","liveblocksProsemirrorNodeToJson","stringifyDocument","applyRemoteStorageUpdates","Plugin","classifyTransaction","applyIncrementalOperations","kStorageUpdateSource"],"mappings":"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"}
1
+ {"version":3,"file":"plugin.cjs","sources":["../src/plugin.ts"],"sourcesContent":["import type { LsonObject, StorageUpdate } from \"@liveblocks/client\";\nimport { LiveMap, LiveObject } from \"@liveblocks/client\";\nimport { kStorageUpdateSource } from \"@liveblocks/core\";\nimport { Slice } from \"prosemirror-model\";\nimport { Plugin, PluginKey } from \"prosemirror-state\";\nimport type { EditorView } from \"prosemirror-view\";\n\nimport { applyRemoteStorageUpdates } from \"./remote\";\nimport {\n createLiveblocksProsemirrorNode,\n type LiveblocksProsemirrorNode,\n liveblocksProsemirrorNodeToJson,\n type ProseMirrorJsonNode,\n stringifyDocument,\n} from \"./schema\";\nimport { applyIncrementalOperations, classifyTransaction } from \"./steps\";\nimport type { LiveblocksProsemirrorRoom } from \"./types\";\n\nexport const LIVEBLOCKS_COLLABORATION_PLUGIN_KEY = new PluginKey<{\n isReady: boolean;\n}>(\"liveblocks-collaboration\");\nexport const LIVEBLOCKS_TIPTAP_DOCUMENTS_KEY = \"_tiptap_docs\";\n\nexport type LiveblocksCollaborationOptions = {\n room?: LiveblocksProsemirrorRoom;\n field: string;\n initialContent?: ProseMirrorJsonNode;\n fallbackDocument?: () => ProseMirrorJsonNode;\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: ProseMirrorJsonNode | undefined,\n fallbackDocument: (() => ProseMirrorJsonNode) | 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 const fallback = fallbackDocument?.();\n if (isProseMirrorJsonNode(fallback)) {\n return fallback;\n }\n\n throw new Error(\n \"[Liveblocks] The Liveblocks collaboration plugin could not resolve an initial document.\"\n );\n}\n\nfunction replaceEditorDocument(\n view: EditorView,\n document: ProseMirrorJsonNode,\n fallbackDocument: (() => ProseMirrorJsonNode) | undefined\n): void {\n let nextDocument;\n try {\n nextDocument = view.state.schema.nodeFromJSON(document);\n } catch {\n const fallback = fallbackDocument?.();\n if (!isProseMirrorJsonNode(fallback)) {\n return;\n }\n\n nextDocument = view.state.schema.nodeFromJSON(fallback);\n }\n\n if (nextDocument.childCount === 0) {\n const fallback = fallbackDocument?.();\n if (!isProseMirrorJsonNode(fallback)) {\n return;\n }\n\n nextDocument = view.state.schema.nodeFromJSON(fallback);\n }\n\n const tr = view.state.tr.replace(\n 0,\n view.state.doc.content.size,\n new Slice(nextDocument.content, 0, 0)\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): LiveblocksProsemirrorNode | undefined {\n const documents = root.get(LIVEBLOCKS_TIPTAP_DOCUMENTS_KEY);\n if (!(documents instanceof LiveMap)) {\n return undefined;\n }\n\n const documentRoot = documents.get(field);\n if (!(documentRoot instanceof LiveObject)) {\n return undefined;\n }\n\n return documentRoot as LiveblocksProsemirrorNode;\n}\n\nfunction setDocumentRoot(\n root: LiveObject<LsonObject>,\n field: string,\n document: ProseMirrorJsonNode\n): void {\n let documents = root.get(LIVEBLOCKS_TIPTAP_DOCUMENTS_KEY);\n if (!(documents instanceof LiveMap)) {\n documents = new LiveMap<string, LiveblocksProsemirrorNode>();\n root.set(LIVEBLOCKS_TIPTAP_DOCUMENTS_KEY, documents);\n }\n\n documents.set(field, createLiveblocksProsemirrorNode(document));\n}\n\nexport function 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 = liveblocksProsemirrorNodeToJson(\n documentRoot,\n options.fallbackDocument\n );\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, options.fallbackDocument);\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\n // Idempotency guard: if the incoming document already matches what we\n // last synced to storage, there is nothing to do. This naturally handles\n // editors (e.g. BlockNote) that invoke appendTransaction more than once\n // per user edit with the same transaction set\n const incomingDocument: unknown = newState.doc.toJSON();\n if (!isProseMirrorJsonNode(incomingDocument)) {\n return null;\n }\n const serializedIncoming = stringifyDocument(incomingDocument);\n if (serializedIncoming === lastDocument) {\n return null;\n }\n\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 isApplyingLocalUpdate = true;\n try {\n room.batch(() => {\n if (classified.type === \"incremental\") {\n applyIncrementalOperations(classified.operations);\n } else {\n setDocumentRoot(currentRoot, options.field, incomingDocument);\n }\n });\n lastDocument = serializedIncoming;\n } finally {\n isApplyingLocalUpdate = false;\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 options.fallbackDocument,\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(\n storageRoot,\n (updates) => {\n if (\n updates.every((update) => {\n const source = update[kStorageUpdateSource];\n return source?.origin === \"local\" && source.via === \"mutation\";\n })\n ) {\n return;\n }\n\n applyStorageToEditor(updates);\n },\n {\n isDeep: true,\n }\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"],"names":["PluginKey","Slice","LiveMap","LiveObject","createLiveblocksProsemirrorNode","liveblocksProsemirrorNodeToJson","stringifyDocument","applyRemoteStorageUpdates","Plugin","classifyTransaction","applyIncrementalOperations","kStorageUpdateSource"],"mappings":"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"}
package/dist/plugin.js CHANGED
@@ -148,33 +148,33 @@ function createLiveblocksCollaborationPlugin(options) {
148
148
  }
149
149
  const currentRoot = root;
150
150
  const documentRoot = getDocumentRoot(currentRoot, options.field);
151
+ const incomingDocument = newState.doc.toJSON();
152
+ if (!isProseMirrorJsonNode(incomingDocument)) {
153
+ return null;
154
+ }
155
+ const serializedIncoming = stringifyDocument(incomingDocument);
156
+ if (serializedIncoming === lastDocument) {
157
+ return null;
158
+ }
151
159
  const classified = documentRoot !== void 0 ? classifyTransaction(
152
160
  transactions,
153
161
  oldState.doc,
154
162
  newState.doc,
155
163
  documentRoot
156
164
  ) : { type: "unsupported" };
157
- room.batch(() => {
158
- if (classified.type === "incremental") {
159
- isApplyingLocalUpdate = true;
160
- try {
165
+ isApplyingLocalUpdate = true;
166
+ try {
167
+ room.batch(() => {
168
+ if (classified.type === "incremental") {
161
169
  applyIncrementalOperations(classified.operations);
162
- } finally {
163
- isApplyingLocalUpdate = false;
164
- }
165
- } else {
166
- const document = newState.doc.toJSON();
167
- if (!isProseMirrorJsonNode(document)) {
168
- return;
170
+ } else {
171
+ setDocumentRoot(currentRoot, options.field, incomingDocument);
169
172
  }
170
- const serializedDocument = stringifyDocument(document);
171
- if (serializedDocument === lastDocument) {
172
- return;
173
- }
174
- lastDocument = serializedDocument;
175
- setDocumentRoot(currentRoot, options.field, document);
176
- }
177
- });
173
+ });
174
+ lastDocument = serializedIncoming;
175
+ } finally {
176
+ isApplyingLocalUpdate = false;
177
+ }
178
178
  return null;
179
179
  },
180
180
  view(editorView) {
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sources":["../src/plugin.ts"],"sourcesContent":["import type { LsonObject, StorageUpdate } from \"@liveblocks/client\";\nimport { LiveMap, LiveObject } from \"@liveblocks/client\";\nimport { kStorageUpdateSource } from \"@liveblocks/core\";\nimport { Slice } from \"prosemirror-model\";\nimport { Plugin, PluginKey } from \"prosemirror-state\";\nimport type { EditorView } from \"prosemirror-view\";\n\nimport { applyRemoteStorageUpdates } from \"./remote\";\nimport {\n createLiveblocksProsemirrorNode,\n type LiveblocksProsemirrorNode,\n liveblocksProsemirrorNodeToJson,\n type ProseMirrorJsonNode,\n stringifyDocument,\n} from \"./schema\";\nimport { applyIncrementalOperations, classifyTransaction } from \"./steps\";\nimport type { LiveblocksProsemirrorRoom } from \"./types\";\n\nexport const LIVEBLOCKS_COLLABORATION_PLUGIN_KEY = new PluginKey<{\n isReady: boolean;\n}>(\"liveblocks-collaboration\");\nexport const LIVEBLOCKS_TIPTAP_DOCUMENTS_KEY = \"_tiptap_docs\";\n\nexport type LiveblocksCollaborationOptions = {\n room?: LiveblocksProsemirrorRoom;\n field: string;\n initialContent?: ProseMirrorJsonNode;\n fallbackDocument?: () => ProseMirrorJsonNode;\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: ProseMirrorJsonNode | undefined,\n fallbackDocument: (() => ProseMirrorJsonNode) | 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 const fallback = fallbackDocument?.();\n if (isProseMirrorJsonNode(fallback)) {\n return fallback;\n }\n\n throw new Error(\n \"[Liveblocks] The Liveblocks collaboration plugin could not resolve an initial document.\"\n );\n}\n\nfunction replaceEditorDocument(\n view: EditorView,\n document: ProseMirrorJsonNode,\n fallbackDocument: (() => ProseMirrorJsonNode) | undefined\n): void {\n let nextDocument;\n try {\n nextDocument = view.state.schema.nodeFromJSON(document);\n } catch {\n const fallback = fallbackDocument?.();\n if (!isProseMirrorJsonNode(fallback)) {\n return;\n }\n\n nextDocument = view.state.schema.nodeFromJSON(fallback);\n }\n\n if (nextDocument.childCount === 0) {\n const fallback = fallbackDocument?.();\n if (!isProseMirrorJsonNode(fallback)) {\n return;\n }\n\n nextDocument = view.state.schema.nodeFromJSON(fallback);\n }\n\n const tr = view.state.tr.replace(\n 0,\n view.state.doc.content.size,\n new Slice(nextDocument.content, 0, 0)\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): LiveblocksProsemirrorNode | undefined {\n const documents = root.get(LIVEBLOCKS_TIPTAP_DOCUMENTS_KEY);\n if (!(documents instanceof LiveMap)) {\n return undefined;\n }\n\n const documentRoot = documents.get(field);\n if (!(documentRoot instanceof LiveObject)) {\n return undefined;\n }\n\n return documentRoot as LiveblocksProsemirrorNode;\n}\n\nfunction setDocumentRoot(\n root: LiveObject<LsonObject>,\n field: string,\n document: ProseMirrorJsonNode\n): void {\n let documents = root.get(LIVEBLOCKS_TIPTAP_DOCUMENTS_KEY);\n if (!(documents instanceof LiveMap)) {\n documents = new LiveMap<string, LiveblocksProsemirrorNode>();\n root.set(LIVEBLOCKS_TIPTAP_DOCUMENTS_KEY, documents);\n }\n\n documents.set(field, createLiveblocksProsemirrorNode(document));\n}\n\nexport function 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 = liveblocksProsemirrorNodeToJson(\n documentRoot,\n options.fallbackDocument\n );\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, options.fallbackDocument);\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 options.fallbackDocument,\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(\n storageRoot,\n (updates) => {\n if (\n updates.every((update) => {\n const source = update[kStorageUpdateSource];\n return source?.origin === \"local\" && source.via === \"mutation\";\n })\n ) {\n return;\n }\n\n applyStorageToEditor(updates);\n },\n {\n isDeep: true,\n }\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"],"names":[],"mappings":";;;;;;;;AAkBa,MAAA,mCAAA,GAAsC,IAAI,SAAA,CAEpD,0BAA0B,EAAA;AACtB,MAAM,+BAAkC,GAAA,eAAA;AAS/C,SAAS,sBAAsB,KAA8C,EAAA;AAC3E,EAAA,OACE,OAAO,KAAU,KAAA,QAAA,IACjB,UAAU,IACV,IAAA,OAAQ,MAA6B,IAAS,KAAA,QAAA,CAAA;AAElD,CAAA;AAEA,SAAS,kBAAA,CACP,cACA,EAAA,gBAAA,EACA,IACqB,EAAA;AACrB,EAAI,IAAA,qBAAA,CAAsB,cAAc,CAAG,EAAA;AACzC,IAAO,OAAA,cAAA,CAAA;AAAA,GACT;AAEA,EAAA,MAAM,eAA2B,GAAA,IAAA,CAAK,KAAM,CAAA,GAAA,CAAI,MAAO,EAAA,CAAA;AACvD,EAAI,IAAA,qBAAA,CAAsB,eAAe,CAAG,EAAA;AAC1C,IAAO,OAAA,eAAA,CAAA;AAAA,GACT;AAEA,EAAA,MAAM,WAAW,gBAAmB,IAAA,CAAA;AACpC,EAAI,IAAA,qBAAA,CAAsB,QAAQ,CAAG,EAAA;AACnC,IAAO,OAAA,QAAA,CAAA;AAAA,GACT;AAEA,EAAA,MAAM,IAAI,KAAA;AAAA,IACR,yFAAA;AAAA,GACF,CAAA;AACF,CAAA;AAEA,SAAS,qBAAA,CACP,IACA,EAAA,QAAA,EACA,gBACM,EAAA;AACN,EAAI,IAAA,YAAA,CAAA;AACJ,EAAI,IAAA;AACF,IAAA,YAAA,GAAe,IAAK,CAAA,KAAA,CAAM,MAAO,CAAA,YAAA,CAAa,QAAQ,CAAA,CAAA;AAAA,GAChD,CAAA,MAAA;AACN,IAAA,MAAM,WAAW,gBAAmB,IAAA,CAAA;AACpC,IAAI,IAAA,CAAC,qBAAsB,CAAA,QAAQ,CAAG,EAAA;AACpC,MAAA,OAAA;AAAA,KACF;AAEA,IAAA,YAAA,GAAe,IAAK,CAAA,KAAA,CAAM,MAAO,CAAA,YAAA,CAAa,QAAQ,CAAA,CAAA;AAAA,GACxD;AAEA,EAAI,IAAA,YAAA,CAAa,eAAe,CAAG,EAAA;AACjC,IAAA,MAAM,WAAW,gBAAmB,IAAA,CAAA;AACpC,IAAI,IAAA,CAAC,qBAAsB,CAAA,QAAQ,CAAG,EAAA;AACpC,MAAA,OAAA;AAAA,KACF;AAEA,IAAA,YAAA,GAAe,IAAK,CAAA,KAAA,CAAM,MAAO,CAAA,YAAA,CAAa,QAAQ,CAAA,CAAA;AAAA,GACxD;AAEA,EAAM,MAAA,EAAA,GAAK,IAAK,CAAA,KAAA,CAAM,EAAG,CAAA,OAAA;AAAA,IACvB,CAAA;AAAA,IACA,IAAA,CAAK,KAAM,CAAA,GAAA,CAAI,OAAQ,CAAA,IAAA;AAAA,IACvB,IAAI,KAAA,CAAM,YAAa,CAAA,OAAA,EAAS,GAAG,CAAC,CAAA;AAAA,GACtC,CAAA;AAEA,EAAA,EAAA,CAAG,QAAQ,mCAAqC,EAAA,EAAE,QAAU,EAAA,IAAA,EAAM,CAAE,CAAA,OAAA;AAAA,IAClE,cAAA;AAAA,IACA,KAAA;AAAA,GACF,CAAA;AAEA,EAAA,IAAA,CAAK,SAAS,EAAE,CAAA,CAAA;AAClB,CAAA;AAEA,SAAS,eAAA,CACP,MACA,KACuC,EAAA;AACvC,EAAM,MAAA,SAAA,GAAY,IAAK,CAAA,GAAA,CAAI,+BAA+B,CAAA,CAAA;AAC1D,EAAI,IAAA,EAAE,qBAAqB,OAAU,CAAA,EAAA;AACnC,IAAO,OAAA,KAAA,CAAA,CAAA;AAAA,GACT;AAEA,EAAM,MAAA,YAAA,GAAe,SAAU,CAAA,GAAA,CAAI,KAAK,CAAA,CAAA;AACxC,EAAI,IAAA,EAAE,wBAAwB,UAAa,CAAA,EAAA;AACzC,IAAO,OAAA,KAAA,CAAA,CAAA;AAAA,GACT;AAEA,EAAO,OAAA,YAAA,CAAA;AACT,CAAA;AAEA,SAAS,eAAA,CACP,IACA,EAAA,KAAA,EACA,QACM,EAAA;AACN,EAAI,IAAA,SAAA,GAAY,IAAK,CAAA,GAAA,CAAI,+BAA+B,CAAA,CAAA;AACxD,EAAI,IAAA,EAAE,qBAAqB,OAAU,CAAA,EAAA;AACnC,IAAA,SAAA,GAAY,IAAI,OAA2C,EAAA,CAAA;AAC3D,IAAK,IAAA,CAAA,GAAA,CAAI,iCAAiC,SAAS,CAAA,CAAA;AAAA,GACrD;AAEA,EAAA,SAAA,CAAU,GAAI,CAAA,KAAA,EAAO,+BAAgC,CAAA,QAAQ,CAAC,CAAA,CAAA;AAChE,CAAA;AAEO,SAAS,oCACd,OACQ,EAAA;AACR,EAAA,MAAM,OAAO,OAAQ,CAAA,IAAA,CAAA;AACrB,EAAA,IAAI,SAAS,KAAW,CAAA,EAAA;AACtB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,mEAAA;AAAA,KACF,CAAA;AAAA,GACF;AAEA,EAAI,IAAA,IAAA,CAAA;AACJ,EAAI,IAAA,IAAA,CAAA;AACJ,EAAI,IAAA,WAAA,CAAA;AACJ,EAAA,IAAI,SAAY,GAAA,KAAA,CAAA;AAChB,EAAA,IAAI,sBAAyB,GAAA,KAAA,CAAA;AAC7B,EAAA,IAAI,qBAAwB,GAAA,KAAA,CAAA;AAC5B,EAAA,IAAI,YAAe,GAAA,EAAA,CAAA;AAEnB,EAAM,MAAA,oBAAA,GAAuB,CAAC,OAA8B,KAAA;AAC1D,IAAI,IAAA,IAAA,KAAS,KAAa,CAAA,IAAA,IAAA,KAAS,KAAW,CAAA,EAAA;AAC5C,MAAA,OAAA;AAAA,KACF;AAEA,IAAA,MAAM,YAAe,GAAA,eAAA,CAAgB,IAAM,EAAA,OAAA,CAAQ,KAAK,CAAA,CAAA;AACxD,IAAA,IAAI,iBAAiB,KAAW,CAAA,EAAA;AAC9B,MAAA,OAAA;AAAA,KACF;AAEA,IAAA,IAAI,qBAAuB,EAAA;AACzB,MAAA,OAAA;AAAA,KACF;AAEA,IAAA,MAAM,QAAW,GAAA,+BAAA;AAAA,MACf,YAAA;AAAA,MACA,OAAQ,CAAA,gBAAA;AAAA,KACV,CAAA;AACA,IAAM,MAAA,kBAAA,GAAqB,kBAAkB,QAAQ,CAAA,CAAA;AAErD,IAAA,IAAI,uBAAuB,YAAc,EAAA;AACvC,MAAA,OAAA;AAAA,KACF;AAEA,IAAA,IAAI,YAAY,KAAW,CAAA,EAAA;AACzB,MAAA,MAAM,MAAS,GAAA,yBAAA,CAA0B,IAAM,EAAA,YAAA,EAAc,OAAO,CAAA,CAAA;AACpE,MAAI,IAAA,MAAA,CAAO,SAAS,SAAW,EAAA;AAC7B,QAAe,YAAA,GAAA,kBAAA,CAAA;AACf,QAAyB,sBAAA,GAAA,IAAA,CAAA;AACzB,QAAI,IAAA;AACF,UAAK,IAAA,CAAA,QAAA;AAAA,YACH,MAAA,CAAO,EACJ,CAAA,OAAA,CAAQ,mCAAqC,EAAA,EAAE,QAAU,EAAA,IAAA,EAAM,CAAA,CAC/D,OAAQ,CAAA,cAAA,EAAgB,KAAK,CAAA;AAAA,WAClC,CAAA;AAAA,SACA,SAAA;AACA,UAAyB,sBAAA,GAAA,KAAA,CAAA;AAAA,SAC3B;AACA,QAAA,OAAA;AAAA,OACF;AAAA,KACF;AAEA,IAAe,YAAA,GAAA,kBAAA,CAAA;AACf,IAAyB,sBAAA,GAAA,IAAA,CAAA;AACzB,IAAI,IAAA;AACF,MAAsB,qBAAA,CAAA,IAAA,EAAM,QAAU,EAAA,OAAA,CAAQ,gBAAgB,CAAA,CAAA;AAAA,KAC9D,SAAA;AACA,MAAyB,sBAAA,GAAA,KAAA,CAAA;AAAA,KAC3B;AAAA,GACF,CAAA;AAEA,EAAA,OAAO,IAAI,MAAO,CAAA;AAAA,IAChB,GAAK,EAAA,mCAAA;AAAA,IACL,KAAO,EAAA;AAAA,MACL,IAAM,EAAA,OAAO,EAAE,OAAA,EAAS,KAAM,EAAA,CAAA;AAAA,MAC9B,KAAA,CAAM,IAAI,KAAO,EAAA;AACf,QAAM,MAAA,IAAA,GAAO,EAAG,CAAA,OAAA,CAAQ,mCAAmC,CAAA,CAAA;AAI3D,QAAO,OAAA,IAAA,EAAM,YAAY,KACrB,CAAA,GAAA,EAAE,GAAG,KAAO,EAAA,OAAA,EAAS,IAAK,CAAA,OAAA,EAC1B,GAAA,KAAA,CAAA;AAAA,OACN;AAAA,KACF;AAAA,IACA,iBAAA,CAAkB,YAAc,EAAA,QAAA,EAAU,QAAU,EAAA;AAClD,MACE,IAAA,IAAA,KAAS,KACT,CAAA,IAAA,sBAAA,IACA,CAAC,YAAA,CAAa,IAAK,CAAA,CAAC,WAAgB,KAAA,WAAA,CAAY,UAAU,CAAA,IAC1D,YAAa,CAAA,IAAA;AAAA,QAAK,CAAC,WACjB,KAAA,OAAA,CAAQ,WAAY,CAAA,OAAA,CAAQ,mCAAmC,CAAC,CAAA;AAAA,OAElE,EAAA;AACA,QAAO,OAAA,IAAA,CAAA;AAAA,OACT;AAEA,MAAA,MAAM,WAAc,GAAA,IAAA,CAAA;AAEpB,MAAA,MAAM,YAAe,GAAA,eAAA,CAAgB,WAAa,EAAA,OAAA,CAAQ,KAAK,CAAA,CAAA;AAC/D,MAAM,MAAA,UAAA,GACJ,iBAAiB,KACb,CAAA,GAAA,mBAAA;AAAA,QACE,YAAA;AAAA,QACA,QAAS,CAAA,GAAA;AAAA,QACT,QAAS,CAAA,GAAA;AAAA,QACT,YAAA;AAAA,OACF,GACA,EAAE,IAAA,EAAM,aAAuB,EAAA,CAAA;AAErC,MAAA,IAAA,CAAK,MAAM,MAAM;AACf,QAAI,IAAA,UAAA,CAAW,SAAS,aAAe,EAAA;AACrC,UAAwB,qBAAA,GAAA,IAAA,CAAA;AACxB,UAAI,IAAA;AACF,YAAA,0BAAA,CAA2B,WAAW,UAAU,CAAA,CAAA;AAAA,WAChD,SAAA;AACA,YAAwB,qBAAA,GAAA,KAAA,CAAA;AAAA,WAC1B;AAAA,SACK,MAAA;AACL,UAAM,MAAA,QAAA,GAAoB,QAAS,CAAA,GAAA,CAAI,MAAO,EAAA,CAAA;AAC9C,UAAI,IAAA,CAAC,qBAAsB,CAAA,QAAQ,CAAG,EAAA;AACpC,YAAA,OAAA;AAAA,WACF;AAEA,UAAM,MAAA,kBAAA,GAAqB,kBAAkB,QAAQ,CAAA,CAAA;AACrD,UAAA,IAAI,uBAAuB,YAAc,EAAA;AACvC,YAAA,OAAA;AAAA,WACF;AAEA,UAAe,YAAA,GAAA,kBAAA,CAAA;AACf,UAAgB,eAAA,CAAA,WAAA,EAAa,OAAQ,CAAA,KAAA,EAAO,QAAQ,CAAA,CAAA;AAAA,SACtD;AAAA,OACD,CAAA,CAAA;AAED,MAAO,OAAA,IAAA,CAAA;AAAA,KACT;AAAA,IACA,KAAK,UAAY,EAAA;AACf,MAAO,IAAA,GAAA,UAAA,CAAA;AAEP,MAAA,IAAA,CAAK,YAAa,CAAA,IAAA,CAAK,CAAC,EAAE,IAAA,EAAM,aAAkB,KAAA;AAChD,QAAA,IAAI,SAAW,EAAA;AACb,UAAA,OAAA;AAAA,SACF;AAEA,QAAO,IAAA,GAAA,WAAA,CAAA;AAEP,QAAA,IAAI,eAAgB,CAAA,WAAA,EAAa,OAAQ,CAAA,KAAK,MAAM,KAAW,CAAA,EAAA;AAC7D,UAAA,MAAM,eAAkB,GAAA,kBAAA;AAAA,YACtB,OAAQ,CAAA,cAAA;AAAA,YACR,OAAQ,CAAA,gBAAA;AAAA,YACR,UAAA;AAAA,WACF,CAAA;AACA,UAAK,IAAA,CAAA,OAAA,CAAQ,QAAQ,MAAM;AACzB,YAAgB,eAAA,CAAA,WAAA,EAAa,OAAQ,CAAA,KAAA,EAAO,eAAe,CAAA,CAAA;AAAA,WAC5D,CAAA,CAAA;AAAA,SACH;AAEA,QAAqB,oBAAA,EAAA,CAAA;AAErB,QAAM,MAAA,EAAA,GAAK,UAAW,CAAA,KAAA,CAAM,EAAG,CAAA,OAAA;AAAA,UAC7B,mCAAA;AAAA,UACA,EAAE,SAAS,IAAK,EAAA;AAAA,SAClB,CAAA;AACA,QAAA,UAAA,CAAW,SAAS,EAAE,CAAA,CAAA;AAEtB,QAAA,WAAA,GAAc,IAAK,CAAA,SAAA;AAAA,UACjB,WAAA;AAAA,UACA,CAAC,OAAY,KAAA;AACX,YACE,IAAA,OAAA,CAAQ,KAAM,CAAA,CAAC,MAAW,KAAA;AACxB,cAAM,MAAA,MAAA,GAAS,OAAO,oBAAoB,CAAA,CAAA;AAC1C,cAAA,OAAO,MAAQ,EAAA,MAAA,KAAW,OAAW,IAAA,MAAA,CAAO,GAAQ,KAAA,UAAA,CAAA;AAAA,aACrD,CACD,EAAA;AACA,cAAA,OAAA;AAAA,aACF;AAEA,YAAA,oBAAA,CAAqB,OAAO,CAAA,CAAA;AAAA,WAC9B;AAAA,UACA;AAAA,YACE,MAAQ,EAAA,IAAA;AAAA,WACV;AAAA,SACF,CAAA;AAAA,OACD,CAAA,CAAA;AAED,MAAO,OAAA;AAAA,QACL,OAAO,QAAU,EAAA;AACf,UAAO,IAAA,GAAA,QAAA,CAAA;AAAA,SACT;AAAA,QACA,OAAU,GAAA;AACR,UAAY,SAAA,GAAA,IAAA,CAAA;AACZ,UAAc,WAAA,IAAA,CAAA;AACd,UAAc,WAAA,GAAA,KAAA,CAAA,CAAA;AACd,UAAO,IAAA,GAAA,KAAA,CAAA,CAAA;AACP,UAAO,IAAA,GAAA,KAAA,CAAA,CAAA;AAAA,SACT;AAAA,OACF,CAAA;AAAA,KACF;AAAA,GACD,CAAA,CAAA;AACH;;;;"}
1
+ {"version":3,"file":"plugin.js","sources":["../src/plugin.ts"],"sourcesContent":["import type { LsonObject, StorageUpdate } from \"@liveblocks/client\";\nimport { LiveMap, LiveObject } from \"@liveblocks/client\";\nimport { kStorageUpdateSource } from \"@liveblocks/core\";\nimport { Slice } from \"prosemirror-model\";\nimport { Plugin, PluginKey } from \"prosemirror-state\";\nimport type { EditorView } from \"prosemirror-view\";\n\nimport { applyRemoteStorageUpdates } from \"./remote\";\nimport {\n createLiveblocksProsemirrorNode,\n type LiveblocksProsemirrorNode,\n liveblocksProsemirrorNodeToJson,\n type ProseMirrorJsonNode,\n stringifyDocument,\n} from \"./schema\";\nimport { applyIncrementalOperations, classifyTransaction } from \"./steps\";\nimport type { LiveblocksProsemirrorRoom } from \"./types\";\n\nexport const LIVEBLOCKS_COLLABORATION_PLUGIN_KEY = new PluginKey<{\n isReady: boolean;\n}>(\"liveblocks-collaboration\");\nexport const LIVEBLOCKS_TIPTAP_DOCUMENTS_KEY = \"_tiptap_docs\";\n\nexport type LiveblocksCollaborationOptions = {\n room?: LiveblocksProsemirrorRoom;\n field: string;\n initialContent?: ProseMirrorJsonNode;\n fallbackDocument?: () => ProseMirrorJsonNode;\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: ProseMirrorJsonNode | undefined,\n fallbackDocument: (() => ProseMirrorJsonNode) | 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 const fallback = fallbackDocument?.();\n if (isProseMirrorJsonNode(fallback)) {\n return fallback;\n }\n\n throw new Error(\n \"[Liveblocks] The Liveblocks collaboration plugin could not resolve an initial document.\"\n );\n}\n\nfunction replaceEditorDocument(\n view: EditorView,\n document: ProseMirrorJsonNode,\n fallbackDocument: (() => ProseMirrorJsonNode) | undefined\n): void {\n let nextDocument;\n try {\n nextDocument = view.state.schema.nodeFromJSON(document);\n } catch {\n const fallback = fallbackDocument?.();\n if (!isProseMirrorJsonNode(fallback)) {\n return;\n }\n\n nextDocument = view.state.schema.nodeFromJSON(fallback);\n }\n\n if (nextDocument.childCount === 0) {\n const fallback = fallbackDocument?.();\n if (!isProseMirrorJsonNode(fallback)) {\n return;\n }\n\n nextDocument = view.state.schema.nodeFromJSON(fallback);\n }\n\n const tr = view.state.tr.replace(\n 0,\n view.state.doc.content.size,\n new Slice(nextDocument.content, 0, 0)\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): LiveblocksProsemirrorNode | undefined {\n const documents = root.get(LIVEBLOCKS_TIPTAP_DOCUMENTS_KEY);\n if (!(documents instanceof LiveMap)) {\n return undefined;\n }\n\n const documentRoot = documents.get(field);\n if (!(documentRoot instanceof LiveObject)) {\n return undefined;\n }\n\n return documentRoot as LiveblocksProsemirrorNode;\n}\n\nfunction setDocumentRoot(\n root: LiveObject<LsonObject>,\n field: string,\n document: ProseMirrorJsonNode\n): void {\n let documents = root.get(LIVEBLOCKS_TIPTAP_DOCUMENTS_KEY);\n if (!(documents instanceof LiveMap)) {\n documents = new LiveMap<string, LiveblocksProsemirrorNode>();\n root.set(LIVEBLOCKS_TIPTAP_DOCUMENTS_KEY, documents);\n }\n\n documents.set(field, createLiveblocksProsemirrorNode(document));\n}\n\nexport function 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 = liveblocksProsemirrorNodeToJson(\n documentRoot,\n options.fallbackDocument\n );\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, options.fallbackDocument);\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\n // Idempotency guard: if the incoming document already matches what we\n // last synced to storage, there is nothing to do. This naturally handles\n // editors (e.g. BlockNote) that invoke appendTransaction more than once\n // per user edit with the same transaction set\n const incomingDocument: unknown = newState.doc.toJSON();\n if (!isProseMirrorJsonNode(incomingDocument)) {\n return null;\n }\n const serializedIncoming = stringifyDocument(incomingDocument);\n if (serializedIncoming === lastDocument) {\n return null;\n }\n\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 isApplyingLocalUpdate = true;\n try {\n room.batch(() => {\n if (classified.type === \"incremental\") {\n applyIncrementalOperations(classified.operations);\n } else {\n setDocumentRoot(currentRoot, options.field, incomingDocument);\n }\n });\n lastDocument = serializedIncoming;\n } finally {\n isApplyingLocalUpdate = false;\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 options.fallbackDocument,\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(\n storageRoot,\n (updates) => {\n if (\n updates.every((update) => {\n const source = update[kStorageUpdateSource];\n return source?.origin === \"local\" && source.via === \"mutation\";\n })\n ) {\n return;\n }\n\n applyStorageToEditor(updates);\n },\n {\n isDeep: true,\n }\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"],"names":[],"mappings":"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"}
package/dist/remote.cjs CHANGED
@@ -86,6 +86,13 @@ function isTextAlreadyApplied(doc, index, update) {
86
86
  }
87
87
  return getCurrentTextForLiveText(doc, index, update.node) === update.node.toString();
88
88
  }
89
+ function isLiveblocksNodeAlreadyApplied(range) {
90
+ const [jsonNode] = schema.liveblocksProsemirrorNodeToJsonNodes(range.node);
91
+ if (jsonNode === void 0) {
92
+ return false;
93
+ }
94
+ return JSON.stringify(range.pmNode.toJSON()) === JSON.stringify(jsonNode);
95
+ }
89
96
  function applyRemoteStorageUpdates(view, liveRoot, updates) {
90
97
  if (updates.length === 0) {
91
98
  return { type: "unsupported" };
@@ -152,6 +159,9 @@ function applyRemoteStorageUpdates(view, liveRoot, updates) {
152
159
  if (range === void 0) {
153
160
  return { type: "unsupported" };
154
161
  }
162
+ if (isLiveblocksNodeAlreadyApplied(range)) {
163
+ continue;
164
+ }
155
165
  if (change.type === "insert") {
156
166
  if (!isLiveblocksProsemirrorNode(change.item)) {
157
167
  return { type: "unsupported" };
@@ -1 +1 @@
1
- {"version":3,"file":"remote.cjs","sources":["../src/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 \"prosemirror-model\";\nimport type { Transaction } from \"prosemirror-state\";\nimport type { EditorView } from \"prosemirror-view\";\n\nimport {\n buildLiveblocksTreeIndex,\n findListRangeByLiveList,\n findNodeRangeByLiveNode,\n findTextRangeByLiveText,\n getChildPosition,\n} from \"./mapping\";\nimport {\n attributesToMarks,\n getLiveblocksNodeContent,\n getLiveblocksNodeText,\n type LiveblocksProsemirrorNode,\n liveblocksProsemirrorNodeToJsonNodes,\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 isLiveblocksProsemirrorNode(\n value: unknown\n): value is LiveblocksProsemirrorNode {\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: LiveblocksProsemirrorNode\n): JsonObject | undefined {\n const attrs = node.get(\"attrs\");\n return isJsonObject(attrs) ? attrs : undefined;\n}\n\nfunction createSliceFromLiveblocksNode(\n schema: Schema,\n node: LiveblocksProsemirrorNode\n): Slice {\n const nodes = liveblocksProsemirrorNodeToJsonNodes(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\nfunction collectCoveredDescendants(\n node: LiveblocksProsemirrorNode,\n coveredNodes: Set<unknown>\n): void {\n coveredNodes.add(node);\n\n const text = getLiveblocksNodeText(node);\n if (text !== undefined) {\n coveredNodes.add(text);\n }\n\n const content = getLiveblocksNodeContent(node);\n if (content === undefined) {\n return;\n }\n\n coveredNodes.add(content);\n for (let index = 0; index < content.length; index++) {\n const child = content.get(index);\n if (child !== undefined) {\n collectCoveredDescendants(child, coveredNodes);\n }\n }\n}\n\nfunction getStructurallyCoveredNodes(\n updates: readonly StorageUpdate[]\n): Set<unknown> {\n const coveredNodes = new Set<unknown>();\n\n for (const update of updates) {\n if (update.type !== \"LiveList\") {\n continue;\n }\n\n for (const change of update.updates) {\n if (\n (change.type === \"insert\" ||\n change.type === \"set\" ||\n change.type === \"move\") &&\n isLiveblocksProsemirrorNode(change.item)\n ) {\n collectCoveredDescendants(change.item, coveredNodes);\n }\n }\n }\n\n return coveredNodes;\n}\n\nfunction getCurrentTextForLiveText(\n doc: Transaction[\"doc\"],\n index: ReturnType<typeof buildLiveblocksTreeIndex>,\n text: LiveText\n): string | undefined {\n const range = findNodeRangeForLiveText(index, text);\n if (range === undefined) {\n return undefined;\n }\n\n return doc.textBetween(range.from, range.to);\n}\n\nfunction isTextAlreadyApplied(\n doc: Transaction[\"doc\"],\n index: ReturnType<typeof buildLiveblocksTreeIndex>,\n update: Extract<StorageUpdate, { type: \"LiveText\" }>\n): boolean {\n if (update.updates.some((change) => change.type === \"format\")) {\n return false;\n }\n\n return (\n getCurrentTextForLiveText(doc, index, update.node) ===\n update.node.toString()\n );\n}\n\nexport function applyRemoteStorageUpdates(\n view: EditorView,\n liveRoot: LiveblocksProsemirrorNode,\n updates: readonly StorageUpdate[]\n): RemoteApplyResult {\n if (updates.length === 0) {\n return { type: \"unsupported\" };\n }\n\n let tr = view.state.tr;\n const structurallyCoveredNodes = getStructurallyCoveredNodes(updates);\n\n for (const update of updates) {\n if (structurallyCoveredNodes.has(update.node)) {\n continue;\n }\n\n if (update.type === \"LiveText\") {\n if (!(update.node instanceof LiveText)) {\n return { type: \"unsupported\" };\n }\n\n const initialIndex = buildLiveblocksTreeIndex(tr.doc, liveRoot);\n if (isTextAlreadyApplied(tr.doc, initialIndex, update)) {\n continue;\n }\n\n for (const change of update.updates) {\n const index = buildLiveblocksTreeIndex(tr.doc, liveRoot);\n const 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 (!isLiveblocksProsemirrorNode(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 (!isLiveblocksProsemirrorNode(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 (!isLiveblocksProsemirrorNode(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 (!isLiveblocksProsemirrorNode(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\"\n ? null\n : 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: LiveblocksProsemirrorNode,\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"],"names":["LiveObject","schema","liveblocksProsemirrorNodeToJsonNodes","Slice","Fragment","attributesToMarks","getLiveblocksNodeText","getLiveblocksNodeContent","LiveText","buildLiveblocksTreeIndex","findTextRangeByLiveText","from","findListRangeByLiveList","getChildPosition","findNodeRangeByLiveNode"],"mappings":"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"}
1
+ {"version":3,"file":"remote.cjs","sources":["../src/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 \"prosemirror-model\";\nimport type { Transaction } from \"prosemirror-state\";\nimport type { EditorView } from \"prosemirror-view\";\n\nimport {\n buildLiveblocksTreeIndex,\n findListRangeByLiveList,\n findNodeRangeByLiveNode,\n findTextRangeByLiveText,\n getChildPosition,\n} from \"./mapping\";\nimport {\n attributesToMarks,\n getLiveblocksNodeContent,\n getLiveblocksNodeText,\n type LiveblocksProsemirrorNode,\n liveblocksProsemirrorNodeToJsonNodes,\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 isLiveblocksProsemirrorNode(\n value: unknown\n): value is LiveblocksProsemirrorNode {\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: LiveblocksProsemirrorNode\n): JsonObject | undefined {\n const attrs = node.get(\"attrs\");\n return isJsonObject(attrs) ? attrs : undefined;\n}\n\nfunction createSliceFromLiveblocksNode(\n schema: Schema,\n node: LiveblocksProsemirrorNode\n): Slice {\n const nodes = liveblocksProsemirrorNodeToJsonNodes(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\nfunction collectCoveredDescendants(\n node: LiveblocksProsemirrorNode,\n coveredNodes: Set<unknown>\n): void {\n coveredNodes.add(node);\n\n const text = getLiveblocksNodeText(node);\n if (text !== undefined) {\n coveredNodes.add(text);\n }\n\n const content = getLiveblocksNodeContent(node);\n if (content === undefined) {\n return;\n }\n\n coveredNodes.add(content);\n for (let index = 0; index < content.length; index++) {\n const child = content.get(index);\n if (child !== undefined) {\n collectCoveredDescendants(child, coveredNodes);\n }\n }\n}\n\nfunction getStructurallyCoveredNodes(\n updates: readonly StorageUpdate[]\n): Set<unknown> {\n const coveredNodes = new Set<unknown>();\n\n for (const update of updates) {\n if (update.type !== \"LiveList\") {\n continue;\n }\n\n for (const change of update.updates) {\n if (\n (change.type === \"insert\" ||\n change.type === \"set\" ||\n change.type === \"move\") &&\n isLiveblocksProsemirrorNode(change.item)\n ) {\n collectCoveredDescendants(change.item, coveredNodes);\n }\n }\n }\n\n return coveredNodes;\n}\n\nfunction getCurrentTextForLiveText(\n doc: Transaction[\"doc\"],\n index: ReturnType<typeof buildLiveblocksTreeIndex>,\n text: LiveText\n): string | undefined {\n const range = findNodeRangeForLiveText(index, text);\n if (range === undefined) {\n return undefined;\n }\n\n return doc.textBetween(range.from, range.to);\n}\n\nfunction isTextAlreadyApplied(\n doc: Transaction[\"doc\"],\n index: ReturnType<typeof buildLiveblocksTreeIndex>,\n update: Extract<StorageUpdate, { type: \"LiveText\" }>\n): boolean {\n if (update.updates.some((change) => change.type === \"format\")) {\n return false;\n }\n\n return (\n getCurrentTextForLiveText(doc, index, update.node) ===\n update.node.toString()\n );\n}\n\nfunction isLiveblocksNodeAlreadyApplied(\n range: NonNullable<ReturnType<typeof findListRangeByLiveList>>\n): boolean {\n const [jsonNode] = liveblocksProsemirrorNodeToJsonNodes(range.node);\n if (jsonNode === undefined) {\n return false;\n }\n\n return JSON.stringify(range.pmNode.toJSON()) === JSON.stringify(jsonNode);\n}\n\nexport function applyRemoteStorageUpdates(\n view: EditorView,\n liveRoot: LiveblocksProsemirrorNode,\n updates: readonly StorageUpdate[]\n): RemoteApplyResult {\n if (updates.length === 0) {\n return { type: \"unsupported\" };\n }\n\n let tr = view.state.tr;\n const structurallyCoveredNodes = getStructurallyCoveredNodes(updates);\n\n for (const update of updates) {\n if (structurallyCoveredNodes.has(update.node)) {\n continue;\n }\n\n if (update.type === \"LiveText\") {\n if (!(update.node instanceof LiveText)) {\n return { type: \"unsupported\" };\n }\n\n const initialIndex = buildLiveblocksTreeIndex(tr.doc, liveRoot);\n if (isTextAlreadyApplied(tr.doc, initialIndex, update)) {\n continue;\n }\n\n for (const change of update.updates) {\n const index = buildLiveblocksTreeIndex(tr.doc, liveRoot);\n const 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 (isLiveblocksNodeAlreadyApplied(range)) {\n continue;\n }\n\n if (change.type === \"insert\") {\n if (!isLiveblocksProsemirrorNode(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 (!isLiveblocksProsemirrorNode(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 (!isLiveblocksProsemirrorNode(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 (!isLiveblocksProsemirrorNode(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\"\n ? null\n : 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: LiveblocksProsemirrorNode,\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"],"names":["LiveObject","schema","liveblocksProsemirrorNodeToJsonNodes","Slice","Fragment","attributesToMarks","getLiveblocksNodeText","getLiveblocksNodeContent","LiveText","buildLiveblocksTreeIndex","findTextRangeByLiveText","from","findListRangeByLiveList","getChildPosition","findNodeRangeByLiveNode"],"mappings":"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"}
package/dist/remote.js CHANGED
@@ -84,6 +84,13 @@ function isTextAlreadyApplied(doc, index, update) {
84
84
  }
85
85
  return getCurrentTextForLiveText(doc, index, update.node) === update.node.toString();
86
86
  }
87
+ function isLiveblocksNodeAlreadyApplied(range) {
88
+ const [jsonNode] = liveblocksProsemirrorNodeToJsonNodes(range.node);
89
+ if (jsonNode === void 0) {
90
+ return false;
91
+ }
92
+ return JSON.stringify(range.pmNode.toJSON()) === JSON.stringify(jsonNode);
93
+ }
87
94
  function applyRemoteStorageUpdates(view, liveRoot, updates) {
88
95
  if (updates.length === 0) {
89
96
  return { type: "unsupported" };
@@ -150,6 +157,9 @@ function applyRemoteStorageUpdates(view, liveRoot, updates) {
150
157
  if (range === void 0) {
151
158
  return { type: "unsupported" };
152
159
  }
160
+ if (isLiveblocksNodeAlreadyApplied(range)) {
161
+ continue;
162
+ }
153
163
  if (change.type === "insert") {
154
164
  if (!isLiveblocksProsemirrorNode(change.item)) {
155
165
  return { type: "unsupported" };
@@ -1 +1 @@
1
- {"version":3,"file":"remote.js","sources":["../src/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 \"prosemirror-model\";\nimport type { Transaction } from \"prosemirror-state\";\nimport type { EditorView } from \"prosemirror-view\";\n\nimport {\n buildLiveblocksTreeIndex,\n findListRangeByLiveList,\n findNodeRangeByLiveNode,\n findTextRangeByLiveText,\n getChildPosition,\n} from \"./mapping\";\nimport {\n attributesToMarks,\n getLiveblocksNodeContent,\n getLiveblocksNodeText,\n type LiveblocksProsemirrorNode,\n liveblocksProsemirrorNodeToJsonNodes,\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 isLiveblocksProsemirrorNode(\n value: unknown\n): value is LiveblocksProsemirrorNode {\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: LiveblocksProsemirrorNode\n): JsonObject | undefined {\n const attrs = node.get(\"attrs\");\n return isJsonObject(attrs) ? attrs : undefined;\n}\n\nfunction createSliceFromLiveblocksNode(\n schema: Schema,\n node: LiveblocksProsemirrorNode\n): Slice {\n const nodes = liveblocksProsemirrorNodeToJsonNodes(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\nfunction collectCoveredDescendants(\n node: LiveblocksProsemirrorNode,\n coveredNodes: Set<unknown>\n): void {\n coveredNodes.add(node);\n\n const text = getLiveblocksNodeText(node);\n if (text !== undefined) {\n coveredNodes.add(text);\n }\n\n const content = getLiveblocksNodeContent(node);\n if (content === undefined) {\n return;\n }\n\n coveredNodes.add(content);\n for (let index = 0; index < content.length; index++) {\n const child = content.get(index);\n if (child !== undefined) {\n collectCoveredDescendants(child, coveredNodes);\n }\n }\n}\n\nfunction getStructurallyCoveredNodes(\n updates: readonly StorageUpdate[]\n): Set<unknown> {\n const coveredNodes = new Set<unknown>();\n\n for (const update of updates) {\n if (update.type !== \"LiveList\") {\n continue;\n }\n\n for (const change of update.updates) {\n if (\n (change.type === \"insert\" ||\n change.type === \"set\" ||\n change.type === \"move\") &&\n isLiveblocksProsemirrorNode(change.item)\n ) {\n collectCoveredDescendants(change.item, coveredNodes);\n }\n }\n }\n\n return coveredNodes;\n}\n\nfunction getCurrentTextForLiveText(\n doc: Transaction[\"doc\"],\n index: ReturnType<typeof buildLiveblocksTreeIndex>,\n text: LiveText\n): string | undefined {\n const range = findNodeRangeForLiveText(index, text);\n if (range === undefined) {\n return undefined;\n }\n\n return doc.textBetween(range.from, range.to);\n}\n\nfunction isTextAlreadyApplied(\n doc: Transaction[\"doc\"],\n index: ReturnType<typeof buildLiveblocksTreeIndex>,\n update: Extract<StorageUpdate, { type: \"LiveText\" }>\n): boolean {\n if (update.updates.some((change) => change.type === \"format\")) {\n return false;\n }\n\n return (\n getCurrentTextForLiveText(doc, index, update.node) ===\n update.node.toString()\n );\n}\n\nexport function applyRemoteStorageUpdates(\n view: EditorView,\n liveRoot: LiveblocksProsemirrorNode,\n updates: readonly StorageUpdate[]\n): RemoteApplyResult {\n if (updates.length === 0) {\n return { type: \"unsupported\" };\n }\n\n let tr = view.state.tr;\n const structurallyCoveredNodes = getStructurallyCoveredNodes(updates);\n\n for (const update of updates) {\n if (structurallyCoveredNodes.has(update.node)) {\n continue;\n }\n\n if (update.type === \"LiveText\") {\n if (!(update.node instanceof LiveText)) {\n return { type: \"unsupported\" };\n }\n\n const initialIndex = buildLiveblocksTreeIndex(tr.doc, liveRoot);\n if (isTextAlreadyApplied(tr.doc, initialIndex, update)) {\n continue;\n }\n\n for (const change of update.updates) {\n const index = buildLiveblocksTreeIndex(tr.doc, liveRoot);\n const 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 (!isLiveblocksProsemirrorNode(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 (!isLiveblocksProsemirrorNode(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 (!isLiveblocksProsemirrorNode(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 (!isLiveblocksProsemirrorNode(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\"\n ? null\n : 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: LiveblocksProsemirrorNode,\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"],"names":["from"],"mappings":"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"}
1
+ {"version":3,"file":"remote.js","sources":["../src/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 \"prosemirror-model\";\nimport type { Transaction } from \"prosemirror-state\";\nimport type { EditorView } from \"prosemirror-view\";\n\nimport {\n buildLiveblocksTreeIndex,\n findListRangeByLiveList,\n findNodeRangeByLiveNode,\n findTextRangeByLiveText,\n getChildPosition,\n} from \"./mapping\";\nimport {\n attributesToMarks,\n getLiveblocksNodeContent,\n getLiveblocksNodeText,\n type LiveblocksProsemirrorNode,\n liveblocksProsemirrorNodeToJsonNodes,\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 isLiveblocksProsemirrorNode(\n value: unknown\n): value is LiveblocksProsemirrorNode {\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: LiveblocksProsemirrorNode\n): JsonObject | undefined {\n const attrs = node.get(\"attrs\");\n return isJsonObject(attrs) ? attrs : undefined;\n}\n\nfunction createSliceFromLiveblocksNode(\n schema: Schema,\n node: LiveblocksProsemirrorNode\n): Slice {\n const nodes = liveblocksProsemirrorNodeToJsonNodes(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\nfunction collectCoveredDescendants(\n node: LiveblocksProsemirrorNode,\n coveredNodes: Set<unknown>\n): void {\n coveredNodes.add(node);\n\n const text = getLiveblocksNodeText(node);\n if (text !== undefined) {\n coveredNodes.add(text);\n }\n\n const content = getLiveblocksNodeContent(node);\n if (content === undefined) {\n return;\n }\n\n coveredNodes.add(content);\n for (let index = 0; index < content.length; index++) {\n const child = content.get(index);\n if (child !== undefined) {\n collectCoveredDescendants(child, coveredNodes);\n }\n }\n}\n\nfunction getStructurallyCoveredNodes(\n updates: readonly StorageUpdate[]\n): Set<unknown> {\n const coveredNodes = new Set<unknown>();\n\n for (const update of updates) {\n if (update.type !== \"LiveList\") {\n continue;\n }\n\n for (const change of update.updates) {\n if (\n (change.type === \"insert\" ||\n change.type === \"set\" ||\n change.type === \"move\") &&\n isLiveblocksProsemirrorNode(change.item)\n ) {\n collectCoveredDescendants(change.item, coveredNodes);\n }\n }\n }\n\n return coveredNodes;\n}\n\nfunction getCurrentTextForLiveText(\n doc: Transaction[\"doc\"],\n index: ReturnType<typeof buildLiveblocksTreeIndex>,\n text: LiveText\n): string | undefined {\n const range = findNodeRangeForLiveText(index, text);\n if (range === undefined) {\n return undefined;\n }\n\n return doc.textBetween(range.from, range.to);\n}\n\nfunction isTextAlreadyApplied(\n doc: Transaction[\"doc\"],\n index: ReturnType<typeof buildLiveblocksTreeIndex>,\n update: Extract<StorageUpdate, { type: \"LiveText\" }>\n): boolean {\n if (update.updates.some((change) => change.type === \"format\")) {\n return false;\n }\n\n return (\n getCurrentTextForLiveText(doc, index, update.node) ===\n update.node.toString()\n );\n}\n\nfunction isLiveblocksNodeAlreadyApplied(\n range: NonNullable<ReturnType<typeof findListRangeByLiveList>>\n): boolean {\n const [jsonNode] = liveblocksProsemirrorNodeToJsonNodes(range.node);\n if (jsonNode === undefined) {\n return false;\n }\n\n return JSON.stringify(range.pmNode.toJSON()) === JSON.stringify(jsonNode);\n}\n\nexport function applyRemoteStorageUpdates(\n view: EditorView,\n liveRoot: LiveblocksProsemirrorNode,\n updates: readonly StorageUpdate[]\n): RemoteApplyResult {\n if (updates.length === 0) {\n return { type: \"unsupported\" };\n }\n\n let tr = view.state.tr;\n const structurallyCoveredNodes = getStructurallyCoveredNodes(updates);\n\n for (const update of updates) {\n if (structurallyCoveredNodes.has(update.node)) {\n continue;\n }\n\n if (update.type === \"LiveText\") {\n if (!(update.node instanceof LiveText)) {\n return { type: \"unsupported\" };\n }\n\n const initialIndex = buildLiveblocksTreeIndex(tr.doc, liveRoot);\n if (isTextAlreadyApplied(tr.doc, initialIndex, update)) {\n continue;\n }\n\n for (const change of update.updates) {\n const index = buildLiveblocksTreeIndex(tr.doc, liveRoot);\n const 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 (isLiveblocksNodeAlreadyApplied(range)) {\n continue;\n }\n\n if (change.type === \"insert\") {\n if (!isLiveblocksProsemirrorNode(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 (!isLiveblocksProsemirrorNode(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 (!isLiveblocksProsemirrorNode(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 (!isLiveblocksProsemirrorNode(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\"\n ? null\n : 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: LiveblocksProsemirrorNode,\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"],"names":["from"],"mappings":"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"}
package/dist/version.cjs CHANGED
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
3
  const PKG_NAME = "@liveblocks/prosemirror";
4
- const PKG_VERSION = "3.20.0";
5
- const PKG_FORMAT = process.env.NODE_ENV === "production" ? "production" : "development";
4
+ const PKG_VERSION = typeof "3.23.0-exp1" === "string" && "3.23.0-exp1";
5
+ const PKG_FORMAT = typeof "cjs" === "string" && "cjs";
6
6
 
7
7
  exports.PKG_FORMAT = PKG_FORMAT;
8
8
  exports.PKG_NAME = PKG_NAME;
@@ -1 +1 @@
1
- {"version":3,"file":"version.cjs","sources":["../src/version.ts"],"sourcesContent":["export const PKG_NAME = \"@liveblocks/prosemirror\";\nexport const PKG_VERSION = \"3.20.0\";\nexport const PKG_FORMAT =\n process.env.NODE_ENV === \"production\" ? \"production\" : \"development\";\n"],"names":[],"mappings":";;AAAO,MAAM,QAAW,GAAA,0BAAA;AACjB,MAAM,WAAc,GAAA,SAAA;AACpB,MAAM,UACX,GAAA,OAAA,CAAQ,GAAI,CAAA,QAAA,KAAa,eAAe,YAAe,GAAA;;;;;;"}
1
+ {"version":3,"file":"version.cjs","sources":["../src/version.ts"],"sourcesContent":["declare const __VERSION__: string;\ndeclare const ROLLUP_FORMAT: string;\n\nexport const PKG_NAME = \"@liveblocks/prosemirror\";\nexport const PKG_VERSION = typeof __VERSION__ === \"string\" && __VERSION__;\nexport const PKG_FORMAT = typeof ROLLUP_FORMAT === \"string\" && ROLLUP_FORMAT;\n"],"names":[],"mappings":";;AAGO,MAAM,QAAW,GAAA,0BAAA;AACX,MAAA,WAAA,GAAc,OAAO,aAAA,KAAgB,QAAY,IAAA,cAAA;AACjD,MAAA,UAAA,GAAa,OAAO,KAAA,KAAkB,QAAY,IAAA;;;;;;"}
package/dist/version.js CHANGED
@@ -1,6 +1,6 @@
1
1
  const PKG_NAME = "@liveblocks/prosemirror";
2
- const PKG_VERSION = "3.20.0";
3
- const PKG_FORMAT = process.env.NODE_ENV === "production" ? "production" : "development";
2
+ const PKG_VERSION = typeof "3.23.0-exp1" === "string" && "3.23.0-exp1";
3
+ const PKG_FORMAT = typeof "esm" === "string" && "esm";
4
4
 
5
5
  export { PKG_FORMAT, PKG_NAME, PKG_VERSION };
6
6
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sources":["../src/version.ts"],"sourcesContent":["export const PKG_NAME = \"@liveblocks/prosemirror\";\nexport const PKG_VERSION = \"3.20.0\";\nexport const PKG_FORMAT =\n process.env.NODE_ENV === \"production\" ? \"production\" : \"development\";\n"],"names":[],"mappings":"AAAO,MAAM,QAAW,GAAA,0BAAA;AACjB,MAAM,WAAc,GAAA,SAAA;AACpB,MAAM,UACX,GAAA,OAAA,CAAQ,GAAI,CAAA,QAAA,KAAa,eAAe,YAAe,GAAA;;;;"}
1
+ {"version":3,"file":"version.js","sources":["../src/version.ts"],"sourcesContent":["declare const __VERSION__: string;\ndeclare const ROLLUP_FORMAT: string;\n\nexport const PKG_NAME = \"@liveblocks/prosemirror\";\nexport const PKG_VERSION = typeof __VERSION__ === \"string\" && __VERSION__;\nexport const PKG_FORMAT = typeof ROLLUP_FORMAT === \"string\" && ROLLUP_FORMAT;\n"],"names":[],"mappings":"AAGO,MAAM,QAAW,GAAA,0BAAA;AACX,MAAA,WAAA,GAAc,OAAO,aAAA,KAAgB,QAAY,IAAA,cAAA;AACjD,MAAA,UAAA,GAAa,OAAO,KAAA,KAAkB,QAAY,IAAA;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@liveblocks/prosemirror",
3
- "version": "3.21.0-exp8",
3
+ "version": "3.23.0-exp1",
4
4
  "description": "ProseMirror collaboration plugins backed by Liveblocks.",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Liveblocks Inc.",
@@ -25,8 +25,8 @@
25
25
  "README.md"
26
26
  ],
27
27
  "dependencies": {
28
- "@liveblocks/client": "3.21.0-exp8",
29
- "@liveblocks/core": "3.21.0-exp8"
28
+ "@liveblocks/client": "3.23.0-exp1",
29
+ "@liveblocks/core": "3.23.0-exp1"
30
30
  },
31
31
  "peerDependencies": {
32
32
  "prosemirror-model": "^1",