{"version":3,"file":"index.mjs","names":["isObject","o","Object","prototype","toString","call","isPlainObject","ctor","constructor","undefined","prot","hasOwnProperty","deepEquals","node","another","key","a","b","Array","isArray","length","i","pick","obj","keys","fromEntries","entries","filter","includes","omit","omitNullEntries","value","deepEquals","normalizeInsertDelta","delta","normalized","element","insert","length","prev","push","merge","attributes","yTextToInsertDelta","yText","toDelta","getInsertLength","getInsertDeltaLength","reduce","curr","sliceInsertDelta","start","currentOffset","sliced","end","i","elementLength","startOffset","Math","max","endOffset","min","slice","Text","Y","sliceInsertDelta","yTextToInsertDelta","getSlateNodeYLength","node","isText","text","length","slatePathOffsetToYOffset","element","pathOffset","children","slice","reduce","yOffset","getYTarget","yRoot","slateRoot","path","Error","childPath","targetNode","delta","targetLength","targetDelta","yTarget","insert","XmlText","yParent","textRange","start","end","undefined","slateParent","slateTarget","yOffsetToSlateOffsets","parent","opts","assoc","currentOffset","lastNonEmptyPathOffset","child","nodeLength","endOffset","textOffset","getSlatePath","sharedRoot","yText","yNodePath","unshift","idx","yChild","currentDelta","concat","assertDocumentAttachment","sharedType","doc","Error","Element","Node","Text","Y","getInsertDeltaLength","yTextToInsertDelta","getSlatePath","getYTarget","yOffsetToSlateOffsets","assertDocumentAttachment","STORED_POSITION_PREFIX","slatePointToRelativePosition","sharedRoot","slateRoot","point","yTarget","yParent","textRange","path","Error","index","start","offset","createRelativePositionFromTypeIndex","end","absolutePositionToSlatePoint","type","assoc","XmlText","parentPath","parent","get","isText","isElement","pathOffset","textOffset","target","children","relativePositionToSlatePoint","pos","doc","absPos","createAbsolutePositionFromRelativePosition","getStoredPosition","key","rawPosition","getAttribute","decodeRelativePosition","getStoredPositions","Object","fromEntries","entries","getAttributes","filter","startsWith","map","position","slice","length","createRelativePositionFromJSON","getStoredPositionsAbsolute","removeStoredPosition","removeAttribute","setStoredPosition","setAttribute","encodeRelativePosition","getAbsolutePositionsInTextRange","absolutePositions","getAbsolutePositionsInYText","yText","positions","insertDelta","forEach","insert","i","assign","toString","getStoredPositionsInDeltaAbsolute","delta","deltaOffset","restoreStoredPositionsWithDeltaAbsolute","newDeltaOffset","previousDeltaOffset","toRestore","slateRangeToRelativeRange","range","anchor","focus","relativeRangeToSlateRange","Text","omit","getProperties","node","isText","Text","Y","yTextToInsertDelta","getProperties","yTextToSlateElement","yText","delta","children","length","map","deltaInsertToSlateNode","text","getAttributes","insert","attributes","slateNodesToInsertDelta","nodes","node","isText","slateElementToYText","yElement","XmlText","Object","entries","forEach","key","value","setAttribute","applyDelta","sanitize","Node","Path","Text","Y","deltaInsertToSlateNode","getSlateNodeYLength","getSlatePath","yOffsetToSlateOffsets","deepEquals","omitNullEntries","pick","getProperties","applyDelta","node","slatePath","delta","ops","yOffset","reduce","length","change","retain","delete","reverse","forEach","startPathOffset","startTextOffset","endPathOffset","endTextOffset","assoc","pathOffset","child","children","childPath","isText","newProperties","attributes","properties","Object","keys","start","end","text","push","type","path","position","offset","slice","textOffset","insert","previousPathOffset","previousChild","lastOp","currentProps","lastPath","equals","toInsert","next","translateYTextEvent","sharedRoot","editor","event","target","changes","XmlText","Error","targetElement","get","keyChanges","Array","from","entries","fromEntries","map","key","info","action","getAttribute","Editor","Y","translateYTextEvent","translateYjsEvent","sharedRoot","editor","event","YTextEvent","Error","applyYjsEvents","events","withoutNormalizing","forEach","op","apply","Text","slateElementToYText","getYTarget","getProperties","insertNode","sharedRoot","slateRoot","op","yParent","textRange","path","isText","node","insert","start","text","insertEmbed","Y","yTextToInsertDelta","cloneInsertDeltaDeep","delta","map","element","insert","cloneDeep","yText","clone","XmlText","attributes","getAttributes","Object","entries","forEach","key","value","setAttribute","applyDelta","sanitize","Node","Path","Text","cloneInsertDeltaDeep","yTextToInsertDelta","getYTarget","getStoredPositionsInDeltaAbsolute","restoreStoredPositionsWithDeltaAbsolute","getProperties","mergeNode","sharedRoot","slateRoot","op","target","path","prev","yParent","slateParent","previous","slice","yTarget","Error","parent","textRange","slateTarget","prevSibling","get","isText","targetProps","prevSiblingProps","unsetProps","Object","keys","reduce","acc","key","prevSiblingHasProp","format","start","end","deltaApplyYOffset","length","targetDelta","clonedDelta","storedPositions","applyDelta","retain","sanitize","delete","Node","Path","Text","cloneInsertDeltaDeep","getInsertDeltaLength","yTextToInsertDelta","getYTarget","getStoredPositionsInDeltaAbsolute","restoreStoredPositionsWithDeltaAbsolute","moveNode","sharedRoot","slateRoot","op","newParentPath","parent","newPath","newPathOffset","length","get","isText","Error","normalizedNewPath","Math","min","children","origin","path","target","insertDelta","targetDelta","storedPositions","yParent","originLength","textRange","end","start","originPathOffset","movesForwardInSameParent","equals","targetOffset","delete","targetLength","deltaApplyYOffset","applyDelta","retain","sanitize","getYTarget","removeNode","sharedRoot","slateRoot","op","yParent","parent","textRange","path","delete","start","end","getYTarget","setNode","sharedRoot","slateRoot","op","yTarget","textRange","yParent","path","Object","entries","newProperties","forEach","key","value","removeAttribute","setAttribute","properties","prototype","hasOwnProperty","call","unset","fromEntries","keys","map","format","start","end","Text","Y","cloneInsertDeltaDeep","sliceInsertDelta","yTextToInsertDelta","getSlateNodeYLength","getYTarget","getStoredPositionsInDeltaAbsolute","restoreStoredPositionsWithDeltaAbsolute","splitNode","sharedRoot","slateRoot","op","target","path","slateTarget","Error","yTarget","isText","unset","targetDelta","forEach","element","attributes","Object","keys","key","yParent","format","textRange","start","end","properties","splitTarget","position","ySplitOffset","children","slice","reduce","length","child","current","splitDelta","clonedDelta","storedPositions","toInsert","XmlText","applyDelta","sanitize","entries","value","setAttribute","delete","insertEmbed","insertNode","mergeNode","moveNode","removeNode","setNode","splitNode","NODE_MAPPER","insert_node","remove_node","set_node","merge_node","move_node","split_node","Node","Text","getYTarget","getProperties","insertText","sharedRoot","slateRoot","op","yParent","target","textRange","path","targetNode","get","isText","Error","insert","start","offset","text","getYTarget","removeText","sharedRoot","slateRoot","op","yParent","target","textRange","path","delete","start","offset","text","length","insertText","removeText","TEXT_MAPPER","insert_text","remove_text","NODE_MAPPER","TEXT_MAPPER","NOOP","opMappers","set_selection","applySlateOp","sharedRoot","slateRoot","op","apply","type","Error","Editor","Y","applyYjsEvents","applySlateOp","yTextToSlateElement","getStoredPosition","getStoredPositions","relativePositionToSlatePoint","removeStoredPosition","setStoredPosition","slatePointToRelativePosition","assertDocumentAttachment","DEFAULT_LOCAL_ORIGIN","Symbol","DEFAULT_POSITION_STORAGE_ORIGIN","ORIGIN","WeakMap","LOCAL_CHANGES","CONNECTED","WeakSet","YjsEditor","isYjsEditor","value","isEditor","sharedRoot","XmlText","applyRemoteEvents","storeLocalChange","flushLocalChanges","isLocalOrigin","connect","disconnect","localChanges","editor","get","events","origin","op","connected","has","isLocal","undefined","localOrigin","withOrigin","fn","prev","set","storePosition","key","point","positionStorageOrigin","locationStorageOrigin","position","doc","transact","storedPositionsRelative","withYjs","options","e","withoutNormalizing","handleYEvents","transaction","autoConnectTimeoutId","autoConnect","setTimeout","Error","observeDeep","content","children","add","normalize","force","operations","length","onChange","clearTimeout","unobserveDeep","delete","txGroups","forEach","change","currentGroup","push","txGroup","apply","Y","slateRangeToRelativeRange","YjsEditor","CURSOR_CHANGE_EVENT_LISTENERS","WeakMap","CursorEditor","isCursorEditor","value","isYjsEditor","awareness","cursorDataField","selectionStateField","sendCursorPosition","sendCursorData","editor","range","selection","data","on","event","handler","listeners","get","Set","add","set","off","listener","delete","cursorState","clientId","clientID","connected","state","getStates","relativeSelection","cursorStates","Object","fromEntries","Array","from","entries","id","filter","isArray","withCursors","options","cursorStateField","autoSend","e","cursorData","setLocalStateField","localState","getLocalState","currentRange","anchor","focus","sharedRoot","compareRelativePositions","awarenessChangeListener","yEvent","localId","added","removed","updated","length","forEach","connect","disconnect","keys","onChange","Transforms","Y","relativeRangeToSlateRange","slateRangeToRelativeRange","YjsEditor","LAST_SELECTION","WeakMap","DEFAULT_WITHOUT_SAVING_ORIGIN","Symbol","YHistoryEditor","isYHistoryEditor","value","isYjsEditor","undoManager","UndoManager","undo","redo","canUndo","editor","undoStack","length","canRedo","redoStack","isSaving","trackedOrigins","has","origin","withoutSaving","fn","withOrigin","withoutSavingOrigin","withYHistory","options","e","Set","localOrigin","restOptions","sharedRoot","onChange","isLocalOrigin","set","selection","handleStackItemAdded","stackItem","meta","get","handleStackItemUpdated","handleStackItemPopped","type","inverseStack","inverseItem","relativeSelection","select","connect","disconnect","on","off","connected","flushLocalChanges"],"sources":["../src/utils/object.ts","../src/utils/delta.ts","../src/utils/location.ts","../src/utils/yjs.ts","../src/utils/position.ts","../src/utils/slate.ts","../src/utils/convert.ts","../src/applyToSlate/textEvent.ts","../src/applyToSlate/index.ts","../src/applyToYjs/node/insertNode.ts","../src/utils/clone.ts","../src/applyToYjs/node/mergeNode.ts","../src/applyToYjs/node/moveNode.ts","../src/applyToYjs/node/removeNode.ts","../src/applyToYjs/node/setNode.ts","../src/applyToYjs/node/splitNode.ts","../src/applyToYjs/node/index.ts","../src/applyToYjs/text/insertText.ts","../src/applyToYjs/text/removeText.ts","../src/applyToYjs/text/index.ts","../src/applyToYjs/index.ts","../src/plugins/withYjs.ts","../src/plugins/withCursors.ts","../src/plugins/withYHistory.ts"],"sourcesContent":["type InspectableObject = Record<string | number | symbol, unknown>\n\nfunction isObject(o: unknown): o is InspectableObject {\n  return Object.prototype.toString.call(o) === '[object Object]'\n}\n\nexport function isPlainObject(o: unknown): o is InspectableObject {\n  if (!isObject(o)) {\n    return false\n  }\n\n  // If has modified constructor\n  const ctor = o.constructor\n\n  if (ctor === undefined) {\n    return true\n  }\n\n  // If has modified prototype\n  const prot = ctor.prototype\n\n  if (isObject(prot) === false) {\n    return false\n  }\n\n  // If constructor does not have an Object-specific method\n\n  if (Object.prototype.hasOwnProperty.call(prot, 'isPrototypeOfOf')) {\n    return false\n  }\n\n  // Most likely a plain Object\n  return true\n}\n\n// Slates deep equality function: https://github.com/ianstormtaylor/slate/blob/68aff89e892fe15a16314398ff052ade6068900b/packages/slate/src/utils/deep-equal.ts#L13\n// We have to match slates deepEquals behavior to merge insert deltas in the same way slate does.\nexport function deepEquals(node: InspectableObject, another: InspectableObject): boolean {\n  // eslint-disable-next-line guard-for-in\n  for (const key in node) {\n    const a = node[key]\n    const b = another[key]\n\n    if (isPlainObject(a) && isPlainObject(b)) {\n      if (!deepEquals(a, b)) {\n        return false\n      }\n    } else if (Array.isArray(a) && Array.isArray(b)) {\n      if (a.length !== b.length) { return false }\n      for (let i = 0; i < a.length; i += 1) {\n        if (a[i] !== b[i]) {\n          return false\n        }\n      }\n    } else if (a !== b) {\n      return false\n    }\n  }\n\n  for (const key in another) {\n    if (node[key] === undefined && another[key] !== undefined) {\n      return false\n    }\n  }\n\n  return true\n}\n\nexport function pick<TObj extends Object, TKeys extends keyof TObj>(\n  obj: TObj,\n  ...keys: TKeys[]\n): Pick<TObj, TKeys> {\n  return Object.fromEntries(\n    Object.entries(obj).filter(([key]) => keys.includes(key as TKeys)),\n  ) as Pick<TObj, TKeys>\n}\n\nexport function omit<TObj extends Object, TKeys extends keyof TObj>(\n  obj: TObj,\n  ...keys: TKeys[]\n): Omit<TObj, TKeys> {\n  return Object.fromEntries(\n    Object.entries(obj).filter(([key]) => !keys.includes(key as TKeys)),\n  ) as Omit<TObj, TKeys>\n}\n\nexport function omitNullEntries<TObj extends Object>(\n  obj: TObj,\n): {\n  [K in keyof TObj]: TObj[K] extends null ? never : K\n} {\n  return Object.fromEntries(Object.entries(obj).filter(([, value]) => value !== null)) as {\n    [K in keyof TObj]: TObj[K] extends null ? never : K\n  }\n}\n","import * as Y from 'yjs'\n\nimport { DeltaInsert, InsertDelta } from '../module/custom-types'\nimport { deepEquals } from './object'\n\nexport function normalizeInsertDelta(delta: InsertDelta): InsertDelta {\n  const normalized: InsertDelta = []\n\n  for (const element of delta) {\n    if (typeof element.insert === 'string' && element.insert.length === 0) {\n      continue\n    }\n\n    const prev = normalized[normalized.length - 1]\n\n    if (!prev || typeof prev.insert !== 'string' || typeof element.insert !== 'string') {\n      normalized.push(element)\n      continue\n    }\n\n    const merge = prev.attributes === element.attributes\n      || (!prev.attributes === !element.attributes\n        && deepEquals(prev.attributes ?? {}, element.attributes ?? {}))\n\n    if (merge) {\n      prev.insert += element.insert\n      continue\n    }\n\n    normalized.push(element)\n  }\n\n  return normalized\n}\n\nexport function yTextToInsertDelta(yText: Y.XmlText): InsertDelta {\n  return normalizeInsertDelta(yText.toDelta())\n}\n\nexport function getInsertLength({ insert }: DeltaInsert): number {\n  return typeof insert === 'string' ? insert.length : 1\n}\n\nexport function getInsertDeltaLength(delta: InsertDelta): number {\n  return delta.reduce((curr, element) => curr + getInsertLength(element), 0)\n}\n\nexport function sliceInsertDelta(delta: InsertDelta, start: number, length: number): InsertDelta {\n  if (length < 1) {\n    return []\n  }\n\n  let currentOffset = 0\n  const sliced: InsertDelta = []\n  const end = start + length\n\n  for (let i = 0; i < delta.length; i += 1) {\n    if (currentOffset >= end) {\n      break\n    }\n\n    const element = delta[i]\n    const elementLength = getInsertLength(element)\n\n    if (currentOffset + elementLength <= start) {\n      currentOffset += elementLength\n      continue\n    }\n\n    if (typeof element.insert !== 'string') {\n      currentOffset += elementLength\n      sliced.push(element)\n      continue\n    }\n\n    const startOffset = Math.max(0, start - currentOffset)\n    const endOffset = Math.min(elementLength, elementLength - (currentOffset + elementLength - end))\n\n    sliced.push({\n      ...element,\n      insert: element.insert.slice(startOffset, endOffset),\n    })\n    currentOffset += elementLength\n  }\n\n  return sliced\n}\n","import {\n  Element, Node, Path, Text,\n} from 'slate'\nimport * as Y from 'yjs'\n\nimport { YTarget } from '../module/custom-types'\nimport { sliceInsertDelta, yTextToInsertDelta } from './delta'\n\nexport function getSlateNodeYLength(node: Node | undefined): number {\n  if (!node) {\n    return 0\n  }\n\n  return Text.isText(node) ? node.text.length : 1\n}\n\nexport function slatePathOffsetToYOffset(element: Element, pathOffset: number) {\n  return element.children\n    .slice(0, pathOffset)\n    .reduce((yOffset, node) => yOffset + getSlateNodeYLength(node), 0)\n}\n\nexport function getYTarget(yRoot: Y.XmlText, slateRoot: Node, path: Path): YTarget {\n  if (path.length === 0) {\n    throw new Error('Path has to a have a length >= 1')\n  }\n\n  if (Text.isText(slateRoot)) {\n    throw new Error('Cannot descent into slate text')\n  }\n\n  const [pathOffset, ...childPath] = path\n\n  const yOffset = slatePathOffsetToYOffset(slateRoot as Element, pathOffset)\n  const targetNode = slateRoot.children[pathOffset]\n\n  const delta = yTextToInsertDelta(yRoot)\n  const targetLength = getSlateNodeYLength(targetNode)\n\n  const targetDelta = sliceInsertDelta(delta, yOffset, targetLength)\n\n  if (targetDelta.length > 1) {\n    throw new Error(\"Path doesn't match yText, yTarget spans multiple nodes\")\n  }\n\n  const yTarget = targetDelta[0]?.insert\n\n  if (childPath.length > 0) {\n    if (!(yTarget instanceof Y.XmlText)) {\n      throw new Error(\"Path doesn't match yText, cannot descent into non-yText\")\n    }\n\n    return getYTarget(yTarget, targetNode, childPath)\n  }\n\n  return {\n    yParent: yRoot,\n    textRange: { start: yOffset, end: yOffset + targetLength },\n    yTarget: yTarget instanceof Y.XmlText ? yTarget : undefined,\n    slateParent: slateRoot,\n    slateTarget: targetNode,\n    targetDelta,\n  }\n}\n\nexport function yOffsetToSlateOffsets(\n  parent: Element,\n  yOffset: number,\n  opts: { assoc?: number; insert?: boolean } = {},\n): [number, number] {\n  const { assoc = 0, insert = false } = opts\n\n  let currentOffset = 0\n  let lastNonEmptyPathOffset = 0\n\n  for (let pathOffset = 0; pathOffset < parent.children.length; pathOffset += 1) {\n    const child = parent.children[pathOffset]\n    const nodeLength = Text.isText(child) ? child.text.length : 1\n\n    if (nodeLength > 0) {\n      lastNonEmptyPathOffset = pathOffset\n    }\n\n    const endOffset = currentOffset + nodeLength\n\n    if (nodeLength > 0 && (assoc >= 0 ? endOffset > yOffset : endOffset >= yOffset)) {\n      return [pathOffset, yOffset - currentOffset]\n    }\n\n    currentOffset += nodeLength\n  }\n\n  if (yOffset > currentOffset + (insert ? 1 : 0)) {\n    throw new Error('yOffset out of bounds')\n  }\n\n  if (insert) {\n    return [parent.children.length, 0]\n  }\n\n  const child = parent.children[lastNonEmptyPathOffset]\n  const textOffset = Text.isText(child) ? child.text.length : 1\n\n  return [lastNonEmptyPathOffset, textOffset]\n}\n\nexport function getSlatePath(sharedRoot: Y.XmlText, slateRoot: Node, yText: Y.XmlText): Path {\n  const yNodePath = [yText]\n\n  while (yNodePath[0] !== sharedRoot) {\n    const { parent: yParent } = yNodePath[0]\n\n    if (!yParent) {\n      throw new Error(\"yText isn't a descendant of root element\")\n    }\n\n    if (!(yParent instanceof Y.XmlText)) {\n      throw new Error('Unexpected y parent type')\n    }\n\n    yNodePath.unshift(yParent)\n  }\n\n  if (yNodePath.length < 2) {\n    return []\n  }\n\n  let slateParent = slateRoot\n\n  return yNodePath.reduce<Path>((path, yParent, idx) => {\n    const yChild = yNodePath[idx + 1]\n\n    if (!yChild) {\n      return path\n    }\n\n    let yOffset = 0\n    const currentDelta = yTextToInsertDelta(yParent)\n\n    for (const element of currentDelta) {\n      if (element.insert === yChild) {\n        break\n      }\n\n      yOffset += typeof element.insert === 'string' ? element.insert.length : 1\n    }\n\n    if (Text.isText(slateParent)) {\n      throw new Error('Cannot descent into slate text')\n    }\n\n    const [pathOffset] = yOffsetToSlateOffsets(slateParent as Element, yOffset)\n\n    slateParent = slateParent.children[pathOffset]\n    return path.concat(pathOffset)\n  }, [])\n}\n","import * as Y from 'yjs'\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function assertDocumentAttachment<T extends Y.AbstractType<any>>(\n  sharedType: T,\n): asserts sharedType is T & { doc: NonNullable<T['doc']> } {\n  if (!sharedType.doc) {\n    throw new Error(\"shared type isn't attached to a document\")\n  }\n}\n","import {\n  BasePoint, BaseRange, Element, Node, Text,\n} from 'slate'\nimport * as Y from 'yjs'\n\nimport { InsertDelta, RelativeRange, TextRange } from '../module/custom-types'\nimport { getInsertDeltaLength, yTextToInsertDelta } from './delta'\nimport { getSlatePath, getYTarget, yOffsetToSlateOffsets } from './location'\nimport { assertDocumentAttachment } from './yjs'\n\nexport const STORED_POSITION_PREFIX = '__slateYjsStoredPosition_'\n\nexport function slatePointToRelativePosition(\n  sharedRoot: Y.XmlText,\n  slateRoot: Node,\n  point: BasePoint,\n): Y.RelativePosition {\n  const { yTarget, yParent, textRange } = getYTarget(sharedRoot, slateRoot, point.path)\n\n  if (yTarget) {\n    throw new Error('Slate point points to a non-text element inside sharedRoot')\n  }\n\n  const index = textRange.start + point.offset\n\n  return Y.createRelativePositionFromTypeIndex(yParent, index, index === textRange.end ? -1 : 0)\n}\n\nexport function absolutePositionToSlatePoint(\n  sharedRoot: Y.XmlText,\n  slateRoot: Node,\n  { type, index, assoc }: Y.AbsolutePosition,\n): BasePoint | null {\n  if (!(type instanceof Y.XmlText)) {\n    throw new Error('Absolute position points to a non-XMLText')\n  }\n\n  const parentPath = getSlatePath(sharedRoot, slateRoot, type)\n  const parent = Node.get(slateRoot, parentPath)\n\n  if (Text.isText(parent) || !Element.isElement(parent)) {\n    throw new Error(\"Absolute position doesn't match slateRoot, cannot descent into text and EditorRoot\")\n  }\n\n  const [pathOffset, textOffset] = yOffsetToSlateOffsets(parent, index, {\n    assoc,\n  })\n\n  const target = parent.children[pathOffset]\n\n  if (!Text.isText(target)) {\n    return null\n  }\n\n  return { path: [...parentPath, pathOffset], offset: textOffset }\n}\n\nexport function relativePositionToSlatePoint(\n  sharedRoot: Y.XmlText,\n  slateRoot: Node,\n  pos: Y.RelativePosition,\n): BasePoint | null {\n  if (!sharedRoot.doc) {\n    throw new Error(\"sharedRoot isn't attach to a yDoc\")\n  }\n\n  const absPos = Y.createAbsolutePositionFromRelativePosition(pos, sharedRoot.doc)\n\n  return absPos && absolutePositionToSlatePoint(sharedRoot, slateRoot, absPos)\n}\n\nexport function getStoredPosition(sharedRoot: Y.XmlText, key: string): Y.RelativePosition | null {\n  const rawPosition = sharedRoot.getAttribute(STORED_POSITION_PREFIX + key)\n\n  if (!rawPosition) {\n    return null\n  }\n\n  return Y.decodeRelativePosition(rawPosition)\n}\n\nexport function getStoredPositions(sharedRoot: Y.XmlText): Record<string, Y.RelativePosition> {\n  return Object.fromEntries(\n    Object.entries(sharedRoot.getAttributes())\n      .filter(([key]) => key.startsWith(STORED_POSITION_PREFIX))\n      .map(([key, position]) => [\n        key.slice(STORED_POSITION_PREFIX.length),\n        Y.createRelativePositionFromJSON(position),\n      ]),\n  )\n}\n\nfunction getStoredPositionsAbsolute(sharedRoot: Y.XmlText) {\n  assertDocumentAttachment(sharedRoot)\n\n  return Object.fromEntries(\n    Object.entries(sharedRoot.getAttributes())\n      .filter(([key]) => key.startsWith(STORED_POSITION_PREFIX))\n      .map(\n        ([key, position]) => [\n          key.slice(STORED_POSITION_PREFIX.length),\n          Y.createAbsolutePositionFromRelativePosition(\n            Y.decodeRelativePosition(position),\n            sharedRoot.doc,\n          ),\n        ] as const,\n      )\n      .filter(([, position]) => position),\n  ) as Record<string, Y.AbsolutePosition>\n}\n\nexport function removeStoredPosition(sharedRoot: Y.XmlText, key: string) {\n  sharedRoot.removeAttribute(STORED_POSITION_PREFIX + key)\n}\n\nexport function setStoredPosition(\n  sharedRoot: Y.XmlText,\n  key: string,\n  position: Y.RelativePosition,\n) {\n  sharedRoot.setAttribute(STORED_POSITION_PREFIX + key, Y.encodeRelativePosition(position))\n}\n\nfunction getAbsolutePositionsInTextRange(\n  absolutePositions: Record<string, Y.AbsolutePosition>,\n  yTarget: Y.XmlText,\n  textRange?: TextRange,\n) {\n  return Object.fromEntries(\n    Object.entries(absolutePositions).filter(([, position]) => {\n      if (position.type !== yTarget) {\n        return false\n      }\n\n      if (!textRange) {\n        return true\n      }\n\n      return position.assoc >= 0\n        ? position.index >= textRange.start && position.index < textRange.end\n        : position.index > textRange.start && position.index >= textRange.end\n    }),\n  )\n}\n\nfunction getAbsolutePositionsInYText(\n  absolutePositions: Record<string, Y.AbsolutePosition>,\n  yText: Y.XmlText,\n  parentPath = '',\n): Record<string, Record<string, Y.AbsolutePosition>> {\n  const positions = {\n    [parentPath]: getAbsolutePositionsInTextRange(absolutePositions, yText),\n  }\n\n  const insertDelta = yTextToInsertDelta(yText)\n\n  insertDelta.forEach(({ insert }, i) => {\n    if (insert instanceof Y.XmlText) {\n      Object.assign(\n        positions,\n        getAbsolutePositionsInYText(\n          absolutePositions,\n          insert,\n          parentPath ? `${parentPath}.${i}` : i.toString(),\n        ),\n      )\n    }\n  })\n\n  return positions\n}\n\nexport function getStoredPositionsInDeltaAbsolute(\n  sharedRoot: Y.XmlText,\n  yText: Y.XmlText,\n  delta: InsertDelta,\n  deltaOffset = 0,\n) {\n  const absolutePositions = getStoredPositionsAbsolute(sharedRoot)\n\n  const positions = {\n    '': getAbsolutePositionsInTextRange(absolutePositions, yText, {\n      start: deltaOffset,\n      end: deltaOffset + getInsertDeltaLength(delta),\n    }),\n  }\n\n  delta.forEach(({ insert }, i) => {\n    if (insert instanceof Y.XmlText) {\n      Object.assign(positions, getAbsolutePositionsInYText(absolutePositions, insert, i.toString()))\n    }\n  })\n\n  return positions\n}\n\nexport function restoreStoredPositionsWithDeltaAbsolute(\n  sharedRoot: Y.XmlText,\n  yText: Y.XmlText,\n  absolutePositions: Record<string, Record<string, Y.AbsolutePosition>>,\n  delta: InsertDelta,\n  newDeltaOffset = 0,\n  previousDeltaOffset = 0,\n  path = '',\n) {\n  const toRestore = absolutePositions[path]\n\n  if (toRestore) {\n    Object.entries(toRestore).forEach(([key, position]) => {\n      setStoredPosition(\n        sharedRoot,\n        key,\n        Y.createRelativePositionFromTypeIndex(\n          yText,\n          position.index - previousDeltaOffset + newDeltaOffset,\n          position.assoc,\n        ),\n      )\n    })\n  }\n\n  delta.forEach(({ insert }, i) => {\n    if (insert instanceof Y.XmlText) {\n      restoreStoredPositionsWithDeltaAbsolute(\n        sharedRoot,\n        insert,\n        absolutePositions,\n        yTextToInsertDelta(insert),\n        0,\n        0,\n        path ? `${path}.${i}` : i.toString(),\n      )\n    }\n  })\n}\n\nexport function slateRangeToRelativeRange(\n  sharedRoot: Y.XmlText,\n  slateRoot: Node,\n  range: BaseRange,\n): RelativeRange {\n  return {\n    anchor: slatePointToRelativePosition(sharedRoot, slateRoot, range.anchor),\n    focus: slatePointToRelativePosition(sharedRoot, slateRoot, range.focus),\n  }\n}\n\nexport function relativeRangeToSlateRange(\n  sharedRoot: Y.XmlText,\n  slateRoot: Node,\n  range: RelativeRange,\n): BaseRange | null {\n  const anchor = relativePositionToSlatePoint(sharedRoot, slateRoot, range.anchor)\n\n  if (!anchor) {\n    return null\n  }\n\n  const focus = relativePositionToSlatePoint(sharedRoot, slateRoot, range.focus)\n\n  if (!focus) {\n    return null\n  }\n\n  return { anchor, focus }\n}\n","import { BaseText, Descendant, Text } from 'slate'\n\nimport { omit } from './object'\n\nexport function getProperties<TNode extends Descendant>(\n  node: TNode,\n): Omit<TNode, TNode extends BaseText ? 'text' : 'children'> {\n  return omit(node, (Text.isText(node) ? 'text' : 'children') as keyof TNode) as Omit<\n    TNode,\n    TNode extends BaseText ? 'text' : 'children'\n  >\n}\n","import { Element, Node, Text } from 'slate'\nimport * as Y from 'yjs'\n\nimport { DeltaInsert, InsertDelta } from '../module/custom-types'\nimport { yTextToInsertDelta } from './delta'\nimport { getProperties } from './slate'\n\nexport function yTextToSlateElement(yText: Y.XmlText): Element {\n  const delta = yTextToInsertDelta(yText)\n\n  // eslint-disable-next-line @typescript-eslint/no-use-before-define\n  const children = delta.length > 0 ? delta.map(deltaInsertToSlateNode) : [{ text: '' }]\n\n  // @ts-ignore\n  return { ...yText.getAttributes(), children }\n}\n\nexport function deltaInsertToSlateNode(insert: DeltaInsert): Node {\n  if (typeof insert.insert === 'string') {\n    return { ...insert.attributes, text: insert.insert }\n  }\n\n  return yTextToSlateElement(insert.insert)\n}\n\nexport function slateNodesToInsertDelta(nodes: Node[]): InsertDelta {\n  return nodes.map(node => {\n    if (Text.isText(node)) {\n      return { insert: node.text, attributes: getProperties(node) }\n    }\n\n    // eslint-disable-next-line @typescript-eslint/no-use-before-define\n    return { insert: slateElementToYText(node as Element) }\n  })\n}\n\nexport function slateElementToYText({ children, ...attributes }: Element): Y.XmlText {\n  const yElement = new Y.XmlText()\n\n  Object.entries(attributes).forEach(([key, value]) => {\n    yElement.setAttribute(key, value)\n  })\n\n  yElement.applyDelta(slateNodesToInsertDelta(children), { sanitize: false })\n  return yElement\n}\n","import { Editor, Element, Node, Operation, Path, Text } from 'slate'\nimport * as Y from 'yjs'\n\nimport { Delta } from '../module/custom-types'\nimport { deltaInsertToSlateNode } from '../utils/convert'\nimport { getSlateNodeYLength, getSlatePath, yOffsetToSlateOffsets } from '../utils/location'\nimport { deepEquals, omitNullEntries, pick } from '../utils/object'\nimport { getProperties } from '../utils/slate'\n\nfunction applyDelta(node: Element, slatePath: Path, delta: Delta): Operation[] {\n  const ops: Operation[] = []\n\n  let yOffset = delta.reduce((length, change) => {\n    if ('retain' in change) {\n      return length + change.retain\n    }\n\n    if ('delete' in change) {\n      return length + change.delete\n    }\n\n    return length\n  }, 0)\n\n  // Apply changes in reverse order to avoid path changes.\n  delta.reverse().forEach(change => {\n    if ('attributes' in change && 'retain' in change) {\n      const [startPathOffset, startTextOffset] = yOffsetToSlateOffsets(\n        node,\n        yOffset - change.retain\n      )\n      const [endPathOffset, endTextOffset] = yOffsetToSlateOffsets(node, yOffset, { assoc: -1 })\n\n      for (let pathOffset = endPathOffset; pathOffset >= startPathOffset; pathOffset -= 1) {\n        const child = node.children[pathOffset]\n        const childPath = [...slatePath, pathOffset]\n\n        if (!Text.isText(child)) {\n          // Ignore attribute updates on non-text nodes (which are backed by Y.XmlText)\n          // to be consistent with deltaInsertToSlateNode. Y.XmlText attributes don't show\n          // up in deltas but in key changes (YEvent.changes.keys).\n          continue\n        }\n\n        const newProperties = change.attributes\n        const properties = pick(node, ...(Object.keys(change.attributes) as Array<keyof Element>))\n\n        if (pathOffset === startPathOffset || pathOffset === endPathOffset) {\n          const start = pathOffset === startPathOffset ? startTextOffset : 0\n          const end = pathOffset === endPathOffset ? endTextOffset : child.text.length\n\n          if (end !== child.text.length) {\n            ops.push({\n              type: 'split_node',\n              path: childPath,\n              position: end,\n              properties: getProperties(child),\n            })\n          }\n\n          if (start !== 0) {\n            ops.push({\n              type: 'split_node',\n              path: childPath,\n              position: start,\n              properties: omitNullEntries({\n                ...getProperties(child),\n                ...newProperties,\n              }),\n            })\n\n            continue\n          }\n        }\n\n        ops.push({\n          type: 'set_node',\n          newProperties,\n          path: childPath,\n          properties,\n        })\n      }\n    }\n\n    if ('retain' in change) {\n      yOffset -= change.retain\n    }\n\n    if ('delete' in change) {\n      const [startPathOffset, startTextOffset] = yOffsetToSlateOffsets(\n        node,\n        yOffset - change.delete\n      )\n      const [endPathOffset, endTextOffset] = yOffsetToSlateOffsets(node, yOffset, { assoc: -1 })\n\n      for (\n        let pathOffset = endTextOffset === 0 ? endPathOffset - 1 : endPathOffset;\n        pathOffset >= startPathOffset;\n        pathOffset -= 1\n      ) {\n        const child = node.children[pathOffset]\n        const childPath = [...slatePath, pathOffset]\n\n        if (\n          Text.isText(child) &&\n          (pathOffset === startPathOffset || pathOffset === endPathOffset)\n        ) {\n          const start = pathOffset === startPathOffset ? startTextOffset : 0\n          const end = pathOffset === endPathOffset ? endTextOffset : child.text.length\n\n          ops.push({\n            type: 'remove_text',\n            offset: start,\n            text: child.text.slice(start, end),\n            path: childPath,\n          })\n\n          yOffset -= end - start\n          continue\n        }\n\n        ops.push({\n          type: 'remove_node',\n          node: child,\n          path: childPath,\n        })\n        yOffset -= getSlateNodeYLength(child)\n      }\n\n      return\n    }\n\n    if ('insert' in change) {\n      let [pathOffset, textOffset] = yOffsetToSlateOffsets(node, yOffset, {\n        insert: true,\n      })\n      let child = node.children[pathOffset]\n\n      if (\n        typeof change.insert === 'string' &&\n        pathOffset > 0 &&\n        (child == null || textOffset === 0)\n      ) {\n        const previousPathOffset = pathOffset - 1\n        const previousChild = node.children[previousPathOffset]\n\n        if (\n          Text.isText(previousChild) &&\n          deepEquals(change.attributes ?? {}, getProperties(previousChild))\n        ) {\n          pathOffset = previousPathOffset\n          textOffset = previousChild.text.length\n          child = previousChild\n        }\n      }\n\n      const childPath = [...slatePath, pathOffset]\n\n      if (Text.isText(child)) {\n        const lastOp = ops[ops.length - 1]\n\n        /**\n         * The props that exist at the current path\n         * Since we're not actually using slate to update the node\n         * this is a simulation\n         */\n        const currentProps =\n          lastOp != null && lastOp.type === 'insert_node' ? lastOp.node : getProperties(child)\n\n        let lastPath: Path = []\n\n        if (\n          lastOp != null &&\n          (lastOp.type === 'insert_node' ||\n            lastOp.type === 'insert_text' ||\n            lastOp.type === 'split_node' ||\n            lastOp.type === 'set_node')\n        ) {\n          lastPath = lastOp.path\n        }\n\n        /**\n         * If the insert is a string and the attributes are the same as the\n         * props at the current path, we can just insert a text node\n         */\n        if (\n          typeof change.insert === 'string' &&\n          deepEquals(change.attributes ?? {}, currentProps) &&\n          (lastOp == null || Path.equals(childPath, lastPath))\n        ) {\n          return ops.push({\n            type: 'insert_text',\n            offset: textOffset,\n            text: change.insert,\n            path: childPath,\n          })\n        }\n\n        const toInsert = deltaInsertToSlateNode(change)\n\n        if (textOffset === 0) {\n          return ops.push({\n            type: 'insert_node',\n            path: childPath,\n            node: toInsert,\n          })\n        }\n\n        if (textOffset < child.text.length) {\n          ops.push({\n            type: 'split_node',\n            path: childPath,\n            position: textOffset,\n            properties: getProperties(child),\n          })\n        }\n\n        return ops.push({\n          type: 'insert_node',\n          path: Path.next(childPath),\n          node: toInsert,\n        })\n      }\n\n      return ops.push({\n        type: 'insert_node',\n        path: childPath,\n        node: deltaInsertToSlateNode(change),\n      })\n    }\n  })\n\n  return ops\n}\n\nexport function translateYTextEvent(\n  sharedRoot: Y.XmlText,\n  editor: Editor,\n  event: Y.YTextEvent\n): Operation[] {\n  const { target, changes } = event\n  const delta = event.delta as Delta\n\n  if (!(target instanceof Y.XmlText)) {\n    throw new Error('Unexpected target node type')\n  }\n\n  const ops: Operation[] = []\n  const slatePath = getSlatePath(sharedRoot, editor, target)\n  const targetElement = Node.get(editor, slatePath)\n\n  if (Text.isText(targetElement)) {\n    throw new Error('Cannot apply yTextEvent to text node')\n  }\n\n  const keyChanges = Array.from(changes.keys.entries())\n\n  if (slatePath.length > 0 && keyChanges.length > 0) {\n    const newProperties = Object.fromEntries(\n      keyChanges.map(([key, info]) => [\n        key,\n        info.action === 'delete' ? null : target.getAttribute(key),\n      ])\n    )\n\n    const properties = Object.fromEntries(keyChanges.map(([key]) => [key, targetElement[key]]))\n\n    ops.push({\n      type: 'set_node',\n      newProperties,\n      properties,\n      path: slatePath,\n    })\n  }\n\n  if (delta.length > 0) {\n    ops.push(...applyDelta(targetElement as Element, slatePath, delta))\n  }\n\n  return ops\n}\n","import { Editor, Operation } from 'slate'\nimport * as Y from 'yjs'\n\nimport { translateYTextEvent } from './textEvent'\n\n/**\n * Translate a yjs event into slate operations. The editor state has to match the\n * yText state before the event occurred.\n *\n * @param sharedType\n * @param op\n */\nexport function translateYjsEvent(\n  sharedRoot: Y.XmlText,\n  editor: Editor,\n  event: Y.YEvent<Y.XmlText>,\n): Operation[] {\n  if (event instanceof Y.YTextEvent) {\n    return translateYTextEvent(sharedRoot, editor, event)\n  }\n\n  throw new Error('Unexpected Y event type')\n}\n\n/**\n * Translates yjs events into slate operations and applies them to the editor. The\n * editor state has to match the yText state before the events occurred.\n *\n * @param sharedRoot\n * @param editor\n * @param events\n */\nexport function applyYjsEvents(\n  sharedRoot: Y.XmlText,\n  editor: Editor,\n  events: Y.YEvent<Y.XmlText>[],\n) {\n  Editor.withoutNormalizing(editor, () => {\n    events.forEach(event => {\n      translateYjsEvent(sharedRoot, editor, event).forEach(op => {\n        editor.apply(op)\n      })\n    })\n  })\n}\n","import {\n  Element, InsertNodeOperation, Node, Text,\n} from 'slate'\nimport * as Y from 'yjs'\n\nimport { slateElementToYText } from '../../utils/convert'\nimport { getYTarget } from '../../utils/location'\nimport { getProperties } from '../../utils/slate'\n\nexport function insertNode(sharedRoot: Y.XmlText, slateRoot: Node, op: InsertNodeOperation): void {\n  const { yParent, textRange } = getYTarget(sharedRoot, slateRoot, op.path)\n\n  if (Text.isText(op.node)) {\n    return yParent.insert(textRange.start, op.node.text, getProperties(op.node))\n  }\n\n  yParent.insertEmbed(textRange.start, slateElementToYText(op.node as Element))\n}\n","import * as Y from 'yjs'\n\nimport { InsertDelta } from '../module/custom-types'\nimport { yTextToInsertDelta } from './delta'\n\nexport function cloneInsertDeltaDeep(delta: InsertDelta): InsertDelta {\n  return delta.map(element => {\n    if (typeof element.insert === 'string') {\n      return element\n    }\n\n    // eslint-disable-next-line @typescript-eslint/no-use-before-define\n    return { ...element, insert: cloneDeep(element.insert) }\n  })\n}\n\nexport function cloneDeep(yText: Y.XmlText): Y.XmlText {\n  const clone = new Y.XmlText()\n\n  const attributes = yText.getAttributes()\n\n  Object.entries(attributes).forEach(([key, value]) => {\n    clone.setAttribute(key, value)\n  })\n\n  clone.applyDelta(cloneInsertDeltaDeep(yTextToInsertDelta(yText)), {\n    sanitize: false,\n  })\n\n  return clone\n}\n","import {\n  Element, MergeNodeOperation, Node, Path, Text,\n} from 'slate'\nimport * as Y from 'yjs'\n\nimport { Delta } from '../../module/custom-types'\nimport { cloneInsertDeltaDeep } from '../../utils/clone'\nimport { yTextToInsertDelta } from '../../utils/delta'\nimport { getYTarget } from '../../utils/location'\nimport {\n  getStoredPositionsInDeltaAbsolute,\n  restoreStoredPositionsWithDeltaAbsolute,\n} from '../../utils/position'\nimport { getProperties } from '../../utils/slate'\n\nexport function mergeNode(sharedRoot: Y.XmlText, slateRoot: Node, op: MergeNodeOperation): void {\n  const target = getYTarget(sharedRoot, slateRoot, op.path)\n  const prev = getYTarget(target.yParent, target.slateParent, Path.previous(op.path.slice(-1)))\n\n  if (!target.yTarget !== !prev.yTarget) {\n    throw new Error('Cannot merge y text with y element')\n  }\n\n  if (!prev.yTarget || !target.yTarget) {\n    const { yParent: parent, textRange, slateTarget } = target\n\n    if (!slateTarget) {\n      throw new Error('Expected Slate target node for merge op.')\n    }\n\n    const prevSibling = Node.get(slateRoot, Path.previous(op.path))\n\n    if (!Text.isText(prevSibling)) {\n      throw new Error('Path points to Y.Text but not a Slate text node.')\n    }\n\n    const targetProps = getProperties(slateTarget as Element)\n    const prevSiblingProps = getProperties(prevSibling)\n    const unsetProps = Object.keys(targetProps).reduce((acc, key) => {\n      const prevSiblingHasProp = key in prevSiblingProps\n\n      return prevSiblingHasProp ? acc : { ...acc, [key]: null }\n    }, {})\n\n    return parent.format(textRange.start, textRange.end - textRange.start, {\n      ...unsetProps,\n      ...prevSiblingProps,\n    })\n  }\n\n  const deltaApplyYOffset = prev.yTarget.length\n  const targetDelta = yTextToInsertDelta(target.yTarget)\n  const clonedDelta = cloneInsertDeltaDeep(targetDelta)\n\n  const storedPositions = getStoredPositionsInDeltaAbsolute(\n    sharedRoot,\n    target.yTarget,\n    targetDelta,\n    deltaApplyYOffset,\n  )\n\n  const applyDelta: Delta = [{ retain: deltaApplyYOffset }, ...clonedDelta]\n\n  prev.yTarget.applyDelta(applyDelta, {\n    sanitize: false,\n  })\n\n  target.yParent.delete(target.textRange.start, target.textRange.end - target.textRange.start)\n\n  restoreStoredPositionsWithDeltaAbsolute(\n    sharedRoot,\n    prev.yTarget,\n    storedPositions,\n    clonedDelta,\n    deltaApplyYOffset,\n  )\n}\n","import { MoveNodeOperation, Node, Path, Text } from 'slate'\nimport * as Y from 'yjs'\n\nimport { Delta } from '../../module/custom-types'\nimport { cloneInsertDeltaDeep } from '../../utils/clone'\nimport { getInsertDeltaLength, yTextToInsertDelta } from '../../utils/delta'\nimport { getYTarget } from '../../utils/location'\nimport {\n  getStoredPositionsInDeltaAbsolute,\n  restoreStoredPositionsWithDeltaAbsolute,\n} from '../../utils/position'\n\nexport function moveNode(sharedRoot: Y.XmlText, slateRoot: Node, op: MoveNodeOperation): void {\n  const newParentPath = Path.parent(op.newPath)\n  const newPathOffset = op.newPath[op.newPath.length - 1]\n  const parent = Node.get(slateRoot, newParentPath)\n\n  if (Text.isText(parent)) {\n    throw new Error('Cannot move slate node into text element')\n  }\n  const normalizedNewPath = [...newParentPath, Math.min(newPathOffset, parent.children.length)]\n\n  const origin = getYTarget(sharedRoot, slateRoot, op.path)\n  const target = getYTarget(sharedRoot, slateRoot, normalizedNewPath)\n  const insertDelta = cloneInsertDeltaDeep(origin.targetDelta)\n\n  const storedPositions = getStoredPositionsInDeltaAbsolute(\n    sharedRoot,\n    origin.yParent,\n    origin.targetDelta\n  )\n\n  const originLength = origin.textRange.end - origin.textRange.start\n  const originPathOffset = op.path[op.path.length - 1]\n  const movesForwardInSameParent =\n    Path.equals(Path.parent(op.path), newParentPath) && originPathOffset < newPathOffset\n  let targetOffset = movesForwardInSameParent ? target.textRange.end : target.textRange.start\n\n  origin.yParent.delete(origin.textRange.start, originLength)\n\n  if (origin.yParent === target.yParent && origin.textRange.start < targetOffset) {\n    targetOffset -= originLength\n  }\n\n  const targetLength = getInsertDeltaLength(yTextToInsertDelta(target.yParent))\n  const deltaApplyYOffset = Math.min(targetOffset, targetLength)\n  const applyDelta: Delta = [{ retain: deltaApplyYOffset }, ...insertDelta]\n\n  target.yParent.applyDelta(applyDelta, { sanitize: false })\n\n  restoreStoredPositionsWithDeltaAbsolute(\n    sharedRoot,\n    target.yParent,\n    storedPositions,\n    insertDelta,\n    deltaApplyYOffset,\n    origin.textRange.start\n  )\n}\n","import { Node, RemoveNodeOperation } from 'slate'\nimport * as Y from 'yjs'\n\nimport { getYTarget } from '../../utils/location'\n\nexport function removeNode(sharedRoot: Y.XmlText, slateRoot: Node, op: RemoveNodeOperation): void {\n  const { yParent: parent, textRange } = getYTarget(sharedRoot, slateRoot, op.path)\n\n  parent.delete(textRange.start, textRange.end - textRange.start)\n}\n","import { Node, SetNodeOperation } from 'slate'\nimport * as Y from 'yjs'\n\nimport { getYTarget } from '../../utils/location'\n\nexport function setNode(sharedRoot: Y.XmlText, slateRoot: Node, op: SetNodeOperation): void {\n  const { yTarget, textRange, yParent } = getYTarget(sharedRoot, slateRoot, op.path)\n\n  if (yTarget) {\n    Object.entries(op.newProperties).forEach(([key, value]) => {\n      if (value === null) {\n        return yTarget.removeAttribute(key)\n      }\n\n      yTarget.setAttribute(key, value)\n    })\n\n    return Object.entries(op.properties).forEach(([key]) => {\n      if (!Object.prototype.hasOwnProperty.call(op.newProperties, key)) {\n        yTarget.removeAttribute(key)\n      }\n    })\n  }\n\n  const unset = Object.fromEntries(Object.keys(op.properties).map(key => [key, null]))\n  const newProperties = { ...unset, ...op.newProperties }\n\n  yParent.format(textRange.start, textRange.end - textRange.start, newProperties)\n}\n","import { Node, SplitNodeOperation, Text } from 'slate'\nimport * as Y from 'yjs'\n\nimport { cloneInsertDeltaDeep } from '../../utils/clone'\nimport { sliceInsertDelta, yTextToInsertDelta } from '../../utils/delta'\nimport { getSlateNodeYLength, getYTarget } from '../../utils/location'\nimport {\n  getStoredPositionsInDeltaAbsolute,\n  restoreStoredPositionsWithDeltaAbsolute,\n} from '../../utils/position'\n\nexport function splitNode(sharedRoot: Y.XmlText, slateRoot: Node, op: SplitNodeOperation): void {\n  const target = getYTarget(sharedRoot, slateRoot, op.path)\n\n  if (!target.slateTarget) {\n    throw new Error('Y target without corresponding slate node')\n  }\n\n  if (!target.yTarget) {\n    if (!Text.isText(target.slateTarget)) {\n      throw new Error('Mismatch node type between y target and slate node')\n    }\n\n    const unset: Record<string, null> = {}\n\n    target.targetDelta.forEach(element => {\n      if (element.attributes) {\n        Object.keys(element.attributes).forEach(key => {\n          unset[key] = null\n        })\n      }\n    })\n\n    return target.yParent.format(\n      target.textRange.start,\n      target.textRange.end - target.textRange.start,\n      { ...unset, ...op.properties },\n    )\n  }\n\n  if (Text.isText(target.slateTarget)) {\n    throw new Error('Mismatch node type between y target and slate node')\n  }\n\n  const splitTarget = getYTarget(target.yTarget, target.slateTarget, [op.position])\n\n  const ySplitOffset = target.slateTarget.children\n    .slice(0, op.position)\n    .reduce((length, child) => length + getSlateNodeYLength(child), 0)\n\n  // @ts-ignore\n  const length = target.slateTarget.children.reduce(\n    (current, child) => current + getSlateNodeYLength(child),\n    0,\n  )\n\n  const splitDelta = sliceInsertDelta(\n    yTextToInsertDelta(target.yTarget),\n    ySplitOffset,\n    length - ySplitOffset,\n  )\n  const clonedDelta = cloneInsertDeltaDeep(splitDelta)\n\n  const storedPositions = getStoredPositionsInDeltaAbsolute(\n    sharedRoot,\n    target.yTarget,\n    splitDelta,\n    ySplitOffset,\n  )\n\n  const toInsert = new Y.XmlText()\n\n  toInsert.applyDelta(clonedDelta, {\n    sanitize: false,\n  })\n\n  Object.entries(op.properties).forEach(([key, value]) => {\n    toInsert.setAttribute(key, value)\n  })\n\n  target.yTarget.delete(\n    splitTarget.textRange.start,\n    target.yTarget.length - splitTarget.textRange.start,\n  )\n\n  target.yParent.insertEmbed(target.textRange.end, toInsert)\n\n  restoreStoredPositionsWithDeltaAbsolute(\n    sharedRoot,\n    toInsert,\n    storedPositions,\n    clonedDelta,\n    0,\n    ySplitOffset,\n  )\n}\n","import { NodeOperation } from 'slate'\n\nimport { OpMapper } from '../types'\nimport { insertNode } from './insertNode'\nimport { mergeNode } from './mergeNode'\nimport { moveNode } from './moveNode'\nimport { removeNode } from './removeNode'\nimport { setNode } from './setNode'\nimport { splitNode } from './splitNode'\n\nexport const NODE_MAPPER: OpMapper<NodeOperation> = {\n  insert_node: insertNode,\n  remove_node: removeNode,\n  set_node: setNode,\n  merge_node: mergeNode,\n  move_node: moveNode,\n  split_node: splitNode,\n}\n","import { InsertTextOperation, Node, Text } from 'slate'\nimport * as Y from 'yjs'\n\nimport { getYTarget } from '../../utils/location'\nimport { getProperties } from '../../utils/slate'\n\nexport function insertText(sharedRoot: Y.XmlText, slateRoot: Node, op: InsertTextOperation): void {\n  const { yParent: target, textRange } = getYTarget(sharedRoot, slateRoot, op.path)\n\n  const targetNode = Node.get(slateRoot, op.path)\n\n  if (!Text.isText(targetNode)) {\n    throw new Error('Cannot insert text into non-text node')\n  }\n\n  target.insert(textRange.start + op.offset, op.text, getProperties(targetNode))\n}\n","import { Node, RemoveTextOperation } from 'slate'\nimport * as Y from 'yjs'\n\nimport { getYTarget } from '../../utils/location'\n\nexport function removeText(sharedRoot: Y.XmlText, slateRoot: Node, op: RemoveTextOperation): void {\n  const { yParent: target, textRange } = getYTarget(sharedRoot, slateRoot, op.path)\n\n  target.delete(textRange.start + op.offset, op.text.length)\n}\n","import { TextOperation } from 'slate'\n\nimport { OpMapper } from '../types'\nimport { insertText } from './insertText'\nimport { removeText } from './removeText'\n\nexport const TEXT_MAPPER: OpMapper<TextOperation> = {\n  insert_text: insertText,\n  remove_text: removeText,\n}\n","import { Node, Operation } from 'slate'\nimport * as Y from 'yjs'\n\nimport { NODE_MAPPER } from './node'\nimport { TEXT_MAPPER } from './text'\nimport { ApplyFunc, OpMapper } from './types'\n\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nconst NOOP = () => {}\n\nconst opMappers: OpMapper = {\n  ...TEXT_MAPPER,\n  ...NODE_MAPPER,\n\n  set_selection: NOOP,\n}\n\nexport function applySlateOp(sharedRoot: Y.XmlText, slateRoot: Node, op: Operation): void {\n  const apply = opMappers[op.type] as ApplyFunc<typeof op>\n\n  if (!apply) {\n    throw new Error(`Unknown operation: ${op.type}`)\n  }\n\n  apply(sharedRoot, slateRoot, op)\n}\n","import {\n  BaseEditor, Descendant, Editor, Operation, Point,\n} from 'slate'\nimport * as Y from 'yjs'\n\nimport { applyYjsEvents } from '../applyToSlate'\nimport { applySlateOp } from '../applyToYjs'\nimport { yTextToSlateElement } from '../utils/convert'\nimport {\n  getStoredPosition,\n  getStoredPositions,\n  relativePositionToSlatePoint,\n  removeStoredPosition,\n  setStoredPosition,\n  slatePointToRelativePosition,\n} from '../utils/position'\nimport { assertDocumentAttachment } from '../utils/yjs'\n\ntype LocalChange = {\n  op: Operation\n  doc: Descendant[]\n  origin: unknown\n}\n\nconst DEFAULT_LOCAL_ORIGIN = Symbol('slate-yjs-operation')\nconst DEFAULT_POSITION_STORAGE_ORIGIN = Symbol('slate-yjs-position-storage')\n\nconst ORIGIN: WeakMap<Editor, unknown> = new WeakMap()\nconst LOCAL_CHANGES: WeakMap<Editor, LocalChange[]> = new WeakMap()\nconst CONNECTED: WeakSet<Editor> = new WeakSet()\n\nexport type YjsEditor = BaseEditor & {\n  sharedRoot: Y.XmlText\n\n  localOrigin: unknown\n  positionStorageOrigin: unknown\n\n  applyRemoteEvents: (events: Y.YEvent<Y.XmlText>[], origin: unknown) => void\n\n  storeLocalChange: (op: Operation) => void\n  flushLocalChanges: () => void\n\n  isLocalOrigin: (origin: unknown) => boolean\n\n  connect: () => void\n  disconnect: () => void\n}\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const YjsEditor = {\n  isYjsEditor(value: unknown): value is YjsEditor {\n    return (\n      Editor.isEditor(value)\n      && (value as YjsEditor).sharedRoot instanceof Y.XmlText\n      && 'localOrigin' in value\n      && 'positionStorageOrigin' in value\n      && typeof (value as YjsEditor).applyRemoteEvents === 'function'\n      && typeof (value as YjsEditor).storeLocalChange === 'function'\n      && typeof (value as YjsEditor).flushLocalChanges === 'function'\n      && typeof (value as YjsEditor).isLocalOrigin === 'function'\n      && typeof (value as YjsEditor).connect === 'function'\n      && typeof (value as YjsEditor).disconnect === 'function'\n    )\n  },\n\n  localChanges(editor: YjsEditor): LocalChange[] {\n    return LOCAL_CHANGES.get(editor) ?? []\n  },\n\n  applyRemoteEvents(editor: YjsEditor, events: Y.YEvent<Y.XmlText>[], origin: unknown): void {\n    editor.applyRemoteEvents(events, origin)\n  },\n\n  storeLocalChange(editor: YjsEditor, op: Operation): void {\n    editor.storeLocalChange(op)\n  },\n\n  flushLocalChanges(editor: YjsEditor): void {\n    editor.flushLocalChanges()\n  },\n\n  connected(editor: YjsEditor): boolean {\n    return CONNECTED.has(editor)\n  },\n\n  connect(editor: YjsEditor): void {\n    editor.connect()\n  },\n\n  disconnect(editor: YjsEditor): void {\n    editor.disconnect()\n  },\n\n  isLocal(editor: YjsEditor): boolean {\n    return editor.isLocalOrigin(YjsEditor.origin(editor))\n  },\n\n  origin(editor: YjsEditor): unknown {\n    const origin = ORIGIN.get(editor)\n\n    return origin !== undefined ? origin : editor.localOrigin\n  },\n\n  withOrigin(editor: YjsEditor, origin: unknown, fn: () => void): void {\n    const prev = YjsEditor.origin(editor)\n\n    ORIGIN.set(editor, origin)\n    fn()\n    ORIGIN.set(editor, prev)\n  },\n\n  storePosition(editor: YjsEditor, key: string, point: Point): void {\n    const { sharedRoot, positionStorageOrigin: locationStorageOrigin } = editor\n\n    assertDocumentAttachment(sharedRoot)\n\n    const position = slatePointToRelativePosition(sharedRoot, editor, point)\n\n    sharedRoot.doc.transact(() => {\n      setStoredPosition(sharedRoot, key, position)\n    }, locationStorageOrigin)\n  },\n\n  removeStoredPosition(editor: YjsEditor, key: string): void {\n    const { sharedRoot, positionStorageOrigin: locationStorageOrigin } = editor\n\n    assertDocumentAttachment(sharedRoot)\n\n    sharedRoot.doc.transact(() => {\n      removeStoredPosition(sharedRoot, key)\n    }, locationStorageOrigin)\n  },\n\n  position(editor: YjsEditor, key: string): Point | null | undefined {\n    const position = getStoredPosition(editor.sharedRoot, key)\n\n    if (!position) {\n      return undefined\n    }\n\n    return relativePositionToSlatePoint(editor.sharedRoot, editor, position)\n  },\n\n  storedPositionsRelative(editor: YjsEditor): Record<string, Y.RelativePosition> {\n    return getStoredPositions(editor.sharedRoot)\n  },\n}\n\nexport type WithYjsOptions = {\n  autoConnect?: boolean\n\n  // Origin used when applying local slate operations to yjs\n  localOrigin?: unknown\n\n  // Origin used when storing positions\n  positionStorageOrigin?: unknown\n}\n\nexport function withYjs(sharedRoot: Y.XmlText, options: WithYjsOptions = {}) {\n  return function <T extends Editor> (editor: T): T & YjsEditor {\n    const e = editor as T & YjsEditor\n\n    e.sharedRoot = sharedRoot\n\n    e.localOrigin = options.localOrigin ?? DEFAULT_LOCAL_ORIGIN\n    e.positionStorageOrigin = options.positionStorageOrigin ?? DEFAULT_POSITION_STORAGE_ORIGIN\n\n    e.applyRemoteEvents = (events, origin) => {\n      YjsEditor.flushLocalChanges(e)\n\n      Editor.withoutNormalizing(e, () => {\n        YjsEditor.withOrigin(e, origin, () => {\n          applyYjsEvents(e.sharedRoot, e, events)\n        })\n      })\n    }\n\n    e.isLocalOrigin = origin => origin === e.localOrigin\n\n    const handleYEvents = (events: Y.YEvent<Y.XmlText>[], transaction: Y.Transaction) => {\n      if (e.isLocalOrigin(transaction.origin)) {\n        return\n      }\n\n      YjsEditor.applyRemoteEvents(e, events, transaction.origin)\n    }\n\n    let autoConnectTimeoutId: ReturnType<typeof setTimeout> | null = null\n\n    if (options.autoConnect) {\n      autoConnectTimeoutId = setTimeout(() => {\n        autoConnectTimeoutId = null\n        YjsEditor.connect(e)\n      })\n    }\n\n    e.connect = () => {\n      if (YjsEditor.connected(e)) {\n        throw new Error('already connected')\n      }\n\n      e.sharedRoot.observeDeep(handleYEvents)\n      const content = yTextToSlateElement(e.sharedRoot)\n\n      e.children = content.children\n      CONNECTED.add(e)\n\n      Editor.normalize(editor, { force: true })\n      if (!editor.operations.length) {\n        editor.onChange()\n      }\n    }\n\n    e.disconnect = () => {\n      if (autoConnectTimeoutId) {\n        clearTimeout(autoConnectTimeoutId)\n      }\n\n      YjsEditor.flushLocalChanges(e)\n      e.sharedRoot.unobserveDeep(handleYEvents)\n      CONNECTED.delete(e)\n    }\n\n    e.storeLocalChange = op => {\n      LOCAL_CHANGES.set(e, [\n        ...YjsEditor.localChanges(e),\n        { op, doc: editor.children, origin: YjsEditor.origin(e) },\n      ])\n    }\n\n    e.flushLocalChanges = () => {\n      assertDocumentAttachment(e.sharedRoot)\n      const localChanges = YjsEditor.localChanges(e)\n\n      LOCAL_CHANGES.delete(e)\n\n      const txGroups: LocalChange[][] = []\n\n      localChanges.forEach(change => {\n        const currentGroup = txGroups[txGroups.length - 1]\n\n        if (currentGroup && currentGroup[0].origin === change.origin) {\n          return currentGroup.push(change)\n        }\n\n        txGroups.push([change])\n      })\n\n      txGroups.forEach(txGroup => {\n        assertDocumentAttachment(e.sharedRoot)\n\n        e.sharedRoot.doc.transact(() => {\n          txGroup.forEach(change => {\n            assertDocumentAttachment(e.sharedRoot)\n            // @ts-ignore\n            applySlateOp(e.sharedRoot, { children: change.doc }, change.op)\n          })\n        }, txGroup[0].origin)\n      })\n    }\n\n    const { apply, onChange } = e\n\n    e.apply = op => {\n      if (YjsEditor.connected(e) && YjsEditor.isLocal(e)) {\n        YjsEditor.storeLocalChange(e, op)\n      }\n\n      apply(op)\n    }\n\n    e.onChange = () => {\n      if (YjsEditor.connected(e)) {\n        YjsEditor.flushLocalChanges(e)\n      }\n\n      onChange()\n    }\n\n    return e\n  }\n}\n","import { Editor, Range } from 'slate'\nimport { Awareness } from 'y-protocols/awareness'\nimport * as Y from 'yjs'\n\nimport { RelativeRange } from '../module/custom-types'\nimport { slateRangeToRelativeRange } from '../utils/position'\nimport { YjsEditor } from './withYjs'\n\nexport type CursorStateChangeEvent = {\n  added: number[]\n  updated: number[]\n  removed: number[]\n}\n\nexport type RemoteCursorChangeEventListener = (event: CursorStateChangeEvent) => void\n\nconst CURSOR_CHANGE_EVENT_LISTENERS: WeakMap<\n  Editor,\n  Set<RemoteCursorChangeEventListener>\n> = new WeakMap()\n\nexport type CursorState<TCursorData extends Record<string, unknown> = Record<string, unknown>> = {\n  relativeSelection: RelativeRange | null\n  data?: TCursorData\n  clientId: number\n}\n\nexport type CursorEditor<TCursorData extends Record<string, unknown> = Record<string, unknown>> =\n  YjsEditor & {\n    awareness: Awareness\n\n    cursorDataField: string\n    selectionStateField: string\n\n    sendCursorPosition: (range: Range | null) => void\n    sendCursorData: (data: TCursorData) => void\n  }\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const CursorEditor = {\n  isCursorEditor(value: unknown): value is CursorEditor {\n    return (\n      YjsEditor.isYjsEditor(value)\n      && (value as CursorEditor).awareness\n      && typeof (value as CursorEditor).cursorDataField === 'string'\n      && typeof (value as CursorEditor).selectionStateField === 'string'\n      && typeof (value as CursorEditor).sendCursorPosition === 'function'\n      && typeof (value as CursorEditor).sendCursorData === 'function'\n    )\n  },\n\n  sendCursorPosition<TCursorData extends Record<string, unknown>>(\n    editor: CursorEditor<TCursorData>,\n    range: Range | null = editor.selection,\n  ) {\n    editor.sendCursorPosition(range)\n  },\n\n  sendCursorData<TCursorData extends Record<string, unknown>>(\n    editor: CursorEditor<TCursorData>,\n    data: TCursorData,\n  ) {\n    editor.sendCursorData(data)\n  },\n\n  on<TCursorData extends Record<string, unknown>>(\n    editor: CursorEditor<TCursorData>,\n    event: 'change',\n    handler: RemoteCursorChangeEventListener,\n  ) {\n    if (event !== 'change') {\n      return\n    }\n\n    const listeners = CURSOR_CHANGE_EVENT_LISTENERS.get(editor) ?? new Set()\n\n    listeners.add(handler)\n    if (editor) { CURSOR_CHANGE_EVENT_LISTENERS.set(editor, listeners) }\n  },\n\n  off<TCursorData extends Record<string, unknown>>(\n    editor: CursorEditor<TCursorData>,\n    event: 'change',\n    listener: RemoteCursorChangeEventListener,\n  ) {\n    if (event !== 'change') {\n      return\n    }\n\n    const listeners = CURSOR_CHANGE_EVENT_LISTENERS.get(editor)\n\n    if (listeners) {\n      listeners.delete(listener)\n    }\n  },\n\n  cursorState<TCursorData extends Record<string, unknown>>(\n    editor: CursorEditor<TCursorData>,\n    clientId: number,\n  ): CursorState<TCursorData> | null {\n    if (clientId === editor.awareness.clientID || !YjsEditor.connected(editor)) {\n      return null\n    }\n\n    const state = editor.awareness.getStates().get(clientId)\n\n    if (!state) {\n      return null\n    }\n\n    return {\n      relativeSelection: state[editor.selectionStateField] ?? null,\n      data: state[editor.cursorDataField],\n      clientId,\n    }\n  },\n\n  cursorStates<TCursorData extends Record<string, unknown>>(\n    editor: CursorEditor<TCursorData>,\n  ): Record<string, CursorState<TCursorData>> {\n    if (!YjsEditor.connected(editor)) {\n      return {}\n    }\n\n    return Object.fromEntries(\n      Array.from(editor.awareness.getStates().entries(), ([id, state]) => {\n        // Ignore own state\n        if (id === editor.awareness.clientID || !state) {\n          return null\n        }\n\n        return [\n          id,\n          {\n            relativeSelection: state[editor.selectionStateField],\n            data: state[editor.cursorDataField],\n          },\n        ]\n      }).filter(Array.isArray),\n    )\n  },\n}\n\nexport type WithCursorsOptions<\n  TCursorData extends Record<string, unknown> = Record<string, unknown>,\n> = {\n  // Local state field used to store the user selection\n  cursorStateField?: string\n\n  // Local state field used to store data attached to the local client\n  cursorDataField?: string\n\n  data?: TCursorData\n  autoSend?: boolean\n}\n\nexport function withCursors<TCursorData extends Record<string, unknown>>(\n  awareness: Awareness,\n  options: WithCursorsOptions<TCursorData> = {},\n) {\n  return function <T extends YjsEditor> (editor: T): T & CursorEditor<TCursorData> {\n    const {\n      cursorStateField: selectionStateField = 'selection',\n      cursorDataField = 'data',\n      autoSend = true,\n      data,\n    } = options\n    const e = editor as T & CursorEditor<TCursorData>\n\n    e.awareness = awareness\n    e.cursorDataField = cursorDataField\n    e.selectionStateField = selectionStateField\n\n    e.sendCursorData = (cursorData: TCursorData) => {\n      e.awareness.setLocalStateField(e.cursorDataField, cursorData)\n    }\n\n    e.sendCursorPosition = range => {\n      const localState = e.awareness.getLocalState()\n      const currentRange = localState?.[selectionStateField]\n\n      if (!range) {\n        if (currentRange) {\n          e.awareness.setLocalStateField(e.selectionStateField, null)\n        }\n\n        return\n      }\n\n      const { anchor, focus } = slateRangeToRelativeRange(e.sharedRoot, e, range)\n\n      if (\n        !currentRange\n        || !Y.compareRelativePositions(anchor, currentRange)\n        || !Y.compareRelativePositions(focus, currentRange)\n      ) {\n        e.awareness.setLocalStateField(e.selectionStateField, { anchor, focus })\n      }\n    }\n\n    const awarenessChangeListener: RemoteCursorChangeEventListener = yEvent => {\n      const listeners = CURSOR_CHANGE_EVENT_LISTENERS.get(e)\n\n      if (!listeners) {\n        return\n      }\n\n      const localId = e.awareness.clientID\n      const event = {\n        added: yEvent.added.filter(id => id !== localId),\n        removed: yEvent.removed.filter(id => id !== localId),\n        updated: yEvent.updated.filter(id => id !== localId),\n      }\n\n      if (event.added.length > 0 || event.removed.length > 0 || event.updated.length > 0) {\n        listeners.forEach(listener => listener(event))\n      }\n    }\n\n    const { connect, disconnect } = e\n\n    e.connect = () => {\n      connect()\n\n      e.awareness.on('change', awarenessChangeListener)\n\n      awarenessChangeListener({\n        removed: [],\n        added: Array.from(e.awareness.getStates().keys()),\n        updated: [],\n      })\n\n      if (autoSend) {\n        if (data) {\n          CursorEditor.sendCursorData(e, data)\n        }\n\n        const { onChange } = e\n\n        e.onChange = () => {\n          onChange()\n\n          if (YjsEditor.connected(e)) {\n            CursorEditor.sendCursorPosition(e)\n          }\n        }\n      }\n    }\n\n    e.disconnect = () => {\n      e.awareness.off('change', awarenessChangeListener)\n\n      awarenessChangeListener({\n        removed: Array.from(e.awareness.getStates().keys()),\n        added: [],\n        updated: [],\n      })\n\n      disconnect()\n    }\n\n    return e\n  }\n}\n","import { Editor, Transforms } from 'slate'\nimport * as Y from 'yjs'\n\nimport { HistoryStackItem, RelativeRange } from '../module/custom-types'\nimport { relativeRangeToSlateRange, slateRangeToRelativeRange } from '../utils/position'\nimport { YjsEditor } from './withYjs'\n\nconst LAST_SELECTION: WeakMap<Editor, RelativeRange | null> = new WeakMap()\nconst DEFAULT_WITHOUT_SAVING_ORIGIN = Symbol('slate-yjs-history-without-saving')\n\nexport type YHistoryEditor = YjsEditor & {\n  undoManager: Y.UndoManager\n\n  withoutSavingOrigin: unknown\n\n  undo: () => void\n  redo: () => void\n}\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const YHistoryEditor = {\n  isYHistoryEditor(value: unknown): value is YHistoryEditor {\n    return (\n      YjsEditor.isYjsEditor(value)\n      && (value as YHistoryEditor).undoManager instanceof Y.UndoManager\n      && typeof (value as YHistoryEditor).undo === 'function'\n      && typeof (value as YHistoryEditor).redo === 'function'\n      && 'withoutSavingOrigin' in value\n    )\n  },\n\n  canUndo(editor: YHistoryEditor) {\n    return editor.undoManager.undoStack.length > 0\n  },\n\n  canRedo(editor: YHistoryEditor) {\n    return editor.undoManager.redoStack.length > 0\n  },\n\n  isSaving(editor: YHistoryEditor): boolean {\n    return editor.undoManager.trackedOrigins.has(YjsEditor.origin(editor))\n  },\n\n  withoutSaving(editor: YHistoryEditor, fn: () => void) {\n    YjsEditor.withOrigin(editor, editor.withoutSavingOrigin, fn)\n  },\n}\n\nexport type WithYHistoryOptions = NonNullable<ConstructorParameters<typeof Y.UndoManager>[1]> & {\n  withoutSavingOrigin?: unknown\n}\n\nexport function withYHistory(options: WithYHistoryOptions = {}) {\n  return function <T extends YjsEditor> (editor: T): T & YHistoryEditor {\n    const e = editor as T & YHistoryEditor\n\n    // 将 trackedOrigins 的初始化放到 editor 被传入之后\n    const {\n      withoutSavingOrigin = DEFAULT_WITHOUT_SAVING_ORIGIN,\n      trackedOrigins = new Set([e.localOrigin]),\n      ...restOptions\n    } = options\n\n    const undoManager = new Y.UndoManager(e.sharedRoot, {\n      trackedOrigins,\n      ...restOptions,\n    })\n\n    e.undoManager = undoManager\n    e.withoutSavingOrigin = withoutSavingOrigin\n\n    const { onChange, isLocalOrigin } = e\n\n    e.onChange = () => {\n      onChange()\n\n      LAST_SELECTION.set(e, e.selection && slateRangeToRelativeRange(e.sharedRoot, e, e.selection))\n    }\n\n    e.isLocalOrigin = origin => origin === e.withoutSavingOrigin || isLocalOrigin(origin)\n\n    const handleStackItemAdded = ({\n      stackItem,\n    }: {\n      stackItem: HistoryStackItem\n      type: 'redo' | 'undo'\n    }) => {\n      stackItem.meta.set(\n        'selection',\n        e.selection && slateRangeToRelativeRange(e.sharedRoot, e, e.selection),\n      )\n      stackItem.meta.set('selectionBefore', LAST_SELECTION.get(e))\n    }\n\n    const handleStackItemUpdated = ({\n      stackItem,\n    }: {\n      stackItem: HistoryStackItem\n      type: 'redo' | 'undo'\n    }) => {\n      stackItem.meta.set(\n        'selection',\n        e.selection && slateRangeToRelativeRange(e.sharedRoot, e, e.selection),\n      )\n    }\n\n    const handleStackItemPopped = ({\n      stackItem,\n      type,\n    }: {\n      stackItem: HistoryStackItem\n      type: 'redo' | 'undo'\n    }) => {\n      // TODO: Change once https://github.com/yjs/yjs/issues/353 is resolved\n      const inverseStack = type === 'undo' ? e.undoManager.redoStack : e.undoManager.undoStack\n      const inverseItem = inverseStack[inverseStack.length - 1]\n\n      if (inverseItem) {\n        inverseItem.meta.set('selection', stackItem.meta.get('selectionBefore'))\n        inverseItem.meta.set('selectionBefore', stackItem.meta.get('selection'))\n      }\n\n      const relativeSelection = stackItem.meta.get('selectionBefore') as RelativeRange | null\n\n      if (!relativeSelection) {\n        return\n      }\n\n      const selection = relativeRangeToSlateRange(e.sharedRoot, e, relativeSelection)\n\n      if (!selection) {\n        return\n      }\n\n      Transforms.select(e, selection)\n    }\n\n    const { connect, disconnect } = e\n\n    e.connect = () => {\n      connect()\n\n      e.undoManager.on('stack-item-added', handleStackItemAdded)\n      e.undoManager.on('stack-item-popped', handleStackItemPopped)\n      e.undoManager.on('stack-item-updated', handleStackItemUpdated)\n    }\n\n    e.disconnect = () => {\n      e.undoManager.off('stack-item-added', handleStackItemAdded)\n      e.undoManager.off('stack-item-popped', handleStackItemPopped)\n      e.undoManager.off('stack-item-updated', handleStackItemUpdated)\n\n      disconnect()\n    }\n\n    e.undo = () => {\n      if (YjsEditor.connected(e)) {\n        YjsEditor.flushLocalChanges(e)\n        e.undoManager.undo()\n      }\n    }\n\n    e.redo = () => {\n      if (YjsEditor.connected(e)) {\n        YjsEditor.flushLocalChanges(e)\n        e.undoManager.redo()\n      }\n    }\n\n    return e\n  }\n}\n"],"mappings":"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"}