@tiptap/extension-node-range 2.24.2 → 3.0.0-beta.10

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.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/helpers/getNodeRangeDecorations.ts","../src/helpers/getSelectionRanges.ts","../src/helpers/NodeRangeBookmark.ts","../src/helpers/NodeRangeSelection.ts","../src/helpers/isNodeRangeSelection.ts","../src/node-range.ts"],"sourcesContent":["import { SelectionRange } from '@tiptap/pm/state'\nimport { Decoration, DecorationSet } from '@tiptap/pm/view'\n\nexport function getNodeRangeDecorations(ranges: SelectionRange[]): DecorationSet {\n if (!ranges.length) {\n return DecorationSet.empty\n }\n\n const decorations: Decoration[] = []\n const doc = ranges[0].$from.node(0)\n\n ranges.forEach(range => {\n const pos = range.$from.pos\n const node = range.$from.nodeAfter\n\n if (!node) {\n return\n }\n\n decorations.push(\n Decoration.node(pos, pos + node.nodeSize, {\n class: 'ProseMirror-selectednoderange',\n }),\n )\n })\n\n return DecorationSet.create(doc, decorations)\n}\n","import { NodeRange, ResolvedPos } from '@tiptap/pm/model'\nimport { SelectionRange } from '@tiptap/pm/state'\n\nexport function getSelectionRanges(\n $from: ResolvedPos,\n $to: ResolvedPos,\n depth?: number,\n): SelectionRange[] {\n const ranges: SelectionRange[] = []\n const doc = $from.node(0)\n\n // eslint-disable-next-line\n depth = (typeof depth === 'number' && depth >= 0)\n ? depth\n : $from.sameParent($to)\n ? Math.max(0, $from.sharedDepth($to.pos) - 1)\n : $from.sharedDepth($to.pos)\n\n const nodeRange = new NodeRange($from, $to, depth)\n const offset = nodeRange.depth === 0\n ? 0\n : doc.resolve(nodeRange.start).posAtIndex(0)\n\n nodeRange.parent.forEach((node, pos) => {\n const from = offset + pos\n const to = from + node.nodeSize\n\n if (from < nodeRange.start || from >= nodeRange.end) {\n return\n }\n\n const selectionRange = new SelectionRange(doc.resolve(from), doc.resolve(to))\n\n ranges.push(selectionRange)\n })\n\n return ranges\n}\n","import { Node as ProseMirrorNode } from '@tiptap/pm/model'\nimport { Mappable } from '@tiptap/pm/transform'\n\nimport { NodeRangeSelection } from './NodeRangeSelection.js'\n\nexport class NodeRangeBookmark {\n\n anchor!: number\n\n head!: number\n\n constructor(anchor: number, head: number) {\n this.anchor = anchor\n this.head = head\n }\n\n map(mapping: Mappable) {\n return new NodeRangeBookmark(mapping.map(this.anchor), mapping.map(this.head))\n }\n\n resolve(doc: ProseMirrorNode) {\n const $anchor = doc.resolve(this.anchor)\n const $head = doc.resolve(this.head)\n\n return new NodeRangeSelection($anchor, $head)\n }\n\n}\n","import { Node as ProseMirrorNode, ResolvedPos } from '@tiptap/pm/model'\nimport { Selection } from '@tiptap/pm/state'\nimport { Mapping } from '@tiptap/pm/transform'\n\nimport { getSelectionRanges } from './getSelectionRanges.js'\nimport { NodeRangeBookmark } from './NodeRangeBookmark.js'\n\nexport class NodeRangeSelection extends Selection {\n\n depth: number | undefined\n\n constructor($anchor: ResolvedPos, $head: ResolvedPos, depth?: number, bias = 1) {\n // if there is only a cursor we can’t calculate a direction of the selection\n // that’s why we adjust the head position by 1 in the desired direction\n const { doc } = $anchor\n const isCursor = $anchor === $head\n const isCursorAtEnd = $anchor.pos === doc.content.size && $head.pos === doc.content.size\n const $correctedHead = isCursor && !isCursorAtEnd\n ? doc.resolve($head.pos + (bias > 0 ? 1 : -1))\n : $head\n const $correctedAnchor = isCursor && isCursorAtEnd\n ? doc.resolve($anchor.pos - (bias > 0 ? 1 : -1))\n : $anchor\n\n const ranges = getSelectionRanges(\n $correctedAnchor.min($correctedHead),\n $correctedAnchor.max($correctedHead),\n depth,\n )\n\n // get the smallest range start position\n // this will become the $anchor\n const $rangeFrom = ($correctedHead.pos >= $anchor.pos)\n ? ranges[0].$from\n : ranges[ranges.length - 1].$to\n\n // get the biggest range end position\n // this will become the $head\n const $rangeTo = ($correctedHead.pos >= $anchor.pos)\n ? ranges[ranges.length - 1].$to\n : ranges[0].$from\n\n super($rangeFrom, $rangeTo, ranges)\n\n this.depth = depth\n }\n\n // we can safely ignore this TypeScript error: https://github.com/Microsoft/TypeScript/issues/338\n // @ts-ignore\n get $to() {\n return this.ranges[this.ranges.length - 1].$to\n }\n\n eq(other: Selection): boolean {\n return other instanceof NodeRangeSelection\n && other.$from.pos === this.$from.pos\n && other.$to.pos === this.$to.pos\n }\n\n map(doc: ProseMirrorNode, mapping: Mapping): NodeRangeSelection {\n const $anchor = doc.resolve(mapping.map(this.anchor))\n const $head = doc.resolve(mapping.map(this.head))\n\n return new NodeRangeSelection($anchor, $head)\n }\n\n toJSON() {\n return {\n type: 'nodeRange',\n anchor: this.anchor,\n head: this.head,\n }\n }\n\n get isForwards(): boolean {\n return this.head >= this.anchor\n }\n\n get isBackwards(): boolean {\n return !this.isForwards\n }\n\n extendBackwards(): NodeRangeSelection {\n const { doc } = this.$from\n\n if (this.isForwards && this.ranges.length > 1) {\n const ranges = this.ranges.slice(0, -1)\n const $from = ranges[0].$from\n const $to = ranges[ranges.length - 1].$to\n\n return new NodeRangeSelection($from, $to, this.depth)\n }\n\n const firstRange = this.ranges[0]\n const $from = doc.resolve(Math.max(0, firstRange.$from.pos - 1))\n\n return new NodeRangeSelection(this.$anchor, $from, this.depth)\n }\n\n extendForwards(): NodeRangeSelection {\n const { doc } = this.$from\n\n if (this.isBackwards && this.ranges.length > 1) {\n const ranges = this.ranges.slice(1)\n const $from = ranges[0].$from\n const $to = ranges[ranges.length - 1].$to\n\n return new NodeRangeSelection($to, $from, this.depth)\n }\n\n const lastRange = this.ranges[this.ranges.length - 1]\n const $to = doc.resolve(Math.min(doc.content.size, lastRange.$to.pos + 1))\n\n return new NodeRangeSelection(this.$anchor, $to, this.depth)\n }\n\n static fromJSON(doc: ProseMirrorNode, json: any): NodeRangeSelection {\n return new NodeRangeSelection(doc.resolve(json.anchor), doc.resolve(json.head))\n }\n\n static create(doc: ProseMirrorNode, anchor: number, head: number, depth?: number, bias = 1): NodeRangeSelection {\n return new this(doc.resolve(anchor), doc.resolve(head), depth, bias)\n }\n\n getBookmark(): NodeRangeBookmark {\n return new NodeRangeBookmark(this.anchor, this.head)\n }\n\n}\n\nNodeRangeSelection.prototype.visible = false\n","import { NodeRangeSelection } from './NodeRangeSelection.js'\n\nexport function isNodeRangeSelection(value: unknown): value is NodeRangeSelection {\n return value instanceof NodeRangeSelection\n}\n","import { Extension } from '@tiptap/core'\nimport { Plugin, PluginKey, SelectionRange } from '@tiptap/pm/state'\n\nimport { getNodeRangeDecorations } from './helpers/getNodeRangeDecorations.js'\nimport { getSelectionRanges } from './helpers/getSelectionRanges.js'\nimport { isNodeRangeSelection } from './helpers/isNodeRangeSelection.js'\nimport { NodeRangeSelection } from './helpers/NodeRangeSelection.js'\n\nexport interface NodeRangeOptions {\n depth: number | undefined,\n key: 'Shift' | 'Control' | 'Alt' | 'Meta' | 'Mod' | null | undefined,\n}\n\nexport const NodeRange = Extension.create<NodeRangeOptions>({\n name: 'nodeRange',\n\n addOptions() {\n return {\n depth: undefined,\n key: 'Mod',\n }\n },\n\n addKeyboardShortcuts() {\n return {\n // extend NodeRangeSelection upwards\n 'Shift-ArrowUp': ({ editor }) => {\n const { depth } = this.options\n const { view, state } = editor\n const { doc, selection, tr } = state\n const { anchor, head } = selection\n\n if (!isNodeRangeSelection(selection)) {\n const nodeRangeSelection = NodeRangeSelection.create(doc, anchor, head, depth, -1)\n\n tr.setSelection(nodeRangeSelection)\n view.dispatch(tr)\n\n return true\n }\n\n const nodeRangeSelection = selection.extendBackwards()\n\n tr.setSelection(nodeRangeSelection)\n view.dispatch(tr)\n\n return true\n },\n\n // extend NodeRangeSelection downwards\n 'Shift-ArrowDown': ({ editor }) => {\n const { depth } = this.options\n const { view, state } = editor\n const { doc, selection, tr } = state\n const { anchor, head } = selection\n\n if (!isNodeRangeSelection(selection)) {\n const nodeRangeSelection = NodeRangeSelection.create(doc, anchor, head, depth)\n\n tr.setSelection(nodeRangeSelection)\n view.dispatch(tr)\n\n return true\n }\n\n const nodeRangeSelection = selection.extendForwards()\n\n tr.setSelection(nodeRangeSelection)\n view.dispatch(tr)\n\n return true\n },\n\n // add `NodeRangeSelection` to all nodes\n 'Mod-a': ({ editor }) => {\n const { depth } = this.options\n const { view, state } = editor\n const { doc, tr } = state\n const nodeRangeSelection = NodeRangeSelection.create(doc, 0, doc.content.size, depth)\n\n tr.setSelection(nodeRangeSelection)\n view.dispatch(tr)\n\n return true\n },\n }\n },\n\n onSelectionUpdate() {\n const { selection } = this.editor.state\n\n if (isNodeRangeSelection(selection)) {\n this.editor.view.dom.classList.add('ProseMirror-noderangeselection')\n }\n },\n\n addProseMirrorPlugins() {\n let hideTextSelection = false\n let activeMouseSelection = false\n\n return [\n new Plugin({\n key: new PluginKey('nodeRange'),\n\n props: {\n attributes: () => {\n if (hideTextSelection) {\n return {\n class: 'ProseMirror-noderangeselection',\n }\n }\n\n return { class: '' }\n },\n\n handleDOMEvents: {\n mousedown: (view, event) => {\n const { key } = this.options\n const isMac = /Mac/.test(navigator.platform)\n const isShift = !!event.shiftKey\n const isControl = !!event.ctrlKey\n const isAlt = !!event.altKey\n const isMeta = !!event.metaKey\n const isMod = isMac\n ? isMeta\n : isControl\n\n if (\n key === null\n || key === undefined\n || (key === 'Shift' && isShift)\n || (key === 'Control' && isControl)\n || (key === 'Alt' && isAlt)\n || (key === 'Meta' && isMeta)\n || (key === 'Mod' && isMod)\n ) {\n activeMouseSelection = true\n }\n\n if (!activeMouseSelection) {\n return false\n }\n\n document.addEventListener('mouseup', () => {\n activeMouseSelection = false\n\n const { state } = view\n const { doc, selection, tr } = state\n const { $anchor, $head } = selection\n\n if ($anchor.sameParent($head)) {\n return\n }\n\n const nodeRangeSelection = NodeRangeSelection.create(doc, $anchor.pos, $head.pos, this.options.depth)\n\n tr.setSelection(nodeRangeSelection)\n view.dispatch(tr)\n }, { once: true })\n\n return false\n },\n },\n\n // when selecting some text we want to render some decorations\n // to preview a `NodeRangeSelection`\n decorations: state => {\n const { selection } = state\n const isNodeRange = isNodeRangeSelection(selection)\n\n hideTextSelection = false\n\n if (!activeMouseSelection) {\n if (!isNodeRange) {\n return null\n }\n\n hideTextSelection = true\n\n return getNodeRangeDecorations(selection.ranges as SelectionRange[])\n }\n\n const { $from, $to } = selection\n\n // selection is probably in the same node like a paragraph\n // so we don’t render decorations and show\n // a simple text selection instead\n if (!isNodeRange && $from.sameParent($to)) {\n return null\n }\n\n // try to calculate some node ranges\n const nodeRanges = getSelectionRanges($from, $to, this.options.depth)\n\n if (!nodeRanges.length) {\n return null\n }\n\n hideTextSelection = true\n\n return getNodeRangeDecorations(nodeRanges)\n },\n },\n }),\n ]\n },\n})\n"],"names":["NodeRange"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/node-range.ts","../src/helpers/getNodeRangeDecorations.ts","../src/helpers/getSelectionRanges.ts","../src/helpers/NodeRangeSelection.ts","../src/helpers/NodeRangeBookmark.ts","../src/helpers/isNodeRangeSelection.ts","../src/index.ts"],"sourcesContent":["import { Extension } from '@tiptap/core'\nimport type { SelectionRange } from '@tiptap/pm/state'\nimport { Plugin, PluginKey } from '@tiptap/pm/state'\n\nimport { getNodeRangeDecorations } from './helpers/getNodeRangeDecorations.js'\nimport { getSelectionRanges } from './helpers/getSelectionRanges.js'\nimport { isNodeRangeSelection } from './helpers/isNodeRangeSelection.js'\nimport { NodeRangeSelection } from './helpers/NodeRangeSelection.js'\n\nexport interface NodeRangeOptions {\n depth: number | undefined\n key: 'Shift' | 'Control' | 'Alt' | 'Meta' | 'Mod' | null | undefined\n}\n\nexport const NodeRange = Extension.create<NodeRangeOptions>({\n name: 'nodeRange',\n\n addOptions() {\n return {\n depth: undefined,\n key: 'Mod',\n }\n },\n\n addKeyboardShortcuts() {\n return {\n // extend NodeRangeSelection upwards\n 'Shift-ArrowUp': ({ editor }) => {\n const { depth } = this.options\n const { view, state } = editor\n const { doc, selection, tr } = state\n const { anchor, head } = selection\n\n if (!isNodeRangeSelection(selection)) {\n const nodeRangeSelection = NodeRangeSelection.create(doc, anchor, head, depth, -1)\n\n tr.setSelection(nodeRangeSelection)\n view.dispatch(tr)\n\n return true\n }\n\n const nodeRangeSelection = selection.extendBackwards()\n\n tr.setSelection(nodeRangeSelection)\n view.dispatch(tr)\n\n return true\n },\n\n // extend NodeRangeSelection downwards\n 'Shift-ArrowDown': ({ editor }) => {\n const { depth } = this.options\n const { view, state } = editor\n const { doc, selection, tr } = state\n const { anchor, head } = selection\n\n if (!isNodeRangeSelection(selection)) {\n const nodeRangeSelection = NodeRangeSelection.create(doc, anchor, head, depth)\n\n tr.setSelection(nodeRangeSelection)\n view.dispatch(tr)\n\n return true\n }\n\n const nodeRangeSelection = selection.extendForwards()\n\n tr.setSelection(nodeRangeSelection)\n view.dispatch(tr)\n\n return true\n },\n\n // add `NodeRangeSelection` to all nodes\n 'Mod-a': ({ editor }) => {\n const { depth } = this.options\n const { view, state } = editor\n const { doc, tr } = state\n const nodeRangeSelection = NodeRangeSelection.create(doc, 0, doc.content.size, depth)\n\n tr.setSelection(nodeRangeSelection)\n view.dispatch(tr)\n\n return true\n },\n }\n },\n\n onSelectionUpdate() {\n const { selection } = this.editor.state\n\n if (isNodeRangeSelection(selection)) {\n this.editor.view.dom.classList.add('ProseMirror-noderangeselection')\n }\n },\n\n addProseMirrorPlugins() {\n let hideTextSelection = false\n let activeMouseSelection = false\n\n return [\n new Plugin({\n key: new PluginKey('nodeRange'),\n\n props: {\n attributes: () => {\n if (hideTextSelection) {\n return {\n class: 'ProseMirror-noderangeselection',\n }\n }\n\n return { class: '' }\n },\n\n handleDOMEvents: {\n mousedown: (view, event) => {\n const { key } = this.options\n const isMac = /Mac/.test(navigator.platform)\n const isShift = !!event.shiftKey\n const isControl = !!event.ctrlKey\n const isAlt = !!event.altKey\n const isMeta = !!event.metaKey\n const isMod = isMac ? isMeta : isControl\n\n if (\n key === null ||\n key === undefined ||\n (key === 'Shift' && isShift) ||\n (key === 'Control' && isControl) ||\n (key === 'Alt' && isAlt) ||\n (key === 'Meta' && isMeta) ||\n (key === 'Mod' && isMod)\n ) {\n activeMouseSelection = true\n }\n\n if (!activeMouseSelection) {\n return false\n }\n\n document.addEventListener(\n 'mouseup',\n () => {\n activeMouseSelection = false\n\n const { state } = view\n const { doc, selection, tr } = state\n const { $anchor, $head } = selection\n\n if ($anchor.sameParent($head)) {\n return\n }\n\n const nodeRangeSelection = NodeRangeSelection.create(doc, $anchor.pos, $head.pos, this.options.depth)\n\n tr.setSelection(nodeRangeSelection)\n view.dispatch(tr)\n },\n { once: true },\n )\n\n return false\n },\n },\n\n // when selecting some text we want to render some decorations\n // to preview a `NodeRangeSelection`\n decorations: state => {\n const { selection } = state\n const isNodeRange = isNodeRangeSelection(selection)\n\n hideTextSelection = false\n\n if (!activeMouseSelection) {\n if (!isNodeRange) {\n return null\n }\n\n hideTextSelection = true\n\n return getNodeRangeDecorations(selection.ranges as SelectionRange[])\n }\n\n const { $from, $to } = selection\n\n // selection is probably in the same node like a paragraph\n // so we don’t render decorations and show\n // a simple text selection instead\n if (!isNodeRange && $from.sameParent($to)) {\n return null\n }\n\n // try to calculate some node ranges\n const nodeRanges = getSelectionRanges($from, $to, this.options.depth)\n\n if (!nodeRanges.length) {\n return null\n }\n\n hideTextSelection = true\n\n return getNodeRangeDecorations(nodeRanges)\n },\n },\n }),\n ]\n },\n})\n","import type { SelectionRange } from '@tiptap/pm/state'\nimport { Decoration, DecorationSet } from '@tiptap/pm/view'\n\nexport function getNodeRangeDecorations(ranges: SelectionRange[]): DecorationSet {\n if (!ranges.length) {\n return DecorationSet.empty\n }\n\n const decorations: Decoration[] = []\n const doc = ranges[0].$from.node(0)\n\n ranges.forEach(range => {\n const pos = range.$from.pos\n const node = range.$from.nodeAfter\n\n if (!node) {\n return\n }\n\n decorations.push(\n Decoration.node(pos, pos + node.nodeSize, {\n class: 'ProseMirror-selectednoderange',\n }),\n )\n })\n\n return DecorationSet.create(doc, decorations)\n}\n","import { type ResolvedPos, NodeRange } from '@tiptap/pm/model'\nimport { SelectionRange } from '@tiptap/pm/state'\n\nexport function getSelectionRanges($from: ResolvedPos, $to: ResolvedPos, depth?: number): SelectionRange[] {\n const ranges: SelectionRange[] = []\n const doc = $from.node(0)\n\n // Determine the appropriate depth\n if (typeof depth === 'number' && depth >= 0) {\n // Use the provided depth\n } else if ($from.sameParent($to)) {\n depth = Math.max(0, $from.sharedDepth($to.pos) - 1)\n } else {\n depth = $from.sharedDepth($to.pos)\n }\n\n const nodeRange = new NodeRange($from, $to, depth)\n const offset = nodeRange.depth === 0 ? 0 : doc.resolve(nodeRange.start).posAtIndex(0)\n\n nodeRange.parent.forEach((node, pos) => {\n const from = offset + pos\n const to = from + node.nodeSize\n\n if (from < nodeRange.start || from >= nodeRange.end) {\n return\n }\n\n const selectionRange = new SelectionRange(doc.resolve(from), doc.resolve(to))\n\n ranges.push(selectionRange)\n })\n\n return ranges\n}\n","import type { Node as ProseMirrorNode, ResolvedPos } from '@tiptap/pm/model'\nimport { Selection } from '@tiptap/pm/state'\nimport type { Mapping } from '@tiptap/pm/transform'\n\nimport { getSelectionRanges } from './getSelectionRanges.js'\nimport { NodeRangeBookmark } from './NodeRangeBookmark.js'\n\nexport class NodeRangeSelection extends Selection {\n depth: number | undefined\n\n constructor($anchor: ResolvedPos, $head: ResolvedPos, depth?: number, bias = 1) {\n // if there is only a cursor we can’t calculate a direction of the selection\n // that’s why we adjust the head position by 1 in the desired direction\n const { doc } = $anchor\n const isCursor = $anchor === $head\n const isCursorAtEnd = $anchor.pos === doc.content.size && $head.pos === doc.content.size\n const $correctedHead = isCursor && !isCursorAtEnd ? doc.resolve($head.pos + (bias > 0 ? 1 : -1)) : $head\n const $correctedAnchor = isCursor && isCursorAtEnd ? doc.resolve($anchor.pos - (bias > 0 ? 1 : -1)) : $anchor\n\n const ranges = getSelectionRanges($correctedAnchor.min($correctedHead), $correctedAnchor.max($correctedHead), depth)\n\n // get the smallest range start position\n // this will become the $anchor\n const $rangeFrom = $correctedHead.pos >= $anchor.pos ? ranges[0].$from : ranges[ranges.length - 1].$to\n\n // get the biggest range end position\n // this will become the $head\n const $rangeTo = $correctedHead.pos >= $anchor.pos ? ranges[ranges.length - 1].$to : ranges[0].$from\n\n super($rangeFrom, $rangeTo, ranges)\n\n this.depth = depth\n }\n\n // we can safely ignore this TypeScript error: https://github.com/Microsoft/TypeScript/issues/338\n // @ts-ignore\n get $to() {\n return this.ranges[this.ranges.length - 1].$to\n }\n\n eq(other: Selection): boolean {\n return other instanceof NodeRangeSelection && other.$from.pos === this.$from.pos && other.$to.pos === this.$to.pos\n }\n\n map(doc: ProseMirrorNode, mapping: Mapping): NodeRangeSelection {\n const $anchor = doc.resolve(mapping.map(this.anchor))\n const $head = doc.resolve(mapping.map(this.head))\n\n return new NodeRangeSelection($anchor, $head)\n }\n\n toJSON() {\n return {\n type: 'nodeRange',\n anchor: this.anchor,\n head: this.head,\n }\n }\n\n get isForwards(): boolean {\n return this.head >= this.anchor\n }\n\n get isBackwards(): boolean {\n return !this.isForwards\n }\n\n extendBackwards(): NodeRangeSelection {\n const { doc } = this.$from\n\n if (this.isForwards && this.ranges.length > 1) {\n const ranges = this.ranges.slice(0, -1)\n const $from = ranges[0].$from\n const $to = ranges[ranges.length - 1].$to\n\n return new NodeRangeSelection($from, $to, this.depth)\n }\n\n const firstRange = this.ranges[0]\n const $from = doc.resolve(Math.max(0, firstRange.$from.pos - 1))\n\n return new NodeRangeSelection(this.$anchor, $from, this.depth)\n }\n\n extendForwards(): NodeRangeSelection {\n const { doc } = this.$from\n\n if (this.isBackwards && this.ranges.length > 1) {\n const ranges = this.ranges.slice(1)\n const $from = ranges[0].$from\n const $to = ranges[ranges.length - 1].$to\n\n return new NodeRangeSelection($to, $from, this.depth)\n }\n\n const lastRange = this.ranges[this.ranges.length - 1]\n const $to = doc.resolve(Math.min(doc.content.size, lastRange.$to.pos + 1))\n\n return new NodeRangeSelection(this.$anchor, $to, this.depth)\n }\n\n static fromJSON(doc: ProseMirrorNode, json: any): NodeRangeSelection {\n return new NodeRangeSelection(doc.resolve(json.anchor), doc.resolve(json.head))\n }\n\n static create(doc: ProseMirrorNode, anchor: number, head: number, depth?: number, bias = 1): NodeRangeSelection {\n return new this(doc.resolve(anchor), doc.resolve(head), depth, bias)\n }\n\n getBookmark(): NodeRangeBookmark {\n return new NodeRangeBookmark(this.anchor, this.head)\n }\n}\n\nNodeRangeSelection.prototype.visible = false\n","import type { Node as ProseMirrorNode } from '@tiptap/pm/model'\nimport type { Mappable } from '@tiptap/pm/transform'\n\nimport { NodeRangeSelection } from './NodeRangeSelection.js'\n\nexport class NodeRangeBookmark {\n anchor!: number\n\n head!: number\n\n constructor(anchor: number, head: number) {\n this.anchor = anchor\n this.head = head\n }\n\n map(mapping: Mappable) {\n return new NodeRangeBookmark(mapping.map(this.anchor), mapping.map(this.head))\n }\n\n resolve(doc: ProseMirrorNode) {\n const $anchor = doc.resolve(this.anchor)\n const $head = doc.resolve(this.head)\n\n return new NodeRangeSelection($anchor, $head)\n }\n}\n","import { NodeRangeSelection } from './NodeRangeSelection.js'\n\nexport function isNodeRangeSelection(value: unknown): value is NodeRangeSelection {\n return value instanceof NodeRangeSelection\n}\n","import { NodeRange } from './node-range.js'\n\nexport * from './helpers/getNodeRangeDecorations.js'\nexport * from './helpers/getSelectionRanges.js'\nexport * from './helpers/isNodeRangeSelection.js'\nexport * from './helpers/NodeRangeSelection.js'\nexport * from './node-range.js'\n\nexport default NodeRange\n"],"mappings":"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","names":["$from","$to","NodeRange","nodeRangeSelection","NodeRange"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tiptap/extension-node-range",
3
3
  "description": "node range extension for tiptap",
4
- "version": "2.24.2",
4
+ "version": "3.0.0-beta.10",
5
5
  "homepage": "https://tiptap.dev",
6
6
  "keywords": [
7
7
  "tiptap",
@@ -20,29 +20,31 @@
20
20
  "type": "module",
21
21
  "exports": {
22
22
  ".": {
23
- "types": "./dist/index.d.ts",
23
+ "types": {
24
+ "import": "./dist/index.d.ts",
25
+ "require": "./dist/index.d.cts"
26
+ },
24
27
  "import": "./dist/index.js",
25
28
  "require": "./dist/index.cjs"
26
29
  }
27
30
  },
28
31
  "main": "dist/index.cjs",
29
32
  "module": "dist/index.js",
30
- "umd": "dist/index.umd.js",
31
33
  "types": "dist/index.d.ts",
32
34
  "files": [
33
35
  "src",
34
36
  "dist"
35
37
  ],
36
38
  "peerDependencies": {
37
- "@tiptap/core": "^2.7.0",
38
- "@tiptap/pm": "^2.7.0"
39
+ "@tiptap/core": "3.0.0-beta.10",
40
+ "@tiptap/pm": "3.0.0-beta.10"
39
41
  },
40
42
  "devDependencies": {
41
- "@tiptap/core": "^2.24.2",
42
- "@tiptap/pm": "^2.24.2"
43
+ "@tiptap/core": "3.0.0-beta.10",
44
+ "@tiptap/pm": "3.0.0-beta.10"
43
45
  },
44
46
  "scripts": {
45
- "clean": "rm -rf dist",
46
- "build": "npm run clean && rollup -c"
47
+ "build": "tsup",
48
+ "lint": "prettier ./src/ --check && eslint --cache --quiet --no-error-on-unmatched-pattern ./src/"
47
49
  }
48
- }
50
+ }
@@ -1,10 +1,9 @@
1
- import { Node as ProseMirrorNode } from '@tiptap/pm/model'
2
- import { Mappable } from '@tiptap/pm/transform'
1
+ import type { Node as ProseMirrorNode } from '@tiptap/pm/model'
2
+ import type { Mappable } from '@tiptap/pm/transform'
3
3
 
4
4
  import { NodeRangeSelection } from './NodeRangeSelection.js'
5
5
 
6
6
  export class NodeRangeBookmark {
7
-
8
7
  anchor!: number
9
8
 
10
9
  head!: number
@@ -24,5 +23,4 @@ export class NodeRangeBookmark {
24
23
 
25
24
  return new NodeRangeSelection($anchor, $head)
26
25
  }
27
-
28
26
  }
@@ -1,12 +1,11 @@
1
- import { Node as ProseMirrorNode, ResolvedPos } from '@tiptap/pm/model'
1
+ import type { Node as ProseMirrorNode, ResolvedPos } from '@tiptap/pm/model'
2
2
  import { Selection } from '@tiptap/pm/state'
3
- import { Mapping } from '@tiptap/pm/transform'
3
+ import type { Mapping } from '@tiptap/pm/transform'
4
4
 
5
5
  import { getSelectionRanges } from './getSelectionRanges.js'
6
6
  import { NodeRangeBookmark } from './NodeRangeBookmark.js'
7
7
 
8
8
  export class NodeRangeSelection extends Selection {
9
-
10
9
  depth: number | undefined
11
10
 
12
11
  constructor($anchor: ResolvedPos, $head: ResolvedPos, depth?: number, bias = 1) {
@@ -15,30 +14,18 @@ export class NodeRangeSelection extends Selection {
15
14
  const { doc } = $anchor
16
15
  const isCursor = $anchor === $head
17
16
  const isCursorAtEnd = $anchor.pos === doc.content.size && $head.pos === doc.content.size
18
- const $correctedHead = isCursor && !isCursorAtEnd
19
- ? doc.resolve($head.pos + (bias > 0 ? 1 : -1))
20
- : $head
21
- const $correctedAnchor = isCursor && isCursorAtEnd
22
- ? doc.resolve($anchor.pos - (bias > 0 ? 1 : -1))
23
- : $anchor
24
-
25
- const ranges = getSelectionRanges(
26
- $correctedAnchor.min($correctedHead),
27
- $correctedAnchor.max($correctedHead),
28
- depth,
29
- )
17
+ const $correctedHead = isCursor && !isCursorAtEnd ? doc.resolve($head.pos + (bias > 0 ? 1 : -1)) : $head
18
+ const $correctedAnchor = isCursor && isCursorAtEnd ? doc.resolve($anchor.pos - (bias > 0 ? 1 : -1)) : $anchor
19
+
20
+ const ranges = getSelectionRanges($correctedAnchor.min($correctedHead), $correctedAnchor.max($correctedHead), depth)
30
21
 
31
22
  // get the smallest range start position
32
23
  // this will become the $anchor
33
- const $rangeFrom = ($correctedHead.pos >= $anchor.pos)
34
- ? ranges[0].$from
35
- : ranges[ranges.length - 1].$to
24
+ const $rangeFrom = $correctedHead.pos >= $anchor.pos ? ranges[0].$from : ranges[ranges.length - 1].$to
36
25
 
37
26
  // get the biggest range end position
38
27
  // this will become the $head
39
- const $rangeTo = ($correctedHead.pos >= $anchor.pos)
40
- ? ranges[ranges.length - 1].$to
41
- : ranges[0].$from
28
+ const $rangeTo = $correctedHead.pos >= $anchor.pos ? ranges[ranges.length - 1].$to : ranges[0].$from
42
29
 
43
30
  super($rangeFrom, $rangeTo, ranges)
44
31
 
@@ -52,9 +39,7 @@ export class NodeRangeSelection extends Selection {
52
39
  }
53
40
 
54
41
  eq(other: Selection): boolean {
55
- return other instanceof NodeRangeSelection
56
- && other.$from.pos === this.$from.pos
57
- && other.$to.pos === this.$to.pos
42
+ return other instanceof NodeRangeSelection && other.$from.pos === this.$from.pos && other.$to.pos === this.$to.pos
58
43
  }
59
44
 
60
45
  map(doc: ProseMirrorNode, mapping: Mapping): NodeRangeSelection {
@@ -125,7 +110,6 @@ export class NodeRangeSelection extends Selection {
125
110
  getBookmark(): NodeRangeBookmark {
126
111
  return new NodeRangeBookmark(this.anchor, this.head)
127
112
  }
128
-
129
113
  }
130
114
 
131
115
  NodeRangeSelection.prototype.visible = false
@@ -1,4 +1,4 @@
1
- import { SelectionRange } from '@tiptap/pm/state'
1
+ import type { SelectionRange } from '@tiptap/pm/state'
2
2
  import { Decoration, DecorationSet } from '@tiptap/pm/view'
3
3
 
4
4
  export function getNodeRangeDecorations(ranges: SelectionRange[]): DecorationSet {
@@ -1,25 +1,21 @@
1
- import { NodeRange, ResolvedPos } from '@tiptap/pm/model'
1
+ import { type ResolvedPos, NodeRange } from '@tiptap/pm/model'
2
2
  import { SelectionRange } from '@tiptap/pm/state'
3
3
 
4
- export function getSelectionRanges(
5
- $from: ResolvedPos,
6
- $to: ResolvedPos,
7
- depth?: number,
8
- ): SelectionRange[] {
4
+ export function getSelectionRanges($from: ResolvedPos, $to: ResolvedPos, depth?: number): SelectionRange[] {
9
5
  const ranges: SelectionRange[] = []
10
6
  const doc = $from.node(0)
11
7
 
12
- // eslint-disable-next-line
13
- depth = (typeof depth === 'number' && depth >= 0)
14
- ? depth
15
- : $from.sameParent($to)
16
- ? Math.max(0, $from.sharedDepth($to.pos) - 1)
17
- : $from.sharedDepth($to.pos)
8
+ // Determine the appropriate depth
9
+ if (typeof depth === 'number' && depth >= 0) {
10
+ // Use the provided depth
11
+ } else if ($from.sameParent($to)) {
12
+ depth = Math.max(0, $from.sharedDepth($to.pos) - 1)
13
+ } else {
14
+ depth = $from.sharedDepth($to.pos)
15
+ }
18
16
 
19
17
  const nodeRange = new NodeRange($from, $to, depth)
20
- const offset = nodeRange.depth === 0
21
- ? 0
22
- : doc.resolve(nodeRange.start).posAtIndex(0)
18
+ const offset = nodeRange.depth === 0 ? 0 : doc.resolve(nodeRange.start).posAtIndex(0)
23
19
 
24
20
  nodeRange.parent.forEach((node, pos) => {
25
21
  const from = offset + pos
package/src/node-range.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import { Extension } from '@tiptap/core'
2
- import { Plugin, PluginKey, SelectionRange } from '@tiptap/pm/state'
2
+ import type { SelectionRange } from '@tiptap/pm/state'
3
+ import { Plugin, PluginKey } from '@tiptap/pm/state'
3
4
 
4
5
  import { getNodeRangeDecorations } from './helpers/getNodeRangeDecorations.js'
5
6
  import { getSelectionRanges } from './helpers/getSelectionRanges.js'
@@ -7,8 +8,8 @@ import { isNodeRangeSelection } from './helpers/isNodeRangeSelection.js'
7
8
  import { NodeRangeSelection } from './helpers/NodeRangeSelection.js'
8
9
 
9
10
  export interface NodeRangeOptions {
10
- depth: number | undefined,
11
- key: 'Shift' | 'Control' | 'Alt' | 'Meta' | 'Mod' | null | undefined,
11
+ depth: number | undefined
12
+ key: 'Shift' | 'Control' | 'Alt' | 'Meta' | 'Mod' | null | undefined
12
13
  }
13
14
 
14
15
  export const NodeRange = Extension.create<NodeRangeOptions>({
@@ -121,18 +122,16 @@ export const NodeRange = Extension.create<NodeRangeOptions>({
121
122
  const isControl = !!event.ctrlKey
122
123
  const isAlt = !!event.altKey
123
124
  const isMeta = !!event.metaKey
124
- const isMod = isMac
125
- ? isMeta
126
- : isControl
125
+ const isMod = isMac ? isMeta : isControl
127
126
 
128
127
  if (
129
- key === null
130
- || key === undefined
131
- || (key === 'Shift' && isShift)
132
- || (key === 'Control' && isControl)
133
- || (key === 'Alt' && isAlt)
134
- || (key === 'Meta' && isMeta)
135
- || (key === 'Mod' && isMod)
128
+ key === null ||
129
+ key === undefined ||
130
+ (key === 'Shift' && isShift) ||
131
+ (key === 'Control' && isControl) ||
132
+ (key === 'Alt' && isAlt) ||
133
+ (key === 'Meta' && isMeta) ||
134
+ (key === 'Mod' && isMod)
136
135
  ) {
137
136
  activeMouseSelection = true
138
137
  }
@@ -141,22 +140,26 @@ export const NodeRange = Extension.create<NodeRangeOptions>({
141
140
  return false
142
141
  }
143
142
 
144
- document.addEventListener('mouseup', () => {
145
- activeMouseSelection = false
143
+ document.addEventListener(
144
+ 'mouseup',
145
+ () => {
146
+ activeMouseSelection = false
146
147
 
147
- const { state } = view
148
- const { doc, selection, tr } = state
149
- const { $anchor, $head } = selection
148
+ const { state } = view
149
+ const { doc, selection, tr } = state
150
+ const { $anchor, $head } = selection
150
151
 
151
- if ($anchor.sameParent($head)) {
152
- return
153
- }
152
+ if ($anchor.sameParent($head)) {
153
+ return
154
+ }
154
155
 
155
- const nodeRangeSelection = NodeRangeSelection.create(doc, $anchor.pos, $head.pos, this.options.depth)
156
+ const nodeRangeSelection = NodeRangeSelection.create(doc, $anchor.pos, $head.pos, this.options.depth)
156
157
 
157
- tr.setSelection(nodeRangeSelection)
158
- view.dispatch(tr)
159
- }, { once: true })
158
+ tr.setSelection(nodeRangeSelection)
159
+ view.dispatch(tr)
160
+ },
161
+ { once: true },
162
+ )
160
163
 
161
164
  return false
162
165
  },
@@ -1,11 +0,0 @@
1
- import { Node as ProseMirrorNode } from '@tiptap/pm/model';
2
- import { Mappable } from '@tiptap/pm/transform';
3
- import { NodeRangeSelection } from './NodeRangeSelection.js';
4
- export declare class NodeRangeBookmark {
5
- anchor: number;
6
- head: number;
7
- constructor(anchor: number, head: number);
8
- map(mapping: Mappable): NodeRangeBookmark;
9
- resolve(doc: ProseMirrorNode): NodeRangeSelection;
10
- }
11
- //# sourceMappingURL=NodeRangeBookmark.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"NodeRangeBookmark.d.ts","sourceRoot":"","sources":["../../src/helpers/NodeRangeBookmark.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,IAAI,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAE/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAE5D,qBAAa,iBAAiB;IAE5B,MAAM,EAAG,MAAM,CAAA;IAEf,IAAI,EAAG,MAAM,CAAA;gBAED,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAKxC,GAAG,CAAC,OAAO,EAAE,QAAQ;IAIrB,OAAO,CAAC,GAAG,EAAE,eAAe;CAO7B"}
@@ -1,24 +0,0 @@
1
- import { Node as ProseMirrorNode, ResolvedPos } from '@tiptap/pm/model';
2
- import { Selection } from '@tiptap/pm/state';
3
- import { Mapping } from '@tiptap/pm/transform';
4
- import { NodeRangeBookmark } from './NodeRangeBookmark.js';
5
- export declare class NodeRangeSelection extends Selection {
6
- depth: number | undefined;
7
- constructor($anchor: ResolvedPos, $head: ResolvedPos, depth?: number, bias?: number);
8
- get $to(): ResolvedPos;
9
- eq(other: Selection): boolean;
10
- map(doc: ProseMirrorNode, mapping: Mapping): NodeRangeSelection;
11
- toJSON(): {
12
- type: string;
13
- anchor: number;
14
- head: number;
15
- };
16
- get isForwards(): boolean;
17
- get isBackwards(): boolean;
18
- extendBackwards(): NodeRangeSelection;
19
- extendForwards(): NodeRangeSelection;
20
- static fromJSON(doc: ProseMirrorNode, json: any): NodeRangeSelection;
21
- static create(doc: ProseMirrorNode, anchor: number, head: number, depth?: number, bias?: number): NodeRangeSelection;
22
- getBookmark(): NodeRangeBookmark;
23
- }
24
- //# sourceMappingURL=NodeRangeSelection.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"NodeRangeSelection.d.ts","sourceRoot":"","sources":["../../src/helpers/NodeRangeSelection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,IAAI,eAAe,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACvE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAG9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAE1D,qBAAa,kBAAmB,SAAQ,SAAS;IAE/C,KAAK,EAAE,MAAM,GAAG,SAAS,CAAA;gBAEb,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,SAAI;IAsC9E,IAAI,GAAG,gBAEN;IAED,EAAE,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO;IAM7B,GAAG,CAAC,GAAG,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,GAAG,kBAAkB;IAO/D,MAAM;;;;;IAQN,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,eAAe,IAAI,kBAAkB;IAiBrC,cAAc,IAAI,kBAAkB;IAiBpC,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,GAAG,GAAG,kBAAkB;IAIpE,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,SAAI,GAAG,kBAAkB;IAI/G,WAAW,IAAI,iBAAiB;CAIjC"}
@@ -1,4 +0,0 @@
1
- import { SelectionRange } from '@tiptap/pm/state';
2
- import { DecorationSet } from '@tiptap/pm/view';
3
- export declare function getNodeRangeDecorations(ranges: SelectionRange[]): DecorationSet;
4
- //# sourceMappingURL=getNodeRangeDecorations.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"getNodeRangeDecorations.d.ts","sourceRoot":"","sources":["../../src/helpers/getNodeRangeDecorations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAc,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAE3D,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,aAAa,CAwB/E"}
@@ -1,4 +0,0 @@
1
- import { ResolvedPos } from '@tiptap/pm/model';
2
- import { SelectionRange } from '@tiptap/pm/state';
3
- export declare function getSelectionRanges($from: ResolvedPos, $to: ResolvedPos, depth?: number): SelectionRange[];
4
- //# sourceMappingURL=getSelectionRanges.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"getSelectionRanges.d.ts","sourceRoot":"","sources":["../../src/helpers/getSelectionRanges.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAEjD,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,WAAW,EAClB,GAAG,EAAE,WAAW,EAChB,KAAK,CAAC,EAAE,MAAM,GACb,cAAc,EAAE,CA8BlB"}
@@ -1,3 +0,0 @@
1
- import { NodeRangeSelection } from './NodeRangeSelection.js';
2
- export declare function isNodeRangeSelection(value: unknown): value is NodeRangeSelection;
3
- //# sourceMappingURL=isNodeRangeSelection.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"isNodeRangeSelection.d.ts","sourceRoot":"","sources":["../../src/helpers/isNodeRangeSelection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAE5D,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,kBAAkB,CAEhF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE3C,cAAc,sCAAsC,CAAA;AACpD,cAAc,iCAAiC,CAAA;AAC/C,cAAc,mCAAmC,CAAA;AACjD,cAAc,iCAAiC,CAAA;AAC/C,cAAc,iBAAiB,CAAA;AAE/B,eAAe,SAAS,CAAA"}