{"version":3,"file":"index.cjs","names":["ContentType","XmlFragment","Text","XmlHook","AbstractType","XmlFragment","Text","XmlHook","Y","Y","Node","error","ReplaceStep","XmlText","Node","Y","Y","Y","Y","PluginKey","DecorationSet","Y","math","Decoration","Plugin","Y","set","random","AllSelection","TextSelection","NodeSelection","Selection","Y","buf","sha256","map","utils.hashOfJSON","Y","Y","object","Y","Y","simpleDiff","Y","Y","math","Y","math","Y","math","Y","Y","Y","Y","Y","Y","Y","Slice","replaceStep","createMutex","environment","dom","Y","error","PModel","math","TextSelection","Y","Plugin","Y","Y","Item","ContentType","Text","XmlElement","Plugin","UndoManager","Y","Y","Node","Y","Node","Node","Node","Y","error","Fragment","Y","error","Fragment"],"sources":["../src/lib/utils/positions/getYType.ts","../src/lib/utils/positions/getYParent.ts","../src/lib/utils/positions/createRelativePosition.ts","../src/lib/utils/positions/absolutePositionToRelativePosition.ts","../src/lib/utils/positions/isStructuralTransaction.ts","../src/lib/utils/positions/getYTypeSize.ts","../src/lib/utils/positions/getParentOffset.ts","../src/lib/utils/positions/getYContentOffset.ts","../src/lib/utils/positions/isMisresolvedTextPosition.ts","../src/lib/utils/positions/migrations/getPositionMigrationStore.ts","../src/lib/utils/positions/migrations/getPositionMigrationCandidates.ts","../src/lib/utils/positions/migrations/resolvePositionMigration.ts","../src/lib/utils/positions/relativePositionToAbsolutePosition.ts","../src/lib/plugins/keys.ts","../src/lib/plugins/setMeta.ts","../src/lib/plugins/yCursorPlugin.ts","../src/lib/plugins/getSyncPluginState.ts","../src/lib/utils/binding/isVisible.ts","../src/lib/utils/binding/getUserColor.ts","../src/lib/utils/positions/attrsEqual.ts","../src/lib/utils/positions/hasDistinctiveAttrs.ts","../src/lib/utils/positions/findAbsolutePositionAfterStructuralChange.ts","../src/lib/utils/positions/isMisresolvedAfterStructuralChange.ts","../src/lib/utils/positions/restoreRelativeSelection.ts","../src/lib/utils/positions/getRelativeSelection.ts","../src/lib/utils/binding/projectedMappings.ts","../src/lib/utils/conversion/yattr2markname.ts","../src/lib/utils/conversion/attributesToMarks.ts","../src/lib/utils/conversion/createTextNodesFromYText.ts","../src/lib/utils/conversion/createNodeFromYElement.ts","../src/lib/utils/conversion/validateDocumentContent.ts","../src/lib/utils/conversion/hashOfJSON.ts","../src/lib/utils/conversion/marksToAttributes.ts","../src/lib/utils/conversion/createTypeFromTextNodes.ts","../src/lib/utils/conversion/normalizePNodeContent.ts","../src/lib/utils/conversion/createTypeFromTextOrElementNode.ts","../src/lib/utils/reconciliation/isObject.ts","../src/lib/utils/reconciliation/equalAttrs.ts","../src/lib/utils/reconciliation/equalYTextPText.ts","../src/lib/utils/reconciliation/matchNodeName.ts","../src/lib/utils/reconciliation/equalYTypePNode.ts","../src/lib/utils/reconciliation/mappedIdentity.ts","../src/lib/utils/reconciliation/findMappedChildAnchors.ts","../src/lib/utils/reconciliation/ytextTrans.ts","../src/lib/utils/reconciliation/updateYText.ts","../src/lib/utils/reconciliation/updateMatchingYChild.ts","../src/lib/utils/binding/deleteMapping.ts","../src/lib/utils/reconciliation/deleteYChildren.ts","../src/lib/utils/reconciliation/insertPChildren.ts","../src/lib/utils/reconciliation/reconcileUnanchoredChildren.ts","../src/lib/utils/reconciliation/reconcileMappedChildren.ts","../src/lib/utils/reconciliation/computeChildEqualityFactor.ts","../src/lib/utils/reconciliation/updateYFragment.ts","../src/lib/utils/positions/migrations/getTextCharacters.ts","../src/lib/utils/positions/migrations/syncPositionText.ts","../src/lib/utils/positions/migrations/mergePositionTransfers.ts","../src/lib/utils/positions/migrations/writePositionMigration.ts","../src/lib/utils/positions/migrations/getPositionBoundaryTransfers.ts","../src/lib/utils/positions/migrations/getPositionNodeTransfers.ts","../src/lib/utils/positions/migrations/syncPositionElement.ts","../src/lib/utils/positions/migrations/applyPositionMigration.ts","../src/lib/utils/binding/replaceChangedChildren.ts","../src/lib/utils/binding/ProsemirrorBinding.ts","../src/lib/utils/positions/migrations/getPositionContent.ts","../src/lib/utils/positions/migrations/isNodeMarkupChange.ts","../src/lib/utils/positions/migrations/mapPositionMigration.ts","../src/lib/plugins/ySyncPlugin.ts","../src/lib/plugins/getUndoPluginState.ts","../src/lib/utils/positions/migrations/getLivePositionTargets.ts","../src/lib/utils/positions/migrations/restorePositionHistory.ts","../src/lib/plugins/yUndoPlugin.ts","../src/lib/utils/conversion/prosemirrorToYXmlFragment.ts","../src/lib/utils/conversion/prosemirrorToYDoc.ts","../src/lib/utils/conversion/prosemirrorJSONToYDoc.ts","../src/lib/utils/conversion/yXmlFragmentToProsemirrorJSON.ts","../src/lib/utils/conversion/yDocToProsemirrorJSON.ts","../src/lib/utils/conversion/yDocToProsemirror.ts","../src/lib/utils/conversion/prosemirrorJSONToYXmlFragment.ts","../src/lib/utils/conversion/yXmlFragmentToProsemirror.ts","../src/lib/utils/conversion/createEmptyMeta.ts","../src/lib/utils/conversion/yXmlFragmentToProseMirrorFragment.ts","../src/lib/utils/conversion/yXmlFragmentToProseMirrorRootNode.ts","../src/lib/utils/conversion/initProseMirrorDoc.ts"],"sourcesContent":["import type { YType } from '../../../types/YType.js'\nimport { ContentType, XmlFragment, Text, XmlHook } from 'yjs'\nimport type { Item } from 'yjs'\n\nexport function getYType(item: Item | null | undefined): YType | null {\n if (!item) return null\n if (!(item.content instanceof ContentType)) return null\n const type = item.content.type\n if (!(type instanceof XmlFragment || type instanceof Text || type instanceof XmlHook))\n throw new Error('Expected a Yjs XML type')\n return type\n}\n","import type { YType } from '../../../types/YType.js'\nimport { AbstractType, XmlFragment, Text, XmlHook } from 'yjs'\nimport type { Item } from 'yjs'\n\nexport function getYParent(item: Item | null): YType | null {\n if (item === null) return null\n if (!(item.parent instanceof AbstractType)) throw new Error('Expected an integrated Yjs parent')\n const type = item.parent\n if (!(type instanceof XmlFragment || type instanceof Text || type instanceof XmlHook))\n throw new Error('Expected a Yjs XML type')\n return type\n}\n","import type { YType } from '../../../types/YType.js'\nimport * as Y from 'yjs'\n\nexport const createRelativePosition = (type: YType, item: Y.Item) => {\n let typeid: Y.ID | null = null\n let tname: string | null = null\n if (type._item === null) {\n tname = Y.findRootTypeKey(type)\n } else {\n typeid = Y.createID(type._item.id.client, type._item.id.clock)\n }\n return new Y.RelativePosition(typeid, tname, item.id)\n}\n","import type { YType } from '../../../types/YType.js'\nimport type { ProsemirrorMapping } from '../../../types/ProsemirrorMapping.js'\nimport { getYType } from './getYType.js'\nimport { getYParent } from './getYParent.js'\nimport * as Y from 'yjs'\nimport { Node } from 'prosemirror-model'\nimport * as error from 'lib0/error'\nimport { createRelativePosition } from './createRelativePosition.js'\n\n/** Converts a ProseMirror position to a Yjs relative position. */\nexport const absolutePositionToRelativePosition = (\n pos: number,\n type: Y.XmlFragment,\n mapping: ProsemirrorMapping,\n) => {\n if (pos === 0) {\n return Y.createRelativePositionFromTypeIndex(type, 0, -1)\n }\n let n: YType | null = getYType(type._first)\n while (n !== null && type !== n) {\n if (n instanceof Y.XmlText) {\n if (n._length >= pos) {\n return Y.createRelativePositionFromTypeIndex(n, pos, -1)\n } else {\n pos -= n._length\n }\n if (n._item !== null && n._item.next !== null) {\n n = getYType(n._item.next)\n } else {\n do {\n n = getYParent(n._item)\n pos--\n } while (n !== type && n !== null && n._item !== null && n._item.next === null)\n if (n !== null && n !== type) {\n n = n._item === null ? null : getYType(n._item.next)\n }\n }\n } else {\n const mapped = mapping.get(n)\n const pNodeSize = mapped instanceof Node ? mapped.nodeSize : 0\n if (n._first !== null && pos < pNodeSize) {\n n = getYType(n._first)\n pos--\n } else {\n if (pos === 1 && n._length === 0 && pNodeSize > 1) {\n return new Y.RelativePosition(\n n._item === null ? null : n._item.id,\n n._item === null ? Y.findRootTypeKey(n) : null,\n null,\n )\n }\n pos -= pNodeSize\n if (n._item !== null && n._item.next !== null) {\n n = getYType(n._item.next)\n } else {\n if (pos === 0) {\n n = n._item === null ? n : getYParent(n._item)\n if (n === null) throw error.unexpectedCase()\n return new Y.RelativePosition(\n n._item === null ? null : n._item.id,\n n._item === null ? Y.findRootTypeKey(n) : null,\n null,\n )\n }\n do {\n n = getYParent(n._item)\n if (n === null) throw error.unexpectedCase()\n pos--\n } while (n !== type && n._item?.next === null)\n if (n !== type) {\n n = getYType(n._item?.next)\n }\n }\n }\n }\n if (n === null) {\n throw error.unexpectedCase()\n }\n if (pos === 0 && n.constructor !== Y.XmlText && n !== type) {\n const item = n._item\n const parent = getYParent(item)\n if (item === null || parent === null) throw error.unexpectedCase()\n return createRelativePosition(parent, item)\n }\n }\n return Y.createRelativePositionFromTypeIndex(type, type._length, -1)\n}\n","import type { Transaction } from 'prosemirror-state'\nimport { Node } from 'prosemirror-model'\nimport { ReplaceStep } from 'prosemirror-transform'\n\n/** Reports whether a transaction changes the document structure. */\nexport const isStructuralTransaction = (tr: Transaction, oldDoc: Node) => {\n if (!tr.docChanged) {\n return false\n }\n if (tr.doc.childCount !== oldDoc.childCount) {\n return true\n }\n for (const step of tr.steps) {\n if (step instanceof ReplaceStep) {\n if (step.from === 0 && step.to === oldDoc.content.size) {\n return true\n }\n if (step.slice.content.size > 0) {\n let hasBlock = false\n step.slice.content.forEach(node => {\n if (node.isBlock) {\n hasBlock = true\n }\n })\n if (hasBlock) {\n return true\n }\n } else if (step.to > step.from) {\n const $from = oldDoc.resolve(step.from)\n const $to = oldDoc.resolve(step.to)\n if ($from.depth === 0 && $to.depth === 0 && $from.index() !== $to.index()) {\n return true\n }\n }\n }\n }\n return false\n}\n","import { Node } from 'prosemirror-model'\nimport { XmlText } from 'yjs'\n\nimport type { ProsemirrorMapping } from '../../../types/ProsemirrorMapping.js'\nimport type { YType } from '../../../types/YType.js'\n\nexport function getYTypeSize(type: YType, mapping: ProsemirrorMapping): number | null {\n if (type instanceof XmlText) {\n return type._length\n }\n\n const node = mapping.get(type)\n\n return node instanceof Node ? node.nodeSize : null\n}\n","import type { AbsolutePosition } from 'yjs'\n\nimport type { ProsemirrorMapping } from '../../../types/ProsemirrorMapping.js'\nimport type { YType } from '../../../types/YType.js'\nimport { getYType } from './getYType.js'\nimport { getYTypeSize } from './getYTypeSize.js'\n\nexport function getParentOffset(\n parent: YType,\n type: AbsolutePosition['type'],\n mapping: ProsemirrorMapping,\n): number | null {\n let offset = 0\n let item = parent._first\n\n while (item !== null) {\n const child = getYType(item)\n\n if (child === type) {\n break\n }\n\n const deleted = item.deleted\n item = item.right\n\n if (deleted) {\n continue\n }\n\n if (child === null) {\n return null\n }\n\n const size = getYTypeSize(child, mapping)\n\n if (size === null) {\n return null\n }\n\n offset += size\n }\n\n return offset\n}\n","import type { AbsolutePosition } from 'yjs'\n\nimport type { ProsemirrorMapping } from '../../../types/ProsemirrorMapping.js'\nimport { getYType } from './getYType.js'\nimport { getYTypeSize } from './getYTypeSize.js'\n\nexport function getYContentOffset(\n type: AbsolutePosition['type'],\n index: number,\n mapping: ProsemirrorMapping,\n): number | null {\n let offset = 0\n let childIndex = 0\n let item = type._first\n\n while (childIndex < type._length && childIndex < index && item !== null) {\n const current = item\n item = item.right\n\n if (current.deleted) {\n continue\n }\n\n const child = getYType(current)\n\n if (child === null) {\n return null\n }\n\n const size = getYTypeSize(child, mapping)\n\n if (size === null) {\n return null\n }\n\n childIndex++\n offset += size\n }\n\n return offset\n}\n","import * as Y from 'yjs'\n\n/** Detects a text position that resolved outside its original block. */\nexport const isMisresolvedTextPosition = (\n y: Y.Doc,\n relPos: Y.RelativePosition,\n absPos: number | null,\n) => {\n if (absPos === null) {\n return false\n }\n const decoded = Y.createAbsolutePositionFromRelativePosition(relPos, y)\n // Yjs falls back to index 0 only when the text type itself was deleted.\n return (\n decoded !== null &&\n decoded.type instanceof Y.XmlText &&\n relPos.item !== null &&\n decoded.type._item?.deleted === true\n )\n}\n","import type { PositionMigration } from '../../../../types/PositionMigration.js'\nimport * as Y from 'yjs'\n\nexport const getPositionMigrationStore = (fragment: Y.XmlFragment) => {\n if (!fragment.doc) {\n throw new Error('The Yjs fragment must belong to a document')\n }\n\n const key = fragment._item\n ? `item:${fragment._item.id.client}:${fragment._item.id.clock}`\n : `root:${Y.findRootTypeKey(fragment)}`\n\n return fragment.doc.getMap(`__tiptap_position_migrations:${key}`)\n}\n","import type {\n PositionMigration,\n PositionMigrationCandidate,\n PositionMigrationIndex,\n PositionTransfer,\n} from '../../../../types/PositionMigration.js'\nimport type { RelativePosition, Map as YMap } from 'yjs'\n\nconst indexes = new WeakMap, PositionMigrationIndex>()\n\nexport const getPositionMigrationCandidates = (\n store: YMap,\n position: RelativePosition,\n) => {\n const identity = position.item ?? position.type\n\n if (!identity) {\n return []\n }\n\n let boundary: PositionTransfer['source']['boundary']\n\n if (!position.item) {\n boundary = position.assoc < 0 ? 'start' : 'end'\n }\n\n let index = indexes.get(store)\n\n // Migration records are append-only, so the map size detects index changes.\n if (!index || index.size !== store.size) {\n const clients = new Map()\n\n store.forEach(migration =>\n migration.transfers.forEach(transfer => {\n const candidates = clients.get(transfer.source.client) ?? []\n candidates.push({ migration, transfer })\n clients.set(transfer.source.client, candidates)\n }),\n )\n index = { size: store.size, clients }\n indexes.set(store, index)\n }\n\n const candidates = (index.clients.get(identity.client) ?? []).filter(\n ({ transfer }) =>\n transfer.source.boundary === boundary &&\n transfer.source.clock <= identity.clock &&\n identity.clock < transfer.source.clock + transfer.source.length,\n )\n\n // A causally later transfer supersedes earlier ones. Concurrent transfers remain candidates.\n return candidates.filter(\n candidate =>\n !candidates.some(\n other =>\n other.migration !== candidate.migration &&\n other.migration.seen.some(\n ([client, clock]) =>\n client === candidate.migration.client && clock > candidate.migration.clock,\n ),\n ),\n )\n}\n","import type { PositionMigrationCandidate } from '../../../../types/PositionMigration.js'\nimport * as Y from 'yjs'\nimport { getPositionMigrationStore } from './getPositionMigrationStore.js'\nimport { getPositionMigrationCandidates } from './getPositionMigrationCandidates.js'\n\nconst destination = (candidate: PositionMigrationCandidate, identity: Y.ID, assoc: number) => {\n const { source, target } = candidate.transfer\n\n if (!target) {\n return null\n }\n\n return new Y.RelativePosition(\n target.boundary ? Y.createID(target.client, target.clock) : target.type,\n target.tname ?? null,\n target.boundary\n ? null\n : Y.createID(target.client, target.clock + identity.clock - source.clock),\n target.assoc ?? assoc,\n )\n}\n\nconst commonDestination = (\n candidates: PositionMigrationCandidate[],\n identity: Y.ID,\n assoc: number,\n) => {\n const next = destination(candidates[0], identity, assoc)\n\n // Concurrent structural edits must agree on the destination.\n if (\n !next ||\n candidates.some(candidate => {\n const other = destination(candidate, identity, assoc)\n return !other || !Y.compareRelativePositions(next, other)\n })\n ) {\n return null\n }\n\n return next\n}\n\nconst positionIdentity = (position: Y.RelativePosition) => {\n const identity = position.item ?? position.type\n\n if (!identity) {\n return null\n }\n\n let boundary = position.assoc < 0 ? 'start' : 'end'\n\n if (position.item) {\n boundary = 'item'\n }\n\n return `${identity.client}:${identity.clock}:${boundary}`\n}\n\nexport const resolvePositionMigration = (fragment: Y.XmlFragment, position: Y.RelativePosition) => {\n const store = getPositionMigrationStore(fragment)\n const visited = new Set()\n let current = position\n let identity = current.item ?? current.type\n\n while (identity) {\n const key = positionIdentity(current)!\n\n if (visited.has(key)) {\n return null\n }\n\n visited.add(key)\n const candidates = getPositionMigrationCandidates(store, current)\n\n if (candidates.length === 0) {\n return current\n }\n\n const next = commonDestination(candidates, identity, current.assoc)\n\n if (!next) {\n return null\n }\n\n if (positionIdentity(next) === key) {\n return next\n }\n\n current = next\n identity = next.item ?? next.type\n }\n\n return current\n}\n","import type { ProsemirrorMapping } from '../../../types/ProsemirrorMapping.js'\nimport { getYParent } from './getYParent.js'\nimport * as Y from 'yjs'\nimport { getParentOffset } from './getParentOffset.js'\nimport { getYContentOffset } from './getYContentOffset.js'\nimport { isMisresolvedTextPosition } from './isMisresolvedTextPosition.js'\nimport { resolvePositionMigration } from './migrations/resolvePositionMigration.js'\n\n/** Resolves a Yjs relative position, returning null when it cannot be mapped. */\nexport const relativePositionToAbsolutePosition = (\n y: Y.Doc,\n documentType: Y.XmlFragment,\n relPos: Y.RelativePosition,\n mapping: ProsemirrorMapping,\n) => {\n // Structural edits may replace the XML item while persisted anchors keep its old ID.\n const migrated = resolvePositionMigration(documentType, relPos)\n\n if (!migrated) {\n return null\n }\n\n relPos = migrated\n const decodedPos = Y.createAbsolutePositionFromRelativePosition(relPos, y)\n if (\n decodedPos === null ||\n (decodedPos.type !== documentType && !Y.isParentOf(documentType, decodedPos.type._item))\n ) {\n return null\n }\n\n let type = decodedPos.type\n let pos = 0\n\n if (type.constructor === Y.XmlText) {\n pos = decodedPos.index\n } else if (!type._item?.deleted) {\n const offset = getYContentOffset(type, decodedPos.index, mapping)\n\n if (offset === null) {\n return null\n }\n\n pos = offset + 1\n }\n\n while (type !== documentType && type._item !== null) {\n const parent = getYParent(type._item)\n\n if (parent === null) {\n return null\n }\n\n if (parent._item?.deleted) {\n type = parent\n continue\n }\n\n const offset = getParentOffset(parent, type, mapping)\n\n if (offset === null) {\n return null\n }\n\n pos += offset + 1\n type = parent\n }\n\n // The root fragment has no opening token in ProseMirror's position space.\n const absPos = pos - 1\n\n if (isMisresolvedTextPosition(y, relPos, absPos)) {\n return null\n }\n\n return absPos\n}\n","import type { SyncPluginState } from '../../types/SyncPluginState.js'\nimport type { UndoPluginState } from '../../types/UndoPluginState.js'\nimport { PluginKey } from 'prosemirror-state'\nimport type { DecorationSet } from 'prosemirror-view'\nexport const ySyncPluginKey = new PluginKey('y-sync')\nexport const yUndoPluginKey = new PluginKey('y-undo')\nexport const yCursorPluginKey = new PluginKey('yjs-cursor')\n","import type { EditorView } from 'prosemirror-view'\nimport type { MetaKey } from '../../types/MetaKey.js'\nimport type { PendingMeta } from '../../types/PendingMeta.js'\nimport { timeout } from 'lib0/eventloop'\nimport { ySyncPluginKey } from './keys.js'\n\nlet viewsToUpdate: Map> | null = null\n\nfunction takePendingMetas(): PendingMeta[] {\n const pending = viewsToUpdate\n viewsToUpdate = null\n const entries: PendingMeta[] = []\n pending?.forEach((metas, view) => {\n metas.forEach((value, key) => entries.push({ view, key, value }))\n })\n return entries\n}\n\nfunction updateMetas(entries = takePendingMetas(), isRetry = false): void {\n let isFirst = true\n while (entries.length > 0) {\n const { view, key, value } = entries[0]\n try {\n const syncState = ySyncPluginKey.getState(view.state)\n if (syncState && syncState.binding.prosemirrorView !== null) {\n view.dispatch(view.state.tr.setMeta(key, value))\n }\n } catch (error) {\n if (!(error instanceof RangeError)) throw error\n // Drop a repeatedly stale entry so the remaining updates can run.\n if (isRetry && isFirst) entries.shift()\n if (entries.length > 0) timeout(0, () => updateMetas(entries, true))\n return\n }\n isFirst = false\n entries.shift()\n }\n}\n\n/** Queues plugin metadata and batches repeated updates for the same key. */\nexport function setMeta(view: EditorView, key: MetaKey, value: unknown): void {\n if (viewsToUpdate === null) {\n viewsToUpdate = new Map()\n timeout(0, updateMetas)\n }\n let metas = viewsToUpdate.get(view)\n if (!metas) {\n metas = new Map()\n viewsToUpdate.set(view, metas)\n }\n metas.set(key, value)\n}\n","import type { CursorAwarenessState } from '../../types/CursorAwarenessState.js'\nimport type { EditorState } from 'prosemirror-state'\nimport type { EditorView } from 'prosemirror-view'\nimport type { CursorUser } from '../../types/CursorUser.js'\nimport type { CursorPluginOptions } from '../../types/CursorPluginOptions.js'\nimport * as Y from 'yjs'\nimport { Decoration, DecorationSet } from 'prosemirror-view'\nimport { Plugin } from 'prosemirror-state'\nimport { Awareness } from 'y-protocols/awareness'\nimport { absolutePositionToRelativePosition } from '../utils/positions/absolutePositionToRelativePosition.js'\nimport { isStructuralTransaction } from '../utils/positions/isStructuralTransaction.js'\nimport { relativePositionToAbsolutePosition } from '../utils/positions/relativePositionToAbsolutePosition.js'\nimport { setMeta } from './setMeta.js'\nimport { yCursorPluginKey, ySyncPluginKey } from './keys.js'\nimport * as math from 'lib0/math'\nexport const defaultAwarenessStateFilter = (\n currentClientId: number,\n userClientId: number,\n _user: Record,\n) => currentClientId !== userClientId\n/** Creates the default remote cursor element from awareness user details. */\nexport const defaultCursorBuilder = (user: CursorUser) => {\n const cursor = document.createElement('span')\n\n cursor.classList.add('ProseMirror-yjs-cursor')\n cursor.setAttribute('style', `border-color: ${user.color}`)\n\n const userDiv = document.createElement('div')\n\n userDiv.setAttribute('style', `background-color: ${user.color}`)\n userDiv.insertBefore(document.createTextNode(user.name), null)\n\n const nonbreakingSpace1 = document.createTextNode('\\u2060')\n const nonbreakingSpace2 = document.createTextNode('\\u2060')\n\n cursor.insertBefore(nonbreakingSpace1, null)\n cursor.insertBefore(userDiv, null)\n cursor.insertBefore(nonbreakingSpace2, null)\n\n return cursor\n}\n/** Creates the default decoration attributes for a remote selection. */\nexport const defaultSelectionBuilder = (user: CursorUser) => {\n return {\n style: `background-color: ${user.color}70`,\n class: 'ProseMirror-yjs-selection',\n }\n}\nconst rxValidColor = /^#[0-9a-fA-F]{6}$/\nconst hasCursorUser = (user: Partial): user is CursorUser =>\n typeof user.name === 'string' && typeof user.color === 'string'\nexport const createDecorations = (\n state: EditorState,\n awareness: Awareness,\n awarenessFilter: NonNullable,\n createCursor: (user: CursorUser, clientId: number) => Element,\n createSelection: NonNullable,\n): DecorationSet => {\n const ystate = ySyncPluginKey.getState(state)\n\n if (ystate == null || ystate.doc == null || ystate.binding == null) {\n return DecorationSet.create(state.doc, [])\n }\n\n const y = ystate.doc\n const decorations: Decoration[] = []\n\n if (ystate.snapshot != null || ystate.prevSnapshot != null || ystate.binding.mapping.size === 0) {\n return DecorationSet.create(state.doc, [])\n }\n\n awareness.getStates().forEach((aw: CursorAwarenessState, clientId) => {\n if (!awarenessFilter(y.clientID, clientId, aw)) {\n return\n }\n\n if (aw && aw.cursor != null) {\n const user = { ...aw.user }\n\n if (user.color == null) {\n user.color = '#ffa500'\n } else if (!rxValidColor.test(user.color)) {\n console.warn('A user uses an unsupported color format', user)\n }\n\n if (user.name == null) {\n user.name = `User: ${clientId}`\n }\n\n if (!hasCursorUser(user)) {\n return\n }\n\n let anchor = relativePositionToAbsolutePosition(\n y,\n ystate.type,\n Y.createRelativePositionFromJSON(aw.cursor.anchor),\n ystate.binding.mapping,\n )\n let head = relativePositionToAbsolutePosition(\n y,\n ystate.type,\n Y.createRelativePositionFromJSON(aw.cursor.head),\n ystate.binding.mapping,\n )\n\n if (anchor !== null && head !== null) {\n const maxsize = math.max(state.doc.content.size - 1, 0)\n\n anchor = math.min(anchor, maxsize)\n head = math.min(head, maxsize)\n decorations.push(\n Decoration.widget(head, () => createCursor(user, clientId), {\n key: clientId + '',\n side: 10,\n }),\n )\n\n const from = math.min(anchor, head)\n const to = math.max(anchor, head)\n\n decorations.push(\n Decoration.inline(from, to, createSelection(user, clientId), {\n inclusiveEnd: true,\n inclusiveStart: false,\n }),\n )\n }\n }\n })\n\n return DecorationSet.create(state.doc, decorations)\n}\n/** Renders remote cursors and publishes the local selection through awareness. */\nexport const yCursorPlugin = (\n awareness: Awareness,\n {\n awarenessStateFilter = defaultAwarenessStateFilter,\n cursorBuilder = defaultCursorBuilder,\n selectionBuilder = defaultSelectionBuilder,\n getSelection = state => state.selection,\n }: CursorPluginOptions = {},\n cursorStateField: string = 'cursor',\n): Plugin =>\n new Plugin({\n key: yCursorPluginKey,\n state: {\n init(_, state) {\n return createDecorations(\n state,\n awareness,\n awarenessStateFilter,\n cursorBuilder,\n selectionBuilder,\n )\n },\n apply(tr, prevState, oldState, newState) {\n const ystate = ySyncPluginKey.getState(newState)\n const yCursorState = tr.getMeta(yCursorPluginKey)\n const isRemoteChange = ystate && ystate.isChangeOrigin\n\n if (tr.docChanged && !isRemoteChange && isStructuralTransaction(tr, oldState.doc)) {\n return DecorationSet.empty\n }\n\n if (isRemoteChange || (yCursorState && yCursorState.awarenessUpdated)) {\n return createDecorations(\n newState,\n awareness,\n awarenessStateFilter,\n cursorBuilder,\n selectionBuilder,\n )\n }\n\n if (tr.docChanged) {\n return prevState.map(tr.mapping, tr.doc)\n }\n\n return prevState\n },\n },\n props: {\n decorations: state => {\n return yCursorPluginKey.getState(state) ?? DecorationSet.empty\n },\n },\n view: view => {\n const awarenessListener = () => {\n if (!view.isDestroyed) {\n setMeta(view, yCursorPluginKey, { awarenessUpdated: true })\n }\n }\n const updateCursorInfo = (editorView: EditorView) => {\n const ystate = ySyncPluginKey.getState(editorView.state)\n\n if (!ystate || !ystate.binding || ystate.binding.projectionError !== null) {\n return\n }\n\n const current: CursorAwarenessState = awareness.getLocalState() || {}\n\n if (editorView.hasFocus()) {\n const selection = getSelection(editorView.state)\n const anchor: Y.RelativePosition = absolutePositionToRelativePosition(\n selection.anchor,\n ystate.type,\n ystate.binding.mapping,\n )\n const head: Y.RelativePosition = absolutePositionToRelativePosition(\n selection.head,\n ystate.type,\n ystate.binding.mapping,\n )\n\n if (\n current.cursor == null ||\n !Y.compareRelativePositions(\n Y.createRelativePositionFromJSON(current.cursor.anchor),\n anchor,\n ) ||\n !Y.compareRelativePositions(Y.createRelativePositionFromJSON(current.cursor.head), head)\n ) {\n awareness.setLocalStateField(cursorStateField, {\n anchor,\n head,\n })\n }\n } else if (\n current.cursor != null &&\n relativePositionToAbsolutePosition(\n ystate.doc,\n ystate.type,\n Y.createRelativePositionFromJSON(current.cursor.anchor),\n ystate.binding.mapping,\n ) !== null\n ) {\n awareness.setLocalStateField(cursorStateField, null)\n }\n }\n const onFocusChange = () => updateCursorInfo(view)\n\n awareness.on('change', awarenessListener)\n view.dom.addEventListener('focusin', onFocusChange)\n view.dom.addEventListener('focusout', onFocusChange)\n\n return {\n update: updateCursorInfo,\n destroy: () => {\n view.dom.removeEventListener('focusin', onFocusChange)\n view.dom.removeEventListener('focusout', onFocusChange)\n awareness.off('change', awarenessListener)\n awareness.setLocalStateField(cursorStateField, null)\n },\n }\n },\n })\n","import type { EditorState } from 'prosemirror-state'\nimport type { SyncPluginState } from '../../types/SyncPluginState.js'\nimport { ySyncPluginKey } from './keys.js'\n\nexport function getSyncPluginState(state: EditorState): SyncPluginState {\n const pluginState = ySyncPluginKey.getState(state)\n if (!pluginState) throw new Error('The editor requires ySyncPlugin')\n return pluginState\n}\n","import * as Y from 'yjs'\n\n/** Reports whether a Yjs item is visible in the current document or a snapshot. */\nexport const isVisible = (item: Y.Item, snapshot?: Y.Snapshot) =>\n snapshot === undefined\n ? !item.deleted\n : snapshot.sv.has(item.id.client) &&\n (snapshot.sv.get(item.id.client) ?? 0) > item.id.clock &&\n !Y.isDeleted(snapshot.ds, item.id)\n","import type { ColorDef } from '../../../types/ColorDef.js'\nimport * as set from 'lib0/set'\nimport * as random from 'lib0/random'\n\nexport const getUserColor = (\n colorMapping: Map,\n colors: ColorDef[],\n user: string | null,\n) => {\n if (!colorMapping.has(user)) {\n if (colorMapping.size < colors.length) {\n const usedColors = set.create()\n colorMapping.forEach(color => usedColors.add(color))\n colors = colors.filter(color => !usedColors.has(color))\n }\n colorMapping.set(user, random.oneOf(colors))\n }\n const color = colorMapping.get(user)\n if (!color) throw new Error('At least one snapshot color is required')\n return color\n}\n","export const attrsEqual = (a: Record, b: Record) => {\n if (a === b) {\n return true\n }\n const aKeys = Object.keys(a)\n return aKeys.length === Object.keys(b).length && aKeys.every(k => a[k] === b[k])\n}\n","import { Node } from 'prosemirror-model'\n\nexport const hasDistinctiveAttrs = (node: Node) => {\n const specAttrs = node.type.spec.attrs || {}\n return Object.keys(node.attrs).some(key => {\n const spec = specAttrs[key]\n return (\n spec == null ||\n !Object.prototype.hasOwnProperty.call(spec, 'default') ||\n spec.default !== node.attrs[key]\n )\n })\n}\n","import { attrsEqual } from './attrsEqual.js'\nimport { Node } from 'prosemirror-model'\nimport { hasDistinctiveAttrs } from './hasDistinctiveAttrs.js'\n\n/** Recovers a position in a moved block, returning null when the match is ambiguous. */\nexport const findAbsolutePositionAfterStructuralChange = (\n oldDoc: Node,\n newDoc: Node,\n absPos: number,\n): number | null => {\n let pos = 0\n let targetIdx = 0\n for (; targetIdx < oldDoc.childCount; targetIdx++) {\n const child = oldDoc.child(targetIdx)\n if (pos + child.nodeSize > absPos) {\n break\n }\n pos += child.nodeSize\n }\n if (targetIdx >= oldDoc.childCount) {\n return null\n }\n const targetChild = oldDoc.child(targetIdx)\n const $oldPos = oldDoc.resolve(absPos)\n const place = (newBlockStart: number, newBlock: Node) => {\n if ($oldPos.depth === 0) {\n const remapped = newBlockStart + (absPos - pos)\n const contentStart = newBlockStart + 1\n const contentEnd = newBlockStart + newBlock.nodeSize - 1\n return Math.max(contentStart, Math.min(remapped, contentEnd))\n }\n if ($oldPos.depth > 1) {\n const innerPosition = findAbsolutePositionAfterStructuralChange(\n $oldPos.node(1),\n newBlock,\n $oldPos.pos - $oldPos.start(1),\n )\n\n return innerPosition === null ? null : newBlockStart + 1 + innerPosition\n }\n\n if (!newBlock.isTextblock) {\n return null\n }\n\n return newBlockStart + 1 + Math.min($oldPos.parentOffset, newBlock.content.size)\n }\n const findByPredicate = (pred: (arg0: Node) => boolean, requireUnique: boolean = false) => {\n let occurrence = 0\n for (let i = 0; i <= targetIdx; i++) {\n if (pred(oldDoc.child(i))) {\n occurrence++\n }\n }\n let matchCount = 0\n let matchStart = -1\n let matchBlock = null\n let newPos = 0\n for (let i = 0; i < newDoc.childCount; i++) {\n const child = newDoc.child(i)\n if (pred(child)) {\n matchCount++\n if (matchCount === occurrence) {\n matchStart = newPos\n matchBlock = child\n }\n }\n newPos += child.nodeSize\n }\n if (matchBlock === null || (requireUnique && (occurrence !== 1 || matchCount !== 1))) {\n return null\n }\n return place(matchStart, matchBlock)\n }\n const sameTypeAndAttrs = (child: Node) =>\n child.type === targetChild.type && attrsEqual(child.attrs, targetChild.attrs)\n const oldText = targetChild.textContent\n const byAll = findByPredicate(child => sameTypeAndAttrs(child) && child.textContent === oldText)\n if (byAll !== null) {\n return byAll\n }\n const byText = findByPredicate(\n child => child.type === targetChild.type && child.textContent === oldText,\n )\n if (byText !== null) {\n return byText\n }\n if (!targetChild.isTextblock || hasDistinctiveAttrs(targetChild)) {\n const byAttrs = findByPredicate(sameTypeAndAttrs, true)\n if (byAttrs !== null) {\n return byAttrs\n }\n }\n return findByPredicate(\n child =>\n sameTypeAndAttrs(child) &&\n oldText !== '' &&\n child.textContent !== '' &&\n (oldText.startsWith(child.textContent) || child.textContent.startsWith(oldText)),\n true,\n )\n}\n","import { Node } from 'prosemirror-model'\nimport { attrsEqual } from './attrsEqual.js'\nimport { findAbsolutePositionAfterStructuralChange } from './findAbsolutePositionAfterStructuralChange.js'\n\n/** Detects a position that moved into a different block. */\nexport const isMisresolvedAfterStructuralChange = (\n oldDoc: Node,\n newDoc: Node,\n oldAbs: number,\n resolvedAbs: number | null,\n) => {\n if (resolvedAbs === null) {\n return false\n }\n const $old = oldDoc.resolve(oldAbs)\n const $new = newDoc.resolve(resolvedAbs)\n if (!$old.parent.isTextblock) {\n return false\n }\n if (!$new.parent.isTextblock) {\n return true\n }\n if ($old.parent.textContent !== $new.parent.textContent) {\n return true\n }\n if ($old.parentOffset !== 0 && $new.parentOffset === 0) {\n return true\n }\n const bothAtStart = $old.parentOffset === 0 && $new.parentOffset === 0\n const suspicious =\n $old.parentOffset !== $new.parentOffset ||\n $old.parent.type !== $new.parent.type ||\n !attrsEqual($old.parent.attrs, $new.parent.attrs)\n if (bothAtStart || suspicious) {\n const expected = findAbsolutePositionAfterStructuralChange(oldDoc, newDoc, oldAbs)\n return expected !== null && expected !== resolvedAbs\n }\n return false\n}\n","import type { RelativeSelection } from '../../../types/RelativeSelection.js'\nimport type { Transaction } from 'prosemirror-state'\nimport * as PModel from 'prosemirror-model'\nimport { AllSelection, Selection, TextSelection, NodeSelection } from 'prosemirror-state'\nimport { findAbsolutePositionAfterStructuralChange } from './findAbsolutePositionAfterStructuralChange.js'\nimport { isMisresolvedAfterStructuralChange } from './isMisresolvedAfterStructuralChange.js'\nimport { relativePositionToAbsolutePosition } from './relativePositionToAbsolutePosition.js'\nimport type { ProsemirrorBinding } from '../binding/ProsemirrorBinding.js'\nimport { resolvePositionMigration } from './migrations/resolvePositionMigration.js'\n\nconst recoverSelectionEndpoint = (\n newDoc: PModel.Node,\n oldDoc: PModel.Node,\n oldAbs: number | null | undefined,\n resolved: number | null,\n) => {\n if (oldAbs == null || oldAbs < 0 || oldAbs > oldDoc.content.size) {\n return resolved\n }\n const misresolved =\n resolved === null ||\n (oldAbs > 1 && resolved <= 1) ||\n isMisresolvedAfterStructuralChange(oldDoc, newDoc, oldAbs, resolved)\n if (!misresolved) {\n return resolved\n }\n const recovered = findAbsolutePositionAfterStructuralChange(oldDoc, newDoc, oldAbs)\n return recovered !== null ? recovered : resolved\n}\nexport const restoreRelativeSelection = (\n tr: Transaction,\n relSel: RelativeSelection | null,\n binding: ProsemirrorBinding,\n oldDoc?: PModel.Node,\n) => {\n if (relSel !== null && relSel.anchor !== null && relSel.head !== null) {\n if (relSel.type === 'all') {\n tr.setSelection(new AllSelection(tr.doc))\n } else if (relSel.type === 'node') {\n const anchor = relativePositionToAbsolutePosition(\n binding.doc,\n binding.type,\n relSel.anchor,\n binding.mapping,\n )\n if (anchor !== null) {\n tr.setSelection(createSafeNodeSelection(tr, anchor))\n }\n } else if (relSel.type === 'nodeRange') {\n const anchor = relativePositionToAbsolutePosition(\n binding.doc,\n binding.type,\n relSel.anchor,\n binding.mapping,\n )\n const head = relativePositionToAbsolutePosition(\n binding.doc,\n binding.type,\n relSel.head,\n binding.mapping,\n )\n const selection = createSafeNodeRangeSelection(tr, anchor, head, relSel.depth)\n if (selection !== null) {\n tr.setSelection(selection)\n }\n } else {\n let anchor = relativePositionToAbsolutePosition(\n binding.doc,\n binding.type,\n relSel.anchor,\n binding.mapping,\n )\n let head = relativePositionToAbsolutePosition(\n binding.doc,\n binding.type,\n relSel.head,\n binding.mapping,\n )\n if (oldDoc != null) {\n // Content-based recovery must not override an identity transfer or its conflict result.\n if (resolvePositionMigration(binding.type, relSel.anchor) === relSel.anchor) {\n anchor = recoverSelectionEndpoint(tr.doc, oldDoc, relSel.absAnchor, anchor)\n }\n\n if (resolvePositionMigration(binding.type, relSel.head) === relSel.head) {\n head = recoverSelectionEndpoint(tr.doc, oldDoc, relSel.absHead, head)\n }\n }\n if (anchor === null) {\n anchor = head\n }\n if (head === null) {\n head = anchor\n }\n if (anchor !== null && head !== null) {\n tr.setSelection(TextSelection.between(tr.doc.resolve(anchor), tr.doc.resolve(head)))\n }\n }\n }\n}\nconst createSafeNodeSelection = (tr: Transaction, pos: number) => {\n const $pos = tr.doc.resolve(pos)\n if ($pos.nodeAfter) {\n return NodeSelection.create(tr.doc, pos)\n } else {\n return TextSelection.near($pos)\n }\n}\nconst createSafeNodeRangeSelection = (\n tr: Transaction,\n anchor: number | null,\n head: number | null,\n depth: number | undefined,\n) => {\n if (anchor === null || head === null) {\n return null\n }\n const clampedAnchor = Math.min(Math.max(anchor, 0), tr.doc.content.size)\n const clampedHead = Math.min(Math.max(head, 0), tr.doc.content.size)\n try {\n const selection = Selection.fromJSON(tr.doc, {\n type: 'nodeRange',\n anchor: clampedAnchor,\n head: clampedHead,\n depth,\n })\n if (!selection.ranges.length) {\n return TextSelection.near(tr.doc.resolve(clampedAnchor))\n }\n return selection\n } catch {\n return TextSelection.near(tr.doc.resolve(clampedAnchor))\n }\n}\n","import type { RelativeSelection } from '../../../types/RelativeSelection.js'\nimport type { EditorState } from 'prosemirror-state'\nimport { absolutePositionToRelativePosition } from './absolutePositionToRelativePosition.js'\nimport type { ProsemirrorBinding } from '../binding/ProsemirrorBinding.js'\n\n/** Captures the current selection as Yjs relative positions and absolute fallback positions. */\nexport const getRelativeSelection = (\n pmbinding: ProsemirrorBinding,\n state: EditorState,\n): RelativeSelection => {\n const selection = state.selection\n const json: Record = selection.toJSON()\n const type = typeof json.type === 'string' ? json.type : 'text'\n return {\n type,\n depth:\n type === 'nodeRange' && 'depth' in selection && typeof selection.depth === 'number'\n ? selection.depth\n : undefined,\n anchor: absolutePositionToRelativePosition(\n state.selection.anchor,\n pmbinding.type,\n pmbinding.mapping,\n ),\n head: absolutePositionToRelativePosition(\n state.selection.head,\n pmbinding.type,\n pmbinding.mapping,\n ),\n absAnchor: state.selection.anchor,\n absHead: state.selection.head,\n }\n}\n","import type { Node } from 'prosemirror-model'\nimport type { ProsemirrorMapping } from '../../../types/ProsemirrorMapping.js'\nimport type { YType } from '../../../types/YType.js'\n\nexport const projectedMappings = new WeakMap>()\n","const hashedMarkNameRegex = /(.*)(--[a-zA-Z0-9+/=]{8})$/\nexport const yattr2markname = (attrName: string) =>\n hashedMarkNameRegex.exec(attrName)?.[1] ?? attrName\n","import * as PModel from 'prosemirror-model'\nimport { yattr2markname } from './yattr2markname.js'\n\nexport const attributesToMarks = (\n attrs: Record> | undefined,\n schema: PModel.Schema,\n) => {\n const marks: PModel.Mark[] = []\n for (const markName in attrs) {\n marks.push(schema.mark(yattr2markname(markName), attrs[markName]))\n }\n return marks\n}\n","import type { TextDelta } from '../../../types/TextDelta.js'\nimport type { BindingMetadata } from '../../../types/BindingMetadata.js'\nimport type { ComputeYChange } from '../../../types/YChange.js'\nimport * as PModel from 'prosemirror-model'\nimport * as Y from 'yjs'\nimport { attributesToMarks } from './attributesToMarks.js'\n\nexport const createTextNodesFromYText = (\n text: Y.XmlText,\n schema: PModel.Schema,\n _meta: BindingMetadata,\n snapshot?: Y.Snapshot,\n prevSnapshot?: Y.Snapshot,\n computeYChange?: ComputeYChange,\n) => {\n const deltas: TextDelta[] = text.toDelta(snapshot, prevSnapshot, computeYChange)\n return deltas.map(delta => schema.text(delta.insert, attributesToMarks(delta.attributes, schema)))\n}\n","import type { BindingMetadata } from '../../../types/BindingMetadata.js'\nimport type { ComputeYChange } from '../../../types/YChange.js'\nimport * as PModel from 'prosemirror-model'\nimport * as Y from 'yjs'\nimport { isVisible } from '../binding/isVisible.js'\nimport { projectedMappings } from '../binding/projectedMappings.js'\n\nimport { createTextNodesFromYText } from './createTextNodesFromYText.js'\n\nexport const createNodeFromYElement = (\n el: Y.XmlElement<{ [key: string]: string }>,\n schema: PModel.Schema,\n meta: BindingMetadata,\n snapshot?: Y.Snapshot,\n prevSnapshot?: Y.Snapshot,\n computeYChange?: ComputeYChange,\n) => {\n const cachedNode = meta.mapping.get(el)\n\n // Local nodes need projection checks to preserve overlapping mark order.\n if (\n cachedNode !== undefined &&\n !Array.isArray(cachedNode) &&\n projectedMappings.get(meta.mapping)?.get(el) === cachedNode\n ) {\n return cachedNode\n }\n\n const children: PModel.Node[] = []\n const createChildren = (type: Y.XmlElement | Y.XmlText | Y.XmlHook) => {\n if (type instanceof Y.XmlElement) {\n children.push(\n createNodeFromYElement(type, schema, meta, snapshot, prevSnapshot, computeYChange),\n )\n } else if (type instanceof Y.XmlText) {\n children.push(\n ...createTextNodesFromYText(type, schema, meta, snapshot, prevSnapshot, computeYChange),\n )\n } else {\n throw new Error('Cannot project a Yjs XML hook')\n }\n }\n if (snapshot === undefined || prevSnapshot === undefined) {\n el.toArray().forEach(createChildren)\n } else {\n Y.typeListToArraySnapshot(el, new Y.Snapshot(prevSnapshot.ds, snapshot.sv)).forEach(\n createChildren,\n )\n }\n const attrs: Record = el.getAttributes(snapshot)\n if (snapshot !== undefined && el._item) {\n if (!isVisible(el._item, snapshot)) {\n attrs.ychange = computeYChange ? computeYChange('removed', el._item.id) : { type: 'removed' }\n } else if (!isVisible(el._item, prevSnapshot)) {\n attrs.ychange = computeYChange ? computeYChange('added', el._item.id) : { type: 'added' }\n }\n }\n let node = schema.node(el.nodeName, attrs, children)\n if (cachedNode !== undefined && !Array.isArray(cachedNode) && cachedNode.eq(node)) {\n node = cachedNode\n }\n\n meta.mapping.set(el, node)\n let projectedNodes = projectedMappings.get(meta.mapping)\n\n if (projectedNodes === undefined) {\n projectedNodes = new WeakMap()\n projectedMappings.set(meta.mapping, projectedNodes)\n }\n\n projectedNodes.set(el, node)\n return node\n}\n","import type { Fragment, Schema } from 'prosemirror-model'\n\nexport const validateDocumentContent = (content: Fragment, schema: Schema) => {\n // Empty shared fragments use the editor's placeholder document.\n if (content.childCount > 0 && !schema.topNodeType.validContent(content)) {\n throw new RangeError('Shared content does not fit the document schema')\n }\n}\n","import * as sha256 from 'lib0/hash/sha256'\nimport * as buf from 'lib0/buffer'\nconst foldDigest = (digest: Uint8Array) => {\n const hashBytes = 6\n for (let i = hashBytes; i < digest.length; i++) {\n digest[i % hashBytes] = digest[i % hashBytes] ^ digest[i]\n }\n return digest.slice(0, hashBytes)\n}\nexport const hashOfJSON = (json: unknown) =>\n buf.toBase64(foldDigest(sha256.digest(buf.encodeAny(json))))\n","import type { BindingMetadata } from '../../../types/BindingMetadata.js'\nimport * as PModel from 'prosemirror-model'\nimport * as map from 'lib0/map'\nimport * as utils from './hashOfJSON.js'\n\nexport const marksToAttributes = (marks: readonly PModel.Mark[], meta: BindingMetadata) => {\n const pattrs: Record> = {}\n marks.forEach(mark => {\n if (mark.type.name !== 'ychange') {\n const isOverlapping = map.setIfUndefined(\n meta.isOMark,\n mark.type,\n () => !mark.type.excludes(mark.type),\n )\n // Distinct keys preserve overlapping marks of the same type with different attributes.\n pattrs[\n isOverlapping ? `${mark.type.name}--${utils.hashOfJSON(mark.toJSON())}` : mark.type.name\n ] = mark.attrs\n }\n })\n return pattrs\n}\n","import type { BindingMetadata } from '../../../types/BindingMetadata.js'\nimport * as PModel from 'prosemirror-model'\nimport * as Y from 'yjs'\nimport { marksToAttributes } from './marksToAttributes.js'\n\nexport const createTypeFromTextNodes = (nodes: PModel.Node[], meta: BindingMetadata) => {\n const type = new Y.XmlText()\n const delta = nodes.map(node => ({\n insert: node.text ?? '',\n attributes: marksToAttributes(node.marks, meta),\n }))\n type.applyDelta(delta)\n meta.mapping.set(type, nodes)\n return type\n}\n","import type { NormalizedPNodeContent } from '../../../types/NormalizedPNodeContent.js'\nimport * as PModel from 'prosemirror-model'\n\nexport const normalizePNodeContent = (pnode: PModel.Node) => {\n const c = pnode.content.content\n const res: NormalizedPNodeContent = []\n for (let i = 0; i < c.length; i++) {\n const n = c[i]\n if (n.isText) {\n // Adjacent ProseMirror text nodes share one Y.XmlText, even with different marks.\n const textNodes = []\n for (let tnode = c[i]; i < c.length && tnode.isText; tnode = c[++i]) {\n textNodes.push(tnode)\n }\n i--\n res.push(textNodes)\n } else {\n res.push(n)\n }\n }\n return res\n}\n","import * as Y from 'yjs'\nimport type { BindingMetadata } from '../../../types/BindingMetadata.js'\nimport * as PModel from 'prosemirror-model'\nimport { createTypeFromTextNodes } from './createTypeFromTextNodes.js'\nimport { normalizePNodeContent } from './normalizePNodeContent.js'\n\nexport const createTypeFromTextOrElementNode = (\n node: PModel.Node | PModel.Node[],\n meta: BindingMetadata,\n) =>\n node instanceof Array\n ? createTypeFromTextNodes(node, meta)\n : createTypeFromElementNode(node, meta)\n\nconst createTypeFromElementNode = (node: PModel.Node, meta: BindingMetadata) => {\n const type = new Y.XmlElement(node.type.name)\n for (const key in node.attrs) {\n const val = node.attrs[key]\n if (val !== null && key !== 'ychange') {\n type.setAttribute(key, val)\n }\n }\n type.insert(\n 0,\n normalizePNodeContent(node).map(n => createTypeFromTextOrElementNode(n, meta)),\n )\n meta.mapping.set(type, node)\n return type\n}\n","export const isObject = (val: unknown): val is Record =>\n typeof val === 'object' && val !== null\n","import { isObject } from './isObject.js'\n\nexport const equalAttrs = (pattrs: Record, yattrs: Record) => {\n const keys = Object.keys(pattrs).filter(key => pattrs[key] !== null)\n let eq = keys.length === Object.keys(yattrs).filter(key => yattrs[key] !== null).length\n for (let i = 0; i < keys.length && eq; i++) {\n const key = keys[i]\n const l = pattrs[key]\n const r = yattrs[key]\n eq = key === 'ychange' || l === r || (isObject(l) && isObject(r) && equalAttrs(l, r))\n }\n return eq\n}\n","import type { TextDelta } from '../../../types/TextDelta.js'\nimport * as PModel from 'prosemirror-model'\nimport * as object from 'lib0/object'\nimport * as Y from 'yjs'\nimport { equalAttrs } from './equalAttrs.js'\nimport { yattr2markname } from '../conversion/yattr2markname.js'\n\nexport const equalYTextPText = (ytext: Y.XmlText, ptexts: PModel.Node[]) => {\n const delta: TextDelta[] = ytext.toDelta()\n return (\n delta.length === ptexts.length &&\n delta.every(\n (d, i) =>\n d.insert === ptexts[i].text &&\n object.keys(d.attributes || {}).length === ptexts[i].marks.length &&\n Object.entries(d.attributes ?? {}).every(([yattrname, attr]) => {\n const markname = yattr2markname(yattrname)\n const pmarks = ptexts[i].marks\n const pmark = pmarks.find((mark: PModel.Mark) => mark.type.name === markname)\n if (!pmark) {\n return false\n }\n return equalAttrs(attr, pmark.attrs)\n }),\n )\n )\n}\n","import * as PModel from 'prosemirror-model'\nimport * as Y from 'yjs'\n\nexport const matchNodeName = (\n yElement: Y.XmlElement<{ [key: string]: string }>,\n pNode: PModel.Node | PModel.Node[],\n) => !(pNode instanceof Array) && yElement.nodeName === pNode.type.name\n","import * as PModel from 'prosemirror-model'\nimport * as Y from 'yjs'\nimport { equalAttrs } from './equalAttrs.js'\nimport { normalizePNodeContent } from '../conversion/normalizePNodeContent.js'\nimport { equalYTextPText } from './equalYTextPText.js'\nimport { matchNodeName } from './matchNodeName.js'\n\nexport const equalYTypePNode = (\n ytype: Y.XmlElement<{ [key: string]: string }> | Y.XmlHook | Y.XmlText,\n pnode: PModel.Node | PModel.Node[],\n): boolean => {\n if (ytype instanceof Y.XmlElement && !(pnode instanceof Array) && matchNodeName(ytype, pnode)) {\n const normalizedContent = normalizePNodeContent(pnode)\n return (\n ytype._length === normalizedContent.length &&\n equalAttrs(ytype.getAttributes(), pnode.attrs) &&\n ytype.toArray().every((ychild, i) => equalYTypePNode(ychild, normalizedContent[i]))\n )\n }\n return ytype instanceof Y.XmlText && pnode instanceof Array && equalYTextPText(ytype, pnode)\n}\n","import * as PModel from 'prosemirror-model'\n\nexport const mappedIdentity = (\n mapped: PModel.Node | PModel.Node[] | undefined,\n pcontent: PModel.Node | PModel.Node[],\n) =>\n mapped === pcontent ||\n (mapped instanceof Array &&\n pcontent instanceof Array &&\n mapped.length === pcontent.length &&\n mapped.every((a, i) => pcontent[i] === a))\n","import type { BindingMetadata } from '../../../types/BindingMetadata.js'\nimport type { NormalizedPNodeContent } from '../../../types/NormalizedPNodeContent.js'\nimport type { MappedChildAnchor } from '../../../types/MappedChildAnchor.js'\nimport * as PModel from 'prosemirror-model'\nimport * as Y from 'yjs'\nimport { mappedIdentity } from './mappedIdentity.js'\n\nexport const findMappedChildAnchors = (\n yChildren: (Y.XmlElement<{ [key: string]: string }> | Y.XmlHook | Y.XmlText)[],\n pChildren: NormalizedPNodeContent,\n meta: BindingMetadata,\n) => {\n const pChildIndices = new Map()\n pChildren.forEach((pChild, index) => {\n if (!pChildIndices.has(pChild)) {\n pChildIndices.set(pChild, index)\n }\n })\n const candidates: MappedChildAnchor[] = []\n yChildren.forEach((yChild, yIndex) => {\n const mapped = meta.mapping.get(yChild)\n const pIndex = mapped === undefined ? undefined : pChildIndices.get(mapped)\n if (pIndex !== undefined && mappedIdentity(mapped, pChildren[pIndex])) {\n candidates.push({ yIndex, pIndex, yChild })\n }\n })\n if (candidates.length === 0) {\n return []\n }\n // The longest increasing subsequence keeps the most mapped children in their shared order.\n const predecessors: number[] = []\n const tails: number[] = []\n for (let index = 0; index < candidates.length; index++) {\n let low = 0\n let high = tails.length\n while (low < high) {\n const middle = (low + high) >> 1\n if (candidates[tails[middle]].pIndex < candidates[index].pIndex) {\n low = middle + 1\n } else {\n high = middle\n }\n }\n predecessors[index] = low > 0 ? tails[low - 1] : -1\n tails[low] = index\n }\n const anchors: MappedChildAnchor[] = []\n for (let index = tails[tails.length - 1]; index !== -1; index = predecessors[index]) {\n anchors.push(candidates[index])\n }\n return anchors.reverse()\n}\n","import * as Y from 'yjs'\n\nexport const ytextTrans = (ytext: Y.Text) => {\n let str = ''\n let n: Y.Item | null = ytext._start\n // Explicit nulls let the next delta clear marks that no longer exist in ProseMirror.\n const nAttrs: Record = {}\n while (n !== null) {\n if (!n.deleted) {\n if (n.countable && n.content instanceof Y.ContentString) {\n str += n.content.str\n } else if (n.content instanceof Y.ContentFormat) {\n nAttrs[n.content.key] = null\n }\n }\n n = n.right\n }\n return {\n str,\n nAttrs,\n }\n}\n","import type { BindingMetadata } from '../../../types/BindingMetadata.js'\nimport * as PModel from 'prosemirror-model'\nimport { simpleDiff } from 'lib0/diff'\nimport * as Y from 'yjs'\nimport { ytextTrans } from './ytextTrans.js'\nimport { marksToAttributes } from '../conversion/marksToAttributes.js'\n\nexport const updateYText = (ytext: Y.Text, ptexts: PModel.Node[], meta: BindingMetadata) => {\n meta.mapping.set(ytext, ptexts)\n const { nAttrs, str } = ytextTrans(ytext)\n const content = ptexts.map(p => ({\n insert: p.text ?? '',\n attributes: Object.assign({}, nAttrs, marksToAttributes(p.marks, meta)),\n }))\n const { insert, remove, index } = simpleDiff(str, content.map(c => c.insert).join(''))\n ytext.delete(index, remove)\n ytext.insert(index, insert)\n ytext.applyDelta(content.map(c => ({ retain: c.insert.length, attributes: c.attributes })))\n}\n","import type { FragmentUpdater } from '../../../types/FragmentUpdater.js'\nimport type { BindingMetadata } from '../../../types/BindingMetadata.js'\nimport type { TransactionSource } from '../../../types/TransactionSource.js'\nimport * as PModel from 'prosemirror-model'\nimport * as Y from 'yjs'\nimport { equalYTextPText } from './equalYTextPText.js'\nimport { equalYTypePNode } from './equalYTypePNode.js'\nimport { updateYText } from './updateYText.js'\n\nimport { matchNodeName } from './matchNodeName.js'\n\nexport const updateMatchingYChild = (\n y: TransactionSource,\n yChild: Y.XmlElement<{ [key: string]: string }> | Y.XmlHook | Y.XmlText,\n pChild: PModel.Node | PModel.Node[],\n meta: BindingMetadata,\n updateFragment: FragmentUpdater,\n) => {\n if (yChild instanceof Y.XmlText && pChild instanceof Array) {\n if (equalYTextPText(yChild, pChild)) {\n meta.mapping.set(yChild, pChild)\n } else {\n updateYText(yChild, pChild, meta)\n }\n return true\n }\n if (\n yChild instanceof Y.XmlElement &&\n !(pChild instanceof Array) &&\n matchNodeName(yChild, pChild)\n ) {\n if (equalYTypePNode(yChild, pChild)) {\n meta.mapping.set(yChild, pChild)\n } else {\n updateFragment(y, yChild, pChild, meta)\n }\n return true\n }\n return false\n}\n","import type { ProsemirrorMapping } from '../../../types/ProsemirrorMapping.js'\nimport * as Y from 'yjs'\nimport { projectedMappings } from './projectedMappings.js'\n\nexport const deleteMapping = (mapping: ProsemirrorMapping, type: unknown) => {\n if (!(type instanceof Y.XmlFragment || type instanceof Y.Text || type instanceof Y.XmlHook)) {\n return\n }\n\n mapping.delete(type)\n projectedMappings.get(mapping)?.delete(type)\n}\n","import type { BindingMetadata } from '../../../types/BindingMetadata.js'\nimport * as Y from 'yjs'\nimport { deleteMapping } from '../binding/deleteMapping.js'\n\nexport const deleteYChildren = (\n yDomFragment: Y.XmlFragment,\n index: number,\n length: number,\n meta: BindingMetadata,\n) => {\n if (length > 0) {\n yDomFragment.slice(index, index + length).forEach(type => deleteMapping(meta.mapping, type))\n yDomFragment.delete(index, length)\n }\n}\n","import type { BindingMetadata } from '../../../types/BindingMetadata.js'\nimport type { NormalizedPNodeContent } from '../../../types/NormalizedPNodeContent.js'\nimport * as Y from 'yjs'\nimport { createTypeFromTextOrElementNode } from '../conversion/createTypeFromTextOrElementNode.js'\n\nexport const insertPChildren = (\n yDomFragment: Y.XmlFragment,\n index: number,\n pChildren: NormalizedPNodeContent,\n start: number,\n end: number,\n meta: BindingMetadata,\n) => {\n if (start < end) {\n const children = []\n for (let childIndex = start; childIndex < end; childIndex++) {\n children.push(createTypeFromTextOrElementNode(pChildren[childIndex], meta))\n }\n yDomFragment.insert(index, children)\n }\n}\n","import type { FragmentUpdater } from '../../../types/FragmentUpdater.js'\nimport type { BindingMetadata } from '../../../types/BindingMetadata.js'\nimport type { NormalizedPNodeContent } from '../../../types/NormalizedPNodeContent.js'\nimport type { TransactionSource } from '../../../types/TransactionSource.js'\nimport * as math from 'lib0/math'\nimport * as Y from 'yjs'\nimport { deleteYChildren } from './deleteYChildren.js'\nimport { insertPChildren } from './insertPChildren.js'\nimport { updateMatchingYChild } from './updateMatchingYChild.js'\n\nexport const reconcileUnanchoredChildren = (\n y: TransactionSource,\n yDomFragment: Y.XmlFragment,\n pChildren: NormalizedPNodeContent,\n yChildren: (Y.XmlElement<{ [key: string]: string }> | Y.XmlHook | Y.XmlText)[],\n yStart: number,\n yEnd: number,\n pStart: number,\n pEnd: number,\n meta: BindingMetadata,\n updateFragment: FragmentUpdater,\n) => {\n const matchingChildren = math.min(yEnd - yStart, pEnd - pStart)\n for (let index = 0; index < matchingChildren; index++) {\n const yChild = yChildren[yStart + index]\n const pChild = pChildren[pStart + index]\n if (!updateMatchingYChild(y, yChild, pChild, meta, updateFragment)) {\n deleteYChildren(yDomFragment, pStart + index, 1, meta)\n insertPChildren(\n yDomFragment,\n pStart + index,\n pChildren,\n pStart + index,\n pStart + index + 1,\n meta,\n )\n }\n }\n deleteYChildren(yDomFragment, pStart + matchingChildren, yEnd - yStart - matchingChildren, meta)\n insertPChildren(\n yDomFragment,\n pStart + matchingChildren,\n pChildren,\n pStart + matchingChildren,\n pEnd,\n meta,\n )\n}\n","import type { FragmentUpdater } from '../../../types/FragmentUpdater.js'\nimport type { BindingMetadata } from '../../../types/BindingMetadata.js'\nimport type { NormalizedPNodeContent } from '../../../types/NormalizedPNodeContent.js'\nimport type { TransactionSource } from '../../../types/TransactionSource.js'\nimport * as Y from 'yjs'\nimport { findMappedChildAnchors } from './findMappedChildAnchors.js'\nimport { updateMatchingYChild } from './updateMatchingYChild.js'\nimport { reconcileUnanchoredChildren } from './reconcileUnanchoredChildren.js'\n\nexport const reconcileMappedChildren = (\n y: TransactionSource,\n yDomFragment: Y.XmlFragment,\n pChildren: NormalizedPNodeContent,\n yChildren: (Y.XmlElement<{ [key: string]: string }> | Y.XmlHook | Y.XmlText)[],\n meta: BindingMetadata,\n updateFragment: FragmentUpdater,\n) => {\n const anchors = findMappedChildAnchors(yChildren, pChildren, meta)\n if (\n anchors.length < 2 ||\n !anchors.some(anchor => anchor.yIndex !== anchor.pIndex) ||\n anchors.some(anchor => {\n const pChild = pChildren[anchor.pIndex]\n return !(\n (anchor.yChild instanceof Y.XmlText && pChild instanceof Array) ||\n (anchor.yChild instanceof Y.XmlElement && !(pChild instanceof Array))\n )\n })\n ) {\n return false\n }\n let yIndex = 0\n let pIndex = 0\n for (const anchor of anchors) {\n reconcileUnanchoredChildren(\n y,\n yDomFragment,\n pChildren,\n yChildren,\n yIndex,\n anchor.yIndex,\n pIndex,\n anchor.pIndex,\n meta,\n updateFragment,\n )\n const pChild = pChildren[anchor.pIndex]\n updateMatchingYChild(y, anchor.yChild, pChild, meta, updateFragment)\n yIndex = anchor.yIndex + 1\n pIndex = anchor.pIndex + 1\n }\n reconcileUnanchoredChildren(\n y,\n yDomFragment,\n pChildren,\n yChildren,\n yIndex,\n yChildren.length,\n pIndex,\n pChildren.length,\n meta,\n updateFragment,\n )\n return true\n}\n","import type { BindingMetadata } from '../../../types/BindingMetadata.js'\nimport * as PModel from 'prosemirror-model'\nimport * as math from 'lib0/math'\nimport * as Y from 'yjs'\nimport { normalizePNodeContent } from '../conversion/normalizePNodeContent.js'\nimport { equalYTypePNode } from './equalYTypePNode.js'\nimport { mappedIdentity } from './mappedIdentity.js'\n\nexport const computeChildEqualityFactor = (\n ytype: Y.XmlElement<{ [key: string]: string }>,\n pnode: PModel.Node,\n meta: BindingMetadata,\n) => {\n const yChildren = ytype.toArray()\n const pChildren = normalizePNodeContent(pnode)\n const pChildCnt = pChildren.length\n const yChildCnt = yChildren.length\n const minCnt = math.min(yChildCnt, pChildCnt)\n let left = 0\n let right = 0\n let foundMappedChild = false\n for (; left < minCnt; left++) {\n const leftY = yChildren[left]\n const leftP = pChildren[left]\n if (mappedIdentity(meta.mapping.get(leftY), leftP)) {\n foundMappedChild = true\n } else if (!equalYTypePNode(leftY, leftP)) {\n break\n }\n }\n for (; left + right < minCnt; right++) {\n const rightY = yChildren[yChildCnt - right - 1]\n const rightP = pChildren[pChildCnt - right - 1]\n if (mappedIdentity(meta.mapping.get(rightY), rightP)) {\n foundMappedChild = true\n } else if (!equalYTypePNode(rightY, rightP)) {\n break\n }\n }\n return {\n equalityFactor: left + right,\n foundMappedChild,\n }\n}\n","import type { BindingMetadata } from '../../../types/BindingMetadata.js'\nimport type { TransactionSource } from '../../../types/TransactionSource.js'\nimport * as PModel from 'prosemirror-model'\nimport * as math from 'lib0/math'\nimport { ySyncPluginKey } from '../../plugins/keys.js'\nimport * as Y from 'yjs'\nimport { createTypeFromTextOrElementNode } from '../conversion/createTypeFromTextOrElementNode.js'\nimport { normalizePNodeContent } from '../conversion/normalizePNodeContent.js'\nimport { equalYTextPText } from './equalYTextPText.js'\nimport { equalYTypePNode } from './equalYTypePNode.js'\nimport { mappedIdentity } from './mappedIdentity.js'\nimport { reconcileMappedChildren } from './reconcileMappedChildren.js'\nimport { computeChildEqualityFactor } from './computeChildEqualityFactor.js'\nimport { updateYText } from './updateYText.js'\nimport { matchNodeName } from './matchNodeName.js'\nimport { deleteMapping } from '../binding/deleteMapping.js'\n\n/** Updates a Yjs XML fragment to match a ProseMirror node while preserving mapped children. */\nexport const updateYFragment = (\n y: TransactionSource,\n yDomFragment: Y.XmlFragment,\n pNode: PModel.Node,\n meta: BindingMetadata,\n) => {\n if (yDomFragment instanceof Y.XmlElement && yDomFragment.nodeName !== pNode.type.name) {\n throw new Error('node name mismatch!')\n }\n\n meta.mapping.set(yDomFragment, pNode)\n\n if (yDomFragment instanceof Y.XmlElement) {\n const yDomAttrs = yDomFragment.getAttributes()\n const pAttrs = pNode.attrs\n\n for (const key in pAttrs) {\n if (pAttrs[key] === null) {\n yDomFragment.removeAttribute(key)\n continue\n }\n\n if (yDomAttrs[key] !== pAttrs[key] && key !== 'ychange') {\n yDomFragment.setAttribute(key, pAttrs[key])\n }\n }\n\n for (const key in yDomAttrs) {\n if (pAttrs[key] === undefined) {\n yDomFragment.removeAttribute(key)\n }\n }\n }\n\n const pChildren = normalizePNodeContent(pNode)\n const pChildCnt = pChildren.length\n const yChildren = yDomFragment.toArray()\n const yChildCnt = yChildren.length\n const minCnt = math.min(pChildCnt, yChildCnt)\n\n let reconciled = false\n\n y.transact(() => {\n reconciled = reconcileMappedChildren(\n y,\n yDomFragment,\n pChildren,\n yChildren,\n meta,\n updateYFragment,\n )\n }, ySyncPluginKey)\n\n if (reconciled) {\n return\n }\n\n let left = 0\n let right = 0\n\n for (; left < minCnt; left++) {\n const leftY = yChildren[left]\n const leftP = pChildren[left]\n\n if (mappedIdentity(meta.mapping.get(leftY), leftP)) {\n continue\n }\n\n if (!equalYTypePNode(leftY, leftP)) {\n break\n }\n\n meta.mapping.set(leftY, leftP)\n }\n\n for (; right + left + 1 < minCnt; right++) {\n const rightY = yChildren[yChildCnt - right - 1]\n const rightP = pChildren[pChildCnt - right - 1]\n\n if (mappedIdentity(meta.mapping.get(rightY), rightP)) {\n continue\n }\n\n if (!equalYTypePNode(rightY, rightP)) {\n break\n }\n\n meta.mapping.set(rightY, rightP)\n }\n\n y.transact(() => {\n while (yChildCnt - left - right > 0 && pChildCnt - left - right > 0) {\n const leftY = yChildren[left]\n const leftP = pChildren[left]\n const rightY = yChildren[yChildCnt - right - 1]\n const rightP = pChildren[pChildCnt - right - 1]\n\n if (leftY instanceof Y.XmlText && leftP instanceof Array) {\n if (!equalYTextPText(leftY, leftP)) {\n updateYText(leftY, leftP, meta)\n }\n\n left += 1\n continue\n }\n\n let updateLeft = leftY instanceof Y.XmlElement && matchNodeName(leftY, leftP)\n let updateRight = rightY instanceof Y.XmlElement && matchNodeName(rightY, rightP)\n\n if (\n updateLeft &&\n updateRight &&\n leftY instanceof Y.XmlElement &&\n rightY instanceof Y.XmlElement &&\n !Array.isArray(leftP) &&\n !Array.isArray(rightP)\n ) {\n const equalityLeft = computeChildEqualityFactor(leftY, leftP, meta)\n const equalityRight = computeChildEqualityFactor(rightY, rightP, meta)\n\n // Mapped child identity is stronger evidence than equal content when choosing a side.\n if (equalityLeft.foundMappedChild && !equalityRight.foundMappedChild) {\n updateRight = false\n } else if (!equalityLeft.foundMappedChild && equalityRight.foundMappedChild) {\n updateLeft = false\n } else if (equalityLeft.equalityFactor < equalityRight.equalityFactor) {\n updateLeft = false\n } else {\n updateRight = false\n }\n }\n\n if (updateLeft && leftY instanceof Y.XmlElement && !Array.isArray(leftP)) {\n updateYFragment(y, leftY, leftP, meta)\n left += 1\n continue\n }\n\n if (updateRight && rightY instanceof Y.XmlElement && !Array.isArray(rightP)) {\n updateYFragment(y, rightY, rightP, meta)\n right += 1\n continue\n }\n\n deleteMapping(meta.mapping, yDomFragment.get(left))\n yDomFragment.delete(left, 1)\n yDomFragment.insert(left, [createTypeFromTextOrElementNode(leftP, meta)])\n left += 1\n }\n\n const yDelLen = yChildCnt - left - right\n\n if (yChildCnt === 1 && pChildCnt === 0 && yChildren[0] instanceof Y.XmlText) {\n // Keep the text type alive so empty-block positions can still resolve.\n deleteMapping(meta.mapping, yChildren[0])\n yChildren[0].delete(0, yChildren[0].length)\n } else if (yDelLen > 0) {\n yDomFragment.slice(left, left + yDelLen).forEach(type => deleteMapping(meta.mapping, type))\n yDomFragment.delete(left, yDelLen)\n }\n\n if (left + right >= pChildCnt) {\n return\n }\n\n const childrenToInsert = []\n\n for (let index = left; index < pChildCnt - right; index++) {\n childrenToInsert.push(createTypeFromTextOrElementNode(pChildren[index], meta))\n }\n\n yDomFragment.insert(left, childrenToInsert)\n }, ySyncPluginKey)\n}\n","import type { PositionCharacter } from '../../../../types/PositionMigration.js'\nimport * as Y from 'yjs'\n\nexport const getTextCharacters = (type: Y.XmlText, position = 0) => {\n const characters: PositionCharacter[] = []\n\n if (!type._item) {\n throw new Error('Position tracking requires integrated text')\n }\n\n for (let item = type._start; item; item = item.right) {\n if (item.deleted || !item.countable) {\n continue\n }\n\n if (!(item.content instanceof Y.ContentString)) {\n throw new Error('Position tracking requires string text content')\n }\n\n // A Yjs string item spans consecutive clocks, one per UTF-16 code unit.\n for (let index = 0; index < item.length; index += 1) {\n characters.push({\n client: item.id.client,\n clock: item.id.clock + index,\n text: item.content.str[index],\n type: type._item.id,\n position: position + characters.length,\n })\n }\n }\n\n return characters\n}\n","import type { PositionCharacter } from '../../../../types/PositionMigration.js'\nimport * as Y from 'yjs'\nimport { getTextCharacters } from './getTextCharacters.js'\n\nconst retainedCharacters = (\n characters: PositionCharacter[],\n desired: Map,\n length: number,\n) => {\n const retained = [{ current: -1, target: -1 }]\n\n characters.forEach((character, index) => {\n const target = desired.get(`${character.client}:${character.clock}`)\n\n if (target !== undefined && target > retained[retained.length - 1].target) {\n retained.push({ current: index, target })\n }\n })\n retained.push({ current: characters.length, target: length })\n return retained\n}\n\nexport const syncPositionText = (\n type: Y.XmlText,\n text: string,\n position: number,\n desired: Map,\n sources: Set,\n) => {\n const characters = getTextCharacters(type)\n const indexes = new Map()\n\n for (let index = 0; index < text.length; index += 1) {\n const character = desired.get(position + index)\n\n if (character) {\n indexes.set(`${character.client}:${character.clock}`, index)\n }\n }\n\n const retained = retainedCharacters(characters, indexes, text.length)\n\n // Work backwards so replacements leave the remaining source indexes unchanged.\n for (let index = retained.length - 1; index > 0; index -= 1) {\n const left = retained[index - 1]\n const right = retained[index]\n const existing = characters.slice(left.current + 1, right.current)\n const replacement = text.slice(left.target + 1, right.target)\n\n // Equal text cannot make an old item represent a different character.\n if (\n !existing.some(character => sources.has(`${character.client}:${character.clock}`)) &&\n existing.map(character => character.text).join('') === replacement\n ) {\n continue\n }\n\n type.delete(left.current + 1, existing.length)\n type.insert(left.current + 1, replacement)\n }\n\n return getTextCharacters(type, position)\n}\n","import type { PositionTransfer } from '../../../../types/PositionMigration.js'\nimport * as Y from 'yjs'\n\nconst adjacentTargets = (left: PositionTransfer, right: PositionTransfer) => {\n if (!left.target || !right.target) {\n return left.target === right.target\n }\n\n return (\n left.target.client === right.target.client &&\n left.target.assoc === right.target.assoc &&\n left.target.boundary === right.target.boundary &&\n left.target.tname === right.target.tname &&\n left.target.clock + left.source.length === right.target.clock &&\n Y.compareIDs(left.target.type, right.target.type)\n )\n}\n\nexport const mergePositionTransfers = (transfers: PositionTransfer[]) => {\n const merged: PositionTransfer[] = []\n\n transfers.forEach(transfer => {\n const previous = merged[merged.length - 1]\n\n if (\n previous &&\n previous.source.client === transfer.source.client &&\n previous.source.boundary === transfer.source.boundary &&\n previous.source.clock + previous.source.length === transfer.source.clock &&\n adjacentTargets(previous, transfer)\n ) {\n previous.source.length += transfer.source.length\n return\n }\n\n merged.push({ ...transfer, source: { ...transfer.source } })\n })\n\n return merged\n}\n","import type { PositionMigration, PositionTransfer } from '../../../../types/PositionMigration.js'\nimport * as Y from 'yjs'\nimport { mergePositionTransfers } from './mergePositionTransfers.js'\n\nexport const writePositionMigration = (\n store: Y.Map,\n transfers: PositionTransfer[],\n) => {\n const doc = store.doc\n\n if (!doc || transfers.length === 0) {\n return\n }\n\n const clock = Y.getState(doc.store, doc.clientID)\n\n store.set(`${doc.clientID}:${clock}`, {\n version: 1,\n client: doc.clientID,\n clock,\n // Record causal knowledge to distinguish later edits from concurrent destinations.\n seen: [...Y.decodeStateVector(Y.encodeStateVector(doc))],\n transfers: mergePositionTransfers(transfers),\n })\n}\n","import type { PositionCharacter, PositionTransfer } from '../../../../types/PositionMigration.js'\nimport * as Y from 'yjs'\n\nexport const getPositionBoundaryTransfers = (\n characters: PositionCharacter[],\n destinations: Map>,\n) => {\n const types = new Map()\n\n characters.forEach(character => {\n const key = `${character.type.client}:${character.type.clock}`\n const group = types.get(key) ?? []\n group.push(character)\n types.set(key, group)\n })\n\n const transfers: PositionTransfer[] = []\n\n types.forEach(group => {\n const first = group[0]\n const last = group[group.length - 1]\n const start = first.position === null ? undefined : destinations.get(first.position)\n const end = last.position === null ? undefined : destinations.get(last.position)\n if (!start || !Y.compareIDs(first.type, start.type)) {\n transfers.push({\n source: { ...first.type, length: 1, boundary: 'start' },\n target: start ? { ...start, assoc: 0 } : null,\n })\n }\n\n if (!end || !Y.compareIDs(last.type, end.type)) {\n transfers.push({\n source: { ...first.type, length: 1, boundary: 'end' },\n target: end ? { ...end, assoc: -1 } : null,\n })\n }\n })\n\n return transfers\n}\n","import type { PositionNode, PositionTransfer } from '../../../../types/PositionMigration.js'\nimport * as Y from 'yjs'\n\nexport const getPositionNodeTransfers = (\n nodes: PositionNode[],\n starts: Map>,\n ends: Map>,\n emptyTexts: PositionNode[],\n) => {\n const transfers: PositionTransfer[] = []\n\n nodes.forEach(node => {\n const start = node.position === null ? null : (starts.get(node.position) ?? null)\n\n if (start && Y.compareIDs(node.id, start)) {\n return\n }\n\n transfers.push({ source: { ...node.id, length: 1 }, target: start })\n })\n\n const types = [...nodes, ...emptyTexts]\n for (const boundary of ['start', 'end'] as const) {\n const destinations = boundary === 'start' ? starts : ends\n types.forEach(node => {\n const position = boundary === 'start' ? node.position : node.end\n const target = position === null ? null : (destinations.get(position) ?? null)\n\n if (target && Y.compareIDs(node.id, target)) {\n return\n }\n\n transfers.push({\n source: { ...node.id, length: 1, boundary },\n target: target\n ? { client: target.client, clock: target.clock, type: null, boundary }\n : null,\n })\n })\n }\n\n return transfers\n}\n","import type { Node } from 'prosemirror-model'\nimport type { BindingMetadata } from '../../../../types/BindingMetadata.js'\nimport type { PositionNode } from '../../../../types/PositionMigration.js'\nimport * as Y from 'yjs'\nimport { createTypeFromTextOrElementNode } from '../../conversion/createTypeFromTextOrElementNode.js'\nimport { deleteMapping } from '../../binding/deleteMapping.js'\n\nexport const syncPositionElement = (\n parent: Y.XmlFragment,\n index: number,\n node: Node,\n position: number,\n sources: Map,\n metadata: BindingMetadata,\n) => {\n let element = parent.get(index)\n\n if (!(element instanceof Y.XmlElement) || !element._item) {\n throw new Error('Position migration requires synchronized elements')\n }\n\n const source = sources.get(`${element._item.id.client}:${element._item.id.clock}`)\n\n // Reconciliation may reuse an element for another node, which would redirect its anchors.\n if (source && source.position !== position) {\n deleteMapping(metadata.mapping, element)\n parent.delete(index, 1)\n element = createTypeFromTextOrElementNode(node, metadata)\n parent.insert(index, [element])\n }\n\n if (!(element instanceof Y.XmlElement) || !element._item) {\n throw new Error('Position migration requires integrated elements')\n }\n\n return element\n}\n","import type { Node } from 'prosemirror-model'\nimport type {\n PositionMigration,\n PositionMigrationPlan,\n PositionTransfer,\n} from '../../../../types/PositionMigration.js'\nimport type { BindingMetadata } from '../../../../types/BindingMetadata.js'\nimport * as Y from 'yjs'\nimport { normalizePNodeContent } from '../../conversion/normalizePNodeContent.js'\nimport { updateYText } from '../../reconciliation/updateYText.js'\nimport { syncPositionText } from './syncPositionText.js'\nimport { writePositionMigration } from './writePositionMigration.js'\nimport { getPositionBoundaryTransfers } from './getPositionBoundaryTransfers.js'\nimport { getPositionNodeTransfers } from './getPositionNodeTransfers.js'\nimport { syncPositionElement } from './syncPositionElement.js'\n\nexport const applyPositionMigration = (\n fragment: Y.XmlFragment,\n plan: PositionMigrationPlan,\n metadata: BindingMetadata,\n store: Y.Map,\n) => {\n const desired = new Map(plan.characters.map(character => [character.position, character]))\n const sources = new Set(\n plan.characters.map(character => `${character.client}:${character.clock}`),\n )\n const targets = new Map>()\n const nodeSources = new Map(plan.nodes.map(node => [`${node.id.client}:${node.id.clock}`, node]))\n const starts = new Map>()\n const ends = new Map>()\n\n const visit = (type: Y.XmlFragment, node: Node, position: number) => {\n const children = type.toArray()\n let offset = position\n\n normalizePNodeContent(node).forEach((child, index) => {\n const shared = children[index]\n\n if (Array.isArray(child)) {\n if (!(shared instanceof Y.XmlText) || !shared._item) {\n throw new Error('Position migration requires integrated text')\n }\n\n const text = child.map(node => node.text ?? '').join('')\n const characters = syncPositionText(shared, text, offset, desired, sources)\n const typeId = shared._item.id\n characters.forEach(character =>\n targets.set(character.position!, {\n client: character.client,\n clock: character.clock,\n type: typeId,\n }),\n )\n updateYText(shared, child, metadata)\n offset += text.length\n return\n }\n\n const element = syncPositionElement(type, index, child, offset, nodeSources, metadata)\n const identity = element._item!.id\n const target = {\n client: identity.client,\n clock: identity.clock,\n type: type._item?.id ?? null,\n ...(type._item ? {} : { tname: Y.findRootTypeKey(type) }),\n }\n starts.set(offset, target)\n ends.set(offset + child.nodeSize - 1, target)\n\n if (!child.isLeaf) {\n visit(element, child, offset + 1)\n }\n\n offset += child.nodeSize\n })\n }\n\n visit(fragment, plan.doc, 0)\n const transfers: PositionTransfer[] = []\n\n plan.characters.forEach(character => {\n const target = character.position === null ? null : (targets.get(character.position) ?? null)\n\n // Unchanged identities must not compete with another client's structural transfer.\n if (target && Y.compareIDs(character, target) && Y.compareIDs(character.type, target.type)) {\n return\n }\n\n transfers.push({\n source: { client: character.client, clock: character.clock, length: 1 },\n target,\n })\n })\n\n transfers.push(...getPositionBoundaryTransfers(plan.characters, targets))\n transfers.push(...getPositionNodeTransfers(plan.nodes, starts, ends, plan.emptyTexts))\n\n writePositionMigration(store, transfers)\n}\n","import { Slice } from 'prosemirror-model'\nimport type { Fragment } from 'prosemirror-model'\nimport type { Transaction } from 'prosemirror-state'\nimport { replaceStep } from 'prosemirror-transform'\n\nexport const replaceChangedChildren = (tr: Transaction, content: Fragment): Transaction => {\n const oldContent = tr.doc.content\n let start = 0\n let from = 0\n\n while (\n start < oldContent.childCount &&\n start < content.childCount &&\n oldContent.child(start) === content.child(start)\n ) {\n from += oldContent.child(start).nodeSize\n start++\n }\n\n let oldEnd = oldContent.childCount\n let newEnd = content.childCount\n let suffixSize = 0\n\n while (\n oldEnd > start &&\n newEnd > start &&\n oldContent.child(oldEnd - 1) === content.child(newEnd - 1)\n ) {\n suffixSize += oldContent.child(oldEnd - 1).nodeSize\n oldEnd--\n newEnd--\n }\n\n if (start === oldEnd && start === newEnd) return tr\n\n const slice = new Slice(content.cut(from, content.size - suffixSize), 0, 0)\n const step = replaceStep(tr.doc, from, oldContent.size - suffixSize, slice)\n\n if (step !== null && step.apply(tr.doc).doc?.content.eq(content)) {\n return tr.step(step)\n }\n\n // Schema fitting may require replacing the full document.\n return tr.replace(0, oldContent.size, new Slice(content, 0, 0))\n}\n","import { getSyncPluginState } from '../../plugins/getSyncPluginState.js'\nimport type { SyncPluginState } from '../../../types/SyncPluginState.js'\nimport type { RelativeSelection } from '../../../types/RelativeSelection.js'\nimport type { ProsemirrorMapping } from '../../../types/ProsemirrorMapping.js'\nimport type { Transaction } from 'prosemirror-state'\nimport type { EditorView } from 'prosemirror-view'\nimport type { ComputeYChange } from '../../../types/YChange.js'\nimport { createMutex } from 'lib0/mutex'\nimport * as PModel from 'prosemirror-model'\nimport { TextSelection } from 'prosemirror-state'\nimport * as math from 'lib0/math'\nimport * as error from 'lib0/error'\nimport { ySyncPluginKey } from '../../plugins/keys.js'\nimport * as Y from 'yjs'\nimport * as environment from 'lib0/environment'\nimport * as dom from 'lib0/dom'\nimport * as eventloop from 'lib0/eventloop'\nimport { isVisible } from './isVisible.js'\nimport { getUserColor } from './getUserColor.js'\nimport { restoreRelativeSelection } from '../positions/restoreRelativeSelection.js'\nimport { getRelativeSelection } from '../positions/getRelativeSelection.js'\n\nimport { createNodeFromYElement } from '../conversion/createNodeFromYElement.js'\nimport { validateDocumentContent } from '../conversion/validateDocumentContent.js'\nimport { updateYFragment } from '../reconciliation/updateYFragment.js'\nimport type { PositionMigrationPlan } from '../../../types/PositionMigration.js'\nimport { applyPositionMigration } from '../positions/migrations/applyPositionMigration.js'\nimport { getPositionMigrationStore } from '../positions/migrations/getPositionMigrationStore.js'\nimport { deleteMapping } from './deleteMapping.js'\nimport { projectedMappings } from './projectedMappings.js'\nimport { replaceChangedChildren } from './replaceChangedChildren.js'\n\n/** Synchronizes one integrated Yjs XML fragment with a ProseMirror editor view. */\nexport class ProsemirrorBinding {\n readonly type: Y.XmlFragment\n prosemirrorView: EditorView | null = null\n // Prevent editor and Yjs observers from echoing the same change back to each other.\n readonly mux = createMutex()\n readonly mapping: ProsemirrorMapping\n readonly isOMark = new Map()\n readonly doc: Y.Doc\n beforeTransactionSelection: RelativeSelection | null = null\n readonly _observeFunction: Parameters[0]\n readonly beforeAllTransactions: () => void\n readonly afterAllTransactions: () => void\n _domSelectionInView: boolean | null = null\n syncedDoc: PModel.Node | null = null\n private _projectionError: Error | null = null\n\n /**\n * Returns the last projection error. Shared writes stop until a compatible projection succeeds.\n * @returns The projection error, or null when shared content can be rendered.\n */\n get projectionError(): Error | null {\n return this._projectionError\n }\n\n constructor(yXmlFragment: Y.XmlFragment, mapping: ProsemirrorMapping = new Map()) {\n this.type = yXmlFragment\n this.mapping = mapping\n this._observeFunction = this._typeChanged.bind(this)\n\n if (yXmlFragment.doc === null) {\n throw new Error('The Yjs fragment must belong to a document')\n }\n\n this.doc = yXmlFragment.doc\n // Capture against the old mapping before Yjs observers rebuild the editor document.\n this.beforeAllTransactions = () => {\n if (\n this.projectionError === null &&\n this.beforeTransactionSelection === null &&\n this.prosemirrorView != null\n ) {\n this.beforeTransactionSelection = getRelativeSelection(this, this.view.state)\n }\n }\n this.afterAllTransactions = () => {\n this.beforeTransactionSelection = null\n }\n }\n\n private get view(): EditorView {\n if (!this.prosemirrorView) {\n throw new Error('The binding has no editor view')\n }\n\n return this.prosemirrorView\n }\n\n get _tr() {\n return this.view.state.tr.setMeta('addToHistory', false)\n }\n\n _isLocalCursorInView() {\n if (!this.view.hasFocus()) {\n return false\n }\n\n if (environment.isBrowser && this._domSelectionInView === null) {\n eventloop.timeout(0, () => {\n this._domSelectionInView = null\n })\n this._domSelectionInView = this._isDomSelectionInView()\n }\n\n return this._domSelectionInView\n }\n\n _isDomSelectionInView() {\n const root = this.view.root\n const selection =\n 'getSelection' in root && typeof root.getSelection === 'function'\n ? root.getSelection()\n : this.view.dom.ownerDocument.getSelection()\n\n if (selection == null || selection.anchorNode == null || selection.focusNode == null) {\n return false\n }\n\n const range = this.view.dom.ownerDocument.createRange()\n\n range.setStart(selection.anchorNode, selection.anchorOffset)\n range.setEnd(selection.focusNode, selection.focusOffset)\n\n const rects = range.getClientRects()\n\n if (rects.length === 0) {\n if (range.startContainer && range.collapsed) {\n range.selectNodeContents(range.startContainer)\n }\n }\n\n const bounding = range.getBoundingClientRect()\n const documentElement = dom.doc.documentElement\n\n return (\n bounding.bottom >= 0 &&\n bounding.right >= 0 &&\n bounding.left <= (window.innerWidth || documentElement.clientWidth || 0) &&\n bounding.top <= (window.innerHeight || documentElement.clientHeight || 0)\n )\n }\n\n renderSnapshot(\n snapshot: SyncPluginState['snapshot'],\n prevSnapshot: SyncPluginState['prevSnapshot'],\n ) {\n if (!prevSnapshot) {\n prevSnapshot = Y.createSnapshot(Y.createDeleteSet(), new Map())\n }\n\n this.view.dispatch(this._tr.setMeta(ySyncPluginKey, { snapshot, prevSnapshot }))\n }\n\n private createDocumentFragment(): PModel.Fragment | null {\n try {\n const fragmentContent = this.type.toArray().map(type => {\n if (!(type instanceof Y.XmlElement)) {\n throw error.methodUnimplemented()\n }\n\n return createNodeFromYElement(type, this.view.state.schema, this)\n })\n const content = PModel.Fragment.from(fragmentContent)\n validateDocumentContent(content, this.view.state.schema)\n this._projectionError = null\n return content\n } catch (error) {\n this.handleProjectionError(error)\n return null\n }\n }\n\n private handleProjectionError(error: unknown) {\n this._projectionError =\n error instanceof Error ? error : new Error('Cannot project shared content')\n this.mapping.clear()\n projectedMappings.delete(this.mapping)\n this.beforeTransactionSelection = null\n this.view.dispatch(this._tr.setMeta(ySyncPluginKey, { isChangeOrigin: true }))\n }\n\n private createDocumentTransaction(): Transaction | null {\n const content = this.createDocumentFragment()\n\n if (content === null) return null\n\n return this._tr.replace(0, this.view.state.doc.content.size, new PModel.Slice(content, 0, 0))\n }\n\n unrenderSnapshot() {\n this.mapping.clear()\n projectedMappings.delete(this.mapping)\n this.mux(() => {\n const tr = this.createDocumentTransaction()\n\n if (tr === null) return\n\n tr.setMeta(ySyncPluginKey, { snapshot: null, prevSnapshot: null })\n this.view.dispatch(tr)\n })\n }\n\n _forceRerender() {\n this.mapping.clear()\n projectedMappings.delete(this.mapping)\n this.mux(() => {\n const sel = this.beforeTransactionSelection !== null ? null : this.view.state.selection\n const tr = this.createDocumentTransaction()\n\n if (tr === null) return\n\n if (sel) {\n const clampedAnchor = math.min(math.max(sel.anchor, 0), tr.doc.content.size)\n const clampedHead = math.min(math.max(sel.head, 0), tr.doc.content.size)\n\n tr.setSelection(TextSelection.create(tr.doc, clampedAnchor, clampedHead))\n }\n\n this.view.dispatch(tr.setMeta(ySyncPluginKey, { isChangeOrigin: true, binding: this }))\n })\n }\n\n _renderSnapshot(\n snapshot: SyncPluginState['snapshot'],\n prevSnapshot: SyncPluginState['prevSnapshot'],\n pluginState: SyncPluginState,\n ) {\n let historyDoc: Y.Doc = this.doc\n let historyType = this.type\n\n if (!snapshot) {\n snapshot = Y.snapshot(this.doc)\n }\n\n if (snapshot instanceof Uint8Array || prevSnapshot instanceof Uint8Array) {\n if (!(snapshot instanceof Uint8Array) || !(prevSnapshot instanceof Uint8Array)) {\n throw error.unexpectedCase()\n }\n\n historyDoc = new Y.Doc({ gc: false })\n Y.applyUpdateV2(historyDoc, prevSnapshot)\n prevSnapshot = Y.snapshot(historyDoc)\n Y.applyUpdateV2(historyDoc, snapshot)\n snapshot = Y.snapshot(historyDoc)\n\n if (historyType._item === null) {\n const rootKey = Array.from(this.doc.share.keys()).find(key =>\n Object.is(this.doc.share.get(key), historyType),\n )\n\n historyType = historyDoc.getXmlFragment(rootKey)\n } else {\n const historyStructs = historyDoc.store.clients.get(historyType._item.id.client) ?? []\n const itemIndex = Y.findIndexSS(historyStructs, historyType._item.id.clock)\n const item = historyStructs[itemIndex]\n\n if (\n !(\n item instanceof Y.Item &&\n item.content instanceof Y.ContentType &&\n item.content.type instanceof Y.XmlFragment\n )\n ) {\n throw error.unexpectedCase()\n }\n\n historyType = item.content.type\n }\n }\n\n const currentSnapshot = snapshot\n const previousSnapshot = prevSnapshot ?? Y.emptySnapshot\n\n this.mapping.clear()\n projectedMappings.delete(this.mapping)\n this.mux(() => {\n try {\n historyDoc.transact(transaction => {\n const pud = pluginState.permanentUserData\n\n if (pud) {\n pud.dss.forEach(ds => {\n Y.iterateDeletedStructs(transaction, ds, _item => {})\n })\n }\n\n const computeYChange: ComputeYChange = (type, id) => {\n const user = pud\n ? type === 'added'\n ? pud.getUserByClientId(id.client)\n : pud.getUserByDeletedId(id)\n : null\n\n return {\n user,\n type,\n color: getUserColor(pluginState.colorMapping, pluginState.colors, user),\n }\n }\n const fragmentContent = Y.typeListToArraySnapshot(\n historyType,\n // Include content deleted since the previous snapshot so removals remain visible.\n new Y.Snapshot(previousSnapshot.ds, currentSnapshot.sv),\n )\n .map((t: unknown) => {\n if (!(t instanceof Y.XmlElement) || !t._item) {\n return null\n }\n\n if (\n !t._item.deleted ||\n isVisible(t._item, currentSnapshot) ||\n isVisible(t._item, previousSnapshot)\n ) {\n return createNodeFromYElement(\n t,\n this.view.state.schema,\n { mapping: new Map(), isOMark: new Map() },\n currentSnapshot,\n previousSnapshot,\n computeYChange,\n )\n } else {\n return null\n }\n })\n .filter(n => n !== null)\n const content = PModel.Fragment.from(fragmentContent)\n validateDocumentContent(content, this.view.state.schema)\n const tr = this._tr.replace(\n 0,\n this.view.state.doc.content.size,\n new PModel.Slice(content, 0, 0),\n )\n\n this._projectionError = null\n this.view.dispatch(tr.setMeta(ySyncPluginKey, { isChangeOrigin: true }))\n }, ySyncPluginKey)\n } catch (error) {\n this.handleProjectionError(error)\n }\n })\n }\n\n _typeChanged(\n events: Parameters[0]>[0],\n transaction: Y.Transaction,\n ) {\n if (this.prosemirrorView == null) {\n return\n }\n\n const syncState = getSyncPluginState(this.view.state)\n\n if (events.length === 0 || syncState.snapshot != null || syncState.prevSnapshot != null) {\n this.renderSnapshot(syncState.snapshot, syncState.prevSnapshot)\n\n return\n }\n\n this.mux(() => {\n const delType = (_: unknown, type: unknown) => deleteMapping(this.mapping, type)\n\n Y.iterateDeletedStructs(transaction, transaction.deleteSet, struct => {\n if (struct instanceof Y.Item && struct.content instanceof Y.ContentType) {\n deleteMapping(this.mapping, struct.content.type)\n }\n })\n transaction.changed.forEach(delType)\n transaction.changedParentTypes.forEach(delType)\n\n const content = this.createDocumentFragment()\n\n if (content === null) return\n\n const oldDoc = this.view.state.doc\n let tr = replaceChangedChildren(this._tr, content)\n\n restoreRelativeSelection(tr, this.beforeTransactionSelection, this, oldDoc)\n tr = tr.setMeta(ySyncPluginKey, {\n isChangeOrigin: true,\n isUndoRedoOperation: transaction.origin instanceof Y.UndoManager,\n })\n\n if (this.beforeTransactionSelection !== null && this._isLocalCursorInView()) {\n tr.scrollIntoView()\n }\n\n this.view.dispatch(tr)\n })\n }\n\n _prosemirrorChanged(doc: PModel.Node, plan: PositionMigrationPlan | null = null) {\n const syncState = getSyncPluginState(this.view.state)\n if (\n this.projectionError !== null ||\n syncState.snapshot != null ||\n syncState.prevSnapshot != null\n )\n return\n\n this.doc.transact(() => {\n updateYFragment(this.doc, this.type, doc, this)\n\n // Publish identity transfers with the content so peers receive both atomically.\n if (plan?.doc === doc) {\n applyPositionMigration(this.type, plan, this, getPositionMigrationStore(this.type))\n }\n\n this.syncedDoc = doc\n this.beforeTransactionSelection = getRelativeSelection(this, this.view.state)\n }, ySyncPluginKey)\n }\n\n initView(prosemirrorView: EditorView) {\n if (this.prosemirrorView != null) {\n this.destroy()\n }\n\n this.prosemirrorView = prosemirrorView\n this.doc.on('beforeAllTransactions', this.beforeAllTransactions)\n this.doc.on('afterAllTransactions', this.afterAllTransactions)\n this.type.observeDeep(this._observeFunction)\n }\n\n destroy() {\n if (this.prosemirrorView == null) {\n return\n }\n\n this.prosemirrorView = null\n this.type.unobserveDeep(this._observeFunction)\n this.doc.off('beforeAllTransactions', this.beforeAllTransactions)\n this.doc.off('afterAllTransactions', this.afterAllTransactions)\n }\n}\n","import type { Node } from 'prosemirror-model'\nimport type { PositionCharacter, PositionNode } from '../../../../types/PositionMigration.js'\nimport * as Y from 'yjs'\nimport { normalizePNodeContent } from '../../conversion/normalizePNodeContent.js'\nimport { getTextCharacters } from './getTextCharacters.js'\n\nexport const getPositionContent = (fragment: Y.XmlFragment, doc: Node) => {\n const characters: PositionCharacter[] = []\n const nodes: PositionNode[] = []\n const emptyTexts: PositionNode[] = []\n\n if (fragment.length === 0) {\n return { characters, nodes, emptyTexts }\n }\n\n const visit = (type: Y.XmlFragment, node: Node, position: number) => {\n const children = type.toArray()\n const content = normalizePNodeContent(node)\n let offset = position\n\n if (node.content.size === 0) {\n children.forEach(child => {\n if (child instanceof Y.XmlText && child._item) {\n emptyTexts.push({ id: child._item.id, position: position - 1, end: position })\n }\n })\n }\n\n content.forEach((child, index) => {\n const shared = children[index]\n\n if (!Array.isArray(child)) {\n if (!(shared instanceof Y.XmlElement) || !shared._item) {\n throw new Error('Position tracking requires synchronized editor content')\n }\n\n nodes.push({ id: shared._item.id, position: offset, end: offset + child.nodeSize - 1 })\n\n if (!child.isLeaf) {\n visit(shared, child, offset + 1)\n }\n\n offset += child.nodeSize\n return\n }\n\n if (!(shared instanceof Y.XmlText)) {\n throw new Error('Position tracking requires synchronized editor text')\n }\n\n const text = getTextCharacters(shared, offset)\n characters.push(...text)\n offset += text.length\n })\n }\n\n visit(fragment, doc, 0)\n return { characters, nodes, emptyTexts }\n}\n","import type { Node } from 'prosemirror-model'\nimport type { Step } from 'prosemirror-transform'\n\nexport const isNodeMarkupChange = (step: Step, before: Node, after: Node, position: number) => {\n const json = step.toJSON()\n\n if (json.stepType !== 'replace' && json.stepType !== 'replaceAround') {\n return false\n }\n\n if (position !== json.from && position !== json.to - 1) {\n return false\n }\n\n const source = before.nodeAt(json.from)\n const target = after.nodeAt(json.from)\n\n if (!source || !target) {\n return false\n }\n\n if (source.nodeSize !== json.to - json.from) {\n return false\n }\n\n return changedMarkup(source, target)\n}\n\nconst changedMarkup = (source: Node, target: Node) =>\n source.type === target.type && source.content.eq(target.content) && !source.sameMarkup(target)\n","import type { Node } from 'prosemirror-model'\nimport type { Transaction } from 'prosemirror-state'\nimport type { Step } from 'prosemirror-transform'\nimport type { PositionMigrationPlan, PositionNode } from '../../../../types/PositionMigration.js'\nimport type { ProsemirrorBinding } from '../../binding/ProsemirrorBinding.js'\nimport { getPositionContent } from './getPositionContent.js'\nimport { isNodeMarkupChange } from './isNodeMarkupChange.js'\n\nconst isTextReplacement = (step: Step, doc: Node) => {\n const json = step.toJSON()\n const slice = json.slice ?? { content: [] }\n\n if (json.stepType !== 'replace' || slice.openStart > 0 || slice.openEnd > 0) {\n return false\n }\n\n const from = doc.resolve(json.from)\n const to = doc.resolve(json.to)\n const textOnly = slice.content.every((node: { type: string }) => node.type === 'text')\n\n return textOnly && from.parent.isTextblock && from.sameParent(to)\n}\n\nconst indexNodes = (doc: Node) => {\n const nodes = new Map()\n\n doc.descendants((node, position) => {\n const positions = nodes.get(node) ?? []\n positions.push(position)\n nodes.set(node, positions)\n })\n\n return nodes\n}\n\nconst findMovedNode = (\n node: Node,\n offset: number,\n step: number,\n indexes: Map[],\n) => {\n // Equal content may be a copy. Only a unique node object identifies a move.\n if (indexes[step].get(node)?.length !== 1) {\n return null\n }\n\n for (let targetStep = step + 1; targetStep < indexes.length; targetStep += 1) {\n const target = indexes[targetStep].get(node)\n\n if (target?.length === 1) {\n return { position: target[0] + offset, step: targetStep }\n }\n }\n\n return null\n}\n\nconst findMovedPosition = (\n position: number,\n step: number,\n docs: Node[],\n indexes: Map[],\n) => {\n const original = docs[step].resolve(position)\n const candidates: { node: Node; offset: number }[] = []\n const child = docs[step].nodeAt(position)\n\n if (child && !child.isText) {\n candidates.push({ node: child, offset: 0 })\n }\n\n for (let depth = original.depth; depth > 0; depth -= 1) {\n candidates.push({ node: original.node(depth), offset: position - original.before(depth) })\n }\n\n for (const candidate of candidates) {\n const moved = findMovedNode(candidate.node, candidate.offset, step, indexes)\n\n if (moved) {\n return moved\n }\n }\n\n return null\n}\n\nconst mapCharacterPosition = (\n position: number,\n transaction: Transaction,\n docs: Node[],\n indexes: Map[],\n) => {\n for (let step = 0; step < transaction.mapping.maps.length; step += 1) {\n const mapping = transaction.mapping.maps[step]\n const start = mapping.mapResult(position, 1)\n const end = mapping.mapResult(position + 1, -1)\n\n if (!start.deleted && !end.deleted && end.pos === start.pos + 1) {\n position = start.pos\n continue\n }\n\n if (isNodeMarkupChange(transaction.steps[step], docs[step], docs[step + 1], position)) {\n continue\n }\n\n const moved = findMovedPosition(position, step, docs, indexes)\n\n if (!moved) {\n return null\n }\n\n position = moved.position\n step = moved.step - 1\n }\n\n return position\n}\n\nexport const mapPositionMigration = (\n transaction: Transaction,\n binding: ProsemirrorBinding,\n previous: PositionMigrationPlan | null,\n): PositionMigrationPlan | null => {\n // Appended transactions may run before the view writes the preceding change to Yjs.\n const pending =\n previous?.doc === transaction.before && previous.doc !== binding.syncedDoc ? previous : null\n\n // Ordinary text edits retain Yjs character identities without structural migration.\n if (\n !transaction.docChanged ||\n !binding.prosemirrorView ||\n (!pending &&\n transaction.steps.every((step, index) => isTextReplacement(step, transaction.docs[index])))\n ) {\n return pending\n }\n\n const source = pending ?? getPositionContent(binding.type, transaction.before)\n const docs = [...transaction.docs, transaction.doc]\n const indexes = docs.map(indexNodes)\n const characters = source.characters.map(character => ({\n ...character,\n position:\n character.position === null\n ? null\n : mapCharacterPosition(character.position, transaction, docs, indexes),\n }))\n const mapNode = (node: PositionNode) => ({\n ...node,\n position:\n node.position === null\n ? null\n : mapCharacterPosition(node.position, transaction, docs, indexes),\n end: node.end === null ? null : mapCharacterPosition(node.end, transaction, docs, indexes),\n })\n\n return {\n doc: transaction.doc,\n characters,\n nodes: source.nodes.map(mapNode),\n emptyTexts: source.emptyTexts.map(mapNode),\n }\n}\n","import { getSyncPluginState } from './getSyncPluginState.js'\nimport type { ColorDef } from '../../types/ColorDef.js'\nimport type { SyncPluginOptions } from '../../types/SyncPluginOptions.js'\nimport type { SyncPluginState } from '../../types/SyncPluginState.js'\nimport { Plugin } from 'prosemirror-state'\nimport { ySyncPluginKey, yUndoPluginKey } from './keys.js'\nimport * as Y from 'yjs'\nimport * as eventloop from 'lib0/eventloop'\nimport { ProsemirrorBinding } from '../utils/binding/ProsemirrorBinding.js'\nimport { mapPositionMigration } from '../utils/positions/migrations/mapPositionMigration.js'\n\nconst defaultColors: ColorDef[] = [{ light: '#ecd44433', dark: '#ecd444' }]\n/** Binds a Yjs XML fragment to the editor document. The fragment must belong to a Yjs document. */\nexport const ySyncPlugin = (\n yXmlFragment: Y.XmlFragment,\n {\n colors = defaultColors,\n colorMapping = new Map(),\n permanentUserData = null,\n onFirstRender = () => {},\n mapping,\n }: SyncPluginOptions = {},\n) => {\n let initialContentChanged = false\n const binding = new ProsemirrorBinding(yXmlFragment, mapping)\n const plugin = new Plugin({\n filterTransaction: transaction => binding.projectionError === null || !transaction.docChanged,\n props: {\n editable: state => {\n const syncState = getSyncPluginState(state)\n\n return (\n binding.projectionError === null &&\n syncState.snapshot == null &&\n syncState.prevSnapshot == null\n )\n },\n },\n key: ySyncPluginKey,\n state: {\n init: (_initargs, _state) => {\n return {\n type: yXmlFragment,\n doc: binding.doc,\n binding,\n snapshot: null,\n prevSnapshot: null,\n isChangeOrigin: false,\n isUndoRedoOperation: false,\n addToHistory: true,\n colors,\n colorMapping,\n permanentUserData,\n positionMigration: null,\n }\n },\n apply: (tr, pluginState) => {\n const change: Partial | undefined = tr.getMeta(ySyncPluginKey)\n\n if (change !== undefined) {\n pluginState = Object.assign({}, pluginState, change)\n }\n\n if (tr.docChanged) {\n pluginState.addToHistory = tr.getMeta('addToHistory') !== false\n }\n\n pluginState.isChangeOrigin = change !== undefined && !!change.isChangeOrigin\n pluginState.isUndoRedoOperation =\n change !== undefined && !!change.isChangeOrigin && !!change.isUndoRedoOperation\n\n // Only local edits need transfers. Remote updates already carry their migration history.\n pluginState = {\n ...pluginState,\n positionMigration:\n binding.projectionError ||\n pluginState.isChangeOrigin ||\n pluginState.snapshot ||\n pluginState.prevSnapshot ||\n change?.snapshot !== undefined ||\n change?.prevSnapshot !== undefined\n ? null\n : mapPositionMigration(tr, binding, pluginState.positionMigration ?? null),\n }\n\n if (\n binding.prosemirrorView === null ||\n change === undefined ||\n (change.snapshot == null && change.prevSnapshot == null)\n ) {\n return pluginState\n }\n\n eventloop.timeout(0, () => {\n if (binding.prosemirrorView == null) {\n return\n }\n\n if (change.restore == null) {\n binding._renderSnapshot(change.snapshot, change.prevSnapshot, pluginState)\n return\n }\n\n binding._renderSnapshot(change.snapshot, change.snapshot, pluginState)\n if (binding.projectionError !== null) return\n\n binding.mux(() => {\n const activeView = binding.prosemirrorView\n\n if (!activeView) {\n return\n }\n\n activeView.dispatch(\n binding._tr.setMeta(ySyncPluginKey, {\n restore: false,\n snapshot: null,\n prevSnapshot: null,\n isChangeOrigin: true,\n }),\n )\n binding._prosemirrorChanged(activeView.state.doc)\n })\n })\n\n return pluginState\n },\n },\n view: view => {\n binding.initView(view)\n\n if (mapping == null) {\n binding._forceRerender()\n }\n\n onFirstRender()\n\n return {\n update: () => {\n const pluginState = getSyncPluginState(view.state)\n\n if (binding.projectionError !== null) return\n\n if (pluginState.snapshot == null && pluginState.prevSnapshot == null) {\n const emptyDocument = view.state.doc.type.createAndFill()\n\n if (!emptyDocument) {\n throw new Error('The schema cannot create an empty document')\n }\n\n // Avoid writing the schema's placeholder document before shared content arrives.\n if (\n initialContentChanged ||\n view.state.doc.content.findDiffStart(emptyDocument.content) !== null\n ) {\n initialContentChanged = true\n\n if (pluginState.addToHistory === false && !pluginState.isChangeOrigin) {\n const yUndoPluginState = yUndoPluginKey.getState(view.state)\n const um = yUndoPluginState && yUndoPluginState.undoManager\n\n if (um) {\n um.stopCapturing()\n }\n }\n\n binding.mux(() => {\n pluginState.doc.transact(tr => {\n tr.meta.set('addToHistory', pluginState.addToHistory)\n binding._prosemirrorChanged(view.state.doc, pluginState.positionMigration ?? null)\n }, ySyncPluginKey)\n })\n }\n }\n },\n destroy: () => {\n binding.destroy()\n },\n }\n },\n })\n\n return plugin\n}\n","import type { EditorState } from 'prosemirror-state'\nimport type { UndoPluginState } from '../../types/UndoPluginState.js'\nimport { yUndoPluginKey } from './keys.js'\n\nexport function getUndoPluginState(state: EditorState): UndoPluginState {\n const pluginState = yUndoPluginKey.getState(state)\n if (!pluginState) throw new Error('The editor requires yUndoPlugin')\n return pluginState\n}\n","import type { PositionTransfer } from '../../../../types/PositionMigration.js'\nimport * as Y from 'yjs'\nimport { getTextCharacters } from './getTextCharacters.js'\n\nexport const getLivePositionTargets = (fragment: Y.XmlFragment) => {\n const targets = new Map>()\n const visit = (type: Y.XmlFragment) => {\n type.toArray().forEach(child => {\n if (child instanceof Y.XmlElement) {\n const identity = child._item!.id\n targets.set(`${identity.client}:${identity.clock}`, {\n client: identity.client,\n clock: identity.clock,\n type: type._item?.id ?? null,\n ...(type._item ? {} : { tname: Y.findRootTypeKey(type) }),\n })\n visit(child)\n return\n }\n\n if (!(child instanceof Y.XmlText) || !child._item) {\n return\n }\n\n const typeId = child._item.id\n getTextCharacters(child).forEach(character => {\n targets.set(`${character.client}:${character.clock}`, {\n client: character.client,\n clock: character.clock,\n type: typeId,\n })\n })\n })\n }\n\n visit(fragment)\n return targets\n}\n","import type { PositionMigration, PositionTransfer } from '../../../../types/PositionMigration.js'\nimport * as Y from 'yjs'\nimport { getPositionMigrationStore } from './getPositionMigrationStore.js'\nimport { getLivePositionTargets } from './getLivePositionTargets.js'\nimport { writePositionMigration } from './writePositionMigration.js'\n\nconst restoreTransfers = (fragment: Y.XmlFragment, store: Y.Map) => {\n const doc = fragment.doc\n\n if (!doc) {\n return\n }\n\n const live = getLivePositionTargets(fragment)\n const identities = new Map()\n const connections = new Map>()\n const connect = (source: Y.ID, target: Y.ID) => {\n const from = `${source.client}:${source.clock}`\n const to = `${target.client}:${target.clock}`\n identities.set(from, source)\n identities.set(to, target)\n const outgoing = connections.get(from) ?? new Set()\n const incoming = connections.get(to) ?? new Set()\n outgoing.add(to)\n incoming.add(from)\n connections.set(from, outgoing)\n connections.set(to, incoming)\n }\n\n store.forEach(migration =>\n migration.transfers.forEach(({ source, target }) => {\n if (!target || source.boundary) {\n return\n }\n\n for (let offset = 0; offset < source.length; offset += 1) {\n connect(\n Y.createID(source.client, source.clock + offset),\n Y.createID(target.client, target.clock + offset),\n )\n }\n }),\n )\n\n // Yjs redone links are local and are absent from encoded updates.\n doc.store.clients.forEach(structs =>\n structs.forEach(item => {\n if (!(item instanceof Y.Item) || !item.redone) {\n return\n }\n\n if (!(item.content instanceof Y.ContentString) && !(item.content instanceof Y.ContentType)) {\n return\n }\n\n for (let offset = 0; offset < item.length; offset += 1) {\n connect(\n Y.createID(item.id.client, item.id.clock + offset),\n Y.createID(item.redone.client, item.redone.clock + offset),\n )\n }\n }),\n )\n\n const transfers: PositionTransfer[] = []\n const visited = new Set()\n\n connections.forEach((_, start) => {\n if (visited.has(start)) {\n return\n }\n\n const pending = [start]\n const component: string[] = []\n const targets: NonNullable[] = []\n\n while (pending.length > 0) {\n const key = pending.pop()!\n\n if (visited.has(key)) {\n continue\n }\n\n visited.add(key)\n component.push(key)\n const target = live.get(key)\n\n if (target) {\n targets.push(target)\n }\n\n pending.push(...(connections.get(key) ?? []))\n }\n\n // Multiple live identities do not identify a unique restored destination.\n if (targets.length !== 1) {\n return\n }\n\n component.forEach(key => {\n if (live.has(key)) {\n return\n }\n\n const source = identities.get(key)!\n transfers.push({\n source: { client: source.client, clock: source.clock, length: 1 },\n target: targets[0],\n })\n\n const item = Y.getItem(doc.store, source)\n\n if (item.content instanceof Y.ContentType && item.content.type instanceof Y.XmlElement) {\n for (const boundary of ['start', 'end'] as const) {\n transfers.push({\n source: { client: source.client, clock: source.clock, length: 1, boundary },\n target: { client: targets[0].client, clock: targets[0].clock, type: null, boundary },\n })\n }\n }\n })\n })\n\n writePositionMigration(store, transfers)\n}\n\nexport const restorePositionHistory = (\n fragment: Y.XmlFragment,\n manager: Y.UndoManager,\n action: 'undo' | 'redo',\n) => {\n const store = getPositionMigrationStore(fragment)\n\n if (store.size === 0) {\n return manager[action]()\n }\n\n const flag = action === 'undo' ? 'undoing' : 'redoing'\n let result: ReturnType = null\n\n try {\n manager.doc.transact(() => {\n result = manager[action]()\n // Keep the outer transaction classified as undo or redo through observer cleanup.\n manager[flag] = true\n\n if (result) {\n restoreTransfers(fragment, store)\n }\n }, manager)\n } finally {\n manager[flag] = false\n }\n\n return result\n}\n","import { Plugin } from 'prosemirror-state'\nimport type { EditorState } from 'prosemirror-state'\nimport { ContentType, Item, Text, UndoManager, XmlElement } from 'yjs'\nimport type { Doc } from 'yjs'\nimport type { UndoPluginOptions } from '../../types/UndoPluginOptions.js'\nimport type { UndoPluginState } from '../../types/UndoPluginState.js'\nimport { getSyncPluginState } from './getSyncPluginState.js'\nimport { getUndoPluginState } from './getUndoPluginState.js'\nimport { ySyncPluginKey, yUndoPluginKey } from './keys.js'\nimport { getRelativeSelection } from '../utils/positions/getRelativeSelection.js'\nimport { restorePositionHistory } from '../utils/positions/migrations/restorePositionHistory.js'\n\nconst restoreHistory = (state: EditorState, direction: 'undo' | 'redo') => {\n const syncState = getSyncPluginState(state)\n if (\n syncState.binding.projectionError !== null ||\n syncState.snapshot != null ||\n syncState.prevSnapshot != null\n )\n return false\n\n const undoManager = getUndoPluginState(state).undoManager\n\n if (undoManager != null) {\n restorePositionHistory(syncState.type, undoManager, direction)\n\n return true\n }\n}\n\n/** Undoes a local change through the editor's Yjs undo manager. */\nexport const undo = (state: EditorState) => restoreHistory(state, 'undo')\n\n/** Redoes a local change through the editor's Yjs undo manager. */\nexport const redo = (state: EditorState) => restoreHistory(state, 'redo')\n\nexport const defaultProtectedNodes = new Set(['paragraph'])\n\n/** Keeps protected structural nodes when an undo operation would delete them. */\nexport const defaultDeleteFilter = (item: unknown, protectedNodes: Set) =>\n !(item instanceof Item) ||\n !(item.content instanceof ContentType) ||\n !(\n item.content.type instanceof Text ||\n (item.content.type instanceof XmlElement && protectedNodes.has(item.content.type.nodeName))\n ) ||\n item.content.type._length === 0\n\n/** Tracks local Yjs changes for undo and redo while preserving remote changes. */\nexport const yUndoPlugin = ({\n protectedNodes = defaultProtectedNodes,\n trackedOrigins = [],\n undoManager = null,\n}: UndoPluginOptions = {}): Plugin =>\n new Plugin({\n key: yUndoPluginKey,\n state: {\n init: (_, state) => {\n const syncState = getSyncPluginState(state)\n const destroyListeners = new Set<(document: Doc) => void>()\n let manager = undoManager\n\n if (!manager) {\n // Yjs leaves its document listener attached after destroying the manager.\n const before = new Set(syncState.doc._observers.get('destroy'))\n\n manager = new UndoManager(syncState.type, {\n trackedOrigins: new Set([ySyncPluginKey, ...trackedOrigins]),\n deleteFilter: item => defaultDeleteFilter(item, protectedNodes),\n captureTransaction: transaction => transaction.meta.get('addToHistory') !== false,\n })\n\n const after: Set<(document: Doc) => void> =\n syncState.doc._observers.get('destroy') ?? new Set()\n\n after.forEach(listener => {\n if (!before.has(listener)) {\n destroyListeners.add(listener)\n }\n })\n }\n\n return {\n undoManager: manager,\n prevSel: null,\n hasUndoOps: manager.undoStack.length > 0,\n hasRedoOps: manager.redoStack.length > 0,\n destroyListeners,\n }\n },\n apply: (_, value, oldState, state) => {\n const binding = getSyncPluginState(state).binding\n\n return {\n ...value,\n prevSel: binding ? getRelativeSelection(binding, oldState) : value.prevSel,\n hasUndoOps: value.undoManager.undoStack.length > 0,\n hasRedoOps: value.undoManager.redoStack.length > 0,\n }\n },\n },\n view: view => {\n const syncState = getSyncPluginState(view.state)\n const { undoManager: manager, destroyListeners } = getUndoPluginState(view.state)\n\n manager.on('stack-item-added', ({ stackItem }) => {\n const binding = syncState.binding\n\n if (binding) {\n stackItem.meta.set(binding, getUndoPluginState(view.state).prevSel)\n }\n })\n manager.on('stack-item-popped', ({ stackItem }) => {\n const binding = syncState.binding\n\n if (binding) {\n binding.beforeTransactionSelection =\n stackItem.meta.get(binding) || binding.beforeTransactionSelection\n }\n })\n\n return {\n destroy: () => {\n manager.destroy()\n destroyListeners.forEach(listener => manager.doc.off('destroy', listener))\n destroyListeners.clear()\n },\n }\n },\n })\n","import type { TransactionSource } from '../../../types/TransactionSource.js'\nimport { updateYFragment } from '../reconciliation/updateYFragment.js'\nimport * as Y from 'yjs'\nimport { Node } from 'prosemirror-model'\n\n/** Converts a ProseMirror document into a new or existing Yjs XML fragment. */\nexport function prosemirrorToYXmlFragment(doc: Node, xmlFragment?: Y.XmlFragment) {\n const type = xmlFragment || new Y.XmlFragment()\n const ydoc: TransactionSource = type.doc ?? { transact: callback => callback() }\n updateYFragment(ydoc, type, doc, { mapping: new Map(), isOMark: new Map() })\n return type\n}\n","import * as Y from 'yjs'\nimport { Node } from 'prosemirror-model'\nimport { prosemirrorToYXmlFragment } from './prosemirrorToYXmlFragment.js'\n\n/** Creates a Yjs document from a ProseMirror document. */\nexport function prosemirrorToYDoc(doc: Node, xmlFragment: string = 'prosemirror') {\n const ydoc = new Y.Doc()\n const type = ydoc.getXmlFragment(xmlFragment)\n if (!type.doc) {\n return ydoc\n }\n prosemirrorToYXmlFragment(doc, type)\n return type.doc\n}\n","import { Node, Schema } from 'prosemirror-model'\nimport { prosemirrorToYDoc } from './prosemirrorToYDoc.js'\n\n/** Creates a Yjs document from ProseMirror JSON using the supplied schema. */\nexport function prosemirrorJSONToYDoc(\n schema: Schema,\n state: unknown,\n xmlFragment: string = 'prosemirror',\n) {\n const doc = Node.fromJSON(schema, state)\n return prosemirrorToYDoc(doc, xmlFragment)\n}\n","import type { YType } from '../../../types/YType.js'\nimport type { ProsemirrorJSONMark } from '../../../types/ProsemirrorJSONNode.js'\nimport type { TextDelta } from '../../../types/TextDelta.js'\nimport type { ProsemirrorJSONNode } from '../../../types/ProsemirrorJSONNode.js'\nimport { yattr2markname } from './yattr2markname.js'\nimport * as Y from 'yjs'\nimport * as error from 'lib0/error'\n\n/** Reads ProseMirror JSON from a Yjs XML fragment. */\nexport function yXmlFragmentToProsemirrorJSON(xmlFragment: Y.XmlFragment) {\n const items = xmlFragment.toArray()\n const serialize = (item: YType): ProsemirrorJSONNode | ProsemirrorJSONNode[] => {\n let response: ProsemirrorJSONNode | ProsemirrorJSONNode[]\n if (item instanceof Y.XmlText) {\n const delta: TextDelta[] = item.toDelta()\n response = delta.map(d => {\n const text: ProsemirrorJSONNode = {\n type: 'text',\n text: d.insert,\n }\n const attributes = d.attributes\n if (attributes) {\n text.marks = Object.keys(attributes).map(type_ => {\n const attrs = attributes[type_]\n const type = yattr2markname(type_)\n const mark: ProsemirrorJSONMark = {\n type,\n }\n if (Object.keys(attrs)) {\n mark.attrs = attrs\n }\n return mark\n })\n }\n return text\n })\n } else if (item instanceof Y.XmlElement) {\n response = {\n type: item.nodeName,\n }\n const attrs = item.getAttributes()\n if (Object.keys(attrs).length) {\n response.attrs = attrs\n }\n const children = item.toArray()\n if (children.length) {\n response.content = children.map(serialize).flat()\n }\n } else {\n error.unexpectedCase()\n }\n return response\n }\n return {\n type: 'doc',\n content: items.map(serialize),\n }\n}\n","import * as Y from 'yjs'\nimport { yXmlFragmentToProsemirrorJSON } from './yXmlFragmentToProsemirrorJSON.js'\n\n/** Reads ProseMirror JSON from the named Yjs XML fragment. */\nexport function yDocToProsemirrorJSON(ydoc: Y.Doc, xmlFragment: string = 'prosemirror') {\n return yXmlFragmentToProsemirrorJSON(ydoc.getXmlFragment(xmlFragment))\n}\n","import * as Y from 'yjs'\nimport { Node, Schema } from 'prosemirror-model'\nimport { yDocToProsemirrorJSON } from './yDocToProsemirrorJSON.js'\n\n/** Creates a ProseMirror document from the named Yjs XML fragment. */\nexport function yDocToProsemirror(schema: Schema, ydoc: Y.Doc) {\n const state = yDocToProsemirrorJSON(ydoc)\n return Node.fromJSON(schema, state)\n}\n","import * as Y from 'yjs'\nimport { Node, Schema } from 'prosemirror-model'\nimport { prosemirrorToYXmlFragment } from './prosemirrorToYXmlFragment.js'\n\n/** Converts ProseMirror JSON into a new or existing Yjs XML fragment. */\nexport function prosemirrorJSONToYXmlFragment(\n schema: Schema,\n state: unknown,\n xmlFragment?: Y.XmlFragment,\n) {\n const doc = Node.fromJSON(schema, state)\n return prosemirrorToYXmlFragment(doc, xmlFragment)\n}\n","import * as Y from 'yjs'\nimport { Node, Schema } from 'prosemirror-model'\nimport { yXmlFragmentToProsemirrorJSON } from './yXmlFragmentToProsemirrorJSON.js'\n\n/** Creates a ProseMirror document from a Yjs XML fragment. */\nexport function yXmlFragmentToProsemirror(schema: Schema, xmlFragment: Y.XmlFragment) {\n const state = yXmlFragmentToProsemirrorJSON(xmlFragment)\n return Node.fromJSON(schema, state)\n}\n","import type { BindingMetadata } from '../../../types/BindingMetadata.js'\n\nexport const createEmptyMeta = (): BindingMetadata => ({\n mapping: new Map(),\n isOMark: new Map(),\n})\n","import { createNodeFromYElement } from './createNodeFromYElement.js'\nimport { createEmptyMeta } from './createEmptyMeta.js'\nimport * as Y from 'yjs'\nimport { Schema, Fragment } from 'prosemirror-model'\nimport * as error from 'lib0/error'\n\n/** Converts Yjs XML content to a ProseMirror fragment using the supplied schema. */\nexport const yXmlFragmentToProseMirrorFragment = (yXmlFragment: Y.XmlFragment, schema: Schema) => {\n const fragmentContent = yXmlFragment.toArray().map(t => {\n if (!(t instanceof Y.XmlElement)) throw error.methodUnimplemented()\n return createNodeFromYElement(t, schema, createEmptyMeta())\n })\n return Fragment.fromArray(fragmentContent)\n}\n","import * as Y from 'yjs'\nimport { Schema } from 'prosemirror-model'\nimport type { Node } from 'prosemirror-model'\nimport { yXmlFragmentToProseMirrorFragment } from './yXmlFragmentToProseMirrorFragment.js'\nimport { validateDocumentContent } from './validateDocumentContent.js'\n\n/** Converts Yjs XML content to the schema's top-level document node. */\nexport const yXmlFragmentToProseMirrorRootNode = (\n yXmlFragment: Y.XmlFragment,\n schema: Schema,\n): Node => {\n const content = yXmlFragmentToProseMirrorFragment(yXmlFragment, schema)\n validateDocumentContent(content, schema)\n return schema.topNodeType.createChecked(null, content)\n}\n","import { createNodeFromYElement } from './createNodeFromYElement.js'\nimport type { InitialProseMirrorDoc } from '../../../types/InitialProseMirrorDoc.js'\nimport { createEmptyMeta } from './createEmptyMeta.js'\nimport * as Y from 'yjs'\nimport { Schema, Fragment } from 'prosemirror-model'\nimport * as error from 'lib0/error'\nimport { validateDocumentContent } from './validateDocumentContent.js'\n\n/** Creates the initial ProseMirror document and its Yjs node mapping. */\nexport const initProseMirrorDoc = (\n yXmlFragment: Y.XmlFragment,\n schema: Schema,\n): InitialProseMirrorDoc => {\n const meta = createEmptyMeta()\n const fragmentContent = yXmlFragment.toArray().map(t => {\n if (!(t instanceof Y.XmlElement)) throw error.methodUnimplemented()\n return createNodeFromYElement(t, schema, meta)\n })\n const content = Fragment.fromArray(fragmentContent)\n validateDocumentContent(content, schema)\n const doc = schema.topNodeType.createChecked(null, content)\n return { doc, meta, mapping: meta.mapping }\n}\n"],"mappings":"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"}