@tiptap/core 2.0.0-beta.14 → 2.0.0-beta.143

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 (274) hide show
  1. package/LICENSE.md +1 -1
  2. package/README.md +2 -2
  3. package/dist/packages/core/src/CommandManager.d.ts +12 -5
  4. package/dist/packages/core/src/Editor.d.ts +19 -20
  5. package/dist/packages/core/src/EventEmitter.d.ts +8 -4
  6. package/dist/packages/core/src/Extension.d.ts +102 -26
  7. package/dist/packages/core/src/ExtensionManager.d.ts +6 -11
  8. package/dist/packages/core/src/InputRule.d.ts +42 -0
  9. package/dist/packages/core/src/Mark.d.ts +134 -30
  10. package/dist/packages/core/src/Node.d.ts +151 -32
  11. package/dist/packages/core/src/NodeView.d.ts +5 -9
  12. package/dist/packages/core/src/PasteRule.d.ts +42 -0
  13. package/dist/packages/core/src/Tracker.d.ts +11 -0
  14. package/dist/packages/core/src/commands/blur.d.ts +3 -3
  15. package/dist/packages/core/src/commands/clearContent.d.ts +3 -3
  16. package/dist/packages/core/src/commands/clearNodes.d.ts +3 -3
  17. package/dist/packages/core/src/commands/command.d.ts +2 -2
  18. package/dist/packages/core/src/commands/createParagraphNear.d.ts +3 -3
  19. package/dist/packages/core/src/commands/deleteNode.d.ts +13 -0
  20. package/dist/packages/core/src/commands/deleteRange.d.ts +3 -3
  21. package/dist/packages/core/src/commands/deleteSelection.d.ts +3 -3
  22. package/dist/packages/core/src/commands/enter.d.ts +3 -3
  23. package/dist/packages/core/src/commands/exitCode.d.ts +3 -3
  24. package/dist/packages/core/src/commands/extendMarkRange.d.ts +3 -3
  25. package/dist/packages/core/src/commands/first.d.ts +3 -3
  26. package/dist/packages/core/src/commands/focus.d.ts +5 -3
  27. package/dist/packages/core/src/commands/forEach.d.ts +14 -0
  28. package/dist/packages/core/src/commands/insertContent.d.ts +16 -0
  29. package/dist/packages/core/src/commands/insertContentAt.d.ts +16 -0
  30. package/dist/packages/core/src/commands/joinBackward.d.ts +3 -3
  31. package/dist/packages/core/src/commands/joinForward.d.ts +3 -3
  32. package/dist/packages/core/src/commands/keyboardShortcut.d.ts +3 -3
  33. package/dist/packages/core/src/commands/lift.d.ts +3 -3
  34. package/dist/packages/core/src/commands/liftEmptyBlock.d.ts +3 -3
  35. package/dist/packages/core/src/commands/liftListItem.d.ts +3 -3
  36. package/dist/packages/core/src/commands/newlineInCode.d.ts +3 -3
  37. package/dist/packages/core/src/commands/resetAttributes.d.ts +13 -0
  38. package/dist/packages/core/src/commands/scrollIntoView.d.ts +3 -3
  39. package/dist/packages/core/src/commands/selectAll.d.ts +3 -3
  40. package/dist/packages/core/src/commands/selectNodeBackward.d.ts +3 -3
  41. package/dist/packages/core/src/commands/selectNodeForward.d.ts +3 -3
  42. package/dist/packages/core/src/commands/selectParentNode.d.ts +3 -3
  43. package/dist/packages/core/src/commands/setContent.d.ts +4 -3
  44. package/dist/packages/core/src/commands/setMark.d.ts +3 -3
  45. package/dist/packages/core/src/commands/setMeta.d.ts +12 -0
  46. package/dist/packages/core/src/commands/setNode.d.ts +3 -3
  47. package/dist/packages/core/src/commands/setNodeSelection.d.ts +12 -0
  48. package/dist/packages/core/src/commands/setTextSelection.d.ts +12 -0
  49. package/dist/packages/core/src/commands/sinkListItem.d.ts +3 -3
  50. package/dist/packages/core/src/commands/splitBlock.d.ts +3 -3
  51. package/dist/packages/core/src/commands/splitListItem.d.ts +3 -3
  52. package/dist/packages/core/src/commands/toggleList.d.ts +3 -3
  53. package/dist/packages/core/src/commands/toggleMark.d.ts +8 -3
  54. package/dist/packages/core/src/commands/toggleNode.d.ts +3 -3
  55. package/dist/packages/core/src/commands/toggleWrap.d.ts +3 -3
  56. package/dist/packages/core/src/commands/undoInputRule.d.ts +3 -3
  57. package/dist/packages/core/src/commands/unsetAllMarks.d.ts +3 -3
  58. package/dist/packages/core/src/commands/unsetMark.d.ts +8 -3
  59. package/dist/packages/core/src/commands/updateAttributes.d.ts +13 -0
  60. package/dist/packages/core/src/commands/wrapIn.d.ts +3 -3
  61. package/dist/packages/core/src/commands/wrapInList.d.ts +3 -3
  62. package/dist/packages/core/src/extensions/clipboardTextSerializer.d.ts +1 -1
  63. package/dist/packages/core/src/extensions/commands.d.ts +19 -15
  64. package/dist/packages/core/src/extensions/editable.d.ts +1 -1
  65. package/dist/packages/core/src/extensions/focusEvents.d.ts +1 -1
  66. package/dist/packages/core/src/extensions/index.d.ts +1 -0
  67. package/dist/packages/core/src/extensions/keymap.d.ts +1 -1
  68. package/dist/packages/core/src/extensions/tabindex.d.ts +2 -0
  69. package/dist/packages/core/src/helpers/createChainableState.d.ts +5 -0
  70. package/dist/packages/core/src/helpers/createDocument.d.ts +3 -0
  71. package/dist/packages/core/src/helpers/createNodeFromContent.d.ts +7 -0
  72. package/dist/packages/core/src/helpers/defaultBlockAt.d.ts +2 -0
  73. package/dist/packages/core/src/helpers/findChildren.d.ts +3 -0
  74. package/dist/packages/core/src/helpers/findChildrenInRange.d.ts +6 -0
  75. package/dist/packages/core/src/helpers/generateHTML.d.ts +2 -2
  76. package/dist/packages/core/src/helpers/generateJSON.d.ts +2 -0
  77. package/dist/packages/core/src/helpers/generateText.d.ts +5 -0
  78. package/dist/packages/core/src/helpers/getAttributes.d.ts +3 -0
  79. package/dist/packages/core/src/helpers/getDebugJSON.d.ts +8 -0
  80. package/dist/packages/core/src/helpers/getExtensionField.d.ts +2 -0
  81. package/dist/packages/core/src/helpers/getHTMLFromFragment.d.ts +2 -2
  82. package/dist/packages/core/src/helpers/getMarkAttributes.d.ts +1 -2
  83. package/dist/packages/core/src/helpers/getMarkRange.d.ts +1 -1
  84. package/dist/packages/core/src/helpers/getNodeAttributes.d.ts +1 -2
  85. package/dist/packages/core/src/helpers/getRenderedAttributes.d.ts +2 -2
  86. package/dist/packages/core/src/helpers/getSchemaByResolvedExtensions.d.ts +3 -0
  87. package/dist/packages/core/src/helpers/getSplittedAttributes.d.ts +2 -2
  88. package/dist/packages/core/src/helpers/getText.d.ts +6 -0
  89. package/dist/packages/core/src/helpers/getTextBetween.d.ts +6 -0
  90. package/dist/packages/core/src/helpers/getTextSeralizersFromSchema.d.ts +3 -0
  91. package/dist/packages/core/src/helpers/isActive.d.ts +1 -2
  92. package/dist/packages/core/src/helpers/isExtensionRulesEnabled.d.ts +2 -0
  93. package/dist/packages/core/src/helpers/isMarkActive.d.ts +1 -2
  94. package/dist/packages/core/src/helpers/isNodeActive.d.ts +1 -2
  95. package/dist/packages/core/src/helpers/posToDOMRect.d.ts +2 -0
  96. package/dist/packages/core/src/helpers/splitExtensions.d.ts +3 -3
  97. package/dist/packages/core/src/index.d.ts +33 -5
  98. package/dist/packages/core/src/inputRules/markInputRule.d.ts +11 -2
  99. package/dist/packages/core/src/inputRules/nodeInputRule.d.ts +11 -2
  100. package/dist/packages/core/src/inputRules/textInputRule.d.ts +9 -0
  101. package/dist/packages/core/src/inputRules/textblockTypeInputRule.d.ts +14 -0
  102. package/dist/packages/core/src/inputRules/wrappingInputRule.d.ts +23 -0
  103. package/dist/packages/core/src/pasteRules/markPasteRule.d.ts +11 -2
  104. package/dist/packages/core/src/pasteRules/textPasteRule.d.ts +9 -0
  105. package/dist/packages/core/src/style.d.ts +1 -1
  106. package/dist/packages/core/src/types.d.ts +105 -52
  107. package/dist/packages/core/src/utilities/callOrReturn.d.ts +2 -1
  108. package/dist/packages/core/src/utilities/deleteProps.d.ts +1 -2
  109. package/dist/packages/core/src/utilities/findDuplicates.d.ts +1 -0
  110. package/dist/packages/core/src/utilities/isClass.d.ts +1 -1
  111. package/dist/packages/core/src/utilities/isEmptyObject.d.ts +1 -1
  112. package/dist/packages/core/src/utilities/isFunction.d.ts +1 -0
  113. package/dist/packages/core/src/utilities/isNumber.d.ts +1 -0
  114. package/dist/packages/core/src/utilities/isObject.d.ts +1 -1
  115. package/dist/packages/core/src/utilities/isPlainObject.d.ts +1 -1
  116. package/dist/packages/core/src/utilities/isRegExp.d.ts +1 -0
  117. package/dist/packages/core/src/utilities/isiOS.d.ts +1 -0
  118. package/dist/packages/core/src/utilities/mergeAttributes.d.ts +1 -2
  119. package/dist/packages/core/src/utilities/mergeDeep.d.ts +1 -2
  120. package/dist/packages/core/src/utilities/objectIncludes.d.ts +3 -2
  121. package/dist/tiptap-core.cjs.js +2723 -1455
  122. package/dist/tiptap-core.cjs.js.map +1 -1
  123. package/dist/tiptap-core.esm.js +3172 -1931
  124. package/dist/tiptap-core.esm.js.map +1 -1
  125. package/dist/tiptap-core.umd.js +3292 -2023
  126. package/dist/tiptap-core.umd.js.map +1 -1
  127. package/package.json +19 -16
  128. package/src/CommandManager.ts +59 -61
  129. package/src/Editor.ts +91 -95
  130. package/src/EventEmitter.ts +14 -4
  131. package/src/Extension.ts +202 -40
  132. package/src/ExtensionManager.ts +234 -70
  133. package/src/InputRule.ts +268 -0
  134. package/src/Mark.ts +248 -46
  135. package/src/Node.ts +275 -51
  136. package/src/NodeView.ts +105 -42
  137. package/src/PasteRule.ts +215 -0
  138. package/src/Tracker.ts +42 -0
  139. package/src/commands/blur.ts +9 -7
  140. package/src/commands/clearContent.ts +3 -3
  141. package/src/commands/clearNodes.ts +25 -19
  142. package/src/commands/command.ts +2 -2
  143. package/src/commands/createParagraphNear.ts +3 -3
  144. package/src/commands/deleteNode.ts +36 -0
  145. package/src/commands/deleteRange.ts +3 -3
  146. package/src/commands/deleteSelection.ts +3 -3
  147. package/src/commands/enter.ts +3 -3
  148. package/src/commands/exitCode.ts +3 -3
  149. package/src/commands/extendMarkRange.ts +8 -8
  150. package/src/commands/first.ts +3 -3
  151. package/src/commands/focus.ts +54 -12
  152. package/src/commands/forEach.ts +24 -0
  153. package/src/commands/insertContent.ts +23 -0
  154. package/src/commands/insertContentAt.ts +93 -0
  155. package/src/commands/joinBackward.ts +3 -3
  156. package/src/commands/joinForward.ts +3 -3
  157. package/src/commands/keyboardShortcut.ts +3 -3
  158. package/src/commands/lift.ts +3 -3
  159. package/src/commands/liftEmptyBlock.ts +3 -3
  160. package/src/commands/liftListItem.ts +3 -3
  161. package/src/commands/newlineInCode.ts +3 -3
  162. package/src/commands/resetAttributes.ts +61 -0
  163. package/src/commands/scrollIntoView.ts +3 -3
  164. package/src/commands/selectAll.ts +8 -6
  165. package/src/commands/selectNodeBackward.ts +3 -3
  166. package/src/commands/selectNodeForward.ts +3 -3
  167. package/src/commands/selectParentNode.ts +3 -3
  168. package/src/commands/setContent.ts +10 -5
  169. package/src/commands/setMark.ts +33 -10
  170. package/src/commands/setMeta.ts +18 -0
  171. package/src/commands/setNode.ts +3 -3
  172. package/src/commands/setNodeSelection.ts +28 -0
  173. package/src/commands/setTextSelection.ts +32 -0
  174. package/src/commands/sinkListItem.ts +3 -3
  175. package/src/commands/splitBlock.ts +13 -8
  176. package/src/commands/splitListItem.ts +39 -13
  177. package/src/commands/toggleList.ts +4 -4
  178. package/src/commands/toggleMark.ts +15 -5
  179. package/src/commands/toggleNode.ts +3 -3
  180. package/src/commands/toggleWrap.ts +3 -3
  181. package/src/commands/undoInputRule.ts +33 -5
  182. package/src/commands/unsetAllMarks.ts +3 -3
  183. package/src/commands/unsetMark.ts +32 -20
  184. package/src/commands/updateAttributes.ts +72 -0
  185. package/src/commands/wrapIn.ts +3 -3
  186. package/src/commands/wrapInList.ts +3 -3
  187. package/src/extensions/clipboardTextSerializer.ts +11 -35
  188. package/src/extensions/commands.ts +27 -21
  189. package/src/extensions/focusEvents.ts +0 -3
  190. package/src/extensions/index.ts +1 -0
  191. package/src/extensions/keymap.ts +6 -6
  192. package/src/extensions/tabindex.ts +19 -0
  193. package/src/helpers/createChainableState.ts +37 -0
  194. package/src/helpers/createDocument.ts +11 -0
  195. package/src/helpers/createNodeFromContent.ts +56 -0
  196. package/src/helpers/defaultBlockAt.ts +13 -0
  197. package/src/helpers/findChildren.ts +17 -0
  198. package/src/helpers/findChildrenInRange.ts +31 -0
  199. package/src/helpers/generateHTML.ts +3 -3
  200. package/src/helpers/generateJSON.ts +13 -0
  201. package/src/helpers/generateText.ts +29 -0
  202. package/src/helpers/getAttributes.ts +27 -0
  203. package/src/helpers/getAttributesFromExtensions.ts +26 -5
  204. package/src/helpers/getDebugJSON.ts +46 -0
  205. package/src/helpers/getExtensionField.ts +25 -0
  206. package/src/helpers/getHTMLFromFragment.ts +5 -5
  207. package/src/helpers/getMarkAttributes.ts +11 -8
  208. package/src/helpers/getMarkRange.ts +34 -6
  209. package/src/helpers/getMarkType.ts +4 -0
  210. package/src/helpers/getMarksBetween.ts +3 -3
  211. package/src/helpers/getNodeAttributes.ts +6 -7
  212. package/src/helpers/getNodeType.ts +4 -0
  213. package/src/helpers/getRenderedAttributes.ts +3 -5
  214. package/src/helpers/getSchema.ts +5 -132
  215. package/src/helpers/getSchemaByResolvedExtensions.ts +147 -0
  216. package/src/helpers/getSchemaTypeByName.ts +1 -9
  217. package/src/helpers/getSplittedAttributes.ts +3 -3
  218. package/src/helpers/getText.ts +18 -0
  219. package/src/helpers/getTextBetween.ts +45 -0
  220. package/src/helpers/getTextSeralizersFromSchema.ts +9 -0
  221. package/src/helpers/injectExtensionAttributesToParseRule.ts +12 -8
  222. package/src/helpers/isActive.ts +1 -2
  223. package/src/helpers/isExtensionRulesEnabled.ts +15 -0
  224. package/src/helpers/isList.ts +11 -4
  225. package/src/helpers/isMarkActive.ts +40 -16
  226. package/src/helpers/isNodeActive.ts +23 -31
  227. package/src/helpers/posToDOMRect.ts +34 -0
  228. package/src/index.ts +35 -5
  229. package/src/inputRules/markInputRule.ts +57 -38
  230. package/src/inputRules/nodeInputRule.ts +43 -11
  231. package/src/inputRules/textInputRule.ts +35 -0
  232. package/src/inputRules/textblockTypeInputRule.ts +37 -0
  233. package/src/inputRules/wrappingInputRule.ts +59 -0
  234. package/src/pasteRules/markPasteRule.ts +61 -53
  235. package/src/pasteRules/textPasteRule.ts +35 -0
  236. package/src/style.ts +15 -0
  237. package/src/types.ts +119 -37
  238. package/src/utilities/callOrReturn.ts +6 -3
  239. package/src/utilities/createStyleTag.ts +7 -0
  240. package/src/utilities/deleteProps.ts +2 -4
  241. package/src/utilities/elementFromString.ts +3 -4
  242. package/src/utilities/findDuplicates.ts +5 -0
  243. package/src/utilities/fromString.ts +1 -1
  244. package/src/utilities/isClass.ts +2 -2
  245. package/src/utilities/isEmptyObject.ts +2 -2
  246. package/src/utilities/isFunction.ts +3 -0
  247. package/src/utilities/isNumber.ts +3 -0
  248. package/src/utilities/isObject.ts +5 -5
  249. package/src/utilities/isPlainObject.ts +5 -5
  250. package/src/utilities/isRegExp.ts +3 -0
  251. package/src/utilities/isString.ts +3 -0
  252. package/src/utilities/isiOS.ts +12 -0
  253. package/src/utilities/mergeAttributes.ts +2 -3
  254. package/src/utilities/mergeDeep.ts +1 -2
  255. package/src/utilities/objectIncludes.ts +17 -5
  256. package/CHANGELOG.md +0 -294
  257. package/dist/packages/core/src/commands/insertHTML.d.ts +0 -12
  258. package/dist/packages/core/src/commands/insertNode.d.ts +0 -13
  259. package/dist/packages/core/src/commands/insertText.d.ts +0 -12
  260. package/dist/packages/core/src/commands/replace.d.ts +0 -13
  261. package/dist/packages/core/src/commands/replaceRange.d.ts +0 -13
  262. package/dist/packages/core/src/commands/resetNodeAttributes.d.ts +0 -13
  263. package/dist/packages/core/src/commands/updateNodeAttributes.d.ts +0 -13
  264. package/dist/packages/core/src/utilities/removeElement.d.ts +0 -1
  265. package/dist/tiptap-core.bundle.umd.min.js +0 -17
  266. package/dist/tiptap-core.bundle.umd.min.js.map +0 -1
  267. package/src/commands/insertHTML.ts +0 -28
  268. package/src/commands/insertNode.ts +0 -31
  269. package/src/commands/insertText.ts +0 -20
  270. package/src/commands/replace.ts +0 -20
  271. package/src/commands/replaceRange.ts +0 -36
  272. package/src/commands/resetNodeAttributes.ts +0 -31
  273. package/src/commands/updateNodeAttributes.ts +0 -33
  274. package/src/utilities/removeElement.ts +0 -5
@@ -1,13 +1,13 @@
1
1
  import { deleteSelection as originalDeleteSelection } from 'prosemirror-commands'
2
- import { Command, RawCommands } from '../types'
2
+ import { RawCommands } from '../types'
3
3
 
4
4
  declare module '@tiptap/core' {
5
- interface Commands {
5
+ interface Commands<ReturnType> {
6
6
  deleteSelection: {
7
7
  /**
8
8
  * Delete the selection, if there is one.
9
9
  */
10
- deleteSelection: () => Command,
10
+ deleteSelection: () => ReturnType,
11
11
  }
12
12
  }
13
13
  }
@@ -1,12 +1,12 @@
1
- import { Command, RawCommands } from '../types'
1
+ import { RawCommands } from '../types'
2
2
 
3
3
  declare module '@tiptap/core' {
4
- interface Commands {
4
+ interface Commands<ReturnType> {
5
5
  enter: {
6
6
  /**
7
7
  * Trigger enter.
8
8
  */
9
- enter: () => Command,
9
+ enter: () => ReturnType,
10
10
  }
11
11
  }
12
12
  }
@@ -1,13 +1,13 @@
1
1
  import { exitCode as originalExitCode } from 'prosemirror-commands'
2
- import { Command, RawCommands } from '../types'
2
+ import { RawCommands } from '../types'
3
3
 
4
4
  declare module '@tiptap/core' {
5
- interface Commands {
5
+ interface Commands<ReturnType> {
6
6
  exitCode: {
7
7
  /**
8
8
  * Exit from a code block.
9
9
  */
10
- exitCode: () => Command,
10
+ exitCode: () => ReturnType,
11
11
  }
12
12
  }
13
13
  }
@@ -1,29 +1,29 @@
1
1
  import { TextSelection } from 'prosemirror-state'
2
2
  import { MarkType } from 'prosemirror-model'
3
- import { Command, RawCommands } from '../types'
3
+ import { RawCommands } from '../types'
4
4
  import getMarkType from '../helpers/getMarkType'
5
5
  import getMarkRange from '../helpers/getMarkRange'
6
6
 
7
7
  declare module '@tiptap/core' {
8
- interface Commands {
8
+ interface Commands<ReturnType> {
9
9
  extendMarkRange: {
10
10
  /**
11
11
  * Extends the text selection to the current mark.
12
12
  */
13
- extendMarkRange: (typeOrName: string | MarkType) => Command,
13
+ extendMarkRange: (typeOrName: string | MarkType, attributes?: Record<string, any>) => ReturnType,
14
14
  }
15
15
  }
16
16
  }
17
17
 
18
- export const extendMarkRange: RawCommands['extendMarkRange'] = typeOrName => ({ tr, state, dispatch }) => {
18
+ export const extendMarkRange: RawCommands['extendMarkRange'] = (typeOrName, attributes = {}) => ({ tr, state, dispatch }) => {
19
19
  const type = getMarkType(typeOrName, state.schema)
20
20
  const { doc, selection } = tr
21
- const { $from, empty } = selection
21
+ const { $from, from, to } = selection
22
22
 
23
- if (empty && dispatch) {
24
- const range = getMarkRange($from, type)
23
+ if (dispatch) {
24
+ const range = getMarkRange($from, type, attributes)
25
25
 
26
- if (range) {
26
+ if (range && range.from <= from && range.to >= to) {
27
27
  const newSelection = TextSelection.create(doc, range.from, range.to)
28
28
 
29
29
  tr.setSelection(newSelection)
@@ -1,12 +1,12 @@
1
- import { Command, RawCommands } from '../types'
1
+ import { Command, CommandProps, RawCommands } from '../types'
2
2
 
3
3
  declare module '@tiptap/core' {
4
- interface Commands {
4
+ interface Commands<ReturnType> {
5
5
  first: {
6
6
  /**
7
7
  * Runs one command after the other and stops at the first which returns true.
8
8
  */
9
- first: (commands: Command[] | ((props: Parameters<Command>[0]) => Command[])) => Command,
9
+ first: (commands: Command[] | ((props: CommandProps) => Command[])) => ReturnType,
10
10
  }
11
11
  }
12
12
  }
@@ -1,7 +1,8 @@
1
- import { EditorState, TextSelection } from 'prosemirror-state'
2
- import { Command, RawCommands, FocusPosition } from '../types'
1
+ import { EditorState, Selection, TextSelection } from 'prosemirror-state'
2
+ import { RawCommands, FocusPosition } from '../types'
3
3
  import minMax from '../utilities/minMax'
4
4
  import isTextSelection from '../helpers/isTextSelection'
5
+ import isiOS from '../utilities/isiOS'
5
6
 
6
7
  function resolveSelection(state: EditorState, position: FocusPosition = null) {
7
8
  if (!position) {
@@ -15,15 +16,22 @@ function resolveSelection(state: EditorState, position: FocusPosition = null) {
15
16
  }
16
17
  }
17
18
 
18
- if (position === 'end') {
19
- const { size } = state.doc.content
19
+ const { size } = state.doc.content
20
20
 
21
+ if (position === 'end') {
21
22
  return {
22
23
  from: size,
23
24
  to: size,
24
25
  }
25
26
  }
26
27
 
28
+ if (position === 'all') {
29
+ return {
30
+ from: 0,
31
+ to: size,
32
+ }
33
+ }
34
+
27
35
  return {
28
36
  from: position,
29
37
  to: position,
@@ -31,41 +39,75 @@ function resolveSelection(state: EditorState, position: FocusPosition = null) {
31
39
  }
32
40
 
33
41
  declare module '@tiptap/core' {
34
- interface Commands {
42
+ interface Commands<ReturnType> {
35
43
  focus: {
36
44
  /**
37
45
  * Focus the editor at the given position.
38
46
  */
39
- focus: (position?: FocusPosition) => Command,
47
+ focus: (
48
+ position?: FocusPosition,
49
+ options?: {
50
+ scrollIntoView?: boolean,
51
+ },
52
+ ) => ReturnType,
40
53
  }
41
54
  }
42
55
  }
43
56
 
44
- export const focus: RawCommands['focus'] = (position = null) => ({
57
+ export const focus: RawCommands['focus'] = (position = null, options) => ({
45
58
  editor,
46
59
  view,
47
60
  tr,
48
61
  dispatch,
49
62
  }) => {
63
+ options = {
64
+ scrollIntoView: true,
65
+ ...options,
66
+ }
67
+
68
+ const delayedFocus = () => {
69
+ // focus within `requestAnimationFrame` breaks focus on iOS
70
+ // so we have to call this
71
+ if (isiOS()) {
72
+ (view.dom as HTMLElement).focus()
73
+ }
74
+
75
+ // For React we have to focus asynchronously. Otherwise wild things happen.
76
+ // see: https://github.com/ueberdosis/tiptap/issues/1520
77
+ requestAnimationFrame(() => {
78
+ if (!editor.isDestroyed) {
79
+ view.focus()
80
+
81
+ if (options?.scrollIntoView) {
82
+ editor.commands.scrollIntoView()
83
+ }
84
+ }
85
+ })
86
+ }
87
+
50
88
  if ((view.hasFocus() && position === null) || position === false) {
51
89
  return true
52
90
  }
53
91
 
54
92
  // we don’t try to resolve a NodeSelection or CellSelection
55
93
  if (dispatch && position === null && !isTextSelection(editor.state.selection)) {
56
- view.focus()
94
+ delayedFocus()
57
95
  return true
58
96
  }
59
97
 
60
98
  const { from, to } = resolveSelection(editor.state, position) || editor.state.selection
61
99
  const { doc, storedMarks } = tr
62
- const resolvedFrom = minMax(from, 0, doc.content.size)
63
- const resolvedEnd = minMax(to, 0, doc.content.size)
100
+ const minPos = Selection.atStart(doc).from
101
+ const maxPos = Selection.atEnd(doc).to
102
+ const resolvedFrom = minMax(from, minPos, maxPos)
103
+ const resolvedEnd = minMax(to, minPos, maxPos)
64
104
  const selection = TextSelection.create(doc, resolvedFrom, resolvedEnd)
65
105
  const isSameSelection = editor.state.selection.eq(selection)
66
106
 
67
107
  if (dispatch) {
68
- tr.setSelection(selection)
108
+ if (!isSameSelection) {
109
+ tr.setSelection(selection)
110
+ }
69
111
 
70
112
  // `tr.setSelection` resets the stored marks
71
113
  // so we’ll restore them if the selection is the same as before
@@ -73,7 +115,7 @@ export const focus: RawCommands['focus'] = (position = null) => ({
73
115
  tr.setStoredMarks(storedMarks)
74
116
  }
75
117
 
76
- view.focus()
118
+ delayedFocus()
77
119
  }
78
120
 
79
121
  return true
@@ -0,0 +1,24 @@
1
+ import { CommandProps, RawCommands } from '../types'
2
+
3
+ declare module '@tiptap/core' {
4
+ interface Commands<ReturnType> {
5
+ forEach: {
6
+ /**
7
+ * Loop through an array of items.
8
+ */
9
+ forEach: <T>(
10
+ items: T[],
11
+ fn: (
12
+ item: T,
13
+ props: CommandProps & {
14
+ index: number,
15
+ },
16
+ ) => boolean,
17
+ ) => ReturnType,
18
+ }
19
+ }
20
+ }
21
+
22
+ export const forEach: RawCommands['forEach'] = (items, fn) => props => {
23
+ return items.every((item, index) => fn(item, { ...props, index }))
24
+ }
@@ -0,0 +1,23 @@
1
+ import { ParseOptions } from 'prosemirror-model'
2
+ import { RawCommands, Content } from '../types'
3
+
4
+ declare module '@tiptap/core' {
5
+ interface Commands<ReturnType> {
6
+ insertContent: {
7
+ /**
8
+ * Insert a node or string of HTML at the current position.
9
+ */
10
+ insertContent: (
11
+ value: Content,
12
+ options?: {
13
+ parseOptions?: ParseOptions,
14
+ updateSelection?: boolean,
15
+ },
16
+ ) => ReturnType,
17
+ }
18
+ }
19
+ }
20
+
21
+ export const insertContent: RawCommands['insertContent'] = (value, options) => ({ tr, commands }) => {
22
+ return commands.insertContentAt({ from: tr.selection.from, to: tr.selection.to }, value, options)
23
+ }
@@ -0,0 +1,93 @@
1
+ import { Fragment, Node as ProseMirrorNode, ParseOptions } from 'prosemirror-model'
2
+ import createNodeFromContent from '../helpers/createNodeFromContent'
3
+ import selectionToInsertionEnd from '../helpers/selectionToInsertionEnd'
4
+ import {
5
+ RawCommands,
6
+ Content,
7
+ Range,
8
+ } from '../types'
9
+
10
+ declare module '@tiptap/core' {
11
+ interface Commands<ReturnType> {
12
+ insertContentAt: {
13
+ /**
14
+ * Insert a node or string of HTML at a specific position.
15
+ */
16
+ insertContentAt: (
17
+ position: number | Range,
18
+ value: Content,
19
+ options?: {
20
+ parseOptions?: ParseOptions,
21
+ updateSelection?: boolean,
22
+ },
23
+ ) => ReturnType,
24
+ }
25
+ }
26
+ }
27
+
28
+ const isFragment = (nodeOrFragment: ProseMirrorNode | Fragment): nodeOrFragment is Fragment => {
29
+ return nodeOrFragment.toString().startsWith('<')
30
+ }
31
+
32
+ export const insertContentAt: RawCommands['insertContentAt'] = (position, value, options) => ({ tr, dispatch, editor }) => {
33
+ if (dispatch) {
34
+ options = {
35
+ parseOptions: {},
36
+ updateSelection: true,
37
+ ...options,
38
+ }
39
+
40
+ const content = createNodeFromContent(value, editor.schema, {
41
+ parseOptions: {
42
+ preserveWhitespace: 'full',
43
+ ...options.parseOptions,
44
+ },
45
+ })
46
+
47
+ // don’t dispatch an empty fragment because this can lead to strange errors
48
+ if (content.toString() === '<>') {
49
+ return true
50
+ }
51
+
52
+ let { from, to } = typeof position === 'number'
53
+ ? { from: position, to: position }
54
+ : position
55
+
56
+ let isOnlyBlockContent = true
57
+ const nodes = isFragment(content)
58
+ ? content
59
+ : [content]
60
+
61
+ nodes.forEach(node => {
62
+ isOnlyBlockContent = isOnlyBlockContent
63
+ ? node.isBlock
64
+ : false
65
+ })
66
+
67
+ // check if we can replace the wrapping node by
68
+ // the newly inserted content
69
+ // example:
70
+ // replace an empty paragraph by an inserted image
71
+ // instead of inserting the image below the paragraph
72
+ if (from === to && isOnlyBlockContent) {
73
+ const { parent } = tr.doc.resolve(from)
74
+ const isEmptyTextBlock = parent.isTextblock
75
+ && !parent.type.spec.code
76
+ && !parent.childCount
77
+
78
+ if (isEmptyTextBlock) {
79
+ from -= 1
80
+ to += 1
81
+ }
82
+ }
83
+
84
+ tr.replaceWith(from, to, content)
85
+
86
+ // set cursor at end of inserted content
87
+ if (options.updateSelection) {
88
+ selectionToInsertionEnd(tr, tr.steps.length - 1, -1)
89
+ }
90
+ }
91
+
92
+ return true
93
+ }
@@ -1,13 +1,13 @@
1
1
  import { joinBackward as originalJoinBackward } from 'prosemirror-commands'
2
- import { Command, RawCommands } from '../types'
2
+ import { RawCommands } from '../types'
3
3
 
4
4
  declare module '@tiptap/core' {
5
- interface Commands {
5
+ interface Commands<ReturnType> {
6
6
  joinBackward: {
7
7
  /**
8
8
  * Join two nodes backward.
9
9
  */
10
- joinBackward: () => Command,
10
+ joinBackward: () => ReturnType,
11
11
  }
12
12
  }
13
13
  }
@@ -1,13 +1,13 @@
1
1
  import { joinForward as originalJoinForward } from 'prosemirror-commands'
2
- import { Command, RawCommands } from '../types'
2
+ import { RawCommands } from '../types'
3
3
 
4
4
  declare module '@tiptap/core' {
5
- interface Commands {
5
+ interface Commands<ReturnType> {
6
6
  joinForward: {
7
7
  /**
8
8
  * Join two nodes forward.
9
9
  */
10
- joinForward: () => Command,
10
+ joinForward: () => ReturnType,
11
11
  }
12
12
  }
13
13
  }
@@ -1,4 +1,4 @@
1
- import { Command, RawCommands } from '../types'
1
+ import { RawCommands } from '../types'
2
2
 
3
3
  const mac = typeof navigator !== 'undefined' ? /Mac/.test(navigator.platform) : false
4
4
 
@@ -57,12 +57,12 @@ function normalizeKeyName(name: string) {
57
57
  }
58
58
 
59
59
  declare module '@tiptap/core' {
60
- interface Commands {
60
+ interface Commands<ReturnType> {
61
61
  keyboardShortcut: {
62
62
  /**
63
63
  * Trigger a keyboard shortcut.
64
64
  */
65
- keyboardShortcut: (name: string) => Command,
65
+ keyboardShortcut: (name: string) => ReturnType,
66
66
  }
67
67
  }
68
68
  }
@@ -1,16 +1,16 @@
1
1
  import { lift as originalLift } from 'prosemirror-commands'
2
2
  import { NodeType } from 'prosemirror-model'
3
- import { Command, RawCommands, AnyObject } from '../types'
3
+ import { RawCommands } from '../types'
4
4
  import isNodeActive from '../helpers/isNodeActive'
5
5
  import getNodeType from '../helpers/getNodeType'
6
6
 
7
7
  declare module '@tiptap/core' {
8
- interface Commands {
8
+ interface Commands<ReturnType> {
9
9
  lift: {
10
10
  /**
11
11
  * Removes an existing wrap.
12
12
  */
13
- lift: (typeOrName: string | NodeType, attributes?: AnyObject) => Command,
13
+ lift: (typeOrName: string | NodeType, attributes?: Record<string, any>) => ReturnType,
14
14
  }
15
15
  }
16
16
  }
@@ -1,13 +1,13 @@
1
1
  import { liftEmptyBlock as originalLiftEmptyBlock } from 'prosemirror-commands'
2
- import { Command, RawCommands } from '../types'
2
+ import { RawCommands } from '../types'
3
3
 
4
4
  declare module '@tiptap/core' {
5
- interface Commands {
5
+ interface Commands<ReturnType> {
6
6
  liftEmptyBlock: {
7
7
  /**
8
8
  * Lift block if empty.
9
9
  */
10
- liftEmptyBlock: () => Command,
10
+ liftEmptyBlock: () => ReturnType,
11
11
  }
12
12
  }
13
13
  }
@@ -1,15 +1,15 @@
1
1
  import { liftListItem as originalLiftListItem } from 'prosemirror-schema-list'
2
2
  import { NodeType } from 'prosemirror-model'
3
- import { Command, RawCommands } from '../types'
3
+ import { RawCommands } from '../types'
4
4
  import getNodeType from '../helpers/getNodeType'
5
5
 
6
6
  declare module '@tiptap/core' {
7
- interface Commands {
7
+ interface Commands<ReturnType> {
8
8
  liftListItem: {
9
9
  /**
10
10
  * Lift the list item into a wrapping list.
11
11
  */
12
- liftListItem: (typeOrName: string | NodeType) => Command,
12
+ liftListItem: (typeOrName: string | NodeType) => ReturnType,
13
13
  }
14
14
  }
15
15
  }
@@ -1,13 +1,13 @@
1
1
  import { newlineInCode as originalNewlineInCode } from 'prosemirror-commands'
2
- import { Command, RawCommands } from '../types'
2
+ import { RawCommands } from '../types'
3
3
 
4
4
  declare module '@tiptap/core' {
5
- interface Commands {
5
+ interface Commands<ReturnType> {
6
6
  newlineInCode: {
7
7
  /**
8
8
  * Add a newline character in code.
9
9
  */
10
- newlineInCode: () => Command,
10
+ newlineInCode: () => ReturnType,
11
11
  }
12
12
  }
13
13
  }
@@ -0,0 +1,61 @@
1
+ import { NodeType, MarkType } from 'prosemirror-model'
2
+ import getNodeType from '../helpers/getNodeType'
3
+ import getMarkType from '../helpers/getMarkType'
4
+ import getSchemaTypeNameByName from '../helpers/getSchemaTypeNameByName'
5
+ import deleteProps from '../utilities/deleteProps'
6
+ import { RawCommands } from '../types'
7
+
8
+ declare module '@tiptap/core' {
9
+ interface Commands<ReturnType> {
10
+ resetAttributes: {
11
+ /**
12
+ * Resets some node attributes to the default value.
13
+ */
14
+ resetAttributes: (typeOrName: string | NodeType | MarkType, attributes: string | string[]) => ReturnType,
15
+ }
16
+ }
17
+ }
18
+
19
+ export const resetAttributes: RawCommands['resetAttributes'] = (typeOrName, attributes) => ({ tr, state, dispatch }) => {
20
+ let nodeType: NodeType | null = null
21
+ let markType: MarkType | null = null
22
+
23
+ const schemaType = getSchemaTypeNameByName(
24
+ typeof typeOrName === 'string'
25
+ ? typeOrName
26
+ : typeOrName.name,
27
+ state.schema,
28
+ )
29
+
30
+ if (!schemaType) {
31
+ return false
32
+ }
33
+
34
+ if (schemaType === 'node') {
35
+ nodeType = getNodeType(typeOrName as NodeType, state.schema)
36
+ }
37
+
38
+ if (schemaType === 'mark') {
39
+ markType = getMarkType(typeOrName as MarkType, state.schema)
40
+ }
41
+
42
+ if (dispatch) {
43
+ tr.selection.ranges.forEach(range => {
44
+ state.doc.nodesBetween(range.$from.pos, range.$to.pos, (node, pos) => {
45
+ if (nodeType && nodeType === node.type) {
46
+ tr.setNodeMarkup(pos, undefined, deleteProps(node.attrs, attributes))
47
+ }
48
+
49
+ if (markType && node.marks.length) {
50
+ node.marks.forEach(mark => {
51
+ if (markType === mark.type) {
52
+ tr.addMark(pos, pos + node.nodeSize, markType.create(deleteProps(mark.attrs, attributes)))
53
+ }
54
+ })
55
+ }
56
+ })
57
+ })
58
+ }
59
+
60
+ return true
61
+ }
@@ -1,12 +1,12 @@
1
- import { Command, RawCommands } from '../types'
1
+ import { RawCommands } from '../types'
2
2
 
3
3
  declare module '@tiptap/core' {
4
- interface Commands {
4
+ interface Commands<ReturnType> {
5
5
  scrollIntoView: {
6
6
  /**
7
7
  * Scroll the selection into view.
8
8
  */
9
- scrollIntoView: () => Command,
9
+ scrollIntoView: () => ReturnType,
10
10
  }
11
11
  }
12
12
  }
@@ -1,17 +1,19 @@
1
- import { selectAll as originalSelectAll } from 'prosemirror-commands'
2
- import { Command, RawCommands } from '../types'
1
+ import { RawCommands } from '../types'
3
2
 
4
3
  declare module '@tiptap/core' {
5
- interface Commands {
4
+ interface Commands<ReturnType> {
6
5
  selectAll: {
7
6
  /**
8
7
  * Select the whole document.
9
8
  */
10
- selectAll: () => Command,
9
+ selectAll: () => ReturnType,
11
10
  }
12
11
  }
13
12
  }
14
13
 
15
- export const selectAll: RawCommands['selectAll'] = () => ({ state, dispatch }) => {
16
- return originalSelectAll(state, dispatch)
14
+ export const selectAll: RawCommands['selectAll'] = () => ({ tr, commands }) => {
15
+ return commands.setTextSelection({
16
+ from: 0,
17
+ to: tr.doc.content.size,
18
+ })
17
19
  }
@@ -1,13 +1,13 @@
1
1
  import { selectNodeBackward as originalSelectNodeBackward } from 'prosemirror-commands'
2
- import { Command, RawCommands } from '../types'
2
+ import { RawCommands } from '../types'
3
3
 
4
4
  declare module '@tiptap/core' {
5
- interface Commands {
5
+ interface Commands<ReturnType> {
6
6
  selectNodeBackward: {
7
7
  /**
8
8
  * Select a node backward.
9
9
  */
10
- selectNodeBackward: () => Command,
10
+ selectNodeBackward: () => ReturnType,
11
11
  }
12
12
  }
13
13
  }
@@ -1,13 +1,13 @@
1
1
  import { selectNodeForward as originalSelectNodeForward } from 'prosemirror-commands'
2
- import { Command, RawCommands } from '../types'
2
+ import { RawCommands } from '../types'
3
3
 
4
4
  declare module '@tiptap/core' {
5
- interface Commands {
5
+ interface Commands<ReturnType> {
6
6
  selectNodeForward: {
7
7
  /**
8
8
  * Select a node forward.
9
9
  */
10
- selectNodeForward: () => Command,
10
+ selectNodeForward: () => ReturnType,
11
11
  }
12
12
  }
13
13
  }
@@ -1,13 +1,13 @@
1
1
  import { selectParentNode as originalSelectParentNode } from 'prosemirror-commands'
2
- import { Command, RawCommands } from '../types'
2
+ import { RawCommands } from '../types'
3
3
 
4
4
  declare module '@tiptap/core' {
5
- interface Commands {
5
+ interface Commands<ReturnType> {
6
6
  selectParentNode: {
7
7
  /**
8
8
  * Select the parent node.
9
9
  */
10
- selectParentNode: () => Command,
10
+ selectParentNode: () => ReturnType,
11
11
  }
12
12
  }
13
13
  }