@tiptap/core 3.0.0-next.3 → 3.0.0-next.5

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 (146) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +5 -1
  3. package/dist/index.cjs +2627 -2651
  4. package/dist/index.cjs.map +1 -1
  5. package/dist/index.d.cts +2423 -2688
  6. package/dist/index.d.ts +2423 -2688
  7. package/dist/index.js +2639 -2684
  8. package/dist/index.js.map +1 -1
  9. package/dist/jsx-runtime/jsx-runtime.cjs +56 -0
  10. package/dist/jsx-runtime/jsx-runtime.cjs.map +1 -0
  11. package/dist/jsx-runtime/jsx-runtime.d.cts +22 -0
  12. package/dist/jsx-runtime/jsx-runtime.d.ts +22 -0
  13. package/dist/jsx-runtime/jsx-runtime.js +26 -0
  14. package/dist/jsx-runtime/jsx-runtime.js.map +1 -0
  15. package/jsx-runtime/index.cjs +1 -0
  16. package/jsx-runtime/index.d.cts +1 -0
  17. package/jsx-runtime/index.d.ts +1 -0
  18. package/jsx-runtime/index.js +1 -0
  19. package/package.json +27 -6
  20. package/src/CommandManager.ts +2 -9
  21. package/src/Editor.ts +191 -94
  22. package/src/EventEmitter.ts +7 -10
  23. package/src/Extendable.ts +483 -0
  24. package/src/Extension.ts +5 -496
  25. package/src/ExtensionManager.ts +81 -135
  26. package/src/InputRule.ts +35 -48
  27. package/src/Mark.ts +135 -623
  28. package/src/MarkView.ts +66 -0
  29. package/src/Node.ts +325 -829
  30. package/src/NodePos.ts +1 -3
  31. package/src/NodeView.ts +10 -20
  32. package/src/PasteRule.ts +43 -55
  33. package/src/Tracker.ts +7 -9
  34. package/src/commands/blur.ts +14 -12
  35. package/src/commands/clearContent.ts +12 -5
  36. package/src/commands/clearNodes.ts +32 -30
  37. package/src/commands/command.ts +1 -1
  38. package/src/commands/createParagraphNear.ts +5 -3
  39. package/src/commands/cut.ts +12 -10
  40. package/src/commands/deleteCurrentNode.ts +23 -21
  41. package/src/commands/deleteNode.ts +18 -16
  42. package/src/commands/deleteRange.ts +10 -8
  43. package/src/commands/deleteSelection.ts +5 -3
  44. package/src/commands/enter.ts +6 -4
  45. package/src/commands/exitCode.ts +5 -3
  46. package/src/commands/extendMarkRange.ts +14 -12
  47. package/src/commands/first.ts +2 -4
  48. package/src/commands/focus.ts +51 -48
  49. package/src/commands/forEach.ts +2 -2
  50. package/src/commands/insertContent.ts +12 -14
  51. package/src/commands/insertContentAt.ts +105 -98
  52. package/src/commands/join.ts +20 -12
  53. package/src/commands/joinItemBackward.ts +16 -18
  54. package/src/commands/joinItemForward.ts +16 -18
  55. package/src/commands/joinTextblockBackward.ts +5 -3
  56. package/src/commands/joinTextblockForward.ts +5 -3
  57. package/src/commands/keyboardShortcut.ts +29 -34
  58. package/src/commands/lift.ts +10 -8
  59. package/src/commands/liftEmptyBlock.ts +6 -4
  60. package/src/commands/liftListItem.ts +6 -4
  61. package/src/commands/newlineInCode.ts +5 -3
  62. package/src/commands/resetAttributes.ts +36 -41
  63. package/src/commands/scrollIntoView.ts +9 -7
  64. package/src/commands/selectAll.ts +10 -8
  65. package/src/commands/selectNodeBackward.ts +5 -3
  66. package/src/commands/selectNodeForward.ts +5 -3
  67. package/src/commands/selectParentNode.ts +5 -3
  68. package/src/commands/selectTextblockEnd.ts +5 -3
  69. package/src/commands/selectTextblockStart.ts +5 -3
  70. package/src/commands/setContent.ts +37 -36
  71. package/src/commands/setMark.ts +55 -57
  72. package/src/commands/setMeta.ts +7 -5
  73. package/src/commands/setNode.ts +32 -30
  74. package/src/commands/setNodeSelection.ts +11 -9
  75. package/src/commands/setTextSelection.ts +15 -13
  76. package/src/commands/sinkListItem.ts +6 -4
  77. package/src/commands/splitBlock.ts +67 -76
  78. package/src/commands/splitListItem.ts +93 -106
  79. package/src/commands/toggleList.ts +73 -71
  80. package/src/commands/toggleMark.ts +11 -9
  81. package/src/commands/toggleNode.ts +18 -16
  82. package/src/commands/toggleWrap.ts +10 -8
  83. package/src/commands/undoInputRule.ts +31 -29
  84. package/src/commands/unsetAllMarks.ts +16 -14
  85. package/src/commands/unsetMark.ts +27 -25
  86. package/src/commands/updateAttributes.ts +92 -100
  87. package/src/commands/wrapIn.ts +6 -4
  88. package/src/commands/wrapInList.ts +6 -4
  89. package/src/extensions/clipboardTextSerializer.ts +2 -4
  90. package/src/extensions/delete.ts +89 -0
  91. package/src/extensions/focusEvents.ts +2 -6
  92. package/src/extensions/index.ts +1 -0
  93. package/src/extensions/keymap.ts +58 -50
  94. package/src/extensions/paste.ts +0 -1
  95. package/src/extensions/tabindex.ts +1 -1
  96. package/src/helpers/combineTransactionSteps.ts +1 -4
  97. package/src/helpers/createChainableState.ts +1 -4
  98. package/src/helpers/createDocument.ts +1 -3
  99. package/src/helpers/createNodeFromContent.ts +4 -10
  100. package/src/helpers/findChildrenInRange.ts +1 -5
  101. package/src/helpers/findParentNode.ts +3 -1
  102. package/src/helpers/flattenExtensions.ts +30 -0
  103. package/src/helpers/getAttributes.ts +1 -4
  104. package/src/helpers/getAttributesFromExtensions.ts +28 -37
  105. package/src/helpers/getChangedRanges.ts +13 -11
  106. package/src/helpers/getExtensionField.ts +11 -11
  107. package/src/helpers/getMarkAttributes.ts +1 -4
  108. package/src/helpers/getMarkRange.ts +5 -15
  109. package/src/helpers/getMarkType.ts +1 -3
  110. package/src/helpers/getNodeAttributes.ts +1 -4
  111. package/src/helpers/getNodeType.ts +1 -3
  112. package/src/helpers/getRenderedAttributes.ts +1 -3
  113. package/src/helpers/getSchema.ts +2 -2
  114. package/src/helpers/getSchemaByResolvedExtensions.ts +45 -77
  115. package/src/helpers/getSplittedAttributes.ts +4 -4
  116. package/src/helpers/getTextContentFromNodes.ts +8 -11
  117. package/src/helpers/index.ts +4 -0
  118. package/src/helpers/injectExtensionAttributesToParseRule.ts +1 -1
  119. package/src/helpers/isActive.ts +1 -5
  120. package/src/helpers/isExtensionRulesEnabled.ts +1 -3
  121. package/src/helpers/isNodeEmpty.ts +2 -2
  122. package/src/helpers/resolveExtensions.ts +25 -0
  123. package/src/helpers/resolveFocusPosition.ts +3 -14
  124. package/src/helpers/rewriteUnknownContent.ts +149 -0
  125. package/src/helpers/sortExtensions.ts +26 -0
  126. package/src/index.ts +3 -7
  127. package/src/inputRules/markInputRule.ts +1 -5
  128. package/src/inputRules/nodeInputRule.ts +2 -9
  129. package/src/inputRules/textInputRule.ts +1 -4
  130. package/src/inputRules/textblockTypeInputRule.ts +2 -8
  131. package/src/inputRules/wrappingInputRule.ts +13 -19
  132. package/src/jsx-runtime.ts +64 -0
  133. package/src/pasteRules/markPasteRule.ts +1 -3
  134. package/src/pasteRules/nodePasteRule.ts +2 -8
  135. package/src/pasteRules/textPasteRule.ts +1 -4
  136. package/src/types.ts +529 -174
  137. package/src/utilities/createStyleTag.ts +3 -1
  138. package/src/utilities/deleteProps.ts +7 -11
  139. package/src/utilities/elementFromString.ts +3 -0
  140. package/src/utilities/findDuplicates.ts +4 -1
  141. package/src/utilities/index.ts +1 -0
  142. package/src/utilities/isFunction.ts +1 -0
  143. package/src/utilities/isMacOS.ts +1 -3
  144. package/src/utilities/isiOS.ts +5 -10
  145. package/src/utilities/mergeAttributes.ts +17 -7
  146. package/src/utilities/removeDuplicates.ts +1 -3
@@ -64,42 +64,37 @@ declare module '@tiptap/core' {
64
64
  * @param name The name of the keyboard shortcut.
65
65
  * @example editor.commands.keyboardShortcut('Mod-b')
66
66
  */
67
- keyboardShortcut: (name: string) => ReturnType,
67
+ keyboardShortcut: (name: string) => ReturnType
68
68
  }
69
69
  }
70
70
  }
71
71
 
72
- export const keyboardShortcut: RawCommands['keyboardShortcut'] = name => ({
73
- editor,
74
- view,
75
- tr,
76
- dispatch,
77
- }) => {
78
- const keys = normalizeKeyName(name).split(/-(?!$)/)
79
- const key = keys.find(item => !['Alt', 'Ctrl', 'Meta', 'Shift'].includes(item))
80
- const event = new KeyboardEvent('keydown', {
81
- key: key === 'Space'
82
- ? ' '
83
- : key,
84
- altKey: keys.includes('Alt'),
85
- ctrlKey: keys.includes('Ctrl'),
86
- metaKey: keys.includes('Meta'),
87
- shiftKey: keys.includes('Shift'),
88
- bubbles: true,
89
- cancelable: true,
90
- })
91
-
92
- const capturedTransaction = editor.captureTransaction(() => {
93
- view.someProp('handleKeyDown', f => f(view, event))
94
- })
95
-
96
- capturedTransaction?.steps.forEach(step => {
97
- const newStep = step.map(tr.mapping)
98
-
99
- if (newStep && dispatch) {
100
- tr.maybeStep(newStep)
101
- }
102
- })
72
+ export const keyboardShortcut: RawCommands['keyboardShortcut'] =
73
+ name =>
74
+ ({ editor, view, tr, dispatch }) => {
75
+ const keys = normalizeKeyName(name).split(/-(?!$)/)
76
+ const key = keys.find(item => !['Alt', 'Ctrl', 'Meta', 'Shift'].includes(item))
77
+ const event = new KeyboardEvent('keydown', {
78
+ key: key === 'Space' ? ' ' : key,
79
+ altKey: keys.includes('Alt'),
80
+ ctrlKey: keys.includes('Ctrl'),
81
+ metaKey: keys.includes('Meta'),
82
+ shiftKey: keys.includes('Shift'),
83
+ bubbles: true,
84
+ cancelable: true,
85
+ })
86
+
87
+ const capturedTransaction = editor.captureTransaction(() => {
88
+ view.someProp('handleKeyDown', f => f(view, event))
89
+ })
90
+
91
+ capturedTransaction?.steps.forEach(step => {
92
+ const newStep = step.map(tr.mapping)
93
+
94
+ if (newStep && dispatch) {
95
+ tr.maybeStep(newStep)
96
+ }
97
+ })
103
98
 
104
- return true
105
- }
99
+ return true
100
+ }
@@ -20,13 +20,15 @@ declare module '@tiptap/core' {
20
20
  }
21
21
  }
22
22
 
23
- export const lift: RawCommands['lift'] = (typeOrName, attributes = {}) => ({ state, dispatch }) => {
24
- const type = getNodeType(typeOrName, state.schema)
25
- const isActive = isNodeActive(state, type, attributes)
23
+ export const lift: RawCommands['lift'] =
24
+ (typeOrName, attributes = {}) =>
25
+ ({ state, dispatch }) => {
26
+ const type = getNodeType(typeOrName, state.schema)
27
+ const isActive = isNodeActive(state, type, attributes)
26
28
 
27
- if (!isActive) {
28
- return false
29
- }
29
+ if (!isActive) {
30
+ return false
31
+ }
30
32
 
31
- return originalLift(state, dispatch)
32
- }
33
+ return originalLift(state, dispatch)
34
+ }
@@ -9,11 +9,13 @@ declare module '@tiptap/core' {
9
9
  * If the cursor is in an empty textblock that can be lifted, lift the block.
10
10
  * @example editor.commands.liftEmptyBlock()
11
11
  */
12
- liftEmptyBlock: () => ReturnType,
12
+ liftEmptyBlock: () => ReturnType
13
13
  }
14
14
  }
15
15
  }
16
16
 
17
- export const liftEmptyBlock: RawCommands['liftEmptyBlock'] = () => ({ state, dispatch }) => {
18
- return originalLiftEmptyBlock(state, dispatch)
19
- }
17
+ export const liftEmptyBlock: RawCommands['liftEmptyBlock'] =
18
+ () =>
19
+ ({ state, dispatch }) => {
20
+ return originalLiftEmptyBlock(state, dispatch)
21
+ }
@@ -17,8 +17,10 @@ declare module '@tiptap/core' {
17
17
  }
18
18
  }
19
19
 
20
- export const liftListItem: RawCommands['liftListItem'] = typeOrName => ({ state, dispatch }) => {
21
- const type = getNodeType(typeOrName, state.schema)
20
+ export const liftListItem: RawCommands['liftListItem'] =
21
+ typeOrName =>
22
+ ({ state, dispatch }) => {
23
+ const type = getNodeType(typeOrName, state.schema)
22
24
 
23
- return originalLiftListItem(type)(state, dispatch)
24
- }
25
+ return originalLiftListItem(type)(state, dispatch)
26
+ }
@@ -14,6 +14,8 @@ declare module '@tiptap/core' {
14
14
  }
15
15
  }
16
16
 
17
- export const newlineInCode: RawCommands['newlineInCode'] = () => ({ state, dispatch }) => {
18
- return originalNewlineInCode(state, dispatch)
19
- }
17
+ export const newlineInCode: RawCommands['newlineInCode'] =
18
+ () =>
19
+ ({ state, dispatch }) => {
20
+ return originalNewlineInCode(state, dispatch)
21
+ }
@@ -15,56 +15,51 @@ declare module '@tiptap/core' {
15
15
  * @param attributes The attributes of the node to reset.
16
16
  * @example editor.commands.resetAttributes('heading', 'level')
17
17
  */
18
- resetAttributes: (
19
- typeOrName: string | NodeType | MarkType,
20
- attributes: string | string[],
21
- ) => ReturnType
18
+ resetAttributes: (typeOrName: string | NodeType | MarkType, attributes: string | string[]) => ReturnType
22
19
  }
23
20
  }
24
21
  }
25
22
 
26
- export const resetAttributes: RawCommands['resetAttributes'] = (typeOrName, attributes) => ({ tr, state, dispatch }) => {
27
- let nodeType: NodeType | null = null
28
- let markType: MarkType | null = null
23
+ export const resetAttributes: RawCommands['resetAttributes'] =
24
+ (typeOrName, attributes) =>
25
+ ({ tr, state, dispatch }) => {
26
+ let nodeType: NodeType | null = null
27
+ let markType: MarkType | null = null
29
28
 
30
- const schemaType = getSchemaTypeNameByName(
31
- typeof typeOrName === 'string' ? typeOrName : typeOrName.name,
32
- state.schema,
33
- )
29
+ const schemaType = getSchemaTypeNameByName(
30
+ typeof typeOrName === 'string' ? typeOrName : typeOrName.name,
31
+ state.schema,
32
+ )
34
33
 
35
- if (!schemaType) {
36
- return false
37
- }
34
+ if (!schemaType) {
35
+ return false
36
+ }
38
37
 
39
- if (schemaType === 'node') {
40
- nodeType = getNodeType(typeOrName as NodeType, state.schema)
41
- }
38
+ if (schemaType === 'node') {
39
+ nodeType = getNodeType(typeOrName as NodeType, state.schema)
40
+ }
42
41
 
43
- if (schemaType === 'mark') {
44
- markType = getMarkType(typeOrName as MarkType, state.schema)
45
- }
42
+ if (schemaType === 'mark') {
43
+ markType = getMarkType(typeOrName as MarkType, state.schema)
44
+ }
46
45
 
47
- if (dispatch) {
48
- tr.selection.ranges.forEach(range => {
49
- state.doc.nodesBetween(range.$from.pos, range.$to.pos, (node, pos) => {
50
- if (nodeType && nodeType === node.type) {
51
- tr.setNodeMarkup(pos, undefined, deleteProps(node.attrs, attributes))
52
- }
46
+ if (dispatch) {
47
+ tr.selection.ranges.forEach(range => {
48
+ state.doc.nodesBetween(range.$from.pos, range.$to.pos, (node, pos) => {
49
+ if (nodeType && nodeType === node.type) {
50
+ tr.setNodeMarkup(pos, undefined, deleteProps(node.attrs, attributes))
51
+ }
53
52
 
54
- if (markType && node.marks.length) {
55
- node.marks.forEach(mark => {
56
- if (markType === mark.type) {
57
- tr.addMark(
58
- pos,
59
- pos + node.nodeSize,
60
- markType.create(deleteProps(mark.attrs, attributes)),
61
- )
62
- }
63
- })
64
- }
53
+ if (markType && node.marks.length) {
54
+ node.marks.forEach(mark => {
55
+ if (markType === mark.type) {
56
+ tr.addMark(pos, pos + node.nodeSize, markType.create(deleteProps(mark.attrs, attributes)))
57
+ }
58
+ })
59
+ }
60
+ })
65
61
  })
66
- })
67
- }
62
+ }
68
63
 
69
- return true
70
- }
64
+ return true
65
+ }
@@ -7,15 +7,17 @@ declare module '@tiptap/core' {
7
7
  * Scroll the selection into view.
8
8
  * @example editor.commands.scrollIntoView()
9
9
  */
10
- scrollIntoView: () => ReturnType,
10
+ scrollIntoView: () => ReturnType
11
11
  }
12
12
  }
13
13
  }
14
14
 
15
- export const scrollIntoView: RawCommands['scrollIntoView'] = () => ({ tr, dispatch }) => {
16
- if (dispatch) {
17
- tr.scrollIntoView()
18
- }
15
+ export const scrollIntoView: RawCommands['scrollIntoView'] =
16
+ () =>
17
+ ({ tr, dispatch }) => {
18
+ if (dispatch) {
19
+ tr.scrollIntoView()
20
+ }
19
21
 
20
- return true
21
- }
22
+ return true
23
+ }
@@ -9,17 +9,19 @@ declare module '@tiptap/core' {
9
9
  * Select the whole document.
10
10
  * @example editor.commands.selectAll()
11
11
  */
12
- selectAll: () => ReturnType,
12
+ selectAll: () => ReturnType
13
13
  }
14
14
  }
15
15
  }
16
16
 
17
- export const selectAll: RawCommands['selectAll'] = () => ({ tr, dispatch }) => {
18
- if (dispatch) {
19
- const selection = new AllSelection(tr.doc)
17
+ export const selectAll: RawCommands['selectAll'] =
18
+ () =>
19
+ ({ tr, dispatch }) => {
20
+ if (dispatch) {
21
+ const selection = new AllSelection(tr.doc)
20
22
 
21
- tr.setSelection(selection)
22
- }
23
+ tr.setSelection(selection)
24
+ }
23
25
 
24
- return true
25
- }
26
+ return true
27
+ }
@@ -14,6 +14,8 @@ declare module '@tiptap/core' {
14
14
  }
15
15
  }
16
16
 
17
- export const selectNodeBackward: RawCommands['selectNodeBackward'] = () => ({ state, dispatch }) => {
18
- return originalSelectNodeBackward(state, dispatch)
19
- }
17
+ export const selectNodeBackward: RawCommands['selectNodeBackward'] =
18
+ () =>
19
+ ({ state, dispatch }) => {
20
+ return originalSelectNodeBackward(state, dispatch)
21
+ }
@@ -14,6 +14,8 @@ declare module '@tiptap/core' {
14
14
  }
15
15
  }
16
16
 
17
- export const selectNodeForward: RawCommands['selectNodeForward'] = () => ({ state, dispatch }) => {
18
- return originalSelectNodeForward(state, dispatch)
19
- }
17
+ export const selectNodeForward: RawCommands['selectNodeForward'] =
18
+ () =>
19
+ ({ state, dispatch }) => {
20
+ return originalSelectNodeForward(state, dispatch)
21
+ }
@@ -14,6 +14,8 @@ declare module '@tiptap/core' {
14
14
  }
15
15
  }
16
16
 
17
- export const selectParentNode: RawCommands['selectParentNode'] = () => ({ state, dispatch }) => {
18
- return originalSelectParentNode(state, dispatch)
19
- }
17
+ export const selectParentNode: RawCommands['selectParentNode'] =
18
+ () =>
19
+ ({ state, dispatch }) => {
20
+ return originalSelectParentNode(state, dispatch)
21
+ }
@@ -16,6 +16,8 @@ declare module '@tiptap/core' {
16
16
  }
17
17
  }
18
18
 
19
- export const selectTextblockEnd: RawCommands['selectTextblockEnd'] = () => ({ state, dispatch }) => {
20
- return originalSelectTextblockEnd(state, dispatch)
21
- }
19
+ export const selectTextblockEnd: RawCommands['selectTextblockEnd'] =
20
+ () =>
21
+ ({ state, dispatch }) => {
22
+ return originalSelectTextblockEnd(state, dispatch)
23
+ }
@@ -16,6 +16,8 @@ declare module '@tiptap/core' {
16
16
  }
17
17
  }
18
18
 
19
- export const selectTextblockStart: RawCommands['selectTextblockStart'] = () => ({ state, dispatch }) => {
20
- return originalSelectTextblockStart(state, dispatch)
21
- }
19
+ export const selectTextblockStart: RawCommands['selectTextblockStart'] =
20
+ () =>
21
+ ({ state, dispatch }) => {
22
+ return originalSelectTextblockStart(state, dispatch)
23
+ }
@@ -19,55 +19,56 @@ declare module '@tiptap/core' {
19
19
  */
20
20
  content: Content | Fragment | ProseMirrorNode,
21
21
 
22
- /**
23
- * Whether to emit an update event.
24
- * @default false
25
- */
26
- emitUpdate?: boolean,
27
-
28
- /**
29
- * Options for parsing the content.
30
- * @default {}
31
- */
32
- parseOptions?: ParseOptions,
33
22
  /**
34
23
  * Options for `setContent`.
35
24
  */
36
25
  options?: {
26
+ /**
27
+ * Options for parsing the content.
28
+ * @default {}
29
+ */
30
+ parseOptions?: ParseOptions
31
+
37
32
  /**
38
33
  * Whether to throw an error if the content is invalid.
39
34
  */
40
- errorOnInvalidContent?: boolean;
41
- }
42
- ) => ReturnType;
43
- };
35
+ errorOnInvalidContent?: boolean
36
+
37
+ /**
38
+ * Whether to emit an update event.
39
+ * @default true
40
+ */
41
+ emitUpdate?: boolean
42
+ },
43
+ ) => ReturnType
44
+ }
44
45
  }
45
46
  }
46
47
 
47
- export const setContent: RawCommands['setContent'] = (content, emitUpdate = false, parseOptions = {}, options = {}) => ({
48
- editor, tr, dispatch, commands,
49
- }) => {
50
- const { doc } = tr
48
+ export const setContent: RawCommands['setContent'] =
49
+ (content, { errorOnInvalidContent, emitUpdate = true, parseOptions = {} } = {}) =>
50
+ ({ editor, tr, dispatch, commands }) => {
51
+ const { doc } = tr
51
52
 
52
- // This is to keep backward compatibility with the previous behavior
53
- // TODO remove this in the next major version
54
- if (parseOptions.preserveWhitespace !== 'full') {
55
- const document = createDocument(content, editor.schema, parseOptions, {
56
- errorOnInvalidContent: options.errorOnInvalidContent ?? editor.options.enableContentCheck,
57
- })
53
+ // This is to keep backward compatibility with the previous behavior
54
+ // TODO remove this in the next major version
55
+ if (parseOptions.preserveWhitespace !== 'full') {
56
+ const document = createDocument(content, editor.schema, parseOptions, {
57
+ errorOnInvalidContent: errorOnInvalidContent ?? editor.options.enableContentCheck,
58
+ })
59
+
60
+ if (dispatch) {
61
+ tr.replaceWith(0, doc.content.size, document).setMeta('preventUpdate', !emitUpdate)
62
+ }
63
+ return true
64
+ }
58
65
 
59
66
  if (dispatch) {
60
- tr.replaceWith(0, doc.content.size, document).setMeta('preventUpdate', !emitUpdate)
67
+ tr.setMeta('preventUpdate', !emitUpdate)
61
68
  }
62
- return true
63
- }
64
69
 
65
- if (dispatch) {
66
- tr.setMeta('preventUpdate', !emitUpdate)
70
+ return commands.insertContentAt({ from: 0, to: doc.content.size }, content, {
71
+ parseOptions,
72
+ errorOnInvalidContent: errorOnInvalidContent ?? editor.options.enableContentCheck,
73
+ })
67
74
  }
68
-
69
- return commands.insertContentAt({ from: 0, to: doc.content.size }, content, {
70
- parseOptions,
71
- errorOnInvalidContent: options.errorOnInvalidContent ?? editor.options.enableContentCheck,
72
- })
73
- }
@@ -31,18 +31,14 @@ function canSetMark(state: EditorState, tr: Transaction, newMarkType: MarkType)
31
31
  const currentMarks = state.storedMarks ?? cursor.marks()
32
32
 
33
33
  // There can be no current marks that exclude the new mark
34
- return (
35
- !!newMarkType.isInSet(currentMarks)
36
- || !currentMarks.some(mark => mark.type.excludes(newMarkType))
37
- )
34
+ return !!newMarkType.isInSet(currentMarks) || !currentMarks.some(mark => mark.type.excludes(newMarkType))
38
35
  }
39
36
 
40
37
  const { ranges } = selection
41
38
 
42
39
  return ranges.some(({ $from, $to }) => {
43
- let someNodeSupportsMark = $from.depth === 0
44
- ? state.doc.inlineContent && state.doc.type.allowsMarkType(newMarkType)
45
- : false
40
+ let someNodeSupportsMark =
41
+ $from.depth === 0 ? state.doc.inlineContent && state.doc.type.allowsMarkType(newMarkType) : false
46
42
 
47
43
  state.doc.nodesBetween($from.pos, $to.pos, (node, _pos, parent) => {
48
44
  // If we already found a mark that we can enable, return false to bypass the remaining search
@@ -52,8 +48,8 @@ function canSetMark(state: EditorState, tr: Transaction, newMarkType: MarkType)
52
48
 
53
49
  if (node.isInline) {
54
50
  const parentAllowsMarkType = !parent || parent.type.allowsMarkType(newMarkType)
55
- const currentMarksAllowMarkType = !!newMarkType.isInSet(node.marks)
56
- || !node.marks.some(otherMark => otherMark.type.excludes(newMarkType))
51
+ const currentMarksAllowMarkType =
52
+ !!newMarkType.isInSet(node.marks) || !node.marks.some(otherMark => otherMark.type.excludes(newMarkType))
57
53
 
58
54
  someNodeSupportsMark = parentAllowsMarkType && currentMarksAllowMarkType
59
55
  }
@@ -63,54 +59,56 @@ function canSetMark(state: EditorState, tr: Transaction, newMarkType: MarkType)
63
59
  return someNodeSupportsMark
64
60
  })
65
61
  }
66
- export const setMark: RawCommands['setMark'] = (typeOrName, attributes = {}) => ({ tr, state, dispatch }) => {
67
- const { selection } = tr
68
- const { empty, ranges } = selection
69
- const type = getMarkType(typeOrName, state.schema)
70
-
71
- if (dispatch) {
72
- if (empty) {
73
- const oldAttributes = getMarkAttributes(state, type)
74
-
75
- tr.addStoredMark(
76
- type.create({
77
- ...oldAttributes,
78
- ...attributes,
79
- }),
80
- )
81
- } else {
82
- ranges.forEach(range => {
83
- const from = range.$from.pos
84
- const to = range.$to.pos
85
-
86
- state.doc.nodesBetween(from, to, (node, pos) => {
87
- const trimmedFrom = Math.max(pos, from)
88
- const trimmedTo = Math.min(pos + node.nodeSize, to)
89
- const someHasMark = node.marks.find(mark => mark.type === type)
90
-
91
- // if there is already a mark of this type
92
- // we know that we have to merge its attributes
93
- // otherwise we add a fresh new mark
94
- if (someHasMark) {
95
- node.marks.forEach(mark => {
96
- if (type === mark.type) {
97
- tr.addMark(
98
- trimmedFrom,
99
- trimmedTo,
100
- type.create({
101
- ...mark.attrs,
102
- ...attributes,
103
- }),
104
- )
105
- }
106
- })
107
- } else {
108
- tr.addMark(trimmedFrom, trimmedTo, type.create(attributes))
109
- }
62
+ export const setMark: RawCommands['setMark'] =
63
+ (typeOrName, attributes = {}) =>
64
+ ({ tr, state, dispatch }) => {
65
+ const { selection } = tr
66
+ const { empty, ranges } = selection
67
+ const type = getMarkType(typeOrName, state.schema)
68
+
69
+ if (dispatch) {
70
+ if (empty) {
71
+ const oldAttributes = getMarkAttributes(state, type)
72
+
73
+ tr.addStoredMark(
74
+ type.create({
75
+ ...oldAttributes,
76
+ ...attributes,
77
+ }),
78
+ )
79
+ } else {
80
+ ranges.forEach(range => {
81
+ const from = range.$from.pos
82
+ const to = range.$to.pos
83
+
84
+ state.doc.nodesBetween(from, to, (node, pos) => {
85
+ const trimmedFrom = Math.max(pos, from)
86
+ const trimmedTo = Math.min(pos + node.nodeSize, to)
87
+ const someHasMark = node.marks.find(mark => mark.type === type)
88
+
89
+ // if there is already a mark of this type
90
+ // we know that we have to merge its attributes
91
+ // otherwise we add a fresh new mark
92
+ if (someHasMark) {
93
+ node.marks.forEach(mark => {
94
+ if (type === mark.type) {
95
+ tr.addMark(
96
+ trimmedFrom,
97
+ trimmedTo,
98
+ type.create({
99
+ ...mark.attrs,
100
+ ...attributes,
101
+ }),
102
+ )
103
+ }
104
+ })
105
+ } else {
106
+ tr.addMark(trimmedFrom, trimmedTo, type.create(attributes))
107
+ }
108
+ })
110
109
  })
111
- })
110
+ }
112
111
  }
113
- }
114
112
 
115
- return canSetMark(state, tr, type)
116
- }
113
+ return canSetMark(state, tr, type)
114
+ }
@@ -11,13 +11,15 @@ declare module '@tiptap/core' {
11
11
  * @param value The value to store.
12
12
  * @example editor.commands.setMeta('foo', 'bar')
13
13
  */
14
- setMeta: (key: string | Plugin | PluginKey, value: any) => ReturnType,
14
+ setMeta: (key: string | Plugin | PluginKey, value: any) => ReturnType
15
15
  }
16
16
  }
17
17
  }
18
18
 
19
- export const setMeta: RawCommands['setMeta'] = (key, value) => ({ tr }) => {
20
- tr.setMeta(key, value)
19
+ export const setMeta: RawCommands['setMeta'] =
20
+ (key, value) =>
21
+ ({ tr }) => {
22
+ tr.setMeta(key, value)
21
23
 
22
- return true
23
- }
24
+ return true
25
+ }