@portabletext/editor 1.36.1 → 1.36.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/lib/_chunks-cjs/editor-provider.cjs +24 -13
  2. package/lib/_chunks-cjs/editor-provider.cjs.map +1 -1
  3. package/lib/_chunks-cjs/selector.is-at-the-start-of-block.cjs.map +1 -1
  4. package/lib/_chunks-cjs/util.block-offsets-to-selection.cjs.map +1 -1
  5. package/lib/_chunks-cjs/util.slice-blocks.cjs.map +1 -1
  6. package/lib/_chunks-es/editor-provider.js +24 -13
  7. package/lib/_chunks-es/editor-provider.js.map +1 -1
  8. package/lib/_chunks-es/selector.is-at-the-start-of-block.js.map +1 -1
  9. package/lib/_chunks-es/util.block-offsets-to-selection.js.map +1 -1
  10. package/lib/_chunks-es/util.slice-blocks.js.map +1 -1
  11. package/lib/behaviors/index.d.cts +7 -10
  12. package/lib/behaviors/index.d.ts +7 -10
  13. package/lib/index.cjs +140 -104
  14. package/lib/index.cjs.map +1 -1
  15. package/lib/index.d.cts +13 -26
  16. package/lib/index.d.ts +13 -26
  17. package/lib/index.js +142 -106
  18. package/lib/index.js.map +1 -1
  19. package/lib/plugins/index.cjs.map +1 -1
  20. package/lib/plugins/index.d.cts +2 -7
  21. package/lib/plugins/index.d.ts +2 -7
  22. package/lib/plugins/index.js.map +1 -1
  23. package/lib/selectors/index.cjs.map +1 -1
  24. package/lib/selectors/index.d.cts +8 -13
  25. package/lib/selectors/index.d.ts +8 -13
  26. package/lib/selectors/index.js.map +1 -1
  27. package/lib/utils/index.cjs.map +1 -1
  28. package/lib/utils/index.d.cts +3 -6
  29. package/lib/utils/index.d.ts +3 -6
  30. package/lib/utils/index.js.map +1 -1
  31. package/package.json +9 -8
  32. package/src/behavior-actions/behavior.actions.ts +2 -2
  33. package/src/behaviors/behavior.decorator-pair.ts +2 -1
  34. package/src/behaviors/index.ts +0 -8
  35. package/src/converters/converter.text-html.deserialize.test.ts +1 -1
  36. package/src/converters/converter.text-html.serialize.test.ts +1 -1
  37. package/src/converters/converter.text-html.ts +8 -0
  38. package/src/converters/converter.text-plain.test.ts +1 -1
  39. package/src/converters/converter.text-plain.ts +8 -0
  40. package/src/editor/Editable.tsx +1 -1
  41. package/src/editor/__tests__/PortableTextEditor.test.tsx +16 -20
  42. package/src/editor/components/Element.tsx +26 -18
  43. package/src/editor/components/drop-indicator.tsx +14 -0
  44. package/src/editor/components/{DraggableBlock.tsx → use-draggable.ts} +42 -163
  45. package/src/editor/components/use-droppable.ts +135 -0
  46. package/src/editor/create-slate-editor.tsx +0 -3
  47. package/src/index.ts +48 -12
  48. package/src/internal-utils/create-test-snapshot.ts +1 -1
  49. package/src/plugins/plugin.decorator-shortcut.ts +1 -1
  50. package/src/plugins/plugin.markdown.tsx +1 -0
  51. package/src/selectors/index.ts +0 -8
  52. package/src/selectors/selector.get-active-annotations.test.ts +1 -1
  53. package/src/selectors/selector.get-caret-word-selection.test.ts +1 -1
  54. package/src/selectors/selector.get-selected-spans.test.ts +2 -1
  55. package/src/selectors/selector.get-selection-end-point.ts +1 -1
  56. package/src/selectors/selector.get-selection-start-point.ts +1 -1
  57. package/src/selectors/selector.get-selection-text.test.ts +1 -1
  58. package/src/selectors/selector.get-selection.ts +2 -1
  59. package/src/selectors/selector.get-value.ts +1 -1
  60. package/src/selectors/selector.is-active-decorator.test.ts +1 -1
  61. package/src/types/editor.ts +6 -16
  62. package/src/types/slate.ts +1 -1
  63. package/src/utils/index.ts +0 -1
  64. package/src/utils/util.block-offsets-to-selection.ts +1 -1
  65. package/src/utils/util.is-span.ts +1 -1
  66. package/src/utils/util.is-text-block.ts +1 -1
  67. package/src/utils/util.merge-text-blocks.ts +1 -1
  68. package/src/utils/util.slice-blocks.ts +1 -1
  69. package/src/utils/util.split-text-block.ts +4 -2
@@ -1 +1 @@
1
- {"version":3,"file":"selector.is-at-the-start-of-block.cjs","sources":["../../src/behavior-actions/behavior.guards.ts","../../src/selectors/selectors.ts","../../src/selectors/selector.get-selection-end-point.ts","../../src/selectors/selector.get-selection-start-point.ts","../../src/selectors/selector.get-next-inline-object.ts","../../src/selectors/selector.get-previous-inline-object.ts","../../src/selectors/selector.get-selected-slice.ts","../../src/selectors/selector.get-selection-text.ts","../../src/selectors/selector.is-selection-collapsed.ts","../../src/selectors/selector.is-selection-expanded.ts","../../src/selectors/selector.get-caret-word-selection.ts","../../src/selectors/selector.is-at-the-end-of-block.ts","../../src/selectors/selector.is-at-the-start-of-block.ts"],"sourcesContent":["import {\n isPortableTextListBlock,\n isPortableTextTextBlock,\n type PortableTextListBlock,\n type PortableTextTextBlock,\n} from '@sanity/types'\nimport type {EditorSchema} from '../editor/define-schema'\n\n/**\n * @alpha\n */\nexport type BehaviorGuards = ReturnType<typeof createGuards>\n\nexport function createGuards({schema}: {schema: EditorSchema}) {\n function isListBlock(block: unknown): block is PortableTextListBlock {\n return isPortableTextListBlock(block) && block._type === schema.block.name\n }\n\n function isTextBlock(block: unknown): block is PortableTextTextBlock {\n return isPortableTextTextBlock(block) && block._type === schema.block.name\n }\n\n return {isListBlock, isTextBlock}\n}\n","import {\n isKeySegment,\n isPortableTextSpan,\n isPortableTextTextBlock,\n type KeyedSegment,\n type PortableTextBlock,\n type PortableTextListBlock,\n type PortableTextObject,\n type PortableTextSpan,\n type PortableTextTextBlock,\n} from '@sanity/types'\nimport {createGuards} from '../behavior-actions/behavior.guards'\nimport type {EditorSelector} from '../editor/editor-selector'\n\n/**\n * @public\n */\nexport const getFocusBlock: EditorSelector<\n {node: PortableTextBlock; path: [KeyedSegment]} | undefined\n> = (snapshot) => {\n const key = snapshot.context.selection\n ? isKeySegment(snapshot.context.selection.focus.path[0])\n ? snapshot.context.selection.focus.path[0]._key\n : undefined\n : undefined\n\n const node = key\n ? snapshot.context.value.find((block) => block._key === key)\n : undefined\n\n return node && key ? {node, path: [{_key: key}]} : undefined\n}\n\n/**\n * @public\n */\nexport const getFocusListBlock: EditorSelector<\n {node: PortableTextListBlock; path: [KeyedSegment]} | undefined\n> = (snapshot) => {\n const guards = createGuards(snapshot.context)\n const focusBlock = getFocusBlock(snapshot)\n\n return focusBlock && guards.isListBlock(focusBlock.node)\n ? {node: focusBlock.node, path: focusBlock.path}\n : undefined\n}\n\n/**\n * @public\n */\nexport const getFocusTextBlock: EditorSelector<\n {node: PortableTextTextBlock; path: [KeyedSegment]} | undefined\n> = (snapshot) => {\n const focusBlock = getFocusBlock(snapshot)\n\n return focusBlock && isPortableTextTextBlock(focusBlock.node)\n ? {node: focusBlock.node, path: focusBlock.path}\n : undefined\n}\n\n/**\n * @public\n */\nexport const getFocusBlockObject: EditorSelector<\n {node: PortableTextObject; path: [KeyedSegment]} | undefined\n> = (snapshot) => {\n const focusBlock = getFocusBlock(snapshot)\n\n return focusBlock && !isPortableTextTextBlock(focusBlock.node)\n ? {node: focusBlock.node, path: focusBlock.path}\n : undefined\n}\n\n/**\n * @public\n */\nexport const getFocusChild: EditorSelector<\n | {\n node: PortableTextObject | PortableTextSpan\n path: [KeyedSegment, 'children', KeyedSegment]\n }\n | undefined\n> = (snapshot) => {\n const focusBlock = getFocusTextBlock(snapshot)\n\n if (!focusBlock) {\n return undefined\n }\n\n const key = snapshot.context.selection\n ? isKeySegment(snapshot.context.selection.focus.path[2])\n ? snapshot.context.selection.focus.path[2]._key\n : undefined\n : undefined\n\n const node = key\n ? focusBlock.node.children.find((span) => span._key === key)\n : undefined\n\n return node && key\n ? {node, path: [...focusBlock.path, 'children', {_key: key}]}\n : undefined\n}\n\n/**\n * @public\n */\nexport const getFocusSpan: EditorSelector<\n | {node: PortableTextSpan; path: [KeyedSegment, 'children', KeyedSegment]}\n | undefined\n> = (snapshot) => {\n const focusChild = getFocusChild(snapshot)\n\n return focusChild && isPortableTextSpan(focusChild.node)\n ? {node: focusChild.node, path: focusChild.path}\n : undefined\n}\n\n/**\n * @public\n */\nexport const getFirstBlock: EditorSelector<\n {node: PortableTextBlock; path: [KeyedSegment]} | undefined\n> = (snapshot) => {\n const node = snapshot.context.value[0]\n\n return node ? {node, path: [{_key: node._key}]} : undefined\n}\n\n/**\n * @public\n */\nexport const getLastBlock: EditorSelector<\n {node: PortableTextBlock; path: [KeyedSegment]} | undefined\n> = (snapshot) => {\n const node = snapshot.context.value[snapshot.context.value.length - 1]\n ? snapshot.context.value[snapshot.context.value.length - 1]\n : undefined\n\n return node ? {node, path: [{_key: node._key}]} : undefined\n}\n\n/**\n * @public\n */\nexport const getSelectedBlocks: EditorSelector<\n Array<{node: PortableTextBlock; path: [KeyedSegment]}>\n> = (snapshot) => {\n if (!snapshot.context.selection) {\n return []\n }\n\n const selectedBlocks: Array<{node: PortableTextBlock; path: [KeyedSegment]}> =\n []\n const startKey = snapshot.context.selection.backward\n ? isKeySegment(snapshot.context.selection.focus.path[0])\n ? snapshot.context.selection.focus.path[0]._key\n : undefined\n : isKeySegment(snapshot.context.selection.anchor.path[0])\n ? snapshot.context.selection.anchor.path[0]._key\n : undefined\n const endKey = snapshot.context.selection.backward\n ? isKeySegment(snapshot.context.selection.anchor.path[0])\n ? snapshot.context.selection.anchor.path[0]._key\n : undefined\n : isKeySegment(snapshot.context.selection.focus.path[0])\n ? snapshot.context.selection.focus.path[0]._key\n : undefined\n\n if (!startKey || !endKey) {\n return selectedBlocks\n }\n\n for (const block of snapshot.context.value) {\n if (block._key === startKey) {\n selectedBlocks.push({node: block, path: [{_key: block._key}]})\n\n if (startKey === endKey) {\n break\n }\n continue\n }\n\n if (block._key === endKey) {\n selectedBlocks.push({node: block, path: [{_key: block._key}]})\n break\n }\n\n if (selectedBlocks.length > 0) {\n selectedBlocks.push({node: block, path: [{_key: block._key}]})\n }\n }\n\n return selectedBlocks\n}\n\n/**\n * @public\n */\nexport const getSelectionStartBlock: EditorSelector<\n | {\n node: PortableTextBlock\n path: [KeyedSegment]\n }\n | undefined\n> = (snapshot) => {\n if (!snapshot.context.selection) {\n return undefined\n }\n\n const key = snapshot.context.selection.backward\n ? isKeySegment(snapshot.context.selection.focus.path[0])\n ? snapshot.context.selection.focus.path[0]._key\n : undefined\n : isKeySegment(snapshot.context.selection.anchor.path[0])\n ? snapshot.context.selection.anchor.path[0]._key\n : undefined\n\n const node = key\n ? snapshot.context.value.find((block) => block._key === key)\n : undefined\n\n return node && key ? {node, path: [{_key: key}]} : undefined\n}\n\n/**\n * @public\n */\nexport const getSelectionEndBlock: EditorSelector<\n | {\n node: PortableTextBlock\n path: [KeyedSegment]\n }\n | undefined\n> = (snapshot) => {\n if (!snapshot.context.selection) {\n return undefined\n }\n\n const key = snapshot.context.selection.backward\n ? isKeySegment(snapshot.context.selection.anchor.path[0])\n ? snapshot.context.selection.anchor.path[0]._key\n : undefined\n : isKeySegment(snapshot.context.selection.focus.path[0])\n ? snapshot.context.selection.focus.path[0]._key\n : undefined\n\n const node = key\n ? snapshot.context.value.find((block) => block._key === key)\n : undefined\n\n return node && key ? {node, path: [{_key: key}]} : undefined\n}\n\n/**\n * @public\n */\nexport const getPreviousBlock: EditorSelector<\n {node: PortableTextBlock; path: [KeyedSegment]} | undefined\n> = (snapshot) => {\n let previousBlock: {node: PortableTextBlock; path: [KeyedSegment]} | undefined\n const selectionStartBlock = getSelectionStartBlock(snapshot)\n\n if (!selectionStartBlock) {\n return undefined\n }\n\n let foundSelectionStartBlock = false\n\n for (const block of snapshot.context.value) {\n if (block._key === selectionStartBlock.node._key) {\n foundSelectionStartBlock = true\n break\n }\n\n previousBlock = {node: block, path: [{_key: block._key}]}\n }\n\n if (foundSelectionStartBlock && previousBlock) {\n return previousBlock\n }\n\n return undefined\n}\n\n/**\n * @public\n */\nexport const getNextBlock: EditorSelector<\n {node: PortableTextBlock; path: [KeyedSegment]} | undefined\n> = (snapshot) => {\n let nextBlock: {node: PortableTextBlock; path: [KeyedSegment]} | undefined\n const selectionEndBlock = getSelectionEndBlock(snapshot)\n\n if (!selectionEndBlock) {\n return undefined\n }\n\n let foundSelectionEndBlock = false\n\n for (const block of snapshot.context.value) {\n if (block._key === selectionEndBlock.node._key) {\n foundSelectionEndBlock = true\n continue\n }\n\n if (foundSelectionEndBlock) {\n nextBlock = {node: block, path: [{_key: block._key}]}\n break\n }\n }\n\n if (foundSelectionEndBlock && nextBlock) {\n return nextBlock\n }\n\n return undefined\n}\n","import type {EditorSelector} from '../editor/editor-selector'\nimport type {EditorSelectionPoint} from '../utils'\n\n/**\n * @public\n */\nexport const getSelectionEndPoint: EditorSelector<\n EditorSelectionPoint | undefined\n> = (snapshot) => {\n if (!snapshot.context.selection) {\n return undefined\n }\n\n return snapshot.context.selection.backward\n ? snapshot.context.selection.anchor\n : snapshot.context.selection.focus\n}\n","import type {EditorSelector} from '../editor/editor-selector'\nimport type {EditorSelectionPoint} from '../utils'\n\n/**\n * @public\n */\nexport const getSelectionStartPoint: EditorSelector<\n EditorSelectionPoint | undefined\n> = (snapshot) => {\n if (!snapshot.context.selection) {\n return undefined\n }\n\n return snapshot.context.selection.backward\n ? snapshot.context.selection.focus\n : snapshot.context.selection.anchor\n}\n","import {\n isKeySegment,\n type KeyedSegment,\n type PortableTextObject,\n} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {isSpan} from '../utils'\nimport {getSelectionEndPoint} from './selector.get-selection-end-point'\nimport {getFocusTextBlock} from './selectors'\n\n/**\n * @public\n */\nexport const getNextInlineObject: EditorSelector<\n | {\n node: PortableTextObject\n path: [KeyedSegment, 'children', KeyedSegment]\n }\n | undefined\n> = (snapshot) => {\n const focusTextBlock = getFocusTextBlock(snapshot)\n const selectionEndPoint = getSelectionEndPoint(snapshot)\n const selectionEndPointChildKey =\n selectionEndPoint && isKeySegment(selectionEndPoint.path[2])\n ? selectionEndPoint.path[2]._key\n : undefined\n\n if (!focusTextBlock || !selectionEndPointChildKey) {\n return undefined\n }\n\n let endPointChildFound = false\n let inlineObject:\n | {\n node: PortableTextObject\n path: [KeyedSegment, 'children', KeyedSegment]\n }\n | undefined\n\n for (const child of focusTextBlock.node.children) {\n if (child._key === selectionEndPointChildKey) {\n endPointChildFound = true\n continue\n }\n\n if (!isSpan(snapshot.context, child) && endPointChildFound) {\n inlineObject = {\n node: child,\n path: [...focusTextBlock.path, 'children', {_key: child._key}],\n }\n break\n }\n }\n\n return inlineObject\n}\n","import {\n isKeySegment,\n type KeyedSegment,\n type PortableTextObject,\n} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {isSpan} from '../utils'\nimport {getSelectionStartPoint} from './selector.get-selection-start-point'\nimport {getFocusTextBlock} from './selectors'\n\n/**\n * @public\n */\nexport const getPreviousInlineObject: EditorSelector<\n | {\n node: PortableTextObject\n path: [KeyedSegment, 'children', KeyedSegment]\n }\n | undefined\n> = (snapshot) => {\n const focusTextBlock = getFocusTextBlock(snapshot)\n const selectionStartPoint = getSelectionStartPoint(snapshot)\n const selectionStartPointChildKey =\n selectionStartPoint && isKeySegment(selectionStartPoint.path[2])\n ? selectionStartPoint.path[2]._key\n : undefined\n\n if (!focusTextBlock || !selectionStartPointChildKey) {\n return undefined\n }\n\n let inlineObject:\n | {\n node: PortableTextObject\n path: [KeyedSegment, 'children', KeyedSegment]\n }\n | undefined\n\n for (const child of focusTextBlock.node.children) {\n if (child._key === selectionStartPointChildKey) {\n break\n }\n\n if (!isSpan(snapshot.context, child)) {\n inlineObject = {\n node: child,\n path: [...focusTextBlock.path, 'children', {_key: child._key}],\n }\n }\n }\n\n return inlineObject\n}\n","import type {PortableTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {sliceBlocks} from '../utils'\n\n/**\n * @public\n */\nexport const getSelectedSlice: EditorSelector<Array<PortableTextBlock>> = (\n snapshot,\n) => {\n return sliceBlocks({\n blocks: snapshot.context.value,\n selection: snapshot.context.selection,\n })\n}\n","import {isPortableTextSpan, isPortableTextTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {getSelectedSlice} from './selector.get-selected-slice'\n\n/**\n * @public\n */\nexport const getSelectionText: EditorSelector<string> = (snapshot) => {\n const selectedSlice = getSelectedSlice(snapshot)\n\n return selectedSlice.reduce((text, block) => {\n if (!isPortableTextTextBlock(block)) {\n return text\n }\n\n return (\n text +\n block.children.reduce((text, child) => {\n if (isPortableTextSpan(child)) {\n return text + child.text\n }\n\n return text\n }, '')\n )\n }, '')\n}\n","import type {EditorSelector} from '../editor/editor-selector'\n\n/**\n * @public\n */\nexport const isSelectionCollapsed: EditorSelector<boolean> = (snapshot) => {\n if (!snapshot.context.selection) {\n return false\n }\n\n return (\n JSON.stringify(snapshot.context.selection.anchor.path) ===\n JSON.stringify(snapshot.context.selection.focus.path) &&\n snapshot.context.selection?.anchor.offset ===\n snapshot.context.selection?.focus.offset\n )\n}\n","import type {EditorSelector} from '../editor/editor-selector'\nimport {isSelectionCollapsed} from './selector.is-selection-collapsed'\n\n/**\n * @public\n */\nexport const isSelectionExpanded: EditorSelector<boolean> = (snapshot) => {\n return !isSelectionCollapsed(snapshot)\n}\n","import type {EditorSelector} from '../editor/editor-selector'\nimport type {BlockOffset} from '../types/block-offset'\nimport type {EditorSelection} from '../types/editor'\nimport {\n blockOffsetToSpanSelectionPoint,\n getBlockEndPoint,\n getBlockStartPoint,\n spanSelectionPointToBlockOffset,\n} from '../utils'\nimport {getNextInlineObject} from './selector.get-next-inline-object'\nimport {getPreviousInlineObject} from './selector.get-previous-inline-object'\nimport {getSelectionStartPoint} from './selector.get-selection-start-point'\nimport {getSelectionText} from './selector.get-selection-text'\nimport {isSelectionCollapsed} from './selector.is-selection-collapsed'\nimport {isSelectionExpanded} from './selector.is-selection-expanded'\nimport {getFocusTextBlock} from './selectors'\n\n/**\n * @public\n * Returns the selection of the of the word the caret is placed in.\n * Note: Only returns a word selection if the current selection is collapsed\n */\nexport const getCaretWordSelection: EditorSelector<EditorSelection> = (\n snapshot,\n) => {\n if (!snapshot.context.selection) {\n return null\n }\n\n if (!isSelectionCollapsed(snapshot)) {\n return null\n }\n\n const focusTextBlock = getFocusTextBlock(snapshot)\n const selectionStartPoint = getSelectionStartPoint(snapshot)\n const selectionStartOffset = selectionStartPoint\n ? spanSelectionPointToBlockOffset({\n value: snapshot.context.value,\n selectionPoint: selectionStartPoint,\n })\n : undefined\n\n if (!focusTextBlock || !selectionStartPoint || !selectionStartOffset) {\n return null\n }\n\n const previousInlineObject = getPreviousInlineObject(snapshot)\n const blockStartPoint = getBlockStartPoint(focusTextBlock)\n const textBefore = getSelectionText({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: {\n anchor: previousInlineObject\n ? {path: previousInlineObject.path, offset: 0}\n : blockStartPoint,\n focus: selectionStartPoint,\n },\n },\n })\n const textDirectlyBefore = textBefore.split(/\\s+/).at(-1)\n\n const nextInlineObject = getNextInlineObject(snapshot)\n const blockEndPoint = getBlockEndPoint(focusTextBlock)\n const textAfter = getSelectionText({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: {\n anchor: selectionStartPoint,\n focus: nextInlineObject\n ? {path: nextInlineObject.path, offset: 0}\n : blockEndPoint,\n },\n },\n })\n const textDirectlyAfter = textAfter.split(/\\s+/).at(0)\n\n if (\n (textDirectlyBefore === undefined || textDirectlyBefore === '') &&\n (textDirectlyAfter === undefined || textDirectlyAfter === '')\n ) {\n return null\n }\n\n const caretWordStartOffset: BlockOffset = textDirectlyBefore\n ? {\n ...selectionStartOffset,\n offset: selectionStartOffset.offset - textDirectlyBefore.length,\n }\n : selectionStartOffset\n const caretWordEndOffset: BlockOffset = textDirectlyAfter\n ? {\n ...selectionStartOffset,\n offset: selectionStartOffset.offset + textDirectlyAfter.length,\n }\n : selectionStartOffset\n\n const caretWordStartSelectionPoint = blockOffsetToSpanSelectionPoint({\n value: snapshot.context.value,\n blockOffset: caretWordStartOffset,\n direction: 'backward',\n })\n const caretWordEndSelectionPoint = blockOffsetToSpanSelectionPoint({\n value: snapshot.context.value,\n blockOffset: caretWordEndOffset,\n direction: 'forward',\n })\n\n if (!caretWordStartSelectionPoint || !caretWordEndSelectionPoint) {\n return null\n }\n\n const caretWordSelection = {\n anchor: caretWordStartSelectionPoint,\n focus: caretWordEndSelectionPoint,\n }\n\n return isSelectionExpanded({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: caretWordSelection,\n },\n })\n ? caretWordSelection\n : null\n}\n","import type {KeyedSegment, PortableTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport * as utils from '../utils'\nimport {isSelectionCollapsed} from './selector.is-selection-collapsed'\n\n/**\n * @public\n */\nexport function isAtTheEndOfBlock(block: {\n node: PortableTextBlock\n path: [KeyedSegment]\n}): EditorSelector<boolean> {\n return (snapshot) => {\n if (!snapshot.context.selection || !isSelectionCollapsed(snapshot)) {\n return false\n }\n\n const blockEndPoint = utils.getBlockEndPoint(block)\n\n return utils.isEqualSelectionPoints(\n snapshot.context.selection.focus,\n blockEndPoint,\n )\n }\n}\n","import type {KeyedSegment, PortableTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport * as utils from '../utils'\nimport {isSelectionCollapsed} from './selector.is-selection-collapsed'\n\n/**\n * @public\n */\nexport function isAtTheStartOfBlock(block: {\n node: PortableTextBlock\n path: [KeyedSegment]\n}): EditorSelector<boolean> {\n return (snapshot) => {\n if (!snapshot.context.selection || !isSelectionCollapsed(snapshot)) {\n return false\n }\n\n const blockStartPoint = utils.getBlockStartPoint(block)\n\n return utils.isEqualSelectionPoints(\n snapshot.context.selection.focus,\n blockStartPoint,\n )\n }\n}\n"],"names":["createGuards","schema","isListBlock","block","isPortableTextListBlock","_type","name","isTextBlock","isPortableTextTextBlock","getFocusBlock","snapshot","key","context","selection","isKeySegment","focus","path","_key","undefined","node","value","find","getFocusListBlock","guards","focusBlock","getFocusTextBlock","getFocusBlockObject","getFocusChild","children","span","getFocusSpan","focusChild","isPortableTextSpan","getFirstBlock","getLastBlock","length","getSelectedBlocks","selectedBlocks","startKey","backward","anchor","endKey","push","getSelectionStartBlock","getSelectionEndBlock","getPreviousBlock","previousBlock","selectionStartBlock","foundSelectionStartBlock","getNextBlock","nextBlock","selectionEndBlock","foundSelectionEndBlock","getSelectionEndPoint","getSelectionStartPoint","getNextInlineObject","focusTextBlock","selectionEndPoint","selectionEndPointChildKey","endPointChildFound","inlineObject","child","isSpan","getPreviousInlineObject","selectionStartPoint","selectionStartPointChildKey","getSelectedSlice","sliceBlocks","blocks","getSelectionText","reduce","text","isSelectionCollapsed","JSON","stringify","offset","isSelectionExpanded","getCaretWordSelection","selectionStartOffset","spanSelectionPointToBlockOffset","selectionPoint","previousInlineObject","blockStartPoint","getBlockStartPoint","textDirectlyBefore","split","at","nextInlineObject","blockEndPoint","getBlockEndPoint","textDirectlyAfter","caretWordStartOffset","caretWordEndOffset","caretWordStartSelectionPoint","blockOffsetToSpanSelectionPoint","blockOffset","direction","caretWordEndSelectionPoint","caretWordSelection","isAtTheEndOfBlock","utils","isAtTheStartOfBlock"],"mappings":"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"}
1
+ {"version":3,"file":"selector.is-at-the-start-of-block.cjs","sources":["../../src/behavior-actions/behavior.guards.ts","../../src/selectors/selectors.ts","../../src/selectors/selector.get-selection-end-point.ts","../../src/selectors/selector.get-selection-start-point.ts","../../src/selectors/selector.get-next-inline-object.ts","../../src/selectors/selector.get-previous-inline-object.ts","../../src/selectors/selector.get-selected-slice.ts","../../src/selectors/selector.get-selection-text.ts","../../src/selectors/selector.is-selection-collapsed.ts","../../src/selectors/selector.is-selection-expanded.ts","../../src/selectors/selector.get-caret-word-selection.ts","../../src/selectors/selector.is-at-the-end-of-block.ts","../../src/selectors/selector.is-at-the-start-of-block.ts"],"sourcesContent":["import {\n isPortableTextListBlock,\n isPortableTextTextBlock,\n type PortableTextListBlock,\n type PortableTextTextBlock,\n} from '@sanity/types'\nimport type {EditorSchema} from '../editor/define-schema'\n\n/**\n * @alpha\n */\nexport type BehaviorGuards = ReturnType<typeof createGuards>\n\nexport function createGuards({schema}: {schema: EditorSchema}) {\n function isListBlock(block: unknown): block is PortableTextListBlock {\n return isPortableTextListBlock(block) && block._type === schema.block.name\n }\n\n function isTextBlock(block: unknown): block is PortableTextTextBlock {\n return isPortableTextTextBlock(block) && block._type === schema.block.name\n }\n\n return {isListBlock, isTextBlock}\n}\n","import {\n isKeySegment,\n isPortableTextSpan,\n isPortableTextTextBlock,\n type KeyedSegment,\n type PortableTextBlock,\n type PortableTextListBlock,\n type PortableTextObject,\n type PortableTextSpan,\n type PortableTextTextBlock,\n} from '@sanity/types'\nimport {createGuards} from '../behavior-actions/behavior.guards'\nimport type {EditorSelector} from '../editor/editor-selector'\n\n/**\n * @public\n */\nexport const getFocusBlock: EditorSelector<\n {node: PortableTextBlock; path: [KeyedSegment]} | undefined\n> = (snapshot) => {\n const key = snapshot.context.selection\n ? isKeySegment(snapshot.context.selection.focus.path[0])\n ? snapshot.context.selection.focus.path[0]._key\n : undefined\n : undefined\n\n const node = key\n ? snapshot.context.value.find((block) => block._key === key)\n : undefined\n\n return node && key ? {node, path: [{_key: key}]} : undefined\n}\n\n/**\n * @public\n */\nexport const getFocusListBlock: EditorSelector<\n {node: PortableTextListBlock; path: [KeyedSegment]} | undefined\n> = (snapshot) => {\n const guards = createGuards(snapshot.context)\n const focusBlock = getFocusBlock(snapshot)\n\n return focusBlock && guards.isListBlock(focusBlock.node)\n ? {node: focusBlock.node, path: focusBlock.path}\n : undefined\n}\n\n/**\n * @public\n */\nexport const getFocusTextBlock: EditorSelector<\n {node: PortableTextTextBlock; path: [KeyedSegment]} | undefined\n> = (snapshot) => {\n const focusBlock = getFocusBlock(snapshot)\n\n return focusBlock && isPortableTextTextBlock(focusBlock.node)\n ? {node: focusBlock.node, path: focusBlock.path}\n : undefined\n}\n\n/**\n * @public\n */\nexport const getFocusBlockObject: EditorSelector<\n {node: PortableTextObject; path: [KeyedSegment]} | undefined\n> = (snapshot) => {\n const focusBlock = getFocusBlock(snapshot)\n\n return focusBlock && !isPortableTextTextBlock(focusBlock.node)\n ? {node: focusBlock.node, path: focusBlock.path}\n : undefined\n}\n\n/**\n * @public\n */\nexport const getFocusChild: EditorSelector<\n | {\n node: PortableTextObject | PortableTextSpan\n path: [KeyedSegment, 'children', KeyedSegment]\n }\n | undefined\n> = (snapshot) => {\n const focusBlock = getFocusTextBlock(snapshot)\n\n if (!focusBlock) {\n return undefined\n }\n\n const key = snapshot.context.selection\n ? isKeySegment(snapshot.context.selection.focus.path[2])\n ? snapshot.context.selection.focus.path[2]._key\n : undefined\n : undefined\n\n const node = key\n ? focusBlock.node.children.find((span) => span._key === key)\n : undefined\n\n return node && key\n ? {node, path: [...focusBlock.path, 'children', {_key: key}]}\n : undefined\n}\n\n/**\n * @public\n */\nexport const getFocusSpan: EditorSelector<\n | {node: PortableTextSpan; path: [KeyedSegment, 'children', KeyedSegment]}\n | undefined\n> = (snapshot) => {\n const focusChild = getFocusChild(snapshot)\n\n return focusChild && isPortableTextSpan(focusChild.node)\n ? {node: focusChild.node, path: focusChild.path}\n : undefined\n}\n\n/**\n * @public\n */\nexport const getFirstBlock: EditorSelector<\n {node: PortableTextBlock; path: [KeyedSegment]} | undefined\n> = (snapshot) => {\n const node = snapshot.context.value[0]\n\n return node ? {node, path: [{_key: node._key}]} : undefined\n}\n\n/**\n * @public\n */\nexport const getLastBlock: EditorSelector<\n {node: PortableTextBlock; path: [KeyedSegment]} | undefined\n> = (snapshot) => {\n const node = snapshot.context.value[snapshot.context.value.length - 1]\n ? snapshot.context.value[snapshot.context.value.length - 1]\n : undefined\n\n return node ? {node, path: [{_key: node._key}]} : undefined\n}\n\n/**\n * @public\n */\nexport const getSelectedBlocks: EditorSelector<\n Array<{node: PortableTextBlock; path: [KeyedSegment]}>\n> = (snapshot) => {\n if (!snapshot.context.selection) {\n return []\n }\n\n const selectedBlocks: Array<{node: PortableTextBlock; path: [KeyedSegment]}> =\n []\n const startKey = snapshot.context.selection.backward\n ? isKeySegment(snapshot.context.selection.focus.path[0])\n ? snapshot.context.selection.focus.path[0]._key\n : undefined\n : isKeySegment(snapshot.context.selection.anchor.path[0])\n ? snapshot.context.selection.anchor.path[0]._key\n : undefined\n const endKey = snapshot.context.selection.backward\n ? isKeySegment(snapshot.context.selection.anchor.path[0])\n ? snapshot.context.selection.anchor.path[0]._key\n : undefined\n : isKeySegment(snapshot.context.selection.focus.path[0])\n ? snapshot.context.selection.focus.path[0]._key\n : undefined\n\n if (!startKey || !endKey) {\n return selectedBlocks\n }\n\n for (const block of snapshot.context.value) {\n if (block._key === startKey) {\n selectedBlocks.push({node: block, path: [{_key: block._key}]})\n\n if (startKey === endKey) {\n break\n }\n continue\n }\n\n if (block._key === endKey) {\n selectedBlocks.push({node: block, path: [{_key: block._key}]})\n break\n }\n\n if (selectedBlocks.length > 0) {\n selectedBlocks.push({node: block, path: [{_key: block._key}]})\n }\n }\n\n return selectedBlocks\n}\n\n/**\n * @public\n */\nexport const getSelectionStartBlock: EditorSelector<\n | {\n node: PortableTextBlock\n path: [KeyedSegment]\n }\n | undefined\n> = (snapshot) => {\n if (!snapshot.context.selection) {\n return undefined\n }\n\n const key = snapshot.context.selection.backward\n ? isKeySegment(snapshot.context.selection.focus.path[0])\n ? snapshot.context.selection.focus.path[0]._key\n : undefined\n : isKeySegment(snapshot.context.selection.anchor.path[0])\n ? snapshot.context.selection.anchor.path[0]._key\n : undefined\n\n const node = key\n ? snapshot.context.value.find((block) => block._key === key)\n : undefined\n\n return node && key ? {node, path: [{_key: key}]} : undefined\n}\n\n/**\n * @public\n */\nexport const getSelectionEndBlock: EditorSelector<\n | {\n node: PortableTextBlock\n path: [KeyedSegment]\n }\n | undefined\n> = (snapshot) => {\n if (!snapshot.context.selection) {\n return undefined\n }\n\n const key = snapshot.context.selection.backward\n ? isKeySegment(snapshot.context.selection.anchor.path[0])\n ? snapshot.context.selection.anchor.path[0]._key\n : undefined\n : isKeySegment(snapshot.context.selection.focus.path[0])\n ? snapshot.context.selection.focus.path[0]._key\n : undefined\n\n const node = key\n ? snapshot.context.value.find((block) => block._key === key)\n : undefined\n\n return node && key ? {node, path: [{_key: key}]} : undefined\n}\n\n/**\n * @public\n */\nexport const getPreviousBlock: EditorSelector<\n {node: PortableTextBlock; path: [KeyedSegment]} | undefined\n> = (snapshot) => {\n let previousBlock: {node: PortableTextBlock; path: [KeyedSegment]} | undefined\n const selectionStartBlock = getSelectionStartBlock(snapshot)\n\n if (!selectionStartBlock) {\n return undefined\n }\n\n let foundSelectionStartBlock = false\n\n for (const block of snapshot.context.value) {\n if (block._key === selectionStartBlock.node._key) {\n foundSelectionStartBlock = true\n break\n }\n\n previousBlock = {node: block, path: [{_key: block._key}]}\n }\n\n if (foundSelectionStartBlock && previousBlock) {\n return previousBlock\n }\n\n return undefined\n}\n\n/**\n * @public\n */\nexport const getNextBlock: EditorSelector<\n {node: PortableTextBlock; path: [KeyedSegment]} | undefined\n> = (snapshot) => {\n let nextBlock: {node: PortableTextBlock; path: [KeyedSegment]} | undefined\n const selectionEndBlock = getSelectionEndBlock(snapshot)\n\n if (!selectionEndBlock) {\n return undefined\n }\n\n let foundSelectionEndBlock = false\n\n for (const block of snapshot.context.value) {\n if (block._key === selectionEndBlock.node._key) {\n foundSelectionEndBlock = true\n continue\n }\n\n if (foundSelectionEndBlock) {\n nextBlock = {node: block, path: [{_key: block._key}]}\n break\n }\n }\n\n if (foundSelectionEndBlock && nextBlock) {\n return nextBlock\n }\n\n return undefined\n}\n","import type {EditorSelectionPoint} from '..'\nimport type {EditorSelector} from '../editor/editor-selector'\n\n/**\n * @public\n */\nexport const getSelectionEndPoint: EditorSelector<\n EditorSelectionPoint | undefined\n> = (snapshot) => {\n if (!snapshot.context.selection) {\n return undefined\n }\n\n return snapshot.context.selection.backward\n ? snapshot.context.selection.anchor\n : snapshot.context.selection.focus\n}\n","import type {EditorSelectionPoint} from '..'\nimport type {EditorSelector} from '../editor/editor-selector'\n\n/**\n * @public\n */\nexport const getSelectionStartPoint: EditorSelector<\n EditorSelectionPoint | undefined\n> = (snapshot) => {\n if (!snapshot.context.selection) {\n return undefined\n }\n\n return snapshot.context.selection.backward\n ? snapshot.context.selection.focus\n : snapshot.context.selection.anchor\n}\n","import {\n isKeySegment,\n type KeyedSegment,\n type PortableTextObject,\n} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {isSpan} from '../utils'\nimport {getSelectionEndPoint} from './selector.get-selection-end-point'\nimport {getFocusTextBlock} from './selectors'\n\n/**\n * @public\n */\nexport const getNextInlineObject: EditorSelector<\n | {\n node: PortableTextObject\n path: [KeyedSegment, 'children', KeyedSegment]\n }\n | undefined\n> = (snapshot) => {\n const focusTextBlock = getFocusTextBlock(snapshot)\n const selectionEndPoint = getSelectionEndPoint(snapshot)\n const selectionEndPointChildKey =\n selectionEndPoint && isKeySegment(selectionEndPoint.path[2])\n ? selectionEndPoint.path[2]._key\n : undefined\n\n if (!focusTextBlock || !selectionEndPointChildKey) {\n return undefined\n }\n\n let endPointChildFound = false\n let inlineObject:\n | {\n node: PortableTextObject\n path: [KeyedSegment, 'children', KeyedSegment]\n }\n | undefined\n\n for (const child of focusTextBlock.node.children) {\n if (child._key === selectionEndPointChildKey) {\n endPointChildFound = true\n continue\n }\n\n if (!isSpan(snapshot.context, child) && endPointChildFound) {\n inlineObject = {\n node: child,\n path: [...focusTextBlock.path, 'children', {_key: child._key}],\n }\n break\n }\n }\n\n return inlineObject\n}\n","import {\n isKeySegment,\n type KeyedSegment,\n type PortableTextObject,\n} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {isSpan} from '../utils'\nimport {getSelectionStartPoint} from './selector.get-selection-start-point'\nimport {getFocusTextBlock} from './selectors'\n\n/**\n * @public\n */\nexport const getPreviousInlineObject: EditorSelector<\n | {\n node: PortableTextObject\n path: [KeyedSegment, 'children', KeyedSegment]\n }\n | undefined\n> = (snapshot) => {\n const focusTextBlock = getFocusTextBlock(snapshot)\n const selectionStartPoint = getSelectionStartPoint(snapshot)\n const selectionStartPointChildKey =\n selectionStartPoint && isKeySegment(selectionStartPoint.path[2])\n ? selectionStartPoint.path[2]._key\n : undefined\n\n if (!focusTextBlock || !selectionStartPointChildKey) {\n return undefined\n }\n\n let inlineObject:\n | {\n node: PortableTextObject\n path: [KeyedSegment, 'children', KeyedSegment]\n }\n | undefined\n\n for (const child of focusTextBlock.node.children) {\n if (child._key === selectionStartPointChildKey) {\n break\n }\n\n if (!isSpan(snapshot.context, child)) {\n inlineObject = {\n node: child,\n path: [...focusTextBlock.path, 'children', {_key: child._key}],\n }\n }\n }\n\n return inlineObject\n}\n","import type {PortableTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {sliceBlocks} from '../utils'\n\n/**\n * @public\n */\nexport const getSelectedSlice: EditorSelector<Array<PortableTextBlock>> = (\n snapshot,\n) => {\n return sliceBlocks({\n blocks: snapshot.context.value,\n selection: snapshot.context.selection,\n })\n}\n","import {isPortableTextSpan, isPortableTextTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {getSelectedSlice} from './selector.get-selected-slice'\n\n/**\n * @public\n */\nexport const getSelectionText: EditorSelector<string> = (snapshot) => {\n const selectedSlice = getSelectedSlice(snapshot)\n\n return selectedSlice.reduce((text, block) => {\n if (!isPortableTextTextBlock(block)) {\n return text\n }\n\n return (\n text +\n block.children.reduce((text, child) => {\n if (isPortableTextSpan(child)) {\n return text + child.text\n }\n\n return text\n }, '')\n )\n }, '')\n}\n","import type {EditorSelector} from '../editor/editor-selector'\n\n/**\n * @public\n */\nexport const isSelectionCollapsed: EditorSelector<boolean> = (snapshot) => {\n if (!snapshot.context.selection) {\n return false\n }\n\n return (\n JSON.stringify(snapshot.context.selection.anchor.path) ===\n JSON.stringify(snapshot.context.selection.focus.path) &&\n snapshot.context.selection?.anchor.offset ===\n snapshot.context.selection?.focus.offset\n )\n}\n","import type {EditorSelector} from '../editor/editor-selector'\nimport {isSelectionCollapsed} from './selector.is-selection-collapsed'\n\n/**\n * @public\n */\nexport const isSelectionExpanded: EditorSelector<boolean> = (snapshot) => {\n return !isSelectionCollapsed(snapshot)\n}\n","import type {EditorSelector} from '../editor/editor-selector'\nimport type {BlockOffset} from '../types/block-offset'\nimport type {EditorSelection} from '../types/editor'\nimport {\n blockOffsetToSpanSelectionPoint,\n getBlockEndPoint,\n getBlockStartPoint,\n spanSelectionPointToBlockOffset,\n} from '../utils'\nimport {getNextInlineObject} from './selector.get-next-inline-object'\nimport {getPreviousInlineObject} from './selector.get-previous-inline-object'\nimport {getSelectionStartPoint} from './selector.get-selection-start-point'\nimport {getSelectionText} from './selector.get-selection-text'\nimport {isSelectionCollapsed} from './selector.is-selection-collapsed'\nimport {isSelectionExpanded} from './selector.is-selection-expanded'\nimport {getFocusTextBlock} from './selectors'\n\n/**\n * @public\n * Returns the selection of the of the word the caret is placed in.\n * Note: Only returns a word selection if the current selection is collapsed\n */\nexport const getCaretWordSelection: EditorSelector<EditorSelection> = (\n snapshot,\n) => {\n if (!snapshot.context.selection) {\n return null\n }\n\n if (!isSelectionCollapsed(snapshot)) {\n return null\n }\n\n const focusTextBlock = getFocusTextBlock(snapshot)\n const selectionStartPoint = getSelectionStartPoint(snapshot)\n const selectionStartOffset = selectionStartPoint\n ? spanSelectionPointToBlockOffset({\n value: snapshot.context.value,\n selectionPoint: selectionStartPoint,\n })\n : undefined\n\n if (!focusTextBlock || !selectionStartPoint || !selectionStartOffset) {\n return null\n }\n\n const previousInlineObject = getPreviousInlineObject(snapshot)\n const blockStartPoint = getBlockStartPoint(focusTextBlock)\n const textBefore = getSelectionText({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: {\n anchor: previousInlineObject\n ? {path: previousInlineObject.path, offset: 0}\n : blockStartPoint,\n focus: selectionStartPoint,\n },\n },\n })\n const textDirectlyBefore = textBefore.split(/\\s+/).at(-1)\n\n const nextInlineObject = getNextInlineObject(snapshot)\n const blockEndPoint = getBlockEndPoint(focusTextBlock)\n const textAfter = getSelectionText({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: {\n anchor: selectionStartPoint,\n focus: nextInlineObject\n ? {path: nextInlineObject.path, offset: 0}\n : blockEndPoint,\n },\n },\n })\n const textDirectlyAfter = textAfter.split(/\\s+/).at(0)\n\n if (\n (textDirectlyBefore === undefined || textDirectlyBefore === '') &&\n (textDirectlyAfter === undefined || textDirectlyAfter === '')\n ) {\n return null\n }\n\n const caretWordStartOffset: BlockOffset = textDirectlyBefore\n ? {\n ...selectionStartOffset,\n offset: selectionStartOffset.offset - textDirectlyBefore.length,\n }\n : selectionStartOffset\n const caretWordEndOffset: BlockOffset = textDirectlyAfter\n ? {\n ...selectionStartOffset,\n offset: selectionStartOffset.offset + textDirectlyAfter.length,\n }\n : selectionStartOffset\n\n const caretWordStartSelectionPoint = blockOffsetToSpanSelectionPoint({\n value: snapshot.context.value,\n blockOffset: caretWordStartOffset,\n direction: 'backward',\n })\n const caretWordEndSelectionPoint = blockOffsetToSpanSelectionPoint({\n value: snapshot.context.value,\n blockOffset: caretWordEndOffset,\n direction: 'forward',\n })\n\n if (!caretWordStartSelectionPoint || !caretWordEndSelectionPoint) {\n return null\n }\n\n const caretWordSelection = {\n anchor: caretWordStartSelectionPoint,\n focus: caretWordEndSelectionPoint,\n }\n\n return isSelectionExpanded({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: caretWordSelection,\n },\n })\n ? caretWordSelection\n : null\n}\n","import type {KeyedSegment, PortableTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport * as utils from '../utils'\nimport {isSelectionCollapsed} from './selector.is-selection-collapsed'\n\n/**\n * @public\n */\nexport function isAtTheEndOfBlock(block: {\n node: PortableTextBlock\n path: [KeyedSegment]\n}): EditorSelector<boolean> {\n return (snapshot) => {\n if (!snapshot.context.selection || !isSelectionCollapsed(snapshot)) {\n return false\n }\n\n const blockEndPoint = utils.getBlockEndPoint(block)\n\n return utils.isEqualSelectionPoints(\n snapshot.context.selection.focus,\n blockEndPoint,\n )\n }\n}\n","import type {KeyedSegment, PortableTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport * as utils from '../utils'\nimport {isSelectionCollapsed} from './selector.is-selection-collapsed'\n\n/**\n * @public\n */\nexport function isAtTheStartOfBlock(block: {\n node: PortableTextBlock\n path: [KeyedSegment]\n}): EditorSelector<boolean> {\n return (snapshot) => {\n if (!snapshot.context.selection || !isSelectionCollapsed(snapshot)) {\n return false\n }\n\n const blockStartPoint = utils.getBlockStartPoint(block)\n\n return utils.isEqualSelectionPoints(\n snapshot.context.selection.focus,\n blockStartPoint,\n )\n }\n}\n"],"names":["createGuards","schema","isListBlock","block","isPortableTextListBlock","_type","name","isTextBlock","isPortableTextTextBlock","getFocusBlock","snapshot","key","context","selection","isKeySegment","focus","path","_key","undefined","node","value","find","getFocusListBlock","guards","focusBlock","getFocusTextBlock","getFocusBlockObject","getFocusChild","children","span","getFocusSpan","focusChild","isPortableTextSpan","getFirstBlock","getLastBlock","length","getSelectedBlocks","selectedBlocks","startKey","backward","anchor","endKey","push","getSelectionStartBlock","getSelectionEndBlock","getPreviousBlock","previousBlock","selectionStartBlock","foundSelectionStartBlock","getNextBlock","nextBlock","selectionEndBlock","foundSelectionEndBlock","getSelectionEndPoint","getSelectionStartPoint","getNextInlineObject","focusTextBlock","selectionEndPoint","selectionEndPointChildKey","endPointChildFound","inlineObject","child","isSpan","getPreviousInlineObject","selectionStartPoint","selectionStartPointChildKey","getSelectedSlice","sliceBlocks","blocks","getSelectionText","reduce","text","isSelectionCollapsed","JSON","stringify","offset","isSelectionExpanded","getCaretWordSelection","selectionStartOffset","spanSelectionPointToBlockOffset","selectionPoint","previousInlineObject","blockStartPoint","getBlockStartPoint","textDirectlyBefore","split","at","nextInlineObject","blockEndPoint","getBlockEndPoint","textDirectlyAfter","caretWordStartOffset","caretWordEndOffset","caretWordStartSelectionPoint","blockOffsetToSpanSelectionPoint","blockOffset","direction","caretWordEndSelectionPoint","caretWordSelection","isAtTheEndOfBlock","utils","isAtTheStartOfBlock"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"util.block-offsets-to-selection.cjs","sources":["../../src/internal-utils/asserters.ts","../../src/internal-utils/parse-blocks.ts","../../src/utils/util.block-offsets-to-selection.ts"],"sourcesContent":["import type {TypedObject} from '@sanity/types'\n\nexport function isTypedObject(object: unknown): object is TypedObject {\n return isRecord(object) && typeof object._type === 'string'\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && (typeof value === 'object' || typeof value === 'function')\n}\n","import type {\n PortableTextBlock,\n PortableTextObject,\n PortableTextSpan,\n PortableTextTextBlock,\n} from '@sanity/types'\nimport type {EditorSchema} from '../editor/define-schema'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport {isTypedObject} from './asserters'\n\nexport function parseBlock({\n context,\n block,\n options,\n}: {\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n block: unknown\n options: {\n refreshKeys: boolean\n }\n}): PortableTextBlock | undefined {\n return (\n parseTextBlock({block, context, options}) ??\n parseBlockObject({blockObject: block, context, options})\n )\n}\n\nfunction parseBlockObject({\n blockObject,\n context,\n options,\n}: {\n blockObject: unknown\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n options: {refreshKeys: boolean}\n}): PortableTextObject | undefined {\n if (!isTypedObject(blockObject)) {\n return undefined\n }\n\n if (\n blockObject._type === context.schema.block.name ||\n blockObject._type === 'block' ||\n !context.schema.blockObjects.some(({name}) => name === blockObject._type)\n ) {\n return undefined\n }\n\n return {\n ...blockObject,\n _key: options.refreshKeys\n ? context.keyGenerator()\n : typeof blockObject._key === 'string'\n ? blockObject._key\n : context.keyGenerator(),\n }\n}\n\nexport function isTextBlock(\n schema: EditorSchema,\n block: unknown,\n): block is PortableTextTextBlock {\n return (\n parseTextBlock({\n block,\n context: {schema, keyGenerator: () => ''},\n options: {refreshKeys: false},\n }) !== undefined\n )\n}\n\nfunction parseTextBlock({\n block,\n context,\n options,\n}: {\n block: unknown\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n options: {refreshKeys: boolean}\n}): PortableTextTextBlock | undefined {\n if (!isTypedObject(block)) {\n return undefined\n }\n\n if (block._type !== context.schema.block.name) {\n return undefined\n }\n\n const _key = options.refreshKeys\n ? context.keyGenerator()\n : typeof block._key === 'string'\n ? block._key\n : context.keyGenerator()\n\n const unparsedMarkDefs: Array<unknown> = Array.isArray(block.markDefs)\n ? block.markDefs\n : []\n const markDefKeyMap = new Map<string, string>()\n const markDefs = unparsedMarkDefs.flatMap((markDef) => {\n if (!isTypedObject(markDef)) {\n return []\n }\n\n if (typeof markDef._key !== 'string') {\n return []\n }\n\n if (\n context.schema.annotations.some(\n (annotation) => annotation.name === markDef._type,\n )\n ) {\n const _key = options.refreshKeys ? context.keyGenerator() : markDef._key\n markDefKeyMap.set(markDef._key, _key)\n\n return [\n {\n ...markDef,\n _key,\n },\n ]\n }\n\n return []\n })\n\n const unparsedChildren: Array<unknown> = Array.isArray(block.children)\n ? block.children\n : []\n\n const children = unparsedChildren\n .map(\n (child) =>\n parseSpan({span: child, context, markDefKeyMap, options}) ??\n parseInlineObject({inlineObject: child, context, options}),\n )\n .filter((child) => child !== undefined)\n\n const parsedBlock: PortableTextTextBlock = {\n // Spread the entire block to allow custom properties on it\n ...block,\n _key,\n children:\n children.length > 0\n ? children\n : [\n {\n _key: context.keyGenerator(),\n _type: context.schema.span.name,\n text: '',\n marks: [],\n },\n ],\n markDefs,\n }\n\n /**\n * Reset text block .style if it's somehow set to an invalid type\n */\n if (\n typeof parsedBlock.style !== 'string' ||\n !context.schema.styles.find((style) => style.value === block.style)\n ) {\n const defaultStyle = context.schema.styles.at(0)?.value\n\n if (defaultStyle !== undefined) {\n parsedBlock.style = defaultStyle\n } else {\n delete parsedBlock.style\n }\n }\n\n /**\n * Reset text block .listItem if it's somehow set to an invalid type\n */\n if (\n typeof parsedBlock.listItem !== 'string' ||\n !context.schema.lists.find((list) => list.value === block.listItem)\n ) {\n delete parsedBlock.listItem\n }\n\n /**\n * Reset text block .level if it's somehow set to an invalid type\n */\n if (typeof parsedBlock.level !== 'number') {\n delete parsedBlock.level\n }\n\n return parsedBlock\n}\n\nexport function parseSpan({\n span,\n context,\n markDefKeyMap,\n options,\n}: {\n span: unknown\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n markDefKeyMap: Map<string, string>\n options: {refreshKeys: boolean}\n}): PortableTextSpan | undefined {\n if (!isTypedObject(span)) {\n return undefined\n }\n\n // In reality, the span schema name is always 'span', but we only the check here anyway\n if (span._type !== context.schema.span.name || span._type !== 'span') {\n return undefined\n }\n\n const unparsedMarks: Array<unknown> = Array.isArray(span.marks)\n ? span.marks\n : []\n const marks = unparsedMarks.flatMap((mark) => {\n if (typeof mark !== 'string') {\n return []\n }\n\n const markDefKey = markDefKeyMap.get(mark)\n\n if (markDefKey !== undefined) {\n return [markDefKey]\n }\n\n if (\n context.schema.decorators.some((decorator) => decorator.value === mark)\n ) {\n return [mark]\n }\n\n return []\n })\n\n return {\n // Spread the entire span to allow custom properties on it\n ...span,\n _type: 'span',\n _key: options.refreshKeys\n ? context.keyGenerator()\n : typeof span._key === 'string'\n ? span._key\n : context.keyGenerator(),\n text: typeof span.text === 'string' ? span.text : '',\n marks,\n }\n}\n\nfunction parseInlineObject({\n inlineObject,\n context,\n options,\n}: {\n inlineObject: unknown\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n options: {refreshKeys: boolean}\n}): PortableTextObject | undefined {\n if (!isTypedObject(inlineObject)) {\n return undefined\n }\n\n if (\n inlineObject._type === context.schema.span.name ||\n inlineObject._type === 'span' ||\n // Respect the schema definition and don't parse inline objects that are not defined\n !context.schema.inlineObjects.some(({name}) => name === inlineObject._type)\n ) {\n return undefined\n }\n\n return {\n // Spread the entire inline object to allow custom properties on it\n ...inlineObject,\n _key: options.refreshKeys\n ? context.keyGenerator()\n : typeof inlineObject._key === 'string'\n ? inlineObject._key\n : context.keyGenerator(),\n }\n}\n","import type {PortableTextBlock} from '@sanity/types'\nimport type {EditorSelection} from '../selectors'\nimport type {BlockOffset} from '../types/block-offset'\nimport {blockOffsetToSpanSelectionPoint} from './util.block-offset'\n\n/**\n * @public\n */\nexport function blockOffsetsToSelection({\n value,\n offsets,\n backward,\n}: {\n value: Array<PortableTextBlock>\n offsets: {anchor: BlockOffset; focus: BlockOffset}\n backward?: boolean\n}): EditorSelection {\n const anchor = blockOffsetToSpanSelectionPoint({\n value,\n blockOffset: offsets.anchor,\n direction: backward ? 'backward' : 'forward',\n })\n const focus = blockOffsetToSpanSelectionPoint({\n value,\n blockOffset: offsets.focus,\n direction: backward ? 'forward' : 'backward',\n })\n\n if (!anchor || !focus) {\n return null\n }\n\n return {\n anchor,\n focus,\n backward,\n }\n}\n"],"names":["isTypedObject","object","isRecord","_type","value","parseBlock","context","block","options","parseTextBlock","parseBlockObject","blockObject","schema","name","blockObjects","some","_key","refreshKeys","keyGenerator","isTextBlock","undefined","unparsedMarkDefs","Array","isArray","markDefs","markDefKeyMap","Map","flatMap","markDef","annotations","annotation","set","children","map","child","parseSpan","span","parseInlineObject","inlineObject","filter","parsedBlock","length","text","marks","style","styles","find","defaultStyle","at","listItem","lists","list","level","mark","markDefKey","get","decorators","decorator","inlineObjects","blockOffsetsToSelection","offsets","backward","anchor","blockOffsetToSpanSelectionPoint","blockOffset","direction","focus"],"mappings":"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"}
1
+ {"version":3,"file":"util.block-offsets-to-selection.cjs","sources":["../../src/internal-utils/asserters.ts","../../src/internal-utils/parse-blocks.ts","../../src/utils/util.block-offsets-to-selection.ts"],"sourcesContent":["import type {TypedObject} from '@sanity/types'\n\nexport function isTypedObject(object: unknown): object is TypedObject {\n return isRecord(object) && typeof object._type === 'string'\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && (typeof value === 'object' || typeof value === 'function')\n}\n","import type {\n PortableTextBlock,\n PortableTextObject,\n PortableTextSpan,\n PortableTextTextBlock,\n} from '@sanity/types'\nimport type {EditorSchema} from '../editor/define-schema'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport {isTypedObject} from './asserters'\n\nexport function parseBlock({\n context,\n block,\n options,\n}: {\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n block: unknown\n options: {\n refreshKeys: boolean\n }\n}): PortableTextBlock | undefined {\n return (\n parseTextBlock({block, context, options}) ??\n parseBlockObject({blockObject: block, context, options})\n )\n}\n\nfunction parseBlockObject({\n blockObject,\n context,\n options,\n}: {\n blockObject: unknown\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n options: {refreshKeys: boolean}\n}): PortableTextObject | undefined {\n if (!isTypedObject(blockObject)) {\n return undefined\n }\n\n if (\n blockObject._type === context.schema.block.name ||\n blockObject._type === 'block' ||\n !context.schema.blockObjects.some(({name}) => name === blockObject._type)\n ) {\n return undefined\n }\n\n return {\n ...blockObject,\n _key: options.refreshKeys\n ? context.keyGenerator()\n : typeof blockObject._key === 'string'\n ? blockObject._key\n : context.keyGenerator(),\n }\n}\n\nexport function isTextBlock(\n schema: EditorSchema,\n block: unknown,\n): block is PortableTextTextBlock {\n return (\n parseTextBlock({\n block,\n context: {schema, keyGenerator: () => ''},\n options: {refreshKeys: false},\n }) !== undefined\n )\n}\n\nfunction parseTextBlock({\n block,\n context,\n options,\n}: {\n block: unknown\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n options: {refreshKeys: boolean}\n}): PortableTextTextBlock | undefined {\n if (!isTypedObject(block)) {\n return undefined\n }\n\n if (block._type !== context.schema.block.name) {\n return undefined\n }\n\n const _key = options.refreshKeys\n ? context.keyGenerator()\n : typeof block._key === 'string'\n ? block._key\n : context.keyGenerator()\n\n const unparsedMarkDefs: Array<unknown> = Array.isArray(block.markDefs)\n ? block.markDefs\n : []\n const markDefKeyMap = new Map<string, string>()\n const markDefs = unparsedMarkDefs.flatMap((markDef) => {\n if (!isTypedObject(markDef)) {\n return []\n }\n\n if (typeof markDef._key !== 'string') {\n return []\n }\n\n if (\n context.schema.annotations.some(\n (annotation) => annotation.name === markDef._type,\n )\n ) {\n const _key = options.refreshKeys ? context.keyGenerator() : markDef._key\n markDefKeyMap.set(markDef._key, _key)\n\n return [\n {\n ...markDef,\n _key,\n },\n ]\n }\n\n return []\n })\n\n const unparsedChildren: Array<unknown> = Array.isArray(block.children)\n ? block.children\n : []\n\n const children = unparsedChildren\n .map(\n (child) =>\n parseSpan({span: child, context, markDefKeyMap, options}) ??\n parseInlineObject({inlineObject: child, context, options}),\n )\n .filter((child) => child !== undefined)\n\n const parsedBlock: PortableTextTextBlock = {\n // Spread the entire block to allow custom properties on it\n ...block,\n _key,\n children:\n children.length > 0\n ? children\n : [\n {\n _key: context.keyGenerator(),\n _type: context.schema.span.name,\n text: '',\n marks: [],\n },\n ],\n markDefs,\n }\n\n /**\n * Reset text block .style if it's somehow set to an invalid type\n */\n if (\n typeof parsedBlock.style !== 'string' ||\n !context.schema.styles.find((style) => style.value === block.style)\n ) {\n const defaultStyle = context.schema.styles.at(0)?.value\n\n if (defaultStyle !== undefined) {\n parsedBlock.style = defaultStyle\n } else {\n delete parsedBlock.style\n }\n }\n\n /**\n * Reset text block .listItem if it's somehow set to an invalid type\n */\n if (\n typeof parsedBlock.listItem !== 'string' ||\n !context.schema.lists.find((list) => list.value === block.listItem)\n ) {\n delete parsedBlock.listItem\n }\n\n /**\n * Reset text block .level if it's somehow set to an invalid type\n */\n if (typeof parsedBlock.level !== 'number') {\n delete parsedBlock.level\n }\n\n return parsedBlock\n}\n\nexport function parseSpan({\n span,\n context,\n markDefKeyMap,\n options,\n}: {\n span: unknown\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n markDefKeyMap: Map<string, string>\n options: {refreshKeys: boolean}\n}): PortableTextSpan | undefined {\n if (!isTypedObject(span)) {\n return undefined\n }\n\n // In reality, the span schema name is always 'span', but we only the check here anyway\n if (span._type !== context.schema.span.name || span._type !== 'span') {\n return undefined\n }\n\n const unparsedMarks: Array<unknown> = Array.isArray(span.marks)\n ? span.marks\n : []\n const marks = unparsedMarks.flatMap((mark) => {\n if (typeof mark !== 'string') {\n return []\n }\n\n const markDefKey = markDefKeyMap.get(mark)\n\n if (markDefKey !== undefined) {\n return [markDefKey]\n }\n\n if (\n context.schema.decorators.some((decorator) => decorator.value === mark)\n ) {\n return [mark]\n }\n\n return []\n })\n\n return {\n // Spread the entire span to allow custom properties on it\n ...span,\n _type: 'span',\n _key: options.refreshKeys\n ? context.keyGenerator()\n : typeof span._key === 'string'\n ? span._key\n : context.keyGenerator(),\n text: typeof span.text === 'string' ? span.text : '',\n marks,\n }\n}\n\nfunction parseInlineObject({\n inlineObject,\n context,\n options,\n}: {\n inlineObject: unknown\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n options: {refreshKeys: boolean}\n}): PortableTextObject | undefined {\n if (!isTypedObject(inlineObject)) {\n return undefined\n }\n\n if (\n inlineObject._type === context.schema.span.name ||\n inlineObject._type === 'span' ||\n // Respect the schema definition and don't parse inline objects that are not defined\n !context.schema.inlineObjects.some(({name}) => name === inlineObject._type)\n ) {\n return undefined\n }\n\n return {\n // Spread the entire inline object to allow custom properties on it\n ...inlineObject,\n _key: options.refreshKeys\n ? context.keyGenerator()\n : typeof inlineObject._key === 'string'\n ? inlineObject._key\n : context.keyGenerator(),\n }\n}\n","import type {PortableTextBlock} from '@sanity/types'\nimport type {EditorSelection} from '..'\nimport type {BlockOffset} from '../types/block-offset'\nimport {blockOffsetToSpanSelectionPoint} from './util.block-offset'\n\n/**\n * @public\n */\nexport function blockOffsetsToSelection({\n value,\n offsets,\n backward,\n}: {\n value: Array<PortableTextBlock>\n offsets: {anchor: BlockOffset; focus: BlockOffset}\n backward?: boolean\n}): EditorSelection {\n const anchor = blockOffsetToSpanSelectionPoint({\n value,\n blockOffset: offsets.anchor,\n direction: backward ? 'backward' : 'forward',\n })\n const focus = blockOffsetToSpanSelectionPoint({\n value,\n blockOffset: offsets.focus,\n direction: backward ? 'forward' : 'backward',\n })\n\n if (!anchor || !focus) {\n return null\n }\n\n return {\n anchor,\n focus,\n backward,\n }\n}\n"],"names":["isTypedObject","object","isRecord","_type","value","parseBlock","context","block","options","parseTextBlock","parseBlockObject","blockObject","schema","name","blockObjects","some","_key","refreshKeys","keyGenerator","isTextBlock","undefined","unparsedMarkDefs","Array","isArray","markDefs","markDefKeyMap","Map","flatMap","markDef","annotations","annotation","set","children","map","child","parseSpan","span","parseInlineObject","inlineObject","filter","parsedBlock","length","text","marks","style","styles","find","defaultStyle","at","listItem","lists","list","level","mark","markDefKey","get","decorators","decorator","inlineObjects","blockOffsetsToSelection","offsets","backward","anchor","blockOffsetToSpanSelectionPoint","blockOffset","direction","focus"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"util.slice-blocks.cjs","sources":["../../src/utils/util.is-keyed-segment.ts","../../src/utils/util.block-offset.ts","../../src/utils/util.get-block-end-point.ts","../../src/utils/util.get-block-start-point.ts","../../src/utils/util.get-text-block-text.ts","../../src/utils/util.is-empty-text-block.ts","../../src/utils/util.is-equal-selection-points.ts","../../src/utils/util.is-span.ts","../../src/utils/util.slice-blocks.ts"],"sourcesContent":["import type {KeyedSegment, PathSegment} from '@sanity/types'\n\n/**\n * @public\n */\nexport function isKeyedSegment(segment: PathSegment): segment is KeyedSegment {\n return typeof segment === 'object' && segment !== null && '_key' in segment\n}\n","import {\n isPortableTextSpan,\n isPortableTextTextBlock,\n type KeyedSegment,\n type PortableTextBlock,\n} from '@sanity/types'\nimport type {BlockOffset} from '../types/block-offset'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport {isKeyedSegment} from './util.is-keyed-segment'\n\n/**\n * @public\n */\nexport function blockOffsetToSpanSelectionPoint({\n value,\n blockOffset,\n direction,\n}: {\n value: Array<PortableTextBlock>\n blockOffset: BlockOffset\n direction: 'forward' | 'backward'\n}) {\n let offsetLeft = blockOffset.offset\n let selectionPoint:\n | {path: [KeyedSegment, 'children', KeyedSegment]; offset: number}\n | undefined\n let skippedInlineObject = false\n\n for (const block of value) {\n if (block._key !== blockOffset.path[0]._key) {\n continue\n }\n\n if (!isPortableTextTextBlock(block)) {\n continue\n }\n\n for (const child of block.children) {\n if (direction === 'forward') {\n if (!isPortableTextSpan(child)) {\n continue\n }\n\n if (offsetLeft <= child.text.length) {\n selectionPoint = {\n path: [...blockOffset.path, 'children', {_key: child._key}],\n offset: offsetLeft,\n }\n break\n }\n\n offsetLeft -= child.text.length\n\n continue\n }\n\n if (!isPortableTextSpan(child)) {\n skippedInlineObject = true\n continue\n }\n\n if (offsetLeft === 0 && selectionPoint && !skippedInlineObject) {\n if (skippedInlineObject) {\n selectionPoint = {\n path: [...blockOffset.path, 'children', {_key: child._key}],\n offset: 0,\n }\n }\n break\n }\n\n if (offsetLeft > child.text.length) {\n offsetLeft -= child.text.length\n continue\n }\n\n if (offsetLeft <= child.text.length) {\n selectionPoint = {\n path: [...blockOffset.path, 'children', {_key: child._key}],\n offset: offsetLeft,\n }\n\n offsetLeft -= child.text.length\n\n if (offsetLeft !== 0) {\n break\n }\n }\n }\n }\n\n return selectionPoint\n}\n\n/**\n * @public\n */\nexport function spanSelectionPointToBlockOffset({\n value,\n selectionPoint,\n}: {\n value: Array<PortableTextBlock>\n selectionPoint: EditorSelectionPoint\n}): BlockOffset | undefined {\n let offset = 0\n\n const blockKey = isKeyedSegment(selectionPoint.path[0])\n ? selectionPoint.path[0]._key\n : undefined\n const spanKey = isKeyedSegment(selectionPoint.path[2])\n ? selectionPoint.path[2]._key\n : undefined\n\n if (!blockKey || !spanKey) {\n return undefined\n }\n\n for (const block of value) {\n if (block._key !== blockKey) {\n continue\n }\n\n if (!isPortableTextTextBlock(block)) {\n continue\n }\n\n for (const child of block.children) {\n if (!isPortableTextSpan(child)) {\n continue\n }\n\n if (child._key === spanKey) {\n return {\n path: [{_key: block._key}],\n offset: offset + selectionPoint.offset,\n }\n }\n\n offset += child.text.length\n }\n }\n}\n","import {\n isPortableTextSpan,\n isPortableTextTextBlock,\n type KeyedSegment,\n type PortableTextBlock,\n} from '@sanity/types'\nimport type {EditorSelectionPoint} from '../types/editor'\n\n/**\n * @public\n */\nexport function getBlockEndPoint({\n node,\n path,\n}: {\n node: PortableTextBlock\n path: [KeyedSegment]\n}): EditorSelectionPoint {\n if (isPortableTextTextBlock(node)) {\n const lastChild = node.children[node.children.length - 1]\n\n if (lastChild) {\n return {\n path: [...path, 'children', {_key: lastChild._key}],\n offset: isPortableTextSpan(lastChild) ? lastChild.text.length : 0,\n }\n }\n }\n\n return {\n path,\n offset: 0,\n }\n}\n","import {\n isPortableTextTextBlock,\n type KeyedSegment,\n type PortableTextBlock,\n} from '@sanity/types'\nimport type {EditorSelectionPoint} from '../types/editor'\n\n/**\n * @public\n */\nexport function getBlockStartPoint({\n node,\n path,\n}: {\n node: PortableTextBlock\n path: [KeyedSegment]\n}): EditorSelectionPoint {\n if (isPortableTextTextBlock(node)) {\n return {\n path: [...path, 'children', {_key: node.children[0]._key}],\n offset: 0,\n }\n }\n\n return {\n path,\n offset: 0,\n }\n}\n","import type {PortableTextTextBlock} from '@sanity/types'\n\n/**\n * @public\n */\nexport function getTextBlockText(block: PortableTextTextBlock) {\n return block.children.map((child) => child.text ?? '').join('')\n}\n","import {\n isPortableTextSpan,\n isPortableTextTextBlock,\n type PortableTextBlock,\n} from '@sanity/types'\nimport {getTextBlockText} from './util.get-text-block-text'\n\n/**\n * @public\n */\nexport function isEmptyTextBlock(block: PortableTextBlock) {\n if (!isPortableTextTextBlock(block)) {\n return false\n }\n\n const onlyText = block.children.every(isPortableTextSpan)\n const blockText = getTextBlockText(block)\n\n return onlyText && blockText === ''\n}\n","import type {EditorSelectionPoint} from '../types/editor'\n\n/**\n * @public\n */\nexport function isEqualSelectionPoints(\n a: EditorSelectionPoint,\n b: EditorSelectionPoint,\n) {\n return (\n a.offset === b.offset && JSON.stringify(a.path) === JSON.stringify(b.path)\n )\n}\n","import type {PortableTextChild, PortableTextSpan} from '@sanity/types'\nimport type {EditorContext} from '../selectors'\n\n/**\n * @public\n */\nexport function isSpan(\n context: Pick<EditorContext, 'schema'>,\n child: PortableTextChild,\n): child is PortableTextSpan {\n return child._type === context.schema.span.name\n}\n","import {\n isKeySegment,\n isPortableTextSpan,\n isPortableTextTextBlock,\n type PortableTextBlock,\n} from '@sanity/types'\nimport type {EditorSelection} from '../selectors'\n\n/**\n * @public\n */\nexport function sliceBlocks({\n blocks,\n selection,\n}: {\n blocks: Array<PortableTextBlock>\n selection: EditorSelection\n}): Array<PortableTextBlock> {\n const slice: Array<PortableTextBlock> = []\n\n if (!selection) {\n return slice\n }\n\n let startBlock: PortableTextBlock | undefined\n const middleBlocks: PortableTextBlock[] = []\n let endBlock: PortableTextBlock | undefined\n\n const startPoint = selection.backward ? selection.focus : selection.anchor\n const endPoint = selection.backward ? selection.anchor : selection.focus\n\n const startBlockKey = isKeySegment(startPoint.path[0])\n ? startPoint.path[0]._key\n : undefined\n const endBlockKey = isKeySegment(endPoint.path[0])\n ? endPoint.path[0]._key\n : undefined\n const startChildKey = isKeySegment(startPoint.path[2])\n ? startPoint.path[2]._key\n : undefined\n const endChildKey = isKeySegment(endPoint.path[2])\n ? endPoint.path[2]._key\n : undefined\n\n if (!startBlockKey || !endBlockKey) {\n return slice\n }\n\n for (const block of blocks) {\n if (!isPortableTextTextBlock(block)) {\n if (block._key === startBlockKey && block._key === endBlockKey) {\n startBlock = block\n break\n }\n }\n\n if (block._key === startBlockKey) {\n if (!isPortableTextTextBlock(block)) {\n startBlock = block\n continue\n }\n\n if (startChildKey) {\n for (const child of block.children) {\n if (child._key === startChildKey) {\n if (isPortableTextSpan(child)) {\n const text =\n child._key === endChildKey\n ? child.text.slice(startPoint.offset, endPoint.offset)\n : child.text.slice(startPoint.offset)\n\n startBlock = {\n ...block,\n children: [\n {\n ...child,\n text,\n },\n ],\n }\n } else {\n startBlock = {\n ...block,\n children: [child],\n }\n }\n\n if (startChildKey === endChildKey) {\n break\n }\n continue\n }\n\n if (startBlock && isPortableTextTextBlock(startBlock)) {\n if (\n endChildKey &&\n child._key === endChildKey &&\n isPortableTextSpan(child)\n ) {\n startBlock.children.push({\n ...child,\n text: child.text.slice(0, endPoint.offset),\n })\n } else {\n startBlock.children.push(child)\n }\n\n if (\n block._key === endBlockKey &&\n endChildKey &&\n child._key === endChildKey\n ) {\n break\n }\n }\n }\n\n if (startBlockKey === endBlockKey) {\n break\n }\n\n continue\n }\n\n startBlock = block\n\n if (startBlockKey === endBlockKey) {\n break\n }\n }\n\n if (block._key === endBlockKey) {\n if (!isPortableTextTextBlock(block)) {\n endBlock = block\n break\n }\n\n if (endChildKey) {\n endBlock = {\n ...block,\n children: [],\n }\n\n for (const child of block.children) {\n if (endBlock && isPortableTextTextBlock(endBlock)) {\n if (child._key === endChildKey && isPortableTextSpan(child)) {\n endBlock.children.push({\n ...child,\n text: child.text.slice(0, endPoint.offset),\n })\n\n break\n }\n\n endBlock.children.push(child)\n\n if (endChildKey && child._key === endChildKey) {\n break\n }\n }\n }\n\n break\n }\n\n endBlock = block\n\n break\n }\n\n if (startBlock) {\n middleBlocks.push(block)\n }\n }\n\n return [\n ...(startBlock ? [startBlock] : []),\n ...middleBlocks,\n ...(endBlock ? [endBlock] : []),\n ]\n}\n"],"names":["isKeyedSegment","segment","blockOffsetToSpanSelectionPoint","value","blockOffset","direction","offsetLeft","offset","selectionPoint","skippedInlineObject","block","_key","path","isPortableTextTextBlock","child","children","isPortableTextSpan","text","length","spanSelectionPointToBlockOffset","blockKey","undefined","spanKey","getBlockEndPoint","node","lastChild","getBlockStartPoint","getTextBlockText","map","join","isEmptyTextBlock","onlyText","every","blockText","isEqualSelectionPoints","a","b","JSON","stringify","isSpan","context","_type","schema","span","name","sliceBlocks","blocks","selection","slice","startBlock","middleBlocks","endBlock","startPoint","backward","focus","anchor","endPoint","startBlockKey","isKeySegment","endBlockKey","startChildKey","endChildKey","push"],"mappings":";;AAKO,SAASA,eAAeC,SAA+C;AAC5E,SAAO,OAAOA,WAAY,YAAYA,YAAY,QAAQ,UAAUA;AACtE;ACMO,SAASC,gCAAgC;AAAA,EAC9CC;AAAAA,EACAC;AAAAA,EACAC;AAKF,GAAG;AACD,MAAIC,aAAaF,YAAYG,QACzBC,gBAGAC,sBAAsB;AAE1B,aAAWC,SAASP;AACdO,QAAAA,MAAMC,SAASP,YAAYQ,KAAK,CAAC,EAAED,QAIlCE,8BAAwBH,KAAK;AAIvBI,iBAAAA,SAASJ,MAAMK,UAAU;AAClC,YAAIV,cAAc,WAAW;AACvB,cAAA,CAACW,yBAAmBF,KAAK;AAC3B;AAGER,cAAAA,cAAcQ,MAAMG,KAAKC,QAAQ;AAClB,6BAAA;AAAA,cACfN,MAAM,CAAC,GAAGR,YAAYQ,MAAM,YAAY;AAAA,gBAACD,MAAMG,MAAMH;AAAAA,cAAAA,CAAK;AAAA,cAC1DJ,QAAQD;AAAAA,YACV;AACA;AAAA,UAAA;AAGFA,wBAAcQ,MAAMG,KAAKC;AAEzB;AAAA,QAAA;AAGE,YAAA,CAACF,MAAAA,mBAAmBF,KAAK,GAAG;AACR,gCAAA;AACtB;AAAA,QAAA;AAGF,YAAIR,eAAe,KAAKE,kBAAkB,CAACC,qBAAqB;AAC1DA,kCACFD,iBAAiB;AAAA,YACfI,MAAM,CAAC,GAAGR,YAAYQ,MAAM,YAAY;AAAA,cAACD,MAAMG,MAAMH;AAAAA,YAAAA,CAAK;AAAA,YAC1DJ,QAAQ;AAAA,UAAA;AAGZ;AAAA,QAAA;AAGED,YAAAA,aAAaQ,MAAMG,KAAKC,QAAQ;AAClCZ,wBAAcQ,MAAMG,KAAKC;AACzB;AAAA,QAAA;AAGF,YAAIZ,cAAcQ,MAAMG,KAAKC,WAC3BV,iBAAiB;AAAA,UACfI,MAAM,CAAC,GAAGR,YAAYQ,MAAM,YAAY;AAAA,YAACD,MAAMG,MAAMH;AAAAA,UAAAA,CAAK;AAAA,UAC1DJ,QAAQD;AAAAA,QAAAA,GAGVA,cAAcQ,MAAMG,KAAKC,QAErBZ,eAAe;AACjB;AAAA,MAAA;AAMDE,SAAAA;AACT;AAKO,SAASW,gCAAgC;AAAA,EAC9ChB;AAAAA,EACAK;AAIF,GAA4B;AAC1B,MAAID,SAAS;AAEPa,QAAAA,WAAWpB,eAAeQ,eAAeI,KAAK,CAAC,CAAC,IAClDJ,eAAeI,KAAK,CAAC,EAAED,OACvBU,QACEC,UAAUtB,eAAeQ,eAAeI,KAAK,CAAC,CAAC,IACjDJ,eAAeI,KAAK,CAAC,EAAED,OACvBU;AAEA,MAAA,EAAA,CAACD,YAAY,CAACE;AAIlB,eAAWZ,SAASP;AAClB,UAAIO,MAAMC,SAASS,YAIdP,MAAAA,wBAAwBH,KAAK;AAIlC,mBAAWI,SAASJ,MAAMK;AACnBC,cAAAA,MAAAA,mBAAmBF,KAAK,GAI7B;AAAA,gBAAIA,MAAMH,SAASW;AACV,qBAAA;AAAA,gBACLV,MAAM,CAAC;AAAA,kBAACD,MAAMD,MAAMC;AAAAA,gBAAAA,CAAK;AAAA,gBACzBJ,QAAQA,SAASC,eAAeD;AAAAA,cAClC;AAGFA,sBAAUO,MAAMG,KAAKC;AAAAA,UAAAA;AAAAA;AAAAA;AAG3B;AClIO,SAASK,iBAAiB;AAAA,EAC/BC;AAAAA,EACAZ;AAIF,GAAyB;AACnBC,MAAAA,MAAAA,wBAAwBW,IAAI,GAAG;AACjC,UAAMC,YAAYD,KAAKT,SAASS,KAAKT,SAASG,SAAS,CAAC;AAEpDO,QAAAA;AACK,aAAA;AAAA,QACLb,MAAM,CAAC,GAAGA,MAAM,YAAY;AAAA,UAACD,MAAMc,UAAUd;AAAAA,QAAAA,CAAK;AAAA,QAClDJ,QAAQS,MAAmBS,mBAAAA,SAAS,IAAIA,UAAUR,KAAKC,SAAS;AAAA,MAClE;AAAA,EAAA;AAIG,SAAA;AAAA,IACLN;AAAAA,IACAL,QAAQ;AAAA,EACV;AACF;ACvBO,SAASmB,mBAAmB;AAAA,EACjCF;AAAAA,EACAZ;AAIF,GAAyB;AACnBC,SAAAA,MAAAA,wBAAwBW,IAAI,IACvB;AAAA,IACLZ,MAAM,CAAC,GAAGA,MAAM,YAAY;AAAA,MAACD,MAAMa,KAAKT,SAAS,CAAC,EAAEJ;AAAAA,IAAAA,CAAK;AAAA,IACzDJ,QAAQ;AAAA,EAAA,IAIL;AAAA,IACLK;AAAAA,IACAL,QAAQ;AAAA,EACV;AACF;ACvBO,SAASoB,iBAAiBjB,OAA8B;AACtDA,SAAAA,MAAMK,SAASa,IAAKd,CAAAA,UAAUA,MAAMG,QAAQ,EAAE,EAAEY,KAAK,EAAE;AAChE;ACGO,SAASC,iBAAiBpB,OAA0B;AACrD,MAAA,CAACG,8BAAwBH,KAAK;AACzB,WAAA;AAGHqB,QAAAA,WAAWrB,MAAMK,SAASiB,MAAMhB,MAAAA,kBAAkB,GAClDiB,YAAYN,iBAAiBjB,KAAK;AAExC,SAAOqB,YAAYE,cAAc;AACnC;ACdgBC,SAAAA,uBACdC,GACAC,GACA;AACA,SACED,EAAE5B,WAAW6B,EAAE7B,UAAU8B,KAAKC,UAAUH,EAAEvB,IAAI,MAAMyB,KAAKC,UAAUF,EAAExB,IAAI;AAE7E;ACNgB2B,SAAAA,OACdC,SACA1B,OAC2B;AAC3B,SAAOA,MAAM2B,UAAUD,QAAQE,OAAOC,KAAKC;AAC7C;ACAO,SAASC,YAAY;AAAA,EAC1BC;AAAAA,EACAC;AAIF,GAA6B;AAC3B,QAAMC,QAAkC,CAAE;AAE1C,MAAI,CAACD;AACIC,WAAAA;AAGLC,MAAAA;AACJ,QAAMC,eAAoC,CAAE;AACxCC,MAAAA;AAEJ,QAAMC,aAAaL,UAAUM,WAAWN,UAAUO,QAAQP,UAAUQ,QAC9DC,WAAWT,UAAUM,WAAWN,UAAUQ,SAASR,UAAUO,OAE7DG,gBAAgBC,MAAaN,aAAAA,WAAWxC,KAAK,CAAC,CAAC,IACjDwC,WAAWxC,KAAK,CAAC,EAAED,OACnBU,QACEsC,cAAcD,MAAAA,aAAaF,SAAS5C,KAAK,CAAC,CAAC,IAC7C4C,SAAS5C,KAAK,CAAC,EAAED,OACjBU,QACEuC,gBAAgBF,MAAAA,aAAaN,WAAWxC,KAAK,CAAC,CAAC,IACjDwC,WAAWxC,KAAK,CAAC,EAAED,OACnBU,QACEwC,cAAcH,MAAAA,aAAaF,SAAS5C,KAAK,CAAC,CAAC,IAC7C4C,SAAS5C,KAAK,CAAC,EAAED,OACjBU;AAEA,MAAA,CAACoC,iBAAiB,CAACE;AACdX,WAAAA;AAGT,aAAWtC,SAASoC,QAAQ;AACtB,QAAA,CAACjC,MAAAA,wBAAwBH,KAAK,KAC5BA,MAAMC,SAAS8C,iBAAiB/C,MAAMC,SAASgD,aAAa;AACjDjD,mBAAAA;AACb;AAAA,IAAA;AAIAA,QAAAA,MAAMC,SAAS8C,eAAe;AAC5B,UAAA,CAAC5C,MAAAA,wBAAwBH,KAAK,GAAG;AACtBA,qBAAAA;AACb;AAAA,MAAA;AAGF,UAAIkD,eAAe;AACN9C,mBAAAA,SAASJ,MAAMK,UAAU;AAC9BD,cAAAA,MAAMH,SAASiD,eAAe;AAC5B5C,gBAAAA,MAAAA,mBAAmBF,KAAK,GAAG;AAC7B,oBAAMG,OACJH,MAAMH,SAASkD,cACX/C,MAAMG,KAAK+B,MAAMI,WAAW7C,QAAQiD,SAASjD,MAAM,IACnDO,MAAMG,KAAK+B,MAAMI,WAAW7C,MAAM;AAE3B,2BAAA;AAAA,gBACX,GAAGG;AAAAA,gBACHK,UAAU,CACR;AAAA,kBACE,GAAGD;AAAAA,kBACHG;AAAAA,gBACD,CAAA;AAAA,cAEL;AAAA,YACF;AACe,2BAAA;AAAA,gBACX,GAAGP;AAAAA,gBACHK,UAAU,CAACD,KAAK;AAAA,cAClB;AAGF,gBAAI8C,kBAAkBC;AACpB;AAEF;AAAA,UAAA;AAGF,cAAIZ,cAAcpC,MAAAA,wBAAwBoC,UAAU,MAEhDY,eACA/C,MAAMH,SAASkD,eACf7C,MAAmBF,mBAAAA,KAAK,IAExBmC,WAAWlC,SAAS+C,KAAK;AAAA,YACvB,GAAGhD;AAAAA,YACHG,MAAMH,MAAMG,KAAK+B,MAAM,GAAGQ,SAASjD,MAAM;AAAA,UAC1C,CAAA,IAED0C,WAAWlC,SAAS+C,KAAKhD,KAAK,GAI9BJ,MAAMC,SAASgD,eACfE,eACA/C,MAAMH,SAASkD;AAEf;AAAA,QAAA;AAKN,YAAIJ,kBAAkBE;AACpB;AAGF;AAAA,MAAA;AAGFV,UAAAA,aAAavC,OAET+C,kBAAkBE;AACpB;AAAA,IAAA;AAIAjD,QAAAA,MAAMC,SAASgD,aAAa;AAC1B,UAAA,CAAC9C,MAAAA,wBAAwBH,KAAK,GAAG;AACxBA,mBAAAA;AACX;AAAA,MAAA;AAGF,UAAImD,aAAa;AACJ,mBAAA;AAAA,UACT,GAAGnD;AAAAA,UACHK,UAAU,CAAA;AAAA,QACZ;AAEA,mBAAWD,SAASJ,MAAMK;AACpBoC,cAAAA,YAAYtC,8BAAwBsC,QAAQ,GAAG;AACjD,gBAAIrC,MAAMH,SAASkD,eAAe7C,MAAAA,mBAAmBF,KAAK,GAAG;AAC3DqC,uBAASpC,SAAS+C,KAAK;AAAA,gBACrB,GAAGhD;AAAAA,gBACHG,MAAMH,MAAMG,KAAK+B,MAAM,GAAGQ,SAASjD,MAAM;AAAA,cAAA,CAC1C;AAED;AAAA,YAAA;AAKF,gBAFA4C,SAASpC,SAAS+C,KAAKhD,KAAK,GAExB+C,eAAe/C,MAAMH,SAASkD;AAChC;AAAA,UAAA;AAKN;AAAA,MAAA;AAGSnD,iBAAAA;AAEX;AAAA,IAAA;AAGEuC,kBACFC,aAAaY,KAAKpD,KAAK;AAAA,EAAA;AAI3B,SAAO,CACL,GAAIuC,aAAa,CAACA,UAAU,IAAI,CAAA,GAChC,GAAGC,cACH,GAAIC,WAAW,CAACA,QAAQ,IAAI,CAAA,CAAG;AAEnC;;;;;;;;;;;"}
1
+ {"version":3,"file":"util.slice-blocks.cjs","sources":["../../src/utils/util.is-keyed-segment.ts","../../src/utils/util.block-offset.ts","../../src/utils/util.get-block-end-point.ts","../../src/utils/util.get-block-start-point.ts","../../src/utils/util.get-text-block-text.ts","../../src/utils/util.is-empty-text-block.ts","../../src/utils/util.is-equal-selection-points.ts","../../src/utils/util.is-span.ts","../../src/utils/util.slice-blocks.ts"],"sourcesContent":["import type {KeyedSegment, PathSegment} from '@sanity/types'\n\n/**\n * @public\n */\nexport function isKeyedSegment(segment: PathSegment): segment is KeyedSegment {\n return typeof segment === 'object' && segment !== null && '_key' in segment\n}\n","import {\n isPortableTextSpan,\n isPortableTextTextBlock,\n type KeyedSegment,\n type PortableTextBlock,\n} from '@sanity/types'\nimport type {BlockOffset} from '../types/block-offset'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport {isKeyedSegment} from './util.is-keyed-segment'\n\n/**\n * @public\n */\nexport function blockOffsetToSpanSelectionPoint({\n value,\n blockOffset,\n direction,\n}: {\n value: Array<PortableTextBlock>\n blockOffset: BlockOffset\n direction: 'forward' | 'backward'\n}) {\n let offsetLeft = blockOffset.offset\n let selectionPoint:\n | {path: [KeyedSegment, 'children', KeyedSegment]; offset: number}\n | undefined\n let skippedInlineObject = false\n\n for (const block of value) {\n if (block._key !== blockOffset.path[0]._key) {\n continue\n }\n\n if (!isPortableTextTextBlock(block)) {\n continue\n }\n\n for (const child of block.children) {\n if (direction === 'forward') {\n if (!isPortableTextSpan(child)) {\n continue\n }\n\n if (offsetLeft <= child.text.length) {\n selectionPoint = {\n path: [...blockOffset.path, 'children', {_key: child._key}],\n offset: offsetLeft,\n }\n break\n }\n\n offsetLeft -= child.text.length\n\n continue\n }\n\n if (!isPortableTextSpan(child)) {\n skippedInlineObject = true\n continue\n }\n\n if (offsetLeft === 0 && selectionPoint && !skippedInlineObject) {\n if (skippedInlineObject) {\n selectionPoint = {\n path: [...blockOffset.path, 'children', {_key: child._key}],\n offset: 0,\n }\n }\n break\n }\n\n if (offsetLeft > child.text.length) {\n offsetLeft -= child.text.length\n continue\n }\n\n if (offsetLeft <= child.text.length) {\n selectionPoint = {\n path: [...blockOffset.path, 'children', {_key: child._key}],\n offset: offsetLeft,\n }\n\n offsetLeft -= child.text.length\n\n if (offsetLeft !== 0) {\n break\n }\n }\n }\n }\n\n return selectionPoint\n}\n\n/**\n * @public\n */\nexport function spanSelectionPointToBlockOffset({\n value,\n selectionPoint,\n}: {\n value: Array<PortableTextBlock>\n selectionPoint: EditorSelectionPoint\n}): BlockOffset | undefined {\n let offset = 0\n\n const blockKey = isKeyedSegment(selectionPoint.path[0])\n ? selectionPoint.path[0]._key\n : undefined\n const spanKey = isKeyedSegment(selectionPoint.path[2])\n ? selectionPoint.path[2]._key\n : undefined\n\n if (!blockKey || !spanKey) {\n return undefined\n }\n\n for (const block of value) {\n if (block._key !== blockKey) {\n continue\n }\n\n if (!isPortableTextTextBlock(block)) {\n continue\n }\n\n for (const child of block.children) {\n if (!isPortableTextSpan(child)) {\n continue\n }\n\n if (child._key === spanKey) {\n return {\n path: [{_key: block._key}],\n offset: offset + selectionPoint.offset,\n }\n }\n\n offset += child.text.length\n }\n }\n}\n","import {\n isPortableTextSpan,\n isPortableTextTextBlock,\n type KeyedSegment,\n type PortableTextBlock,\n} from '@sanity/types'\nimport type {EditorSelectionPoint} from '../types/editor'\n\n/**\n * @public\n */\nexport function getBlockEndPoint({\n node,\n path,\n}: {\n node: PortableTextBlock\n path: [KeyedSegment]\n}): EditorSelectionPoint {\n if (isPortableTextTextBlock(node)) {\n const lastChild = node.children[node.children.length - 1]\n\n if (lastChild) {\n return {\n path: [...path, 'children', {_key: lastChild._key}],\n offset: isPortableTextSpan(lastChild) ? lastChild.text.length : 0,\n }\n }\n }\n\n return {\n path,\n offset: 0,\n }\n}\n","import {\n isPortableTextTextBlock,\n type KeyedSegment,\n type PortableTextBlock,\n} from '@sanity/types'\nimport type {EditorSelectionPoint} from '../types/editor'\n\n/**\n * @public\n */\nexport function getBlockStartPoint({\n node,\n path,\n}: {\n node: PortableTextBlock\n path: [KeyedSegment]\n}): EditorSelectionPoint {\n if (isPortableTextTextBlock(node)) {\n return {\n path: [...path, 'children', {_key: node.children[0]._key}],\n offset: 0,\n }\n }\n\n return {\n path,\n offset: 0,\n }\n}\n","import type {PortableTextTextBlock} from '@sanity/types'\n\n/**\n * @public\n */\nexport function getTextBlockText(block: PortableTextTextBlock) {\n return block.children.map((child) => child.text ?? '').join('')\n}\n","import {\n isPortableTextSpan,\n isPortableTextTextBlock,\n type PortableTextBlock,\n} from '@sanity/types'\nimport {getTextBlockText} from './util.get-text-block-text'\n\n/**\n * @public\n */\nexport function isEmptyTextBlock(block: PortableTextBlock) {\n if (!isPortableTextTextBlock(block)) {\n return false\n }\n\n const onlyText = block.children.every(isPortableTextSpan)\n const blockText = getTextBlockText(block)\n\n return onlyText && blockText === ''\n}\n","import type {EditorSelectionPoint} from '../types/editor'\n\n/**\n * @public\n */\nexport function isEqualSelectionPoints(\n a: EditorSelectionPoint,\n b: EditorSelectionPoint,\n) {\n return (\n a.offset === b.offset && JSON.stringify(a.path) === JSON.stringify(b.path)\n )\n}\n","import type {PortableTextChild, PortableTextSpan} from '@sanity/types'\nimport type {EditorContext} from '..'\n\n/**\n * @public\n */\nexport function isSpan(\n context: Pick<EditorContext, 'schema'>,\n child: PortableTextChild,\n): child is PortableTextSpan {\n return child._type === context.schema.span.name\n}\n","import {\n isKeySegment,\n isPortableTextSpan,\n isPortableTextTextBlock,\n type PortableTextBlock,\n} from '@sanity/types'\nimport type {EditorSelection} from '..'\n\n/**\n * @public\n */\nexport function sliceBlocks({\n blocks,\n selection,\n}: {\n blocks: Array<PortableTextBlock>\n selection: EditorSelection\n}): Array<PortableTextBlock> {\n const slice: Array<PortableTextBlock> = []\n\n if (!selection) {\n return slice\n }\n\n let startBlock: PortableTextBlock | undefined\n const middleBlocks: PortableTextBlock[] = []\n let endBlock: PortableTextBlock | undefined\n\n const startPoint = selection.backward ? selection.focus : selection.anchor\n const endPoint = selection.backward ? selection.anchor : selection.focus\n\n const startBlockKey = isKeySegment(startPoint.path[0])\n ? startPoint.path[0]._key\n : undefined\n const endBlockKey = isKeySegment(endPoint.path[0])\n ? endPoint.path[0]._key\n : undefined\n const startChildKey = isKeySegment(startPoint.path[2])\n ? startPoint.path[2]._key\n : undefined\n const endChildKey = isKeySegment(endPoint.path[2])\n ? endPoint.path[2]._key\n : undefined\n\n if (!startBlockKey || !endBlockKey) {\n return slice\n }\n\n for (const block of blocks) {\n if (!isPortableTextTextBlock(block)) {\n if (block._key === startBlockKey && block._key === endBlockKey) {\n startBlock = block\n break\n }\n }\n\n if (block._key === startBlockKey) {\n if (!isPortableTextTextBlock(block)) {\n startBlock = block\n continue\n }\n\n if (startChildKey) {\n for (const child of block.children) {\n if (child._key === startChildKey) {\n if (isPortableTextSpan(child)) {\n const text =\n child._key === endChildKey\n ? child.text.slice(startPoint.offset, endPoint.offset)\n : child.text.slice(startPoint.offset)\n\n startBlock = {\n ...block,\n children: [\n {\n ...child,\n text,\n },\n ],\n }\n } else {\n startBlock = {\n ...block,\n children: [child],\n }\n }\n\n if (startChildKey === endChildKey) {\n break\n }\n continue\n }\n\n if (startBlock && isPortableTextTextBlock(startBlock)) {\n if (\n endChildKey &&\n child._key === endChildKey &&\n isPortableTextSpan(child)\n ) {\n startBlock.children.push({\n ...child,\n text: child.text.slice(0, endPoint.offset),\n })\n } else {\n startBlock.children.push(child)\n }\n\n if (\n block._key === endBlockKey &&\n endChildKey &&\n child._key === endChildKey\n ) {\n break\n }\n }\n }\n\n if (startBlockKey === endBlockKey) {\n break\n }\n\n continue\n }\n\n startBlock = block\n\n if (startBlockKey === endBlockKey) {\n break\n }\n }\n\n if (block._key === endBlockKey) {\n if (!isPortableTextTextBlock(block)) {\n endBlock = block\n break\n }\n\n if (endChildKey) {\n endBlock = {\n ...block,\n children: [],\n }\n\n for (const child of block.children) {\n if (endBlock && isPortableTextTextBlock(endBlock)) {\n if (child._key === endChildKey && isPortableTextSpan(child)) {\n endBlock.children.push({\n ...child,\n text: child.text.slice(0, endPoint.offset),\n })\n\n break\n }\n\n endBlock.children.push(child)\n\n if (endChildKey && child._key === endChildKey) {\n break\n }\n }\n }\n\n break\n }\n\n endBlock = block\n\n break\n }\n\n if (startBlock) {\n middleBlocks.push(block)\n }\n }\n\n return [\n ...(startBlock ? [startBlock] : []),\n ...middleBlocks,\n ...(endBlock ? [endBlock] : []),\n ]\n}\n"],"names":["isKeyedSegment","segment","blockOffsetToSpanSelectionPoint","value","blockOffset","direction","offsetLeft","offset","selectionPoint","skippedInlineObject","block","_key","path","isPortableTextTextBlock","child","children","isPortableTextSpan","text","length","spanSelectionPointToBlockOffset","blockKey","undefined","spanKey","getBlockEndPoint","node","lastChild","getBlockStartPoint","getTextBlockText","map","join","isEmptyTextBlock","onlyText","every","blockText","isEqualSelectionPoints","a","b","JSON","stringify","isSpan","context","_type","schema","span","name","sliceBlocks","blocks","selection","slice","startBlock","middleBlocks","endBlock","startPoint","backward","focus","anchor","endPoint","startBlockKey","isKeySegment","endBlockKey","startChildKey","endChildKey","push"],"mappings":"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"}
@@ -2517,14 +2517,21 @@ const converterJson = {
2517
2517
  deserialize: ({
2518
2518
  snapshot,
2519
2519
  event
2520
- }) => ({
2521
- type: "deserialization.success",
2522
- data: htmlToBlocks(event.data, snapshot.context.schema.portableText, {
2520
+ }) => {
2521
+ const blocks = htmlToBlocks(event.data, snapshot.context.schema.portableText, {
2523
2522
  keyGenerator: snapshot.context.keyGenerator,
2524
2523
  unstable_whitespaceOnPasteMode: snapshot.context.schema.block.options.unstable_whitespaceOnPasteMode
2525
- }),
2526
- mimeType: "text/html"
2527
- })
2524
+ });
2525
+ return blocks.length === 0 ? {
2526
+ type: "deserialization.failure",
2527
+ mimeType: "text/html",
2528
+ reason: "No blocks deserialized"
2529
+ } : {
2530
+ type: "deserialization.success",
2531
+ data: blocks,
2532
+ mimeType: "text/html"
2533
+ };
2534
+ }
2528
2535
  }, converterTextPlain = {
2529
2536
  mimeType: "text/plain",
2530
2537
  serialize: ({
@@ -2550,12 +2557,16 @@ const converterJson = {
2550
2557
  snapshot,
2551
2558
  event
2552
2559
  }) => {
2553
- const textToHtml = `<html><body>${escapeHtml(event.data).split(/\n{2,}/).map((line) => line ? `<p>${line.replace(/(?:\r\n|\r|\n)/g, "<br/>")}</p>` : "<p></p>").join("")}</body></html>`;
2554
- return {
2560
+ const textToHtml = `<html><body>${escapeHtml(event.data).split(/\n{2,}/).map((line) => line ? `<p>${line.replace(/(?:\r\n|\r|\n)/g, "<br/>")}</p>` : "<p></p>").join("")}</body></html>`, blocks = htmlToBlocks(textToHtml, snapshot.context.schema.portableText, {
2561
+ keyGenerator: snapshot.context.keyGenerator
2562
+ });
2563
+ return blocks.length === 0 ? {
2564
+ type: "deserialization.failure",
2565
+ mimeType: "text/plain",
2566
+ reason: "No blocks deserialized"
2567
+ } : {
2555
2568
  type: "deserialization.success",
2556
- data: htmlToBlocks(textToHtml, snapshot.context.schema.portableText, {
2557
- keyGenerator: snapshot.context.keyGenerator
2558
- }),
2569
+ data: blocks,
2559
2570
  mimeType: "text/plain"
2560
2571
  };
2561
2572
  }
@@ -4474,7 +4485,7 @@ const blockSetBehaviorActionImplementation = ({
4474
4485
  "deserialization.failure": ({
4475
4486
  action
4476
4487
  }) => {
4477
- console.warn(`Deserialization of ${action.mimeType} failed with reason ${action.reason}`);
4488
+ console.warn(`Deserialization of ${action.mimeType} failed with reason "${action.reason}"`);
4478
4489
  },
4479
4490
  "deserialization.success": ({
4480
4491
  context,
@@ -4607,7 +4618,7 @@ const blockSetBehaviorActionImplementation = ({
4607
4618
  "serialization.failure": ({
4608
4619
  action
4609
4620
  }) => {
4610
- console.warn(`Serialization of ${action.mimeType} failed with reason ${action.reason}`);
4621
+ console.warn(`Serialization of ${action.mimeType} failed with reason "${action.reason}"`);
4611
4622
  },
4612
4623
  "serialization.success": ({
4613
4624
  context,