@wangeditor-next/yjs 2.0.1 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"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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"}
1
+ {"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 { 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 * 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 {\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 { 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 {\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, 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","_d","endPathOffset","endTextOffset","_e","_f","_g","previousPathOffset","previousChild","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","originLength","originPathOffset","targetOffset","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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"}
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@wangeditor-next/yjs",
3
- "version": "2.0.1",
3
+ "version": "2.0.3",
4
4
  "author": "cycleccc <2991205548@qq.com>",
5
5
  "type": "module",
6
6
  "description": "Yjs binding for wangeditor-next.",
7
- "homepage": "https://github.com/wangeditor-next/wangeditor-next#readme",
7
+ "homepage": "https://github.com/wangeditor-next/wangEditor-next#readme",
8
8
  "keywords": [
9
9
  "slate",
10
10
  "wangEditor",
@@ -39,12 +39,12 @@
39
39
  "url": "git+https://github.com/wangeditor-next/wangEditor-next.git"
40
40
  },
41
41
  "peerDependencies": {
42
- "@wangeditor-next/core": "1.9.1",
42
+ "@wangeditor-next/core": ">=1.9.7",
43
43
  "slate": "^0.124.0",
44
44
  "yjs": "^13.5.29"
45
45
  },
46
46
  "bugs": {
47
- "url": "https://github.com/wangeditor-next/wangeditor-next/issues"
47
+ "url": "https://github.com/wangeditor-next/wangEditor-next/issues"
48
48
  },
49
49
  "dependencies": {
50
50
  "y-protocols": "^1.0.5"