@portabletext/editor 8.0.3 → 8.1.1

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 (28) hide show
  1. package/lib/{behavior.types.action-C6D8CCF9.d.ts → behavior.types.action-C0XDEQnB.d.ts} +18 -1
  2. package/lib/behavior.types.action-C0XDEQnB.d.ts.map +1 -0
  3. package/lib/behaviors/index.d.ts +1 -1
  4. package/lib/{get-container-D1nM_ww9.js → get-container-D2pN5Npr.js} +3 -3
  5. package/lib/{get-container-D1nM_ww9.js.map → get-container-D2pN5Npr.js.map} +1 -1
  6. package/lib/{get-parent-Ci5241qs.js → get-parent-DgaKcy8-.js} +18 -12
  7. package/lib/get-parent-DgaKcy8-.js.map +1 -0
  8. package/lib/{get-path-sub-schema-CZd9VcVM.js → get-path-sub-schema-Dd0QYZ0m.js} +2 -2
  9. package/lib/{get-path-sub-schema-CZd9VcVM.js.map → get-path-sub-schema-Dd0QYZ0m.js.map} +1 -1
  10. package/lib/index.d.ts +1 -1
  11. package/lib/index.js +290 -205
  12. package/lib/index.js.map +1 -1
  13. package/lib/plugins/index.d.ts +1 -1
  14. package/lib/{selector.is-selecting-entire-blocks-DPnzucrd.js → selector.is-selecting-entire-blocks-BFhnnkHf.js} +4 -4
  15. package/lib/{selector.is-selecting-entire-blocks-DPnzucrd.js.map → selector.is-selecting-entire-blocks-BFhnnkHf.js.map} +1 -1
  16. package/lib/selectors/index.d.ts +1 -1
  17. package/lib/selectors/index.js +4 -4
  18. package/lib/traversal/index.d.ts +1 -1
  19. package/lib/traversal/index.js +3 -3
  20. package/lib/{util.is-equal-selections-N1hxVUbE.js → util.is-equal-selections-BdK98okY.js} +2 -2
  21. package/lib/{util.is-equal-selections-N1hxVUbE.js.map → util.is-equal-selections-BdK98okY.js.map} +1 -1
  22. package/lib/{util.slice-blocks-B2fZcNok.js → util.slice-blocks-_ElaB53f.js} +2 -2
  23. package/lib/{util.slice-blocks-B2fZcNok.js.map → util.slice-blocks-_ElaB53f.js.map} +1 -1
  24. package/lib/utils/index.d.ts +1 -1
  25. package/lib/utils/index.js +3 -3
  26. package/package.json +1 -1
  27. package/lib/behavior.types.action-C6D8CCF9.d.ts.map +0 -1
  28. package/lib/get-parent-Ci5241qs.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"util.slice-blocks-B2fZcNok.js","names":[],"sources":["../src/utils/util.child-text-offset.ts","../src/utils/util.block-offset.ts","../src/utils/util.is-equal-path-segments.ts","../src/utils/util.is-equal-paths.ts","../src/utils/util.is-equal-selection-points.ts","../src/utils/util.selection-point.ts","../src/utils/util.get-block-end-point.ts","../src/utils/util.get-block-start-point.ts","../src/utils/util.is-selection-collapsed.ts","../src/utils/util.get-selection-end-point.ts","../src/utils/util.get-selection-start-point.ts","../src/utils/key-generator.ts","../src/utils/parse-blocks.ts","../src/utils/util.slice-blocks.ts"],"sourcesContent":["/**\n * Pure text-offset arithmetic over a node's children array, shared by\n * the snapshot-aware block-offset utils (`util.block-offset.ts`) and\n * the schema-free point transform (`engine/point/transform-point.ts`).\n * Span-ness is the caller's concern, expressed as an accessor that\n * returns the child's text when the child occupies text offsets and\n * `undefined` when it does not (inline objects, blocks).\n */\n\n/**\n * The text offset of `(childKey, offsetInChild)` within `children`:\n * the total text of the children before that child, plus the offset\n * into it. `undefined` when the child is missing or carries no text.\n */\nexport function textOffsetOfChild(\n children: ReadonlyArray<unknown>,\n getSpanText: (child: unknown) => string | undefined,\n childKey: string,\n offsetInChild: number,\n): number | undefined {\n let precedingTextLength = 0\n\n for (const child of children) {\n const text = getSpanText(child)\n if (keyOf(child) === childKey) {\n return text === undefined\n ? undefined\n : precedingTextLength + offsetInChild\n }\n if (text !== undefined) {\n precedingTextLength += text.length\n }\n }\n\n return undefined\n}\n\n/**\n * The child and child-local offset at `textOffset` within `children`.\n * Forward-boundary convention: an offset landing exactly on a span\n * boundary stays at the end of the earlier span. `undefined` when the\n * offset lies beyond the children's total text.\n */\nexport function childAtTextOffset(\n children: ReadonlyArray<unknown>,\n getSpanText: (child: unknown) => string | undefined,\n textOffset: number,\n): {key: string; offset: number} | undefined {\n let remainingOffset = textOffset\n\n for (const child of children) {\n const text = getSpanText(child)\n if (text === undefined) {\n continue\n }\n if (remainingOffset <= text.length) {\n const key = keyOf(child)\n return key === undefined ? undefined : {key, offset: remainingOffset}\n }\n remainingOffset -= text.length\n }\n\n return undefined\n}\n\nfunction keyOf(child: unknown): string | undefined {\n if (child !== null && typeof child === 'object' && '_key' in child) {\n const key = (child as {_key: unknown})._key\n return typeof key === 'string' ? key : undefined\n }\n return undefined\n}\n","import {isSpan, isTextBlock} from '@portabletext/schema'\nimport {getNode} from '../traversal/get-node'\nimport {getParent} from '../traversal/get-parent'\nimport type {TraversalSnapshot} from '../traversal/traversal-snapshot'\nimport type {BlockOffset} from '../types/block-offset'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport type {ChildPath} from '../types/paths'\nimport {childAtTextOffset, textOffsetOfChild} from './util.child-text-offset'\nimport {isKeyedSegment} from './util.is-keyed-segment'\n\n/**\n * @public\n */\nexport function blockOffsetToSpanSelectionPoint({\n snapshot,\n blockOffset,\n direction,\n}: {\n snapshot: TraversalSnapshot\n blockOffset: BlockOffset\n direction: 'forward' | 'backward'\n}) {\n const blockEntry = getNode(snapshot, blockOffset.path)\n\n if (!blockEntry || !isTextBlock(snapshot.context, blockEntry.node)) {\n return undefined\n }\n\n const block = blockEntry.node\n const blockPath = blockEntry.path\n\n if (direction === 'forward') {\n const placed = childAtTextOffset(\n block.children,\n (child) =>\n isSpan(snapshot.context, child as (typeof block.children)[number])\n ? (child as {text: string}).text\n : undefined,\n blockOffset.offset,\n )\n return placed\n ? {\n path: [\n ...blockPath,\n 'children',\n {_key: placed.key},\n ] satisfies ChildPath,\n offset: placed.offset,\n }\n : undefined\n }\n\n let offsetLeft = blockOffset.offset\n let selectionPoint: {path: ChildPath; offset: number} | undefined\n let skippedInlineObject = false\n\n for (const child of block.children) {\n if (!isSpan(snapshot.context, child)) {\n skippedInlineObject = true\n continue\n }\n\n if (offsetLeft === 0 && selectionPoint && !skippedInlineObject) {\n // A boundary offset stays at the end of the previous span unless an\n // inline object was skipped, in which case falling through to the\n // `offsetLeft <= child.text.length` branch lands the point at the\n // start of this span instead.\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: [...blockPath, '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 return selectionPoint\n}\n\n/**\n * @public\n */\nexport function spanSelectionPointToBlockOffset({\n snapshot,\n selectionPoint,\n}: {\n snapshot: TraversalSnapshot\n selectionPoint: EditorSelectionPoint\n}): BlockOffset | undefined {\n const spanSegment = selectionPoint.path.at(-1)\n\n if (!isKeyedSegment(spanSegment)) {\n return undefined\n }\n\n const textBlock = getParent(snapshot, selectionPoint.path, {\n match: (node) => isTextBlock({schema: snapshot.context.schema}, node),\n })\n\n if (!textBlock) {\n return undefined\n }\n\n const offset = textOffsetOfChild(\n textBlock.node.children,\n (child) =>\n isSpan(\n snapshot.context,\n child as (typeof textBlock.node.children)[number],\n )\n ? (child as {text: string}).text\n : undefined,\n spanSegment._key,\n selectionPoint.offset,\n )\n\n return offset === undefined ? undefined : {path: textBlock.path, offset}\n}\n","import type {PathSegment} from '../types/paths'\nimport {isKeyedSegment} from './util.is-keyed-segment'\n\nexport function isEqualPathSegments(\n segA: PathSegment | undefined,\n segB: PathSegment | undefined,\n): boolean {\n if (segA === segB) {\n return true\n }\n\n if (segA === undefined || segB === undefined) {\n return false\n }\n\n if (\n (typeof segA === 'string' || typeof segA === 'number') &&\n (typeof segB === 'string' || typeof segB === 'number')\n ) {\n return segA === segB\n }\n\n if (isKeyedSegment(segA) && isKeyedSegment(segB)) {\n return segA._key === segB._key\n }\n\n if (Array.isArray(segA) && Array.isArray(segB)) {\n return segA[0] === segB[0] && segA[1] === segB[1]\n }\n\n return false\n}\n","import type {Path} from '../types/paths'\nimport {isEqualPathSegments} from './util.is-equal-path-segments'\n\n/**\n * @public\n */\nexport function isEqualPaths(a: Path, b: Path): boolean {\n if (a.length !== b.length) {\n return false\n }\n\n for (let i = 0; i < a.length; i++) {\n if (!isEqualPathSegments(a[i], b[i])) {\n return false\n }\n }\n\n return true\n}\n","import type {EditorSelectionPoint} from '../types/editor'\nimport {isEqualPaths} from './util.is-equal-paths'\n\n/**\n * @public\n */\nexport function isEqualSelectionPoints(\n a: EditorSelectionPoint,\n b: EditorSelectionPoint,\n) {\n return a.offset === b.offset && isEqualPaths(a.path, b.path)\n}\n","import type {EditorSelectionPoint} from '../types/editor'\nimport {isKeyedSegment} from './util.is-keyed-segment'\n\nexport function getBlockKeyFromSelectionPoint(point: EditorSelectionPoint) {\n const blockPathSegment = point.path.at(0)\n\n if (isKeyedSegment(blockPathSegment)) {\n return blockPathSegment._key\n }\n\n return undefined\n}\n\nexport function getChildKeyFromSelectionPoint(point: EditorSelectionPoint) {\n const childPathSegment = point.path.at(2)\n\n if (isKeyedSegment(childPathSegment)) {\n return childPathSegment._key\n }\n\n return undefined\n}\n","import {isSpan, isTextBlock, type PortableTextBlock} from '@portabletext/schema'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport type {BlockPath} from '../types/paths'\n\n/**\n * @public\n */\nexport function getBlockEndPoint({\n context,\n block,\n}: {\n context: Pick<EditorContext, 'schema'>\n block: {\n node: PortableTextBlock\n path: BlockPath\n }\n}): EditorSelectionPoint {\n if (isTextBlock(context, block.node)) {\n const lastChild = block.node.children[block.node.children.length - 1]\n\n if (lastChild) {\n return {\n path: [...block.path, 'children', {_key: lastChild._key}],\n offset: isSpan(context, lastChild) ? lastChild.text.length : 0,\n }\n }\n }\n\n return {\n path: block.path,\n offset: 0,\n }\n}\n","import {isTextBlock, type PortableTextBlock} from '@portabletext/schema'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport type {BlockPath} from '../types/paths'\n\n/**\n * @public\n */\nexport function getBlockStartPoint({\n context,\n block,\n}: {\n context: Pick<EditorContext, 'schema'>\n block: {\n node: PortableTextBlock\n path: BlockPath\n }\n}): EditorSelectionPoint {\n if (isTextBlock(context, block.node)) {\n const firstChild = block.node.children[0]\n return {\n path: [...block.path, 'children', {_key: firstChild?._key ?? ''}],\n offset: 0,\n }\n }\n\n return {\n path: block.path,\n offset: 0,\n }\n}\n","import type {EditorSelection} from '../types/editor'\nimport {isEqualPaths} from './util.is-equal-paths'\n\n/**\n * @public\n */\nexport function isSelectionCollapsed(selection: EditorSelection) {\n if (!selection) {\n return false\n }\n\n return (\n isEqualPaths(selection.anchor.path, selection.focus.path) &&\n selection.anchor.offset === selection.focus.offset\n )\n}\n","import type {EditorSelection, EditorSelectionPoint} from '../types/editor'\n\n/**\n * @public\n */\nexport function getSelectionEndPoint<\n TEditorSelection extends NonNullable<EditorSelection> | null,\n TEditorSelectionPoint extends EditorSelectionPoint | null =\n TEditorSelection extends NonNullable<EditorSelection>\n ? EditorSelectionPoint\n : null,\n>(selection: TEditorSelection): TEditorSelectionPoint {\n if (!selection) {\n return null as TEditorSelectionPoint\n }\n\n return (\n selection.backward ? selection.anchor : selection.focus\n ) as TEditorSelectionPoint\n}\n","import type {EditorSelection, EditorSelectionPoint} from '../types/editor'\n\n/**\n * @public\n */\nexport function getSelectionStartPoint<\n TEditorSelection extends NonNullable<EditorSelection> | null,\n TEditorSelectionPoint extends EditorSelectionPoint | null =\n TEditorSelection extends NonNullable<EditorSelection>\n ? EditorSelectionPoint\n : null,\n>(selection: TEditorSelection): TEditorSelectionPoint {\n if (!selection) {\n return null as TEditorSelectionPoint\n }\n\n return (\n selection.backward ? selection.focus : selection.anchor\n ) as TEditorSelectionPoint\n}\n","/**\n * @public\n */\nexport const defaultKeyGenerator = (): string => randomKey(12)\n\nconst getByteHexTable = (() => {\n let table: any[]\n return () => {\n if (table) {\n return table\n }\n\n table = []\n for (let i = 0; i < 256; ++i) {\n table[i] = (i + 0x100).toString(16).slice(1)\n }\n return table\n }\n})()\n\n// WHATWG crypto RNG - https://w3c.github.io/webcrypto/Overview.html\nfunction whatwgRNG(length = 16) {\n const rnds8 = new Uint8Array(length)\n crypto.getRandomValues(rnds8)\n return rnds8\n}\n\nfunction randomKey(length?: number): string {\n const table = getByteHexTable()\n return whatwgRNG(length)\n .reduce((str, n) => str + table[n], '')\n .slice(0, length)\n}\n","import {\n getSubSchema,\n isSpan,\n isTextBlock,\n type FieldDefinition,\n type OfDefinition,\n type PortableTextBlock,\n type PortableTextListBlock,\n type PortableTextObject,\n type PortableTextSpan,\n type PortableTextTextBlock,\n type Schema,\n type TypedObject,\n} from '@portabletext/schema'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport {isRecord, isTypedObject} from './asserters'\n\nexport function parseBlocks({\n schema,\n keyGenerator,\n blocks,\n options,\n}: {\n schema: Schema\n keyGenerator: () => string\n blocks: unknown\n options: {\n normalize: boolean\n removeUnusedMarkDefs: boolean\n validateFields: boolean\n }\n}): Array<PortableTextBlock> {\n if (!Array.isArray(blocks)) {\n return []\n }\n\n return blocks.flatMap((block) => {\n const parsedBlock = parseBlockInternal({\n schema,\n keyGenerator,\n block,\n options,\n })\n\n return parsedBlock ? [parsedBlock] : []\n })\n}\n\nexport function parseBlock({\n schema,\n keyGenerator,\n block,\n options,\n}: {\n schema: Schema\n keyGenerator: () => string\n block: unknown\n options: {\n normalize: boolean\n removeUnusedMarkDefs: boolean\n validateFields: boolean\n }\n}): PortableTextBlock | undefined {\n return parseBlockInternal({schema, keyGenerator, block, options})\n}\n\nexport function parseSpan({\n span,\n schema,\n keyGenerator,\n markDefKeyMap,\n options,\n}: {\n span: unknown\n schema: Schema\n keyGenerator: () => string\n markDefKeyMap: Map<string, string>\n options: {validateFields: boolean}\n}): PortableTextSpan | undefined {\n return parseSpanInternal({span, schema, keyGenerator, markDefKeyMap, options})\n}\n\nexport function parseInlineObject({\n inlineObject,\n schema,\n keyGenerator,\n options,\n}: {\n inlineObject: unknown\n schema: Schema\n keyGenerator: () => string\n options: {validateFields: boolean}\n}): PortableTextObject | undefined {\n return parseInlineObjectInternal({\n inlineObject,\n schema,\n keyGenerator,\n options,\n })\n}\n\nexport function parseChild({\n child,\n schema,\n keyGenerator,\n markDefKeyMap,\n options,\n}: {\n child: unknown\n schema: Schema\n keyGenerator: () => string\n markDefKeyMap: Map<string, string>\n options: {validateFields: boolean}\n}): PortableTextSpan | PortableTextObject | undefined {\n return parseChildInternal({\n child,\n schema,\n keyGenerator,\n markDefKeyMap,\n options,\n })\n}\n\nexport function parseMarkDefs({\n schema,\n keyGenerator,\n markDefs,\n options,\n}: {\n schema: Schema\n keyGenerator: () => string\n markDefs: unknown\n options: {validateFields: boolean}\n}): {\n markDefs: Array<PortableTextObject>\n markDefKeyMap: Map<string, string>\n} {\n return parseMarkDefsInternal({schema, keyGenerator, markDefs, options})\n}\n\nfunction parseBlockInternal({\n schema,\n keyGenerator,\n block,\n options,\n}: {\n schema: Schema\n keyGenerator: () => string\n block: unknown\n options: {\n normalize: boolean\n removeUnusedMarkDefs: boolean\n validateFields: boolean\n }\n}): PortableTextBlock | undefined {\n return (\n parseTextBlock({block, schema, keyGenerator, options}) ??\n parseBlockObject({blockObject: block, schema, keyGenerator, options})\n )\n}\n\nfunction parseBlockObject({\n blockObject,\n schema,\n keyGenerator,\n options,\n}: {\n blockObject: unknown\n schema: Schema\n keyGenerator: () => string\n options: {validateFields: boolean}\n}): PortableTextObject | undefined {\n if (!isTypedObject(blockObject)) {\n return undefined\n }\n\n const schemaType = schema.blockObjects.find(\n ({name}) => name === blockObject._type,\n )\n\n if (!schemaType) {\n return undefined\n }\n\n return parseObject({\n object: blockObject,\n schema,\n keyGenerator,\n schemaType,\n options,\n })\n}\n\nexport function isListBlock(\n context: Pick<EditorContext, 'schema'>,\n block: unknown,\n): block is PortableTextListBlock {\n return (\n isTextBlock(context, block) &&\n block.level !== undefined &&\n block.listItem !== undefined\n )\n}\n\nfunction parseTextBlock({\n block,\n schema,\n keyGenerator,\n options,\n}: {\n block: unknown\n schema: Schema\n keyGenerator: () => string\n options: {\n normalize: boolean\n removeUnusedMarkDefs: boolean\n validateFields: boolean\n }\n}): PortableTextTextBlock | undefined {\n if (!isTypedObject(block)) {\n return undefined\n }\n\n if (block._type !== schema.block.name) {\n return undefined\n }\n\n const customFields: Record<string, unknown> = {}\n\n for (const key of Object.keys(block)) {\n if (\n key === '_type' ||\n key === '_key' ||\n key === 'children' ||\n key === 'markDefs' ||\n key === 'style' ||\n key === 'listItem' ||\n key === 'level'\n ) {\n continue\n }\n\n if (options.validateFields) {\n if ((schema.block.fields ?? []).some((f) => f.name === key)) {\n customFields[key] = block[key]\n }\n } else {\n customFields[key] = block[key]\n }\n }\n\n const _key =\n typeof block['_key'] === 'string' ? block['_key'] : keyGenerator()\n\n const {markDefs, markDefKeyMap} = parseMarkDefsInternal({\n schema,\n keyGenerator,\n markDefs: block['markDefs'],\n options,\n })\n\n const unparsedChildren: Array<unknown> = Array.isArray(block['children'])\n ? block['children']\n : []\n\n const parsedChildren = unparsedChildren\n .map((child) =>\n parseChildInternal({child, schema, keyGenerator, markDefKeyMap, options}),\n )\n .filter((child) => child !== undefined)\n const marks = parsedChildren.flatMap((child) => child.marks ?? [])\n\n const children =\n parsedChildren.length > 0\n ? parsedChildren\n : [\n {\n _key: keyGenerator(),\n _type: schema.span.name,\n text: '',\n marks: [],\n },\n ]\n\n const normalizedChildren = options.normalize\n ? // Ensure that inline objects re surrounded by spans\n children.reduce<Array<PortableTextObject | PortableTextSpan>>(\n (normalizedChildren, child, index) => {\n if (isSpan({schema}, child)) {\n return [...normalizedChildren, child]\n }\n\n const previousChild = normalizedChildren.at(-1)\n\n if (!previousChild || !isSpan({schema}, previousChild)) {\n return [\n ...normalizedChildren,\n {\n _key: keyGenerator(),\n _type: schema.span.name,\n text: '',\n marks: [],\n },\n child,\n ...(index === children.length - 1\n ? [\n {\n _key: keyGenerator(),\n _type: schema.span.name,\n text: '',\n marks: [],\n },\n ]\n : []),\n ]\n }\n\n return [...normalizedChildren, child]\n },\n [],\n )\n : children\n\n const parsedBlock: PortableTextTextBlock = {\n _type: schema.block.name,\n _key,\n children: normalizedChildren,\n ...customFields,\n }\n\n if (typeof block['markDefs'] === 'object' && block['markDefs'] !== null) {\n parsedBlock.markDefs = options.removeUnusedMarkDefs\n ? markDefs.filter((markDef) => marks.includes(markDef._key))\n : markDefs\n }\n\n if (\n typeof block['style'] === 'string' &&\n schema.styles.find((style) => style.name === block['style'])\n ) {\n parsedBlock.style = block['style']\n }\n\n if (\n typeof block['listItem'] === 'string' &&\n schema.lists.find((list) => list.name === block['listItem'])\n ) {\n parsedBlock.listItem = block['listItem']\n }\n\n if (typeof block['level'] === 'number') {\n parsedBlock.level = block['level']\n }\n\n return parsedBlock\n}\n\nfunction parseMarkDefsInternal({\n schema,\n keyGenerator,\n markDefs,\n options,\n}: {\n schema: Schema\n keyGenerator: () => string\n markDefs: unknown\n options: {validateFields: boolean}\n}): {\n markDefs: Array<PortableTextObject>\n markDefKeyMap: Map<string, string>\n} {\n const unparsedMarkDefs: Array<unknown> = Array.isArray(markDefs)\n ? markDefs\n : []\n const markDefKeyMap = new Map<string, string>()\n\n const parsedMarkDefs = unparsedMarkDefs.flatMap((markDef) => {\n if (!isTypedObject(markDef)) {\n return []\n }\n\n const schemaType = schema.annotations.find(\n ({name}) => name === markDef._type,\n )\n\n if (!schemaType) {\n return []\n }\n\n if (typeof markDef['_key'] !== 'string') {\n // If the `markDef` doesn't have a `_key` then we don't know what spans\n // it belongs to and therefore we have to discard it.\n return []\n }\n\n const parsedAnnotation = parseObject({\n object: markDef,\n schema,\n keyGenerator,\n schemaType,\n options,\n })\n\n if (!parsedAnnotation) {\n return []\n }\n\n markDefKeyMap.set(markDef['_key'], parsedAnnotation._key)\n\n return [parsedAnnotation]\n })\n\n return {\n markDefs: parsedMarkDefs,\n markDefKeyMap,\n }\n}\n\nfunction parseChildInternal({\n child,\n schema,\n keyGenerator,\n markDefKeyMap,\n options,\n}: {\n child: unknown\n schema: Schema\n keyGenerator: () => string\n markDefKeyMap: Map<string, string>\n options: {validateFields: boolean}\n}): PortableTextSpan | PortableTextObject | undefined {\n return (\n parseSpanInternal({\n span: child,\n schema,\n keyGenerator,\n markDefKeyMap,\n options,\n }) ??\n parseInlineObjectInternal({\n inlineObject: child,\n schema,\n keyGenerator,\n options,\n })\n )\n}\n\nfunction parseSpanInternal({\n span,\n schema,\n keyGenerator,\n markDefKeyMap,\n options,\n}: {\n span: unknown\n schema: Schema\n keyGenerator: () => string\n markDefKeyMap: Map<string, string>\n options: {validateFields: boolean}\n}): PortableTextSpan | undefined {\n if (!isRecord(span)) {\n return undefined\n }\n\n const customFields: Record<string, unknown> = {}\n\n for (const key of Object.keys(span)) {\n if (\n key !== '_type' &&\n key !== '_key' &&\n key !== 'text' &&\n key !== 'marks'\n ) {\n customFields[key] = span[key]\n }\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 (schema.decorators.some((decorator) => decorator.name === mark)) {\n return [mark]\n }\n\n return []\n })\n\n if (typeof span['_type'] === 'string' && span['_type'] !== schema.span.name) {\n return undefined\n }\n\n if (typeof span['_type'] !== 'string') {\n if (typeof span['text'] === 'string') {\n return {\n _type: schema.span.name as 'span',\n _key: typeof span['_key'] === 'string' ? span['_key'] : keyGenerator(),\n text: span['text'],\n marks,\n ...(options.validateFields ? {} : customFields),\n }\n }\n\n return undefined\n }\n\n return {\n _type: schema.span.name as 'span',\n _key: typeof span['_key'] === 'string' ? span['_key'] : keyGenerator(),\n text: typeof span['text'] === 'string' ? span['text'] : '',\n marks,\n ...(options.validateFields ? {} : customFields),\n }\n}\n\nfunction parseInlineObjectInternal({\n inlineObject,\n schema,\n keyGenerator,\n options,\n}: {\n inlineObject: unknown\n schema: Schema\n keyGenerator: () => string\n options: {validateFields: boolean}\n}): PortableTextObject | undefined {\n if (!isTypedObject(inlineObject)) {\n return undefined\n }\n\n const schemaType = schema.inlineObjects.find(\n ({name}) => name === inlineObject._type,\n )\n\n if (!schemaType) {\n return undefined\n }\n\n return parseObject({\n object: inlineObject,\n schema,\n keyGenerator,\n schemaType,\n options,\n })\n}\n\nexport function parseAnnotation({\n annotation,\n schema,\n keyGenerator,\n options,\n}: {\n annotation: TypedObject\n schema: Schema\n keyGenerator: () => string\n options: {validateFields: boolean}\n}): PortableTextObject | undefined {\n if (!isTypedObject(annotation)) {\n return undefined\n }\n\n const schemaType = schema.annotations.find(\n ({name}) => name === annotation._type,\n )\n\n if (!schemaType) {\n return undefined\n }\n\n return parseObject({\n object: annotation,\n schema,\n keyGenerator,\n schemaType,\n options,\n })\n}\n\n/**\n * Resolve an `of` member against a runtime `_type`. Returns the schema-type\n * to use for parsing the item, or `undefined` if no member matches.\n *\n * Three forms (one branch each):\n * - Inline declaration `{type: 'object', name: 'X', fields: [...]}` -- name\n * matches `_type`, fields are inline.\n * - Reference `{type: 'X'}` -- looks up in the ancestor chain first\n * (inline-declared types are visible to descendants), then in the schema's\n * root `blockObjects`. Mirrors `resolve-containers.ts`'s reference\n * resolution.\n * - `{type: 'block'}` -- not a non-PTE object member, returns `undefined`.\n */\nfunction resolveOfMember(\n of: ReadonlyArray<OfDefinition>,\n typeName: string,\n schema: Schema,\n ancestorFields: ReadonlyMap<string, ReadonlyArray<FieldDefinition>>,\n): {name: string; fields: ReadonlyArray<FieldDefinition>} | undefined {\n for (const member of of) {\n if (member.type === 'block') {\n continue\n }\n if (member.type === 'object' && 'name' in member && member.name) {\n if (member.name === typeName && 'fields' in member && member.fields) {\n return {name: member.name, fields: member.fields}\n }\n continue\n }\n if (member.type === typeName) {\n const ancestorMatch = ancestorFields.get(typeName)\n if (ancestorMatch) {\n return {name: typeName, fields: ancestorMatch}\n }\n const rootMatch = schema.blockObjects.find(\n (blockObject) => blockObject.name === typeName,\n )\n if (rootMatch && 'fields' in rootMatch && rootMatch.fields) {\n return {name: rootMatch.name, fields: rootMatch.fields}\n }\n return undefined\n }\n }\n return undefined\n}\n\n/**\n * Parse an object against a `{name, fields}` schema type. Validates top-level\n * fields and recurses into any array field whose `of` contains a block-like\n * member -- parsing the nested blocks against a child `Schema` built from\n * that `of`.\n */\nfunction parseObject({\n object,\n schema,\n keyGenerator,\n schemaType,\n ancestorFields,\n options,\n}: {\n object: TypedObject\n schema: Schema\n keyGenerator: () => string\n schemaType: {\n name: string\n fields: ReadonlyArray<FieldDefinition>\n }\n ancestorFields?: ReadonlyMap<string, ReadonlyArray<FieldDefinition>>\n options: {validateFields: boolean}\n}): PortableTextObject {\n const {_key, ...customFields} = object\n\n const fieldsByName = new Map(\n schemaType.fields.map((field) => [field.name, field]),\n )\n\n const nextAncestors = new Map(ancestorFields ?? [])\n nextAncestors.set(schemaType.name, schemaType.fields)\n\n const values: Record<string, unknown> = {}\n\n for (const [key, value] of Object.entries(customFields)) {\n if (key === '_type') {\n continue\n }\n\n if (value === undefined) {\n continue\n }\n\n const field = fieldsByName.get(key)\n\n if (options.validateFields && !field) {\n continue\n }\n\n if (field && field.type === 'array' && field.of && Array.isArray(value)) {\n values[key] = parseContainerFieldValue({\n schema,\n keyGenerator,\n of: field.of,\n value,\n ancestorFields: nextAncestors,\n options,\n })\n continue\n }\n\n values[key] = value\n }\n\n return {\n _type: schemaType.name,\n _key: typeof _key === 'string' ? _key : keyGenerator(),\n ...values,\n }\n}\n\n/**\n * Parse the value of an array field whose `of` declares what's allowed at\n * that position. Each item is dispatched per its own type:\n *\n * - Text blocks (`_type === schema.block.name`) are parsed against a child\n * sub-schema derived from the `{type: 'block'}` member of `of` (which\n * carries the styles, decorators, annotations, lists, and inline objects\n * allowed at this position).\n *\n * - Block objects (and structural objects sitting between containers and\n * text blocks) are parsed via `resolveOfMember` against the `of` array,\n * with `ancestorFields` carrying inline type declarations down to bare\n * references like `{type: 'list'}`. This lets nested containers resolve\n * to their inline shapes at any depth.\n *\n * Items that don't resolve are passed through unchanged.\n */\nfunction parseContainerFieldValue({\n schema,\n keyGenerator,\n of,\n value,\n ancestorFields,\n options,\n}: {\n schema: Schema\n keyGenerator: () => string\n of: ReadonlyArray<OfDefinition>\n value: ReadonlyArray<unknown>\n ancestorFields: ReadonlyMap<string, ReadonlyArray<FieldDefinition>>\n options: {validateFields: boolean; normalize?: boolean}\n}): Array<unknown> {\n const hasBlockMember = of.some((member) => member.type === 'block')\n const childBlockSubSchema = hasBlockMember\n ? getSubSchema(schema, of)\n : undefined\n\n return value.flatMap((item) => {\n if (!isTypedObject(item)) {\n return [item]\n }\n\n if (childBlockSubSchema && item._type === childBlockSubSchema.block.name) {\n const parsed = parseTextBlock({\n block: item,\n schema: childBlockSubSchema,\n keyGenerator,\n options: {\n normalize: false,\n removeUnusedMarkDefs: false,\n validateFields: options.validateFields,\n },\n })\n return parsed ? [parsed] : []\n }\n\n const schemaType = resolveOfMember(of, item._type, schema, ancestorFields)\n if (!schemaType) {\n return [item]\n }\n return [\n parseObject({\n object: item,\n schema,\n keyGenerator,\n schemaType: {\n name: schemaType.name,\n fields: schemaType.fields,\n },\n ancestorFields,\n options,\n }),\n ]\n })\n}\n","import {isSpan, isTextBlock, type PortableTextBlock} from '@portabletext/schema'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport {defaultKeyGenerator} from './key-generator'\nimport {parseBlock} from './parse-blocks'\nimport {getSelectionEndPoint} from './util.get-selection-end-point'\nimport {getSelectionStartPoint} from './util.get-selection-start-point'\nimport {\n getBlockKeyFromSelectionPoint,\n getChildKeyFromSelectionPoint,\n} from './util.selection-point'\n\n/**\n * @public\n */\nexport function sliceBlocks({\n context,\n blocks,\n}: {\n context: Pick<EditorContext, 'schema' | 'selection'> & {\n keyGenerator?: () => string\n }\n blocks: Array<PortableTextBlock>\n}): Array<PortableTextBlock> {\n const slice: Array<PortableTextBlock> = []\n\n if (!context.selection) {\n return slice\n }\n\n let startBlock: PortableTextBlock | undefined\n const middleBlocks: PortableTextBlock[] = []\n let endBlock: PortableTextBlock | undefined\n\n const startPoint = getSelectionStartPoint(context.selection)\n const endPoint = getSelectionEndPoint(context.selection)\n const startBlockKey = getBlockKeyFromSelectionPoint(startPoint)\n const startChildKey = getChildKeyFromSelectionPoint(startPoint)\n const endBlockKey = getBlockKeyFromSelectionPoint(endPoint)\n const endChildKey = getChildKeyFromSelectionPoint(endPoint)\n\n if (!startBlockKey || !endBlockKey) {\n return slice\n }\n\n for (const block of blocks) {\n if (!isTextBlock(context, block)) {\n if (block._key === startBlockKey && block._key === endBlockKey) {\n startBlock = block\n break\n }\n }\n\n if (block._key === startBlockKey) {\n if (!isTextBlock(context, 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 (isSpan(context, 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 (block._key === endBlockKey && startChildKey === endChildKey) {\n break\n }\n continue\n }\n\n if (startBlock && isTextBlock(context, startBlock)) {\n if (\n endChildKey &&\n child._key === endChildKey &&\n isSpan(context, 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 (!isTextBlock(context, 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 && isTextBlock(context, endBlock)) {\n if (child._key === endChildKey && isSpan(context, 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(\n parseBlock({\n keyGenerator: context.keyGenerator ?? defaultKeyGenerator,\n block,\n options: {\n normalize: false,\n removeUnusedMarkDefs: true,\n validateFields: false,\n },\n schema: context.schema,\n }) ?? block,\n )\n }\n }\n\n const parsedStartBlock = startBlock\n ? parseBlock({\n keyGenerator: context.keyGenerator ?? defaultKeyGenerator,\n block: startBlock,\n options: {\n normalize: false,\n removeUnusedMarkDefs: true,\n validateFields: false,\n },\n schema: context.schema,\n })\n : undefined\n\n const parsedEndBlock = endBlock\n ? parseBlock({\n keyGenerator: context.keyGenerator ?? defaultKeyGenerator,\n block: endBlock,\n options: {\n normalize: false,\n removeUnusedMarkDefs: true,\n validateFields: false,\n },\n schema: context.schema,\n })\n : undefined\n\n return [\n ...(parsedStartBlock ? [parsedStartBlock] : []),\n ...middleBlocks,\n ...(parsedEndBlock ? [parsedEndBlock] : []),\n ]\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"util.slice-blocks-_ElaB53f.js","names":[],"sources":["../src/utils/util.child-text-offset.ts","../src/utils/util.block-offset.ts","../src/utils/util.is-equal-path-segments.ts","../src/utils/util.is-equal-paths.ts","../src/utils/util.is-equal-selection-points.ts","../src/utils/util.selection-point.ts","../src/utils/util.get-block-end-point.ts","../src/utils/util.get-block-start-point.ts","../src/utils/util.is-selection-collapsed.ts","../src/utils/util.get-selection-end-point.ts","../src/utils/util.get-selection-start-point.ts","../src/utils/key-generator.ts","../src/utils/parse-blocks.ts","../src/utils/util.slice-blocks.ts"],"sourcesContent":["/**\n * Pure text-offset arithmetic over a node's children array, shared by\n * the snapshot-aware block-offset utils (`util.block-offset.ts`) and\n * the schema-free point transform (`engine/point/transform-point.ts`).\n * Span-ness is the caller's concern, expressed as an accessor that\n * returns the child's text when the child occupies text offsets and\n * `undefined` when it does not (inline objects, blocks).\n */\n\n/**\n * The text offset of `(childKey, offsetInChild)` within `children`:\n * the total text of the children before that child, plus the offset\n * into it. `undefined` when the child is missing or carries no text.\n */\nexport function textOffsetOfChild(\n children: ReadonlyArray<unknown>,\n getSpanText: (child: unknown) => string | undefined,\n childKey: string,\n offsetInChild: number,\n): number | undefined {\n let precedingTextLength = 0\n\n for (const child of children) {\n const text = getSpanText(child)\n if (keyOf(child) === childKey) {\n return text === undefined\n ? undefined\n : precedingTextLength + offsetInChild\n }\n if (text !== undefined) {\n precedingTextLength += text.length\n }\n }\n\n return undefined\n}\n\n/**\n * The child and child-local offset at `textOffset` within `children`.\n * Forward-boundary convention: an offset landing exactly on a span\n * boundary stays at the end of the earlier span. `undefined` when the\n * offset lies beyond the children's total text.\n */\nexport function childAtTextOffset(\n children: ReadonlyArray<unknown>,\n getSpanText: (child: unknown) => string | undefined,\n textOffset: number,\n): {key: string; offset: number} | undefined {\n let remainingOffset = textOffset\n\n for (const child of children) {\n const text = getSpanText(child)\n if (text === undefined) {\n continue\n }\n if (remainingOffset <= text.length) {\n const key = keyOf(child)\n return key === undefined ? undefined : {key, offset: remainingOffset}\n }\n remainingOffset -= text.length\n }\n\n return undefined\n}\n\nfunction keyOf(child: unknown): string | undefined {\n if (child !== null && typeof child === 'object' && '_key' in child) {\n const key = (child as {_key: unknown})._key\n return typeof key === 'string' ? key : undefined\n }\n return undefined\n}\n","import {isSpan, isTextBlock} from '@portabletext/schema'\nimport {getNode} from '../traversal/get-node'\nimport {getParent} from '../traversal/get-parent'\nimport type {TraversalSnapshot} from '../traversal/traversal-snapshot'\nimport type {BlockOffset} from '../types/block-offset'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport type {ChildPath} from '../types/paths'\nimport {childAtTextOffset, textOffsetOfChild} from './util.child-text-offset'\nimport {isKeyedSegment} from './util.is-keyed-segment'\n\n/**\n * @public\n */\nexport function blockOffsetToSpanSelectionPoint({\n snapshot,\n blockOffset,\n direction,\n}: {\n snapshot: TraversalSnapshot\n blockOffset: BlockOffset\n direction: 'forward' | 'backward'\n}) {\n const blockEntry = getNode(snapshot, blockOffset.path)\n\n if (!blockEntry || !isTextBlock(snapshot.context, blockEntry.node)) {\n return undefined\n }\n\n const block = blockEntry.node\n const blockPath = blockEntry.path\n\n if (direction === 'forward') {\n const placed = childAtTextOffset(\n block.children,\n (child) =>\n isSpan(snapshot.context, child as (typeof block.children)[number])\n ? (child as {text: string}).text\n : undefined,\n blockOffset.offset,\n )\n return placed\n ? {\n path: [\n ...blockPath,\n 'children',\n {_key: placed.key},\n ] satisfies ChildPath,\n offset: placed.offset,\n }\n : undefined\n }\n\n let offsetLeft = blockOffset.offset\n let selectionPoint: {path: ChildPath; offset: number} | undefined\n let skippedInlineObject = false\n\n for (const child of block.children) {\n if (!isSpan(snapshot.context, child)) {\n skippedInlineObject = true\n continue\n }\n\n if (offsetLeft === 0 && selectionPoint && !skippedInlineObject) {\n // A boundary offset stays at the end of the previous span unless an\n // inline object was skipped, in which case falling through to the\n // `offsetLeft <= child.text.length` branch lands the point at the\n // start of this span instead.\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: [...blockPath, '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 return selectionPoint\n}\n\n/**\n * @public\n */\nexport function spanSelectionPointToBlockOffset({\n snapshot,\n selectionPoint,\n}: {\n snapshot: TraversalSnapshot\n selectionPoint: EditorSelectionPoint\n}): BlockOffset | undefined {\n const spanSegment = selectionPoint.path.at(-1)\n\n if (!isKeyedSegment(spanSegment)) {\n return undefined\n }\n\n const textBlock = getParent(snapshot, selectionPoint.path, {\n match: (node) => isTextBlock({schema: snapshot.context.schema}, node),\n })\n\n if (!textBlock) {\n return undefined\n }\n\n const offset = textOffsetOfChild(\n textBlock.node.children,\n (child) =>\n isSpan(\n snapshot.context,\n child as (typeof textBlock.node.children)[number],\n )\n ? (child as {text: string}).text\n : undefined,\n spanSegment._key,\n selectionPoint.offset,\n )\n\n return offset === undefined ? undefined : {path: textBlock.path, offset}\n}\n","import type {PathSegment} from '../types/paths'\nimport {isKeyedSegment} from './util.is-keyed-segment'\n\nexport function isEqualPathSegments(\n segA: PathSegment | undefined,\n segB: PathSegment | undefined,\n): boolean {\n if (segA === segB) {\n return true\n }\n\n if (segA === undefined || segB === undefined) {\n return false\n }\n\n if (\n (typeof segA === 'string' || typeof segA === 'number') &&\n (typeof segB === 'string' || typeof segB === 'number')\n ) {\n return segA === segB\n }\n\n if (isKeyedSegment(segA) && isKeyedSegment(segB)) {\n return segA._key === segB._key\n }\n\n if (Array.isArray(segA) && Array.isArray(segB)) {\n return segA[0] === segB[0] && segA[1] === segB[1]\n }\n\n return false\n}\n","import type {Path} from '../types/paths'\nimport {isEqualPathSegments} from './util.is-equal-path-segments'\n\n/**\n * @public\n */\nexport function isEqualPaths(a: Path, b: Path): boolean {\n if (a.length !== b.length) {\n return false\n }\n\n for (let i = 0; i < a.length; i++) {\n if (!isEqualPathSegments(a[i], b[i])) {\n return false\n }\n }\n\n return true\n}\n","import type {EditorSelectionPoint} from '../types/editor'\nimport {isEqualPaths} from './util.is-equal-paths'\n\n/**\n * @public\n */\nexport function isEqualSelectionPoints(\n a: EditorSelectionPoint,\n b: EditorSelectionPoint,\n) {\n return a.offset === b.offset && isEqualPaths(a.path, b.path)\n}\n","import type {EditorSelectionPoint} from '../types/editor'\nimport {isKeyedSegment} from './util.is-keyed-segment'\n\nexport function getBlockKeyFromSelectionPoint(point: EditorSelectionPoint) {\n const blockPathSegment = point.path.at(0)\n\n if (isKeyedSegment(blockPathSegment)) {\n return blockPathSegment._key\n }\n\n return undefined\n}\n\nexport function getChildKeyFromSelectionPoint(point: EditorSelectionPoint) {\n const childPathSegment = point.path.at(2)\n\n if (isKeyedSegment(childPathSegment)) {\n return childPathSegment._key\n }\n\n return undefined\n}\n","import {isSpan, isTextBlock, type PortableTextBlock} from '@portabletext/schema'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport type {BlockPath} from '../types/paths'\n\n/**\n * @public\n */\nexport function getBlockEndPoint({\n context,\n block,\n}: {\n context: Pick<EditorContext, 'schema'>\n block: {\n node: PortableTextBlock\n path: BlockPath\n }\n}): EditorSelectionPoint {\n if (isTextBlock(context, block.node)) {\n const lastChild = block.node.children[block.node.children.length - 1]\n\n if (lastChild) {\n return {\n path: [...block.path, 'children', {_key: lastChild._key}],\n offset: isSpan(context, lastChild) ? lastChild.text.length : 0,\n }\n }\n }\n\n return {\n path: block.path,\n offset: 0,\n }\n}\n","import {isTextBlock, type PortableTextBlock} from '@portabletext/schema'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport type {BlockPath} from '../types/paths'\n\n/**\n * @public\n */\nexport function getBlockStartPoint({\n context,\n block,\n}: {\n context: Pick<EditorContext, 'schema'>\n block: {\n node: PortableTextBlock\n path: BlockPath\n }\n}): EditorSelectionPoint {\n if (isTextBlock(context, block.node)) {\n const firstChild = block.node.children[0]\n return {\n path: [...block.path, 'children', {_key: firstChild?._key ?? ''}],\n offset: 0,\n }\n }\n\n return {\n path: block.path,\n offset: 0,\n }\n}\n","import type {EditorSelection} from '../types/editor'\nimport {isEqualPaths} from './util.is-equal-paths'\n\n/**\n * @public\n */\nexport function isSelectionCollapsed(selection: EditorSelection) {\n if (!selection) {\n return false\n }\n\n return (\n isEqualPaths(selection.anchor.path, selection.focus.path) &&\n selection.anchor.offset === selection.focus.offset\n )\n}\n","import type {EditorSelection, EditorSelectionPoint} from '../types/editor'\n\n/**\n * @public\n */\nexport function getSelectionEndPoint<\n TEditorSelection extends NonNullable<EditorSelection> | null,\n TEditorSelectionPoint extends EditorSelectionPoint | null =\n TEditorSelection extends NonNullable<EditorSelection>\n ? EditorSelectionPoint\n : null,\n>(selection: TEditorSelection): TEditorSelectionPoint {\n if (!selection) {\n return null as TEditorSelectionPoint\n }\n\n return (\n selection.backward ? selection.anchor : selection.focus\n ) as TEditorSelectionPoint\n}\n","import type {EditorSelection, EditorSelectionPoint} from '../types/editor'\n\n/**\n * @public\n */\nexport function getSelectionStartPoint<\n TEditorSelection extends NonNullable<EditorSelection> | null,\n TEditorSelectionPoint extends EditorSelectionPoint | null =\n TEditorSelection extends NonNullable<EditorSelection>\n ? EditorSelectionPoint\n : null,\n>(selection: TEditorSelection): TEditorSelectionPoint {\n if (!selection) {\n return null as TEditorSelectionPoint\n }\n\n return (\n selection.backward ? selection.focus : selection.anchor\n ) as TEditorSelectionPoint\n}\n","/**\n * @public\n */\nexport const defaultKeyGenerator = (): string => randomKey(12)\n\nconst getByteHexTable = (() => {\n let table: any[]\n return () => {\n if (table) {\n return table\n }\n\n table = []\n for (let i = 0; i < 256; ++i) {\n table[i] = (i + 0x100).toString(16).slice(1)\n }\n return table\n }\n})()\n\n// WHATWG crypto RNG - https://w3c.github.io/webcrypto/Overview.html\nfunction whatwgRNG(length = 16) {\n const rnds8 = new Uint8Array(length)\n crypto.getRandomValues(rnds8)\n return rnds8\n}\n\nfunction randomKey(length?: number): string {\n const table = getByteHexTable()\n return whatwgRNG(length)\n .reduce((str, n) => str + table[n], '')\n .slice(0, length)\n}\n","import {\n getSubSchema,\n isSpan,\n isTextBlock,\n type FieldDefinition,\n type OfDefinition,\n type PortableTextBlock,\n type PortableTextListBlock,\n type PortableTextObject,\n type PortableTextSpan,\n type PortableTextTextBlock,\n type Schema,\n type TypedObject,\n} from '@portabletext/schema'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport {isRecord, isTypedObject} from './asserters'\n\nexport function parseBlocks({\n schema,\n keyGenerator,\n blocks,\n options,\n}: {\n schema: Schema\n keyGenerator: () => string\n blocks: unknown\n options: {\n normalize: boolean\n removeUnusedMarkDefs: boolean\n validateFields: boolean\n }\n}): Array<PortableTextBlock> {\n if (!Array.isArray(blocks)) {\n return []\n }\n\n return blocks.flatMap((block) => {\n const parsedBlock = parseBlockInternal({\n schema,\n keyGenerator,\n block,\n options,\n })\n\n return parsedBlock ? [parsedBlock] : []\n })\n}\n\nexport function parseBlock({\n schema,\n keyGenerator,\n block,\n options,\n}: {\n schema: Schema\n keyGenerator: () => string\n block: unknown\n options: {\n normalize: boolean\n removeUnusedMarkDefs: boolean\n validateFields: boolean\n }\n}): PortableTextBlock | undefined {\n return parseBlockInternal({schema, keyGenerator, block, options})\n}\n\nexport function parseSpan({\n span,\n schema,\n keyGenerator,\n markDefKeyMap,\n options,\n}: {\n span: unknown\n schema: Schema\n keyGenerator: () => string\n markDefKeyMap: Map<string, string>\n options: {validateFields: boolean}\n}): PortableTextSpan | undefined {\n return parseSpanInternal({span, schema, keyGenerator, markDefKeyMap, options})\n}\n\nexport function parseInlineObject({\n inlineObject,\n schema,\n keyGenerator,\n options,\n}: {\n inlineObject: unknown\n schema: Schema\n keyGenerator: () => string\n options: {validateFields: boolean}\n}): PortableTextObject | undefined {\n return parseInlineObjectInternal({\n inlineObject,\n schema,\n keyGenerator,\n options,\n })\n}\n\nexport function parseChild({\n child,\n schema,\n keyGenerator,\n markDefKeyMap,\n options,\n}: {\n child: unknown\n schema: Schema\n keyGenerator: () => string\n markDefKeyMap: Map<string, string>\n options: {validateFields: boolean}\n}): PortableTextSpan | PortableTextObject | undefined {\n return parseChildInternal({\n child,\n schema,\n keyGenerator,\n markDefKeyMap,\n options,\n })\n}\n\nexport function parseMarkDefs({\n schema,\n keyGenerator,\n markDefs,\n options,\n}: {\n schema: Schema\n keyGenerator: () => string\n markDefs: unknown\n options: {validateFields: boolean}\n}): {\n markDefs: Array<PortableTextObject>\n markDefKeyMap: Map<string, string>\n} {\n return parseMarkDefsInternal({schema, keyGenerator, markDefs, options})\n}\n\nfunction parseBlockInternal({\n schema,\n keyGenerator,\n block,\n options,\n}: {\n schema: Schema\n keyGenerator: () => string\n block: unknown\n options: {\n normalize: boolean\n removeUnusedMarkDefs: boolean\n validateFields: boolean\n }\n}): PortableTextBlock | undefined {\n return (\n parseTextBlock({block, schema, keyGenerator, options}) ??\n parseBlockObject({blockObject: block, schema, keyGenerator, options})\n )\n}\n\nfunction parseBlockObject({\n blockObject,\n schema,\n keyGenerator,\n options,\n}: {\n blockObject: unknown\n schema: Schema\n keyGenerator: () => string\n options: {validateFields: boolean}\n}): PortableTextObject | undefined {\n if (!isTypedObject(blockObject)) {\n return undefined\n }\n\n const schemaType = schema.blockObjects.find(\n ({name}) => name === blockObject._type,\n )\n\n if (!schemaType) {\n return undefined\n }\n\n return parseObject({\n object: blockObject,\n schema,\n keyGenerator,\n schemaType,\n options,\n })\n}\n\nexport function isListBlock(\n context: Pick<EditorContext, 'schema'>,\n block: unknown,\n): block is PortableTextListBlock {\n return (\n isTextBlock(context, block) &&\n block.level !== undefined &&\n block.listItem !== undefined\n )\n}\n\nfunction parseTextBlock({\n block,\n schema,\n keyGenerator,\n options,\n}: {\n block: unknown\n schema: Schema\n keyGenerator: () => string\n options: {\n normalize: boolean\n removeUnusedMarkDefs: boolean\n validateFields: boolean\n }\n}): PortableTextTextBlock | undefined {\n if (!isTypedObject(block)) {\n return undefined\n }\n\n if (block._type !== schema.block.name) {\n return undefined\n }\n\n const customFields: Record<string, unknown> = {}\n\n for (const key of Object.keys(block)) {\n if (\n key === '_type' ||\n key === '_key' ||\n key === 'children' ||\n key === 'markDefs' ||\n key === 'style' ||\n key === 'listItem' ||\n key === 'level'\n ) {\n continue\n }\n\n if (options.validateFields) {\n if ((schema.block.fields ?? []).some((f) => f.name === key)) {\n customFields[key] = block[key]\n }\n } else {\n customFields[key] = block[key]\n }\n }\n\n const _key =\n typeof block['_key'] === 'string' ? block['_key'] : keyGenerator()\n\n const {markDefs, markDefKeyMap} = parseMarkDefsInternal({\n schema,\n keyGenerator,\n markDefs: block['markDefs'],\n options,\n })\n\n const unparsedChildren: Array<unknown> = Array.isArray(block['children'])\n ? block['children']\n : []\n\n const parsedChildren = unparsedChildren\n .map((child) =>\n parseChildInternal({child, schema, keyGenerator, markDefKeyMap, options}),\n )\n .filter((child) => child !== undefined)\n const marks = parsedChildren.flatMap((child) => child.marks ?? [])\n\n const children =\n parsedChildren.length > 0\n ? parsedChildren\n : [\n {\n _key: keyGenerator(),\n _type: schema.span.name,\n text: '',\n marks: [],\n },\n ]\n\n const normalizedChildren = options.normalize\n ? // Ensure that inline objects re surrounded by spans\n children.reduce<Array<PortableTextObject | PortableTextSpan>>(\n (normalizedChildren, child, index) => {\n if (isSpan({schema}, child)) {\n return [...normalizedChildren, child]\n }\n\n const previousChild = normalizedChildren.at(-1)\n\n if (!previousChild || !isSpan({schema}, previousChild)) {\n return [\n ...normalizedChildren,\n {\n _key: keyGenerator(),\n _type: schema.span.name,\n text: '',\n marks: [],\n },\n child,\n ...(index === children.length - 1\n ? [\n {\n _key: keyGenerator(),\n _type: schema.span.name,\n text: '',\n marks: [],\n },\n ]\n : []),\n ]\n }\n\n return [...normalizedChildren, child]\n },\n [],\n )\n : children\n\n const parsedBlock: PortableTextTextBlock = {\n _type: schema.block.name,\n _key,\n children: normalizedChildren,\n ...customFields,\n }\n\n if (typeof block['markDefs'] === 'object' && block['markDefs'] !== null) {\n parsedBlock.markDefs = options.removeUnusedMarkDefs\n ? markDefs.filter((markDef) => marks.includes(markDef._key))\n : markDefs\n }\n\n if (\n typeof block['style'] === 'string' &&\n schema.styles.find((style) => style.name === block['style'])\n ) {\n parsedBlock.style = block['style']\n }\n\n if (\n typeof block['listItem'] === 'string' &&\n schema.lists.find((list) => list.name === block['listItem'])\n ) {\n parsedBlock.listItem = block['listItem']\n }\n\n if (typeof block['level'] === 'number') {\n parsedBlock.level = block['level']\n }\n\n return parsedBlock\n}\n\nfunction parseMarkDefsInternal({\n schema,\n keyGenerator,\n markDefs,\n options,\n}: {\n schema: Schema\n keyGenerator: () => string\n markDefs: unknown\n options: {validateFields: boolean}\n}): {\n markDefs: Array<PortableTextObject>\n markDefKeyMap: Map<string, string>\n} {\n const unparsedMarkDefs: Array<unknown> = Array.isArray(markDefs)\n ? markDefs\n : []\n const markDefKeyMap = new Map<string, string>()\n\n const parsedMarkDefs = unparsedMarkDefs.flatMap((markDef) => {\n if (!isTypedObject(markDef)) {\n return []\n }\n\n const schemaType = schema.annotations.find(\n ({name}) => name === markDef._type,\n )\n\n if (!schemaType) {\n return []\n }\n\n if (typeof markDef['_key'] !== 'string') {\n // If the `markDef` doesn't have a `_key` then we don't know what spans\n // it belongs to and therefore we have to discard it.\n return []\n }\n\n const parsedAnnotation = parseObject({\n object: markDef,\n schema,\n keyGenerator,\n schemaType,\n options,\n })\n\n if (!parsedAnnotation) {\n return []\n }\n\n markDefKeyMap.set(markDef['_key'], parsedAnnotation._key)\n\n return [parsedAnnotation]\n })\n\n return {\n markDefs: parsedMarkDefs,\n markDefKeyMap,\n }\n}\n\nfunction parseChildInternal({\n child,\n schema,\n keyGenerator,\n markDefKeyMap,\n options,\n}: {\n child: unknown\n schema: Schema\n keyGenerator: () => string\n markDefKeyMap: Map<string, string>\n options: {validateFields: boolean}\n}): PortableTextSpan | PortableTextObject | undefined {\n return (\n parseSpanInternal({\n span: child,\n schema,\n keyGenerator,\n markDefKeyMap,\n options,\n }) ??\n parseInlineObjectInternal({\n inlineObject: child,\n schema,\n keyGenerator,\n options,\n })\n )\n}\n\nfunction parseSpanInternal({\n span,\n schema,\n keyGenerator,\n markDefKeyMap,\n options,\n}: {\n span: unknown\n schema: Schema\n keyGenerator: () => string\n markDefKeyMap: Map<string, string>\n options: {validateFields: boolean}\n}): PortableTextSpan | undefined {\n if (!isRecord(span)) {\n return undefined\n }\n\n const customFields: Record<string, unknown> = {}\n\n for (const key of Object.keys(span)) {\n if (\n key !== '_type' &&\n key !== '_key' &&\n key !== 'text' &&\n key !== 'marks'\n ) {\n customFields[key] = span[key]\n }\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 (schema.decorators.some((decorator) => decorator.name === mark)) {\n return [mark]\n }\n\n return []\n })\n\n if (typeof span['_type'] === 'string' && span['_type'] !== schema.span.name) {\n return undefined\n }\n\n if (typeof span['_type'] !== 'string') {\n if (typeof span['text'] === 'string') {\n return {\n _type: schema.span.name as 'span',\n _key: typeof span['_key'] === 'string' ? span['_key'] : keyGenerator(),\n text: span['text'],\n marks,\n ...(options.validateFields ? {} : customFields),\n }\n }\n\n return undefined\n }\n\n return {\n _type: schema.span.name as 'span',\n _key: typeof span['_key'] === 'string' ? span['_key'] : keyGenerator(),\n text: typeof span['text'] === 'string' ? span['text'] : '',\n marks,\n ...(options.validateFields ? {} : customFields),\n }\n}\n\nfunction parseInlineObjectInternal({\n inlineObject,\n schema,\n keyGenerator,\n options,\n}: {\n inlineObject: unknown\n schema: Schema\n keyGenerator: () => string\n options: {validateFields: boolean}\n}): PortableTextObject | undefined {\n if (!isTypedObject(inlineObject)) {\n return undefined\n }\n\n const schemaType = schema.inlineObjects.find(\n ({name}) => name === inlineObject._type,\n )\n\n if (!schemaType) {\n return undefined\n }\n\n return parseObject({\n object: inlineObject,\n schema,\n keyGenerator,\n schemaType,\n options,\n })\n}\n\nexport function parseAnnotation({\n annotation,\n schema,\n keyGenerator,\n options,\n}: {\n annotation: TypedObject\n schema: Schema\n keyGenerator: () => string\n options: {validateFields: boolean}\n}): PortableTextObject | undefined {\n if (!isTypedObject(annotation)) {\n return undefined\n }\n\n const schemaType = schema.annotations.find(\n ({name}) => name === annotation._type,\n )\n\n if (!schemaType) {\n return undefined\n }\n\n return parseObject({\n object: annotation,\n schema,\n keyGenerator,\n schemaType,\n options,\n })\n}\n\n/**\n * Resolve an `of` member against a runtime `_type`. Returns the schema-type\n * to use for parsing the item, or `undefined` if no member matches.\n *\n * Three forms (one branch each):\n * - Inline declaration `{type: 'object', name: 'X', fields: [...]}` -- name\n * matches `_type`, fields are inline.\n * - Reference `{type: 'X'}` -- looks up in the ancestor chain first\n * (inline-declared types are visible to descendants), then in the schema's\n * root `blockObjects`. Mirrors `resolve-containers.ts`'s reference\n * resolution.\n * - `{type: 'block'}` -- not a non-PTE object member, returns `undefined`.\n */\nfunction resolveOfMember(\n of: ReadonlyArray<OfDefinition>,\n typeName: string,\n schema: Schema,\n ancestorFields: ReadonlyMap<string, ReadonlyArray<FieldDefinition>>,\n): {name: string; fields: ReadonlyArray<FieldDefinition>} | undefined {\n for (const member of of) {\n if (member.type === 'block') {\n continue\n }\n if (member.type === 'object' && 'name' in member && member.name) {\n if (member.name === typeName && 'fields' in member && member.fields) {\n return {name: member.name, fields: member.fields}\n }\n continue\n }\n if (member.type === typeName) {\n const ancestorMatch = ancestorFields.get(typeName)\n if (ancestorMatch) {\n return {name: typeName, fields: ancestorMatch}\n }\n const rootMatch = schema.blockObjects.find(\n (blockObject) => blockObject.name === typeName,\n )\n if (rootMatch && 'fields' in rootMatch && rootMatch.fields) {\n return {name: rootMatch.name, fields: rootMatch.fields}\n }\n return undefined\n }\n }\n return undefined\n}\n\n/**\n * Parse an object against a `{name, fields}` schema type. Validates top-level\n * fields and recurses into any array field whose `of` contains a block-like\n * member -- parsing the nested blocks against a child `Schema` built from\n * that `of`.\n */\nfunction parseObject({\n object,\n schema,\n keyGenerator,\n schemaType,\n ancestorFields,\n options,\n}: {\n object: TypedObject\n schema: Schema\n keyGenerator: () => string\n schemaType: {\n name: string\n fields: ReadonlyArray<FieldDefinition>\n }\n ancestorFields?: ReadonlyMap<string, ReadonlyArray<FieldDefinition>>\n options: {validateFields: boolean}\n}): PortableTextObject {\n const {_key, ...customFields} = object\n\n const fieldsByName = new Map(\n schemaType.fields.map((field) => [field.name, field]),\n )\n\n const nextAncestors = new Map(ancestorFields ?? [])\n nextAncestors.set(schemaType.name, schemaType.fields)\n\n const values: Record<string, unknown> = {}\n\n for (const [key, value] of Object.entries(customFields)) {\n if (key === '_type') {\n continue\n }\n\n if (value === undefined) {\n continue\n }\n\n const field = fieldsByName.get(key)\n\n if (options.validateFields && !field) {\n continue\n }\n\n if (field && field.type === 'array' && field.of && Array.isArray(value)) {\n values[key] = parseContainerFieldValue({\n schema,\n keyGenerator,\n of: field.of,\n value,\n ancestorFields: nextAncestors,\n options,\n })\n continue\n }\n\n values[key] = value\n }\n\n return {\n _type: schemaType.name,\n _key: typeof _key === 'string' ? _key : keyGenerator(),\n ...values,\n }\n}\n\n/**\n * Parse the value of an array field whose `of` declares what's allowed at\n * that position. Each item is dispatched per its own type:\n *\n * - Text blocks (`_type === schema.block.name`) are parsed against a child\n * sub-schema derived from the `{type: 'block'}` member of `of` (which\n * carries the styles, decorators, annotations, lists, and inline objects\n * allowed at this position).\n *\n * - Block objects (and structural objects sitting between containers and\n * text blocks) are parsed via `resolveOfMember` against the `of` array,\n * with `ancestorFields` carrying inline type declarations down to bare\n * references like `{type: 'list'}`. This lets nested containers resolve\n * to their inline shapes at any depth.\n *\n * Items that don't resolve are passed through unchanged.\n */\nfunction parseContainerFieldValue({\n schema,\n keyGenerator,\n of,\n value,\n ancestorFields,\n options,\n}: {\n schema: Schema\n keyGenerator: () => string\n of: ReadonlyArray<OfDefinition>\n value: ReadonlyArray<unknown>\n ancestorFields: ReadonlyMap<string, ReadonlyArray<FieldDefinition>>\n options: {validateFields: boolean; normalize?: boolean}\n}): Array<unknown> {\n const hasBlockMember = of.some((member) => member.type === 'block')\n const childBlockSubSchema = hasBlockMember\n ? getSubSchema(schema, of)\n : undefined\n\n return value.flatMap((item) => {\n if (!isTypedObject(item)) {\n return [item]\n }\n\n if (childBlockSubSchema && item._type === childBlockSubSchema.block.name) {\n const parsed = parseTextBlock({\n block: item,\n schema: childBlockSubSchema,\n keyGenerator,\n options: {\n normalize: false,\n removeUnusedMarkDefs: false,\n validateFields: options.validateFields,\n },\n })\n return parsed ? [parsed] : []\n }\n\n const schemaType = resolveOfMember(of, item._type, schema, ancestorFields)\n if (!schemaType) {\n return [item]\n }\n return [\n parseObject({\n object: item,\n schema,\n keyGenerator,\n schemaType: {\n name: schemaType.name,\n fields: schemaType.fields,\n },\n ancestorFields,\n options,\n }),\n ]\n })\n}\n","import {isSpan, isTextBlock, type PortableTextBlock} from '@portabletext/schema'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport {defaultKeyGenerator} from './key-generator'\nimport {parseBlock} from './parse-blocks'\nimport {getSelectionEndPoint} from './util.get-selection-end-point'\nimport {getSelectionStartPoint} from './util.get-selection-start-point'\nimport {\n getBlockKeyFromSelectionPoint,\n getChildKeyFromSelectionPoint,\n} from './util.selection-point'\n\n/**\n * @public\n */\nexport function sliceBlocks({\n context,\n blocks,\n}: {\n context: Pick<EditorContext, 'schema' | 'selection'> & {\n keyGenerator?: () => string\n }\n blocks: Array<PortableTextBlock>\n}): Array<PortableTextBlock> {\n const slice: Array<PortableTextBlock> = []\n\n if (!context.selection) {\n return slice\n }\n\n let startBlock: PortableTextBlock | undefined\n const middleBlocks: PortableTextBlock[] = []\n let endBlock: PortableTextBlock | undefined\n\n const startPoint = getSelectionStartPoint(context.selection)\n const endPoint = getSelectionEndPoint(context.selection)\n const startBlockKey = getBlockKeyFromSelectionPoint(startPoint)\n const startChildKey = getChildKeyFromSelectionPoint(startPoint)\n const endBlockKey = getBlockKeyFromSelectionPoint(endPoint)\n const endChildKey = getChildKeyFromSelectionPoint(endPoint)\n\n if (!startBlockKey || !endBlockKey) {\n return slice\n }\n\n for (const block of blocks) {\n if (!isTextBlock(context, block)) {\n if (block._key === startBlockKey && block._key === endBlockKey) {\n startBlock = block\n break\n }\n }\n\n if (block._key === startBlockKey) {\n if (!isTextBlock(context, 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 (isSpan(context, 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 (block._key === endBlockKey && startChildKey === endChildKey) {\n break\n }\n continue\n }\n\n if (startBlock && isTextBlock(context, startBlock)) {\n if (\n endChildKey &&\n child._key === endChildKey &&\n isSpan(context, 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 (!isTextBlock(context, 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 && isTextBlock(context, endBlock)) {\n if (child._key === endChildKey && isSpan(context, 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(\n parseBlock({\n keyGenerator: context.keyGenerator ?? defaultKeyGenerator,\n block,\n options: {\n normalize: false,\n removeUnusedMarkDefs: true,\n validateFields: false,\n },\n schema: context.schema,\n }) ?? block,\n )\n }\n }\n\n const parsedStartBlock = startBlock\n ? parseBlock({\n keyGenerator: context.keyGenerator ?? defaultKeyGenerator,\n block: startBlock,\n options: {\n normalize: false,\n removeUnusedMarkDefs: true,\n validateFields: false,\n },\n schema: context.schema,\n })\n : undefined\n\n const parsedEndBlock = endBlock\n ? parseBlock({\n keyGenerator: context.keyGenerator ?? defaultKeyGenerator,\n block: endBlock,\n options: {\n normalize: false,\n removeUnusedMarkDefs: true,\n validateFields: false,\n },\n schema: context.schema,\n })\n : undefined\n\n return [\n ...(parsedStartBlock ? [parsedStartBlock] : []),\n ...middleBlocks,\n ...(parsedEndBlock ? [parsedEndBlock] : []),\n ]\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { I as BlockOffset, at as EditorSelectionPoint, cn as KeyedSegment, et as EditorContext, it as EditorSelection, ln as Path, on as BlockPath, un as PathSegment, xt as TraversalSnapshot } from "../behavior.types.action-C6D8CCF9.js";
1
+ import { I as BlockOffset, at as EditorSelectionPoint, cn as KeyedSegment, et as EditorContext, it as EditorSelection, ln as Path, on as BlockPath, un as PathSegment, xt as TraversalSnapshot } from "../behavior.types.action-C0XDEQnB.js";
2
2
  import { PortableTextBlock, PortableTextTextBlock, isSpan, isTextBlock } from "@portabletext/schema";
3
3
  /**
4
4
  * @public
@@ -1,6 +1,6 @@
1
- import { r as getNode, t as getParent, u as isKeyedSegment } from "../get-parent-Ci5241qs.js";
2
- import { _ as isEqualPaths, d as getSelectionEndPoint, f as isSelectionCollapsed, g as isEqualSelectionPoints, i as parseBlock, m as getBlockEndPoint, p as getBlockStartPoint, t as sliceBlocks, u as getSelectionStartPoint, v as blockOffsetToSpanSelectionPoint, y as spanSelectionPointToBlockOffset } from "../util.slice-blocks-B2fZcNok.js";
3
- import { n as isEmptyTextBlock, r as getTextBlockText, t as isEqualSelections } from "../util.is-equal-selections-N1hxVUbE.js";
1
+ import { d as isKeyedSegment, r as getNode, t as getParent } from "../get-parent-DgaKcy8-.js";
2
+ import { _ as isEqualPaths, d as getSelectionEndPoint, f as isSelectionCollapsed, g as isEqualSelectionPoints, i as parseBlock, m as getBlockEndPoint, p as getBlockStartPoint, t as sliceBlocks, u as getSelectionStartPoint, v as blockOffsetToSpanSelectionPoint, y as spanSelectionPointToBlockOffset } from "../util.slice-blocks-_ElaB53f.js";
3
+ import { n as isEmptyTextBlock, r as getTextBlockText, t as isEqualSelections } from "../util.is-equal-selections-BdK98okY.js";
4
4
  import { isSpan, isSpan as isSpan$1, isTextBlock, isTextBlock as isTextBlock$1 } from "@portabletext/schema";
5
5
  function blockOffsetToBlockSelectionPoint({ snapshot, blockOffset }) {
6
6
  let blockEntry = getNode(snapshot, blockOffset.path);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@portabletext/editor",
3
- "version": "8.0.3",
3
+ "version": "8.1.1",
4
4
  "description": "Portable Text Editor made in React",
5
5
  "keywords": [
6
6
  "collaborative",
@@ -1 +0,0 @@
1
- {"version":3,"file":"behavior.types.action-C6D8CCF9.d.ts","names":[],"sources":["../src/internal-utils/mime-type.ts","../src/type-utils.ts","../src/converters/converter.types.ts","../src/types/paths.ts","../src/renderers/renderer.types.ts","../src/schema/container-types.ts","../src/editor/editor-schema.ts","../src/engine/interfaces/node.ts","../src/traversal/traversal-snapshot.ts","../src/editor/PortableTextEditor.tsx","../src/types/options.ts","../src/editor/Editable.tsx","../src/types/editor.ts","../src/engine/types/types.ts","../src/engine/interfaces/point.ts","../src/engine/interfaces/range.ts","../src/engine/interfaces/operation.ts","../src/engine/interfaces/range-ref.ts","../src/engine/dom/utils/diff-text.ts","../src/engine/dom/utils/dom.ts","../src/engine/dom/plugin/dom-editor.ts","../src/engine/interfaces/location.ts","../src/engine/interfaces/path-ref.ts","../src/engine/interfaces/point-ref.ts","../src/engine/interfaces/editor.ts","../src/engine/core/operation-channel.ts","../src/editor/range-decorations-machine.ts","../src/types/editor-engine.ts","../src/editor/editor-snapshot.ts","../src/behaviors/behavior.types.guard.ts","../src/behaviors/behavior.types.behavior.ts","../src/types/operation.ts","../src/editor/relay.ts","../src/editor.ts","../src/editor/editor-provider.tsx","../src/editor/editor-selector.ts","../src/editor/usePortableTextEditor.ts","../src/editor/usePortableTextEditorSelection.tsx","../src/utils/key-generator.ts","../src/editor/use-editor.ts","../src/types/block-offset.ts","../src/priority/priority.types.ts","../src/behaviors/behavior.config.ts","../src/editor/editor-machine.ts","../src/internal-utils/event-position.ts","../src/types/block-with-optional-key.ts","../src/behaviors/behavior.types.event.ts","../src/editor/editor-dom.ts","../src/behaviors/behavior.types.action.ts"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-parent-Ci5241qs.js","names":[],"sources":["../src/utils/util.is-keyed-segment.ts","../src/paths/serialize-path.ts","../src/utils/asserters.ts","../src/traversal/get-container-children.ts","../src/traversal/get-children.ts","../src/traversal/get-node.ts","../src/engine/path/parent-path.ts","../src/traversal/get-parent.ts"],"sourcesContent":["import type {KeyedSegment} from '../types/paths'\n\n/**\n * @public\n */\nexport function isKeyedSegment(segment: unknown): segment is KeyedSegment {\n return typeof segment === 'object' && segment !== null && '_key' in segment\n}\n","import type {Path} from '../types/paths'\nimport {isKeyedSegment} from '../utils/util.is-keyed-segment'\n\n/**\n * Serialize a keyed path to a string using Sanity's bracket notation.\n *\n * - `[{_key: 'k0'}]` -> `[_key==\"k0\"]`\n * - `[{_key: 'k0'}, 'children', {_key: 's0'}]` -> `[_key==\"k0\"].children[_key==\"s0\"]`\n * - `[{_key: 't0'}, 'rows', {_key: 'r0'}, 'cells', {_key: 'c0'}, 'content', {_key: 'b0'}, 'children', {_key: 's0'}]` -> `[_key==\"t0\"].rows[_key==\"r0\"].cells[_key==\"c0\"].content[_key==\"b0\"].children[_key==\"s0\"]`\n */\nexport function serializePath(path: Path): string {\n return path.reduce<string>((result, segment, index) => {\n if (isKeyedSegment(segment)) {\n return `${result}[_key==\"${segment._key}\"]`\n }\n\n const separator = index === 0 ? '' : '.'\n return `${result}${separator}${segment}`\n }, '')\n}\n","import type {TypedObject} from '@portabletext/schema'\n\nexport function isTypedObject(object: unknown): object is TypedObject {\n return isRecord(object) && typeof object['_type'] === 'string'\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && (typeof value === 'object' || typeof value === 'function')\n}\n","import type {Node} from '../engine/interfaces/node'\nimport type {\n Containers,\n RegisteredContainer,\n} from '../schema/resolve-containers'\n\n/**\n * Resolve a container node's editable child array.\n *\n * Returns `{children, container}` for a node registered as a container:\n * `children` is the node's editable child array, and `container` is the\n * node's own container registration. Read `container.field.name` for the\n * path segment that reaches `children`, and thread `container` back in as\n * `parent` when descending into them.\n *\n * Returns `undefined` for anything that is not a container: text blocks,\n * spans, leaves, and unregistered objects. It is node-based and resolves\n * in one step with no path re-walk, so recursive descent over containers\n * is linear in nesting depth. The caller seeds the document root from\n * `context.value` itself.\n *\n * @beta\n */\nexport function getContainerChildren(\n containers: Containers,\n node: Node,\n parent?: RegisteredContainer,\n):\n | {\n children: Array<Node>\n container: RegisteredContainer\n }\n | undefined {\n const resolved = resolveNodeContainer(containers, parent, node)\n\n if (!resolved) {\n return undefined\n }\n\n const fieldValue = (node as Record<string, unknown>)[resolved.field.name]\n\n if (!Array.isArray(fieldValue)) {\n return undefined\n }\n\n return {\n children: fieldValue as Array<Node>,\n container: resolved,\n }\n}\n\n/**\n * Pick the positional override from `parent.of` if present; fall back\n * to the top-level entry. Returns only `RegisteredContainer` entries\n * since leaves do not have editable children.\n */\nfunction resolveNodeContainer(\n containers: Containers,\n parent: RegisteredContainer | undefined,\n node: Node,\n): RegisteredContainer | undefined {\n if (parent?.of) {\n for (const entry of parent.of) {\n if (entry.type === node._type) {\n // Only return container entries; leaves have no editable children.\n if ('field' in entry) {\n return entry\n }\n return undefined\n }\n }\n }\n return containers.get(node._type)\n}\n","import {isTextBlock} from '@portabletext/schema'\nimport type {EditorSchema} from '../editor/editor-schema'\nimport type {Node} from '../engine/interfaces/node'\nimport type {Path} from '../engine/interfaces/path'\nimport {serializePath} from '../paths/serialize-path'\nimport type {\n Containers,\n RegisteredContainer,\n} from '../schema/resolve-containers'\nimport {isTypedObject} from '../utils/asserters'\nimport {isKeyedSegment} from '../utils/util.is-keyed-segment'\nimport {getContainerChildren} from './get-container-children'\nimport type {TraversalSnapshot} from './traversal-snapshot'\n\n/**\n * Get the children of a node at a given path.\n *\n * @public\n */\nexport function getChildren(\n snapshot: TraversalSnapshot,\n path: Path,\n): Array<{node: Node; path: Path}> {\n let currentChildren: Array<Node> = snapshot.context.value\n let currentFieldName = 'value'\n let currentPath: Path = []\n let isRoot = true\n let currentParent: RegisteredContainer | undefined\n\n for (const segment of path) {\n if (typeof segment === 'string') {\n continue\n }\n\n let node: Node | undefined\n if (isKeyedSegment(segment)) {\n // Resolve via `blockIndexMap` (O(1)) and fall back to a linear scan on a\n // miss or when the snapshot's map disagrees with the value, mirroring\n // `getNode`. The candidate path is this segment's full keyed path.\n const candidatePath: Path = isRoot\n ? [{_key: segment._key}]\n : [...currentPath, currentFieldName, {_key: segment._key}]\n const index = snapshot.blockIndexMap.get(serializePath(candidatePath))\n node =\n index !== undefined && currentChildren[index]?._key === segment._key\n ? currentChildren[index]\n : currentChildren.find((child) => child._key === segment._key)\n } else if (typeof segment === 'number') {\n node = currentChildren.at(segment)\n }\n\n if (!node) {\n return []\n }\n\n currentPath = isRoot\n ? [{_key: node._key}]\n : [...currentPath, currentFieldName, {_key: node._key}]\n isRoot = false\n\n const next = getNodeChildren(snapshot.context, node, currentParent)\n\n if (!next) {\n return []\n }\n\n currentChildren = next.children\n currentFieldName = next.fieldName\n currentParent = next.parent\n }\n\n return currentChildren.map((child) => ({\n node: child,\n path: isRoot\n ? [{_key: child._key}]\n : [...currentPath, currentFieldName, {_key: child._key}],\n }))\n}\n\n/**\n * Resolve a node's editable child array.\n *\n * When `parent` is provided and its `of` declares a positional entry\n * matching `node._type`, that positional entry's `field` is used.\n * Otherwise the top-level `containers.get(node._type)` provides the\n * fallback.\n *\n * The returned `parent` is the resolved container entry for `node`\n * itself (used by the caller to thread further descent).\n *\n * Internal descent kernel shared by the positional traversal utilities\n * (`getChildren`, `getNode`, `getNodes`, `getAncestors`); it folds the\n * text-block, container, and root-document cases. Public consumers that\n * only need to descend containers use {@link getContainerChildren}.\n */\nexport function getNodeChildren(\n context: {\n schema: EditorSchema\n containers: Containers\n },\n node: Node | {value: Array<Node>},\n parent?: RegisteredContainer,\n):\n | {\n children: Array<Node>\n fieldName: string\n parent: RegisteredContainer | undefined\n }\n | undefined {\n // Text blocks store children in .children\n if (isTextBlock(context, node)) {\n return {\n children: node.children,\n fieldName: 'children',\n parent: undefined,\n }\n }\n\n if (isTypedObject(node)) {\n const result = getContainerChildren(context.containers, node, parent)\n\n if (result) {\n return {\n children: result.children,\n fieldName: result.container.field.name,\n parent: result.container,\n }\n }\n }\n\n // Root context: has .value array but no _key or _type\n if (\n 'value' in node &&\n Array.isArray(node['value']) &&\n !('_key' in node) &&\n !('_type' in node)\n ) {\n return {\n children: node['value'] as Array<Node>,\n fieldName: 'value',\n parent: undefined,\n }\n }\n\n return undefined\n}\n","import type {Node} from '../engine/interfaces/node'\nimport type {Path} from '../engine/interfaces/path'\nimport {serializePath} from '../paths/serialize-path'\nimport type {RegisteredContainer} from '../schema/resolve-containers'\nimport {isKeyedSegment} from '../utils/util.is-keyed-segment'\nimport {getNodeChildren} from './get-children'\nimport type {TraversalSnapshot} from './traversal-snapshot'\n\n/**\n * Get the node at a given path.\n *\n * The path can be either keyed (KeyedSegment + field name strings) or\n * indexed (numbers). Keyed segments are resolved by matching `_key`,\n * field name strings name a structural descent into the previous\n * node's children, and numbers are resolved by index.\n *\n * The returned `path` always identifies the returned node: it's fully\n * keyed (numeric indices are converted to `KeyedSegment`s) and any\n * trailing segments in the input that point outside the value tree —\n * e.g. an object node's primitive field, or an annotation reached via\n * `'markDefs'` on a text block — are stripped so that\n * `getNode(snapshot, entry.path).node === entry.node`.\n *\n * The walk stops when a string segment names a field that isn't the\n * current node's structural child array. Annotations live in\n * `markDefs` on a text block, alongside `children` rather than inside\n * it, so `getNode` resolves an annotation path to the enclosing text\n * block. Use `getAnnotation` to resolve the annotation itself.\n *\n * @public\n */\nexport function getNode(\n snapshot: TraversalSnapshot,\n path: Path,\n): {node: Node; path: Path} | undefined {\n if (path.length === 0) {\n return undefined\n }\n\n const {context, blockIndexMap} = snapshot\n let currentChildren: Array<Node> = context.value\n let currentFieldName: string | undefined\n let node: Node | undefined\n let currentParent: RegisteredContainer | undefined\n const resolvedPath: Path = []\n\n for (let i = 0; i < path.length; i++) {\n const segment = path[i]\n\n if (typeof segment === 'string') {\n // A string segment names a structural descent. If it matches the\n // field name produced by the previous node's `getNodeChildren`,\n // it's part of the value-tree descent — push it and continue.\n // Otherwise the string names a sidecar field (markDefs on a text\n // block, a primitive field on an object). If the input keeps\n // digging past it with more keyed/numeric segments, the caller\n // wanted a node inside the sidecar and `getNode` can't reach it\n // (use `getAnnotation` for annotations); return undefined.\n // Otherwise the rest is just trailing field names — let the loop\n // exit and the post-loop strip remove them.\n if (currentFieldName !== undefined && segment === currentFieldName) {\n resolvedPath.push(segment)\n continue\n }\n for (let j = i + 1; j < path.length; j++) {\n const s = path[j]\n if (isKeyedSegment(s) || typeof s === 'number') {\n return undefined\n }\n }\n break\n }\n\n if (isKeyedSegment(segment)) {\n resolvedPath.push(segment)\n const index = blockIndexMap.get(serializePath(resolvedPath))\n if (\n index !== undefined &&\n currentChildren[index]?._key === segment._key\n ) {\n node = currentChildren[index]\n } else {\n // The map can miss (unkeyed transient nodes, e.g. `{_type:'table'}`\n // inserted by a remote patch before normalize mints a key) or\n // disagree with the traversed value (snapshots that pair the live\n // map with a pre-apply value, e.g. `textPatch`). Fall back to a\n // linear scan in both cases.\n node = currentChildren.find((child) => child._key === segment._key)\n if (node && node._key !== undefined) {\n resolvedPath[resolvedPath.length - 1] = {_key: node._key}\n }\n }\n } else if (typeof segment === 'number') {\n node = currentChildren.at(segment)\n if (node) {\n resolvedPath.push({_key: node._key})\n }\n } else {\n return undefined\n }\n\n if (!node) {\n return undefined\n }\n\n let hasMoreSegments = false\n for (let j = i + 1; j < path.length; j++) {\n const s = path[j]\n if (isKeyedSegment(s) || typeof s === 'number') {\n hasMoreSegments = true\n break\n }\n }\n\n if (hasMoreSegments) {\n const next = getNodeChildren(context, node, currentParent)\n\n if (!next) {\n return undefined\n }\n\n currentChildren = next.children\n currentFieldName = next.fieldName\n currentParent = next.parent\n } else {\n currentFieldName = undefined\n }\n }\n\n if (!node) {\n return undefined\n }\n\n // Strip trailing field-name segments. The walker may have pushed\n // matching field names during structural descent; if the deepest\n // reached keyed segment was the last keyed segment in the input,\n // any further field names that followed are part of the input but\n // don't identify the returned node.\n while (\n resolvedPath.length > 0 &&\n typeof resolvedPath[resolvedPath.length - 1] === 'string'\n ) {\n resolvedPath.pop()\n }\n\n return {node, path: resolvedPath}\n}\n","import {isKeyedSegment} from '../../utils/util.is-keyed-segment'\nimport type {Path} from '../interfaces/path'\n\n/**\n * Get the parent path of a path.\n *\n * Drops the last node segment (keyed or numeric) and the preceding field\n * name string.\n *\n * [{_key:'b1'}, 'children', {_key:'s1'}] → [{_key:'b1'}]\n * [{_key:'b1'}, 'children', 0] → [{_key:'b1'}]\n * [{_key:'b1'}] → []\n */\nexport function parentPath(path: Path): Path {\n if (path.length === 0) {\n throw new Error(`Cannot get the parent path of the root path [${path}].`)\n }\n\n let lastNodeIndex = -1\n for (let i = path.length - 1; i >= 0; i--) {\n if (isKeyedSegment(path[i]) || typeof path[i] === 'number') {\n lastNodeIndex = i\n break\n }\n }\n\n if (lastNodeIndex === -1) {\n return []\n }\n\n const result = path.slice(0, lastNodeIndex)\n\n if (result.length > 0 && typeof result[result.length - 1] === 'string') {\n return result.slice(0, -1)\n }\n\n return result\n}\n","import type {PortableTextBlock} from '@portabletext/schema'\nimport type {Path} from '../engine/interfaces/path'\nimport {parentPath} from '../engine/path/parent-path'\nimport {getNode} from './get-node'\nimport type {TraversalSnapshot} from './traversal-snapshot'\n\n/**\n * Get the parent of a node at a given path.\n *\n * A parent has children, so it is always a `PortableTextBlock` (text block\n * or object node).\n *\n * When `match` is provided and the parent does not satisfy it, returns\n * `undefined`.\n *\n * @public\n */\nexport function getParent<TMatch extends PortableTextBlock>(\n snapshot: TraversalSnapshot,\n path: Path,\n options: {\n match: (node: PortableTextBlock, path: Path) => node is TMatch\n },\n): {node: TMatch; path: Path} | undefined\n/**\n * @public\n */\nexport function getParent(\n snapshot: TraversalSnapshot,\n path: Path,\n options?: {\n match?: (node: PortableTextBlock, path: Path) => boolean\n },\n): {node: PortableTextBlock; path: Path} | undefined\nexport function getParent(\n snapshot: TraversalSnapshot,\n path: Path,\n options?: {\n match?: (node: PortableTextBlock, path: Path) => boolean\n },\n): {node: PortableTextBlock; path: Path} | undefined {\n if (path.length === 0) {\n return undefined\n }\n\n const parent = parentPath(path)\n\n if (parent.length === 0) {\n return undefined\n }\n\n const entry = getNode(snapshot, parent)\n\n if (!entry) {\n return undefined\n }\n\n const result = {node: entry.node as PortableTextBlock, path: entry.path}\n\n if (options?.match && !options.match(result.node, result.path)) {\n return undefined\n }\n\n return result\n}\n"],"mappings":"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"}