{"version":3,"file":"index.mjs","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/utils/clone.ts","../src/applyToYjs/node/index.ts","../src/applyToYjs/node/insertNode.ts","../src/applyToYjs/node/removeNode.ts","../src/applyToYjs/node/setNode.ts","../src/applyToYjs/node/mergeNode.ts","../src/applyToYjs/node/moveNode.ts","../src/applyToYjs/node/splitNode.ts","../src/applyToYjs/text/index.ts","../src/applyToYjs/index.ts","../src/applyToYjs/text/insertText.ts","../src/applyToYjs/text/removeText.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 { BaseElement } from 'packages/custom-types'\nimport { 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 BaseElement) }\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 {\n  Editor, Element, Node, Operation, Path, Text,\n} 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      const [pathOffset, textOffset] = yOffsetToSlateOffsets(node, yOffset, {\n        insert: true,\n      })\n      const child = node.children[pathOffset]\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 = 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          && 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', newProperties, properties, 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 * 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 { 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 { CustomElement } from 'packages/custom-types'\nimport { InsertNodeOperation, Node, Text } 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 CustomElement))\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 { BaseElement } from 'packages/custom-types'\nimport {\n  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 BaseElement)\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 {\n  MoveNodeOperation, Node, Path, Text,\n} 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  origin.yParent.delete(origin.textRange.start, origin.textRange.end - origin.textRange.start)\n\n  const targetLength = getInsertDeltaLength(yTextToInsertDelta(target.yParent))\n  const deltaApplyYOffset = Math.min(target.textRange.start, 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, 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 { 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 { 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 {\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"],"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","_i","arguments","fromEntries","entries","filter","_a","__read","includes","omitNullEntries","yTextToInsertDelta","yText","delta","normalized","delta_1","__values","delta_1_1","next","element","value","insert","prev","attributes","_b","_c","push","normalizeInsertDelta","toDelta","getInsertLength","getInsertDeltaLength","reduce","curr","sliceInsertDelta","start","currentOffset","sliced","end","elementLength","startOffset","Math","max","endOffset","min","__assign","slice","getSlateNodeYLength","Text","isText","text","getYTarget","yRoot","slateRoot","path","Error","pathOffset","childPath","yOffset","children","slatePathOffsetToYOffset","targetNode","targetLength","targetDelta","yTarget","Y","XmlText","yParent","textRange","slateParent","slateTarget","yOffsetToSlateOffsets","parent","opts","assoc","lastNonEmptyPathOffset","child_1","nodeLength","child","getSlatePath","sharedRoot","yNodePath","unshift","idx","yChild","currentDelta","currentDelta_1","currentDelta_1_1","concat","assertDocumentAttachment","sharedType","doc","STORED_POSITION_PREFIX","slatePointToRelativePosition","point","index","offset","createRelativePositionFromTypeIndex","relativePositionToSlatePoint","pos","absPos","createAbsolutePositionFromRelativePosition","type","parentPath","Node","get","Element","isElement","textOffset","target","__spreadArray","absolutePositionToSlatePoint","setStoredPosition","position","setAttribute","encodeRelativePosition","getAbsolutePositionsInTextRange","absolutePositions","getAbsolutePositionsInYText","positions","forEach","assign","getStoredPositionsInDeltaAbsolute","deltaOffset","getAttributes","startsWith","map","decodeRelativePosition","getStoredPositionsAbsolute","restoreStoredPositionsWithDeltaAbsolute","newDeltaOffset","previousDeltaOffset","toRestore","slateRangeToRelativeRange","range","anchor","focus","relativeRangeToSlateRange","getProperties","omit","yTextToSlateElement","deltaInsertToSlateNode","slateNodesToInsertDelta","nodes","slateElementToYText","__rest","yElement","applyDelta","sanitize","translateYTextEvent","editor","event","changes","ops","slatePath","targetElement","keyChanges","from","newProperties","action","getAttribute","properties","apply","change","retain","delete","reverse","startPathOffset","startTextOffset","endPathOffset","endTextOffset","_d","_e","_f","lastOp","currentProps","lastPath","Path","equals","toInsert","applyYjsEvents","events","Editor","withoutNormalizing","YTextEvent","translateYjsEvent","op","cloneInsertDeltaDeep","cloneDeep","clone","NODE_MAPPER","insert_node","insertEmbed","remove_node","set_node","removeAttribute","unset","format","merge_node","previous","parent_1","prevSibling","targetProps","prevSiblingProps_1","unsetProps","acc","deltaApplyYOffset","clonedDelta","storedPositions","move_node","newParentPath","newPath","newPathOffset","normalizedNewPath","origin","insertDelta","split_node","unset_1","splitTarget","ySplitOffset","current","splitDelta","opMappers","insert_text","remove_text","set_selection","DEFAULT_LOCAL_ORIGIN","Symbol","DEFAULT_POSITION_STORAGE_ORIGIN","ORIGIN","WeakMap","LOCAL_CHANGES","CONNECTED","WeakSet","YjsEditor","isYjsEditor","isEditor","applyRemoteEvents","storeLocalChange","flushLocalChanges","isLocalOrigin","connect","disconnect","localChanges","connected","has","isLocal","localOrigin","withOrigin","fn","set","storePosition","locationStorageOrigin","positionStorageOrigin","transact","removeStoredPosition","rawPosition","getStoredPosition","storedPositionsRelative","createRelativePositionFromJSON","withYjs","options","e","handleYEvents","transaction","autoConnectTimeoutId","autoConnect","setTimeout","observeDeep","content","add","normalize","force","operations","onChange","clearTimeout","unobserveDeep","txGroups","currentGroup","txGroup","applySlateOp","CURSOR_CHANGE_EVENT_LISTENERS","CursorEditor","isCursorEditor","awareness","cursorDataField","selectionStateField","sendCursorPosition","sendCursorData","selection","data","on","handler","listeners","Set","off","listener","cursorState","clientId","clientID","state","getStates","relativeSelection","cursorStates","id","withCursors","cursorStateField","autoSend","cursorData","setLocalStateField","localState","getLocalState","currentRange","compareRelativePositions","awarenessChangeListener","yEvent","localId","added","removed","updated","onChange_1","LAST_SELECTION","DEFAULT_WITHOUT_SAVING_ORIGIN","YHistoryEditor","isYHistoryEditor","undoManager","UndoManager","undo","redo","canUndo","undoStack","canRedo","redoStack","isSaving","trackedOrigins","withoutSaving","withoutSavingOrigin","withYHistory","restOptions","handleStackItemAdded","stackItem","meta","handleStackItemUpdated","handleStackItemPopped","inverseStack","inverseItem","Transforms","select"],"mappings":"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"}