{"version":3,"file":"index.mjs","sources":["../src/utils/debug.ts","../src/utils/paths.ts","../src/utils/ranges.ts","../src/utils/selection.ts","../src/utils/values.ts","../src/utils/weakMaps.ts","../src/editor/nodes/DefaultObject.tsx","../src/editor/nodes/index.ts","../src/editor/components/DraggableBlock.tsx","../src/editor/components/Element.tsx","../src/editor/hooks/usePortableTextEditor.ts","../src/editor/nodes/DefaultAnnotation.tsx","../src/utils/getPortableTextMemberSchemaTypes.ts","../src/utils/schema.ts","../../../../node_modules/.pnpm/@sanity+diff-match-patch@3.1.1/node_modules/@sanity/diff-match-patch/dist/index.js","../src/patch/patches.ts","../src/utils/operationToPatches.ts","../src/editor/plugins/createWithEditableAPI.ts","../src/editor/plugins/createWithInsertBreak.ts","../src/editor/plugins/createWithMaxBlocks.ts","../src/utils/withPreserveKeys.ts","../src/editor/plugins/createWithObjectKeys.ts","../src/patch/arrayInsert.ts","../src/patch/array.ts","../src/patch/object.ts","../src/patch/primitive.ts","../src/patch/string.ts","../src/patch/applyPatch.ts","../src/utils/applyPatch.ts","../src/utils/withChanges.ts","../src/utils/withoutPatching.ts","../src/editor/plugins/createWithUndoRedo.ts","../src/editor/plugins/createWithPatches.ts","../src/editor/plugins/createWithPlaceholderBlock.ts","../src/editor/plugins/createWithPortableTextBlockStyle.ts","../src/editor/plugins/createWithPortableTextLists.ts","../src/editor/plugins/createWithPortableTextMarkModel.ts","../src/editor/plugins/createWithPortableTextSelections.ts","../src/editor/plugins/createWithSchemaTypes.ts","../src/editor/plugins/createWithUtils.ts","../src/editor/plugins/createWithHotKeys.ts","../src/utils/validateValue.ts","../src/editor/plugins/createWithInsertData.ts","../src/editor/plugins/index.ts","../src/editor/components/SlateContainer.tsx","../src/editor/hooks/usePortableTextEditorKeyGenerator.ts","../src/editor/hooks/usePortableTextEditorSelection.ts","../src/editor/hooks/usePortableTextEditorValue.ts","../src/editor/hooks/usePortableTextReadOnly.ts","../src/editor/hooks/useSyncValue.ts","../src/editor/components/Synchronizer.tsx","../src/editor/PortableTextEditor.tsx","../src/editor/components/Leaf.tsx","../src/editor/Editable.tsx","../src/utils/patches.ts"],"sourcesContent":["import debug from 'debug'\n\nconst rootName = 'sanity-pte:'\n\nexport default debug(rootName)\nexport function debugWithName(name: string): debug.Debugger {\n  const namespace = `${rootName}${name}`\n  if (debug && debug.enabled(namespace)) {\n    return debug(namespace)\n  }\n  return debug(rootName)\n}\n","import {isKeySegment, type Path} from '@sanity/types'\nimport {isEqual} from 'lodash'\nimport {type Descendant, Editor, Element, type Path as SlatePath, type Point} from 'slate'\n\nimport {type EditorSelectionPoint, type PortableTextMemberSchemaTypes} from '../types/editor'\nimport {type ObjectWithKeyAndType} from './ranges'\n\nexport function createKeyedPath(\n  point: Point,\n  value: ObjectWithKeyAndType[] | undefined,\n  types: PortableTextMemberSchemaTypes,\n): Path | null {\n  const blockPath = [point.path[0]]\n  if (!value) {\n    return null\n  }\n  const block = value[blockPath[0]]\n  if (!block) {\n    return null\n  }\n  const keyedBlockPath = [{_key: block._key}]\n  if (block._type !== types.block.name) {\n    return keyedBlockPath as Path\n  }\n  let keyedChildPath\n  const childPath = point.path.slice(0, 2)\n  const child = Array.isArray(block.children) && block.children[childPath[1]]\n  if (child) {\n    keyedChildPath = ['children', {_key: child._key}]\n  }\n  return (keyedChildPath ? [...keyedBlockPath, ...keyedChildPath] : keyedBlockPath) as Path\n}\n\nexport function createArrayedPath(point: EditorSelectionPoint, editor: Editor): SlatePath {\n  if (!editor) {\n    return []\n  }\n  const [block, blockPath] = Array.from(\n    Editor.nodes(editor, {\n      at: [],\n      match: (n) => isKeySegment(point.path[0]) && (n as Descendant)._key === point.path[0]._key,\n    }),\n  )[0] || [undefined, undefined]\n  if (!block || !Element.isElement(block)) {\n    return []\n  }\n  if (editor.isVoid(block)) {\n    return [blockPath[0], 0]\n  }\n  const childPath = [point.path[2]]\n  const childIndex = block.children.findIndex((child) => isEqual([{_key: child._key}], childPath))\n  if (childIndex >= 0 && block.children[childIndex]) {\n    const child = block.children[childIndex]\n    if (Element.isElement(child) && editor.isVoid(child)) {\n      return blockPath.concat(childIndex).concat(0)\n    }\n    return blockPath.concat(childIndex)\n  }\n  return blockPath\n}\n","/* eslint-disable complexity */\nimport {type BaseRange, type Editor, type Operation, Point, Range} from 'slate'\n\nimport {\n  type EditorSelection,\n  type EditorSelectionPoint,\n  type PortableTextMemberSchemaTypes,\n} from '../types/editor'\nimport {createArrayedPath, createKeyedPath} from './paths'\n\nexport interface ObjectWithKeyAndType {\n  _key: string\n  _type: string\n  children?: ObjectWithKeyAndType[]\n}\n\nexport function toPortableTextRange(\n  value: ObjectWithKeyAndType[] | undefined,\n  range: BaseRange | Partial<BaseRange> | null,\n  types: PortableTextMemberSchemaTypes,\n): EditorSelection {\n  if (!range) {\n    return null\n  }\n  let anchor: EditorSelectionPoint | null = null\n  let focus: EditorSelectionPoint | null = null\n  const anchorPath = range.anchor && createKeyedPath(range.anchor, value, types)\n  if (anchorPath && range.anchor) {\n    anchor = {\n      path: anchorPath,\n      offset: range.anchor.offset,\n    }\n  }\n  const focusPath = range.focus && createKeyedPath(range.focus, value, types)\n  if (focusPath && range.focus) {\n    focus = {\n      path: focusPath,\n      offset: range.focus.offset,\n    }\n  }\n  const backward = Boolean(Range.isRange(range) ? Range.isBackward(range) : undefined)\n  return anchor && focus ? {anchor, focus, backward} : null\n}\n\nexport function toSlateRange(selection: EditorSelection, editor: Editor): Range | null {\n  if (!selection || !editor) {\n    return null\n  }\n  const anchor = {\n    path: createArrayedPath(selection.anchor, editor),\n    offset: selection.anchor.offset,\n  }\n  const focus = {\n    path: createArrayedPath(selection.focus, editor),\n    offset: selection.focus.offset,\n  }\n  if (focus.path.length === 0 || anchor.path.length === 0) {\n    return null\n  }\n  const range = anchor && focus ? {anchor, focus} : null\n  return range\n}\n\nexport function moveRangeByOperation(range: Range, operation: Operation): Range | null {\n  const anchor = Point.transform(range.anchor, operation)\n  const focus = Point.transform(range.focus, operation)\n\n  if (anchor === null || focus === null) {\n    return null\n  }\n\n  if (Point.equals(anchor, range.anchor) && Point.equals(focus, range.focus)) {\n    return range\n  }\n\n  return {anchor, focus}\n}\n","import {type Path, type PortableTextBlock} from '@sanity/types'\nimport {isEqual} from 'lodash'\n\nimport {type EditorSelection, type EditorSelectionPoint} from '../types/editor'\n\nexport function normalizePoint(\n  point: EditorSelectionPoint,\n  value: PortableTextBlock[],\n): EditorSelectionPoint | null {\n  if (!point || !value) {\n    return null\n  }\n  const newPath: Path = []\n  let newOffset: number = point.offset || 0\n  const blockKey =\n    typeof point.path[0] === 'object' && '_key' in point.path[0] && point.path[0]._key\n  const childKey =\n    typeof point.path[2] === 'object' && '_key' in point.path[2] && point.path[2]._key\n  const block: PortableTextBlock | undefined = value.find((blk) => blk._key === blockKey)\n  if (block) {\n    newPath.push({_key: block._key})\n  } else {\n    return null\n  }\n  if (block && point.path[1] === 'children') {\n    if (!block.children || (Array.isArray(block.children) && block.children.length === 0)) {\n      return null\n    }\n    const child =\n      Array.isArray(block.children) && block.children.find((cld) => cld._key === childKey)\n    if (child) {\n      newPath.push('children')\n      newPath.push({_key: child._key})\n      newOffset =\n        child.text && child.text.length >= point.offset\n          ? point.offset\n          : (child.text && child.text.length) || 0\n    } else {\n      return null\n    }\n  }\n  return {path: newPath, offset: newOffset}\n}\n\nexport function normalizeSelection(\n  selection: EditorSelection,\n  value: PortableTextBlock[] | undefined,\n): EditorSelection | null {\n  if (!selection || !value || value.length === 0) {\n    return null\n  }\n  let newAnchor: EditorSelectionPoint | null = null\n  let newFocus: EditorSelectionPoint | null = null\n  const {anchor, focus} = selection\n  if (anchor && value.find((blk) => isEqual({_key: blk._key}, anchor.path[0]))) {\n    newAnchor = normalizePoint(anchor, value)\n  }\n  if (focus && value.find((blk) => isEqual({_key: blk._key}, focus.path[0]))) {\n    newFocus = normalizePoint(focus, value)\n  }\n  if (newAnchor && newFocus) {\n    return {anchor: newAnchor, focus: newFocus, backward: selection.backward}\n  }\n  return null\n}\n","import {\n  type PathSegment,\n  type PortableTextBlock,\n  type PortableTextChild,\n  type PortableTextObject,\n  type PortableTextTextBlock,\n} from '@sanity/types'\nimport {isEqual} from 'lodash'\nimport {type Descendant, Element, type Node, Text} from 'slate'\n\nimport {type PortableTextMemberSchemaTypes} from '../types/editor'\n\nexport const EMPTY_MARKDEFS: PortableTextObject[] = []\nexport const EMPTY_MARKS: string[] = []\n\nexport const VOID_CHILD_KEY = 'void-child'\n\ntype Partial<T> = {\n  [P in keyof T]?: T[P]\n}\n\nfunction keepObjectEquality(\n  object: PortableTextBlock | PortableTextChild,\n  keyMap: Record<string, PortableTextBlock | PortableTextChild>,\n) {\n  const value = keyMap[object._key]\n  if (value && isEqual(object, value)) {\n    return value\n  }\n  keyMap[object._key] = object\n  return object\n}\n\nexport function toSlateValue(\n  value: PortableTextBlock[] | undefined,\n  {schemaTypes}: {schemaTypes: PortableTextMemberSchemaTypes},\n  keyMap: Record<string, any> = {},\n): Descendant[] {\n  if (value && Array.isArray(value)) {\n    return value.map((block) => {\n      const {_type, _key, ...rest} = block\n      const voidChildren = [{_key: VOID_CHILD_KEY, _type: 'span', text: '', marks: []}]\n      const isPortableText = block && block._type === schemaTypes.block.name\n      if (isPortableText) {\n        const textBlock = block as PortableTextTextBlock\n        let hasInlines = false\n        const hasMissingStyle = typeof textBlock.style === 'undefined'\n        const hasMissingMarkDefs = typeof textBlock.markDefs === 'undefined'\n        const hasMissingChildren = typeof textBlock.children === 'undefined'\n\n        const children = (textBlock.children || []).map((child) => {\n          const {_type: cType, _key: cKey, ...cRest} = child\n          // Return 'slate' version of inline object where the actual\n          // value is stored in the `value` property.\n          // In slate, inline objects are represented as regular\n          // children with actual text node in order to be able to\n          // be selected the same way as the rest of the (text) content.\n          if (cType !== 'span') {\n            hasInlines = true\n            return keepObjectEquality(\n              {\n                _type: cType,\n                _key: cKey,\n                children: voidChildren,\n                value: cRest,\n                __inline: true,\n              },\n              keyMap,\n            )\n          }\n          // Original child object (span)\n          return child\n        })\n        // Return original block\n        if (\n          !hasMissingStyle &&\n          !hasMissingMarkDefs &&\n          !hasMissingChildren &&\n          !hasInlines &&\n          Element.isElement(block)\n        ) {\n          // Original object\n          return block\n        }\n        // TODO: remove this when we have a better way to handle missing style\n        if (hasMissingStyle) {\n          rest.style = schemaTypes.styles[0].value\n        }\n        return keepObjectEquality({_type, _key, ...rest, children}, keyMap)\n      }\n      return keepObjectEquality(\n        {\n          _type,\n          _key,\n          children: voidChildren,\n          value: rest,\n        },\n        keyMap,\n      )\n    }) as Descendant[]\n  }\n  return []\n}\n\nexport function fromSlateValue(\n  value: Descendant[],\n  textBlockType: string,\n  keyMap: Record<string, PortableTextBlock | PortableTextChild> = {},\n): PortableTextBlock[] {\n  return value.map((block) => {\n    const {_key, _type} = block\n    if (!_key || !_type) {\n      throw new Error('Not a valid block')\n    }\n    if (_type === textBlockType && 'children' in block && Array.isArray(block.children) && _key) {\n      let hasInlines = false\n      const children = block.children.map((child) => {\n        const {_type: _cType} = child\n        if ('value' in child && _cType !== 'span') {\n          hasInlines = true\n          // eslint-disable-next-line @typescript-eslint/no-unused-vars\n          const {value: v, _key: k, _type: t, __inline: _i, children: _c, ...rest} = child\n          return keepObjectEquality({...rest, ...v, _key: k as string, _type: t as string}, keyMap)\n        }\n        return child\n      })\n      if (!hasInlines) {\n        return block as PortableTextBlock // Original object\n      }\n      return keepObjectEquality({...block, children, _key, _type}, keyMap) as PortableTextBlock\n    }\n    const blockValue = 'value' in block && block.value\n    return keepObjectEquality(\n      {_key, _type, ...(typeof blockValue === 'object' ? blockValue : {})},\n      keyMap,\n    ) as PortableTextBlock\n  })\n}\n\nexport function isEqualToEmptyEditor(\n  children: Descendant[] | PortableTextBlock[],\n  schemaTypes: PortableTextMemberSchemaTypes,\n): boolean {\n  return (\n    children === undefined ||\n    (children && Array.isArray(children) && children.length === 0) ||\n    (children &&\n      Array.isArray(children) &&\n      children.length === 1 &&\n      Element.isElement(children[0]) &&\n      children[0]._type === schemaTypes.block.name &&\n      'style' in children[0] &&\n      children[0].style === schemaTypes.styles[0].value &&\n      !('listItem' in children[0]) &&\n      Array.isArray(children[0].children) &&\n      children[0].children.length === 1 &&\n      Text.isText(children[0].children[0]) &&\n      children[0].children[0]._type === 'span' &&\n      !children[0].children[0].marks?.join('') &&\n      children[0].children[0].text === '')\n  )\n}\n\nexport function findBlockAndIndexFromPath(\n  firstPathSegment: PathSegment,\n  children: (Node | Partial<Node>)[],\n): [Element | undefined, number | undefined] {\n  let blockIndex = -1\n  const isNumber = Number.isInteger(Number(firstPathSegment))\n  if (isNumber) {\n    blockIndex = Number(firstPathSegment)\n  } else if (children) {\n    blockIndex = children.findIndex(\n      (blk) => Element.isElement(blk) && isEqual({_key: blk._key}, firstPathSegment),\n    )\n  }\n  if (blockIndex > -1) {\n    return [children[blockIndex] as Element, blockIndex]\n  }\n  return [undefined, -1]\n}\n\nexport function findChildAndIndexFromPath(\n  secondPathSegment: PathSegment,\n  block: Element,\n): [Element | Text | undefined, number] {\n  let childIndex = -1\n  const isNumber = Number.isInteger(Number(secondPathSegment))\n  if (isNumber) {\n    childIndex = Number(secondPathSegment)\n  } else {\n    childIndex = block.children.findIndex((child) => isEqual({_key: child._key}, secondPathSegment))\n  }\n  if (childIndex > -1) {\n    return [block.children[childIndex] as Element | Text, childIndex]\n  }\n  return [undefined, -1]\n}\n\nexport function getValueOrInitialValue(\n  value: unknown,\n  initialValue: PortableTextBlock[],\n): PortableTextBlock[] | undefined {\n  if (value && Array.isArray(value) && value.length > 0) {\n    return value\n  }\n  return initialValue\n}\n","import {type Editor, type Element, type Range} from 'slate'\n\nimport {type EditorSelection} from '..'\n\n// Is the editor currently receiving remote changes that are being applied to the content?\nexport const IS_PROCESSING_REMOTE_CHANGES: WeakMap<Editor, boolean> = new WeakMap()\n// Is the editor currently producing local changes that are not yet submitted?\nexport const IS_PROCESSING_LOCAL_CHANGES: WeakMap<Editor, boolean> = new WeakMap()\n\n// Is the editor dragging something?\nexport const IS_DRAGGING: WeakMap<Editor, boolean> = new WeakMap()\n// Is the editor dragging a element?\nexport const IS_DRAGGING_BLOCK_ELEMENT: WeakMap<Editor, Element> = new WeakMap()\n\n// When dragging elements, this will be the target element\nexport const IS_DRAGGING_ELEMENT_TARGET: WeakMap<Editor, Element> = new WeakMap()\n// Target position for dragging over a block\nexport const IS_DRAGGING_BLOCK_TARGET_POSITION: WeakMap<Editor, 'top' | 'bottom'> = new WeakMap()\n\nexport const KEY_TO_SLATE_ELEMENT: WeakMap<Editor, any | undefined> = new WeakMap()\nexport const KEY_TO_VALUE_ELEMENT: WeakMap<Editor, any | undefined> = new WeakMap()\n\n// Keep object relation to slate range in the portable-text-range\nexport const SLATE_TO_PORTABLE_TEXT_RANGE = new WeakMap<Range, EditorSelection>()\n","import {type PortableTextBlock, type PortableTextChild} from '@sanity/types'\n\ntype Props = {\n  value: PortableTextBlock | PortableTextChild\n}\n\nconst DefaultObject = (props: Props): JSX.Element => {\n  return (\n    <div>\n      <pre>{JSON.stringify(props.value, null, 2)}</pre>\n    </div>\n  )\n}\n\nexport default DefaultObject\n","import {styled} from 'styled-components'\n\nexport const DefaultBlockObject = styled.div<{selected: boolean}>`\n  user-select: none;\n  border: ${(props) => {\n    if (props.selected) {\n      return '1px solid blue'\n    }\n    return '1px solid transparent'\n  }};\n`\n\nexport const DefaultInlineObject = styled.span<{selected: boolean}>`\n  background: #999;\n  border: ${(props) => {\n    if (props.selected) {\n      return '1px solid blue'\n    }\n    return '1px solid transparent'\n  }};\n`\n\ntype ListItemProps = {listLevel: number; listStyle: string}\n\nexport const DefaultListItem = styled.div<ListItemProps>`\n  &.pt-list-item {\n    width: fit-content;\n    position: relative;\n    display: block;\n\n    /* Important 'transform' in order to force refresh the ::before and ::after rules\n      in Webkit: https://stackoverflow.com/a/21947628/831480\n    */\n    transform: translateZ(0);\n    margin-left: ${(props: ListItemProps) => getLeftPositionForListLevel(props.listLevel)};\n  }\n  &.pt-list-item > .pt-list-item-inner {\n    display: flex;\n    margin: 0;\n    padding: 0;\n    &:before {\n      justify-content: flex-start;\n      vertical-align: top;\n    }\n  }\n  &.pt-list-item-bullet > .pt-list-item-inner:before {\n      content: '${(props: ListItemProps) =>\n        getContentForListLevelAndStyle(props.listLevel, props.listStyle)}';\n      font-size: 0.4375rem; /* 7px */\n      line-height: 1.5rem; /* Same as body text */\n      /* Optical alignment */\n      position: relative;\n    }\n  }\n  &.pt-list-item-bullet > .pt-list-item-inner {\n    &:before {\n      min-width: 1.5rem; /* Make sure space between bullet and text never shrinks */\n    }\n  }\n  &.pt-list-item-number {\n    counter-increment: ${(props: {listLevel: number}) =>\n      getCounterIncrementForListLevel(props.listLevel)};\n    counter-reset: ${(props: {listLevel: number}) => getCounterResetForListLevel(props.listLevel)};\n  }\n  & + :not(.pt-list-item-number) {\n    counter-reset: listItemNumber;\n  }\n  &.pt-list-item-number > .pt-list-item-inner:before {\n    content: ${(props) => getCounterContentForListLevel(props.listLevel)};\n    min-width: 1.5rem; /* Make sure space between number and text never shrinks */\n    /* Optical alignment */\n    position: relative;\n    top: 1px;\n  }\n`\n\nexport const DefaultListItemInner = styled.div``\n\nfunction getLeftPositionForListLevel(level: number) {\n  switch (Number(level)) {\n    case 1:\n      return '1.5em'\n    case 2:\n      return '3em'\n    case 3:\n      return '4.5em'\n    case 4:\n      return '6em'\n    case 5:\n      return '7.5em'\n    case 6:\n      return '9em'\n    case 7:\n      return '10.5em'\n    case 8:\n      return '12em'\n    case 9:\n      return '13.5em'\n    case 10:\n      return '15em'\n    default:\n      return '0em'\n  }\n}\n\nconst bullets = ['●', '○', '■']\n\nfunction getContentForListLevelAndStyle(level: number, style: string) {\n  const normalizedLevel = (level - 1) % 3\n  if (style === 'bullet') {\n    return bullets[normalizedLevel]\n  }\n  return '*'\n}\n\nfunction getCounterIncrementForListLevel(level: number) {\n  switch (level) {\n    case 1:\n      return 'listItemNumber'\n    case 2:\n      return 'listItemAlpha'\n    case 3:\n      return 'listItemRoman'\n    case 4:\n      return 'listItemNumberNext'\n    case 5:\n      return 'listItemLetterNext'\n    case 6:\n      return 'listItemRomanNext'\n    case 7:\n      return 'listItemNumberNextNext'\n    case 8:\n      return 'listItemAlphaNextNext'\n    case 9:\n      return 'listItemRomanNextNext'\n    default:\n      return 'listItemNumberNextNextNext'\n  }\n}\n\nfunction getCounterResetForListLevel(level: number) {\n  switch (level) {\n    case 1:\n      return 'listItemAlpha'\n    case 2:\n      return 'listItemRoman'\n    case 3:\n      return 'listItemNumberNext'\n    case 4:\n      return 'listItemLetterNext'\n    case 5:\n      return 'listItemRomanNext'\n    case 6:\n      return 'listItemNumberNextNext'\n    case 7:\n      return 'listItemAlphaNextNext'\n    case 8:\n      return 'listItemRomanNextNext'\n    case 9:\n      return 'listItemNumberNextNextNext'\n    default:\n      return 'listItemNumberNextNextNext'\n  }\n}\n\nfunction getCounterContentForListLevel(level: number) {\n  switch (level) {\n    case 1:\n      return `counter(listItemNumber) '. '`\n    case 2:\n      return `counter(listItemAlpha, lower-alpha) '. '`\n    case 3:\n      return `counter(listItemRoman, lower-roman) '. '`\n    case 4:\n      return `counter(listItemNumberNext) '. '`\n    case 5:\n      return `counter(listItemLetterNext, lower-alpha) '. '`\n    case 6:\n      return `counter(listItemRomanNext, lower-roman) '. '`\n    case 7:\n      return `counter(listItemNumberNextNext) '. '`\n    case 8:\n      return `counter(listItemAlphaNextNext, lower-alpha) '. '`\n    case 9:\n      return `counter(listItemRomanNextNext, lower-roman) '. '`\n    default:\n      return `counter(listItemNumberNextNextNext) '. '`\n  }\n}\n","import {\n  type DragEvent,\n  type MutableRefObject,\n  type ReactNode,\n  useCallback,\n  useEffect,\n  useMemo,\n  useRef,\n  useState,\n} from 'react'\nimport {Editor, type Element as SlateElement, Path, Transforms} from 'slate'\nimport {ReactEditor, useSlateStatic} from 'slate-react'\n\nimport {debugWithName} from '../../utils/debug'\nimport {\n  IS_DRAGGING,\n  IS_DRAGGING_BLOCK_ELEMENT,\n  IS_DRAGGING_BLOCK_TARGET_POSITION,\n  IS_DRAGGING_ELEMENT_TARGET,\n} from '../../utils/weakMaps'\n\nconst debug = debugWithName('components:DraggableBlock')\nconst debugRenders = false\n\n/**\n * @internal\n */\nexport interface DraggableBlockProps {\n  children: ReactNode\n  element: SlateElement\n  readOnly: boolean\n  blockRef: MutableRefObject<HTMLDivElement | null>\n}\n\n/**\n * Implements drag and drop functionality on editor block nodes\n * @internal\n */\nexport const DraggableBlock = ({children, element, readOnly, blockRef}: DraggableBlockProps) => {\n  const editor = useSlateStatic()\n  const dragGhostRef: MutableRefObject<undefined | HTMLElement> = useRef()\n  const [isDragOver, setIsDragOver] = useState(false)\n  const isVoid = useMemo(() => Editor.isVoid(editor, element), [editor, element])\n  const isInline = useMemo(() => Editor.isInline(editor, element), [editor, element])\n\n  const [blockElement, setBlockElement] = useState<HTMLElement | null>(null)\n\n  useEffect(\n    () => setBlockElement(blockRef ? blockRef.current : ReactEditor.toDOMNode(editor, element)),\n    [editor, element, blockRef],\n  )\n\n  // Note: this is called not for the dragging block, but for the targets when the block is dragged over them\n  const handleDragOver = useCallback(\n    (event: DragEvent) => {\n      const isMyDragOver = IS_DRAGGING_BLOCK_ELEMENT.get(editor)\n      // debug('Drag over', blockElement)\n      if (!isMyDragOver || !blockElement) {\n        return\n      }\n      event.preventDefault()\n      event.dataTransfer.dropEffect = 'move'\n      IS_DRAGGING_ELEMENT_TARGET.set(editor, element)\n      const elementRect = blockElement.getBoundingClientRect()\n      const offset = elementRect.top\n      const height = elementRect.height\n      const Y = event.pageY\n      const loc = Math.abs(offset - Y)\n      let position: 'top' | 'bottom' = 'bottom'\n      if (element === editor.children[0]) {\n        position = 'top'\n      } else if (loc < height / 2) {\n        position = 'top'\n        IS_DRAGGING_BLOCK_TARGET_POSITION.set(editor, position)\n      } else {\n        position = 'bottom'\n        IS_DRAGGING_BLOCK_TARGET_POSITION.set(editor, position)\n      }\n      if (isMyDragOver === element) {\n        event.dataTransfer.dropEffect = 'none'\n        return\n      }\n      setIsDragOver(true)\n    },\n    [blockElement, editor, element],\n  )\n\n  // Note: this is called not for the dragging block, but for the targets when the block is dragged over them\n  const handleDragLeave = useCallback(() => {\n    setIsDragOver(false)\n  }, [])\n\n  // Note: this is called for the dragging block\n  const handleDragEnd = useCallback(\n    (event: DragEvent) => {\n      const targetBlock = IS_DRAGGING_ELEMENT_TARGET.get(editor)\n      if (targetBlock) {\n        IS_DRAGGING.set(editor, false)\n        event.preventDefault()\n        event.stopPropagation()\n        IS_DRAGGING_ELEMENT_TARGET.delete(editor)\n        if (dragGhostRef.current) {\n          debug('Removing drag ghost')\n          document.body.removeChild(dragGhostRef.current)\n        }\n        const dragPosition = IS_DRAGGING_BLOCK_TARGET_POSITION.get(editor)\n        IS_DRAGGING_BLOCK_TARGET_POSITION.delete(editor)\n        let targetPath = ReactEditor.findPath(editor, targetBlock)\n        const myPath = ReactEditor.findPath(editor, element)\n        const isBefore = Path.isBefore(myPath, targetPath)\n        if (dragPosition === 'bottom' && !isBefore) {\n          // If it is already at the bottom, don't do anything.\n          if (targetPath[0] >= editor.children.length - 1) {\n            debug('target is already at the bottom, not moving')\n            return\n          }\n          const originalPath = targetPath\n          targetPath = Path.next(targetPath)\n          debug(\n            `Adjusting targetPath from ${JSON.stringify(originalPath)} to ${JSON.stringify(\n              targetPath,\n            )}`,\n          )\n        }\n        if (dragPosition === 'top' && isBefore && targetPath[0] !== editor.children.length - 1) {\n          const originalPath = targetPath\n          targetPath = Path.previous(targetPath)\n          debug(\n            `Adjusting targetPath from ${JSON.stringify(originalPath)} to ${JSON.stringify(\n              targetPath,\n            )}`,\n          )\n        }\n        if (Path.equals(targetPath, myPath)) {\n          event.preventDefault()\n          debug('targetPath and myPath is the same, not moving')\n          return\n        }\n        debug(\n          `Moving element ${element._key} from path ${JSON.stringify(myPath)} to ${JSON.stringify(\n            targetPath,\n          )} (${dragPosition})`,\n        )\n        Transforms.moveNodes(editor, {at: myPath, to: targetPath})\n        editor.onChange()\n        return\n      }\n      debug('No target element, not doing anything')\n    },\n    [editor, element],\n  )\n  // Note: this is called not for the dragging block, but for the drop target\n  const handleDrop = useCallback(\n    (event: DragEvent) => {\n      if (IS_DRAGGING_BLOCK_ELEMENT.get(editor)) {\n        debug('On drop (prevented)', element)\n        event.preventDefault()\n        event.stopPropagation()\n        setIsDragOver(false)\n      }\n    },\n    [editor, element],\n  )\n  // Note: this is called for the dragging block\n  const handleDrag = useCallback(\n    (event: DragEvent) => {\n      if (!isVoid) {\n        IS_DRAGGING_BLOCK_ELEMENT.delete(editor)\n        return\n      }\n      IS_DRAGGING.set(editor, true)\n      IS_DRAGGING_BLOCK_ELEMENT.set(editor, element)\n      event.stopPropagation() // Stop propagation so that leafs don't get this and take focus/selection!\n\n      const target = event.target\n\n      if (target instanceof HTMLElement) {\n        target.style.opacity = '1'\n      }\n    },\n    [editor, element, isVoid],\n  )\n\n  // Note: this is called for the dragging block\n  const handleDragStart = useCallback(\n    (event: DragEvent) => {\n      if (!isVoid || isInline) {\n        debug('Not dragging block')\n        IS_DRAGGING_BLOCK_ELEMENT.delete(editor)\n        IS_DRAGGING.set(editor, false)\n        return\n      }\n      debug('Drag start')\n      IS_DRAGGING.set(editor, true)\n      if (event.dataTransfer) {\n        event.dataTransfer.setData('application/portable-text', 'something')\n        event.dataTransfer.effectAllowed = 'move'\n      }\n      // Clone blockElement so that it will not be visually clipped by scroll-containers etc.\n      // The application that uses the portable-text-editor may indicate the element used as\n      // drag ghost by adding a truthy data attribute 'data-pt-drag-ghost-element' to a HTML element.\n      if (blockElement && blockElement instanceof HTMLElement) {\n        let dragGhost = blockElement.cloneNode(true) as HTMLElement\n        const customGhost = dragGhost.querySelector('[data-pt-drag-ghost-element]')\n        if (customGhost) {\n          dragGhost = customGhost as HTMLElement\n        }\n\n        // Set the `data-dragged` attribute so the consumer can style the element while it’s dragged\n        dragGhost.setAttribute('data-dragged', '')\n\n        if (document.body) {\n          dragGhostRef.current = dragGhost\n          dragGhost.style.position = 'absolute'\n          dragGhost.style.left = '-99999px'\n          dragGhost.style.boxSizing = 'border-box'\n          document.body.appendChild(dragGhost)\n          const rect = blockElement.getBoundingClientRect()\n          const x = event.clientX - rect.left\n          const y = event.clientY - rect.top\n          dragGhost.style.width = `${rect.width}px`\n          dragGhost.style.height = `${rect.height}px`\n          event.dataTransfer.setDragImage(dragGhost, x, y)\n        }\n      }\n      handleDrag(event)\n    },\n    [blockElement, editor, handleDrag, isInline, isVoid],\n  )\n\n  const isDraggingOverFirstBlock =\n    isDragOver && editor.children[0] === IS_DRAGGING_ELEMENT_TARGET.get(editor)\n  const isDraggingOverLastBlock =\n    isDragOver &&\n    editor.children[editor.children.length - 1] === IS_DRAGGING_ELEMENT_TARGET.get(editor)\n  const dragPosition = IS_DRAGGING_BLOCK_TARGET_POSITION.get(editor)\n\n  const isDraggingOverTop =\n    isDraggingOverFirstBlock ||\n    (isDragOver && !isDraggingOverFirstBlock && !isDraggingOverLastBlock && dragPosition === 'top')\n  const isDraggingOverBottom =\n    isDraggingOverLastBlock ||\n    (isDragOver &&\n      !isDraggingOverFirstBlock &&\n      !isDraggingOverLastBlock &&\n      dragPosition === 'bottom')\n\n  const dropIndicator = useMemo(\n    () => (\n      <div\n        className=\"pt-drop-indicator\"\n        style={{\n          position: 'absolute',\n          width: '100%',\n          height: 1,\n          borderBottom: '1px solid currentColor',\n          zIndex: 5,\n        }}\n      />\n    ),\n    [],\n  )\n\n  if (readOnly) {\n    return <>{children}</>\n  }\n\n  if (debugRenders) {\n    debug('render')\n  }\n\n  return (\n    <div\n      draggable={isVoid}\n      onDragStart={handleDragStart}\n      onDrag={handleDrag}\n      onDragOver={handleDragOver}\n      onDragLeave={handleDragLeave}\n      onDragEnd={handleDragEnd}\n      onDrop={handleDrop}\n    >\n      {isDraggingOverTop && dropIndicator}\n      {children}\n      {isDraggingOverBottom && dropIndicator}\n    </div>\n  )\n}\n","/* eslint-disable complexity */\n/* eslint-disable max-statements */\nimport {\n  type Path,\n  type PortableTextChild,\n  type PortableTextObject,\n  type PortableTextTextBlock,\n} from '@sanity/types'\nimport {type FunctionComponent, type ReactElement, useMemo, useRef} from 'react'\nimport {Editor, Element as SlateElement, Range} from 'slate'\nimport {ReactEditor, type RenderElementProps, useSelected, useSlateStatic} from 'slate-react'\n\nimport {\n  type BlockRenderProps,\n  type PortableTextMemberSchemaTypes,\n  type RenderBlockFunction,\n  type RenderChildFunction,\n  type RenderListItemFunction,\n  type RenderStyleFunction,\n} from '../../types/editor'\nimport {debugWithName} from '../../utils/debug'\nimport {fromSlateValue} from '../../utils/values'\nimport {KEY_TO_VALUE_ELEMENT} from '../../utils/weakMaps'\nimport ObjectNode from '../nodes/DefaultObject'\nimport {DefaultBlockObject, DefaultListItem, DefaultListItemInner} from '../nodes/index'\nimport {DraggableBlock} from './DraggableBlock'\n\nconst debug = debugWithName('components:Element')\nconst debugRenders = false\nconst EMPTY_ANNOTATIONS: PortableTextObject[] = []\n\n/**\n * @internal\n */\nexport interface ElementProps {\n  attributes: RenderElementProps['attributes']\n  children: ReactElement\n  element: SlateElement\n  schemaTypes: PortableTextMemberSchemaTypes\n  readOnly: boolean\n  renderBlock?: RenderBlockFunction\n  renderChild?: RenderChildFunction\n  renderListItem?: RenderListItemFunction\n  renderStyle?: RenderStyleFunction\n  spellCheck?: boolean\n}\n\nconst inlineBlockStyle = {display: 'inline-block'}\n\n/**\n * Renders Portable Text block and inline object nodes in Slate\n * @internal\n */\nexport const Element: FunctionComponent<ElementProps> = ({\n  attributes,\n  children,\n  element,\n  schemaTypes,\n  readOnly,\n  renderBlock,\n  renderChild,\n  renderListItem,\n  renderStyle,\n  spellCheck,\n}) => {\n  const editor = useSlateStatic()\n  const selected = useSelected()\n  const blockRef = useRef<HTMLDivElement | null>(null)\n  const inlineBlockObjectRef = useRef(null)\n  const focused = (selected && editor.selection && Range.isCollapsed(editor.selection)) || false\n\n  const value = useMemo(\n    () => fromSlateValue([element], schemaTypes.block.name, KEY_TO_VALUE_ELEMENT.get(editor))[0],\n    [editor, element, schemaTypes.block.name],\n  )\n\n  let renderedBlock = children\n\n  let className\n\n  const blockPath: Path = useMemo(() => [{_key: element._key}], [element])\n\n  if (typeof element._type !== 'string') {\n    throw new Error(`Expected element to have a _type property`)\n  }\n\n  if (typeof element._key !== 'string') {\n    throw new Error(`Expected element to have a _key property`)\n  }\n\n  // Test for inline objects first\n  if (editor.isInline(element)) {\n    const path = ReactEditor.findPath(editor, element)\n    const [block] = Editor.node(editor, path, {depth: 1})\n    const schemaType = schemaTypes.inlineObjects.find((_type) => _type.name === element._type)\n    if (!schemaType) {\n      throw new Error('Could not find type for inline block element')\n    }\n    if (SlateElement.isElement(block)) {\n      const elmPath: Path = [{_key: block._key}, 'children', {_key: element._key}]\n      if (debugRenders) {\n        debug(`Render ${element._key} (inline object)`)\n      }\n      return (\n        <span {...attributes}>\n          {/* Note that children must follow immediately or cut and selections will not work properly in Chrome. */}\n          {children}\n          <span\n            draggable={!readOnly}\n            className=\"pt-inline-object\"\n            data-testid=\"pt-inline-object\"\n            ref={inlineBlockObjectRef}\n            key={element._key}\n            style={inlineBlockStyle}\n            contentEditable={false}\n          >\n            {renderChild &&\n              renderChild({\n                annotations: EMPTY_ANNOTATIONS, // These inline objects currently doesn't support annotations. This is a limitation of the current PT spec/model.\n                children: <ObjectNode value={value} />,\n                editorElementRef: inlineBlockObjectRef,\n                focused,\n                path: elmPath,\n                schemaType,\n                selected,\n                type: schemaType,\n                value: value as PortableTextChild,\n              })}\n            {!renderChild && <ObjectNode value={value} />}\n          </span>\n        </span>\n      )\n    }\n    throw new Error('Block not found!')\n  }\n\n  // If not inline, it's either a block (text) or a block object (non-text)\n  // NOTE: text blocks aren't draggable with DraggableBlock (yet?)\n  if (element._type === schemaTypes.block.name) {\n    className = `pt-block pt-text-block`\n    const isListItem = 'listItem' in element\n    if (debugRenders) {\n      debug(`Render ${element._key} (text block)`)\n    }\n    const style = ('style' in element && element.style) || 'normal'\n    className = `pt-block pt-text-block pt-text-block-style-${style}`\n    const blockStyleType = schemaTypes.styles.find((item) => item.value === style)\n    if (renderStyle && blockStyleType) {\n      renderedBlock = renderStyle({\n        block: element as PortableTextTextBlock,\n        children,\n        focused,\n        selected,\n        value: style,\n        path: blockPath,\n        schemaType: blockStyleType,\n        editorElementRef: blockRef,\n      })\n    }\n    let level\n    if (isListItem) {\n      if (typeof element.level === 'number') {\n        level = element.level\n      }\n      className += ` pt-list-item pt-list-item-${element.listItem} pt-list-item-level-${level || 1}`\n    }\n    if (editor.isListBlock(value) && isListItem && element.listItem) {\n      const listType = schemaTypes.lists.find((item) => item.value === element.listItem)\n      if (renderListItem && listType) {\n        renderedBlock = renderListItem({\n          block: value,\n          children: renderedBlock,\n          focused,\n          selected,\n          value: element.listItem,\n          path: blockPath,\n          schemaType: listType,\n          level: value.level || 1,\n          editorElementRef: blockRef,\n        })\n      } else {\n        renderedBlock = (\n          <DefaultListItem\n            listStyle={value.listItem || schemaTypes.lists[0].value}\n            listLevel={value.level || 1}\n          >\n            <DefaultListItemInner>{renderedBlock}</DefaultListItemInner>\n          </DefaultListItem>\n        )\n      }\n    }\n    const renderProps: Omit<BlockRenderProps, 'type'> = Object.defineProperty(\n      {\n        children: renderedBlock,\n        editorElementRef: blockRef,\n        focused,\n        level,\n        listItem: isListItem ? element.listItem : undefined,\n        path: blockPath,\n        selected,\n        style,\n        schemaType: schemaTypes.block,\n        value,\n      },\n      'type',\n      {\n        enumerable: false,\n        get() {\n          console.warn(\"Property 'type' is deprecated, use 'schemaType' instead.\")\n          return schemaTypes.block\n        },\n      },\n    )\n\n    const propsOrDefaultRendered = renderBlock\n      ? renderBlock(renderProps as BlockRenderProps)\n      : children\n    return (\n      <div key={element._key} {...attributes} className={className} spellCheck={spellCheck}>\n        <DraggableBlock element={element} readOnly={readOnly} blockRef={blockRef}>\n          <div ref={blockRef}>{propsOrDefaultRendered}</div>\n        </DraggableBlock>\n      </div>\n    )\n  }\n  const schemaType = schemaTypes.blockObjects.find((_type) => _type.name === element._type)\n  if (!schemaType) {\n    throw new Error(`Could not find schema type for block element of _type ${element._type}`)\n  }\n  if (debugRenders) {\n    debug(`Render ${element._key} (object block)`)\n  }\n  className = 'pt-block pt-object-block'\n  const block = fromSlateValue(\n    [element],\n    schemaTypes.block.name,\n    KEY_TO_VALUE_ELEMENT.get(editor),\n  )[0]\n  let renderedBlockFromProps\n  if (renderBlock) {\n    const _props: Omit<BlockRenderProps, 'type'> = Object.defineProperty(\n      {\n        children: <ObjectNode value={value} />,\n        editorElementRef: blockRef,\n        focused,\n        path: blockPath,\n        schemaType,\n        selected,\n        value: block,\n      },\n      'type',\n      {\n        enumerable: false,\n        get() {\n          console.warn(\"Property 'type' is deprecated, use 'schemaType' instead.\")\n          return schemaType\n        },\n      },\n    )\n    renderedBlockFromProps = renderBlock(_props as BlockRenderProps)\n  }\n  return (\n    <div key={element._key} {...attributes} className={className}>\n      {children}\n      <DraggableBlock element={element} readOnly={readOnly} blockRef={blockRef}>\n        {renderedBlockFromProps && (\n          <div ref={blockRef} contentEditable={false}>\n            {renderedBlockFromProps}\n          </div>\n        )}\n        {!renderedBlockFromProps && (\n          <DefaultBlockObject selected={selected}>\n            <ObjectNode value={value} />\n          </DefaultBlockObject>\n        )}\n      </DraggableBlock>\n    </div>\n  )\n}\n","import {createContext, useContext} from 'react'\n\nimport {type PortableTextEditor} from '../PortableTextEditor'\n\n/**\n * A React context for sharing the editor object.\n */\nexport const PortableTextEditorContext = createContext<PortableTextEditor | null>(null)\n\n/**\n * Get the current editor object from the React context.\n */\nexport const usePortableTextEditor = (): PortableTextEditor => {\n  const editor = useContext(PortableTextEditorContext)\n\n  if (!editor) {\n    throw new Error(\n      `The \\`usePortableTextEditor\\` hook must be used inside the <PortableTextEditor> component's context.`,\n    )\n  }\n\n  return editor\n}\n","import {type PortableTextObject} from '@sanity/types'\nimport {type ReactNode, useCallback} from 'react'\n\ntype Props = {\n  annotation: PortableTextObject\n  children: ReactNode\n}\nexport function DefaultAnnotation(props: Props) {\n  // eslint-disable-next-line no-alert\n  const handleClick = useCallback(() => alert(JSON.stringify(props.annotation)), [props.annotation])\n  return (\n    <span style={{color: 'blue'}} onClick={handleClick}>\n      {props.children}\n    </span>\n  )\n}\n","import {\n  type ArraySchemaType,\n  type BlockSchemaType,\n  type ObjectSchemaType,\n  type PortableTextBlock,\n  type SchemaType,\n  type SpanSchemaType,\n} from '@sanity/types'\n\nimport {type PortableTextMemberSchemaTypes} from '../types/editor'\n\nexport function getPortableTextMemberSchemaTypes(\n  portableTextType: ArraySchemaType<PortableTextBlock>,\n): PortableTextMemberSchemaTypes {\n  if (!portableTextType) {\n    throw new Error(\"Parameter 'portabletextType' missing (required)\")\n  }\n  const blockType = portableTextType.of?.find(findBlockType) as BlockSchemaType | undefined\n  if (!blockType) {\n    throw new Error('Block type is not defined in this schema (required)')\n  }\n  const childrenField = blockType.fields?.find((field) => field.name === 'children') as\n    | {type: ArraySchemaType}\n    | undefined\n  if (!childrenField) {\n    throw new Error('Children field for block type found in schema (required)')\n  }\n  const ofType = childrenField.type.of\n  if (!ofType) {\n    throw new Error('Valid types for block children not found in schema (required)')\n  }\n  const spanType = ofType.find((memberType) => memberType.name === 'span') as\n    | ObjectSchemaType\n    | undefined\n  if (!spanType) {\n    throw new Error('Span type not found in schema (required)')\n  }\n  const inlineObjectTypes = (ofType.filter((memberType) => memberType.name !== 'span') ||\n    []) as ObjectSchemaType[]\n  const blockObjectTypes = (portableTextType.of?.filter((field) => field.name !== blockType.name) ||\n    []) as ObjectSchemaType[]\n  return {\n    styles: resolveEnabledStyles(blockType),\n    decorators: resolveEnabledDecorators(spanType),\n    lists: resolveEnabledListItems(blockType),\n    block: blockType,\n    span: spanType,\n    portableText: portableTextType,\n    inlineObjects: inlineObjectTypes,\n    blockObjects: blockObjectTypes,\n    annotations: (spanType as SpanSchemaType).annotations,\n  }\n}\n\nfunction resolveEnabledStyles(blockType: ObjectSchemaType) {\n  const styleField = blockType.fields?.find((btField) => btField.name === 'style')\n  if (!styleField) {\n    throw new Error(\"A field with name 'style' is not defined in the block type (required).\")\n  }\n  const textStyles =\n    styleField.type.options?.list &&\n    styleField.type.options.list?.filter((style: {value: string}) => style.value)\n  if (!textStyles || textStyles.length === 0) {\n    throw new Error(\n      'The style fields need at least one style ' +\n        \"defined. I.e: {title: 'Normal', value: 'normal'}.\",\n    )\n  }\n  return textStyles\n}\n\nfunction resolveEnabledDecorators(spanType: ObjectSchemaType) {\n  return (spanType as any).decorators\n}\n\nfunction resolveEnabledListItems(blockType: ObjectSchemaType) {\n  const listField = blockType.fields?.find((btField) => btField.name === 'listItem')\n  if (!listField) {\n    throw new Error(\"A field with name 'listItem' is not defined in the block type (required).\")\n  }\n  const listItems =\n    listField.type.options?.list &&\n    listField.type.options.list.filter((list: {value: string}) => list.value)\n  if (!listItems) {\n    throw new Error('The list field need at least to be an empty array')\n  }\n  return listItems\n}\n\nfunction findBlockType(type: SchemaType): BlockSchemaType | null {\n  if (type.type) {\n    return findBlockType(type.type)\n  }\n\n  if (type.name === 'block') {\n    return type as BlockSchemaType\n  }\n\n  return null\n}\n","import {Schema} from '@sanity/schema'\n\nexport function compileType(rawType: any) {\n  return Schema.compile({\n    name: 'blockTypeSchema',\n    types: [rawType],\n  }).get(rawType.name)\n}\n","function isHighSurrogate(char) {\n  const charCode = char.charCodeAt(0);\n  return charCode >= 55296 && charCode <= 56319;\n}\nfunction isLowSurrogate(char) {\n  const charCode = char.charCodeAt(0);\n  return charCode >= 56320 && charCode <= 57343;\n}\nfunction cloneDiff(diff) {\n  const [type, patch] = diff;\n  return [type, patch];\n}\nfunction getCommonOverlap(textA, textB) {\n  let text1 = textA;\n  let text2 = textB;\n  const text1Length = text1.length;\n  const text2Length = text2.length;\n  if (text1Length === 0 || text2Length === 0) {\n    return 0;\n  }\n  if (text1Length > text2Length) {\n    text1 = text1.substring(text1Length - text2Length);\n  } else if (text1Length < text2Length) {\n    text2 = text2.substring(0, text1Length);\n  }\n  const textLength = Math.min(text1Length, text2Length);\n  if (text1 === text2) {\n    return textLength;\n  }\n  let best = 0;\n  let length = 1;\n  for (let found = 0; found !== -1;) {\n    const pattern = text1.substring(textLength - length);\n    found = text2.indexOf(pattern);\n    if (found === -1) {\n      return best;\n    }\n    length += found;\n    if (found === 0 || text1.substring(textLength - length) === text2.substring(0, length)) {\n      best = length;\n      length++;\n    }\n  }\n  return best;\n}\nfunction getCommonPrefix(text1, text2) {\n  if (!text1 || !text2 || text1[0] !== text2[0]) {\n    return 0;\n  }\n  let pointerMin = 0;\n  let pointerMax = Math.min(text1.length, text2.length);\n  let pointerMid = pointerMax;\n  let pointerStart = 0;\n  while (pointerMin < pointerMid) {\n    if (text1.substring(pointerStart, pointerMid) === text2.substring(pointerStart, pointerMid)) {\n      pointerMin = pointerMid;\n      pointerStart = pointerMin;\n    } else {\n      pointerMax = pointerMid;\n    }\n    pointerMid = Math.floor((pointerMax - pointerMin) / 2 + pointerMin);\n  }\n  return pointerMid;\n}\nfunction getCommonSuffix(text1, text2) {\n  if (!text1 || !text2 || text1[text1.length - 1] !== text2[text2.length - 1]) {\n    return 0;\n  }\n  let pointerMin = 0;\n  let pointerMax = Math.min(text1.length, text2.length);\n  let pointerMid = pointerMax;\n  let pointerEnd = 0;\n  while (pointerMin < pointerMid) {\n    if (text1.substring(text1.length - pointerMid, text1.length - pointerEnd) === text2.substring(text2.length - pointerMid, text2.length - pointerEnd)) {\n      pointerMin = pointerMid;\n      pointerEnd = pointerMin;\n    } else {\n      pointerMax = pointerMid;\n    }\n    pointerMid = Math.floor((pointerMax - pointerMin) / 2 + pointerMin);\n  }\n  return pointerMid;\n}\nfunction cleanupSemantic(rawDiffs) {\n  let diffs = rawDiffs.map(diff => cloneDiff(diff));\n  let hasChanges = false;\n  const equalities = [];\n  let equalitiesLength = 0;\n  let lastEquality = null;\n  let pointer = 0;\n  let lengthInsertions1 = 0;\n  let lengthDeletions1 = 0;\n  let lengthInsertions2 = 0;\n  let lengthDeletions2 = 0;\n  while (pointer < diffs.length) {\n    if (diffs[pointer][0] === DIFF_EQUAL) {\n      equalities[equalitiesLength++] = pointer;\n      lengthInsertions1 = lengthInsertions2;\n      lengthDeletions1 = lengthDeletions2;\n      lengthInsertions2 = 0;\n      lengthDeletions2 = 0;\n      lastEquality = diffs[pointer][1];\n    } else {\n      if (diffs[pointer][0] === DIFF_INSERT) {\n        lengthInsertions2 += diffs[pointer][1].length;\n      } else {\n        lengthDeletions2 += diffs[pointer][1].length;\n      }\n      if (lastEquality && lastEquality.length <= Math.max(lengthInsertions1, lengthDeletions1) && lastEquality.length <= Math.max(lengthInsertions2, lengthDeletions2)) {\n        diffs.splice(equalities[equalitiesLength - 1], 0, [DIFF_DELETE, lastEquality]);\n        diffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT;\n        equalitiesLength--;\n        equalitiesLength--;\n        pointer = equalitiesLength > 0 ? equalities[equalitiesLength - 1] : -1;\n        lengthInsertions1 = 0;\n        lengthDeletions1 = 0;\n        lengthInsertions2 = 0;\n        lengthDeletions2 = 0;\n        lastEquality = null;\n        hasChanges = true;\n      }\n    }\n    pointer++;\n  }\n  if (hasChanges) {\n    diffs = cleanupMerge(diffs);\n  }\n  diffs = cleanupSemanticLossless(diffs);\n  pointer = 1;\n  while (pointer < diffs.length) {\n    if (diffs[pointer - 1][0] === DIFF_DELETE && diffs[pointer][0] === DIFF_INSERT) {\n      const deletion = diffs[pointer - 1][1];\n      const insertion = diffs[pointer][1];\n      const overlapLength1 = getCommonOverlap(deletion, insertion);\n      const overlapLength2 = getCommonOverlap(insertion, deletion);\n      if (overlapLength1 >= overlapLength2) {\n        if (overlapLength1 >= deletion.length / 2 || overlapLength1 >= insertion.length / 2) {\n          diffs.splice(pointer, 0, [DIFF_EQUAL, insertion.substring(0, overlapLength1)]);\n          diffs[pointer - 1][1] = deletion.substring(0, deletion.length - overlapLength1);\n          diffs[pointer + 1][1] = insertion.substring(overlapLength1);\n          pointer++;\n        }\n      } else if (overlapLength2 >= deletion.length / 2 || overlapLength2 >= insertion.length / 2) {\n        diffs.splice(pointer, 0, [DIFF_EQUAL, deletion.substring(0, overlapLength2)]);\n        diffs[pointer - 1][0] = DIFF_INSERT;\n        diffs[pointer - 1][1] = insertion.substring(0, insertion.length - overlapLength2);\n        diffs[pointer + 1][0] = DIFF_DELETE;\n        diffs[pointer + 1][1] = deletion.substring(overlapLength2);\n        pointer++;\n      }\n      pointer++;\n    }\n    pointer++;\n  }\n  return diffs;\n}\nconst nonAlphaNumericRegex = /[^a-zA-Z0-9]/;\nconst whitespaceRegex = /\\s/;\nconst linebreakRegex = /[\\r\\n]/;\nconst blanklineEndRegex = /\\n\\r?\\n$/;\nconst blanklineStartRegex = /^\\r?\\n\\r?\\n/;\nfunction cleanupSemanticLossless(rawDiffs) {\n  const diffs = rawDiffs.map(diff => cloneDiff(diff));\n  function diffCleanupSemanticScore(one, two) {\n    if (!one || !two) {\n      return 6;\n    }\n    const char1 = one.charAt(one.length - 1);\n    const char2 = two.charAt(0);\n    const nonAlphaNumeric1 = char1.match(nonAlphaNumericRegex);\n    const nonAlphaNumeric2 = char2.match(nonAlphaNumericRegex);\n    const whitespace1 = nonAlphaNumeric1 && char1.match(whitespaceRegex);\n    const whitespace2 = nonAlphaNumeric2 && char2.match(whitespaceRegex);\n    const lineBreak1 = whitespace1 && char1.match(linebreakRegex);\n    const lineBreak2 = whitespace2 && char2.match(linebreakRegex);\n    const blankLine1 = lineBreak1 && one.match(blanklineEndRegex);\n    const blankLine2 = lineBreak2 && two.match(blanklineStartRegex);\n    if (blankLine1 || blankLine2) {\n      return 5;\n    } else if (lineBreak1 || lineBreak2) {\n      return 4;\n    } else if (nonAlphaNumeric1 && !whitespace1 && whitespace2) {\n      return 3;\n    } else if (whitespace1 || whitespace2) {\n      return 2;\n    } else if (nonAlphaNumeric1 || nonAlphaNumeric2) {\n      return 1;\n    }\n    return 0;\n  }\n  let pointer = 1;\n  while (pointer < diffs.length - 1) {\n    if (diffs[pointer - 1][0] === DIFF_EQUAL && diffs[pointer + 1][0] === DIFF_EQUAL) {\n      let equality1 = diffs[pointer - 1][1];\n      let edit = diffs[pointer][1];\n      let equality2 = diffs[pointer + 1][1];\n      const commonOffset = getCommonSuffix(equality1, edit);\n      if (commonOffset) {\n        const commonString = edit.substring(edit.length - commonOffset);\n        equality1 = equality1.substring(0, equality1.length - commonOffset);\n        edit = commonString + edit.substring(0, edit.length - commonOffset);\n        equality2 = commonString + equality2;\n      }\n      let bestEquality1 = equality1;\n      let bestEdit = edit;\n      let bestEquality2 = equality2;\n      let bestScore = diffCleanupSemanticScore(equality1, edit) + diffCleanupSemanticScore(edit, equality2);\n      while (edit.charAt(0) === equality2.charAt(0)) {\n        equality1 += edit.charAt(0);\n        edit = edit.substring(1) + equality2.charAt(0);\n        equality2 = equality2.substring(1);\n        const score = diffCleanupSemanticScore(equality1, edit) + diffCleanupSemanticScore(edit, equality2);\n        if (score >= bestScore) {\n          bestScore = score;\n          bestEquality1 = equality1;\n          bestEdit = edit;\n          bestEquality2 = equality2;\n        }\n      }\n      if (diffs[pointer - 1][1] !== bestEquality1) {\n        if (bestEquality1) {\n          diffs[pointer - 1][1] = bestEquality1;\n        } else {\n          diffs.splice(pointer - 1, 1);\n          pointer--;\n        }\n        diffs[pointer][1] = bestEdit;\n        if (bestEquality2) {\n          diffs[pointer + 1][1] = bestEquality2;\n        } else {\n          diffs.splice(pointer + 1, 1);\n          pointer--;\n        }\n      }\n    }\n    pointer++;\n  }\n  return diffs;\n}\nfunction cleanupMerge(rawDiffs) {\n  let diffs = rawDiffs.map(diff => cloneDiff(diff));\n  diffs.push([DIFF_EQUAL, \"\"]);\n  let pointer = 0;\n  let countDelete = 0;\n  let countInsert = 0;\n  let textDelete = \"\";\n  let textInsert = \"\";\n  let commonlength;\n  while (pointer < diffs.length) {\n    switch (diffs[pointer][0]) {\n      case DIFF_INSERT:\n        countInsert++;\n        textInsert += diffs[pointer][1];\n        pointer++;\n        break;\n      case DIFF_DELETE:\n        countDelete++;\n        textDelete += diffs[pointer][1];\n        pointer++;\n        break;\n      case DIFF_EQUAL:\n        if (countDelete + countInsert > 1) {\n          if (countDelete !== 0 && countInsert !== 0) {\n            commonlength = getCommonPrefix(textInsert, textDelete);\n            if (commonlength !== 0) {\n              if (pointer - countDelete - countInsert > 0 && diffs[pointer - countDelete - countInsert - 1][0] === DIFF_EQUAL) {\n                diffs[pointer - countDelete - countInsert - 1][1] += textInsert.substring(0, commonlength);\n              } else {\n                diffs.splice(0, 0, [DIFF_EQUAL, textInsert.substring(0, commonlength)]);\n                pointer++;\n              }\n              textInsert = textInsert.substring(commonlength);\n              textDelete = textDelete.substring(commonlength);\n            }\n            commonlength = getCommonSuffix(textInsert, textDelete);\n            if (commonlength !== 0) {\n              diffs[pointer][1] = textInsert.substring(textInsert.length - commonlength) + diffs[pointer][1];\n              textInsert = textInsert.substring(0, textInsert.length - commonlength);\n              textDelete = textDelete.substring(0, textDelete.length - commonlength);\n            }\n          }\n          pointer -= countDelete + countInsert;\n          diffs.splice(pointer, countDelete + countInsert);\n          if (textDelete.length) {\n            diffs.splice(pointer, 0, [DIFF_DELETE, textDelete]);\n            pointer++;\n          }\n          if (textInsert.length) {\n            diffs.splice(pointer, 0, [DIFF_INSERT, textInsert]);\n            pointer++;\n          }\n          pointer++;\n        } else if (pointer !== 0 && diffs[pointer - 1][0] === DIFF_EQUAL) {\n          diffs[pointer - 1][1] += diffs[pointer][1];\n          diffs.splice(pointer, 1);\n        } else {\n          pointer++;\n        }\n        countInsert = 0;\n        countDelete = 0;\n        textDelete = \"\";\n        textInsert = \"\";\n        break;\n      default:\n        throw new Error(\"Unknown diff operation\");\n    }\n  }\n  if (diffs[diffs.length - 1][1] === \"\") {\n    diffs.pop();\n  }\n  let hasChanges = false;\n  pointer = 1;\n  while (pointer < diffs.length - 1) {\n    if (diffs[pointer - 1][0] === DIFF_EQUAL && diffs[pointer + 1][0] === DIFF_EQUAL) {\n      if (diffs[pointer][1].substring(diffs[pointer][1].length - diffs[pointer - 1][1].length) === diffs[pointer - 1][1]) {\n        diffs[pointer][1] = diffs[pointer - 1][1] + diffs[pointer][1].substring(0, diffs[pointer][1].length - diffs[pointer - 1][1].length);\n        diffs[pointer + 1][1] = diffs[pointer - 1][1] + diffs[pointer + 1][1];\n        diffs.splice(pointer - 1, 1);\n        hasChanges = true;\n      } else if (diffs[pointer][1].substring(0, diffs[pointer + 1][1].length) === diffs[pointer + 1][1]) {\n        diffs[pointer - 1][1] += diffs[pointer + 1][1];\n        diffs[pointer][1] = diffs[pointer][1].substring(diffs[pointer + 1][1].length) + diffs[pointer + 1][1];\n        diffs.splice(pointer + 1, 1);\n        hasChanges = true;\n      }\n    }\n    pointer++;\n  }\n  if (hasChanges) {\n    diffs = cleanupMerge(diffs);\n  }\n  return diffs;\n}\nfunction trueCount() {\n  for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n    args[_key] = arguments[_key];\n  }\n  return args.reduce((n, bool) => n + (bool ? 1 : 0), 0);\n}\nfunction cleanupEfficiency(rawDiffs) {\n  let editCost = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 4;\n  let diffs = rawDiffs.map(diff => cloneDiff(diff));\n  let hasChanges = false;\n  const equalities = [];\n  let equalitiesLength = 0;\n  let lastEquality = null;\n  let pointer = 0;\n  let preIns = false;\n  let preDel = false;\n  let postIns = false;\n  let postDel = false;\n  while (pointer < diffs.length) {\n    if (diffs[pointer][0] === DIFF_EQUAL) {\n      if (diffs[pointer][1].length < editCost && (postIns || postDel)) {\n        equalities[equalitiesLength++] = pointer;\n        preIns = postIns;\n        preDel = postDel;\n        lastEquality = diffs[pointer][1];\n      } else {\n        equalitiesLength = 0;\n        lastEquality = null;\n      }\n      postIns = false;\n      postDel = false;\n    } else {\n      if (diffs[pointer][0] === DIFF_DELETE) {\n        postDel = true;\n      } else {\n        postIns = true;\n      }\n      if (lastEquality && (preIns && preDel && postIns && postDel || lastEquality.length < editCost / 2 && trueCount(preIns, preDel, postIns, postDel) === 3)) {\n        diffs.splice(equalities[equalitiesLength - 1], 0, [DIFF_DELETE, lastEquality]);\n        diffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT;\n        equalitiesLength--;\n        lastEquality = null;\n        if (preIns && preDel) {\n          postIns = true;\n          postDel = true;\n          equalitiesLength = 0;\n        } else {\n          equalitiesLength--;\n          pointer = equalitiesLength > 0 ? equalities[equalitiesLength - 1] : -1;\n          postIns = false;\n          postDel = false;\n        }\n        hasChanges = true;\n      }\n    }\n    pointer++;\n  }\n  if (hasChanges) {\n    diffs = cleanupMerge(diffs);\n  }\n  return diffs;\n}\nfunction bisect(text1, text2, deadline) {\n  const text1Length = text1.length;\n  const text2Length = text2.length;\n  const maxD = Math.ceil((text1Length + text2Length) / 2);\n  const vOffset = maxD;\n  const vLength = 2 * maxD;\n  const v1 = new Array(vLength);\n  const v2 = new Array(vLength);\n  for (let x = 0; x < vLength; x++) {\n    v1[x] = -1;\n    v2[x] = -1;\n  }\n  v1[vOffset + 1] = 0;\n  v2[vOffset + 1] = 0;\n  const delta = text1Length - text2Length;\n  const front = delta % 2 !== 0;\n  let k1start = 0;\n  let k1end = 0;\n  let k2start = 0;\n  let k2end = 0;\n  for (let d = 0; d < maxD; d++) {\n    if (Date.now() > deadline) {\n      break;\n    }\n    for (let k1 = -d + k1start; k1 <= d - k1end; k1 += 2) {\n      const k1Offset = vOffset + k1;\n      let x1;\n      if (k1 === -d || k1 !== d && v1[k1Offset - 1] < v1[k1Offset + 1]) {\n        x1 = v1[k1Offset + 1];\n      } else {\n        x1 = v1[k1Offset - 1] + 1;\n      }\n      let y1 = x1 - k1;\n      while (x1 < text1Length && y1 < text2Length && text1.charAt(x1) === text2.charAt(y1)) {\n        x1++;\n        y1++;\n      }\n      v1[k1Offset] = x1;\n      if (x1 > text1Length) {\n        k1end += 2;\n      } else if (y1 > text2Length) {\n        k1start += 2;\n      } else if (front) {\n        const k2Offset = vOffset + delta - k1;\n        if (k2Offset >= 0 && k2Offset < vLength && v2[k2Offset] !== -1) {\n          const x2 = text1Length - v2[k2Offset];\n          if (x1 >= x2) {\n            return bisectSplit(text1, text2, x1, y1, deadline);\n          }\n        }\n      }\n    }\n    for (let k2 = -d + k2start; k2 <= d - k2end; k2 += 2) {\n      const k2Offset = vOffset + k2;\n      let x2;\n      if (k2 === -d || k2 !== d && v2[k2Offset - 1] < v2[k2Offset + 1]) {\n        x2 = v2[k2Offset + 1];\n      } else {\n        x2 = v2[k2Offset - 1] + 1;\n      }\n      let y2 = x2 - k2;\n      while (x2 < text1Length && y2 < text2Length && text1.charAt(text1Length - x2 - 1) === text2.charAt(text2Length - y2 - 1)) {\n        x2++;\n        y2++;\n      }\n      v2[k2Offset] = x2;\n      if (x2 > text1Length) {\n        k2end += 2;\n      } else if (y2 > text2Length) {\n        k2start += 2;\n      } else if (!front) {\n        const k1Offset = vOffset + delta - k2;\n        if (k1Offset >= 0 && k1Offset < vLength && v1[k1Offset] !== -1) {\n          const x1 = v1[k1Offset];\n          const y1 = vOffset + x1 - k1Offset;\n          x2 = text1Length - x2;\n          if (x1 >= x2) {\n            return bisectSplit(text1, text2, x1, y1, deadline);\n          }\n        }\n      }\n    }\n  }\n  return [[DIFF_DELETE, text1], [DIFF_INSERT, text2]];\n}\nfunction bisectSplit(text1, text2, x, y, deadline) {\n  const text1a = text1.substring(0, x);\n  const text2a = text2.substring(0, y);\n  const text1b = text1.substring(x);\n  const text2b = text2.substring(y);\n  const diffs = doDiff(text1a, text2a, {\n    checkLines: false,\n    deadline\n  });\n  const diffsb = doDiff(text1b, text2b, {\n    checkLines: false,\n    deadline\n  });\n  return diffs.concat(diffsb);\n}\nfunction findHalfMatch(text1, text2) {\n  let timeout = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;\n  if (timeout <= 0) {\n    return null;\n  }\n  const longText = text1.length > text2.length ? text1 : text2;\n  const shortText = text1.length > text2.length ? text2 : text1;\n  if (longText.length < 4 || shortText.length * 2 < longText.length) {\n    return null;\n  }\n  const halfMatch1 = halfMatchI(longText, shortText, Math.ceil(longText.length / 4));\n  const halfMatch2 = halfMatchI(longText, shortText, Math.ceil(longText.length / 2));\n  let halfMatch;\n  if (halfMatch1 && halfMatch2) {\n    halfMatch = halfMatch1[4].length > halfMatch2[4].length ? halfMatch1 : halfMatch2;\n  } else if (!halfMatch1 && !halfMatch2) {\n    return null;\n  } else if (!halfMatch2) {\n    halfMatch = halfMatch1;\n  } else if (!halfMatch1) {\n    halfMatch = halfMatch2;\n  }\n  if (!halfMatch) {\n    throw new Error(\"Unable to find a half match.\");\n  }\n  let text1A;\n  let text1B;\n  let text2A;\n  let text2B;\n  if (text1.length > text2.length) {\n    text1A = halfMatch[0];\n    text1B = halfMatch[1];\n    text2A = halfMatch[2];\n    text2B = halfMatch[3];\n  } else {\n    text2A = halfMatch[0];\n    text2B = halfMatch[1];\n    text1A = halfMatch[2];\n    text1B = halfMatch[3];\n  }\n  const midCommon = halfMatch[4];\n  return [text1A, text1B, text2A, text2B, midCommon];\n}\nfunction halfMatchI(longText, shortText, i) {\n  const seed = longText.slice(i, i + Math.floor(longText.length / 4));\n  let j = -1;\n  let bestCommon = \"\";\n  let bestLongTextA;\n  let bestLongTextB;\n  let bestShortTextA;\n  let bestShortTextB;\n  while ((j = shortText.indexOf(seed, j + 1)) !== -1) {\n    const prefixLength = getCommonPrefix(longText.slice(i), shortText.slice(j));\n    const suffixLength = getCommonSuffix(longText.slice(0, i), shortText.slice(0, j));\n    if (bestCommon.length < suffixLength + prefixLength) {\n      bestCommon = shortText.slice(j - suffixLength, j) + shortText.slice(j, j + prefixLength);\n      bestLongTextA = longText.slice(0, i - suffixLength);\n      bestLongTextB = longText.slice(i + prefixLength);\n      bestShortTextA = shortText.slice(0, j - suffixLength);\n      bestShortTextB = shortText.slice(j + prefixLength);\n    }\n  }\n  if (bestCommon.length * 2 >= longText.length) {\n    return [bestLongTextA || \"\", bestLongTextB || \"\", bestShortTextA || \"\", bestShortTextB || \"\", bestCommon || \"\"];\n  }\n  return null;\n}\nfunction charsToLines(diffs, lineArray) {\n  for (let x = 0; x < diffs.length; x++) {\n    const chars = diffs[x][1];\n    const text = [];\n    for (let y = 0; y < chars.length; y++) {\n      text[y] = lineArray[chars.charCodeAt(y)];\n    }\n    diffs[x][1] = text.join(\"\");\n  }\n}\nfunction linesToChars(textA, textB) {\n  const lineArray = [];\n  const lineHash = {};\n  lineArray[0] = \"\";\n  function diffLinesToMunge(text) {\n    let chars = \"\";\n    let lineStart = 0;\n    let lineEnd = -1;\n    let lineArrayLength = lineArray.length;\n    while (lineEnd < text.length - 1) {\n      lineEnd = text.indexOf(\"\\n\", lineStart);\n      if (lineEnd === -1) {\n        lineEnd = text.length - 1;\n      }\n      let line = text.slice(lineStart, lineEnd + 1);\n      if (lineHash.hasOwnProperty ? lineHash.hasOwnProperty(line) : lineHash[line] !== void 0) {\n        chars += String.fromCharCode(lineHash[line]);\n      } else {\n        if (lineArrayLength === maxLines) {\n          line = text.slice(lineStart);\n          lineEnd = text.length;\n        }\n        chars += String.fromCharCode(lineArrayLength);\n        lineHash[line] = lineArrayLength;\n        lineArray[lineArrayLength++] = line;\n      }\n      lineStart = lineEnd + 1;\n    }\n    return chars;\n  }\n  let maxLines = 4e4;\n  const chars1 = diffLinesToMunge(textA);\n  maxLines = 65535;\n  const chars2 = diffLinesToMunge(textB);\n  return {\n    chars1,\n    chars2,\n    lineArray\n  };\n}\nfunction doLineModeDiff(textA, textB, opts) {\n  let text1 = textA;\n  let text2 = textB;\n  const a = linesToChars(text1, text2);\n  text1 = a.chars1;\n  text2 = a.chars2;\n  const linearray = a.lineArray;\n  let diffs = doDiff(text1, text2, {\n    checkLines: false,\n    deadline: opts.deadline\n  });\n  charsToLines(diffs, linearray);\n  diffs = cleanupSemantic(diffs);\n  diffs.push([DIFF_EQUAL, \"\"]);\n  let pointer = 0;\n  let countDelete = 0;\n  let countInsert = 0;\n  let textDelete = \"\";\n  let textInsert = \"\";\n  while (pointer < diffs.length) {\n    switch (diffs[pointer][0]) {\n      case DIFF_INSERT:\n        countInsert++;\n        textInsert += diffs[pointer][1];\n        break;\n      case DIFF_DELETE:\n        countDelete++;\n        textDelete += diffs[pointer][1];\n        break;\n      case DIFF_EQUAL:\n        if (countDelete >= 1 && countInsert >= 1) {\n          diffs.splice(pointer - countDelete - countInsert, countDelete + countInsert);\n          pointer = pointer - countDelete - countInsert;\n          const aa = doDiff(textDelete, textInsert, {\n            checkLines: false,\n            deadline: opts.deadline\n          });\n          for (let j = aa.length - 1; j >= 0; j--) {\n            diffs.splice(pointer, 0, aa[j]);\n          }\n          pointer += aa.length;\n        }\n        countInsert = 0;\n        countDelete = 0;\n        textDelete = \"\";\n        textInsert = \"\";\n        break;\n      default:\n        throw new Error(\"Unknown diff operation.\");\n    }\n    pointer++;\n  }\n  diffs.pop();\n  return diffs;\n}\nfunction computeDiff(text1, text2, opts) {\n  let diffs;\n  if (!text1) {\n    return [[DIFF_INSERT, text2]];\n  }\n  if (!text2) {\n    return [[DIFF_DELETE, text1]];\n  }\n  const longtext = text1.length > text2.length ? text1 : text2;\n  const shorttext = text1.length > text2.length ? text2 : text1;\n  const i = longtext.indexOf(shorttext);\n  if (i !== -1) {\n    diffs = [[DIFF_INSERT, longtext.substring(0, i)], [DIFF_EQUAL, shorttext], [DIFF_INSERT, longtext.substring(i + shorttext.length)]];\n    if (text1.length > text2.length) {\n      diffs[0][0] = DIFF_DELETE;\n      diffs[2][0] = DIFF_DELETE;\n    }\n    return diffs;\n  }\n  if (shorttext.length === 1) {\n    return [[DIFF_DELETE, text1], [DIFF_INSERT, text2]];\n  }\n  const halfMatch = findHalfMatch(text1, text2);\n  if (halfMatch) {\n    const text1A = halfMatch[0];\n    const text1B = halfMatch[1];\n    const text2A = halfMatch[2];\n    const text2B = halfMatch[3];\n    const midCommon = halfMatch[4];\n    const diffsA = doDiff(text1A, text2A, opts);\n    const diffsB = doDiff(text1B, text2B, opts);\n    return diffsA.concat([[DIFF_EQUAL, midCommon]], diffsB);\n  }\n  if (opts.checkLines && text1.length > 100 && text2.length > 100) {\n    return doLineModeDiff(text1, text2, opts);\n  }\n  return bisect(text1, text2, opts.deadline);\n}\nconst DIFF_DELETE = -1;\nconst DIFF_INSERT = 1;\nconst DIFF_EQUAL = 0;\nfunction diff(textA, textB, opts) {\n  if (textA === null || textB === null) {\n    throw new Error(\"Null input. (diff)\");\n  }\n  const diffs = doDiff(textA, textB, createInternalOpts(opts || {}));\n  adjustDiffForSurrogatePairs(diffs);\n  return diffs;\n}\nfunction doDiff(textA, textB, options) {\n  let text1 = textA;\n  let text2 = textB;\n  if (text1 === text2) {\n    return text1 ? [[DIFF_EQUAL, text1]] : [];\n  }\n  let commonlength = getCommonPrefix(text1, text2);\n  const commonprefix = text1.substring(0, commonlength);\n  text1 = text1.substring(commonlength);\n  text2 = text2.substring(commonlength);\n  commonlength = getCommonSuffix(text1, text2);\n  const commonsuffix = text1.substring(text1.length - commonlength);\n  text1 = text1.substring(0, text1.length - commonlength);\n  text2 = text2.substring(0, text2.length - commonlength);\n  let diffs = computeDiff(text1, text2, options);\n  if (commonprefix) {\n    diffs.unshift([DIFF_EQUAL, commonprefix]);\n  }\n  if (commonsuffix) {\n    diffs.push([DIFF_EQUAL, commonsuffix]);\n  }\n  diffs = cleanupMerge(diffs);\n  return diffs;\n}\nfunction createDeadLine(timeout) {\n  let t = 1;\n  if (typeof timeout !== \"undefined\") {\n    t = timeout <= 0 ? Number.MAX_VALUE : timeout;\n  }\n  return Date.now() + t * 1e3;\n}\nfunction createInternalOpts(opts) {\n  return {\n    checkLines: true,\n    deadline: createDeadLine(opts.timeout || 1),\n    ...opts\n  };\n}\nfunction combineChar(data, char, dir) {\n  return dir === 1 ? data + char : char + data;\n}\nfunction splitChar(data, dir) {\n  return dir === 1 ? [data.substring(0, data.length - 1), data[data.length - 1]] : [data.substring(1), data[0]];\n}\nfunction hasSharedChar(diffs, i, j, dir) {\n  return dir === 1 ? diffs[i][1][diffs[i][1].length - 1] === diffs[j][1][diffs[j][1].length - 1] : diffs[i][1][0] === diffs[j][1][0];\n}\nfunction deisolateChar(diffs, i, dir) {\n  const inv = dir === 1 ? -1 : 1;\n  let insertIdx = null;\n  let deleteIdx = null;\n  let j = i + dir;\n  for (; j >= 0 && j < diffs.length && (insertIdx === null || deleteIdx === null); j += dir) {\n    const [op, text2] = diffs[j];\n    if (text2.length === 0) {\n      continue;\n    }\n    if (op === DIFF_INSERT) {\n      if (insertIdx === null) {\n        insertIdx = j;\n      }\n      continue;\n    } else if (op === DIFF_DELETE) {\n      if (deleteIdx === null) {\n        deleteIdx = j;\n      }\n      continue;\n    } else if (op === DIFF_EQUAL) {\n      if (insertIdx === null && deleteIdx === null) {\n        const [rest, char2] = splitChar(diffs[i][1], dir);\n        diffs[i][1] = rest;\n        diffs[j][1] = combineChar(diffs[j][1], char2, inv);\n        return;\n      }\n      break;\n    }\n  }\n  if (insertIdx !== null && deleteIdx !== null && hasSharedChar(diffs, insertIdx, deleteIdx, dir)) {\n    const [insertText, insertChar] = splitChar(diffs[insertIdx][1], inv);\n    const [deleteText] = splitChar(diffs[deleteIdx][1], inv);\n    diffs[insertIdx][1] = insertText;\n    diffs[deleteIdx][1] = deleteText;\n    diffs[i][1] = combineChar(diffs[i][1], insertChar, dir);\n    return;\n  }\n  const [text, char] = splitChar(diffs[i][1], dir);\n  diffs[i][1] = text;\n  if (insertIdx === null) {\n    diffs.splice(j, 0, [DIFF_INSERT, char]);\n    if (deleteIdx !== null && deleteIdx >= j) deleteIdx++;\n  } else {\n    diffs[insertIdx][1] = combineChar(diffs[insertIdx][1], char, inv);\n  }\n  if (deleteIdx === null) {\n    diffs.splice(j, 0, [DIFF_DELETE, char]);\n  } else {\n    diffs[deleteIdx][1] = combineChar(diffs[deleteIdx][1], char, inv);\n  }\n}\nfunction adjustDiffForSurrogatePairs(diffs) {\n  for (let i = 0; i < diffs.length; i++) {\n    const [diffType, diffText] = diffs[i];\n    if (diffText.length === 0) continue;\n    const firstChar = diffText[0];\n    const lastChar = diffText[diffText.length - 1];\n    if (isHighSurrogate(lastChar) && diffType === DIFF_EQUAL) {\n      deisolateChar(diffs, i, 1);\n    }\n    if (isLowSurrogate(firstChar) && diffType === DIFF_EQUAL) {\n      deisolateChar(diffs, i, -1);\n    }\n  }\n  for (let i = 0; i < diffs.length; i++) {\n    if (diffs[i][1].length === 0) {\n      diffs.splice(i, 1);\n    }\n  }\n}\nconst DEFAULT_OPTIONS = {\n  /**\n   * At what point is no match declared (0.0 = perfection, 1.0 = very loose).\n   */\n  threshold: 0.5,\n  /**\n   * How far to search for a match (0 = exact location, 1000+ = broad match).\n   * A match this many characters away from the expected location will add\n   * 1.0 to the score (0.0 is a perfect match).\n   */\n  distance: 1e3\n};\nfunction applyDefaults(options) {\n  return {\n    ...DEFAULT_OPTIONS,\n    ...options\n  };\n}\nconst MAX_BITS$1 = 32;\nfunction bitap(text, pattern, loc) {\n  let opts = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n  if (pattern.length > MAX_BITS$1) {\n    throw new Error(\"Pattern too long for this browser.\");\n  }\n  const options = applyDefaults(opts);\n  const s = getAlphabetFromPattern(pattern);\n  function getBitapScore(e, x) {\n    const accuracy = e / pattern.length;\n    const proximity = Math.abs(loc - x);\n    if (!options.distance) {\n      return proximity ? 1 : accuracy;\n    }\n    return accuracy + proximity / options.distance;\n  }\n  let scoreThreshold = options.threshold;\n  let bestLoc = text.indexOf(pattern, loc);\n  if (bestLoc !== -1) {\n    scoreThreshold = Math.min(getBitapScore(0, bestLoc), scoreThreshold);\n    bestLoc = text.lastIndexOf(pattern, loc + pattern.length);\n    if (bestLoc !== -1) {\n      scoreThreshold = Math.min(getBitapScore(0, bestLoc), scoreThreshold);\n    }\n  }\n  const matchmask = 1 << pattern.length - 1;\n  bestLoc = -1;\n  let binMin;\n  let binMid;\n  let binMax = pattern.length + text.length;\n  let lastRd = [];\n  for (let d = 0; d < pattern.length; d++) {\n    binMin = 0;\n    binMid = binMax;\n    while (binMin < binMid) {\n      if (getBitapScore(d, loc + binMid) <= scoreThreshold) {\n        binMin = binMid;\n      } else {\n        binMax = binMid;\n      }\n      binMid = Math.floor((binMax - binMin) / 2 + binMin);\n    }\n    binMax = binMid;\n    let start = Math.max(1, loc - binMid + 1);\n    const finish = Math.min(loc + binMid, text.length) + pattern.length;\n    const rd = new Array(finish + 2);\n    rd[finish + 1] = (1 << d) - 1;\n    for (let j = finish; j >= start; j--) {\n      const charMatch = s[text.charAt(j - 1)];\n      if (d === 0) {\n        rd[j] = (rd[j + 1] << 1 | 1) & charMatch;\n      } else {\n        rd[j] = (rd[j + 1] << 1 | 1) & charMatch | ((lastRd[j + 1] | lastRd[j]) << 1 | 1) | lastRd[j + 1];\n      }\n      if (rd[j] & matchmask) {\n        const score = getBitapScore(d, j - 1);\n        if (score <= scoreThreshold) {\n          scoreThreshold = score;\n          bestLoc = j - 1;\n          if (bestLoc > loc) {\n            start = Math.max(1, 2 * loc - bestLoc);\n          } else {\n            break;\n          }\n        }\n      }\n    }\n    if (getBitapScore(d + 1, loc) > scoreThreshold) {\n      break;\n    }\n    lastRd = rd;\n  }\n  return bestLoc;\n}\nfunction getAlphabetFromPattern(pattern) {\n  const s = {};\n  for (let i = 0; i < pattern.length; i++) {\n    s[pattern.charAt(i)] = 0;\n  }\n  for (let i = 0; i < pattern.length; i++) {\n    s[pattern.charAt(i)] |= 1 << pattern.length - i - 1;\n  }\n  return s;\n}\nfunction match(text, pattern, searchLocation) {\n  if (text === null || pattern === null || searchLocation === null) {\n    throw new Error(\"Null input. (match())\");\n  }\n  const loc = Math.max(0, Math.min(searchLocation, text.length));\n  if (text === pattern) {\n    return 0;\n  } else if (!text.length) {\n    return -1;\n  } else if (text.substring(loc, loc + pattern.length) === pattern) {\n    return loc;\n  }\n  return bitap(text, pattern, loc);\n}\nfunction createPatchObject(start1, start2) {\n  return {\n    diffs: [],\n    start1,\n    start2,\n    utf8Start1: start1,\n    utf8Start2: start2,\n    length1: 0,\n    length2: 0,\n    utf8Length1: 0,\n    utf8Length2: 0\n  };\n}\nfunction diffText1(diffs) {\n  const text = [];\n  for (let x = 0; x < diffs.length; x++) {\n    if (diffs[x][0] !== DIFF_INSERT) {\n      text[x] = diffs[x][1];\n    }\n  }\n  return text.join(\"\");\n}\nfunction diffText2(diffs) {\n  const text = [];\n  for (let x = 0; x < diffs.length; x++) {\n    if (diffs[x][0] !== DIFF_DELETE) {\n      text[x] = diffs[x][1];\n    }\n  }\n  return text.join(\"\");\n}\nfunction countUtf8Bytes(str) {\n  let bytes = 0;\n  for (let i = 0; i < str.length; i++) {\n    const codePoint = str.codePointAt(i);\n    if (typeof codePoint === \"undefined\") {\n      throw new Error(\"Failed to get codepoint\");\n    }\n    bytes += utf8len(codePoint);\n  }\n  return bytes;\n}\nfunction adjustIndiciesToUcs2(patches, base) {\n  let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n  let byteOffset = 0;\n  let idx = 0;\n  function advanceTo(target) {\n    for (; byteOffset < target;) {\n      const codePoint = base.codePointAt(idx);\n      if (typeof codePoint === \"undefined\") {\n        return idx;\n      }\n      byteOffset += utf8len(codePoint);\n      if (codePoint > 65535) {\n        idx += 2;\n      } else {\n        idx += 1;\n      }\n    }\n    if (!options.allowExceedingIndices && byteOffset !== target) {\n      throw new Error(\"Failed to determine byte offset\");\n    }\n    return idx;\n  }\n  const adjusted = [];\n  for (const patch of patches) {\n    adjusted.push({\n      diffs: patch.diffs.map(diff => cloneDiff(diff)),\n      start1: advanceTo(patch.start1),\n      start2: advanceTo(patch.start2),\n      utf8Start1: patch.utf8Start1,\n      utf8Start2: patch.utf8Start2,\n      length1: patch.length1,\n      length2: patch.length2,\n      utf8Length1: patch.utf8Length1,\n      utf8Length2: patch.utf8Length2\n    });\n  }\n  return adjusted;\n}\nfunction utf8len(codePoint) {\n  if (codePoint <= 127) return 1;\n  if (codePoint <= 2047) return 2;\n  if (codePoint <= 65535) return 3;\n  return 4;\n}\nconst MAX_BITS = 32;\nconst DEFAULT_MARGIN = 4;\nconst DEFAULT_OPTS = {\n  margin: 4\n};\nfunction getDefaultOpts() {\n  let opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n  return {\n    ...DEFAULT_OPTS,\n    ...opts\n  };\n}\nfunction make(a, b, options) {\n  if (typeof a === \"string\" && typeof b === \"string\") {\n    let diffs = diff(a, b, {\n      checkLines: true\n    });\n    if (diffs.length > 2) {\n      diffs = cleanupSemantic(diffs);\n      diffs = cleanupEfficiency(diffs);\n    }\n    return _make(a, diffs, getDefaultOpts(options));\n  }\n  if (a && Array.isArray(a) && typeof b === \"undefined\") {\n    return _make(diffText1(a), a, getDefaultOpts(options));\n  }\n  if (typeof a === \"string\" && b && Array.isArray(b)) {\n    return _make(a, b, getDefaultOpts(options));\n  }\n  throw new Error(\"Unknown call format to make()\");\n}\nfunction _make(textA, diffs, options) {\n  if (diffs.length === 0) {\n    return [];\n  }\n  const patches = [];\n  let patch = createPatchObject(0, 0);\n  let patchDiffLength = 0;\n  let charCount1 = 0;\n  let charCount2 = 0;\n  let utf8Count1 = 0;\n  let utf8Count2 = 0;\n  let prepatchText = textA;\n  let postpatchText = textA;\n  for (let x = 0; x < diffs.length; x++) {\n    const currentDiff = diffs[x];\n    const [diffType, diffText] = currentDiff;\n    const diffTextLength = diffText.length;\n    const diffByteLength = countUtf8Bytes(diffText);\n    if (!patchDiffLength && diffType !== DIFF_EQUAL) {\n      patch.start1 = charCount1;\n      patch.start2 = charCount2;\n      patch.utf8Start1 = utf8Count1;\n      patch.utf8Start2 = utf8Count2;\n    }\n    switch (diffType) {\n      case DIFF_INSERT:\n        patch.diffs[patchDiffLength++] = currentDiff;\n        patch.length2 += diffTextLength;\n        patch.utf8Length2 += diffByteLength;\n        postpatchText = postpatchText.substring(0, charCount2) + diffText + postpatchText.substring(charCount2);\n        break;\n      case DIFF_DELETE:\n        patch.length1 += diffTextLength;\n        patch.utf8Length1 += diffByteLength;\n        patch.diffs[patchDiffLength++] = currentDiff;\n        postpatchText = postpatchText.substring(0, charCount2) + postpatchText.substring(charCount2 + diffTextLength);\n        break;\n      case DIFF_EQUAL:\n        if (diffTextLength <= 2 * options.margin && patchDiffLength && diffs.length !== x + 1) {\n          patch.diffs[patchDiffLength++] = currentDiff;\n          patch.length1 += diffTextLength;\n          patch.length2 += diffTextLength;\n          patch.utf8Length1 += diffByteLength;\n          patch.utf8Length2 += diffByteLength;\n        } else if (diffTextLength >= 2 * options.margin) {\n          if (patchDiffLength) {\n            addContext(patch, prepatchText, options);\n            patches.push(patch);\n            patch = createPatchObject(-1, -1);\n            patchDiffLength = 0;\n            prepatchText = postpatchText;\n            charCount1 = charCount2;\n            utf8Count1 = utf8Count2;\n          }\n        }\n        break;\n      default:\n        throw new Error(\"Unknown diff type\");\n    }\n    if (diffType !== DIFF_INSERT) {\n      charCount1 += diffTextLength;\n      utf8Count1 += diffByteLength;\n    }\n    if (diffType !== DIFF_DELETE) {\n      charCount2 += diffTextLength;\n      utf8Count2 += diffByteLength;\n    }\n  }\n  if (patchDiffLength) {\n    addContext(patch, prepatchText, options);\n    patches.push(patch);\n  }\n  return patches;\n}\nfunction addContext(patch, text, opts) {\n  if (text.length === 0) {\n    return;\n  }\n  let pattern = text.substring(patch.start2, patch.start2 + patch.length1);\n  let padding = 0;\n  while (text.indexOf(pattern) !== text.lastIndexOf(pattern) && pattern.length < MAX_BITS - opts.margin - opts.margin) {\n    padding += opts.margin;\n    pattern = text.substring(patch.start2 - padding, patch.start2 + patch.length1 + padding);\n  }\n  padding += opts.margin;\n  let prefixStart = patch.start2 - padding;\n  if (prefixStart >= 1 && isLowSurrogate(text[prefixStart])) {\n    prefixStart--;\n  }\n  const prefix = text.substring(prefixStart, patch.start2);\n  if (prefix) {\n    patch.diffs.unshift([DIFF_EQUAL, prefix]);\n  }\n  const prefixLength = prefix.length;\n  const prefixUtf8Length = countUtf8Bytes(prefix);\n  let suffixEnd = patch.start2 + patch.length1 + padding;\n  if (suffixEnd < text.length && isLowSurrogate(text[suffixEnd])) {\n    suffixEnd++;\n  }\n  const suffix = text.substring(patch.start2 + patch.length1, suffixEnd);\n  if (suffix) {\n    patch.diffs.push([DIFF_EQUAL, suffix]);\n  }\n  const suffixLength = suffix.length;\n  const suffixUtf8Length = countUtf8Bytes(suffix);\n  patch.start1 -= prefixLength;\n  patch.start2 -= prefixLength;\n  patch.utf8Start1 -= prefixUtf8Length;\n  patch.utf8Start2 -= prefixUtf8Length;\n  patch.length1 += prefixLength + suffixLength;\n  patch.length2 += prefixLength + suffixLength;\n  patch.utf8Length1 += prefixUtf8Length + suffixUtf8Length;\n  patch.utf8Length2 += prefixUtf8Length + suffixUtf8Length;\n}\nfunction levenshtein(diffs) {\n  let leven = 0;\n  let insertions = 0;\n  let deletions = 0;\n  for (let x = 0; x < diffs.length; x++) {\n    const op = diffs[x][0];\n    const data = diffs[x][1];\n    switch (op) {\n      case DIFF_INSERT:\n        insertions += data.length;\n        break;\n      case DIFF_DELETE:\n        deletions += data.length;\n        break;\n      case DIFF_EQUAL:\n        leven += Math.max(insertions, deletions);\n        insertions = 0;\n        deletions = 0;\n        break;\n      default:\n        throw new Error(\"Unknown diff operation.\");\n    }\n  }\n  leven += Math.max(insertions, deletions);\n  return leven;\n}\nfunction xIndex(diffs, loc) {\n  let chars1 = 0;\n  let chars2 = 0;\n  let lastChars1 = 0;\n  let lastChars2 = 0;\n  let x;\n  for (x = 0; x < diffs.length; x++) {\n    if (diffs[x][0] !== DIFF_INSERT) {\n      chars1 += diffs[x][1].length;\n    }\n    if (diffs[x][0] !== DIFF_DELETE) {\n      chars2 += diffs[x][1].length;\n    }\n    if (chars1 > loc) {\n      break;\n    }\n    lastChars1 = chars1;\n    lastChars2 = chars2;\n  }\n  if (diffs.length !== x && diffs[x][0] === DIFF_DELETE) {\n    return lastChars2;\n  }\n  return lastChars2 + (loc - lastChars1);\n}\nfunction addPadding(patches) {\n  let margin = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_MARGIN;\n  const paddingLength = margin;\n  let nullPadding = \"\";\n  for (let x = 1; x <= paddingLength; x++) {\n    nullPadding += String.fromCharCode(x);\n  }\n  for (const p of patches) {\n    p.start1 += paddingLength;\n    p.start2 += paddingLength;\n    p.utf8Start1 += paddingLength;\n    p.utf8Start2 += paddingLength;\n  }\n  let patch = patches[0];\n  let diffs = patch.diffs;\n  if (diffs.length === 0 || diffs[0][0] !== DIFF_EQUAL) {\n    diffs.unshift([DIFF_EQUAL, nullPadding]);\n    patch.start1 -= paddingLength;\n    patch.start2 -= paddingLength;\n    patch.utf8Start1 -= paddingLength;\n    patch.utf8Start2 -= paddingLength;\n    patch.length1 += paddingLength;\n    patch.length2 += paddingLength;\n    patch.utf8Length1 += paddingLength;\n    patch.utf8Length2 += paddingLength;\n  } else if (paddingLength > diffs[0][1].length) {\n    const firstDiffLength = diffs[0][1].length;\n    const extraLength = paddingLength - firstDiffLength;\n    diffs[0][1] = nullPadding.substring(firstDiffLength) + diffs[0][1];\n    patch.start1 -= extraLength;\n    patch.start2 -= extraLength;\n    patch.utf8Start1 -= extraLength;\n    patch.utf8Start2 -= extraLength;\n    patch.length1 += extraLength;\n    patch.length2 += extraLength;\n    patch.utf8Length1 += extraLength;\n    patch.utf8Length2 += extraLength;\n  }\n  patch = patches[patches.length - 1];\n  diffs = patch.diffs;\n  if (diffs.length === 0 || diffs[diffs.length - 1][0] !== DIFF_EQUAL) {\n    diffs.push([DIFF_EQUAL, nullPadding]);\n    patch.length1 += paddingLength;\n    patch.length2 += paddingLength;\n    patch.utf8Length1 += paddingLength;\n    patch.utf8Length2 += paddingLength;\n  } else if (paddingLength > diffs[diffs.length - 1][1].length) {\n    const extraLength = paddingLength - diffs[diffs.length - 1][1].length;\n    diffs[diffs.length - 1][1] += nullPadding.substring(0, extraLength);\n    patch.length1 += extraLength;\n    patch.length2 += extraLength;\n    patch.utf8Length1 += extraLength;\n    patch.utf8Length2 += extraLength;\n  }\n  return nullPadding;\n}\nfunction splitMax(patches) {\n  let margin = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_MARGIN;\n  const patchSize = MAX_BITS;\n  for (let x = 0; x < patches.length; x++) {\n    if (patches[x].length1 <= patchSize) {\n      continue;\n    }\n    const bigpatch = patches[x];\n    patches.splice(x--, 1);\n    let start1 = bigpatch.start1;\n    let start2 = bigpatch.start2;\n    let preContext = \"\";\n    while (bigpatch.diffs.length !== 0) {\n      const patch = createPatchObject(start1 - preContext.length, start2 - preContext.length);\n      let empty = true;\n      if (preContext !== \"\") {\n        const precontextByteCount = countUtf8Bytes(preContext);\n        patch.length1 = preContext.length;\n        patch.utf8Length1 = precontextByteCount;\n        patch.length2 = preContext.length;\n        patch.utf8Length2 = precontextByteCount;\n        patch.diffs.push([DIFF_EQUAL, preContext]);\n      }\n      while (bigpatch.diffs.length !== 0 && patch.length1 < patchSize - margin) {\n        const diffType = bigpatch.diffs[0][0];\n        let diffText = bigpatch.diffs[0][1];\n        let diffTextByteCount = countUtf8Bytes(diffText);\n        if (diffType === DIFF_INSERT) {\n          patch.length2 += diffText.length;\n          patch.utf8Length2 += diffTextByteCount;\n          start2 += diffText.length;\n          const diff = bigpatch.diffs.shift();\n          if (diff) {\n            patch.diffs.push(diff);\n          }\n          empty = false;\n        } else if (diffType === DIFF_DELETE && patch.diffs.length === 1 && patch.diffs[0][0] === DIFF_EQUAL && diffText.length > 2 * patchSize) {\n          patch.length1 += diffText.length;\n          patch.utf8Length1 += diffTextByteCount;\n          start1 += diffText.length;\n          empty = false;\n          patch.diffs.push([diffType, diffText]);\n          bigpatch.diffs.shift();\n        } else {\n          diffText = diffText.substring(0, patchSize - patch.length1 - margin);\n          diffTextByteCount = countUtf8Bytes(diffText);\n          patch.length1 += diffText.length;\n          patch.utf8Length1 += diffTextByteCount;\n          start1 += diffText.length;\n          if (diffType === DIFF_EQUAL) {\n            patch.length2 += diffText.length;\n            patch.utf8Length2 += diffTextByteCount;\n            start2 += diffText.length;\n          } else {\n            empty = false;\n          }\n          patch.diffs.push([diffType, diffText]);\n          if (diffText === bigpatch.diffs[0][1]) {\n            bigpatch.diffs.shift();\n          } else {\n            bigpatch.diffs[0][1] = bigpatch.diffs[0][1].substring(diffText.length);\n          }\n        }\n      }\n      preContext = diffText2(patch.diffs);\n      preContext = preContext.substring(preContext.length - margin);\n      const postContext = diffText1(bigpatch.diffs).substring(0, margin);\n      const postContextByteCount = countUtf8Bytes(postContext);\n      if (postContext !== \"\") {\n        patch.length1 += postContext.length;\n        patch.length2 += postContext.length;\n        patch.utf8Length1 += postContextByteCount;\n        patch.utf8Length2 += postContextByteCount;\n        if (patch.diffs.length !== 0 && patch.diffs[patch.diffs.length - 1][0] === DIFF_EQUAL) {\n          patch.diffs[patch.diffs.length - 1][1] += postContext;\n        } else {\n          patch.diffs.push([DIFF_EQUAL, postContext]);\n        }\n      }\n      if (!empty) {\n        patches.splice(++x, 0, patch);\n      }\n    }\n  }\n}\nfunction apply(patches, originalText) {\n  let opts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n  if (typeof patches === \"string\") {\n    throw new Error(\"Patches must be an array - pass the patch to `parsePatch()` first\");\n  }\n  let text = originalText;\n  if (patches.length === 0) {\n    return [text, []];\n  }\n  const parsed = adjustIndiciesToUcs2(patches, text, {\n    allowExceedingIndices: opts.allowExceedingIndices\n  });\n  const margin = opts.margin || DEFAULT_MARGIN;\n  const deleteThreshold = opts.deleteThreshold || 0.4;\n  const nullPadding = addPadding(parsed, margin);\n  text = nullPadding + text + nullPadding;\n  splitMax(parsed, margin);\n  let delta = 0;\n  const results = [];\n  for (let x = 0; x < parsed.length; x++) {\n    const expectedLoc = parsed[x].start2 + delta;\n    const text1 = diffText1(parsed[x].diffs);\n    let startLoc;\n    let endLoc = -1;\n    if (text1.length > MAX_BITS) {\n      startLoc = match(text, text1.substring(0, MAX_BITS), expectedLoc);\n      if (startLoc !== -1) {\n        endLoc = match(text, text1.substring(text1.length - MAX_BITS), expectedLoc + text1.length - MAX_BITS);\n        if (endLoc === -1 || startLoc >= endLoc) {\n          startLoc = -1;\n        }\n      }\n    } else {\n      startLoc = match(text, text1, expectedLoc);\n    }\n    if (startLoc === -1) {\n      results[x] = false;\n      delta -= parsed[x].length2 - parsed[x].length1;\n    } else {\n      results[x] = true;\n      delta = startLoc - expectedLoc;\n      let text2;\n      if (endLoc === -1) {\n        text2 = text.substring(startLoc, startLoc + text1.length);\n      } else {\n        text2 = text.substring(startLoc, endLoc + MAX_BITS);\n      }\n      if (text1 === text2) {\n        text = text.substring(0, startLoc) + diffText2(parsed[x].diffs) + text.substring(startLoc + text1.length);\n      } else {\n        let diffs = diff(text1, text2, {\n          checkLines: false\n        });\n        if (text1.length > MAX_BITS && levenshtein(diffs) / text1.length > deleteThreshold) {\n          results[x] = false;\n        } else {\n          diffs = cleanupSemanticLossless(diffs);\n          let index1 = 0;\n          let index2 = 0;\n          for (let y = 0; y < parsed[x].diffs.length; y++) {\n            const mod = parsed[x].diffs[y];\n            if (mod[0] !== DIFF_EQUAL) {\n              index2 = xIndex(diffs, index1);\n            }\n            if (mod[0] === DIFF_INSERT) {\n              text = text.substring(0, startLoc + index2) + mod[1] + text.substring(startLoc + index2);\n            } else if (mod[0] === DIFF_DELETE) {\n              text = text.substring(0, startLoc + index2) + text.substring(startLoc + xIndex(diffs, index1 + mod[1].length));\n            }\n            if (mod[0] !== DIFF_DELETE) {\n              index1 += mod[1].length;\n            }\n          }\n        }\n      }\n    }\n  }\n  text = text.substring(nullPadding.length, text.length - nullPadding.length);\n  return [text, results];\n}\nfunction stringify(patches) {\n  return patches.map(stringifyPatch).join(\"\");\n}\nfunction stringifyPatch(patch) {\n  const {\n    utf8Length1,\n    utf8Length2,\n    utf8Start1,\n    utf8Start2,\n    diffs\n  } = patch;\n  let coords1;\n  if (utf8Length1 === 0) {\n    coords1 = \"\".concat(utf8Start1, \",0\");\n  } else if (utf8Length1 === 1) {\n    coords1 = \"\".concat(utf8Start1 + 1);\n  } else {\n    coords1 = \"\".concat(utf8Start1 + 1, \",\").concat(utf8Length1);\n  }\n  let coords2;\n  if (utf8Length2 === 0) {\n    coords2 = \"\".concat(utf8Start2, \",0\");\n  } else if (utf8Length2 === 1) {\n    coords2 = \"\".concat(utf8Start2 + 1);\n  } else {\n    coords2 = \"\".concat(utf8Start2 + 1, \",\").concat(utf8Length2);\n  }\n  const text = [\"@@ -\".concat(coords1, \" +\").concat(coords2, \" @@\\n\")];\n  let op;\n  for (let x = 0; x < diffs.length; x++) {\n    switch (diffs[x][0]) {\n      case DIFF_INSERT:\n        op = \"+\";\n        break;\n      case DIFF_DELETE:\n        op = \"-\";\n        break;\n      case DIFF_EQUAL:\n        op = \" \";\n        break;\n      default:\n        throw new Error(\"Unknown patch operation.\");\n    }\n    text[x + 1] = \"\".concat(op + encodeURI(diffs[x][1]), \"\\n\");\n  }\n  return text.join(\"\").replace(/%20/g, \" \");\n}\nconst patchHeader = /^@@ -(\\d+),?(\\d*) \\+(\\d+),?(\\d*) @@$/;\nfunction parse(textline) {\n  if (!textline) {\n    return [];\n  }\n  const patches = [];\n  const lines = textline.split(\"\\n\");\n  let textPointer = 0;\n  while (textPointer < lines.length) {\n    const m = lines[textPointer].match(patchHeader);\n    if (!m) {\n      throw new Error(\"Invalid patch string: \".concat(lines[textPointer]));\n    }\n    const patch = createPatchObject(toInt(m[1]), toInt(m[3]));\n    patches.push(patch);\n    if (m[2] === \"\") {\n      patch.start1--;\n      patch.utf8Start1--;\n      patch.length1 = 1;\n      patch.utf8Length1 = 1;\n    } else if (m[2] === \"0\") {\n      patch.length1 = 0;\n      patch.utf8Length1 = 0;\n    } else {\n      patch.start1--;\n      patch.utf8Start1--;\n      patch.utf8Length1 = toInt(m[2]);\n      patch.length1 = patch.utf8Length1;\n    }\n    if (m[4] === \"\") {\n      patch.start2--;\n      patch.utf8Start2--;\n      patch.length2 = 1;\n      patch.utf8Length2 = 1;\n    } else if (m[4] === \"0\") {\n      patch.length2 = 0;\n      patch.utf8Length2 = 0;\n    } else {\n      patch.start2--;\n      patch.utf8Start2--;\n      patch.utf8Length2 = toInt(m[4]);\n      patch.length2 = patch.utf8Length2;\n    }\n    textPointer++;\n    while (textPointer < lines.length) {\n      const currentLine = lines[textPointer];\n      const sign = currentLine.charAt(0);\n      if (sign === \"@\") {\n        break;\n      }\n      if (sign === \"\") {\n        textPointer++;\n        continue;\n      }\n      let line;\n      try {\n        line = decodeURI(currentLine.slice(1));\n      } catch (ex) {\n        throw new Error(\"Illegal escape in parse: \".concat(currentLine));\n      }\n      const utf8Diff = countUtf8Bytes(line) - line.length;\n      if (sign === \"-\") {\n        patch.diffs.push([DIFF_DELETE, line]);\n        patch.length1 -= utf8Diff;\n      } else if (sign === \"+\") {\n        patch.diffs.push([DIFF_INSERT, line]);\n        patch.length2 -= utf8Diff;\n      } else if (sign === \" \") {\n        patch.diffs.push([DIFF_EQUAL, line]);\n        patch.length1 -= utf8Diff;\n        patch.length2 -= utf8Diff;\n      } else {\n        throw new Error(\"Invalid patch mode \\\"\".concat(sign, \"\\\" in: \").concat(line));\n      }\n      textPointer++;\n    }\n  }\n  return patches;\n}\nfunction toInt(num) {\n  return parseInt(num, 10);\n}\nexport { DIFF_DELETE, DIFF_EQUAL, DIFF_INSERT, adjustIndiciesToUcs2, apply as applyPatches, cleanupEfficiency, cleanupSemantic, diff as makeDiff, make as makePatches, match, parse as parsePatch, stringifyPatch, stringify as stringifyPatches };\n//# sourceMappingURL=index.js.map\n","import {makePatches, stringifyPatches} from '@sanity/diff-match-patch'\nimport {type Path, type PathSegment} from '@sanity/types'\n\nimport {\n  type DiffMatchPatch,\n  type InsertPatch,\n  type InsertPosition,\n  type SetIfMissingPatch,\n  type SetPatch,\n  type UnsetPatch,\n} from '../types/patch'\n\nexport function setIfMissing(value: any, path: Path = []): SetIfMissingPatch {\n  return {\n    type: 'setIfMissing',\n    path,\n    value,\n  }\n}\n\nexport function diffMatchPatch(\n  currentValue: string,\n  nextValue: string,\n  path: Path = [],\n): DiffMatchPatch {\n  const patches = makePatches(currentValue, nextValue)\n  const patch = stringifyPatches(patches)\n  return {type: 'diffMatchPatch', path, value: patch}\n}\n\nexport function insert(items: any[], position: InsertPosition, path: Path = []): InsertPatch {\n  return {\n    type: 'insert',\n    path,\n    position,\n    items,\n  }\n}\n\nexport function set(value: any, path: Path = []): SetPatch {\n  return {type: 'set', path, value}\n}\n\nexport function unset(path: Path = []): UnsetPatch {\n  return {type: 'unset', path}\n}\n\nexport function prefixPath<T extends {path: Path}>(patch: T, segment: PathSegment): T {\n  return {\n    ...patch,\n    path: [segment, ...patch.path],\n  }\n}\n","import {type Path, type PortableTextSpan, type PortableTextTextBlock} from '@sanity/types'\nimport {get, isUndefined, omitBy} from 'lodash'\nimport {\n  type Descendant,\n  type InsertNodeOperation,\n  type InsertTextOperation,\n  type MergeNodeOperation,\n  type MoveNodeOperation,\n  type RemoveNodeOperation,\n  type RemoveTextOperation,\n  type SetNodeOperation,\n  type SplitNodeOperation,\n  Text,\n} from 'slate'\n\nimport {type PatchFunctions} from '../editor/plugins/createWithPatches'\nimport {diffMatchPatch, insert, set, setIfMissing, unset} from '../patch/PatchEvent'\nimport {type PortableTextMemberSchemaTypes, type PortableTextSlateEditor} from '../types/editor'\nimport {type InsertPosition, type Patch} from '../types/patch'\nimport {debugWithName} from './debug'\nimport {fromSlateValue} from './values'\n\nconst debug = debugWithName('operationToPatches')\ndebug.enabled = false\n\nexport function createOperationToPatches(types: PortableTextMemberSchemaTypes): PatchFunctions {\n  const textBlockName = types.block.name\n  function insertTextPatch(\n    editor: PortableTextSlateEditor,\n    operation: InsertTextOperation,\n    beforeValue: Descendant[],\n  ) {\n    if (debug.enabled) {\n      debug('Operation', JSON.stringify(operation, null, 2))\n    }\n    const block =\n      editor.isTextBlock(editor.children[operation.path[0]]) && editor.children[operation.path[0]]\n    if (!block) {\n      throw new Error('Could not find block')\n    }\n    const textChild =\n      editor.isTextBlock(block) &&\n      editor.isTextSpan(block.children[operation.path[1]]) &&\n      (block.children[operation.path[1]] as PortableTextSpan)\n    if (!textChild) {\n      throw new Error('Could not find child')\n    }\n    const path: Path = [{_key: block._key}, 'children', {_key: textChild._key}, 'text']\n    const prevBlock = beforeValue[operation.path[0]]\n    const prevChild = editor.isTextBlock(prevBlock) && prevBlock.children[operation.path[1]]\n    const prevText = editor.isTextSpan(prevChild) ? prevChild.text : ''\n    const patch = diffMatchPatch(prevText, textChild.text, path)\n    return patch.value.length ? [patch] : []\n  }\n\n  function removeTextPatch(\n    editor: PortableTextSlateEditor,\n    operation: RemoveTextOperation,\n    beforeValue: Descendant[],\n  ) {\n    const block = editor && editor.children[operation.path[0]]\n    if (!block) {\n      throw new Error('Could not find block')\n    }\n    const child = (editor.isTextBlock(block) && block.children[operation.path[1]]) || undefined\n    const textChild: PortableTextSpan | undefined = editor.isTextSpan(child) ? child : undefined\n    if (child && !textChild) {\n      throw new Error('Expected span')\n    }\n    if (!textChild) {\n      throw new Error('Could not find child')\n    }\n    const path: Path = [{_key: block._key}, 'children', {_key: textChild._key}, 'text']\n    const beforeBlock = beforeValue[operation.path[0]]\n    const prevTextChild = editor.isTextBlock(beforeBlock) && beforeBlock.children[operation.path[1]]\n    const prevText = editor.isTextSpan(prevTextChild) && prevTextChild.text\n    const patch = diffMatchPatch(prevText || '', textChild.text, path)\n    return patch.value ? [patch] : []\n  }\n\n  function setNodePatch(editor: PortableTextSlateEditor, operation: SetNodeOperation) {\n    if (operation.path.length === 1) {\n      const block = editor.children[operation.path[0]]\n      if (typeof block._key !== 'string') {\n        throw new Error('Expected block to have a _key')\n      }\n      const setNode = omitBy(\n        {...editor.children[operation.path[0]], ...operation.newProperties},\n        isUndefined,\n      ) as unknown as Descendant\n      return [set(fromSlateValue([setNode], textBlockName)[0], [{_key: block._key}])]\n    } else if (operation.path.length === 2) {\n      const block = editor.children[operation.path[0]]\n      if (editor.isTextBlock(block)) {\n        const child = block.children[operation.path[1]]\n        if (child) {\n          const blockKey = block._key\n          const childKey = child._key\n          const patches: Patch[] = []\n          const keys = Object.keys(operation.newProperties)\n          keys.forEach((keyName) => {\n            // Special case for setting _key on a child. We have to target it by index and not the _key.\n            if (keys.length === 1 && keyName === '_key') {\n              const val = get(operation.newProperties, keyName)\n              patches.push(\n                set(val, [{_key: blockKey}, 'children', block.children.indexOf(child), keyName]),\n              )\n            } else {\n              const val = get(operation.newProperties, keyName)\n              patches.push(set(val, [{_key: blockKey}, 'children', {_key: childKey}, keyName]))\n            }\n          })\n          return patches\n        }\n        throw new Error('Could not find a valid child')\n      }\n      throw new Error('Could not find a valid block')\n    } else {\n      throw new Error(`Unexpected path encountered: ${JSON.stringify(operation.path)}`)\n    }\n  }\n\n  function insertNodePatch(\n    editor: PortableTextSlateEditor,\n    operation: InsertNodeOperation,\n    beforeValue: Descendant[],\n  ): Patch[] {\n    const block = beforeValue[operation.path[0]]\n    const isTextBlock = editor.isTextBlock(block)\n    if (operation.path.length === 1) {\n      const position = operation.path[0] === 0 ? 'before' : 'after'\n      const beforeBlock = beforeValue[operation.path[0] - 1]\n      const targetKey = operation.path[0] === 0 ? block?._key : beforeBlock?._key\n      if (targetKey) {\n        return [\n          insert([fromSlateValue([operation.node as Descendant], textBlockName)[0]], position, [\n            {_key: targetKey},\n          ]),\n        ]\n      }\n      return [\n        setIfMissing(beforeValue, []),\n        insert([fromSlateValue([operation.node as Descendant], textBlockName)[0]], 'before', [\n          operation.path[0],\n        ]),\n      ]\n    } else if (isTextBlock && operation.path.length === 2 && editor.children[operation.path[0]]) {\n      const position =\n        block.children.length === 0 || !block.children[operation.path[1] - 1] ? 'before' : 'after'\n      const node = {...operation.node} as Descendant\n      if (!node._type && Text.isText(node)) {\n        node._type = 'span'\n        node.marks = []\n      }\n      const blk = fromSlateValue(\n        [\n          {\n            _key: 'bogus',\n            _type: textBlockName,\n            children: [node],\n          },\n        ],\n        textBlockName,\n      )[0] as PortableTextTextBlock\n      const child = blk.children[0]\n      return [\n        insert([child], position, [\n          {_key: block._key},\n          'children',\n          block.children.length <= 1 || !block.children[operation.path[1] - 1]\n            ? 0\n            : {_key: block.children[operation.path[1] - 1]._key},\n        ]),\n      ]\n    }\n    debug('Something was inserted into a void block. Not producing editor patches.')\n    return []\n  }\n\n  function splitNodePatch(\n    editor: PortableTextSlateEditor,\n    operation: SplitNodeOperation,\n    beforeValue: Descendant[],\n  ) {\n    const patches: Patch[] = []\n    const splitBlock = editor.children[operation.path[0]]\n    if (!editor.isTextBlock(splitBlock)) {\n      throw new Error(\n        `Block with path ${JSON.stringify(\n          operation.path[0],\n        )} is not a text block and can't be split`,\n      )\n    }\n    if (operation.path.length === 1) {\n      const oldBlock = beforeValue[operation.path[0]]\n      if (editor.isTextBlock(oldBlock)) {\n        const targetValue = fromSlateValue(\n          [editor.children[operation.path[0] + 1]],\n          textBlockName,\n        )[0]\n        if (targetValue) {\n          patches.push(insert([targetValue], 'after', [{_key: splitBlock._key}]))\n          const spansToUnset = oldBlock.children.slice(operation.position)\n          spansToUnset.forEach((span) => {\n            const path = [{_key: oldBlock._key}, 'children', {_key: span._key}]\n            patches.push(unset(path))\n          })\n        }\n      }\n      return patches\n    }\n    if (operation.path.length === 2) {\n      const splitSpan = splitBlock.children[operation.path[1]]\n      if (editor.isTextSpan(splitSpan)) {\n        const targetSpans = (\n          fromSlateValue(\n            [\n              {\n                ...splitBlock,\n                children: splitBlock.children.slice(operation.path[1] + 1, operation.path[1] + 2),\n              } as Descendant,\n            ],\n            textBlockName,\n          )[0] as PortableTextTextBlock\n        ).children\n\n        patches.push(\n          insert(targetSpans, 'after', [\n            {_key: splitBlock._key},\n            'children',\n            {_key: splitSpan._key},\n          ]),\n        )\n        patches.push(\n          set(splitSpan.text, [\n            {_key: splitBlock._key},\n            'children',\n            {_key: splitSpan._key},\n            'text',\n          ]),\n        )\n      }\n      return patches\n    }\n    return patches\n  }\n\n  function removeNodePatch(\n    editor: PortableTextSlateEditor,\n    operation: RemoveNodeOperation,\n    beforeValue: Descendant[],\n  ) {\n    const block = beforeValue[operation.path[0]]\n    if (operation.path.length === 1) {\n      // Remove a single block\n      if (block && block._key) {\n        return [unset([{_key: block._key}])]\n      }\n      throw new Error('Block not found')\n    } else if (editor.isTextBlock(block) && operation.path.length === 2) {\n      const spanToRemove =\n        editor.isTextBlock(block) && block.children && block.children[operation.path[1]]\n      if (spanToRemove) {\n        return [unset([{_key: block._key}, 'children', {_key: spanToRemove._key}])]\n      }\n      debug('Span not found in editor trying to remove node')\n      return []\n    } else {\n      debug('Not creating patch inside object block')\n      return []\n    }\n  }\n\n  function mergeNodePatch(\n    editor: PortableTextSlateEditor,\n    operation: MergeNodeOperation,\n    beforeValue: Descendant[],\n  ) {\n    const patches: Patch[] = []\n\n    const block = beforeValue[operation.path[0]]\n    const targetBlock = editor.children[operation.path[0]]\n\n    if (operation.path.length === 1) {\n      if (block?._key) {\n        const newBlock = fromSlateValue([editor.children[operation.path[0] - 1]], textBlockName)[0]\n        patches.push(set(newBlock, [{_key: newBlock._key}]))\n        patches.push(unset([{_key: block._key}]))\n      } else {\n        throw new Error('Target key not found!')\n      }\n    } else if (operation.path.length === 2 && editor.isTextBlock(targetBlock)) {\n      const mergedSpan =\n        (editor.isTextBlock(block) && block.children[operation.path[1]]) || undefined\n      const targetSpan = targetBlock.children[operation.path[1] - 1]\n      if (editor.isTextSpan(targetSpan)) {\n        // Set the merged span with it's new value\n        patches.push(\n          set(targetSpan.text, [{_key: block._key}, 'children', {_key: targetSpan._key}, 'text']),\n        )\n        if (mergedSpan) {\n          patches.push(unset([{_key: block._key}, 'children', {_key: mergedSpan._key}]))\n        }\n      }\n    } else {\n      debug(\"Void nodes can't be merged, not creating any patches\")\n    }\n    return patches\n  }\n\n  function moveNodePatch(\n    editor: PortableTextSlateEditor,\n    operation: MoveNodeOperation,\n    beforeValue: Descendant[],\n  ) {\n    const patches: Patch[] = []\n    const block = beforeValue[operation.path[0]]\n    const targetBlock = beforeValue[operation.newPath[0]]\n    if (operation.path.length === 1) {\n      const position: InsertPosition = operation.path[0] > operation.newPath[0] ? 'before' : 'after'\n      patches.push(unset([{_key: block._key}]))\n      patches.push(\n        insert([fromSlateValue([block], textBlockName)[0]], position, [{_key: targetBlock._key}]),\n      )\n    } else if (\n      operation.path.length === 2 &&\n      editor.isTextBlock(block) &&\n      editor.isTextBlock(targetBlock)\n    ) {\n      const child = block.children[operation.path[1]]\n      const targetChild = targetBlock.children[operation.newPath[1]]\n      const position = operation.newPath[1] === targetBlock.children.length ? 'after' : 'before'\n      const childToInsert = (fromSlateValue([block], textBlockName)[0] as PortableTextTextBlock)\n        .children[operation.path[1]]\n      patches.push(unset([{_key: block._key}, 'children', {_key: child._key}]))\n      patches.push(\n        insert([childToInsert], position, [\n          {_key: targetBlock._key},\n          'children',\n          {_key: targetChild._key},\n        ]),\n      )\n    }\n    return patches\n  }\n\n  return {\n    insertNodePatch,\n    insertTextPatch,\n    mergeNodePatch,\n    moveNodePatch,\n    removeNodePatch,\n    removeTextPatch,\n    setNodePatch,\n    splitNodePatch,\n  }\n}\n","import {\n  isPortableTextSpan,\n  type ObjectSchemaType,\n  type Path,\n  type PortableTextBlock,\n  type PortableTextChild,\n  type PortableTextObject,\n  type PortableTextTextBlock,\n  type SchemaType,\n} from '@sanity/types'\nimport {Editor, Element as SlateElement, Node, Range, Text, Transforms} from 'slate'\nimport {ReactEditor} from 'slate-react'\nimport {type DOMNode} from 'slate-react/dist/utils/dom'\n\nimport {\n  type EditableAPIDeleteOptions,\n  type EditorSelection,\n  type PortableTextMemberSchemaTypes,\n  type PortableTextSlateEditor,\n} from '../../types/editor'\nimport {debugWithName} from '../../utils/debug'\nimport {toPortableTextRange, toSlateRange} from '../../utils/ranges'\nimport {fromSlateValue, isEqualToEmptyEditor, toSlateValue} from '../../utils/values'\nimport {KEY_TO_VALUE_ELEMENT, SLATE_TO_PORTABLE_TEXT_RANGE} from '../../utils/weakMaps'\nimport {type PortableTextEditor} from '../PortableTextEditor'\n\nconst debug = debugWithName('API:editable')\n\nexport function createWithEditableAPI(\n  portableTextEditor: PortableTextEditor,\n  types: PortableTextMemberSchemaTypes,\n  keyGenerator: () => string,\n) {\n  return function withEditableAPI(editor: PortableTextSlateEditor): PortableTextSlateEditor {\n    portableTextEditor.setEditable({\n      focus: (): void => {\n        ReactEditor.focus(editor)\n      },\n      blur: (): void => {\n        ReactEditor.blur(editor)\n      },\n      toggleMark: (mark: string): void => {\n        editor.pteToggleMark(mark)\n      },\n      toggleList: (listStyle: string): void => {\n        editor.pteToggleListItem(listStyle)\n      },\n      toggleBlockStyle: (blockStyle: string): void => {\n        editor.pteToggleBlockStyle(blockStyle)\n      },\n      isMarkActive: (mark: string): boolean => {\n        // Try/catch this, as Slate may error because the selection is currently wrong\n        // TODO: catch only relevant error from Slate\n        try {\n          return editor.pteIsMarkActive(mark)\n        } catch (err) {\n          console.warn(err)\n          return false\n        }\n      },\n      marks: (): string[] => {\n        return (\n          {\n            ...(Editor.marks(editor) || {}),\n          }.marks || []\n        )\n      },\n      undo: (): void => editor.undo(),\n      redo: (): void => editor.redo(),\n      select: (selection: EditorSelection): void => {\n        const slateSelection = toSlateRange(selection, editor)\n        if (slateSelection) {\n          Transforms.select(editor, slateSelection)\n        } else {\n          Transforms.deselect(editor)\n        }\n        editor.onChange()\n      },\n      focusBlock: (): PortableTextBlock | undefined => {\n        if (editor.selection) {\n          const block = Node.descendant(editor, editor.selection.focus.path.slice(0, 1))\n          if (block) {\n            return fromSlateValue([block], types.block.name, KEY_TO_VALUE_ELEMENT.get(editor))[0]\n          }\n        }\n        return undefined\n      },\n      focusChild: (): PortableTextChild | undefined => {\n        if (editor.selection) {\n          const block = Node.descendant(editor, editor.selection.focus.path.slice(0, 1))\n          if (block && editor.isTextBlock(block)) {\n            const ptBlock = fromSlateValue(\n              [block],\n              types.block.name,\n              KEY_TO_VALUE_ELEMENT.get(editor),\n            )[0] as PortableTextTextBlock\n            return ptBlock.children[editor.selection.focus.path[1]]\n          }\n        }\n        return undefined\n      },\n      insertChild: (type: SchemaType, value?: {[prop: string]: any}): Path => {\n        if (!editor.selection) {\n          throw new Error('The editor has no selection')\n        }\n        const [focusBlock] = Array.from(\n          Editor.nodes(editor, {\n            at: editor.selection.focus.path.slice(0, 1),\n            match: (n) => n._type === types.block.name,\n          }),\n        )[0] || [undefined]\n        if (!focusBlock) {\n          throw new Error('No focused text block')\n        }\n        if (\n          type.name !== types.span.name &&\n          !types.inlineObjects.some((t) => t.name === type.name)\n        ) {\n          throw new Error('This type cannot be inserted as a child to a text block')\n        }\n        const block = toSlateValue(\n          [\n            {\n              _key: keyGenerator(),\n              _type: types.block.name,\n              children: [\n                {\n                  _key: keyGenerator(),\n                  _type: type.name,\n                  ...(value ? value : {}),\n                },\n              ],\n            },\n          ],\n          portableTextEditor,\n        )[0] as unknown as SlateElement\n        const child = block.children[0]\n        const focusChildPath = editor.selection.focus.path.slice(0, 2)\n        const isSpanNode = child._type === types.span.name\n        const focusNode = Node.get(editor, focusChildPath)\n\n        // If we are inserting a span, and currently have focus on an inline object,\n        // move the selection to the next span (guaranteed by normalizing rules) before inserting it.\n        if (isSpanNode && focusNode._type !== types.span.name) {\n          debug('Inserting span child next to inline object child, moving selection + 1')\n          editor.move({distance: 1, unit: 'character'})\n        }\n\n        Transforms.insertNodes(editor, child, {\n          select: true,\n          at: editor.selection,\n        })\n        editor.onChange()\n        return (\n          toPortableTextRange(\n            fromSlateValue(editor.children, types.block.name, KEY_TO_VALUE_ELEMENT.get(editor)),\n            editor.selection,\n            types,\n          )?.focus.path || []\n        )\n      },\n      insertBlock: (type: SchemaType, value?: {[prop: string]: any}): Path => {\n        if (!editor.selection) {\n          throw new Error('The editor has no selection')\n        }\n        const block = toSlateValue(\n          [\n            {\n              _key: keyGenerator(),\n              _type: type.name,\n              ...(value ? value : {}),\n            },\n          ],\n          portableTextEditor,\n        )[0] as unknown as Node\n        const [focusBlock] = Array.from(\n          Editor.nodes(editor, {\n            at: editor.selection.focus.path.slice(0, 1),\n            match: (n) => n._type === types.block.name,\n          }),\n        )[0] || [undefined]\n\n        const isEmptyTextBlock = focusBlock && isEqualToEmptyEditor([focusBlock], types)\n\n        if (isEmptyTextBlock) {\n          // If the text block is empty, remove it before inserting the new block.\n          Transforms.removeNodes(editor, {at: editor.selection})\n        }\n\n        Editor.insertNode(editor, block)\n        editor.onChange()\n        return (\n          toPortableTextRange(\n            fromSlateValue(editor.children, types.block.name, KEY_TO_VALUE_ELEMENT.get(editor)),\n            editor.selection,\n            types,\n          )?.focus.path || []\n        )\n      },\n      hasBlockStyle: (style: string): boolean => {\n        try {\n          return editor.pteHasBlockStyle(style)\n        } catch (err) {\n          // This is fine.\n          // debug(err)\n          return false\n        }\n      },\n      hasListStyle: (listStyle: string): boolean => {\n        try {\n          return editor.pteHasListStyle(listStyle)\n        } catch (err) {\n          // This is fine.\n          // debug(err)\n          return false\n        }\n      },\n      isVoid: (element: PortableTextBlock | PortableTextChild) => {\n        return ![types.block.name, types.span.name].includes(element._type)\n      },\n      findByPath: (\n        path: Path,\n      ): [PortableTextBlock | PortableTextChild | undefined, Path | undefined] => {\n        const slatePath = toSlateRange(\n          {focus: {path, offset: 0}, anchor: {path, offset: 0}},\n          editor,\n        )\n        if (slatePath) {\n          const [block, blockPath] = Editor.node(editor, slatePath.focus.path.slice(0, 1))\n          if (block && blockPath && typeof block._key === 'string') {\n            if (path.length === 1 && slatePath.focus.path.length === 1) {\n              return [fromSlateValue([block], types.block.name)[0], [{_key: block._key}]]\n            }\n            const ptBlock = fromSlateValue(\n              [block],\n              types.block.name,\n              KEY_TO_VALUE_ELEMENT.get(editor),\n            )[0]\n            if (editor.isTextBlock(ptBlock)) {\n              const ptChild = ptBlock.children[slatePath.focus.path[1]]\n              if (ptChild) {\n                return [ptChild, [{_key: block._key}, 'children', {_key: ptChild._key}]]\n              }\n            }\n          }\n        }\n        return [undefined, undefined]\n      },\n      findDOMNode: (element: PortableTextBlock | PortableTextChild): DOMNode | undefined => {\n        let node: DOMNode | undefined\n        try {\n          const [item] = Array.from(\n            Editor.nodes(editor, {\n              at: [],\n              match: (n) => n._key === element._key,\n            }) || [],\n          )[0] || [undefined]\n          node = ReactEditor.toDOMNode(editor, item)\n        } catch (err) {\n          // Nothing\n        }\n        return node\n      },\n      activeAnnotations: (): PortableTextObject[] => {\n        if (!editor.selection || editor.selection.focus.path.length < 2) {\n          return []\n        }\n        try {\n          const activeAnnotations: PortableTextObject[] = []\n          const spans = Editor.nodes(editor, {\n            at: editor.selection,\n            match: (node) =>\n              Text.isText(node) &&\n              node.marks !== undefined &&\n              Array.isArray(node.marks) &&\n              node.marks.length > 0,\n          })\n          for (const [span, path] of spans) {\n            const [block] = Editor.node(editor, path, {depth: 1})\n            if (editor.isTextBlock(block)) {\n              block.markDefs?.forEach((def) => {\n                if (\n                  Text.isText(span) &&\n                  span.marks &&\n                  Array.isArray(span.marks) &&\n                  span.marks.includes(def._key)\n                ) {\n                  activeAnnotations.push(def)\n                }\n              })\n            }\n          }\n          return activeAnnotations\n        } catch (err) {\n          return []\n        }\n      },\n      isAnnotationActive: (annotationType: PortableTextObject['_type']): boolean => {\n        if (!editor.selection || editor.selection.focus.path.length < 2) {\n          return false\n        }\n\n        try {\n          const spans = [\n            ...Editor.nodes(editor, {\n              at: editor.selection,\n              match: (node) => Text.isText(node),\n            }),\n          ]\n\n          if (\n            spans.some(\n              ([span]) => !isPortableTextSpan(span) || !span.marks || span.marks?.length === 0,\n            )\n          )\n            return false\n\n          const selectionMarkDefs = spans.reduce((accMarkDefs, [, path]) => {\n            const [block] = Editor.node(editor, path, {depth: 1})\n            if (editor.isTextBlock(block) && block.markDefs) {\n              return [...accMarkDefs, ...block.markDefs]\n            }\n            return accMarkDefs\n          }, [] as PortableTextObject[])\n\n          return spans.every(([span]) => {\n            if (!isPortableTextSpan(span)) return false\n\n            const spanMarkDefs = span.marks?.map(\n              (markKey) => selectionMarkDefs.find((def) => def?._key === markKey)?._type,\n            )\n\n            return spanMarkDefs?.includes(annotationType)\n          })\n        } catch (err) {\n          return false\n        }\n      },\n      addAnnotation: (\n        type: ObjectSchemaType,\n        value?: {[prop: string]: unknown},\n      ): {spanPath: Path; markDefPath: Path} | undefined => {\n        const {selection: originalSelection} = editor\n        let returnValue: {spanPath: Path; markDefPath: Path} | undefined = undefined\n        if (originalSelection) {\n          const [block] = Editor.node(editor, originalSelection.focus, {depth: 1})\n          if (!editor.isTextBlock(block)) {\n            return undefined\n          }\n          if (Range.isCollapsed(originalSelection)) {\n            editor.pteExpandToWord()\n            editor.onChange()\n          }\n          const [textNode] = Editor.node(editor, originalSelection.focus, {depth: 2})\n\n          // If we still have a selection, add the annotation to the selected text\n          if (editor.selection) {\n            Editor.withoutNormalizing(editor, () => {\n              // Add markDefs to the block\n              const annotationKey = keyGenerator()\n              Transforms.setNodes(\n                editor,\n                {\n                  markDefs: [\n                    ...(block.markDefs || []),\n                    {_type: type.name, _key: annotationKey, ...value} as PortableTextObject,\n                  ],\n                },\n                {at: originalSelection.focus},\n              )\n              editor.onChange()\n\n              // Split if needed\n              Transforms.setNodes(editor, {}, {match: Text.isText, split: true})\n              editor.onChange()\n\n              // Add marks to the span node\n              if (editor.selection && Text.isText(textNode)) {\n                Transforms.setNodes(\n                  editor,\n                  {\n                    marks: [...((textNode.marks || []) as string[]), annotationKey],\n                  },\n                  {\n                    at: editor.selection,\n                    match: (n) => n._type === types.span.name,\n                  },\n                )\n              }\n              editor.onChange()\n              if (editor.selection) {\n                // Insert an empty string to continue writing non-annotated text\n                Transforms.insertNodes(\n                  editor,\n                  [{_type: 'span', text: '', marks: [], _key: keyGenerator()}],\n                  {\n                    at: Range.end(editor.selection),\n                  },\n                )\n              }\n              const newPortableTextEditorSelection = toPortableTextRange(\n                fromSlateValue(editor.children, types.block.name, KEY_TO_VALUE_ELEMENT.get(editor)),\n                editor.selection,\n                types,\n              )\n              if (newPortableTextEditorSelection) {\n                returnValue = {\n                  spanPath: newPortableTextEditorSelection.focus.path,\n                  markDefPath: [{_key: block._key}, 'markDefs', {_key: annotationKey}],\n                }\n              }\n            })\n            Editor.normalize(editor)\n            editor.onChange()\n          }\n        }\n        return returnValue\n      },\n      delete: (selection: EditorSelection, options?: EditableAPIDeleteOptions): void => {\n        if (selection) {\n          const range = toSlateRange(selection, editor)\n          const hasRange = range && range.anchor.path.length > 0 && range.focus.path.length > 0\n          if (!hasRange) {\n            throw new Error('Invalid range')\n          }\n          if (range) {\n            if (!options?.mode || options?.mode === 'selected') {\n              debug(`Deleting content in selection`)\n              Transforms.delete(editor, {\n                at: range,\n                hanging: true,\n                voids: true,\n              })\n              editor.onChange()\n              return\n            }\n            if (options?.mode === 'blocks') {\n              debug(`Deleting blocks touched by selection`)\n              Transforms.removeNodes(editor, {\n                at: range,\n                voids: true,\n                match: (node) => {\n                  return (\n                    editor.isTextBlock(node) ||\n                    (!editor.isTextBlock(node) && SlateElement.isElement(node))\n                  )\n                },\n              })\n            }\n            if (options?.mode === 'children') {\n              debug(`Deleting children touched by selection`)\n              Transforms.removeNodes(editor, {\n                at: range,\n                voids: true,\n                match: (node) => {\n                  return (\n                    node._type === types.span.name || // Text children\n                    (!editor.isTextBlock(node) && SlateElement.isElement(node)) // inline blocks\n                  )\n                },\n              })\n            }\n            // If the editor was emptied, insert a placeholder block\n            // directly into the editor's children. We don't want to do this\n            // through a Transform (because that would trigger a change event\n            // that would insert the placeholder into the actual value\n            // which should remain empty)\n            if (editor.children.length === 0) {\n              editor.children = [editor.pteCreateEmptyBlock()]\n            }\n            editor.onChange()\n          }\n        }\n      },\n      removeAnnotation: (type: ObjectSchemaType): void => {\n        let {selection} = editor\n        debug('Removing annotation', type)\n        if (selection) {\n          // Select the whole annotation if collapsed\n          if (Range.isCollapsed(selection)) {\n            const [node, nodePath] = Editor.node(editor, selection, {depth: 2})\n            if (Text.isText(node) && node.marks && typeof node.text === 'string') {\n              Transforms.select(editor, nodePath)\n              selection = editor.selection\n            }\n          }\n          // Do this without normalization or span references will be unstable!\n          Editor.withoutNormalizing(editor, () => {\n            if (selection && Range.isExpanded(selection)) {\n              selection = editor.selection\n              if (!selection) {\n                return\n              }\n              // Find the selected block, to identify the annotation to remove\n              const blocks = [\n                ...Editor.nodes(editor, {\n                  at: selection,\n                  match: (node) => {\n                    return (\n                      editor.isTextBlock(node) &&\n                      Array.isArray(node.markDefs) &&\n                      node.markDefs.some((def) => def._type === type.name)\n                    )\n                  },\n                }),\n              ]\n              const removedMarks: string[] = []\n\n              // Removes the marks from the text nodes\n              blocks.forEach(([block]) => {\n                if (editor.isTextBlock(block) && Array.isArray(block.markDefs)) {\n                  const marksToRemove = block.markDefs.filter((def) => def._type === type.name)\n                  marksToRemove.forEach((def) => {\n                    if (!removedMarks.includes(def._key)) removedMarks.push(def._key)\n                    Editor.removeMark(editor, def._key)\n                  })\n                }\n              })\n            }\n          })\n          Editor.normalize(editor)\n          editor.onChange()\n        }\n      },\n      getSelection: (): EditorSelection | null => {\n        let ptRange: EditorSelection = null\n        if (editor.selection) {\n          const existing = SLATE_TO_PORTABLE_TEXT_RANGE.get(editor.selection)\n          if (existing) {\n            return existing\n          }\n          ptRange = toPortableTextRange(\n            fromSlateValue(editor.children, types.block.name, KEY_TO_VALUE_ELEMENT.get(editor)),\n            editor.selection,\n            types,\n          )\n          SLATE_TO_PORTABLE_TEXT_RANGE.set(editor.selection, ptRange)\n        }\n        return ptRange\n      },\n      getValue: () => {\n        return fromSlateValue(editor.children, types.block.name, KEY_TO_VALUE_ELEMENT.get(editor))\n      },\n      isCollapsedSelection: () => {\n        return !!editor.selection && Range.isCollapsed(editor.selection)\n      },\n      isExpandedSelection: () => {\n        return !!editor.selection && Range.isExpanded(editor.selection)\n      },\n      insertBreak: () => {\n        editor.insertBreak()\n        editor.onChange()\n      },\n      getFragment: () => {\n        return fromSlateValue(editor.getFragment(), types.block.name)\n      },\n      isSelectionsOverlapping: (selectionA: EditorSelection, selectionB: EditorSelection) => {\n        // Convert the selections to Slate ranges\n        const rangeA = toSlateRange(selectionA, editor)\n        const rangeB = toSlateRange(selectionB, editor)\n\n        // Make sure the ranges are valid\n        const isValidRanges = Range.isRange(rangeA) && Range.isRange(rangeB)\n\n        // Check if the ranges are overlapping\n        const isOverlapping = isValidRanges && Range.includes(rangeA, rangeB)\n\n        return isOverlapping\n      },\n    })\n    return editor\n  }\n}\n","import {Editor, Node, Path, Range, Transforms} from 'slate'\n\nimport {type PortableTextMemberSchemaTypes, type PortableTextSlateEditor} from '../../types/editor'\nimport {type SlateTextBlock, type VoidElement} from '../../types/slate'\nimport {isEqualToEmptyEditor} from '../../utils/values'\n\n/**\n * Changes default behavior of insertBreak to insert a new block instead of splitting current when the cursor is at the\n * start of the block.\n */\nexport function createWithInsertBreak(\n  types: PortableTextMemberSchemaTypes,\n): (editor: PortableTextSlateEditor) => PortableTextSlateEditor {\n  return function withInsertBreak(editor: PortableTextSlateEditor): PortableTextSlateEditor {\n    const {insertBreak} = editor\n\n    editor.insertBreak = () => {\n      if (editor.selection) {\n        const focusBlockPath = editor.selection.focus.path.slice(0, 1)\n        const focusBlock = Node.descendant(editor, focusBlockPath) as SlateTextBlock | VoidElement\n\n        if (editor.isTextBlock(focusBlock)) {\n          // Enter from another style than the first (default one)\n          const [, end] = Range.edges(editor.selection)\n          // If it's at the start of block, we want to preserve the current block key and insert a new one in the current position instead of splitting the node.\n          const isEndAtStartOfNode = Editor.isStart(editor, end, end.path)\n          const isEmptyTextBlock = focusBlock && isEqualToEmptyEditor([focusBlock], types)\n          if (isEndAtStartOfNode && !isEmptyTextBlock) {\n            Editor.insertNode(editor, editor.pteCreateEmptyBlock())\n            const [nextBlockPath] = Path.next(focusBlockPath)\n            Transforms.select(editor, {\n              anchor: {path: [nextBlockPath, 0], offset: 0},\n              focus: {path: [nextBlockPath, 0], offset: 0},\n            })\n\n            editor.onChange()\n            return\n          }\n        }\n      }\n      insertBreak()\n    }\n    return editor\n  }\n}\n","import {type PortableTextSlateEditor} from '../../types/editor'\n\n/**\n * This plugin makes sure that the PTE maxBlocks prop is respected\n *\n */\nexport function createWithMaxBlocks(maxBlocks: number) {\n  return function withMaxBlocks(editor: PortableTextSlateEditor): PortableTextSlateEditor {\n    const {apply} = editor\n    editor.apply = (operation) => {\n      const rows = maxBlocks\n      if (rows > 0 && editor.children.length >= rows) {\n        if (\n          (operation.type === 'insert_node' || operation.type === 'split_node') &&\n          operation.path.length === 1\n        ) {\n          return\n        }\n      }\n      apply(operation)\n    }\n    return editor\n  }\n}\n","import {type Editor} from 'slate'\n\nexport const PRESERVE_KEYS: WeakMap<Editor, boolean | undefined> = new WeakMap()\n\nexport function withPreserveKeys(editor: Editor, fn: () => void): void {\n  const prev = isPreservingKeys(editor)\n  PRESERVE_KEYS.set(editor, true)\n  fn()\n  PRESERVE_KEYS.set(editor, prev)\n}\n\nexport function isPreservingKeys(editor: Editor): boolean | undefined {\n  return PRESERVE_KEYS.get(editor)\n}\n","import {Editor, Element, Node, Transforms} from 'slate'\n\nimport {type PortableTextMemberSchemaTypes, type PortableTextSlateEditor} from '../../types/editor'\nimport {isPreservingKeys, PRESERVE_KEYS} from '../../utils/withPreserveKeys'\n\n/**\n * This plugin makes sure that every new node in the editor get a new _key prop when created\n *\n */\nexport function createWithObjectKeys(\n  schemaTypes: PortableTextMemberSchemaTypes,\n  keyGenerator: () => string,\n) {\n  return function withKeys(editor: PortableTextSlateEditor): PortableTextSlateEditor {\n    PRESERVE_KEYS.set(editor, false)\n    const {apply, normalizeNode} = editor\n\n    // The apply function can be called with a scope (withPreserveKeys) that will\n    // preserve keys for the produced nodes if they have a _key property set already.\n    // The default behavior is to always generate a new key here.\n    // For example, when undoing and redoing we want to retain the keys, but\n    // when we create a new bold span by splitting a non-bold-span we want the produced node to get a new key.\n    editor.apply = (operation) => {\n      if (operation.type === 'split_node') {\n        const withNewKey = !isPreservingKeys(editor) || !('_key' in operation.properties)\n        operation.properties = {\n          ...operation.properties,\n          ...(withNewKey ? {_key: keyGenerator()} : {}),\n        }\n      }\n      if (operation.type === 'insert_node') {\n        // Must be given a new key or adding/removing marks while typing gets in trouble (duped keys)!\n        const withNewKey = !isPreservingKeys(editor) || !('_key' in operation.node)\n        if (!Editor.isEditor(operation.node)) {\n          operation.node = {\n            ...operation.node,\n            ...(withNewKey ? {_key: keyGenerator()} : {}),\n          }\n        }\n      }\n      apply(operation)\n    }\n    editor.normalizeNode = (entry) => {\n      const [node, path] = entry\n      if (Element.isElement(node) && node._type === schemaTypes.block.name) {\n        // Set key on block itself\n        if (!node._key) {\n          Transforms.setNodes(editor, {_key: keyGenerator()}, {at: path})\n        }\n        // Set keys on it's children\n        for (const [child, childPath] of Node.children(editor, path)) {\n          if (!child._key) {\n            Transforms.setNodes(editor, {_key: keyGenerator()}, {at: childPath})\n            return\n          }\n        }\n      }\n      normalizeNode(entry)\n    }\n\n    return editor\n  }\n}\n","export const BEFORE = 'before'\nexport const AFTER = 'after'\n\nexport default function insert(array: any[], position: string, index: number, ...args: any[]) {\n  if (position !== BEFORE && position !== AFTER) {\n    throw new Error(`Invalid position \"${position}\", must be either ${BEFORE} or ${AFTER}`)\n  }\n\n  const items = flatten(...args)\n\n  if (array.length === 0) {\n    return items\n  }\n\n  const len = array.length\n  const idx = Math.abs((len + index) % len) % len\n\n  const normalizedIdx = position === 'after' ? idx + 1 : idx\n\n  const copy = array.slice()\n  copy.splice(normalizedIdx, 0, ...flatten(items))\n  return copy\n}\n\nfunction flatten(...values: any[]) {\n  return values.reduce((prev, item) => prev.concat(item), [])\n}\n","import {type PathSegment} from '@sanity/types'\nimport {findIndex} from 'lodash'\n\nimport applyPatch from './applyPatch'\nimport insert from './arrayInsert'\n\nconst hasOwn = Object.prototype.hasOwnProperty.call.bind(Object.prototype.hasOwnProperty)\n\nfunction move(arr: any[], from: number, to: any) {\n  const nextValue = arr.slice()\n  const val = nextValue[from]\n  nextValue.splice(from, 1)\n  nextValue.splice(to, 0, val)\n  return nextValue\n}\n\nfunction findTargetIndex(array: any[], pathSegment: PathSegment) {\n  if (typeof pathSegment === 'number') {\n    return pathSegment\n  }\n  const index = findIndex(array, pathSegment)\n  return index === -1 ? false : index\n}\n\nexport default function apply(\n  value: any,\n  patch: {type: any; path: any; value: any; position: any; items: any},\n) {\n  const nextValue = value.slice() // make a copy for internal mutation\n\n  if (patch.path.length === 0) {\n    // its directed to me\n    if (patch.type === 'setIfMissing') {\n      if (!Array.isArray(patch.value)) {\n        // eslint-disable-line max-depth\n        throw new Error('Cannot set value of an array to a non-array')\n      }\n      return value === undefined ? patch.value : value\n    } else if (patch.type === 'set') {\n      if (!Array.isArray(patch.value)) {\n        // eslint-disable-line max-depth\n        throw new Error('Cannot set value of an array to a non-array')\n      }\n      return patch.value\n    } else if (patch.type === 'unset') {\n      return undefined\n    } else if (patch.type === 'move') {\n      if (!patch.value || !hasOwn(patch.value, 'from') || !hasOwn(patch.value, 'to')) {\n        // eslint-disable-line max-depth\n        throw new Error(\n          `Invalid value of 'move' patch. Expected a value with \"from\" and \"to\" indexes, instead got: ${JSON.stringify(\n            patch.value,\n          )}`,\n        )\n      }\n      return move(nextValue, patch.value.from, patch.value.to)\n    }\n    throw new Error(`Invalid array operation: ${patch.type}`)\n  }\n\n  const [head, ...tail] = patch.path\n\n  const index = findTargetIndex(value, head)\n\n  // If the given selector could not be found, return as-is\n  if (index === false) {\n    return nextValue\n  }\n\n  if (tail.length === 0) {\n    if (patch.type === 'insert') {\n      const {position, items} = patch\n      return insert(value, position, index, items)\n    } else if (patch.type === 'unset') {\n      if (typeof index !== 'number') {\n        throw new Error(`Expected array index to be a number, instead got \"${index}\"`)\n      }\n      nextValue.splice(index, 1)\n      return nextValue\n    }\n  }\n\n  // The patch is not directed to me\n  nextValue[index] = applyPatch(nextValue[index], {\n    ...patch,\n    path: tail,\n  })\n  return nextValue\n}\n","import {clone, isObject, omit} from 'lodash'\n\nimport applyPatch from './applyPatch'\n\nexport default function apply(value: any, patch: {type: any; path: any; value: any}) {\n  const nextValue = clone(value)\n  if (patch.path.length === 0) {\n    // its directed to me\n    if (patch.type === 'set') {\n      if (!isObject(patch.value)) {\n        // eslint-disable-line max-depth\n        throw new Error('Cannot set value of an object to a non-object')\n      }\n      return patch.value\n    } else if (patch.type === 'unset') {\n      return undefined\n    } else if (patch.type === 'setIfMissing') {\n      // console.log('IS IT missing?', value)\n      return value === undefined ? patch.value : value\n    }\n    throw new Error(`Invalid object operation: ${patch.type}`)\n  }\n\n  // The patch is not directed to me\n  const [head, ...tail] = patch.path\n  if (typeof head !== 'string') {\n    throw new Error(`Expected field name to be a string, instad got: ${head}`)\n  }\n\n  if (tail.length === 0 && patch.type === 'unset') {\n    return omit(nextValue, head)\n  }\n\n  nextValue[head] = applyPatch(nextValue[head], {\n    ...patch,\n    path: tail,\n  })\n  return nextValue\n}\n","const OPERATIONS: Record<string, any> = {\n  replace(_currentValue: any, nextValue: any) {\n    return nextValue\n  },\n  set(_currentValue: any, nextValue: any) {\n    return nextValue\n  },\n  setIfMissing(currentValue: any, nextValue: any) {\n    return currentValue === undefined ? nextValue : currentValue\n  },\n  unset(_currentValue: any, _nextValue: any) {\n    return undefined\n  },\n  inc(currentValue: any, nextValue: any) {\n    return currentValue + nextValue\n  },\n  dec(currentValue: any, nextValue: any) {\n    return currentValue - nextValue\n  },\n}\n\nconst SUPPORTED_PATCH_TYPES = Object.keys(OPERATIONS)\n\nexport default function apply(value: any, patch: any) {\n  if (!SUPPORTED_PATCH_TYPES.includes(patch.type)) {\n    throw new Error(\n      `Received patch of unsupported type: \"${JSON.stringify(\n        patch.type,\n      )}\" for primitives. This is most likely a bug.`,\n    )\n  }\n\n  if (patch.path.length > 0) {\n    throw new Error(\n      `Cannot apply deep operations on primitive values. Received patch with type \"${\n        patch.type\n      }\" and path \"${patch.path\n        .map((path: any) => JSON.stringify(path))\n        .join('.')} that targeted the value \"${JSON.stringify(value)}\"`,\n    )\n  }\n  return OPERATIONS[patch.type](value, patch.value)\n}\n","import {applyPatches, parsePatch} from '@sanity/diff-match-patch'\n\ntype fn = (oldVal: any, newVal: any) => any\nconst OPERATIONS: Record<string, fn> = {\n  replace(currentValue: any, nextValue: any) {\n    return nextValue\n  },\n  set(currentValue: any, nextValue: any) {\n    return nextValue\n  },\n  setIfMissing(currentValue: undefined, nextValue: any) {\n    return currentValue === undefined ? nextValue : currentValue\n  },\n  unset(currentValue: any, nextValue: any) {\n    return undefined\n  },\n  diffMatchPatch(currentValue: string, nextValue: string): string {\n    const [result] = applyPatches(parsePatch(nextValue), currentValue, {\n      allowExceedingIndices: true,\n    })\n    return result\n  },\n}\n\nconst SUPPORTED_PATCH_TYPES = Object.keys(OPERATIONS)\n\nexport default function apply(\n  value: string,\n  patch: {type: string; path: any[]; value: any},\n): string {\n  if (!SUPPORTED_PATCH_TYPES.includes(patch.type)) {\n    throw new Error(\n      `Received patch of unsupported type: \"${JSON.stringify(\n        patch.type,\n      )}\" for string. This is most likely a bug.`,\n    )\n  }\n\n  if (patch.path.length > 0) {\n    throw new Error(\n      `Cannot apply deep operations on string values. Received patch with type \"${\n        patch.type\n      }\" and path \"${patch.path.join('.')} that targeted the value \"${JSON.stringify(value)}\"`,\n    )\n  }\n  const func = OPERATIONS[patch.type]\n  if (func) {\n    return func(value, patch.value)\n  }\n  throw new Error('Unknown patch type')\n}\n","import {isObject, isString} from 'lodash'\n\nimport applyArrayPatch from './array'\nimport applyObjectPatch from './object'\nimport applyPrimitivePatch from './primitive'\nimport applyStringPatch from './string'\n\nexport function applyAll(value: any, patches: any[]) {\n  return patches.reduce(_apply, value)\n}\n\nfunction applyPatch(value: string, patch: {type: string; path: any[]; value: any}) {\n  if (Array.isArray(value)) {\n    return applyArrayPatch(value, patch as any)\n  }\n  if (isString(value)) {\n    return applyStringPatch(value, patch)\n  }\n  if (isObject(value)) {\n    return applyObjectPatch(value, patch)\n  }\n  return applyPrimitivePatch(value, patch)\n}\n\nexport default function _apply(value: string, patch: {type: string; path: any[]; value: any}) {\n  const res = applyPatch(value, patch)\n  // console.log('applyPatch(%o, %o) : %o (noop? %o)', value, patch, res, value === res)\n  return res\n}\n","/* eslint-disable max-statements */\nimport {\n  applyPatches as diffMatchPatchApplyPatches,\n  cleanupEfficiency,\n  DIFF_DELETE,\n  DIFF_EQUAL,\n  DIFF_INSERT,\n  makeDiff,\n  parsePatch,\n} from '@sanity/diff-match-patch'\nimport {\n  type KeyedSegment,\n  type Path,\n  type PathSegment,\n  type PortableTextBlock,\n  type PortableTextChild,\n} from '@sanity/types'\nimport {type Descendant, Element, type Node, type Path as SlatePath, Text, Transforms} from 'slate'\n\nimport {applyAll} from '../patch/applyPatch'\nimport {type PortableTextMemberSchemaTypes, type PortableTextSlateEditor} from '../types/editor'\nimport {\n  type DiffMatchPatch,\n  type InsertPatch,\n  type Patch,\n  type SetPatch,\n  type UnsetPatch,\n} from '../types/patch'\nimport {debugWithName} from './debug'\nimport {toSlateValue} from './values'\nimport {KEY_TO_SLATE_ELEMENT} from './weakMaps'\n\nconst debug = debugWithName('applyPatches')\nconst debugVerbose = debug.enabled && true\n\n/**\n * Creates a function that can apply a patch onto a PortableTextSlateEditor.\n */\nexport function createApplyPatch(\n  schemaTypes: PortableTextMemberSchemaTypes,\n): (editor: PortableTextSlateEditor, patch: Patch) => boolean {\n  let previousPatch: Patch | undefined\n\n  return function (editor: PortableTextSlateEditor, patch: Patch): boolean {\n    let changed = false\n\n    // Save some CPU cycles by not stringifying unless enabled\n    if (debugVerbose) {\n      debug('\\n\\nNEW PATCH =============================================================')\n      debug(JSON.stringify(patch, null, 2))\n    }\n\n    try {\n      switch (patch.type) {\n        case 'insert':\n          changed = insertPatch(editor, patch, schemaTypes)\n          break\n        case 'unset':\n          changed = unsetPatch(editor, patch, previousPatch)\n          break\n        case 'set':\n          changed = setPatch(editor, patch)\n          break\n        case 'diffMatchPatch':\n          changed = diffMatchPatch(editor, patch)\n          break\n        default:\n          debug('Unhandled patch', patch.type)\n      }\n    } catch (err) {\n      console.error(err)\n    }\n    previousPatch = patch\n    return changed\n  }\n}\n\n/**\n * Apply a remote diff match patch to the current PTE instance.\n * Note meant for external consumption, only exported for testing purposes.\n *\n * @param editor - Portable text slate editor instance\n * @param patch - The PTE diff match patch operation to apply\n * @returns true if the patch was applied, false otherwise\n * @internal\n */\nexport function diffMatchPatch(\n  editor: Pick<\n    PortableTextSlateEditor,\n    'children' | 'isTextBlock' | 'apply' | 'selection' | 'onChange'\n  >,\n  patch: DiffMatchPatch,\n): boolean {\n  const {block, child, childPath} = findBlockAndChildFromPath(editor, patch.path)\n  if (!block) {\n    debug('Block not found')\n    return false\n  }\n  if (!child || !childPath) {\n    debug('Child not found')\n    return false\n  }\n  const isSpanTextDiffMatchPatch =\n    block &&\n    editor.isTextBlock(block) &&\n    patch.path.length === 4 &&\n    patch.path[1] === 'children' &&\n    patch.path[3] === 'text'\n\n  if (!isSpanTextDiffMatchPatch || !Text.isText(child)) {\n    return false\n  }\n\n  const patches = parsePatch(patch.value)\n  const [newValue] = diffMatchPatchApplyPatches(patches, child.text, {allowExceedingIndices: true})\n  const diff = cleanupEfficiency(makeDiff(child.text, newValue), 5)\n\n  debugState(editor, 'before')\n  let offset = 0\n  for (const [op, text] of diff) {\n    if (op === DIFF_INSERT) {\n      editor.apply({type: 'insert_text', path: childPath, offset, text})\n      offset += text.length\n    } else if (op === DIFF_DELETE) {\n      editor.apply({type: 'remove_text', path: childPath, offset: offset, text})\n    } else if (op === DIFF_EQUAL) {\n      offset += text.length\n    }\n  }\n  debugState(editor, 'after')\n\n  return true\n}\n\nfunction insertPatch(\n  editor: PortableTextSlateEditor,\n  patch: InsertPatch,\n  schemaTypes: PortableTextMemberSchemaTypes,\n) {\n  const {\n    block: targetBlock,\n    child: targetChild,\n    blockPath: targetBlockPath,\n    childPath: targetChildPath,\n  } = findBlockAndChildFromPath(editor, patch.path)\n  if (!targetBlock || !targetBlockPath) {\n    debug('Block not found')\n    return false\n  }\n  if (patch.path.length > 1 && patch.path[1] !== 'children') {\n    debug('Ignoring patch targeting void value')\n    return false\n  }\n  // Insert blocks\n  if (patch.path.length === 1) {\n    const {items, position} = patch\n    const blocksToInsert = toSlateValue(\n      items as PortableTextBlock[],\n      {schemaTypes},\n      KEY_TO_SLATE_ELEMENT.get(editor),\n    ) as Descendant[]\n    const targetBlockIndex = targetBlockPath[0]\n    const normalizedIdx = position === 'after' ? targetBlockIndex + 1 : targetBlockIndex\n    debug(`Inserting blocks at path [${normalizedIdx}]`)\n    debugState(editor, 'before')\n    Transforms.insertNodes(editor, blocksToInsert, {at: [normalizedIdx]})\n    debugState(editor, 'after')\n    return true\n  }\n  // Insert children\n  const {items, position} = patch\n  if (!targetChild || !targetChildPath) {\n    debug('Child not found')\n    return false\n  }\n  const childrenToInsert =\n    targetBlock &&\n    toSlateValue(\n      [{...targetBlock, children: items as PortableTextChild[]}],\n      {schemaTypes},\n      KEY_TO_SLATE_ELEMENT.get(editor),\n    )\n  const targetChildIndex = targetChildPath[1]\n  const normalizedIdx = position === 'after' ? targetChildIndex + 1 : targetChildIndex\n  const childInsertPath = [targetChildPath[0], normalizedIdx]\n  debug(`Inserting children at path ${childInsertPath}`)\n  debugState(editor, 'before')\n  if (childrenToInsert && Element.isElement(childrenToInsert[0])) {\n    Transforms.insertNodes(editor, childrenToInsert[0].children, {at: childInsertPath})\n  }\n  debugState(editor, 'after')\n  return true\n}\n\nfunction setPatch(editor: PortableTextSlateEditor, patch: SetPatch) {\n  let value = patch.value\n  if (typeof patch.path[3] === 'string') {\n    value = {}\n    value[patch.path[3]] = patch.value\n  }\n  const {block, blockPath, child, childPath} = findBlockAndChildFromPath(editor, patch.path)\n\n  if (!block) {\n    debug('Block not found')\n    return false\n  }\n  const isTextBlock = editor.isTextBlock(block)\n\n  // Ignore patches targeting nested void data, like 'markDefs'\n  if (isTextBlock && patch.path.length > 1 && patch.path[1] !== 'children') {\n    debug('Ignoring setting void value')\n    return false\n  }\n\n  debugState(editor, 'before')\n\n  // If this is targeting a text block child\n  if (isTextBlock && child && childPath) {\n    if (Text.isText(value) && Text.isText(child)) {\n      const newText = child.text\n      const oldText = value.text\n      if (oldText !== newText) {\n        debug('Setting text property')\n        editor.apply({\n          type: 'remove_text',\n          path: childPath,\n          offset: 0,\n          text: newText,\n        })\n        editor.apply({\n          type: 'insert_text',\n          path: childPath,\n          offset: 0,\n          text: value.text,\n        })\n        // call OnChange here to emit the new selection\n        // the user's selection might be interfering with\n        editor.onChange()\n      }\n    } else {\n      debug('Setting non-text property')\n      editor.apply({\n        type: 'set_node',\n        path: childPath,\n        properties: {},\n        newProperties: value as Partial<Node>,\n      })\n    }\n    return true\n  } else if (Element.isElement(block) && patch.path.length === 1 && blockPath) {\n    debug('Setting block property')\n    const {children, ...nextRest} = value as unknown as PortableTextBlock\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars, unused-imports/no-unused-vars\n    const {children: prevChildren, ...prevRest} = block || {children: undefined}\n    // Set any block properties\n    editor.apply({\n      type: 'set_node',\n      path: blockPath,\n      properties: {...prevRest},\n      newProperties: nextRest,\n    })\n    // Replace the children in the block\n    // Note that children must be explicitly inserted, and can't be set with set_node\n    debug('Setting children')\n    block.children.forEach((c, cIndex) => {\n      editor.apply({\n        type: 'remove_node',\n        path: blockPath.concat(block.children.length - 1 - cIndex),\n        node: c,\n      })\n    })\n    if (Array.isArray(children)) {\n      children.forEach((c, cIndex) => {\n        editor.apply({\n          type: 'insert_node',\n          path: blockPath.concat(cIndex),\n          node: c,\n        })\n      })\n    }\n  } else if (block && 'value' in block) {\n    const newVal = applyAll([block.value], [patch])[0]\n    Transforms.setNodes(editor, {...block, value: newVal}, {at: blockPath})\n    return true\n  }\n  debugState(editor, 'after')\n  return true\n}\n\nfunction unsetPatch(editor: PortableTextSlateEditor, patch: UnsetPatch, previousPatch?: Patch) {\n  // Value\n  if (patch.path.length === 0) {\n    debug('Removing everything')\n    debugState(editor, 'before')\n    const previousSelection = editor.selection\n    Transforms.deselect(editor)\n    editor.children.forEach((c, i) => {\n      Transforms.removeNodes(editor, {at: [i]})\n    })\n    Transforms.insertNodes(editor, editor.pteCreateEmptyBlock())\n    if (previousSelection) {\n      Transforms.select(editor, {\n        anchor: {path: [0, 0], offset: 0},\n        focus: {path: [0, 0], offset: 0},\n      })\n    }\n    // call OnChange here to emit the new selection\n    editor.onChange()\n    debugState(editor, 'after')\n    return true\n  }\n  const {block, blockPath, child, childPath} = findBlockAndChildFromPath(editor, patch.path)\n\n  // Single blocks\n  if (patch.path.length === 1) {\n    if (!block || !blockPath) {\n      debug('Block not found')\n      return false\n    }\n    const blockIndex = blockPath[0]\n    debug(`Removing block at path [${blockIndex}]`)\n    debugState(editor, 'before')\n\n    Transforms.removeNodes(editor, {at: [blockIndex]})\n    debugState(editor, 'after')\n    return true\n  }\n\n  // Unset on text block children\n  if (editor.isTextBlock(block) && patch.path[1] === 'children' && patch.path.length === 3) {\n    if (!child || !childPath) {\n      debug('Child not found')\n      return false\n    }\n    debug(`Unsetting child at path ${JSON.stringify(childPath)}`)\n    debugState(editor, 'before')\n    if (debugVerbose) {\n      debug(`Removing child at path ${JSON.stringify(childPath)}`)\n    }\n    Transforms.removeNodes(editor, {at: childPath})\n    debugState(editor, 'after')\n    return true\n  }\n  return false\n}\n\nfunction isKeyedSegment(segment: PathSegment): segment is KeyedSegment {\n  return typeof segment === 'object' && '_key' in segment\n}\n\nfunction debugState(\n  editor: Pick<PortableTextSlateEditor, 'children' | 'isTextBlock' | 'apply' | 'selection'>,\n  stateName: string,\n) {\n  if (!debugVerbose) {\n    return\n  }\n\n  debug(`Children ${stateName}:`, JSON.stringify(editor.children, null, 2))\n  debug(`Selection ${stateName}: `, JSON.stringify(editor.selection, null, 2))\n}\n\nfunction findBlockFromPath(\n  editor: Pick<\n    PortableTextSlateEditor,\n    'children' | 'isTextBlock' | 'apply' | 'selection' | 'onChange'\n  >,\n  path: Path,\n): {block?: Descendant; path?: SlatePath} {\n  let blockIndex = -1\n  const block = editor.children.find((node: Descendant, index: number) => {\n    const isMatch = isKeyedSegment(path[0]) ? node._key === path[0]._key : index === path[0]\n    if (isMatch) {\n      blockIndex = index\n    }\n    return isMatch\n  })\n  if (!block) {\n    return {}\n  }\n  return {block, path: [blockIndex] as SlatePath}\n}\n\nfunction findBlockAndChildFromPath(\n  editor: Pick<\n    PortableTextSlateEditor,\n    'children' | 'isTextBlock' | 'apply' | 'selection' | 'onChange'\n  >,\n  path: Path,\n): {child?: Descendant; childPath?: SlatePath; block?: Descendant; blockPath?: SlatePath} {\n  const {block, path: blockPath} = findBlockFromPath(editor, path)\n  if (!(Element.isElement(block) && path[1] === 'children')) {\n    return {block, blockPath, child: undefined, childPath: undefined}\n  }\n  let childIndex = -1\n  const child = block.children.find((node, index: number) => {\n    const isMatch = isKeyedSegment(path[2]) ? node._key === path[2]._key : index === path[2]\n    if (isMatch) {\n      childIndex = index\n    }\n    return isMatch\n  })\n  if (!child) {\n    return {block, blockPath, child: undefined, childPath: undefined}\n  }\n  return {block, child, blockPath, childPath: blockPath?.concat(childIndex) as SlatePath}\n}\n","import {type Editor} from 'slate'\n\nimport {IS_PROCESSING_LOCAL_CHANGES, IS_PROCESSING_REMOTE_CHANGES} from './weakMaps'\n\nexport function withRemoteChanges(editor: Editor, fn: () => void): void {\n  const prev = isChangingRemotely(editor) || false\n  IS_PROCESSING_REMOTE_CHANGES.set(editor, true)\n  fn()\n  IS_PROCESSING_REMOTE_CHANGES.set(editor, prev)\n}\n\nexport function isChangingRemotely(editor: Editor): boolean | undefined {\n  return IS_PROCESSING_REMOTE_CHANGES.get(editor)\n}\n\nexport function withLocalChanges(editor: Editor, fn: () => void): void {\n  const prev = isChangingLocally(editor) || false\n  IS_PROCESSING_LOCAL_CHANGES.set(editor, true)\n  fn()\n  IS_PROCESSING_LOCAL_CHANGES.set(editor, prev)\n}\n\nexport function isChangingLocally(editor: Editor): boolean | undefined {\n  return IS_PROCESSING_LOCAL_CHANGES.get(editor)\n}\n","import {type Editor} from 'slate'\n\nexport const PATCHING: WeakMap<Editor, boolean | undefined> = new WeakMap()\n\nexport function withoutPatching(editor: Editor, fn: () => void): void {\n  const prev = isPatching(editor)\n  PATCHING.set(editor, false)\n  fn()\n  PATCHING.set(editor, prev)\n}\n\nexport function isPatching(editor: Editor): boolean | undefined {\n  return PATCHING.get(editor)\n}\n","/**\n * This plugin will make the editor support undo/redo on the local state only.\n * The undo/redo steps are rebased against incoming patches since the step occurred.\n */\n\nimport {DIFF_DELETE, DIFF_EQUAL, DIFF_INSERT, parsePatch} from '@sanity/diff-match-patch'\nimport {type ObjectSchemaType, type PortableTextBlock} from '@sanity/types'\nimport {flatten, isEqual} from 'lodash'\nimport {type Descendant, Editor, Operation, Path, type SelectionOperation, Transforms} from 'slate'\n\nimport {type PatchObservable, type PortableTextSlateEditor} from '../../types/editor'\nimport {type Patch} from '../../types/patch'\nimport {debugWithName} from '../../utils/debug'\nimport {fromSlateValue} from '../../utils/values'\nimport {withPreserveKeys} from '../../utils/withPreserveKeys'\n\nconst debug = debugWithName('plugin:withUndoRedo')\nconst debugVerbose = debug.enabled && false\n\nconst SAVING = new WeakMap<Editor, boolean | undefined>()\nconst REMOTE_PATCHES = new WeakMap<\n  Editor,\n  {\n    patch: Patch\n    time: Date\n    snapshot: PortableTextBlock[] | undefined\n    previousSnapshot: PortableTextBlock[] | undefined\n  }[]\n>()\nconst UNDO_STEP_LIMIT = 1000\n\nconst isSaving = (editor: Editor): boolean | undefined => {\n  const state = SAVING.get(editor)\n  return state === undefined ? true : state\n}\n\nexport interface Options {\n  patches$?: PatchObservable\n  readOnly: boolean\n  blockSchemaType: ObjectSchemaType\n}\n\nconst getRemotePatches = (editor: Editor) => {\n  if (!REMOTE_PATCHES.get(editor)) {\n    REMOTE_PATCHES.set(editor, [])\n  }\n  return REMOTE_PATCHES.get(editor) || []\n}\n\nexport function createWithUndoRedo(\n  options: Options,\n): (editor: PortableTextSlateEditor) => PortableTextSlateEditor {\n  const {readOnly, patches$, blockSchemaType} = options\n\n  return (editor: PortableTextSlateEditor) => {\n    let previousSnapshot: PortableTextBlock[] | undefined = fromSlateValue(\n      editor.children,\n      blockSchemaType.name,\n    )\n    const remotePatches = getRemotePatches(editor)\n    if (patches$) {\n      editor.subscriptions.push(() => {\n        debug('Subscribing to patches')\n        const sub = patches$.subscribe(({patches, snapshot}) => {\n          let reset = false\n          patches.forEach((patch) => {\n            if (!reset && patch.origin !== 'local' && remotePatches) {\n              if (patch.type === 'unset' && patch.path.length === 0) {\n                debug('Someone else cleared the content, resetting undo/redo history')\n                editor.history = {undos: [], redos: []}\n                remotePatches.splice(0, remotePatches.length)\n                SAVING.set(editor, true)\n                reset = true\n                return\n              }\n              remotePatches.push({patch, time: new Date(), snapshot, previousSnapshot})\n            }\n          })\n          previousSnapshot = snapshot\n        })\n        return () => {\n          debug('Unsubscribing to patches')\n          sub.unsubscribe()\n        }\n      })\n    }\n    editor.history = {undos: [], redos: []}\n    const {apply} = editor\n    editor.apply = (op: Operation) => {\n      if (readOnly) {\n        apply(op)\n        return\n      }\n      const {operations, history} = editor\n      const {undos} = history\n      const step = undos[undos.length - 1]\n      const lastOp = step && step.operations && step.operations[step.operations.length - 1]\n      const overwrite = shouldOverwrite(op, lastOp)\n      const save = isSaving(editor)\n\n      let merge = true\n      if (save) {\n        if (!step) {\n          merge = false\n        } else if (operations.length === 0) {\n          merge = shouldMerge(op, lastOp) || overwrite\n        }\n\n        if (step && merge) {\n          step.operations.push(op)\n        } else {\n          const newStep = {\n            operations: [...(editor.selection === null ? [] : [createSelectOperation(editor)]), op],\n            timestamp: new Date(),\n          }\n          undos.push(newStep)\n          debug('Created new undo step', step)\n        }\n\n        while (undos.length > UNDO_STEP_LIMIT) {\n          undos.shift()\n        }\n\n        if (shouldClear(op)) {\n          history.redos = []\n        }\n      }\n      apply(op)\n    }\n\n    editor.undo = () => {\n      if (readOnly) {\n        return\n      }\n      const {undos} = editor.history\n      if (undos.length > 0) {\n        const step = undos[undos.length - 1]\n        debug('Undoing', step)\n        if (step.operations.length > 0) {\n          const otherPatches = remotePatches.filter((item) => item.time >= step.timestamp)\n          let transformedOperations = step.operations\n          otherPatches.forEach((item) => {\n            transformedOperations = flatten(\n              transformedOperations.map((op) =>\n                transformOperation(editor, item.patch, op, item.snapshot, item.previousSnapshot),\n              ),\n            )\n          })\n          try {\n            Editor.withoutNormalizing(editor, () => {\n              withPreserveKeys(editor, () => {\n                withoutSaving(editor, () => {\n                  transformedOperations\n                    .map(Operation.inverse)\n                    .reverse()\n                    // eslint-disable-next-line max-nested-callbacks\n                    .forEach((op) => {\n                      editor.apply(op)\n                    })\n                })\n              })\n            })\n            editor.normalize()\n            editor.onChange()\n          } catch (err) {\n            debug('Could not perform undo step', err)\n            remotePatches.splice(0, remotePatches.length)\n            Transforms.deselect(editor)\n            editor.history = {undos: [], redos: []}\n            SAVING.set(editor, true)\n            editor.onChange()\n            return\n          }\n          editor.history.redos.push(step)\n          editor.history.undos.pop()\n        }\n      }\n    }\n\n    editor.redo = () => {\n      if (readOnly) {\n        return\n      }\n      const {redos} = editor.history\n      if (redos.length > 0) {\n        const step = redos[redos.length - 1]\n        debug('Redoing', step)\n        if (step.operations.length > 0) {\n          const otherPatches = remotePatches.filter((item) => item.time >= step.timestamp)\n          let transformedOperations = step.operations\n          otherPatches.forEach((item) => {\n            transformedOperations = flatten(\n              transformedOperations.map((op) =>\n                transformOperation(editor, item.patch, op, item.snapshot, item.previousSnapshot),\n              ),\n            )\n          })\n          try {\n            Editor.withoutNormalizing(editor, () => {\n              withPreserveKeys(editor, () => {\n                withoutSaving(editor, () => {\n                  // eslint-disable-next-line max-nested-callbacks\n                  transformedOperations.forEach((op) => {\n                    editor.apply(op)\n                  })\n                })\n              })\n            })\n            editor.normalize()\n            editor.onChange()\n          } catch (err) {\n            debug('Could not perform redo step', err)\n            remotePatches.splice(0, remotePatches.length)\n            Transforms.deselect(editor)\n            editor.history = {undos: [], redos: []}\n            SAVING.set(editor, true)\n            editor.onChange()\n            return\n          }\n          editor.history.undos.push(step)\n          editor.history.redos.pop()\n        }\n      }\n    }\n\n    // Plugin return\n    return editor\n  }\n}\n\n/**\n * This will adjust the operation paths and offsets according to the\n * remote patches by other editors since the step operations was performed.\n */\nfunction transformOperation(\n  editor: PortableTextSlateEditor,\n  patch: Patch,\n  operation: Operation,\n  snapshot: PortableTextBlock[] | undefined,\n  previousSnapshot: PortableTextBlock[] | undefined,\n): Operation[] {\n  if (debugVerbose) {\n    debug(`Adjusting '${operation.type}' operation paths for '${patch.type}' patch`)\n    debug(`Operation ${JSON.stringify(operation)}`)\n    debug(`Patch ${JSON.stringify(patch)}`)\n  }\n\n  const transformedOperation = {...operation}\n\n  if (patch.type === 'insert' && patch.path.length === 1) {\n    const insertBlockIndex = (snapshot || []).findIndex((blk) =>\n      isEqual({_key: blk._key}, patch.path[0]),\n    )\n    debug(\n      `Adjusting block path (+${patch.items.length}) for '${transformedOperation.type}' operation and patch '${patch.type}'`,\n    )\n    return [adjustBlockPath(transformedOperation, patch.items.length, insertBlockIndex)]\n  }\n\n  if (patch.type === 'unset' && patch.path.length === 1) {\n    const unsetBlockIndex = (previousSnapshot || []).findIndex((blk) =>\n      isEqual({_key: blk._key}, patch.path[0]),\n    )\n    // If this operation is targeting the same block that got removed, return empty\n    if (\n      'path' in transformedOperation &&\n      Array.isArray(transformedOperation.path) &&\n      transformedOperation.path[0] === unsetBlockIndex\n    ) {\n      debug('Skipping transformation that targeted removed block')\n      return []\n    }\n    if (debugVerbose) {\n      debug(`Selection ${JSON.stringify(editor.selection)}`)\n      debug(\n        `Adjusting block path (-1) for '${transformedOperation.type}' operation and patch '${patch.type}'`,\n      )\n    }\n    return [adjustBlockPath(transformedOperation, -1, unsetBlockIndex)]\n  }\n\n  // Someone reset the whole value\n  if (patch.type === 'unset' && patch.path.length === 0) {\n    debug(`Adjusting selection for unset everything patch and ${operation.type} operation`)\n    return []\n  }\n\n  if (patch.type === 'diffMatchPatch') {\n    const operationTargetBlock = findOperationTargetBlock(editor, transformedOperation)\n    if (!operationTargetBlock || !isEqual({_key: operationTargetBlock._key}, patch.path[0])) {\n      return [transformedOperation]\n    }\n    const diffPatches = parsePatch(patch.value)\n    diffPatches.forEach((diffPatch) => {\n      let adjustOffsetBy = 0\n      let changedOffset = diffPatch.utf8Start1\n      const {diffs} = diffPatch\n      diffs.forEach((diff, index) => {\n        const [diffType, text] = diff\n        if (diffType === DIFF_INSERT) {\n          adjustOffsetBy += text.length\n          changedOffset += text.length\n        } else if (diffType === DIFF_DELETE) {\n          adjustOffsetBy -= text.length\n          changedOffset -= text.length\n        } else if (diffType === DIFF_EQUAL) {\n          // Only up to the point where there are no other changes\n          if (!diffs.slice(index).every(([dType]) => dType === DIFF_EQUAL)) {\n            changedOffset += text.length\n          }\n        }\n      })\n      // Adjust accordingly if someone inserted text in the same node before us\n      if (transformedOperation.type === 'insert_text') {\n        if (changedOffset < transformedOperation.offset) {\n          transformedOperation.offset += adjustOffsetBy\n        }\n      }\n      // Adjust accordingly if someone removed text in the same node before us\n      if (transformedOperation.type === 'remove_text') {\n        if (changedOffset <= transformedOperation.offset - transformedOperation.text.length) {\n          transformedOperation.offset += adjustOffsetBy\n        }\n      }\n      // Adjust set_selection operation's points to new offset\n      if (transformedOperation.type === 'set_selection') {\n        const currentFocus = transformedOperation.properties?.focus\n          ? {...transformedOperation.properties.focus}\n          : undefined\n        const currentAnchor = transformedOperation?.properties?.anchor\n          ? {...transformedOperation.properties.anchor}\n          : undefined\n        const newFocus = transformedOperation?.newProperties?.focus\n          ? {...transformedOperation.newProperties.focus}\n          : undefined\n        const newAnchor = transformedOperation?.newProperties?.anchor\n          ? {...transformedOperation.newProperties.anchor}\n          : undefined\n        if ((currentFocus && currentAnchor) || (newFocus && newAnchor)) {\n          const points = [currentFocus, currentAnchor, newFocus, newAnchor]\n          points.forEach((point) => {\n            if (point && changedOffset < point.offset) {\n              point.offset += adjustOffsetBy\n            }\n          })\n          if (currentFocus && currentAnchor) {\n            transformedOperation.properties = {\n              focus: currentFocus,\n              anchor: currentAnchor,\n            }\n          }\n          if (newFocus && newAnchor) {\n            transformedOperation.newProperties = {\n              focus: newFocus,\n              anchor: newAnchor,\n            }\n          }\n        }\n      }\n    })\n    return [transformedOperation]\n  }\n  return [transformedOperation]\n}\n/**\n * Adjust the block path for a operation\n */\nfunction adjustBlockPath(operation: Operation, level: number, blockIndex: number): Operation {\n  const transformedOperation = {...operation}\n  if (\n    blockIndex >= 0 &&\n    transformedOperation.type !== 'set_selection' &&\n    Array.isArray(transformedOperation.path) &&\n    transformedOperation.path[0] >= blockIndex + level &&\n    transformedOperation.path[0] + level > -1\n  ) {\n    const newPath = [transformedOperation.path[0] + level, ...transformedOperation.path.slice(1)]\n    transformedOperation.path = newPath\n  }\n  if (transformedOperation.type === 'set_selection') {\n    const currentFocus = transformedOperation.properties?.focus\n      ? {...transformedOperation.properties.focus}\n      : undefined\n    const currentAnchor = transformedOperation?.properties?.anchor\n      ? {...transformedOperation.properties.anchor}\n      : undefined\n    const newFocus = transformedOperation?.newProperties?.focus\n      ? {...transformedOperation.newProperties.focus}\n      : undefined\n    const newAnchor = transformedOperation?.newProperties?.anchor\n      ? {...transformedOperation.newProperties.anchor}\n      : undefined\n    if ((currentFocus && currentAnchor) || (newFocus && newAnchor)) {\n      const points = [currentFocus, currentAnchor, newFocus, newAnchor]\n      points.forEach((point) => {\n        if (point && point.path[0] >= blockIndex + level && point.path[0] + level > -1) {\n          point.path = [point.path[0] + level, ...point.path.slice(1)]\n        }\n      })\n      if (currentFocus && currentAnchor) {\n        transformedOperation.properties = {\n          focus: currentFocus,\n          anchor: currentAnchor,\n        }\n      }\n      if (newFocus && newAnchor) {\n        transformedOperation.newProperties = {\n          focus: newFocus,\n          anchor: newAnchor,\n        }\n      }\n    }\n  }\n  //   // Assign fresh point objects (we don't want to mutate the original ones)\n  return transformedOperation\n}\n\n// Helper functions for editor.apply above\n\nconst shouldMerge = (op: Operation, prev: Operation | undefined): boolean => {\n  if (op.type === 'set_selection') {\n    return true\n  }\n\n  // Text input\n  if (\n    prev &&\n    op.type === 'insert_text' &&\n    prev.type === 'insert_text' &&\n    op.offset === prev.offset + prev.text.length &&\n    Path.equals(op.path, prev.path) &&\n    op.text !== ' ' // Tokenize between words\n  ) {\n    return true\n  }\n\n  // Text deletion\n  if (\n    prev &&\n    op.type === 'remove_text' &&\n    prev.type === 'remove_text' &&\n    op.offset + op.text.length === prev.offset &&\n    Path.equals(op.path, prev.path)\n  ) {\n    return true\n  }\n\n  // Don't merge\n  return false\n}\n\nconst shouldOverwrite = (op: Operation, prev: Operation | undefined): boolean => {\n  if (prev && op.type === 'set_selection' && prev.type === 'set_selection') {\n    return true\n  }\n\n  return false\n}\n\nconst shouldClear = (op: Operation): boolean => {\n  if (op.type === 'set_selection') {\n    return false\n  }\n\n  return true\n}\n\nexport function withoutSaving(editor: Editor, fn: () => void): void {\n  const prev = isSaving(editor)\n  SAVING.set(editor, false)\n  fn()\n  SAVING.set(editor, prev)\n}\n\nfunction createSelectOperation(editor: Editor): SelectionOperation {\n  return {\n    type: 'set_selection',\n    properties: {...editor.selection},\n    newProperties: {...editor.selection},\n  }\n}\n\nfunction findOperationTargetBlock(\n  editor: PortableTextSlateEditor,\n  operation: Operation,\n): Descendant | undefined {\n  let block: Descendant | undefined\n  if (operation.type === 'set_selection' && editor.selection) {\n    block = editor.children[editor.selection.focus.path[0]]\n  } else if ('path' in operation) {\n    block = editor.children[operation.path[0]]\n  }\n  return block\n}\n","/* eslint-disable max-nested-callbacks */\nimport {type Subject} from 'rxjs'\nimport {\n  type Descendant,\n  Editor,\n  type InsertNodeOperation,\n  type InsertTextOperation,\n  type MergeNodeOperation,\n  type MoveNodeOperation,\n  type Operation,\n  type RemoveNodeOperation,\n  type RemoveTextOperation,\n  type SetNodeOperation,\n  type SplitNodeOperation,\n} from 'slate'\n\nimport {insert, setIfMissing, unset} from '../../patch/PatchEvent'\nimport {\n  type EditorChange,\n  type PatchObservable,\n  type PortableTextMemberSchemaTypes,\n  type PortableTextSlateEditor,\n} from '../../types/editor'\nimport {type Patch} from '../../types/patch'\nimport {createApplyPatch} from '../../utils/applyPatch'\nimport {debugWithName} from '../../utils/debug'\nimport {fromSlateValue, isEqualToEmptyEditor} from '../../utils/values'\nimport {IS_PROCESSING_REMOTE_CHANGES, KEY_TO_VALUE_ELEMENT} from '../../utils/weakMaps'\nimport {withRemoteChanges} from '../../utils/withChanges'\nimport {isPatching, PATCHING, withoutPatching} from '../../utils/withoutPatching'\nimport {withPreserveKeys} from '../../utils/withPreserveKeys'\nimport {withoutSaving} from './createWithUndoRedo'\n\nconst debug = debugWithName('plugin:withPatches')\nconst debugVerbose = false\n\nexport interface PatchFunctions {\n  insertNodePatch: (\n    editor: PortableTextSlateEditor,\n    operation: InsertNodeOperation,\n    previousChildren: Descendant[],\n  ) => Patch[]\n  insertTextPatch: (\n    editor: PortableTextSlateEditor,\n    operation: InsertTextOperation,\n    previousChildren: Descendant[],\n  ) => Patch[]\n  mergeNodePatch: (\n    editor: PortableTextSlateEditor,\n    operation: MergeNodeOperation,\n    previousChildren: Descendant[],\n  ) => Patch[]\n  moveNodePatch: (\n    editor: PortableTextSlateEditor,\n    operation: MoveNodeOperation,\n    previousChildren: Descendant[],\n  ) => Patch[]\n  removeNodePatch: (\n    editor: PortableTextSlateEditor,\n    operation: RemoveNodeOperation,\n    previousChildren: Descendant[],\n  ) => Patch[]\n  removeTextPatch: (\n    editor: PortableTextSlateEditor,\n    operation: RemoveTextOperation,\n    previousChildren: Descendant[],\n  ) => Patch[]\n  setNodePatch: (\n    editor: PortableTextSlateEditor,\n    operation: SetNodeOperation,\n    previousChildren: Descendant[],\n  ) => Patch[]\n  splitNodePatch: (\n    editor: PortableTextSlateEditor,\n    operation: SplitNodeOperation,\n    previousChildren: Descendant[],\n  ) => Patch[]\n}\n\ninterface Options {\n  change$: Subject<EditorChange>\n  keyGenerator: () => string\n  patches$?: PatchObservable\n  patchFunctions: PatchFunctions\n  readOnly: boolean\n  schemaTypes: PortableTextMemberSchemaTypes\n}\n\nexport function createWithPatches({\n  change$,\n  patches$,\n  patchFunctions,\n  readOnly,\n  schemaTypes,\n}: Options): (editor: PortableTextSlateEditor) => PortableTextSlateEditor {\n  // The previous editor children are needed to figure out the _key of deleted nodes\n  // The editor.children would no longer contain that information if the node is already deleted.\n  let previousChildren: Descendant[]\n\n  const applyPatch = createApplyPatch(schemaTypes)\n\n  return function withPatches(editor: PortableTextSlateEditor) {\n    IS_PROCESSING_REMOTE_CHANGES.set(editor, false)\n    PATCHING.set(editor, true)\n    previousChildren = [...editor.children]\n\n    const {apply} = editor\n    let bufferedPatches: Patch[] = []\n\n    const handleBufferedRemotePatches = () => {\n      if (bufferedPatches.length === 0) {\n        return\n      }\n      const patches = bufferedPatches\n      bufferedPatches = []\n      let changed = false\n      withRemoteChanges(editor, () => {\n        Editor.withoutNormalizing(editor, () => {\n          withoutPatching(editor, () => {\n            withoutSaving(editor, () => {\n              withPreserveKeys(editor, () => {\n                patches.forEach((patch) => {\n                  if (debug.enabled) debug(`Handling remote patch ${JSON.stringify(patch)}`)\n                  changed = applyPatch(editor, patch)\n                })\n              })\n            })\n          })\n        })\n        if (changed) {\n          editor.normalize()\n          editor.onChange()\n        }\n      })\n    }\n\n    const handlePatches = ({patches}: {patches: Patch[]}) => {\n      const remotePatches = patches.filter((p) => p.origin !== 'local')\n      if (remotePatches.length === 0) {\n        return\n      }\n      bufferedPatches = bufferedPatches.concat(remotePatches)\n      handleBufferedRemotePatches()\n    }\n\n    if (patches$) {\n      editor.subscriptions.push(() => {\n        debug('Subscribing to patches$')\n        const sub = patches$.subscribe(handlePatches)\n        return () => {\n          debug('Unsubscribing to patches$')\n          sub.unsubscribe()\n        }\n      })\n    }\n\n    editor.apply = (operation: Operation): void | Editor => {\n      if (readOnly) {\n        apply(operation)\n        return editor\n      }\n      let patches: Patch[] = []\n\n      // Update previous children here before we apply\n      previousChildren = editor.children\n\n      const editorWasEmpty = isEqualToEmptyEditor(previousChildren, schemaTypes)\n\n      // Apply the operation\n      apply(operation)\n\n      const editorIsEmpty = isEqualToEmptyEditor(editor.children, schemaTypes)\n\n      if (!isPatching(editor)) {\n        if (debugVerbose && debug.enabled)\n          debug(`Editor is not producing patch for operation ${operation.type}`, operation)\n        return editor\n      }\n\n      // If the editor was empty and now isn't, insert the placeholder into it.\n      if (editorWasEmpty && !editorIsEmpty && operation.type !== 'set_selection') {\n        patches.push(insert(previousChildren, 'before', [0]))\n      }\n\n      switch (operation.type) {\n        case 'insert_text':\n          patches = [\n            ...patches,\n            ...patchFunctions.insertTextPatch(editor, operation, previousChildren),\n          ]\n          break\n        case 'remove_text':\n          patches = [\n            ...patches,\n            ...patchFunctions.removeTextPatch(editor, operation, previousChildren),\n          ]\n          break\n        case 'remove_node':\n          patches = [\n            ...patches,\n            ...patchFunctions.removeNodePatch(editor, operation, previousChildren),\n          ]\n          break\n        case 'split_node':\n          patches = [\n            ...patches,\n            ...patchFunctions.splitNodePatch(editor, operation, previousChildren),\n          ]\n          break\n        case 'insert_node':\n          patches = [\n            ...patches,\n            ...patchFunctions.insertNodePatch(editor, operation, previousChildren),\n          ]\n          break\n        case 'set_node':\n          patches = [\n            ...patches,\n            ...patchFunctions.setNodePatch(editor, operation, previousChildren),\n          ]\n          break\n        case 'merge_node':\n          patches = [\n            ...patches,\n            ...patchFunctions.mergeNodePatch(editor, operation, previousChildren),\n          ]\n          break\n        case 'move_node':\n          patches = [\n            ...patches,\n            ...patchFunctions.moveNodePatch(editor, operation, previousChildren),\n          ]\n          break\n        case 'set_selection':\n        default:\n        // Do nothing\n      }\n\n      // Unset the value if a operation made the editor empty\n      if (\n        !editorWasEmpty &&\n        editorIsEmpty &&\n        ['merge_node', 'set_node', 'remove_text', 'remove_node'].includes(operation.type)\n      ) {\n        patches = [...patches, unset([])]\n        change$.next({\n          type: 'unset',\n          previousValue: fromSlateValue(\n            previousChildren,\n            schemaTypes.block.name,\n            KEY_TO_VALUE_ELEMENT.get(editor),\n          ),\n        })\n      }\n\n      // Prepend patches with setIfMissing if going from empty editor to something involving a patch.\n      if (editorWasEmpty && patches.length > 0) {\n        patches = [setIfMissing([], []), ...patches]\n      }\n\n      // Emit all patches\n      if (patches.length > 0) {\n        patches.forEach((patch) => {\n          change$.next({\n            type: 'patch',\n            patch: {...patch, origin: 'local'},\n          })\n        })\n      }\n      return editor\n    }\n    return editor\n  }\n}\n","import {Editor, Path} from 'slate'\n\nimport {type PortableTextSlateEditor} from '../../types/editor'\nimport {type SlateTextBlock, type VoidElement} from '../../types/slate'\nimport {debugWithName} from '../../utils/debug'\n\nconst debug = debugWithName('plugin:withPlaceholderBlock')\n\n/**\n * Keep a \"placeholder\" block present when the editor is empty\n *\n */\nexport function createWithPlaceholderBlock(): (\n  editor: PortableTextSlateEditor,\n) => PortableTextSlateEditor {\n  return function withPlaceholderBlock(editor: PortableTextSlateEditor): PortableTextSlateEditor {\n    const {apply} = editor\n\n    editor.apply = (op) => {\n      if (op.type === 'remove_node') {\n        const node = op.node as SlateTextBlock | VoidElement\n        if (op.path[0] === 0 && Editor.isVoid(editor, node)) {\n          // Check next path, if it exists, do nothing\n          const nextPath = Path.next(op.path)\n          // Is removing the first block which is a void (not a text block), add a new empty text block in it, if there is no other element in the next path\n          if (!editor.children[nextPath[0]]) {\n            debug('Adding placeholder block')\n            Editor.insertNode(editor, editor.pteCreateEmptyBlock())\n          }\n        }\n      }\n      apply(op)\n    }\n    return editor\n  }\n}\n","import {Editor, type Node, Path, Text as SlateText, Transforms} from 'slate'\n\nimport {type PortableTextMemberSchemaTypes, type PortableTextSlateEditor} from '../../types/editor'\nimport {debugWithName} from '../../utils/debug'\n\nconst debug = debugWithName('plugin:withPortableTextBlockStyle')\n\nexport function createWithPortableTextBlockStyle(\n  types: PortableTextMemberSchemaTypes,\n): (editor: PortableTextSlateEditor) => PortableTextSlateEditor {\n  const defaultStyle = types.styles[0].value\n  return function withPortableTextBlockStyle(\n    editor: PortableTextSlateEditor,\n  ): PortableTextSlateEditor {\n    // Extend Slate's default normalization to reset split node to normal style\n    // if there is no text at the right end of the split.\n    const {normalizeNode} = editor\n    editor.normalizeNode = (nodeEntry) => {\n      normalizeNode(nodeEntry)\n      const [, path] = nodeEntry\n      for (const op of editor.operations) {\n        if (\n          op.type === 'split_node' &&\n          op.path.length === 1 &&\n          editor.isTextBlock(op.properties) &&\n          op.properties.style !== defaultStyle &&\n          op.path[0] === path[0] &&\n          !Path.equals(path, op.path)\n        ) {\n          const [child] = Editor.node(editor, [op.path[0] + 1, 0])\n          if (SlateText.isText(child) && child.text === '') {\n            debug(`Normalizing split node to ${defaultStyle} style`, op)\n            Transforms.setNodes(editor, {style: defaultStyle}, {at: [op.path[0] + 1], voids: false})\n            break\n          }\n        }\n      }\n    }\n    editor.pteHasBlockStyle = (style: string): boolean => {\n      if (!editor.selection) {\n        return false\n      }\n      const selectedBlocks = [\n        ...Editor.nodes(editor, {\n          at: editor.selection,\n          match: (node) => editor.isTextBlock(node) && node.style === style,\n        }),\n      ]\n      if (selectedBlocks.length > 0) {\n        return true\n      }\n      return false\n    }\n\n    editor.pteToggleBlockStyle = (blockStyle: string): void => {\n      if (!editor.selection) {\n        return\n      }\n      const selectedBlocks = [\n        ...Editor.nodes(editor, {\n          at: editor.selection,\n          match: (node) => editor.isTextBlock(node),\n        }),\n      ]\n      selectedBlocks.forEach(([node, path]) => {\n        if (editor.isTextBlock(node) && node.style === blockStyle) {\n          debug(`Unsetting block style '${blockStyle}'`)\n          Transforms.setNodes(editor, {...node, style: defaultStyle} as Partial<Node>, {\n            at: path,\n          })\n        } else {\n          if (blockStyle) {\n            debug(`Setting style '${blockStyle}'`)\n          } else {\n            debug('Setting default style', defaultStyle)\n          }\n          Transforms.setNodes(\n            editor,\n            {\n              ...node,\n              style: blockStyle || defaultStyle,\n            } as Partial<Node>,\n            {at: path},\n          )\n        }\n      })\n      editor.onChange()\n    }\n    return editor\n  }\n}\n","import {Editor, Element, type Node, Text, Transforms} from 'slate'\n\nimport {type PortableTextMemberSchemaTypes, type PortableTextSlateEditor} from '../../types/editor'\nimport {debugWithName} from '../../utils/debug'\n\nconst debug = debugWithName('plugin:withPortableTextLists')\nconst MAX_LIST_LEVEL = 10\n\nexport function createWithPortableTextLists(types: PortableTextMemberSchemaTypes) {\n  return function withPortableTextLists(editor: PortableTextSlateEditor): PortableTextSlateEditor {\n    editor.pteToggleListItem = (listItemStyle: string) => {\n      const isActive = editor.pteHasListStyle(listItemStyle)\n      if (isActive) {\n        debug(`Remove list item '${listItemStyle}'`)\n        editor.pteUnsetListItem(listItemStyle)\n      } else {\n        debug(`Add list item '${listItemStyle}'`)\n        editor.pteSetListItem(listItemStyle)\n      }\n    }\n\n    editor.pteUnsetListItem = (listItemStyle: string) => {\n      if (!editor.selection) {\n        return\n      }\n      const selectedBlocks = [\n        ...Editor.nodes(editor, {\n          at: editor.selection,\n          match: (node) => Element.isElement(node) && node._type === types.block.name,\n        }),\n      ]\n      selectedBlocks.forEach(([node, path]) => {\n        if (editor.isListBlock(node)) {\n          // eslint-disable-next-line @typescript-eslint/no-unused-vars\n          const {listItem, level, ...rest} = node\n          const newNode = {\n            ...rest,\n            listItem: undefined,\n            level: undefined,\n          } as Partial<Node>\n          debug(`Unsetting list '${listItemStyle}'`)\n          Transforms.setNodes(editor, newNode, {at: path})\n        }\n      })\n    }\n\n    editor.pteSetListItem = (listItemStyle: string) => {\n      if (!editor.selection) {\n        return\n      }\n      const selectedBlocks = [\n        ...Editor.nodes(editor, {\n          at: editor.selection,\n          match: (node) => editor.isTextBlock(node),\n        }),\n      ]\n      selectedBlocks.forEach(([node, path]) => {\n        debug(`Setting list '${listItemStyle}'`)\n        Transforms.setNodes(\n          editor,\n          {\n            ...node,\n            level: 1,\n            listItem: listItemStyle || (types.lists[0] && types.lists[0].value),\n          } as Partial<Node>,\n          {at: path},\n        )\n      })\n    }\n\n    editor.pteEndList = () => {\n      if (!editor.selection) {\n        return false\n      }\n      const selectedBlocks = [\n        ...Editor.nodes(editor, {\n          at: editor.selection,\n          match: (node) =>\n            Element.isElement(node) &&\n            editor.isListBlock(node) &&\n            node.children.length === 1 &&\n            Text.isText(node.children[0]) &&\n            node.children[0].text === '',\n        }),\n      ]\n      if (selectedBlocks.length === 0) {\n        return false\n      }\n      selectedBlocks.forEach(([node, path]) => {\n        if (Element.isElement(node)) {\n          debug('Unset list')\n          Transforms.setNodes(\n            editor,\n            {\n              ...node,\n              level: undefined,\n              listItem: undefined,\n            },\n            {at: path},\n          )\n        }\n      })\n      return true // Note: we are exiting the plugin chain by not returning editor (or hotkey plugin 'enter' will fire)\n    }\n\n    editor.pteIncrementBlockLevels = (reverse?: boolean): boolean => {\n      if (!editor.selection) {\n        return false\n      }\n      const selectedBlocks = [\n        ...Editor.nodes(editor, {\n          at: editor.selection,\n          match: (node) => !!editor.isListBlock(node),\n        }),\n      ]\n      if (selectedBlocks.length === 0) {\n        return false\n      }\n      selectedBlocks.forEach(([node, path]) => {\n        if (editor.isListBlock(node)) {\n          let level = node.level || 1\n          if (reverse) {\n            level--\n            debug('Decrementing list level', Math.min(MAX_LIST_LEVEL, Math.max(1, level)))\n          } else {\n            level++\n            debug('Incrementing list level', Math.min(MAX_LIST_LEVEL, Math.max(1, level)))\n          }\n          Transforms.setNodes(\n            editor,\n            {level: Math.min(MAX_LIST_LEVEL, Math.max(1, level))},\n            {at: path},\n          )\n        }\n      })\n      return true\n    }\n\n    editor.pteHasListStyle = (listStyle: string): boolean => {\n      if (!editor.selection) {\n        return false\n      }\n      const selectedBlocks = [\n        ...Editor.nodes(editor, {\n          at: editor.selection,\n          match: (node) => editor.isTextBlock(node),\n        }),\n      ]\n\n      if (selectedBlocks.length > 0) {\n        return selectedBlocks.every(\n          ([node]) => editor.isListBlock(node) && node.listItem === listStyle,\n        )\n      }\n      return false\n    }\n\n    return editor\n  }\n}\n","/* eslint-disable max-statements */\n/* eslint-disable complexity */\n/**\n *\n * This plugin will change Slate's default marks model (every prop is a mark) with the Portable Text model (marks is an array of strings on prop .marks).\n *\n */\n\nimport {isEqual, uniq} from 'lodash'\nimport {type Subject} from 'rxjs'\nimport {type Descendant, Editor, Element, Path, Range, Text, Transforms} from 'slate'\n\nimport {\n  type EditorChange,\n  type PortableTextMemberSchemaTypes,\n  type PortableTextSlateEditor,\n} from '../../types/editor'\nimport {debugWithName} from '../../utils/debug'\nimport {toPortableTextRange} from '../../utils/ranges'\nimport {EMPTY_MARKS} from '../../utils/values'\n\nconst debug = debugWithName('plugin:withPortableTextMarkModel')\n\nexport function createWithPortableTextMarkModel(\n  types: PortableTextMemberSchemaTypes,\n  change$: Subject<EditorChange>,\n): (editor: PortableTextSlateEditor) => PortableTextSlateEditor {\n  return function withPortableTextMarkModel(editor: PortableTextSlateEditor) {\n    const {apply, normalizeNode} = editor\n    const decorators = types.decorators.map((t) => t.value)\n\n    // Selections are normally emitted automatically via\n    // onChange, but they will keep the object reference if\n    // the selection is the same as the previous.\n    // When toggling marks however, it might not even\n    // result in a onChange event (for instance when nothing is selected),\n    // and if you toggle marks on a block with one single span,\n    // the selection would also stay the same.\n    // We should force a new selection object here when toggling marks,\n    // because toolbars and other things can very conveniently\n    // be memo'ed on the editor selection to update itself.\n    const forceNewSelection = () => {\n      if (editor.selection) {\n        Transforms.select(editor, {...editor.selection})\n        editor.selection = {...editor.selection} // Ensure new object\n      }\n      const ptRange = toPortableTextRange(editor.children, editor.selection, types)\n      change$.next({type: 'selection', selection: ptRange})\n    }\n\n    // Extend Slate's default normalization. Merge spans with same set of .marks when doing merge_node operations, and clean up markDefs / marks\n    editor.normalizeNode = (nodeEntry) => {\n      normalizeNode(nodeEntry)\n      if (\n        editor.operations.some((op) =>\n          [\n            'insert_node',\n            'insert_text',\n            'merge_node',\n            'remove_node',\n            'remove_text',\n            'set_node',\n          ].includes(op.type),\n        )\n      ) {\n        mergeSpans(editor)\n      }\n      const [node, path] = nodeEntry\n      const isSpan = Text.isText(node) && node._type === types.span.name\n      const isTextBlock = editor.isTextBlock(node)\n      if (isSpan || isTextBlock) {\n        if (isSpan && !Array.isArray(node.marks)) {\n          debug('Adding .marks to span node')\n          Transforms.setNodes(editor, {marks: []}, {at: path})\n          editor.onChange()\n        }\n        const hasSpanMarks = isSpan && (node.marks || []).length > 0\n        if (hasSpanMarks) {\n          const spanMarks = node.marks || EMPTY_MARKS\n          // Test that every annotation mark used has a definition in markDefs\n          const annotationMarks = spanMarks.filter(\n            (mark) => !types.decorators.map((dec) => dec.value).includes(mark),\n          )\n          if (annotationMarks.length > 0) {\n            const [block] = Editor.node(editor, Path.parent(path))\n            const orphanedMarks =\n              (editor.isTextBlock(block) &&\n                annotationMarks.filter(\n                  (mark) => !block.markDefs?.find((def) => def._key === mark),\n                )) ||\n              []\n            if (orphanedMarks.length > 0) {\n              debug('Removing orphaned .marks from span node')\n              Transforms.setNodes(\n                editor,\n                {marks: spanMarks.filter((mark) => !orphanedMarks.includes(mark))},\n                {at: path},\n              )\n              editor.onChange()\n            }\n          }\n        }\n        for (const op of editor.operations) {\n          // Make sure markDefs are copied over when merging two blocks.\n          if (\n            op.type === 'merge_node' &&\n            op.path.length === 1 &&\n            'markDefs' in op.properties &&\n            op.properties._type === types.block.name &&\n            Array.isArray(op.properties.markDefs) &&\n            op.properties.markDefs.length > 0 &&\n            op.path[0] - 1 >= 0\n          ) {\n            const [targetBlock, targetPath] = Editor.node(editor, [op.path[0] - 1])\n            debug(`Copying markDefs over to merged block`, op)\n            if (editor.isTextBlock(targetBlock)) {\n              const oldDefs = (Array.isArray(targetBlock.markDefs) && targetBlock.markDefs) || []\n              const newMarkDefs = uniq([...oldDefs, ...op.properties.markDefs])\n              const isNormalized = isEqual(newMarkDefs, targetBlock.markDefs)\n              // eslint-disable-next-line max-depth\n              if (!isNormalized) {\n                Transforms.setNodes(editor, {markDefs: newMarkDefs}, {at: targetPath, voids: false})\n                editor.onChange()\n              }\n            }\n          }\n          // Make sure markDefs are copied over to new block when splitting a block.\n          if (\n            op.type === 'split_node' &&\n            op.path.length === 1 &&\n            Element.isElementProps(op.properties) &&\n            op.properties._type === types.block.name &&\n            'markDefs' in op.properties &&\n            Array.isArray(op.properties.markDefs) &&\n            op.properties.markDefs.length > 0 &&\n            op.path[0] + 1 < editor.children.length\n          ) {\n            const [targetBlock, targetPath] = Editor.node(editor, [op.path[0] + 1])\n            debug(`Copying markDefs over to split block`, op)\n            if (editor.isTextBlock(targetBlock)) {\n              const oldDefs = (Array.isArray(targetBlock.markDefs) && targetBlock.markDefs) || []\n              Transforms.setNodes(\n                editor,\n                {markDefs: uniq([...oldDefs, ...op.properties.markDefs])},\n                {at: targetPath, voids: false},\n              )\n              editor.onChange()\n            }\n          }\n          // Make sure marks are reset, if a block is split at the end.\n          if (\n            op.type === 'split_node' &&\n            op.path.length === 2 &&\n            (op.properties as unknown as Descendant)._type === types.span.name &&\n            'marks' in op.properties &&\n            Array.isArray(op.properties.marks) &&\n            op.properties.marks.length > 0 &&\n            op.path[0] + 1 < editor.children.length\n          ) {\n            const [child, childPath] = Editor.node(editor, [op.path[0] + 1, 0])\n            if (\n              Text.isText(child) &&\n              child.text === '' &&\n              Array.isArray(child.marks) &&\n              child.marks.length > 0\n            ) {\n              Transforms.setNodes(editor, {marks: []}, {at: childPath, voids: false})\n              editor.onChange()\n            }\n          }\n          // Make sure markDefs are reset, if a block is split at start.\n          if (\n            op.type === 'split_node' &&\n            op.path.length === 1 &&\n            (op.properties as unknown as Descendant)._type === types.block.name &&\n            'markDefs' in op.properties &&\n            Array.isArray(op.properties.markDefs) &&\n            op.properties.markDefs.length > 0\n          ) {\n            const [block, blockPath] = Editor.node(editor, [op.path[0]])\n            if (\n              editor.isTextBlock(block) &&\n              block.children.length === 1 &&\n              block.markDefs &&\n              block.markDefs.length > 0 &&\n              Text.isText(block.children[0]) &&\n              block.children[0].text === '' &&\n              (!block.children[0].marks || block.children[0].marks.length === 0)\n            ) {\n              Transforms.setNodes(editor, {markDefs: []}, {at: blockPath})\n              editor.onChange()\n            }\n          }\n        }\n        // Empty marks if text is empty\n        if (\n          isSpan &&\n          Array.isArray(node.marks) &&\n          (!node.marks || (node.marks.length > 0 && node.text === ''))\n        ) {\n          Transforms.setNodes(editor, {marks: []}, {at: path, voids: false})\n          editor.onChange()\n        }\n      }\n      // Check consistency of markDefs (unless we are merging two nodes)\n      if (\n        editor.isTextBlock(node) &&\n        !editor.operations.some(\n          (op) => op.type === 'merge_node' && 'markDefs' in op.properties && op.path.length === 1,\n        )\n      ) {\n        const newMarkDefs = (node.markDefs || []).filter((def) => {\n          return node.children.find((child) => {\n            return (\n              Text.isText(child) && Array.isArray(child.marks) && child.marks.includes(def._key)\n            )\n          })\n        })\n        if (node.markDefs && !isEqual(newMarkDefs, node.markDefs)) {\n          debug('Removing markDef not in use')\n          Transforms.setNodes(\n            editor,\n            {\n              markDefs: newMarkDefs,\n            },\n            {at: path},\n          )\n          editor.onChange()\n        }\n      }\n    }\n\n    // Special hook before inserting text at the end of an annotation.\n    editor.apply = (op) => {\n      if (op.type === 'insert_text') {\n        const {selection} = editor\n        if (\n          selection &&\n          Range.isCollapsed(selection) &&\n          Editor.marks(editor)?.marks?.some((mark) => !decorators.includes(mark))\n        ) {\n          const [node] = Array.from(\n            Editor.nodes(editor, {\n              mode: 'lowest',\n              at: selection.focus,\n              match: (n) => (n as unknown as Descendant)._type === types.span.name,\n              voids: false,\n            }),\n          )[0] || [undefined]\n          if (\n            Text.isText(node) &&\n            node.text.length === selection.focus.offset &&\n            Array.isArray(node.marks) &&\n            node.marks.length > 0\n          ) {\n            apply(op)\n            Transforms.splitNodes(editor, {\n              match: Text.isText,\n              at: {...selection.focus, offset: selection.focus.offset},\n            })\n            const marksWithoutAnnotationMarks: string[] = (\n              {\n                ...(Editor.marks(editor) || {}),\n              }.marks || []\n            ).filter((mark) => decorators.includes(mark))\n            Transforms.setNodes(\n              editor,\n              {marks: marksWithoutAnnotationMarks},\n              {at: Path.next(selection.focus.path)},\n            )\n            debug('Inserting text at end of annotation')\n            return\n          }\n        }\n      }\n      apply(op)\n    }\n\n    // Override built in addMark function\n    editor.addMark = (mark: string) => {\n      if (editor.selection) {\n        if (Range.isExpanded(editor.selection)) {\n          // Split if needed\n          Transforms.setNodes(editor, {}, {match: Text.isText, split: true})\n          // Use new selection\n          const splitTextNodes = [\n            ...Editor.nodes(editor, {at: editor.selection, match: Text.isText}),\n          ]\n          const shouldRemoveMark = splitTextNodes.every((node) => node[0].marks?.includes(mark))\n\n          if (shouldRemoveMark) {\n            editor.removeMark(mark)\n            return editor\n          }\n          Editor.withoutNormalizing(editor, () => {\n            splitTextNodes.forEach(([node, path]) => {\n              const marks = [\n                ...(Array.isArray(node.marks) ? node.marks : []).filter(\n                  (eMark: string) => eMark !== mark,\n                ),\n                mark,\n              ]\n              Transforms.setNodes(\n                editor,\n                {marks},\n                {at: path, match: Text.isText, split: true, hanging: true},\n              )\n            })\n          })\n          Editor.normalize(editor)\n        } else {\n          const existingMarks: string[] =\n            {\n              ...(Editor.marks(editor) || {}),\n            }.marks || []\n          const marks = {\n            ...(Editor.marks(editor) || {}),\n            marks: [...existingMarks, mark],\n          }\n          editor.marks = marks as Text\n          forceNewSelection()\n          return editor\n        }\n        editor.onChange()\n        forceNewSelection()\n      }\n      return editor\n    }\n\n    // Override built in removeMark function\n    editor.removeMark = (mark: string) => {\n      const {selection} = editor\n      if (selection) {\n        if (Range.isExpanded(selection)) {\n          Editor.withoutNormalizing(editor, () => {\n            // Split if needed\n            Transforms.setNodes(editor, {}, {match: Text.isText, split: true})\n            if (editor.selection) {\n              const splitTextNodes = [\n                ...Editor.nodes(editor, {at: editor.selection, match: Text.isText}),\n              ]\n              splitTextNodes.forEach(([node, path]) => {\n                const block = editor.children[path[0]]\n                if (Element.isElement(block) && block.children.includes(node)) {\n                  Transforms.setNodes(\n                    editor,\n                    {\n                      marks: (Array.isArray(node.marks) ? node.marks : []).filter(\n                        (eMark: string) => eMark !== mark,\n                      ),\n                      _type: 'span',\n                    },\n                    {at: path},\n                  )\n                }\n              })\n            }\n          })\n          Editor.normalize(editor)\n        } else {\n          const existingMarks: string[] =\n            {\n              ...(Editor.marks(editor) || {}),\n            }.marks || []\n          const marks = {\n            ...(Editor.marks(editor) || {}),\n            marks: existingMarks.filter((eMark) => eMark !== mark),\n          } as Text\n          editor.marks = {marks: marks.marks, _type: 'span'} as Text\n          forceNewSelection()\n          return editor\n        }\n        editor.onChange()\n        forceNewSelection()\n      }\n      return editor\n    }\n\n    editor.pteIsMarkActive = (mark: string): boolean => {\n      if (!editor.selection) {\n        return false\n      }\n\n      const selectedNodes = Array.from(\n        Editor.nodes(editor, {match: Text.isText, at: editor.selection}),\n      )\n\n      if (Range.isExpanded(editor.selection)) {\n        return selectedNodes.every((n) => {\n          const [node] = n\n\n          return node.marks?.includes(mark)\n        })\n      }\n\n      return (\n        {\n          ...(Editor.marks(editor) || {}),\n        }.marks || []\n      ).includes(mark)\n    }\n\n    // Custom editor function to toggle a mark\n    editor.pteToggleMark = (mark: string) => {\n      const isActive = editor.pteIsMarkActive(mark)\n      if (isActive) {\n        debug(`Remove mark '${mark}'`)\n        Editor.removeMark(editor, mark)\n      } else {\n        debug(`Add mark '${mark}'`)\n        Editor.addMark(editor, mark, true)\n      }\n    }\n    return editor\n  }\n\n  /**\n   * Normalize re-marked spans in selection\n   */\n  function mergeSpans(editor: PortableTextSlateEditor) {\n    const {selection} = editor\n    if (selection) {\n      for (const [node, path] of Array.from(\n        Editor.nodes(editor, {\n          at: Editor.range(editor, [selection.anchor.path[0]], [selection.focus.path[0]]),\n        }),\n      ).reverse()) {\n        const [parent] = path.length > 1 ? Editor.node(editor, Path.parent(path)) : [undefined]\n        const nextPath = [path[0], path[1] + 1]\n        if (editor.isTextBlock(parent)) {\n          const nextNode = parent.children[nextPath[1]]\n          if (Text.isText(node) && Text.isText(nextNode) && isEqual(nextNode.marks, node.marks)) {\n            debug('Merging spans')\n            Transforms.mergeNodes(editor, {at: nextPath, voids: true})\n            editor.onChange()\n          }\n        }\n      }\n    }\n  }\n}\n","import {type Subject} from 'rxjs'\nimport {type BaseRange} from 'slate'\n\nimport {\n  type EditorChange,\n  type EditorSelection,\n  type PortableTextMemberSchemaTypes,\n  type PortableTextSlateEditor,\n} from '../../types/editor'\nimport {debugWithName} from '../../utils/debug'\nimport {type ObjectWithKeyAndType, toPortableTextRange} from '../../utils/ranges'\nimport {SLATE_TO_PORTABLE_TEXT_RANGE} from '../../utils/weakMaps'\n\nconst debug = debugWithName('plugin:withPortableTextSelections')\nconst debugVerbose = debug.enabled && false\n\n// This plugin will make sure that we emit a PT selection whenever the editor has changed.\nexport function createWithPortableTextSelections(\n  change$: Subject<EditorChange>,\n  types: PortableTextMemberSchemaTypes,\n): (editor: PortableTextSlateEditor) => PortableTextSlateEditor {\n  let prevSelection: BaseRange | null = null\n  return function withPortableTextSelections(\n    editor: PortableTextSlateEditor,\n  ): PortableTextSlateEditor {\n    const emitPortableTextSelection = () => {\n      if (prevSelection !== editor.selection) {\n        let ptRange: EditorSelection = null\n        if (editor.selection) {\n          const existing = SLATE_TO_PORTABLE_TEXT_RANGE.get(editor.selection)\n          if (existing) {\n            ptRange = existing\n          } else {\n            const value = editor.children satisfies ObjectWithKeyAndType[]\n            ptRange = toPortableTextRange(value, editor.selection, types)\n            SLATE_TO_PORTABLE_TEXT_RANGE.set(editor.selection, ptRange)\n          }\n        }\n        if (debugVerbose) {\n          debug(\n            `Emitting selection ${JSON.stringify(ptRange || null)} (${JSON.stringify(\n              editor.selection,\n            )})`,\n          )\n        }\n        if (ptRange) {\n          change$.next({type: 'selection', selection: ptRange})\n        } else {\n          change$.next({type: 'selection', selection: null})\n        }\n      }\n      prevSelection = editor.selection\n    }\n\n    const {onChange} = editor\n    editor.onChange = () => {\n      const hasChanges = editor.operations.length > 0\n      onChange()\n      if (hasChanges) {\n        emitPortableTextSelection()\n      }\n    }\n    return editor\n  }\n}\n","import {\n  isPortableTextListBlock,\n  isPortableTextSpan,\n  isPortableTextTextBlock,\n  type PortableTextListBlock,\n  type PortableTextSpan,\n  type PortableTextTextBlock,\n} from '@sanity/types'\nimport {type Element, Transforms} from 'slate'\n\nimport {type PortableTextMemberSchemaTypes, type PortableTextSlateEditor} from '../../types/editor'\nimport {debugWithName} from '../../utils/debug'\n\nconst debug = debugWithName('plugin:withSchemaTypes')\n/**\n * This plugin makes sure that schema types are recognized properly by Slate as blocks, voids, inlines\n *\n */\nexport function createWithSchemaTypes({\n  schemaTypes,\n  keyGenerator,\n}: {\n  schemaTypes: PortableTextMemberSchemaTypes\n  keyGenerator: () => string\n}) {\n  return function withSchemaTypes(editor: PortableTextSlateEditor): PortableTextSlateEditor {\n    editor.isTextBlock = (value: unknown): value is PortableTextTextBlock => {\n      return isPortableTextTextBlock(value) && value._type === schemaTypes.block.name\n    }\n    editor.isTextSpan = (value: unknown): value is PortableTextSpan => {\n      return isPortableTextSpan(value) && value._type == schemaTypes.span.name\n    }\n    editor.isListBlock = (value: unknown): value is PortableTextListBlock => {\n      return isPortableTextListBlock(value) && value._type === schemaTypes.block.name\n    }\n    editor.isVoid = (element: Element): boolean => {\n      return (\n        schemaTypes.block.name !== element._type &&\n        (schemaTypes.blockObjects.map((obj) => obj.name).includes(element._type) ||\n          schemaTypes.inlineObjects.map((obj) => obj.name).includes(element._type))\n      )\n    }\n    editor.isInline = (element: Element): boolean => {\n      const inlineSchemaTypes = schemaTypes.inlineObjects.map((obj) => obj.name)\n      return (\n        inlineSchemaTypes.includes(element._type) &&\n        '__inline' in element &&\n        element.__inline === true\n      )\n    }\n\n    // Extend Slate's default normalization\n    const {normalizeNode} = editor\n    editor.normalizeNode = (entry) => {\n      const [node, path] = entry\n\n      // If text block children node is missing _type, set it to the span type\n      if (node._type === undefined && path.length === 2) {\n        debug('Setting span type on text node without a type')\n        const span = node as PortableTextSpan\n        const key = span._key || keyGenerator()\n        Transforms.setNodes(editor, {...span, _type: schemaTypes.span.name, _key: key}, {at: path})\n      }\n\n      // catches cases when the children are missing keys but excludes it when the normalize is running the node as the editor object\n      if (node._key === undefined && (path.length === 1 || path.length === 2)) {\n        debug('Setting missing key on child node without a key')\n        const key = keyGenerator()\n        Transforms.setNodes(editor, {_key: key}, {at: path})\n      }\n\n      normalizeNode(entry)\n    }\n    return editor\n  }\n}\n","import {Editor, Range, Text, Transforms} from 'slate'\n\nimport {type PortableTextMemberSchemaTypes, type PortableTextSlateEditor} from '../../types/editor'\nimport {debugWithName} from '../../utils/debug'\nimport {toSlateValue} from '../../utils/values'\nimport {type PortableTextEditor} from '../PortableTextEditor'\n\nconst debug = debugWithName('plugin:withUtils')\n\ninterface Options {\n  schemaTypes: PortableTextMemberSchemaTypes\n  keyGenerator: () => string\n  portableTextEditor: PortableTextEditor\n}\n/**\n * This plugin makes various util commands available in the editor\n *\n */\nexport function createWithUtils({schemaTypes, keyGenerator, portableTextEditor}: Options) {\n  return function withUtils(editor: PortableTextSlateEditor): PortableTextSlateEditor {\n    // Expands the the selection to wrap around the word the focus is at\n    editor.pteExpandToWord = () => {\n      const {selection} = editor\n      if (selection && !Range.isExpanded(selection)) {\n        const [textNode] = Editor.node(editor, selection.focus, {depth: 2})\n        if (!textNode || !Text.isText(textNode) || textNode.text.length === 0) {\n          debug(`pteExpandToWord: Can't expand to word here`)\n          return\n        }\n        const {focus} = selection\n        const focusOffset = focus.offset\n        const charsBefore = textNode.text.slice(0, focusOffset)\n        const charsAfter = textNode.text.slice(focusOffset, -1)\n        const isEmpty = (str: string) => str.match(/\\s/g)\n        const whiteSpaceBeforeIndex = charsBefore\n          .split('')\n          .reverse()\n          .findIndex((str) => isEmpty(str))\n        const newStartOffset =\n          whiteSpaceBeforeIndex > -1 ? charsBefore.length - whiteSpaceBeforeIndex : 0\n        const whiteSpaceAfterIndex = charsAfter.split('').findIndex((obj) => isEmpty(obj))\n        const newEndOffset =\n          charsBefore.length +\n          (whiteSpaceAfterIndex > -1 ? whiteSpaceAfterIndex : charsAfter.length + 1)\n        if (!(newStartOffset === newEndOffset || isNaN(newStartOffset) || isNaN(newEndOffset))) {\n          debug('pteExpandToWord: Expanding to focused word')\n          Transforms.setSelection(editor, {\n            anchor: {...selection.anchor, offset: newStartOffset},\n            focus: {...selection.focus, offset: newEndOffset},\n          })\n          return\n        }\n        debug(`pteExpandToWord: Can't expand to word here`)\n      }\n    }\n\n    editor.pteCreateEmptyBlock = () => {\n      const block = toSlateValue(\n        [\n          {\n            _type: schemaTypes.block.name,\n            _key: keyGenerator(),\n            style: schemaTypes.styles[0].value || 'normal',\n            markDefs: [],\n            children: [\n              {\n                _type: 'span',\n                _key: keyGenerator(),\n                text: '',\n                marks: [],\n              },\n            ],\n          },\n        ],\n        portableTextEditor,\n      )[0]\n      return block\n    }\n    return editor\n  }\n}\n","/* eslint-disable max-statements */\n/* eslint-disable complexity */\nimport {isPortableTextSpan, isPortableTextTextBlock} from '@sanity/types'\nimport {isHotkey} from 'is-hotkey-esm'\nimport {type KeyboardEvent} from 'react'\nimport {Editor, Node, Path, Range, Transforms} from 'slate'\nimport {type ReactEditor} from 'slate-react'\n\nimport {type PortableTextMemberSchemaTypes, type PortableTextSlateEditor} from '../../types/editor'\nimport {type HotkeyOptions} from '../../types/options'\nimport {type SlateTextBlock, type VoidElement} from '../../types/slate'\nimport {debugWithName} from '../../utils/debug'\nimport {type PortableTextEditor} from '../PortableTextEditor'\n\nconst debug = debugWithName('plugin:withHotKeys')\n\nconst DEFAULT_HOTKEYS: HotkeyOptions = {\n  marks: {\n    'mod+b': 'strong',\n    'mod+i': 'em',\n    'mod+u': 'underline',\n    \"mod+'\": 'code',\n  },\n  custom: {},\n}\n\n/**\n * This plugin takes care of all hotkeys in the editor\n *\n */\nexport function createWithHotkeys(\n  types: PortableTextMemberSchemaTypes,\n  portableTextEditor: PortableTextEditor,\n  hotkeysFromOptions?: HotkeyOptions,\n): (editor: PortableTextSlateEditor & ReactEditor) => any {\n  const reservedHotkeys = ['enter', 'tab', 'shift', 'delete', 'end']\n  const activeHotkeys = hotkeysFromOptions || DEFAULT_HOTKEYS // TODO: Merge where possible? A union?\n  return function withHotKeys(editor: PortableTextSlateEditor & ReactEditor) {\n    editor.pteWithHotKeys = (event: KeyboardEvent<HTMLDivElement>): void => {\n      // Wire up custom marks hotkeys\n      Object.keys(activeHotkeys).forEach((cat) => {\n        if (cat === 'marks') {\n          // eslint-disable-next-line guard-for-in\n          for (const hotkey in activeHotkeys[cat]) {\n            if (reservedHotkeys.includes(hotkey)) {\n              throw new Error(`The hotkey ${hotkey} is reserved!`)\n            }\n            if (isHotkey(hotkey, event.nativeEvent)) {\n              event.preventDefault()\n              const possibleMark = activeHotkeys[cat]\n              if (possibleMark) {\n                const mark = possibleMark[hotkey]\n                debug(`HotKey ${hotkey} to toggle ${mark}`)\n                editor.pteToggleMark(mark)\n              }\n            }\n          }\n        }\n        if (cat === 'custom') {\n          // eslint-disable-next-line guard-for-in\n          for (const hotkey in activeHotkeys[cat]) {\n            if (reservedHotkeys.includes(hotkey)) {\n              throw new Error(`The hotkey ${hotkey} is reserved!`)\n            }\n            if (isHotkey(hotkey, event.nativeEvent)) {\n              const possibleCommand = activeHotkeys[cat]\n              if (possibleCommand) {\n                const command = possibleCommand[hotkey]\n                command(event, portableTextEditor)\n              }\n            }\n          }\n        }\n      })\n\n      const isEnter = isHotkey('enter', event.nativeEvent)\n      const isTab = isHotkey('tab', event.nativeEvent)\n      const isShiftEnter = isHotkey('shift+enter', event.nativeEvent)\n      const isShiftTab = isHotkey('shift+tab', event.nativeEvent)\n      const isBackspace = isHotkey('backspace', event.nativeEvent)\n      const isDelete = isHotkey('delete', event.nativeEvent)\n      const isArrowDown = isHotkey('down', event.nativeEvent)\n      const isArrowUp = isHotkey('up', event.nativeEvent)\n\n      // Check if the user is in a void block, in that case, add an empty text block below if there is no next block\n      if (isArrowDown && editor.selection) {\n        const focusBlock = Node.descendant(editor, editor.selection.focus.path.slice(0, 1)) as\n          | SlateTextBlock\n          | VoidElement\n\n        if (focusBlock && Editor.isVoid(editor, focusBlock)) {\n          const nextPath = Path.next(editor.selection.focus.path.slice(0, 1))\n          const nextBlock = Node.has(editor, nextPath)\n          if (!nextBlock) {\n            Transforms.insertNodes(editor, editor.pteCreateEmptyBlock(), {at: nextPath})\n            editor.onChange()\n            return\n          }\n        }\n      }\n      if (isArrowUp && editor.selection) {\n        const isFirstBlock = editor.selection.focus.path[0] === 0\n        const focusBlock = Node.descendant(editor, editor.selection.focus.path.slice(0, 1)) as\n          | SlateTextBlock\n          | VoidElement\n\n        if (isFirstBlock && focusBlock && Editor.isVoid(editor, focusBlock)) {\n          Transforms.insertNodes(editor, editor.pteCreateEmptyBlock(), {at: [0]})\n          Transforms.select(editor, {path: [0, 0], offset: 0})\n          editor.onChange()\n          return\n        }\n      }\n      if (\n        isBackspace &&\n        editor.selection &&\n        editor.selection.focus.path[0] === 0 &&\n        Range.isCollapsed(editor.selection)\n      ) {\n        // If the block is text and we have a next block below, remove the current block\n        const focusBlock = Node.descendant(editor, editor.selection.focus.path.slice(0, 1)) as\n          | SlateTextBlock\n          | VoidElement\n        const nextPath = Path.next(editor.selection.focus.path.slice(0, 1))\n        const nextBlock = Node.has(editor, nextPath)\n        const isTextBlock = isPortableTextTextBlock(focusBlock)\n        const isEmptyFocusBlock =\n          isTextBlock && focusBlock.children.length === 1 && focusBlock.children?.[0]?.text === ''\n\n        if (nextBlock && isTextBlock && isEmptyFocusBlock) {\n          // Remove current block\n          event.preventDefault()\n          event.stopPropagation()\n          Transforms.removeNodes(editor, {match: (n) => n === focusBlock})\n          editor.onChange()\n          return\n        }\n      }\n      // Disallow deleting void blocks by backspace from another line.\n      // Otherwise it's so easy to delete the void block above when trying to delete text on\n      // the line below or above\n      if (\n        isBackspace &&\n        editor.selection &&\n        editor.selection.focus.path[0] > 0 &&\n        Range.isCollapsed(editor.selection)\n      ) {\n        const prevPath = Path.previous(editor.selection.focus.path.slice(0, 1))\n        const prevBlock = Node.descendant(editor, prevPath) as SlateTextBlock | VoidElement\n        const focusBlock = Node.descendant(editor, editor.selection.focus.path.slice(0, 1))\n        if (\n          prevBlock &&\n          focusBlock &&\n          Editor.isVoid(editor, prevBlock) &&\n          editor.selection.focus.offset === 0\n        ) {\n          debug('Preventing deleting void block above')\n          event.preventDefault()\n          event.stopPropagation()\n\n          const isTextBlock = isPortableTextTextBlock(focusBlock)\n          const isEmptyFocusBlock =\n            isTextBlock && focusBlock.children.length === 1 && focusBlock.children?.[0]?.text === ''\n\n          // If this is a not an text block or it is empty, simply remove it\n          if (!isTextBlock || isEmptyFocusBlock) {\n            Transforms.removeNodes(editor, {match: (n) => n === focusBlock})\n            Transforms.select(editor, prevPath)\n\n            editor.onChange()\n            return\n          }\n\n          // If the focused block is a text node but it isn't empty, focus on the previous block\n          if (isTextBlock && !isEmptyFocusBlock) {\n            Transforms.select(editor, prevPath)\n\n            editor.onChange()\n            return\n          }\n\n          return\n        }\n      }\n      if (\n        isDelete &&\n        editor.selection &&\n        editor.selection.focus.offset === 0 &&\n        Range.isCollapsed(editor.selection) &&\n        editor.children[editor.selection.focus.path[0] + 1]\n      ) {\n        const nextBlock = Node.descendant(\n          editor,\n          Path.next(editor.selection.focus.path.slice(0, 1)),\n        ) as SlateTextBlock | VoidElement\n        const focusBlockPath = editor.selection.focus.path.slice(0, 1)\n        const focusBlock = Node.descendant(editor, focusBlockPath) as SlateTextBlock | VoidElement\n\n        if (\n          nextBlock &&\n          focusBlock &&\n          !Editor.isVoid(editor, focusBlock) &&\n          Editor.isVoid(editor, nextBlock)\n        ) {\n          debug('Preventing deleting void block below')\n          event.preventDefault()\n          event.stopPropagation()\n          Transforms.removeNodes(editor, {match: (n) => n === focusBlock})\n          Transforms.select(editor, focusBlockPath)\n          editor.onChange()\n          return\n        }\n      }\n\n      // Tab for lists\n      // Only steal tab when we are on a plain text span or we are at the start of the line (fallback if the whole block is annotated or contains a single inline object)\n      // Otherwise tab is reserved for accessability for buttons etc.\n      if ((isTab || isShiftTab) && editor.selection) {\n        const [focusChild] = Editor.node(editor, editor.selection.focus, {depth: 2})\n        const [focusBlock] = isPortableTextSpan(focusChild)\n          ? Editor.node(editor, editor.selection.focus, {depth: 1})\n          : []\n        const hasAnnotationFocus =\n          focusChild &&\n          isPortableTextTextBlock(focusBlock) &&\n          isPortableTextSpan(focusChild) &&\n          (focusChild.marks || ([] as string[])).filter((m) =>\n            (focusBlock.markDefs || []).map((def) => def._key).includes(m),\n          ).length > 0\n        const [start] = Range.edges(editor.selection)\n        const atStartOfNode = Editor.isStart(editor, start, start.path)\n\n        if (\n          focusChild &&\n          isPortableTextSpan(focusChild) &&\n          (!hasAnnotationFocus || atStartOfNode) &&\n          editor.pteIncrementBlockLevels(isShiftTab)\n        ) {\n          event.preventDefault()\n        }\n      }\n\n      // Deal with enter key combos\n      if (isEnter && !isShiftEnter && editor.selection) {\n        const focusBlockPath = editor.selection.focus.path.slice(0, 1)\n        const focusBlock = Node.descendant(editor, focusBlockPath) as SlateTextBlock | VoidElement\n\n        // List item enter key\n        if (editor.isListBlock(focusBlock)) {\n          if (editor.pteEndList()) {\n            event.preventDefault()\n          }\n          return\n        }\n\n        // Enter from another style than the first (default one)\n        if (\n          editor.isTextBlock(focusBlock) &&\n          focusBlock.style &&\n          focusBlock.style !== types.styles[0].value\n        ) {\n          const [, end] = Range.edges(editor.selection)\n          const endAtEndOfNode = Editor.isEnd(editor, end, end.path)\n          if (endAtEndOfNode) {\n            Editor.insertNode(editor, editor.pteCreateEmptyBlock())\n            event.preventDefault()\n            editor.onChange()\n            return\n          }\n        }\n        // Block object enter key\n        if (focusBlock && Editor.isVoid(editor, focusBlock)) {\n          Editor.insertNode(editor, editor.pteCreateEmptyBlock())\n          event.preventDefault()\n          editor.onChange()\n          return\n        }\n        // Default enter key behavior\n        event.preventDefault()\n        editor.insertBreak()\n        editor.onChange()\n      }\n\n      // Soft line breaks\n      if (isShiftEnter) {\n        event.preventDefault()\n        editor.insertText('\\n')\n        return\n      }\n\n      // Undo/redo\n      if (isHotkey('mod+z', event.nativeEvent)) {\n        event.preventDefault()\n        editor.undo()\n        return\n      }\n      if (isHotkey('mod+y', event.nativeEvent) || isHotkey('mod+shift+z', event.nativeEvent)) {\n        event.preventDefault()\n        editor.redo()\n      }\n    }\n    return editor\n  }\n}\n","import {\n  isPortableTextTextBlock,\n  type PortableTextBlock,\n  type PortableTextSpan,\n  type PortableTextTextBlock,\n} from '@sanity/types'\nimport {flatten, isPlainObject, uniq} from 'lodash'\n\nimport {insert, set, setIfMissing, unset} from '../patch/PatchEvent'\nimport {type InvalidValueResolution, type PortableTextMemberSchemaTypes} from '../types/editor'\nimport {EMPTY_MARKDEFS} from './values'\n\nexport interface Validation {\n  valid: boolean\n  resolution: InvalidValueResolution | null\n  value: PortableTextBlock[] | undefined\n}\n\nexport function validateValue(\n  value: PortableTextBlock[] | undefined,\n  types: PortableTextMemberSchemaTypes,\n  keyGenerator: () => string,\n): Validation {\n  let resolution: InvalidValueResolution | null = null\n  let valid = true\n  const validChildTypes = [types.span.name, ...types.inlineObjects.map((t) => t.name)]\n  const validBlockTypes = [types.block.name, ...types.blockObjects.map((t) => t.name)]\n\n  // Undefined is allowed\n  if (value === undefined) {\n    return {valid: true, resolution: null, value}\n  }\n  // Only lengthy arrays are allowed in the editor.\n  if (!Array.isArray(value) || value.length === 0) {\n    return {\n      valid: false,\n      resolution: {\n        patches: [unset([])],\n        description: 'Editor value must be an array of Portable Text blocks, or undefined.',\n        action: 'Unset the value',\n        item: value,\n\n        i18n: {\n          description: 'inputs.portable-text.invalid-value.not-an-array.description',\n          action: 'inputs.portable-text.invalid-value.not-an-array.action',\n        },\n      },\n      value,\n    }\n  }\n  if (\n    value.some((blk: PortableTextBlock, index: number): boolean => {\n      // Is the block an object?\n      if (!isPlainObject(blk)) {\n        resolution = {\n          patches: [unset([index])],\n          description: `Block must be an object, got ${String(blk)}`,\n          action: `Unset invalid item`,\n          item: blk,\n\n          i18n: {\n            description: 'inputs.portable-text.invalid-value.not-an-object.description',\n            action: 'inputs.portable-text.invalid-value.not-an-object.action',\n            values: {index},\n          },\n        }\n        return true\n      }\n      // Test that every block has a _key prop\n      if (!blk._key || typeof blk._key !== 'string') {\n        resolution = {\n          patches: [set({...blk, _key: keyGenerator()}, [index])],\n          description: `Block at index ${index} is missing required _key.`,\n          action: 'Set the block with a random _key value',\n          item: blk,\n\n          i18n: {\n            description: 'inputs.portable-text.invalid-value.missing-key.description',\n            action: 'inputs.portable-text.invalid-value.missing-key.action',\n            values: {index},\n          },\n        }\n        return true\n      }\n      // Test that every block has valid _type\n      if (!blk._type || !validBlockTypes.includes(blk._type)) {\n        // Special case where block type is set to default 'block', but the block type is named something else according to the schema.\n        if (blk._type === 'block') {\n          const currentBlockTypeName = types.block.name\n          resolution = {\n            patches: [set({...blk, _type: currentBlockTypeName}, [{_key: blk._key}])],\n            description: `Block with _key '${blk._key}' has invalid type name '${blk._type}'. According to the schema, the block type name is '${currentBlockTypeName}'`,\n            action: `Use type '${currentBlockTypeName}'`,\n            item: blk,\n\n            i18n: {\n              description: 'inputs.portable-text.invalid-value.incorrect-block-type.description',\n              action: 'inputs.portable-text.invalid-value.incorrect-block-type.action',\n              values: {key: blk._key, expectedTypeName: currentBlockTypeName},\n            },\n          }\n          return true\n        }\n\n        // If the block has no `_type`, but aside from that is a valid Portable Text block\n        if (!blk._type && isPortableTextTextBlock({...blk, _type: types.block.name})) {\n          resolution = {\n            patches: [set({...blk, _type: types.block.name}, [{_key: blk._key}])],\n            description: `Block with _key '${blk._key}' is missing a type name. According to the schema, the block type name is '${types.block.name}'`,\n            action: `Use type '${types.block.name}'`,\n            item: blk,\n\n            i18n: {\n              description: 'inputs.portable-text.invalid-value.missing-block-type.description',\n              action: 'inputs.portable-text.invalid-value.missing-block-type.action',\n              values: {key: blk._key, expectedTypeName: types.block.name},\n            },\n          }\n          return true\n        }\n\n        if (!blk._type) {\n          resolution = {\n            patches: [unset([{_key: blk._key}])],\n            description: `Block with _key '${blk._key}' is missing an _type property`,\n            action: 'Remove the block',\n            item: blk,\n\n            i18n: {\n              description: 'inputs.portable-text.invalid-value.missing-type.description',\n              action: 'inputs.portable-text.invalid-value.missing-type.action',\n              values: {key: blk._key},\n            },\n          }\n          return true\n        }\n\n        resolution = {\n          patches: [unset([{_key: blk._key}])],\n          description: `Block with _key '${blk._key}' has invalid _type '${blk._type}'`,\n          action: 'Remove the block',\n          item: blk,\n\n          i18n: {\n            description: 'inputs.portable-text.invalid-value.disallowed-type.description',\n            action: 'inputs.portable-text.invalid-value.disallowed-type.action',\n            values: {key: blk._key, typeName: blk._type},\n          },\n        }\n        return true\n      }\n\n      // Test regular text blocks\n      if (blk._type === types.block.name) {\n        const textBlock = blk as PortableTextTextBlock\n        // Test that it has a valid children property (array)\n        if (textBlock.children && !Array.isArray(textBlock.children)) {\n          resolution = {\n            patches: [set({children: []}, [{_key: textBlock._key}])],\n            description: `Text block with _key '${textBlock._key}' has a invalid required property 'children'.`,\n            action: 'Reset the children property',\n            item: textBlock,\n\n            i18n: {\n              description:\n                'inputs.portable-text.invalid-value.missing-or-invalid-children.description',\n              action: 'inputs.portable-text.invalid-value.missing-or-invalid-children.action',\n              values: {key: textBlock._key},\n            },\n          }\n          return true\n        }\n        // Test that children is set and lengthy\n        if (\n          textBlock.children === undefined ||\n          (Array.isArray(textBlock.children) && textBlock.children.length === 0)\n        ) {\n          const newSpan = {\n            _type: types.span.name,\n            _key: keyGenerator(),\n            text: '',\n            marks: [],\n          }\n          resolution = {\n            autoResolve: true,\n            patches: [\n              setIfMissing([], [{_key: blk._key}, 'children']),\n              insert([newSpan], 'after', [{_key: blk._key}, 'children', 0]),\n            ],\n            description: `Children for text block with _key '${blk._key}' is empty.`,\n            action: 'Insert an empty text',\n            item: blk,\n\n            i18n: {\n              description: 'inputs.portable-text.invalid-value.empty-children.description',\n              action: 'inputs.portable-text.invalid-value.empty-children.action',\n              values: {key: blk._key},\n            },\n          }\n          return true\n        }\n        // Test that markDefs are valid if they exists\n        if (blk.markDefs && !Array.isArray(blk.markDefs)) {\n          resolution = {\n            patches: [set({...textBlock, markDefs: EMPTY_MARKDEFS}, [{_key: textBlock._key}])],\n            description: `Block has invalid required property 'markDefs'.`,\n            action: 'Add empty markDefs array',\n            item: textBlock,\n\n            i18n: {\n              description:\n                'inputs.portable-text.invalid-value.missing-or-invalid-markdefs.description',\n              action: 'inputs.portable-text.invalid-value.missing-or-invalid-markdefs.action',\n              values: {key: textBlock._key},\n            },\n          }\n          return true\n        }\n        const allUsedMarks = uniq(\n          flatten(\n            textBlock.children\n              .filter((cld) => cld._type === types.span.name)\n              .map((cld) => cld.marks || []),\n          ) as string[],\n        )\n\n        // Test that all markDefs are in use (remove orphaned markDefs)\n        if (Array.isArray(blk.markDefs) && blk.markDefs.length > 0) {\n          const unusedMarkDefs: string[] = uniq(\n            blk.markDefs.map((def) => def._key).filter((key) => !allUsedMarks.includes(key)),\n          )\n          if (unusedMarkDefs.length > 0) {\n            resolution = {\n              autoResolve: true,\n              patches: unusedMarkDefs.map((markDefKey) =>\n                unset([{_key: blk._key}, 'markDefs', {_key: markDefKey}]),\n              ),\n              description: `Block contains orphaned data (unused mark definitions): ${unusedMarkDefs.join(\n                ', ',\n              )}.`,\n              action: 'Remove unused mark definition item',\n              item: blk,\n              i18n: {\n                description: 'inputs.portable-text.invalid-value.orphaned-mark-defs.description',\n                action: 'inputs.portable-text.invalid-value.orphaned-mark-defs.action',\n                values: {key: blk._key, unusedMarkDefs: unusedMarkDefs.map((m) => m.toString())},\n              },\n            }\n            return true\n          }\n        }\n\n        // Test that every annotation mark used has a definition\n        const annotationMarks = allUsedMarks.filter(\n          (mark) => !types.decorators.map((dec) => dec.value).includes(mark),\n        )\n        const orphanedMarks = annotationMarks.filter(\n          (mark) =>\n            textBlock.markDefs === undefined ||\n            !textBlock.markDefs.find((def) => def._key === mark),\n        )\n        if (orphanedMarks.length > 0) {\n          const spanChildren = textBlock.children.filter(\n            (cld) =>\n              cld._type === types.span.name &&\n              Array.isArray(cld.marks) &&\n              cld.marks.some((mark) => orphanedMarks.includes(mark)),\n          ) as PortableTextSpan[]\n          if (spanChildren) {\n            const orphaned = orphanedMarks.join(', ')\n            resolution = {\n              autoResolve: true,\n              patches: spanChildren.map((child) => {\n                return set(\n                  (child.marks || []).filter((cMrk) => !orphanedMarks.includes(cMrk)),\n                  [{_key: blk._key}, 'children', {_key: child._key}, 'marks'],\n                )\n              }),\n              description: `Block with _key '${blk._key}' contains marks (${orphaned}) not supported by the current content model.`,\n              action: 'Remove invalid marks',\n              item: blk,\n\n              i18n: {\n                description: 'inputs.portable-text.invalid-value.orphaned-marks.description',\n                action: 'inputs.portable-text.invalid-value.orphaned-marks.action',\n                values: {key: blk._key, orphanedMarks: orphanedMarks.map((m) => m.toString())},\n              },\n            }\n            return true\n          }\n        }\n\n        // Test every child\n        if (\n          textBlock.children.some((child, cIndex: number) => {\n            if (!isPlainObject(child)) {\n              resolution = {\n                patches: [unset([{_key: blk._key}, 'children', cIndex])],\n                description: `Child at index '${cIndex}' in block with key '${blk._key}' is not an object.`,\n                action: 'Remove the item',\n                item: blk,\n\n                i18n: {\n                  description: 'inputs.portable-text.invalid-value.non-object-child.description',\n                  action: 'inputs.portable-text.invalid-value.non-object-child.action',\n                  values: {key: blk._key, index: cIndex},\n                },\n              }\n              return true\n            }\n\n            if (!child._key || typeof child._key !== 'string') {\n              const newChild = {...child, _key: keyGenerator()}\n              resolution = {\n                autoResolve: true,\n                patches: [set(newChild, [{_key: blk._key}, 'children', cIndex])],\n                description: `Child at index ${cIndex} is missing required _key in block with _key ${blk._key}.`,\n                action: 'Set a new random _key on the object',\n                item: blk,\n\n                i18n: {\n                  description: 'inputs.portable-text.invalid-value.missing-child-key.description',\n                  action: 'inputs.portable-text.invalid-value.missing-child-key.action',\n                  values: {key: blk._key, index: cIndex},\n                },\n              }\n              return true\n            }\n\n            // Verify that children have valid types\n            if (!child._type) {\n              resolution = {\n                patches: [unset([{_key: blk._key}, 'children', {_key: child._key}])],\n                description: `Child with _key '${child._key}' in block with key '${blk._key}' is missing '_type' property.`,\n                action: 'Remove the object',\n                item: blk,\n\n                i18n: {\n                  description: 'inputs.portable-text.invalid-value.missing-child-type.description',\n                  action: 'inputs.portable-text.invalid-value.missing-child-type.action',\n                  values: {key: blk._key, childKey: child._key},\n                },\n              }\n              return true\n            }\n\n            if (!validChildTypes.includes(child._type)) {\n              resolution = {\n                patches: [unset([{_key: blk._key}, 'children', {_key: child._key}])],\n                description: `Child with _key '${child._key}' in block with key '${blk._key}' has invalid '_type' property (${child._type}).`,\n                action: 'Remove the object',\n                item: blk,\n\n                i18n: {\n                  description:\n                    'inputs.portable-text.invalid-value.disallowed-child-type.description',\n                  action: 'inputs.portable-text.invalid-value.disallowed-child-type.action',\n                  values: {key: blk._key, childKey: child._key, childType: child._type},\n                },\n              }\n              return true\n            }\n\n            // Verify that spans have .text property that is a string\n            if (child._type === types.span.name && typeof child.text !== 'string') {\n              resolution = {\n                patches: [\n                  set({...child, text: ''}, [{_key: blk._key}, 'children', {_key: child._key}]),\n                ],\n                description: `Child with _key '${child._key}' in block with key '${blk._key}' has missing or invalid text property!`,\n                action: `Write an empty text property to the object`,\n                item: blk,\n\n                i18n: {\n                  description: 'inputs.portable-text.invalid-value.invalid-span-text.description',\n                  action: 'inputs.portable-text.invalid-value.invalid-span-text.action',\n                  values: {key: blk._key, childKey: child._key},\n                },\n              }\n              return true\n            }\n            return false\n          })\n        ) {\n          valid = false\n        }\n      }\n      return false\n    })\n  ) {\n    valid = false\n  }\n  return {valid, resolution, value}\n}\n","import {htmlToBlocks, normalizeBlock} from '@sanity/block-tools'\nimport {type PortableTextBlock, type PortableTextChild} from '@sanity/types'\nimport {isEqual, uniq} from 'lodash'\nimport {type Descendant, Editor, type Node, Range, Transforms} from 'slate'\nimport {ReactEditor} from 'slate-react'\n\nimport {\n  type EditorChanges,\n  type PortableTextMemberSchemaTypes,\n  type PortableTextSlateEditor,\n} from '../../types/editor'\nimport {debugWithName} from '../../utils/debug'\nimport {validateValue} from '../../utils/validateValue'\nimport {fromSlateValue, isEqualToEmptyEditor, toSlateValue} from '../../utils/values'\n\nconst debug = debugWithName('plugin:withInsertData')\n\n/**\n * This plugin handles copy/paste in the editor\n *\n */\nexport function createWithInsertData(\n  change$: EditorChanges,\n  schemaTypes: PortableTextMemberSchemaTypes,\n  keyGenerator: () => string,\n) {\n  return function withInsertData(editor: PortableTextSlateEditor): PortableTextSlateEditor {\n    const blockTypeName = schemaTypes.block.name\n    const spanTypeName = schemaTypes.span.name\n    const whitespaceOnPasteMode = schemaTypes.block.options.unstable_whitespaceOnPasteMode\n\n    const toPlainText = (blocks: PortableTextBlock[]) => {\n      return blocks\n        .map((block) => {\n          if (editor.isTextBlock(block)) {\n            return block.children\n              .map((child: PortableTextChild) => {\n                if (child._type === spanTypeName) {\n                  return child.text\n                }\n                return `[${\n                  schemaTypes.inlineObjects.find((t) => t.name === child._type)?.title || 'Object'\n                }]`\n              })\n              .join('')\n          }\n          return `[${\n            schemaTypes.blockObjects.find((t) => t.name === block._type)?.title || 'Object'\n          }]`\n        })\n        .join('\\n\\n')\n    }\n\n    editor.setFragmentData = (data: DataTransfer, originEvent) => {\n      const {selection} = editor\n\n      if (!selection) {\n        return\n      }\n\n      const [start, end] = Range.edges(selection)\n      const startVoid = Editor.void(editor, {at: start.path})\n      const endVoid = Editor.void(editor, {at: end.path})\n\n      if (Range.isCollapsed(selection) && !startVoid) {\n        return\n      }\n\n      // Create a fake selection so that we can add a Base64-encoded copy of the\n      // fragment to the HTML, to decode on future pastes.\n      const domRange = ReactEditor.toDOMRange(editor, selection)\n      let contents = domRange.cloneContents()\n      // COMPAT: If the end node is a void node, we need to move the end of the\n      // range from the void node's spacer span, to the end of the void node's\n      // content, since the spacer is before void's content in the DOM.\n      if (endVoid) {\n        const [voidNode] = endVoid\n        const r = domRange.cloneRange()\n        const domNode = ReactEditor.toDOMNode(editor, voidNode)\n        r.setEndAfter(domNode)\n        contents = r.cloneContents()\n      }\n      // Remove any zero-width space spans from the cloned DOM so that they don't\n      // show up elsewhere when pasted.\n      Array.from(contents.querySelectorAll('[data-slate-zero-width]')).forEach((zw) => {\n        const isNewline = zw.getAttribute('data-slate-zero-width') === 'n'\n        zw.textContent = isNewline ? '\\n' : ''\n      })\n      // Clean up the clipboard HTML for editor spesific attributes\n      Array.from(contents.querySelectorAll('*')).forEach((elm) => {\n        elm.removeAttribute('contentEditable')\n        elm.removeAttribute('data-slate-inline')\n        elm.removeAttribute('data-slate-leaf')\n        elm.removeAttribute('data-slate-node')\n        elm.removeAttribute('data-slate-spacer')\n        elm.removeAttribute('data-slate-string')\n        elm.removeAttribute('data-slate-zero-width')\n        elm.removeAttribute('draggable')\n        for (const key in elm.attributes) {\n          if (elm.hasAttribute(key)) {\n            elm.removeAttribute(key)\n          }\n        }\n      })\n      const div = contents.ownerDocument.createElement('div')\n      div.appendChild(contents)\n      div.setAttribute('hidden', 'true')\n      contents.ownerDocument.body.appendChild(div)\n      const asHTML = div.innerHTML\n      contents.ownerDocument.body.removeChild(div)\n      const fragment = editor.getFragment()\n      const portableText = fromSlateValue(fragment, blockTypeName)\n\n      const asJSON = JSON.stringify(portableText)\n      const asPlainText = toPlainText(portableText)\n      data.clearData()\n      data.setData('text/plain', asPlainText)\n      data.setData('text/html', asHTML)\n      data.setData('application/json', asJSON)\n      data.setData('application/x-portable-text', asJSON)\n      debug('text', asPlainText)\n      data.setData('application/x-portable-text-event-origin', originEvent || 'external')\n      debug('Set fragment data', asJSON, asHTML)\n    }\n\n    editor.insertPortableTextData = (data: DataTransfer): boolean => {\n      if (!editor.selection) {\n        return false\n      }\n      const pText = data.getData('application/x-portable-text')\n      const origin = data.getData('application/x-portable-text-event-origin')\n      debug(`Inserting portable text from ${origin} event`, pText)\n      if (pText) {\n        const parsed = JSON.parse(pText) as PortableTextBlock[]\n        if (Array.isArray(parsed) && parsed.length > 0) {\n          const slateValue = _regenerateKeys(\n            editor,\n            toSlateValue(parsed, {schemaTypes}),\n            keyGenerator,\n            spanTypeName,\n          )\n          // Validate the result\n          const validation = validateValue(parsed, schemaTypes, keyGenerator)\n          // Bail out if it's not valid\n          if (!validation.valid && !validation.resolution?.autoResolve) {\n            const errorDescription = `${validation.resolution?.description}`\n            change$.next({\n              type: 'error',\n              level: 'warning',\n              name: 'pasteError',\n              description: errorDescription,\n              data: validation,\n            })\n            debug('Invalid insert result', validation)\n            return false\n          }\n          _insertFragment(editor, slateValue, schemaTypes)\n          return true\n        }\n      }\n      return false\n    }\n\n    editor.insertTextOrHTMLData = (data: DataTransfer): boolean => {\n      if (!editor.selection) {\n        debug('No selection, not inserting')\n        return false\n      }\n      change$.next({type: 'loading', isLoading: true}) // This could potentially take some time\n      const html = data.getData('text/html')\n      const text = data.getData('text/plain')\n\n      if (html || text) {\n        debug('Inserting data', data)\n        let portableText: PortableTextBlock[]\n        let fragment: Node[]\n        let insertedType\n\n        if (html) {\n          portableText = htmlToBlocks(html, schemaTypes.portableText, {\n            unstable_whitespaceOnPasteMode: whitespaceOnPasteMode,\n          }).map((block) => normalizeBlock(block, {blockTypeName})) as PortableTextBlock[]\n          fragment = toSlateValue(portableText, {schemaTypes})\n          insertedType = 'HTML'\n\n          if (portableText.length === 0) {\n            return false\n          }\n        } else {\n          // plain text\n          const blocks = escapeHtml(text)\n            .split(/\\n{2,}/)\n            .map((line) =>\n              line ? `<p>${line.replace(/(?:\\r\\n|\\r|\\n)/g, '<br/>')}</p>` : '<p></p>',\n            )\n            .join('')\n          const textToHtml = `<html><body>${blocks}</body></html>`\n          portableText = htmlToBlocks(textToHtml, schemaTypes.portableText).map((block) =>\n            normalizeBlock(block, {blockTypeName}),\n          ) as PortableTextBlock[]\n          fragment = toSlateValue(portableText, {\n            schemaTypes,\n          })\n          insertedType = 'text'\n        }\n\n        // Validate the result\n        const validation = validateValue(portableText, schemaTypes, keyGenerator)\n\n        // Bail out if it's not valid\n        if (!validation.valid) {\n          const errorDescription = `Could not validate the resulting portable text to insert.\\n${validation.resolution?.description}\\nTry to insert as plain text (shift-paste) instead.`\n          change$.next({\n            type: 'error',\n            level: 'warning',\n            name: 'pasteError',\n            description: errorDescription,\n            data: validation,\n          })\n          debug('Invalid insert result', validation)\n          return false\n        }\n        debug(`Inserting ${insertedType} fragment at ${JSON.stringify(editor.selection)}`)\n        _insertFragment(editor, fragment, schemaTypes)\n        change$.next({type: 'loading', isLoading: false})\n        return true\n      }\n      change$.next({type: 'loading', isLoading: false})\n      return false\n    }\n\n    editor.insertData = (data: DataTransfer) => {\n      if (!editor.insertPortableTextData(data)) {\n        editor.insertTextOrHTMLData(data)\n      }\n    }\n\n    editor.insertFragmentData = (data: DataTransfer): boolean => {\n      const fragment = data.getData('application/x-portable-text')\n      if (fragment) {\n        const parsed = JSON.parse(fragment)\n        editor.insertFragment(parsed)\n        return true\n      }\n      return false\n    }\n\n    return editor\n  }\n}\n\nconst entityMap: Record<string, string> = {\n  '&': '&amp;',\n  '<': '&lt;',\n  '>': '&gt;',\n  '\"': '&quot;',\n  \"'\": '&#39;',\n  '/': '&#x2F;',\n  '`': '&#x60;',\n  '=': '&#x3D;',\n}\nfunction escapeHtml(str: string) {\n  return String(str).replace(/[&<>\"'`=/]/g, (s: string) => entityMap[s])\n}\n\n/**\n * Shared helper function to regenerate the keys on a fragment.\n *\n * @internal\n */\nfunction _regenerateKeys(\n  editor: PortableTextSlateEditor,\n  fragment: Descendant[],\n  keyGenerator: () => string,\n  spanTypeName: string,\n): Descendant[] {\n  return fragment.map((node) => {\n    const newNode: Descendant = {...node}\n    // Ensure the copy has new keys\n    if (editor.isTextBlock(newNode)) {\n      newNode.markDefs = (newNode.markDefs || []).map((def) => {\n        const oldKey = def._key\n        const newKey = keyGenerator()\n        newNode.children = newNode.children.map((child) =>\n          child._type === spanTypeName && editor.isTextSpan(child)\n            ? {\n                ...child,\n                marks:\n                  child.marks && child.marks.includes(oldKey)\n                    ? // eslint-disable-next-line max-nested-callbacks\n                      [...child.marks].filter((mark) => mark !== oldKey).concat(newKey)\n                    : child.marks,\n              }\n            : child,\n        )\n        return {...def, _key: newKey}\n      })\n    }\n    const nodeWithNewKeys = {...newNode, _key: keyGenerator()}\n    if (editor.isTextBlock(nodeWithNewKeys)) {\n      nodeWithNewKeys.children = nodeWithNewKeys.children.map((child) => ({\n        ...child,\n        _key: keyGenerator(),\n      }))\n    }\n    return nodeWithNewKeys as Descendant\n  })\n}\n\n/**\n * Shared helper function to insert the final fragment into the editor\n *\n * @internal\n */\nfunction _insertFragment(\n  editor: PortableTextSlateEditor,\n  fragment: Descendant[],\n  schemaTypes: PortableTextMemberSchemaTypes,\n) {\n  editor.withoutNormalizing(() => {\n    if (!editor.selection) {\n      return\n    }\n    // Ensure that markDefs for any annotations inside this fragment are copied over to the focused text block.\n    const [focusBlock, focusPath] = Editor.node(editor, editor.selection, {depth: 1})\n    if (editor.isTextBlock(focusBlock) && editor.isTextBlock(fragment[0])) {\n      const {markDefs} = focusBlock\n      debug('Mixing markDefs of focusBlock and fragments[0] block', markDefs, fragment[0].markDefs)\n      if (!isEqual(markDefs, fragment[0].markDefs)) {\n        Transforms.setNodes(\n          editor,\n          {\n            markDefs: uniq([...(fragment[0].markDefs || []), ...(markDefs || [])]),\n          },\n          {at: focusPath, mode: 'lowest', voids: false},\n        )\n      }\n    }\n\n    const isPasteToEmptyEditor = isEqualToEmptyEditor(editor.children, schemaTypes)\n\n    if (isPasteToEmptyEditor) {\n      // Special case for pasting directly into an empty editor (a placeholder block).\n      // When pasting content starting with multiple empty blocks,\n      // `editor.insertFragment` can potentially duplicate the keys of\n      // the placeholder block because of operations that happen\n      // inside `editor.insertFragment` (involves an `insert_node` operation).\n      // However by splitting the placeholder block first in this situation we are good.\n      Transforms.splitNodes(editor, {at: [0, 0]})\n      editor.insertFragment(fragment)\n      Transforms.removeNodes(editor, {at: [0]})\n    } else {\n      // All other inserts\n      editor.insertFragment(fragment)\n    }\n  })\n\n  editor.onChange()\n}\n","import {noop} from 'lodash'\nimport {type BaseOperation, type Editor, type Node, type NodeEntry} from 'slate'\n\nimport {type PortableTextSlateEditor} from '../../types/editor'\nimport {type createEditorOptions} from '../../types/options'\nimport {createOperationToPatches} from '../../utils/operationToPatches'\nimport {createWithEditableAPI} from './createWithEditableAPI'\nimport {createWithInsertBreak} from './createWithInsertBreak'\nimport {createWithMaxBlocks} from './createWithMaxBlocks'\nimport {createWithObjectKeys} from './createWithObjectKeys'\nimport {createWithPatches} from './createWithPatches'\nimport {createWithPlaceholderBlock} from './createWithPlaceholderBlock'\nimport {createWithPortableTextBlockStyle} from './createWithPortableTextBlockStyle'\nimport {createWithPortableTextLists} from './createWithPortableTextLists'\nimport {createWithPortableTextMarkModel} from './createWithPortableTextMarkModel'\nimport {createWithPortableTextSelections} from './createWithPortableTextSelections'\nimport {createWithSchemaTypes} from './createWithSchemaTypes'\nimport {createWithUndoRedo} from './createWithUndoRedo'\nimport {createWithUtils} from './createWithUtils'\n\nexport {createWithEditableAPI} from './createWithEditableAPI'\nexport {createWithHotkeys} from './createWithHotKeys'\nexport {createWithInsertData} from './createWithInsertData'\nexport {createWithMaxBlocks} from './createWithMaxBlocks'\nexport {createWithObjectKeys} from './createWithObjectKeys'\nexport {createWithPatches} from './createWithPatches'\nexport {createWithPortableTextBlockStyle} from './createWithPortableTextBlockStyle'\nexport {createWithPortableTextLists} from './createWithPortableTextLists'\nexport {createWithPortableTextMarkModel} from './createWithPortableTextMarkModel'\nexport {createWithPortableTextSelections} from './createWithPortableTextSelections'\nexport {createWithSchemaTypes} from './createWithSchemaTypes'\nexport {createWithUndoRedo} from './createWithUndoRedo'\nexport {createWithUtils} from './createWithUtils'\n\nexport interface OriginalEditorFunctions {\n  apply: (operation: BaseOperation) => void\n  onChange: () => void\n  normalizeNode: (entry: NodeEntry<Node>) => void\n}\n\nconst originalFnMap = new WeakMap<PortableTextSlateEditor, OriginalEditorFunctions>()\n\nexport const withPlugins = <T extends Editor>(\n  editor: T,\n  options: createEditorOptions,\n): {editor: PortableTextSlateEditor; subscribe: () => () => void} => {\n  const e = editor as T & PortableTextSlateEditor\n  const {keyGenerator, portableTextEditor, patches$, readOnly, maxBlocks} = options\n  const {schemaTypes, change$} = portableTextEditor\n  e.subscriptions = []\n  if (e.destroy) {\n    e.destroy()\n  } else {\n    // Save a copy of the original editor functions here before they were changed by plugins.\n    // We will put them back when .destroy is called (see below).\n    originalFnMap.set(e, {\n      apply: e.apply,\n      onChange: e.onChange,\n      normalizeNode: e.normalizeNode,\n    })\n  }\n  const operationToPatches = createOperationToPatches(schemaTypes)\n  const withObjectKeys = createWithObjectKeys(schemaTypes, keyGenerator)\n  const withSchemaTypes = createWithSchemaTypes({schemaTypes, keyGenerator})\n  const withEditableAPI = createWithEditableAPI(portableTextEditor, schemaTypes, keyGenerator)\n  const withPatches = createWithPatches({\n    change$,\n    keyGenerator,\n    patches$,\n    patchFunctions: operationToPatches,\n    readOnly,\n    schemaTypes,\n  })\n  const withMaxBlocks = createWithMaxBlocks(maxBlocks || -1)\n  const withPortableTextLists = createWithPortableTextLists(schemaTypes)\n  const withUndoRedo = createWithUndoRedo({\n    readOnly,\n    patches$,\n    blockSchemaType: schemaTypes.block,\n  })\n  const withPortableTextMarkModel = createWithPortableTextMarkModel(schemaTypes, change$)\n  const withPortableTextBlockStyle = createWithPortableTextBlockStyle(schemaTypes)\n\n  const withPlaceholderBlock = createWithPlaceholderBlock()\n\n  const withInsertBreak = createWithInsertBreak(schemaTypes)\n\n  const withUtils = createWithUtils({keyGenerator, schemaTypes, portableTextEditor})\n  const withPortableTextSelections = createWithPortableTextSelections(change$, schemaTypes)\n\n  e.destroy = () => {\n    const originalFunctions = originalFnMap.get(e)\n    if (!originalFunctions) {\n      throw new Error('Could not find pristine versions of editor functions')\n    }\n    e.apply = originalFunctions.apply\n    e.history = {undos: [], redos: []}\n    e.normalizeNode = originalFunctions.normalizeNode\n    e.onChange = originalFunctions.onChange\n  }\n  if (readOnly) {\n    return {\n      editor: withSchemaTypes(\n        withObjectKeys(\n          withPortableTextMarkModel(\n            withPortableTextBlockStyle(\n              withUtils(\n                withPlaceholderBlock(\n                  withPortableTextLists(\n                    withPortableTextSelections(withEditableAPI(withInsertBreak(e))),\n                  ),\n                ),\n              ),\n            ),\n          ),\n        ),\n      ),\n      subscribe: () => noop,\n    }\n  }\n\n  // Ordering is important here, selection dealing last, data manipulation in the middle and core model stuff first.\n  return {\n    editor: withSchemaTypes(\n      withObjectKeys(\n        withPortableTextMarkModel(\n          withPortableTextBlockStyle(\n            withPortableTextLists(\n              withPlaceholderBlock(\n                withUtils(\n                  withMaxBlocks(\n                    withUndoRedo(\n                      withPatches(withPortableTextSelections(withEditableAPI(withInsertBreak(e)))),\n                    ),\n                  ),\n                ),\n              ),\n            ),\n          ),\n        ),\n      ),\n    ),\n    subscribe: () => {\n      const unsubscribes: (() => void)[] = []\n      editor.subscriptions.forEach((subscribeFn) => {\n        unsubscribes.push(subscribeFn())\n      })\n      return () => {\n        unsubscribes.forEach((unsubscribeFn) => {\n          unsubscribeFn()\n        })\n      }\n    },\n  }\n}\n","import {type PropsWithChildren, useEffect, useMemo, useState} from 'react'\nimport {createEditor} from 'slate'\nimport {Slate, withReact} from 'slate-react'\n\nimport {type PatchObservable} from '../../types/editor'\nimport {debugWithName} from '../../utils/debug'\nimport {KEY_TO_SLATE_ELEMENT, KEY_TO_VALUE_ELEMENT} from '../../utils/weakMaps'\nimport {withPlugins} from '../plugins'\nimport {type PortableTextEditor} from '../PortableTextEditor'\n\nconst debug = debugWithName('component:PortableTextEditor:SlateContainer')\n\n/**\n * @internal\n */\nexport interface SlateContainerProps extends PropsWithChildren {\n  keyGenerator: () => string\n  maxBlocks: number | undefined\n  patches$?: PatchObservable\n  portableTextEditor: PortableTextEditor\n  readOnly: boolean\n}\n\n/**\n * Sets up and encapsulates the Slate instance\n * @internal\n */\nexport function SlateContainer(props: SlateContainerProps) {\n  const {patches$, portableTextEditor, readOnly, maxBlocks, keyGenerator} = props\n\n  // Create the slate instance, using `useState` ensures setup is only run once, initially\n  const [[slateEditor, subscribe]] = useState(() => {\n    debug('Creating new Slate editor instance')\n    const {editor, subscribe: _sub} = withPlugins(withReact(createEditor()), {\n      keyGenerator,\n      maxBlocks,\n      patches$,\n      portableTextEditor,\n      readOnly,\n    })\n    KEY_TO_VALUE_ELEMENT.set(editor, {})\n    KEY_TO_SLATE_ELEMENT.set(editor, {})\n    return [editor, _sub] as const\n  })\n\n  useEffect(() => {\n    const unsubscribe = subscribe()\n    return () => {\n      unsubscribe()\n    }\n  }, [subscribe])\n\n  // Update the slate instance when plugin dependent props change.\n  useEffect(() => {\n    debug('Re-initializing plugin chain')\n    withPlugins(slateEditor, {\n      keyGenerator,\n      maxBlocks,\n      patches$,\n      portableTextEditor,\n      readOnly,\n    })\n  }, [keyGenerator, portableTextEditor, maxBlocks, readOnly, patches$, slateEditor])\n\n  const initialValue = useMemo(() => {\n    return [slateEditor.pteCreateEmptyBlock()]\n  }, [slateEditor])\n\n  useEffect(() => {\n    return () => {\n      debug('Destroying Slate editor')\n      slateEditor.destroy()\n    }\n  }, [slateEditor])\n\n  return (\n    <Slate editor={slateEditor} initialValue={initialValue}>\n      {props.children}\n    </Slate>\n  )\n}\n","import {randomKey} from '@sanity/util/content'\nimport {createContext, useContext} from 'react'\n\nexport const defaultKeyGenerator = (): string => randomKey(12)\n\n/**\n * A React context for sharing the editor's keyGenerator.\n */\nexport const PortableTextEditorKeyGeneratorContext =\n  createContext<() => string>(defaultKeyGenerator)\n\n/**\n * Get the current editor selection from the React context.\n */\nexport const usePortableTextEditorKeyGenerator = (): (() => string) => {\n  const keyGenerator = useContext(PortableTextEditorKeyGeneratorContext)\n\n  if (keyGenerator === undefined) {\n    throw new Error(\n      `The \\`usePortableTextEditorKeyGenerator\\` hook must be used inside the <PortableTextEditor> component's context.`,\n    )\n  }\n  return keyGenerator\n}\n","import {createContext, useContext} from 'react'\n\nimport {type EditorSelection} from '../../types/editor'\n\n/**\n * A React context for sharing the editor selection.\n */\nexport const PortableTextEditorSelectionContext = createContext<EditorSelection | null>(null)\n\n/**\n * Get the current editor selection from the React context.\n */\nexport const usePortableTextEditorSelection = (): EditorSelection => {\n  const selection = useContext(PortableTextEditorSelectionContext)\n\n  if (selection === undefined) {\n    throw new Error(\n      `The \\`usePortableTextEditorSelection\\` hook must be used inside the <PortableTextEditor> component's context.`,\n    )\n  }\n  return selection\n}\n","import {type PortableTextBlock} from '@sanity/types'\nimport {createContext, useContext} from 'react'\n\n/**\n * A React context for sharing the editor value.\n */\nexport const PortableTextEditorValueContext = createContext<PortableTextBlock[] | undefined>(\n  undefined,\n)\n\n/**\n * Get the current editor value from the React context.\n */\nexport const usePortableTextEditorValue = () => {\n  return useContext(PortableTextEditorValueContext)\n}\n","import {createContext, useContext} from 'react'\n\n/**\n * A React context for sharing the editor's readOnly status.\n */\nexport const PortableTextEditorReadOnlyContext = createContext<boolean>(false)\n\n/**\n * Get the current editor selection from the React context.\n */\nexport const usePortableTextEditorReadOnlyStatus = (): boolean => {\n  const readOnly = useContext(PortableTextEditorReadOnlyContext)\n\n  if (readOnly === undefined) {\n    throw new Error(\n      `The \\`usePortableTextEditorReadOnly\\` hook must be used inside the <PortableTextEditor> component's context.`,\n    )\n  }\n  return readOnly\n}\n","/* eslint-disable max-nested-callbacks */\nimport {type PortableTextBlock} from '@sanity/types'\nimport {debounce, isEqual} from 'lodash'\nimport {useCallback, useMemo, useRef} from 'react'\nimport {type Descendant, Editor, type Node, Text, Transforms} from 'slate'\nimport {useSlate} from 'slate-react'\n\nimport {type EditorChange, type PortableTextSlateEditor} from '../../types/editor'\nimport {debugWithName} from '../../utils/debug'\nimport {validateValue} from '../../utils/validateValue'\nimport {toSlateValue, VOID_CHILD_KEY} from '../../utils/values'\nimport {isChangingLocally, isChangingRemotely, withRemoteChanges} from '../../utils/withChanges'\nimport {withoutPatching} from '../../utils/withoutPatching'\nimport {withPreserveKeys} from '../../utils/withPreserveKeys'\nimport {withoutSaving} from '../plugins/createWithUndoRedo'\nimport {type PortableTextEditor} from '../PortableTextEditor'\n\nconst debug = debugWithName('hook:useSyncValue')\n\n/**\n * @internal\n */\nexport interface UseSyncValueProps {\n  keyGenerator: () => string\n  onChange: (change: EditorChange) => void\n  portableTextEditor: PortableTextEditor\n  readOnly: boolean\n}\n\nconst CURRENT_VALUE = new WeakMap<PortableTextEditor, PortableTextBlock[] | undefined>()\n\n/**\n * Sync value with the editor state\n *\n * Normally nothing here should apply, and the editor and the real world are perfectly aligned.\n *\n * Inconsistencies could happen though, so we need to check the editor state when the value changes.\n *\n * For performance reasons, it makes sense to also do the content validation here, as we already\n * iterate over the value and can validate only the new content that is actually changed.\n *\n * @internal\n */\nexport function useSyncValue(\n  props: UseSyncValueProps,\n): (value: PortableTextBlock[] | undefined, userCallbackFn?: () => void) => void {\n  const {portableTextEditor, readOnly, keyGenerator} = props\n  const {change$, schemaTypes} = portableTextEditor\n  const previousValue = useRef<PortableTextBlock[] | undefined>()\n  const slateEditor = useSlate()\n  const updateValueFunctionRef = useRef<(value: PortableTextBlock[] | undefined) => void>()\n\n  const updateFromCurrentValue = useCallback(() => {\n    const currentValue = CURRENT_VALUE.get(portableTextEditor)\n    if (previousValue.current === currentValue) {\n      debug('Value is the same object as previous, not need to sync')\n      return\n    }\n    if (updateValueFunctionRef.current && currentValue) {\n      debug('Updating the value debounced')\n      updateValueFunctionRef.current(currentValue)\n    }\n  }, [portableTextEditor])\n  const updateValueDebounced = useMemo(\n    () => debounce(updateFromCurrentValue, 1000, {trailing: true, leading: false}),\n    [updateFromCurrentValue],\n  )\n\n  return useMemo(() => {\n    const updateFunction = (value: PortableTextBlock[] | undefined) => {\n      CURRENT_VALUE.set(portableTextEditor, value)\n      const isProcessingLocalChanges = isChangingLocally(slateEditor)\n      const isProcessingRemoteChanges = isChangingRemotely(slateEditor)\n      if (!readOnly) {\n        if (isProcessingLocalChanges) {\n          debug('Has local changes, not syncing value right now')\n          updateValueDebounced()\n          return\n        }\n        if (isProcessingRemoteChanges) {\n          debug('Has remote changes, not syncing value right now')\n          updateValueDebounced()\n          return\n        }\n      }\n\n      let isChanged = false\n      let isValid = true\n\n      const hadSelection = !!slateEditor.selection\n\n      // If empty value, remove everything in the editor and insert a placeholder block\n      if (!value || value.length === 0) {\n        debug('Value is empty')\n        Editor.withoutNormalizing(slateEditor, () => {\n          withoutSaving(slateEditor, () => {\n            withoutPatching(slateEditor, () => {\n              if (hadSelection) {\n                Transforms.deselect(slateEditor)\n              }\n              const childrenLength = slateEditor.children.length\n              slateEditor.children.forEach((_, index) => {\n                Transforms.removeNodes(slateEditor, {\n                  at: [childrenLength - 1 - index],\n                })\n              })\n              Transforms.insertNodes(slateEditor, slateEditor.pteCreateEmptyBlock(), {at: [0]})\n              // Add a new selection in the top of the document\n              if (hadSelection) {\n                Transforms.select(slateEditor, [0, 0])\n              }\n            })\n          })\n        })\n        isChanged = true\n      }\n      // Remove, replace or add nodes according to what is changed.\n      if (value && value.length > 0) {\n        const slateValueFromProps = toSlateValue(value, {\n          schemaTypes,\n        })\n        Editor.withoutNormalizing(slateEditor, () => {\n          withRemoteChanges(slateEditor, () => {\n            withoutSaving(slateEditor, () => {\n              withoutPatching(slateEditor, () => {\n                const childrenLength = slateEditor.children.length\n                // Remove blocks that have become superfluous\n                if (slateValueFromProps.length < childrenLength) {\n                  for (let i = childrenLength - 1; i > slateValueFromProps.length - 1; i--) {\n                    Transforms.removeNodes(slateEditor, {\n                      at: [i],\n                    })\n                  }\n                  isChanged = true\n                }\n                // Go through all of the blocks and see if they need to be updated\n                slateValueFromProps.forEach((currentBlock, currentBlockIndex) => {\n                  const oldBlock = slateEditor.children[currentBlockIndex]\n                  const hasChanges = oldBlock && !isEqual(currentBlock, oldBlock)\n                  if (hasChanges && isValid) {\n                    const validationValue = [value[currentBlockIndex]]\n                    const validation = validateValue(validationValue, schemaTypes, keyGenerator)\n                    // Resolve validations that can be resolved automatically, without involving the user (but only if the value was changed)\n                    if (\n                      !validation.valid &&\n                      validation.resolution?.autoResolve &&\n                      validation.resolution?.patches.length > 0\n                    ) {\n                      // Only apply auto resolution if the value has been populated before and is different from the last one.\n                      if (!readOnly && previousValue.current && previousValue.current !== value) {\n                        // Give a console warning about the fact that it did an auto resolution\n                        console.warn(\n                          `${validation.resolution.action} for block with _key '${validationValue[0]._key}'. ${validation.resolution?.description}`,\n                        )\n                        validation.resolution.patches.forEach((patch) => {\n                          change$.next({type: 'patch', patch})\n                        })\n                      }\n                    }\n                    if (validation.valid || validation.resolution?.autoResolve) {\n                      if (oldBlock._key === currentBlock._key) {\n                        if (debug.enabled) debug('Updating block', oldBlock, currentBlock)\n                        _updateBlock(slateEditor, currentBlock, oldBlock, currentBlockIndex)\n                      } else {\n                        if (debug.enabled) debug('Replacing block', oldBlock, currentBlock)\n                        _replaceBlock(slateEditor, currentBlock, currentBlockIndex)\n                      }\n                      isChanged = true\n                    } else {\n                      change$.next({\n                        type: 'invalidValue',\n                        resolution: validation.resolution,\n                        value,\n                      })\n                      isValid = false\n                    }\n                  }\n                  if (!oldBlock && isValid) {\n                    const validationValue = [value[currentBlockIndex]]\n                    const validation = validateValue(validationValue, schemaTypes, keyGenerator)\n                    if (debug.enabled)\n                      debug(\n                        'Validating and inserting new block in the end of the value',\n                        currentBlock,\n                      )\n                    if (validation.valid || validation.resolution?.autoResolve) {\n                      withPreserveKeys(slateEditor, () => {\n                        Transforms.insertNodes(slateEditor, currentBlock, {\n                          at: [currentBlockIndex],\n                        })\n                      })\n                    } else {\n                      debug('Invalid', validation)\n                      change$.next({\n                        type: 'invalidValue',\n                        resolution: validation.resolution,\n                        value,\n                      })\n                      isValid = false\n                    }\n                  }\n                })\n              })\n            })\n          })\n        })\n      }\n\n      if (!isValid) {\n        debug('Invalid value, returning')\n        return\n      }\n      if (isChanged) {\n        debug('Server value changed, syncing editor')\n        try {\n          slateEditor.onChange()\n        } catch (err) {\n          console.error(err)\n          change$.next({\n            type: 'invalidValue',\n            resolution: null,\n            value,\n          })\n          return\n        }\n        if (hadSelection && !slateEditor.selection) {\n          Transforms.select(slateEditor, {\n            anchor: {path: [0, 0], offset: 0},\n            focus: {path: [0, 0], offset: 0},\n          })\n          slateEditor.onChange()\n        }\n        change$.next({type: 'value', value})\n      } else {\n        debug('Server value and editor value is equal, no need to sync.')\n      }\n      previousValue.current = value\n    }\n    updateValueFunctionRef.current = updateFunction\n    return updateFunction\n  }, [\n    change$,\n    keyGenerator,\n    portableTextEditor,\n    readOnly,\n    schemaTypes,\n    slateEditor,\n    updateValueDebounced,\n  ])\n}\n\n/**\n * This code is moved out of the above algorithm to keep complexity down.\n * @internal\n */\nfunction _replaceBlock(\n  slateEditor: PortableTextSlateEditor,\n  currentBlock: Descendant,\n  currentBlockIndex: number,\n) {\n  // While replacing the block and the current selection focus is on the replaced block,\n  // temporarily deselect the editor then optimistically try to restore the selection afterwards.\n  const currentSelection = slateEditor.selection\n  const selectionFocusOnBlock =\n    currentSelection && currentSelection.focus.path[0] === currentBlockIndex\n  if (selectionFocusOnBlock) {\n    Transforms.deselect(slateEditor)\n  }\n  Transforms.removeNodes(slateEditor, {at: [currentBlockIndex]})\n  withPreserveKeys(slateEditor, () => {\n    Transforms.insertNodes(slateEditor, currentBlock, {at: [currentBlockIndex]})\n  })\n  slateEditor.onChange()\n  if (selectionFocusOnBlock) {\n    Transforms.select(slateEditor, currentSelection)\n  }\n}\n\n/**\n * This code is moved out of the above algorithm to keep complexity down.\n * @internal\n */\nfunction _updateBlock(\n  slateEditor: PortableTextSlateEditor,\n  currentBlock: Descendant,\n  oldBlock: Descendant,\n  currentBlockIndex: number,\n) {\n  // Update the root props on the block\n  Transforms.setNodes(slateEditor, currentBlock as Partial<Node>, {\n    at: [currentBlockIndex],\n  })\n  // Text block's need to have their children updated as well (setNode does not target a node's children)\n  if (slateEditor.isTextBlock(currentBlock) && slateEditor.isTextBlock(oldBlock)) {\n    const oldBlockChildrenLength = oldBlock.children.length\n    if (currentBlock.children.length < oldBlockChildrenLength) {\n      // Remove any children that have become superfluous\n      Array.from(Array(oldBlockChildrenLength - currentBlock.children.length)).forEach(\n        (_, index) => {\n          const childIndex = oldBlockChildrenLength - 1 - index\n          if (childIndex > 0) {\n            debug('Removing child')\n            Transforms.removeNodes(slateEditor, {\n              at: [currentBlockIndex, childIndex],\n            })\n          }\n        },\n      )\n    }\n    currentBlock.children.forEach((currentBlockChild, currentBlockChildIndex) => {\n      const oldBlockChild = oldBlock.children[currentBlockChildIndex]\n      const isChildChanged = !isEqual(currentBlockChild, oldBlockChild)\n      const isTextChanged = !isEqual(currentBlockChild.text, oldBlockChild?.text)\n      const path = [currentBlockIndex, currentBlockChildIndex]\n      if (isChildChanged) {\n        // Update if this is the same child\n        if (currentBlockChild._key === oldBlockChild?._key) {\n          debug('Updating changed child', currentBlockChild, oldBlockChild)\n          Transforms.setNodes(slateEditor, currentBlockChild as Partial<Node>, {\n            at: path,\n          })\n          const isSpanNode =\n            Text.isText(currentBlockChild) &&\n            currentBlockChild._type === 'span' &&\n            Text.isText(oldBlockChild) &&\n            oldBlockChild._type === 'span'\n          if (isSpanNode && isTextChanged) {\n            Transforms.delete(slateEditor, {\n              at: {focus: {path, offset: 0}, anchor: {path, offset: oldBlockChild.text.length}},\n            })\n            Transforms.insertText(slateEditor, currentBlockChild.text, {\n              at: path,\n            })\n            slateEditor.onChange()\n          } else if (!isSpanNode) {\n            // If it's a inline block, also update the void text node key\n            debug('Updating changed inline object child', currentBlockChild)\n            Transforms.setNodes(\n              slateEditor,\n              {_key: VOID_CHILD_KEY},\n              {\n                at: [...path, 0],\n                voids: true,\n              },\n            )\n          }\n          // Replace the child if _key's are different\n        } else if (oldBlockChild) {\n          debug('Replacing child', currentBlockChild)\n          Transforms.removeNodes(slateEditor, {\n            at: [currentBlockIndex, currentBlockChildIndex],\n          })\n          withPreserveKeys(slateEditor, () => {\n            Transforms.insertNodes(slateEditor, currentBlockChild as Node, {\n              at: [currentBlockIndex, currentBlockChildIndex],\n            })\n          })\n          slateEditor.onChange()\n          // Insert it if it didn't exist before\n        } else if (!oldBlockChild) {\n          debug('Inserting new child', currentBlockChild)\n          withPreserveKeys(slateEditor, () => {\n            Transforms.insertNodes(slateEditor, currentBlockChild as Node, {\n              at: [currentBlockIndex, currentBlockChildIndex],\n            })\n            slateEditor.onChange()\n          })\n        }\n      }\n    })\n  }\n}\n","import {type PortableTextBlock} from '@sanity/types'\nimport {throttle} from 'lodash'\nimport {\n  type PropsWithChildren,\n  startTransition,\n  useCallback,\n  useEffect,\n  useMemo,\n  useRef,\n  useState,\n} from 'react'\nimport {Editor} from 'slate'\nimport {useSlate} from 'slate-react'\n\nimport {type EditorChange, type EditorChanges, type EditorSelection} from '../../types/editor'\nimport {type Patch} from '../../types/patch'\nimport {debugWithName} from '../../utils/debug'\nimport {IS_PROCESSING_LOCAL_CHANGES} from '../../utils/weakMaps'\nimport {PortableTextEditorContext} from '../hooks/usePortableTextEditor'\nimport {PortableTextEditorKeyGeneratorContext} from '../hooks/usePortableTextEditorKeyGenerator'\nimport {PortableTextEditorSelectionContext} from '../hooks/usePortableTextEditorSelection'\nimport {PortableTextEditorValueContext} from '../hooks/usePortableTextEditorValue'\nimport {PortableTextEditorReadOnlyContext} from '../hooks/usePortableTextReadOnly'\nimport {useSyncValue} from '../hooks/useSyncValue'\nimport {PortableTextEditor} from '../PortableTextEditor'\n\nconst debug = debugWithName('component:PortableTextEditor:Synchronizer')\nconst debugVerbose = debug.enabled && false\n\n// The editor will commit changes in a throttled fashion in order\n// not to overload the network and degrade performance while typing.\nconst FLUSH_PATCHES_THROTTLED_MS = process.env.NODE_ENV === 'test' ? 500 : 1000\n\n/**\n * @internal\n */\nexport interface SynchronizerProps extends PropsWithChildren {\n  change$: EditorChanges\n  portableTextEditor: PortableTextEditor\n  keyGenerator: () => string\n  onChange: (change: EditorChange) => void\n  readOnly: boolean\n  value: PortableTextBlock[] | undefined\n}\n\n/**\n * Synchronizes the server value with the editor, and provides various contexts for the editor state.\n * @internal\n */\nexport function Synchronizer(props: SynchronizerProps) {\n  const {change$, portableTextEditor, onChange, keyGenerator, readOnly, value} = props\n  const [selection, setSelection] = useState<EditorSelection>(null)\n  const pendingPatches = useRef<Patch[]>([])\n\n  const syncValue = useSyncValue({\n    keyGenerator,\n    onChange,\n    portableTextEditor,\n    readOnly,\n  })\n\n  const slateEditor = useSlate()\n\n  useEffect(() => {\n    IS_PROCESSING_LOCAL_CHANGES.set(slateEditor, false)\n  }, [slateEditor])\n\n  const onFlushPendingPatches = useCallback(() => {\n    if (pendingPatches.current.length > 0) {\n      debug('Flushing pending patches')\n      if (debugVerbose) {\n        debug(`Patches:\\n${JSON.stringify(pendingPatches.current, null, 2)}`)\n      }\n      const snapshot = PortableTextEditor.getValue(portableTextEditor)\n      change$.next({type: 'mutation', patches: pendingPatches.current, snapshot})\n      pendingPatches.current = []\n    }\n    IS_PROCESSING_LOCAL_CHANGES.set(slateEditor, false)\n  }, [slateEditor, portableTextEditor, change$])\n\n  const onFlushPendingPatchesThrottled = useMemo(() => {\n    return throttle(\n      () => {\n        // If the editor is normalizing (each operation) it means that it's not in the middle of a bigger transform,\n        // and we can flush these changes immediately.\n        if (Editor.isNormalizing(slateEditor)) {\n          onFlushPendingPatches()\n          return\n        }\n        // If it's in the middle of something, try again.\n        onFlushPendingPatchesThrottled()\n      },\n      FLUSH_PATCHES_THROTTLED_MS,\n      {\n        leading: false,\n        trailing: true,\n      },\n    )\n  }, [onFlushPendingPatches, slateEditor])\n\n  // Flush pending patches immediately on unmount\n  useEffect(() => {\n    return () => {\n      onFlushPendingPatches()\n    }\n  }, [onFlushPendingPatches])\n\n  // Subscribe to, and handle changes from the editor\n  useEffect(() => {\n    debug('Subscribing to editor changes$')\n    const sub = change$.subscribe((next: EditorChange): void => {\n      switch (next.type) {\n        case 'patch':\n          IS_PROCESSING_LOCAL_CHANGES.set(slateEditor, true)\n          pendingPatches.current.push(next.patch)\n          onFlushPendingPatchesThrottled()\n          onChange(next)\n          break\n        case 'selection':\n          // Set the selection state in a transition, we don't need the state immediately.\n          startTransition(() => {\n            if (debugVerbose) debug('Setting selection')\n            setSelection(next.selection)\n          })\n          onChange(next) // Keep this out of the startTransition!\n          break\n        default:\n          onChange(next)\n      }\n    })\n    return () => {\n      debug('Unsubscribing to changes$')\n      sub.unsubscribe()\n    }\n  }, [change$, onChange, onFlushPendingPatchesThrottled, slateEditor])\n\n  // Sync the value when going online\n  const handleOnline = useCallback(() => {\n    debug('Editor is online, syncing from props.value')\n    change$.next({type: 'connection', value: 'online'})\n    syncValue(value)\n  }, [change$, syncValue, value])\n\n  const handleOffline = useCallback(() => {\n    debug('Editor is offline')\n    change$.next({type: 'connection', value: 'offline'})\n  }, [change$])\n\n  // Notify about window online and offline status changes\n  useEffect(() => {\n    if (portableTextEditor.props.patches$) {\n      window.addEventListener('online', handleOnline)\n      window.addEventListener('offline', handleOffline)\n    }\n    return () => {\n      if (portableTextEditor.props.patches$) {\n        window.removeEventListener('online', handleOnline)\n        window.removeEventListener('offline', handleOffline)\n      }\n    }\n  })\n\n  // This hook must be set up after setting up the subscription above, or it will not pick up validation errors from the useSyncValue hook.\n  // This will cause the editor to not be able to signal a validation error and offer invalid value resolution of the initial value.\n  const isInitialValueFromProps = useRef(true)\n  useEffect(() => {\n    debug('Value from props changed, syncing new value')\n    syncValue(value)\n    // Signal that we have our first value, and are ready to roll.\n    if (isInitialValueFromProps.current) {\n      change$.next({type: 'loading', isLoading: false})\n      change$.next({type: 'ready'})\n      isInitialValueFromProps.current = false\n    }\n  }, [change$, syncValue, value])\n\n  return (\n    <PortableTextEditorKeyGeneratorContext.Provider value={keyGenerator}>\n      <PortableTextEditorContext.Provider value={portableTextEditor}>\n        <PortableTextEditorValueContext.Provider value={value}>\n          <PortableTextEditorReadOnlyContext.Provider value={readOnly}>\n            <PortableTextEditorSelectionContext.Provider value={selection}>\n              {props.children}\n            </PortableTextEditorSelectionContext.Provider>\n          </PortableTextEditorReadOnlyContext.Provider>\n        </PortableTextEditorValueContext.Provider>\n      </PortableTextEditorContext.Provider>\n    </PortableTextEditorKeyGeneratorContext.Provider>\n  )\n}\n","import {\n  type ArrayDefinition,\n  type ArraySchemaType,\n  type BlockSchemaType,\n  type ObjectSchemaType,\n  type Path,\n  type PortableTextBlock,\n  type PortableTextChild,\n  type PortableTextObject,\n  type SpanSchemaType,\n} from '@sanity/types'\nimport {Component, type MutableRefObject, type PropsWithChildren} from 'react'\nimport {Subject} from 'rxjs'\n\nimport {\n  type EditableAPI,\n  type EditableAPIDeleteOptions,\n  type EditorChange,\n  type EditorChanges,\n  type EditorSelection,\n  type PatchObservable,\n  type PortableTextMemberSchemaTypes,\n} from '../types/editor'\nimport {debugWithName} from '../utils/debug'\nimport {getPortableTextMemberSchemaTypes} from '../utils/getPortableTextMemberSchemaTypes'\nimport {compileType} from '../utils/schema'\nimport {SlateContainer} from './components/SlateContainer'\nimport {Synchronizer} from './components/Synchronizer'\nimport {defaultKeyGenerator} from './hooks/usePortableTextEditorKeyGenerator'\n\nconst debug = debugWithName('component:PortableTextEditor')\n\n/**\n * Props for the PortableTextEditor component\n *\n * @public\n */\n/**\n * Props for the PortableTextEditor component\n *\n * @public\n */\nexport type PortableTextEditorProps = PropsWithChildren<{\n  /**\n   * Function that gets called when the editor changes the value\n   */\n  onChange: (change: EditorChange) => void\n\n  /**\n   * Schema type for the portable text field\n   */\n  schemaType: ArraySchemaType<PortableTextBlock> | ArrayDefinition\n\n  /**\n   * Maximum number of blocks to allow within the editor\n   */\n  maxBlocks?: number | string\n\n  /**\n   * Whether or not the editor should be in read-only mode\n   */\n  readOnly?: boolean\n\n  /**\n   * The current value of the portable text field\n   */\n  value?: PortableTextBlock[]\n\n  /**\n   * Function used to generate keys for array items (`_key`)\n   */\n  keyGenerator?: () => string\n\n  /**\n   * Observable of local and remote patches for the edited value.\n   */\n  patches$?: PatchObservable\n\n  /**\n   * Backward compatibility (renamed to patches$).\n   */\n  incomingPatches$?: PatchObservable\n\n  /**\n   * A ref to the editor instance\n   */\n  editorRef?: MutableRefObject<PortableTextEditor | null>\n}>\n\n/**\n * The main Portable Text Editor component.\n * @public\n */\nexport class PortableTextEditor extends Component<PortableTextEditorProps> {\n  /**\n   * An observable of all the editor changes.\n   */\n  public change$: EditorChanges = new Subject()\n  /**\n   * A lookup table for all the relevant schema types for this portable text type.\n   */\n  public schemaTypes: PortableTextMemberSchemaTypes\n  /**\n   * The editor API (currently implemented with Slate).\n   */\n  private editable?: EditableAPI\n\n  constructor(props: PortableTextEditorProps) {\n    super(props)\n\n    if (!props.schemaType) {\n      throw new Error('PortableTextEditor: missing \"type\" property')\n    }\n\n    if (props.incomingPatches$) {\n      console.warn(`The prop 'incomingPatches$' is deprecated and renamed to 'patches$'`)\n    }\n\n    this.change$.next({type: 'loading', isLoading: true})\n\n    this.schemaTypes = getPortableTextMemberSchemaTypes(\n      props.schemaType.hasOwnProperty('jsonType')\n        ? props.schemaType\n        : compileType(props.schemaType),\n    )\n  }\n\n  componentDidUpdate(prevProps: PortableTextEditorProps) {\n    // Set up the schema type lookup table again if the source schema type changes\n    if (this.props.schemaType !== prevProps.schemaType) {\n      this.schemaTypes = getPortableTextMemberSchemaTypes(\n        this.props.schemaType.hasOwnProperty('jsonType')\n          ? this.props.schemaType\n          : compileType(this.props.schemaType),\n      )\n    }\n    if (this.props.editorRef !== prevProps.editorRef && this.props.editorRef) {\n      this.props.editorRef.current = this\n    }\n  }\n\n  public setEditable = (editable: EditableAPI) => {\n    this.editable = {...this.editable, ...editable}\n  }\n\n  render() {\n    const {onChange, value, children, patches$, incomingPatches$} = this.props\n    const {change$} = this\n    const _patches$ = incomingPatches$ || patches$ // Backward compatibility\n\n    const maxBlocks =\n      typeof this.props.maxBlocks === 'undefined'\n        ? undefined\n        : parseInt(this.props.maxBlocks.toString(), 10) || undefined\n\n    const readOnly = Boolean(this.props.readOnly)\n    const keyGenerator = this.props.keyGenerator || defaultKeyGenerator\n    return (\n      <SlateContainer\n        keyGenerator={keyGenerator}\n        maxBlocks={maxBlocks}\n        patches$={_patches$}\n        portableTextEditor={this}\n        readOnly={readOnly}\n      >\n        <Synchronizer\n          change$={change$}\n          keyGenerator={keyGenerator}\n          onChange={onChange}\n          portableTextEditor={this}\n          readOnly={readOnly}\n          value={value}\n        >\n          {children}\n        </Synchronizer>\n      </SlateContainer>\n    )\n  }\n\n  // Static API methods\n  static activeAnnotations = (editor: PortableTextEditor): PortableTextObject[] => {\n    return editor && editor.editable ? editor.editable.activeAnnotations() : []\n  }\n  static isAnnotationActive = (\n    editor: PortableTextEditor,\n    annotationType: PortableTextObject['_type'],\n  ): boolean => {\n    return editor && editor.editable ? editor.editable.isAnnotationActive(annotationType) : false\n  }\n  static addAnnotation = (\n    editor: PortableTextEditor,\n    type: ObjectSchemaType,\n    value?: {[prop: string]: unknown},\n  ): {spanPath: Path; markDefPath: Path} | undefined => editor.editable?.addAnnotation(type, value)\n  static blur = (editor: PortableTextEditor): void => {\n    debug('Host blurred')\n    editor.editable?.blur()\n  }\n  static delete = (\n    editor: PortableTextEditor,\n    selection: EditorSelection,\n    options?: EditableAPIDeleteOptions,\n  ) => editor.editable?.delete(selection, options)\n  static findDOMNode = (\n    editor: PortableTextEditor,\n    element: PortableTextBlock | PortableTextChild,\n  ) => {\n    // eslint-disable-next-line react/no-find-dom-node\n    return editor.editable?.findDOMNode(element)\n  }\n  static findByPath = (editor: PortableTextEditor, path: Path) => {\n    return editor.editable?.findByPath(path) || []\n  }\n  static focus = (editor: PortableTextEditor): void => {\n    debug('Host requesting focus')\n    editor.editable?.focus()\n  }\n  static focusBlock = (editor: PortableTextEditor) => {\n    return editor.editable?.focusBlock()\n  }\n  static focusChild = (editor: PortableTextEditor): PortableTextChild | undefined => {\n    return editor.editable?.focusChild()\n  }\n  static getSelection = (editor: PortableTextEditor) => {\n    return editor.editable ? editor.editable.getSelection() : null\n  }\n  static getValue = (editor: PortableTextEditor) => {\n    return editor.editable?.getValue()\n  }\n  static hasBlockStyle = (editor: PortableTextEditor, blockStyle: string) => {\n    return editor.editable?.hasBlockStyle(blockStyle)\n  }\n  static hasListStyle = (editor: PortableTextEditor, listStyle: string) => {\n    return editor.editable?.hasListStyle(listStyle)\n  }\n  static isCollapsedSelection = (editor: PortableTextEditor) =>\n    editor.editable?.isCollapsedSelection()\n  static isExpandedSelection = (editor: PortableTextEditor) =>\n    editor.editable?.isExpandedSelection()\n  static isMarkActive = (editor: PortableTextEditor, mark: string) =>\n    editor.editable?.isMarkActive(mark)\n  static insertChild = (\n    editor: PortableTextEditor,\n    type: SpanSchemaType | ObjectSchemaType,\n    value?: {[prop: string]: unknown},\n  ): Path | undefined => {\n    debug(`Host inserting child`)\n    return editor.editable?.insertChild(type, value)\n  }\n  static insertBlock = (\n    editor: PortableTextEditor,\n    type: BlockSchemaType | ObjectSchemaType,\n    value?: {[prop: string]: unknown},\n  ): Path | undefined => {\n    return editor.editable?.insertBlock(type, value)\n  }\n  static insertBreak = (editor: PortableTextEditor): void => {\n    return editor.editable?.insertBreak()\n  }\n  static isVoid = (editor: PortableTextEditor, element: PortableTextBlock | PortableTextChild) => {\n    return editor.editable?.isVoid(element)\n  }\n  static isObjectPath = (editor: PortableTextEditor, path: Path): boolean => {\n    if (!path || !Array.isArray(path)) return false\n    const isChildObjectEditPath = path.length > 3 && path[1] === 'children'\n    const isBlockObjectEditPath = path.length > 1 && path[1] !== 'children'\n    return isBlockObjectEditPath || isChildObjectEditPath\n  }\n  static marks = (editor: PortableTextEditor) => {\n    return editor.editable?.marks()\n  }\n  static select = (editor: PortableTextEditor, selection: EditorSelection | null) => {\n    debug(`Host setting selection`, selection)\n    editor.editable?.select(selection)\n  }\n  static removeAnnotation = (editor: PortableTextEditor, type: ObjectSchemaType) =>\n    editor.editable?.removeAnnotation(type)\n  static toggleBlockStyle = (editor: PortableTextEditor, blockStyle: string) => {\n    debug(`Host is toggling block style`)\n    return editor.editable?.toggleBlockStyle(blockStyle)\n  }\n  static toggleList = (editor: PortableTextEditor, listStyle: string): void => {\n    return editor.editable?.toggleList(listStyle)\n  }\n  static toggleMark = (editor: PortableTextEditor, mark: string): void => {\n    debug(`Host toggling mark`, mark)\n    editor.editable?.toggleMark(mark)\n  }\n  static getFragment = (editor: PortableTextEditor): PortableTextBlock[] | undefined => {\n    debug(`Host getting fragment`)\n    return editor.editable?.getFragment()\n  }\n  static undo = (editor: PortableTextEditor): void => {\n    debug('Host undoing')\n    editor.editable?.undo()\n  }\n  static redo = (editor: PortableTextEditor): void => {\n    debug('Host redoing')\n    editor.editable?.redo()\n  }\n  static isSelectionsOverlapping = (\n    editor: PortableTextEditor,\n    selectionA: EditorSelection,\n    selectionB: EditorSelection,\n  ) => {\n    return editor.editable?.isSelectionsOverlapping(selectionA, selectionB)\n  }\n}\n","import {type Path, type PortableTextObject, type PortableTextTextBlock} from '@sanity/types'\nimport {isEqual, uniq} from 'lodash'\nimport {\n  type ReactElement,\n  startTransition,\n  useCallback,\n  useEffect,\n  useMemo,\n  useRef,\n  useState,\n} from 'react'\nimport {Text} from 'slate'\nimport {type RenderLeafProps, useSelected} from 'slate-react'\n\nimport {\n  type BlockAnnotationRenderProps,\n  type BlockChildRenderProps,\n  type BlockDecoratorRenderProps,\n  type PortableTextMemberSchemaTypes,\n  type RenderAnnotationFunction,\n  type RenderChildFunction,\n  type RenderDecoratorFunction,\n} from '../../types/editor'\nimport {debugWithName} from '../../utils/debug'\nimport {usePortableTextEditor} from '../hooks/usePortableTextEditor'\nimport {DefaultAnnotation} from '../nodes/DefaultAnnotation'\nimport {PortableTextEditor} from '../PortableTextEditor'\n\nconst debug = debugWithName('components:Leaf')\n\nconst EMPTY_MARKS: string[] = []\n\n/**\n * @internal\n */\nexport interface LeafProps extends RenderLeafProps {\n  children: ReactElement\n  schemaTypes: PortableTextMemberSchemaTypes\n  renderAnnotation?: RenderAnnotationFunction\n  renderChild?: RenderChildFunction\n  renderDecorator?: RenderDecoratorFunction\n  readOnly: boolean\n}\n\n/**\n * Renders Portable Text span nodes in Slate\n * @internal\n */\nexport const Leaf = (props: LeafProps) => {\n  const {attributes, children, leaf, schemaTypes, renderChild, renderDecorator, renderAnnotation} =\n    props\n  const spanRef = useRef<HTMLElement>(null)\n  const portableTextEditor = usePortableTextEditor()\n  const blockSelected = useSelected()\n  const [focused, setFocused] = useState(false)\n  const [selected, setSelected] = useState(false)\n  const block = children.props.parent as PortableTextTextBlock | undefined\n  const path: Path = useMemo(\n    () => (block ? [{_key: block?._key}, 'children', {_key: leaf._key}] : []),\n    [block, leaf._key],\n  )\n  const decoratorValues = useMemo(\n    () => schemaTypes.decorators.map((dec) => dec.value),\n    [schemaTypes.decorators],\n  )\n  const marks: string[] = useMemo(\n    () => uniq((leaf.marks || EMPTY_MARKS).filter((mark) => decoratorValues.includes(mark))),\n    [decoratorValues, leaf.marks],\n  )\n  const annotationMarks = Array.isArray(leaf.marks) ? leaf.marks : EMPTY_MARKS\n  const annotations = useMemo(\n    () =>\n      annotationMarks\n        .map(\n          (mark) =>\n            !decoratorValues.includes(mark) && block?.markDefs?.find((def) => def._key === mark),\n        )\n        .filter(Boolean) as PortableTextObject[],\n    [annotationMarks, block, decoratorValues],\n  )\n\n  const shouldTrackSelectionAndFocus = annotations.length > 0 && blockSelected\n\n  useEffect(() => {\n    if (!shouldTrackSelectionAndFocus) {\n      setFocused(false)\n      return\n    }\n    const sel = PortableTextEditor.getSelection(portableTextEditor)\n    if (\n      sel &&\n      isEqual(sel.focus.path, path) &&\n      PortableTextEditor.isCollapsedSelection(portableTextEditor)\n    ) {\n      startTransition(() => {\n        setFocused(true)\n      })\n    }\n  }, [shouldTrackSelectionAndFocus, path, portableTextEditor])\n\n  // Function to check if this leaf is currently inside the user's text selection\n  const setSelectedFromRange = useCallback(() => {\n    if (!shouldTrackSelectionAndFocus) {\n      return\n    }\n    debug('Setting selection and focus from range')\n    const winSelection = window.getSelection()\n    if (!winSelection) {\n      setSelected(false)\n      return\n    }\n    if (winSelection && winSelection.rangeCount > 0) {\n      const range = winSelection.getRangeAt(0)\n      if (spanRef.current && range.intersectsNode(spanRef.current)) {\n        setSelected(true)\n      } else {\n        setSelected(false)\n      }\n    } else {\n      setSelected(false)\n    }\n  }, [shouldTrackSelectionAndFocus])\n\n  useEffect(() => {\n    if (!shouldTrackSelectionAndFocus) {\n      return undefined\n    }\n    const sub = portableTextEditor.change$.subscribe((next) => {\n      if (next.type === 'blur') {\n        setFocused(false)\n        setSelected(false)\n        return\n      }\n      if (next.type === 'focus') {\n        const sel = PortableTextEditor.getSelection(portableTextEditor)\n        if (\n          sel &&\n          isEqual(sel.focus.path, path) &&\n          PortableTextEditor.isCollapsedSelection(portableTextEditor)\n        ) {\n          setFocused(true)\n        }\n        setSelectedFromRange()\n        return\n      }\n      if (next.type === 'selection') {\n        if (\n          next.selection &&\n          isEqual(next.selection.focus.path, path) &&\n          PortableTextEditor.isCollapsedSelection(portableTextEditor)\n        ) {\n          setFocused(true)\n        } else {\n          setFocused(false)\n        }\n        setSelectedFromRange()\n      }\n    })\n    return () => {\n      sub.unsubscribe()\n    }\n  }, [path, portableTextEditor, setSelectedFromRange, shouldTrackSelectionAndFocus])\n\n  useEffect(() => setSelectedFromRange(), [setSelectedFromRange])\n\n  const content = useMemo(() => {\n    let returnedChildren = children\n    // Render text nodes\n    if (Text.isText(leaf) && leaf._type === schemaTypes.span.name) {\n      marks.forEach((mark) => {\n        const schemaType = schemaTypes.decorators.find((dec) => dec.value === mark)\n        if (schemaType && renderDecorator) {\n          const _props: Omit<BlockDecoratorRenderProps, 'type'> = Object.defineProperty(\n            {\n              children: returnedChildren,\n              editorElementRef: spanRef,\n              focused,\n              path,\n              selected,\n              schemaType,\n              value: mark,\n            },\n            'type',\n            {\n              enumerable: false,\n              get() {\n                console.warn(\"Property 'type' is deprecated, use 'schemaType' instead.\")\n                return schemaType\n              },\n            },\n          )\n          returnedChildren = renderDecorator(_props as BlockDecoratorRenderProps)\n        }\n      })\n\n      if (block && annotations.length > 0) {\n        annotations.forEach((annotation) => {\n          const schemaType = schemaTypes.annotations.find((t) => t.name === annotation._type)\n          if (schemaType) {\n            if (renderAnnotation) {\n              const _props: Omit<BlockAnnotationRenderProps, 'type'> = Object.defineProperty(\n                {\n                  block,\n                  children: returnedChildren,\n                  editorElementRef: spanRef,\n                  focused,\n                  path,\n                  selected,\n                  schemaType,\n                  value: annotation,\n                },\n                'type',\n                {\n                  enumerable: false,\n                  get() {\n                    console.warn(\"Property 'type' is deprecated, use 'schemaType' instead.\")\n                    return schemaType\n                  },\n                },\n              )\n\n              returnedChildren = (\n                <span ref={spanRef}>{renderAnnotation(_props as BlockAnnotationRenderProps)}</span>\n              )\n            } else {\n              returnedChildren = (\n                <DefaultAnnotation annotation={annotation}>\n                  <span ref={spanRef}>{returnedChildren}</span>\n                </DefaultAnnotation>\n              )\n            }\n          }\n        })\n      }\n      if (block && renderChild) {\n        const child = block.children.find((_child) => _child._key === leaf._key) // Ensure object equality\n        if (child) {\n          const defaultRendered = <>{returnedChildren}</>\n          const _props: Omit<BlockChildRenderProps, 'type'> = Object.defineProperty(\n            {\n              annotations,\n              children: defaultRendered,\n              editorElementRef: spanRef,\n              focused,\n              path,\n              schemaType: schemaTypes.span,\n              selected,\n              value: child,\n            },\n            'type',\n            {\n              enumerable: false,\n              get() {\n                console.warn(\"Property 'type' is deprecated, use 'schemaType' instead.\")\n                return schemaTypes.span\n              },\n            },\n          )\n          returnedChildren = renderChild(_props as BlockChildRenderProps)\n        }\n      }\n    }\n    return returnedChildren\n  }, [\n    annotations,\n    block,\n    children,\n    focused,\n    leaf,\n    marks,\n    path,\n    renderAnnotation,\n    renderChild,\n    renderDecorator,\n    schemaTypes.annotations,\n    schemaTypes.decorators,\n    schemaTypes.span,\n    selected,\n  ])\n  return useMemo(\n    () => (\n      <span key={leaf._key} {...attributes} ref={spanRef}>\n        {content}\n      </span>\n    ),\n    [leaf, attributes, content],\n  )\n}\n","import {type PortableTextBlock} from '@sanity/types'\nimport {isEqual, noop} from 'lodash'\nimport {\n  type ClipboardEvent,\n  type CSSProperties,\n  type FocusEventHandler,\n  type ForwardedRef,\n  forwardRef,\n  type HTMLProps,\n  type KeyboardEvent,\n  type MutableRefObject,\n  type ReactNode,\n  type TextareaHTMLAttributes,\n  useCallback,\n  useEffect,\n  useImperativeHandle,\n  useMemo,\n  useRef,\n  useState,\n} from 'react'\nimport {\n  type BaseRange,\n  Editor,\n  Node,\n  type NodeEntry,\n  type Operation,\n  Path,\n  Range as SlateRange,\n  type Text,\n  Transforms,\n} from 'slate'\nimport {\n  Editable as SlateEditable,\n  ReactEditor,\n  type RenderElementProps,\n  type RenderLeafProps,\n  useSlate,\n} from 'slate-react'\n\nimport {\n  type EditorChange,\n  type EditorSelection,\n  type OnCopyFn,\n  type OnPasteFn,\n  type OnPasteResult,\n  type RangeDecoration,\n  type RenderAnnotationFunction,\n  type RenderBlockFunction,\n  type RenderChildFunction,\n  type RenderDecoratorFunction,\n  type RenderListItemFunction,\n  type RenderStyleFunction,\n  type ScrollSelectionIntoViewFunction,\n} from '../types/editor'\nimport {type HotkeyOptions} from '../types/options'\nimport {type SlateTextBlock, type VoidElement} from '../types/slate'\nimport {debugWithName} from '../utils/debug'\nimport {moveRangeByOperation, toPortableTextRange, toSlateRange} from '../utils/ranges'\nimport {normalizeSelection} from '../utils/selection'\nimport {fromSlateValue, isEqualToEmptyEditor, toSlateValue} from '../utils/values'\nimport {Element} from './components/Element'\nimport {Leaf} from './components/Leaf'\nimport {usePortableTextEditor} from './hooks/usePortableTextEditor'\nimport {usePortableTextEditorKeyGenerator} from './hooks/usePortableTextEditorKeyGenerator'\nimport {usePortableTextEditorReadOnlyStatus} from './hooks/usePortableTextReadOnly'\nimport {createWithHotkeys, createWithInsertData} from './plugins'\nimport {PortableTextEditor} from './PortableTextEditor'\n\nconst debug = debugWithName('component:Editable')\n\nconst PLACEHOLDER_STYLE: CSSProperties = {\n  position: 'absolute',\n  userSelect: 'none',\n  pointerEvents: 'none',\n  left: 0,\n  right: 0,\n}\n\ninterface BaseRangeWithDecoration extends BaseRange {\n  rangeDecoration: RangeDecoration\n}\n\nconst EMPTY_DECORATIONS_STATE: BaseRangeWithDecoration[] = []\n\n/**\n * @public\n */\nexport type PortableTextEditableProps = Omit<\n  TextareaHTMLAttributes<HTMLDivElement>,\n  'onPaste' | 'onCopy' | 'onBeforeInput'\n> & {\n  hotkeys?: HotkeyOptions\n  onBeforeInput?: (event: InputEvent) => void\n  onPaste?: OnPasteFn\n  onCopy?: OnCopyFn\n  ref: MutableRefObject<HTMLDivElement | null>\n  rangeDecorations?: RangeDecoration[]\n  renderAnnotation?: RenderAnnotationFunction\n  renderBlock?: RenderBlockFunction\n  renderChild?: RenderChildFunction\n  renderDecorator?: RenderDecoratorFunction\n  renderListItem?: RenderListItemFunction\n  renderPlaceholder?: () => ReactNode\n  renderStyle?: RenderStyleFunction\n  scrollSelectionIntoView?: ScrollSelectionIntoViewFunction\n  selection?: EditorSelection\n  spellCheck?: boolean\n}\n\n/**\n * @public\n */\nexport const PortableTextEditable = forwardRef(function PortableTextEditable(\n  props: PortableTextEditableProps &\n    Omit<HTMLProps<HTMLDivElement>, 'as' | 'onPaste' | 'onBeforeInput'>,\n  forwardedRef: ForwardedRef<HTMLDivElement>,\n) {\n  const {\n    hotkeys,\n    onBlur,\n    onFocus,\n    onBeforeInput,\n    onPaste,\n    onCopy,\n    onClick,\n    rangeDecorations,\n    renderAnnotation,\n    renderBlock,\n    renderChild,\n    renderDecorator,\n    renderListItem,\n    renderPlaceholder,\n    renderStyle,\n    selection: propsSelection,\n    scrollSelectionIntoView,\n    spellCheck,\n    ...restProps\n  } = props\n\n  const portableTextEditor = usePortableTextEditor()\n  const readOnly = usePortableTextEditorReadOnlyStatus()\n  const keyGenerator = usePortableTextEditorKeyGenerator()\n  const ref = useRef<HTMLDivElement | null>(null)\n  const [editableElement, setEditableElement] = useState<HTMLDivElement | null>(null)\n  const [hasInvalidValue, setHasInvalidValue] = useState(false)\n  const [rangeDecorationState, setRangeDecorationsState] =\n    useState<BaseRangeWithDecoration[]>(EMPTY_DECORATIONS_STATE)\n\n  // Forward ref to parent component\n  useImperativeHandle<HTMLDivElement | null, HTMLDivElement | null>(forwardedRef, () => ref.current)\n\n  const rangeDecorationsRef = useRef(rangeDecorations)\n\n  const {change$, schemaTypes} = portableTextEditor\n  const slateEditor = useSlate()\n\n  const blockTypeName = schemaTypes.block.name\n\n  // React/UI-specific plugins\n  const withInsertData = useMemo(\n    () => createWithInsertData(change$, schemaTypes, keyGenerator),\n    [change$, keyGenerator, schemaTypes],\n  )\n  const withHotKeys = useMemo(\n    () => createWithHotkeys(schemaTypes, portableTextEditor, hotkeys),\n    [hotkeys, portableTextEditor, schemaTypes],\n  )\n\n  // Output a minimal React editor inside Editable when in readOnly mode.\n  // NOTE: make sure all the plugins used here can be safely run over again at any point.\n  // There will be a problem if they redefine editor methods and then calling the original method within themselves.\n  useMemo(() => {\n    if (readOnly) {\n      debug('Editable is in read only mode')\n      return withInsertData(slateEditor)\n    }\n    debug('Editable is in edit mode')\n    return withInsertData(withHotKeys(slateEditor))\n  }, [readOnly, slateEditor, withHotKeys, withInsertData])\n\n  const renderElement = useCallback(\n    (eProps: RenderElementProps) => (\n      <Element\n        {...eProps}\n        readOnly={readOnly}\n        renderBlock={renderBlock}\n        renderChild={renderChild}\n        renderListItem={renderListItem}\n        renderStyle={renderStyle}\n        schemaTypes={schemaTypes}\n        spellCheck={spellCheck}\n      />\n    ),\n    [schemaTypes, spellCheck, readOnly, renderBlock, renderChild, renderListItem, renderStyle],\n  )\n\n  const renderLeaf = useCallback(\n    (\n      lProps: RenderLeafProps & {\n        leaf: Text & {placeholder?: boolean; rangeDecoration?: RangeDecoration}\n      },\n    ) => {\n      if (lProps.leaf._type === 'span') {\n        let rendered = (\n          <Leaf\n            {...lProps}\n            schemaTypes={schemaTypes}\n            renderAnnotation={renderAnnotation}\n            renderChild={renderChild}\n            renderDecorator={renderDecorator}\n            readOnly={readOnly}\n          />\n        )\n        if (renderPlaceholder && lProps.leaf.placeholder && lProps.text.text === '') {\n          return (\n            <>\n              <span style={PLACEHOLDER_STYLE} contentEditable={false}>\n                {renderPlaceholder()}\n              </span>\n              {rendered}\n            </>\n          )\n        }\n        const decoration = lProps.leaf.rangeDecoration\n        if (decoration) {\n          rendered = decoration.component({children: rendered})\n        }\n        return rendered\n      }\n      return lProps.children\n    },\n    [readOnly, renderAnnotation, renderChild, renderDecorator, renderPlaceholder, schemaTypes],\n  )\n\n  const restoreSelectionFromProps = useCallback(() => {\n    if (propsSelection) {\n      debug(`Selection from props ${JSON.stringify(propsSelection)}`)\n      const normalizedSelection = normalizeSelection(\n        propsSelection,\n        fromSlateValue(slateEditor.children, blockTypeName),\n      )\n      if (normalizedSelection !== null) {\n        debug(`Normalized selection from props ${JSON.stringify(normalizedSelection)}`)\n        const slateRange = toSlateRange(normalizedSelection, slateEditor)\n        if (slateRange) {\n          Transforms.select(slateEditor, slateRange)\n          // Output selection here in those cases where the editor selection was the same, and there are no set_selection operations made.\n          // The selection is usually automatically emitted to change$ by the withPortableTextSelections plugin whenever there is a set_selection operation applied.\n          if (!slateEditor.operations.some((o) => o.type === 'set_selection')) {\n            change$.next({type: 'selection', selection: normalizedSelection})\n          }\n          slateEditor.onChange()\n        }\n      }\n    }\n  }, [propsSelection, slateEditor, blockTypeName, change$])\n\n  const syncRangeDecorations = useCallback(\n    (operation?: Operation) => {\n      if (rangeDecorations && rangeDecorations.length > 0) {\n        const newSlateRanges: BaseRangeWithDecoration[] = []\n        rangeDecorations.forEach((rangeDecorationItem) => {\n          const slateRange = toSlateRange(rangeDecorationItem.selection, slateEditor)\n          if (!SlateRange.isRange(slateRange)) {\n            if (rangeDecorationItem.onMoved) {\n              rangeDecorationItem.onMoved({\n                newSelection: null,\n                rangeDecoration: rangeDecorationItem,\n                origin: 'local',\n              })\n            }\n            return\n          }\n          let newRange: BaseRange | null | undefined\n          if (operation) {\n            newRange = moveRangeByOperation(slateRange, operation)\n            if ((newRange && newRange !== slateRange) || (newRange === null && slateRange)) {\n              const value = PortableTextEditor.getValue(portableTextEditor)\n              const newRangeSelection = toPortableTextRange(value, newRange, schemaTypes)\n              if (rangeDecorationItem.onMoved) {\n                rangeDecorationItem.onMoved({\n                  newSelection: newRangeSelection,\n                  rangeDecoration: rangeDecorationItem,\n                  origin: 'local',\n                })\n              }\n            }\n          }\n          // If the newRange is null, it means that the range is not valid anymore and should be removed\n          // If it's undefined, it means that the slateRange is still valid and should be kept\n          if (newRange !== null) {\n            newSlateRanges.push({...(newRange || slateRange), rangeDecoration: rangeDecorationItem})\n          }\n        })\n        if (newSlateRanges.length > 0) {\n          setRangeDecorationsState(newSlateRanges)\n          return\n        }\n      }\n      setRangeDecorationsState(EMPTY_DECORATIONS_STATE)\n    },\n    [portableTextEditor, rangeDecorations, schemaTypes, slateEditor],\n  )\n\n  // Subscribe to change$ and restore selection from props when the editor has been initialized properly with it's value\n  useEffect(() => {\n    // debug('Subscribing to editor changes$')\n    const sub = change$.subscribe((next: EditorChange): void => {\n      switch (next.type) {\n        case 'ready':\n          restoreSelectionFromProps()\n          break\n        case 'invalidValue':\n          setHasInvalidValue(true)\n          break\n        case 'value':\n          setHasInvalidValue(false)\n          break\n        default:\n      }\n    })\n    return () => {\n      // debug('Unsubscribing to changes$')\n      sub.unsubscribe()\n    }\n  }, [change$, restoreSelectionFromProps])\n\n  // Restore selection from props when it changes\n  useEffect(() => {\n    if (propsSelection && !hasInvalidValue) {\n      restoreSelectionFromProps()\n    }\n  }, [hasInvalidValue, propsSelection, restoreSelectionFromProps])\n\n  // Store reference to original apply function (see below for usage in useEffect)\n  const originalApply = useMemo(() => slateEditor.apply, [slateEditor])\n\n  const [syncedRangeDecorations, setSyncedRangeDecorations] = useState(false)\n  useEffect(() => {\n    if (!syncedRangeDecorations) {\n      // We only want this to run once, on mount\n      setSyncedRangeDecorations(true)\n      syncRangeDecorations()\n    }\n  }, [syncRangeDecorations, syncedRangeDecorations])\n\n  useEffect(() => {\n    if (!isEqual(rangeDecorations, rangeDecorationsRef.current)) {\n      syncRangeDecorations()\n    }\n    rangeDecorationsRef.current = rangeDecorations\n  }, [rangeDecorations, syncRangeDecorations])\n\n  // Sync range decorations after an operation is applied\n  useEffect(() => {\n    slateEditor.apply = (op: Operation) => {\n      originalApply(op)\n      if (op.type !== 'set_selection') {\n        syncRangeDecorations(op)\n      }\n    }\n    return () => {\n      slateEditor.apply = originalApply\n    }\n  }, [originalApply, slateEditor, syncRangeDecorations])\n\n  // Handle from props onCopy function\n  const handleCopy = useCallback(\n    (event: ClipboardEvent<HTMLDivElement>): void | ReactEditor => {\n      if (onCopy) {\n        const result = onCopy(event)\n        // CopyFn may return something to avoid doing default stuff\n        if (result !== undefined) {\n          event.preventDefault()\n        }\n      }\n    },\n    [onCopy],\n  )\n\n  // Handle incoming pasting events in the editor\n  const handlePaste = useCallback(\n    (event: ClipboardEvent<HTMLDivElement>): Promise<void> | void => {\n      event.preventDefault()\n      if (!slateEditor.selection) {\n        return\n      }\n      if (!onPaste) {\n        debug('Pasting normally')\n        slateEditor.insertData(event.clipboardData)\n        return\n      }\n      // Resolve it as promise (can be either async promise or sync return value)\n      new Promise<OnPasteResult>((resolve) => {\n        const value = PortableTextEditor.getValue(portableTextEditor)\n        const ptRange = toPortableTextRange(value, slateEditor.selection, schemaTypes)\n        const path = ptRange?.focus.path || []\n        resolve(\n          onPaste({\n            event,\n            value,\n            path,\n            schemaTypes,\n          }),\n        )\n      })\n        .then((result) => {\n          debug('Custom paste function from client resolved', result)\n          change$.next({type: 'loading', isLoading: true})\n          if (!result || !result.insert) {\n            debug('No result from custom paste handler, pasting normally')\n            slateEditor.insertData(event.clipboardData)\n            return\n          }\n          if (result && result.insert) {\n            slateEditor.insertFragment(\n              toSlateValue(result.insert as PortableTextBlock[], {schemaTypes}),\n            )\n            change$.next({type: 'loading', isLoading: false})\n            return\n          }\n          console.warn('Your onPaste function returned something unexpected:', result)\n        })\n        .catch((error) => {\n          change$.next({type: 'loading', isLoading: false})\n          console.error(error) // eslint-disable-line no-console\n          return error\n        })\n    },\n    [change$, onPaste, portableTextEditor, schemaTypes, slateEditor],\n  )\n\n  const handleOnFocus: FocusEventHandler<HTMLDivElement> = useCallback(\n    (event) => {\n      if (onFocus) {\n        onFocus(event)\n      }\n      if (!event.isDefaultPrevented()) {\n        const selection = PortableTextEditor.getSelection(portableTextEditor)\n        // Create an editor selection if it does'nt exist\n        if (selection === null) {\n          Transforms.select(slateEditor, Editor.start(slateEditor, []))\n          slateEditor.onChange()\n        }\n        change$.next({type: 'focus', event})\n        const newSelection = PortableTextEditor.getSelection(portableTextEditor)\n        // If the selection is the same, emit it explicitly here as there is no actual onChange event triggered.\n        if (selection === newSelection) {\n          change$.next({\n            type: 'selection',\n            selection,\n          })\n        }\n      }\n    },\n    [onFocus, portableTextEditor, change$, slateEditor],\n  )\n\n  const handleClick = useCallback(\n    (event: React.MouseEvent<HTMLDivElement, MouseEvent>) => {\n      if (onClick) {\n        onClick(event)\n      }\n      // Inserts a new block if it's clicking on the editor, focused on the last block and it's a void element\n      if (slateEditor.selection && event.target === event.currentTarget) {\n        const [lastBlock, path] = Node.last(slateEditor, [])\n        const focusPath = slateEditor.selection.focus.path.slice(0, 1)\n        const lastPath = path.slice(0, 1)\n        if (Path.equals(focusPath, lastPath)) {\n          const node = Node.descendant(slateEditor, path.slice(0, 1)) as\n            | SlateTextBlock\n            | VoidElement\n          if (lastBlock && Editor.isVoid(slateEditor, node)) {\n            Transforms.insertNodes(slateEditor, slateEditor.pteCreateEmptyBlock())\n            slateEditor.onChange()\n          }\n        }\n      }\n    },\n    [onClick, slateEditor],\n  )\n\n  const handleOnBlur: FocusEventHandler<HTMLDivElement> = useCallback(\n    (event) => {\n      if (onBlur) {\n        onBlur(event)\n      }\n      if (!event.isPropagationStopped()) {\n        change$.next({type: 'blur', event})\n      }\n    },\n    [change$, onBlur],\n  )\n\n  const handleOnBeforeInput = useCallback(\n    (event: InputEvent) => {\n      if (onBeforeInput) {\n        onBeforeInput(event)\n      }\n    },\n    [onBeforeInput],\n  )\n\n  // This function will handle unexpected DOM changes inside the Editable rendering,\n  // and make sure that we can maintain a stable slateEditor.selection when that happens.\n  //\n  // For example, if this Editable is rendered inside something that might re-render\n  // this component (hidden contexts) while the user is still actively changing the\n  // contentEditable, this could interfere with the intermediate DOM selection,\n  // which again could be picked up by ReactEditor's event listeners.\n  // If that range is invalid at that point, the slate.editorSelection could be\n  // set either wrong, or invalid, to which slateEditor will throw exceptions\n  // that are impossible to recover properly from or result in a wrong selection.\n  //\n  // Also the other way around, when the ReactEditor will try to create a DOM Range\n  // from the current slateEditor.selection, it may throw unrecoverable errors\n  // if the current editor.selection is invalid according to the DOM.\n  // If this is the case, default to selecting the top of the document, if the\n  // user already had a selection.\n  const validateSelection = useCallback(() => {\n    if (!slateEditor.selection) {\n      return\n    }\n    const root = ReactEditor.findDocumentOrShadowRoot(slateEditor)\n    const {activeElement} = root\n    // Return if the editor isn't the active element\n    if (ref.current !== activeElement) {\n      return\n    }\n    const window = ReactEditor.getWindow(slateEditor)\n    const domSelection = window.getSelection()\n    if (!domSelection || domSelection.rangeCount === 0) {\n      return\n    }\n    const existingDOMRange = domSelection.getRangeAt(0)\n    try {\n      const newDOMRange = ReactEditor.toDOMRange(slateEditor, slateEditor.selection)\n      if (\n        newDOMRange.startOffset !== existingDOMRange.startOffset ||\n        newDOMRange.endOffset !== existingDOMRange.endOffset\n      ) {\n        debug('DOM range out of sync, validating selection')\n        // Remove all ranges temporary\n        domSelection?.removeAllRanges()\n        // Set the correct range\n        domSelection.addRange(newDOMRange)\n      }\n    } catch (error) {\n      debug(`Could not resolve selection, selecting top document`)\n      // Deselect the editor\n      Transforms.deselect(slateEditor)\n      // Select top document if there is a top block to select\n      if (slateEditor.children.length > 0) {\n        Transforms.select(slateEditor, [0, 0])\n      }\n      slateEditor.onChange()\n    }\n  }, [ref, slateEditor])\n\n  // Observe mutations (child list and subtree) to this component's DOM,\n  // and make sure the editor selection is valid when that happens.\n  useEffect(() => {\n    if (editableElement) {\n      const mutationObserver = new MutationObserver(validateSelection)\n      mutationObserver.observe(editableElement, {\n        attributeOldValue: false,\n        attributes: false,\n        characterData: false,\n        childList: true,\n        subtree: true,\n      })\n      return () => {\n        mutationObserver.disconnect()\n      }\n    }\n    return undefined\n  }, [validateSelection, editableElement])\n\n  const handleKeyDown = useCallback(\n    (event: KeyboardEvent<HTMLDivElement>) => {\n      if (props.onKeyDown) {\n        props.onKeyDown(event)\n      }\n      if (!event.isDefaultPrevented()) {\n        slateEditor.pteWithHotKeys(event)\n      }\n    },\n    [props, slateEditor],\n  )\n\n  const scrollSelectionIntoViewToSlate = useMemo(() => {\n    // Use slate-react default scroll into view\n    if (scrollSelectionIntoView === undefined) {\n      return undefined\n    }\n    // Disable scroll into view totally\n    if (scrollSelectionIntoView === null) {\n      return noop\n    }\n    // Translate PortableTextEditor prop fn to Slate plugin fn\n    return (editor: ReactEditor, domRange: Range) => {\n      scrollSelectionIntoView(portableTextEditor, domRange)\n    }\n  }, [portableTextEditor, scrollSelectionIntoView])\n\n  const decorate: (entry: NodeEntry) => BaseRange[] = useCallback(\n    ([, path]) => {\n      if (isEqualToEmptyEditor(slateEditor.children, schemaTypes)) {\n        return [\n          {\n            anchor: {\n              path: [0, 0],\n              offset: 0,\n            },\n            focus: {\n              path: [0, 0],\n              offset: 0,\n            },\n            placeholder: true,\n          },\n        ]\n      }\n      // Editor node has a path length of 0 (should never be decorated)\n      if (path.length === 0) {\n        return EMPTY_DECORATIONS_STATE\n      }\n      const result = rangeDecorationState.filter((item) => {\n        // Special case in order to only return one decoration for collapsed ranges\n        if (SlateRange.isCollapsed(item)) {\n          // Collapsed ranges should only be decorated if they are on a block child level (length 2)\n          if (path.length !== 2) {\n            return false\n          }\n          return Path.equals(item.focus.path, path) && Path.equals(item.anchor.path, path)\n        }\n        // Include decorations that either include or intersects with this path\n        return (\n          SlateRange.intersection(item, {anchor: {path, offset: 0}, focus: {path, offset: 0}}) ||\n          SlateRange.includes(item, path)\n        )\n      })\n      if (result.length > 0) {\n        return result\n      }\n      return EMPTY_DECORATIONS_STATE\n    },\n    [slateEditor, schemaTypes, rangeDecorationState],\n  )\n\n  // Set the forwarded ref to be the Slate editable DOM element\n  // Also set the editable element in a state so that the MutationObserver\n  // is setup when this element is ready.\n  useEffect(() => {\n    ref.current = ReactEditor.toDOMNode(slateEditor, slateEditor) as HTMLDivElement | null\n    setEditableElement(ref.current)\n  }, [slateEditor, ref])\n\n  if (!portableTextEditor) {\n    return null\n  }\n  return hasInvalidValue ? null : (\n    <SlateEditable\n      {...restProps}\n      autoFocus={false}\n      className={restProps.className || 'pt-editable'}\n      decorate={decorate}\n      onBlur={handleOnBlur}\n      onCopy={handleCopy}\n      onClick={handleClick}\n      onDOMBeforeInput={handleOnBeforeInput}\n      onFocus={handleOnFocus}\n      onKeyDown={handleKeyDown}\n      onPaste={handlePaste}\n      readOnly={readOnly}\n      // We have implemented our own placeholder logic with decorations.\n      // This 'renderPlaceholder' should not be used.\n      renderPlaceholder={undefined}\n      renderElement={renderElement}\n      renderLeaf={renderLeaf}\n      scrollSelectionIntoView={scrollSelectionIntoViewToSlate}\n    />\n  )\n})\n","import {isEqual} from 'lodash'\n\nimport {type Patch} from '../types/patch'\n\n/**\n * Try to compact a set of patches\n *\n */\nexport function compactPatches(patches: Patch[]) {\n  // If the last patch is unsetting everything, just do that\n  const lastPatch = patches.slice(-1)[0]\n  if (lastPatch && lastPatch.type === 'unset' && lastPatch.path.length === 0) {\n    return [lastPatch]\n  }\n  let finalPatches = patches\n  // Run through the patches and remove any redundant ones.\n  finalPatches = finalPatches.filter((patch, index) => {\n    if (!patch) {\n      return false\n    }\n    const nextPatch = finalPatches[index + 1]\n    if (\n      nextPatch &&\n      nextPatch.type === 'set' &&\n      patch.type === 'set' &&\n      isEqual(patch.path, nextPatch.path)\n    ) {\n      return false\n    }\n    return true\n  })\n  if (finalPatches.length !== patches.length) {\n    return finalPatches\n  }\n  return patches\n}\n"],"names":["debug","Element","EMPTY_MARKS","dragPosition","block","schemaType","SlateElement","ObjectNode","diff","apply","diffMatchPatch","makePatches","stringifyPatches","insert","_a","applyPatch","OPERATIONS","SUPPORTED_PATCH_TYPES","applyPatches","parsePatch","applyArrayPatch","applyStringPatch","applyObjectPatch","applyPrimitivePatch","debugVerbose","diffMatchPatchApplyPatches","makeDiff","items","position","normalizedIdx","flatten","SlateText","SlateRange","SlateEditable"],"mappings":"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","x_google_ignoreList":[14]}