@tiptap/core 2.0.0-beta.17 → 2.0.0-beta.170

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 (318) hide show
  1. package/LICENSE.md +1 -1
  2. package/README.md +2 -2
  3. package/dist/packages/core/src/CommandManager.d.ts +13 -6
  4. package/dist/packages/core/src/Editor.d.ts +23 -18
  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 +7 -12
  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 +160 -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 +7 -3
  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/selectTextblockEnd.d.ts +12 -0
  44. package/dist/packages/core/src/commands/selectTextblockStart.d.ts +12 -0
  45. package/dist/packages/core/src/commands/setContent.d.ts +4 -3
  46. package/dist/packages/core/src/commands/setMark.d.ts +3 -3
  47. package/dist/packages/core/src/commands/setMeta.d.ts +12 -0
  48. package/dist/packages/core/src/commands/setNode.d.ts +3 -3
  49. package/dist/packages/core/src/commands/setNodeSelection.d.ts +12 -0
  50. package/dist/packages/core/src/commands/setTextSelection.d.ts +12 -0
  51. package/dist/packages/core/src/commands/sinkListItem.d.ts +3 -3
  52. package/dist/packages/core/src/commands/splitBlock.d.ts +3 -3
  53. package/dist/packages/core/src/commands/splitListItem.d.ts +3 -3
  54. package/dist/packages/core/src/commands/toggleList.d.ts +3 -3
  55. package/dist/packages/core/src/commands/toggleMark.d.ts +8 -3
  56. package/dist/packages/core/src/commands/toggleNode.d.ts +3 -3
  57. package/dist/packages/core/src/commands/toggleWrap.d.ts +3 -3
  58. package/dist/packages/core/src/commands/undoInputRule.d.ts +3 -3
  59. package/dist/packages/core/src/commands/unsetAllMarks.d.ts +3 -3
  60. package/dist/packages/core/src/commands/unsetMark.d.ts +8 -3
  61. package/dist/packages/core/src/commands/updateAttributes.d.ts +13 -0
  62. package/dist/packages/core/src/commands/wrapIn.d.ts +3 -3
  63. package/dist/packages/core/src/commands/wrapInList.d.ts +3 -3
  64. package/dist/packages/core/src/extensions/clipboardTextSerializer.d.ts +1 -1
  65. package/dist/packages/core/src/extensions/commands.d.ts +21 -15
  66. package/dist/packages/core/src/extensions/editable.d.ts +1 -1
  67. package/dist/packages/core/src/extensions/focusEvents.d.ts +1 -1
  68. package/dist/packages/core/src/extensions/index.d.ts +1 -0
  69. package/dist/packages/core/src/extensions/keymap.d.ts +1 -1
  70. package/dist/packages/core/src/extensions/tabindex.d.ts +2 -0
  71. package/dist/packages/core/src/helpers/combineTransactionSteps.d.ts +7 -0
  72. package/dist/packages/core/src/helpers/createChainableState.d.ts +5 -0
  73. package/dist/packages/core/src/helpers/createDocument.d.ts +3 -4
  74. package/dist/packages/core/src/helpers/createNodeFromContent.d.ts +4 -5
  75. package/dist/packages/core/src/helpers/defaultBlockAt.d.ts +2 -0
  76. package/dist/packages/core/src/helpers/findChildren.d.ts +3 -0
  77. package/dist/packages/core/src/helpers/findChildrenInRange.d.ts +6 -0
  78. package/dist/packages/core/src/helpers/findParentNode.d.ts +1 -1
  79. package/dist/packages/core/src/helpers/findParentNodeClosestToPos.d.ts +1 -1
  80. package/dist/packages/core/src/helpers/generateHTML.d.ts +2 -2
  81. package/dist/packages/core/src/helpers/generateJSON.d.ts +2 -0
  82. package/dist/packages/core/src/helpers/generateText.d.ts +5 -0
  83. package/dist/packages/core/src/helpers/getAttributes.d.ts +3 -0
  84. package/dist/packages/core/src/helpers/getAttributesFromExtensions.d.ts +1 -1
  85. package/dist/packages/core/src/helpers/getChangedRanges.d.ts +11 -0
  86. package/dist/packages/core/src/helpers/getDebugJSON.d.ts +8 -0
  87. package/dist/packages/core/src/helpers/getExtensionField.d.ts +2 -0
  88. package/dist/packages/core/src/helpers/getHTMLFromFragment.d.ts +2 -2
  89. package/dist/packages/core/src/helpers/getMarkAttributes.d.ts +1 -2
  90. package/dist/packages/core/src/helpers/getMarkRange.d.ts +1 -1
  91. package/dist/packages/core/src/helpers/getMarkType.d.ts +1 -1
  92. package/dist/packages/core/src/helpers/getMarksBetween.d.ts +2 -2
  93. package/dist/packages/core/src/helpers/getNodeAttributes.d.ts +1 -2
  94. package/dist/packages/core/src/helpers/getNodeType.d.ts +1 -1
  95. package/dist/packages/core/src/helpers/getRenderedAttributes.d.ts +2 -2
  96. package/dist/packages/core/src/helpers/getSchema.d.ts +1 -1
  97. package/dist/packages/core/src/helpers/getSchemaByResolvedExtensions.d.ts +3 -0
  98. package/dist/packages/core/src/helpers/getSchemaTypeByName.d.ts +1 -1
  99. package/dist/packages/core/src/helpers/getSchemaTypeNameByName.d.ts +1 -1
  100. package/dist/packages/core/src/helpers/getSplittedAttributes.d.ts +2 -2
  101. package/dist/packages/core/src/helpers/getText.d.ts +6 -0
  102. package/dist/packages/core/src/helpers/getTextBetween.d.ts +6 -0
  103. package/dist/packages/core/src/helpers/getTextSeralizersFromSchema.d.ts +3 -0
  104. package/dist/packages/core/src/helpers/injectExtensionAttributesToParseRule.d.ts +1 -1
  105. package/dist/packages/core/src/helpers/isActive.d.ts +1 -2
  106. package/dist/packages/core/src/helpers/isExtensionRulesEnabled.d.ts +2 -0
  107. package/dist/packages/core/src/helpers/isList.d.ts +1 -1
  108. package/dist/packages/core/src/helpers/isMarkActive.d.ts +1 -2
  109. package/dist/packages/core/src/helpers/isNodeActive.d.ts +1 -2
  110. package/dist/packages/core/src/helpers/isNodeEmpty.d.ts +1 -1
  111. package/dist/packages/core/src/helpers/isNodeSelection.d.ts +1 -1
  112. package/dist/packages/core/src/helpers/isTextSelection.d.ts +1 -1
  113. package/dist/packages/core/src/helpers/posToDOMRect.d.ts +2 -0
  114. package/dist/packages/core/src/helpers/resolveFocusPosition.d.ts +4 -0
  115. package/dist/packages/core/src/helpers/selectionToInsertionEnd.d.ts +1 -1
  116. package/dist/packages/core/src/helpers/splitExtensions.d.ts +4 -4
  117. package/dist/packages/core/src/index.d.ts +51 -20
  118. package/dist/packages/core/src/inputRules/markInputRule.d.ts +11 -2
  119. package/dist/packages/core/src/inputRules/nodeInputRule.d.ts +11 -2
  120. package/dist/packages/core/src/inputRules/textInputRule.d.ts +9 -0
  121. package/dist/packages/core/src/inputRules/textblockTypeInputRule.d.ts +14 -0
  122. package/dist/packages/core/src/inputRules/wrappingInputRule.d.ts +23 -0
  123. package/dist/packages/core/src/pasteRules/markPasteRule.d.ts +11 -2
  124. package/dist/packages/core/src/pasteRules/textPasteRule.d.ts +9 -0
  125. package/dist/packages/core/src/style.d.ts +1 -2
  126. package/dist/packages/core/src/types.d.ts +105 -52
  127. package/dist/packages/core/src/utilities/callOrReturn.d.ts +2 -1
  128. package/dist/packages/core/src/utilities/createStyleTag.d.ts +1 -1
  129. package/dist/packages/core/src/utilities/deleteProps.d.ts +1 -2
  130. package/dist/packages/core/src/utilities/elementFromString.d.ts +1 -1
  131. package/dist/packages/core/src/utilities/escapeForRegEx.d.ts +1 -0
  132. package/dist/packages/core/src/utilities/findDuplicates.d.ts +1 -0
  133. package/dist/packages/core/src/utilities/fromString.d.ts +1 -1
  134. package/dist/packages/core/src/utilities/isClass.d.ts +1 -1
  135. package/dist/packages/core/src/utilities/isEmptyObject.d.ts +1 -1
  136. package/dist/packages/core/src/utilities/isFunction.d.ts +1 -0
  137. package/dist/packages/core/src/utilities/isMacOS.d.ts +1 -0
  138. package/dist/packages/core/src/utilities/isNumber.d.ts +1 -0
  139. package/dist/packages/core/src/utilities/isObject.d.ts +1 -1
  140. package/dist/packages/core/src/utilities/isPlainObject.d.ts +1 -1
  141. package/dist/packages/core/src/utilities/isRegExp.d.ts +1 -0
  142. package/dist/packages/core/src/utilities/isiOS.d.ts +1 -0
  143. package/dist/packages/core/src/utilities/mergeAttributes.d.ts +1 -2
  144. package/dist/packages/core/src/utilities/mergeDeep.d.ts +1 -2
  145. package/dist/packages/core/src/utilities/minMax.d.ts +1 -1
  146. package/dist/packages/core/src/utilities/objectIncludes.d.ts +3 -2
  147. package/dist/packages/core/src/utilities/removeDuplicates.d.ts +8 -0
  148. package/dist/tiptap-core.cjs.js +3572 -2041
  149. package/dist/tiptap-core.cjs.js.map +1 -1
  150. package/dist/tiptap-core.esm.js +3544 -2044
  151. package/dist/tiptap-core.esm.js.map +1 -1
  152. package/dist/tiptap-core.umd.js +3430 -1898
  153. package/dist/tiptap-core.umd.js.map +1 -1
  154. package/package.json +20 -16
  155. package/src/CommandManager.ts +60 -62
  156. package/src/Editor.ts +109 -74
  157. package/src/EventEmitter.ts +14 -4
  158. package/src/Extension.ts +196 -41
  159. package/src/ExtensionManager.ts +242 -78
  160. package/src/InputRule.ts +268 -0
  161. package/src/Mark.ts +242 -47
  162. package/src/Node.ts +279 -52
  163. package/src/NodeView.ts +105 -42
  164. package/src/PasteRule.ts +246 -0
  165. package/src/Tracker.ts +42 -0
  166. package/src/commands/blur.ts +12 -6
  167. package/src/commands/clearContent.ts +3 -3
  168. package/src/commands/clearNodes.ts +29 -18
  169. package/src/commands/command.ts +2 -2
  170. package/src/commands/createParagraphNear.ts +3 -3
  171. package/src/commands/deleteNode.ts +36 -0
  172. package/src/commands/deleteRange.ts +3 -3
  173. package/src/commands/deleteSelection.ts +3 -3
  174. package/src/commands/enter.ts +3 -3
  175. package/src/commands/exitCode.ts +3 -3
  176. package/src/commands/extendMarkRange.ts +10 -10
  177. package/src/commands/first.ts +3 -3
  178. package/src/commands/focus.ts +45 -44
  179. package/src/commands/forEach.ts +24 -0
  180. package/src/commands/insertContent.ts +12 -24
  181. package/src/commands/insertContentAt.ts +107 -0
  182. package/src/commands/joinBackward.ts +3 -3
  183. package/src/commands/joinForward.ts +3 -3
  184. package/src/commands/keyboardShortcut.ts +6 -6
  185. package/src/commands/lift.ts +5 -5
  186. package/src/commands/liftEmptyBlock.ts +3 -3
  187. package/src/commands/liftListItem.ts +4 -4
  188. package/src/commands/newlineInCode.ts +3 -3
  189. package/src/commands/resetAttributes.ts +61 -0
  190. package/src/commands/scrollIntoView.ts +3 -3
  191. package/src/commands/selectAll.ts +8 -6
  192. package/src/commands/selectNodeBackward.ts +3 -3
  193. package/src/commands/selectNodeForward.ts +3 -3
  194. package/src/commands/selectParentNode.ts +3 -3
  195. package/src/commands/selectTextblockEnd.ts +19 -0
  196. package/src/commands/selectTextblockStart.ts +19 -0
  197. package/src/commands/setContent.ts +7 -11
  198. package/src/commands/setMark.ts +35 -12
  199. package/src/commands/setMeta.ts +18 -0
  200. package/src/commands/setNode.ts +27 -6
  201. package/src/commands/setNodeSelection.ts +28 -0
  202. package/src/commands/setTextSelection.ts +32 -0
  203. package/src/commands/sinkListItem.ts +4 -4
  204. package/src/commands/splitBlock.ts +14 -9
  205. package/src/commands/splitListItem.ts +41 -15
  206. package/src/commands/toggleList.ts +82 -18
  207. package/src/commands/toggleMark.ts +17 -7
  208. package/src/commands/toggleNode.ts +5 -5
  209. package/src/commands/toggleWrap.ts +8 -9
  210. package/src/commands/undoInputRule.ts +34 -5
  211. package/src/commands/unsetAllMarks.ts +7 -11
  212. package/src/commands/unsetMark.ts +34 -22
  213. package/src/commands/updateAttributes.ts +72 -0
  214. package/src/commands/wrapIn.ts +4 -10
  215. package/src/commands/wrapInList.ts +4 -4
  216. package/src/extensions/clipboardTextSerializer.ts +13 -35
  217. package/src/extensions/commands.ts +30 -21
  218. package/src/extensions/focusEvents.ts +0 -3
  219. package/src/extensions/index.ts +1 -0
  220. package/src/extensions/keymap.ts +111 -13
  221. package/src/extensions/tabindex.ts +19 -0
  222. package/src/helpers/combineTransactionSteps.ts +18 -0
  223. package/src/helpers/createChainableState.ts +37 -0
  224. package/src/helpers/createDocument.ts +5 -7
  225. package/src/helpers/createNodeFromContent.ts +15 -18
  226. package/src/helpers/defaultBlockAt.ts +13 -0
  227. package/src/helpers/findChildren.ts +17 -0
  228. package/src/helpers/findChildrenInRange.ts +31 -0
  229. package/src/helpers/findParentNode.ts +2 -2
  230. package/src/helpers/findParentNodeClosestToPos.ts +1 -1
  231. package/src/helpers/generateHTML.ts +5 -5
  232. package/src/helpers/generateJSON.ts +13 -0
  233. package/src/helpers/generateText.ts +29 -0
  234. package/src/helpers/getAttributes.ts +27 -0
  235. package/src/helpers/getAttributesFromExtensions.ts +28 -7
  236. package/src/helpers/getChangedRanges.ts +82 -0
  237. package/src/helpers/getDebugJSON.ts +53 -0
  238. package/src/helpers/getExtensionField.ts +25 -0
  239. package/src/helpers/getHTMLFromFragment.ts +6 -5
  240. package/src/helpers/getMarkAttributes.ts +12 -9
  241. package/src/helpers/getMarkRange.ts +34 -6
  242. package/src/helpers/getMarkType.ts +5 -1
  243. package/src/helpers/getMarksBetween.ts +31 -10
  244. package/src/helpers/getNodeAttributes.ts +7 -8
  245. package/src/helpers/getNodeType.ts +5 -1
  246. package/src/helpers/getRenderedAttributes.ts +4 -6
  247. package/src/helpers/getSchema.ts +6 -133
  248. package/src/helpers/getSchemaByResolvedExtensions.ts +147 -0
  249. package/src/helpers/getSchemaTypeByName.ts +2 -10
  250. package/src/helpers/getSchemaTypeNameByName.ts +1 -1
  251. package/src/helpers/getSplittedAttributes.ts +4 -4
  252. package/src/helpers/getText.ts +18 -0
  253. package/src/helpers/getTextBetween.ts +45 -0
  254. package/src/helpers/getTextSeralizersFromSchema.ts +9 -0
  255. package/src/helpers/injectExtensionAttributesToParseRule.ts +15 -17
  256. package/src/helpers/isActive.ts +4 -5
  257. package/src/helpers/isExtensionRulesEnabled.ts +15 -0
  258. package/src/helpers/isList.ts +14 -7
  259. package/src/helpers/isMarkActive.ts +43 -19
  260. package/src/helpers/isNodeActive.ts +26 -34
  261. package/src/helpers/isNodeEmpty.ts +1 -1
  262. package/src/helpers/isNodeSelection.ts +2 -2
  263. package/src/helpers/isTextSelection.ts +2 -2
  264. package/src/helpers/posToDOMRect.ts +34 -0
  265. package/src/helpers/resolveFocusPosition.ts +34 -0
  266. package/src/helpers/selectionToInsertionEnd.ts +1 -1
  267. package/src/helpers/splitExtensions.ts +1 -1
  268. package/src/index.ts +53 -20
  269. package/src/inputRules/markInputRule.ts +58 -39
  270. package/src/inputRules/nodeInputRule.ts +44 -11
  271. package/src/inputRules/textInputRule.ts +35 -0
  272. package/src/inputRules/textblockTypeInputRule.ts +37 -0
  273. package/src/inputRules/wrappingInputRule.ts +59 -0
  274. package/src/pasteRules/markPasteRule.ts +61 -53
  275. package/src/pasteRules/textPasteRule.ts +35 -0
  276. package/src/style.ts +16 -3
  277. package/src/types.ts +119 -37
  278. package/src/utilities/callOrReturn.ts +6 -3
  279. package/src/utilities/createStyleTag.ts +8 -1
  280. package/src/utilities/deleteProps.ts +2 -4
  281. package/src/utilities/elementFromString.ts +4 -5
  282. package/src/utilities/escapeForRegEx.ts +4 -0
  283. package/src/utilities/findDuplicates.ts +5 -0
  284. package/src/utilities/fromString.ts +2 -2
  285. package/src/utilities/isClass.ts +2 -2
  286. package/src/utilities/isEmptyObject.ts +2 -2
  287. package/src/utilities/isFunction.ts +3 -0
  288. package/src/utilities/isMacOS.ts +5 -0
  289. package/src/utilities/isNumber.ts +3 -0
  290. package/src/utilities/isObject.ts +6 -6
  291. package/src/utilities/isPlainObject.ts +8 -5
  292. package/src/utilities/isRegExp.ts +3 -0
  293. package/src/utilities/isString.ts +3 -0
  294. package/src/utilities/isiOS.ts +12 -0
  295. package/src/utilities/mergeAttributes.ts +2 -3
  296. package/src/utilities/mergeDeep.ts +2 -3
  297. package/src/utilities/minMax.ts +1 -1
  298. package/src/utilities/objectIncludes.ts +17 -5
  299. package/src/utilities/removeDuplicates.ts +15 -0
  300. package/CHANGELOG.md +0 -324
  301. package/dist/packages/core/src/commands/insertHTML.d.ts +0 -12
  302. package/dist/packages/core/src/commands/insertNode.d.ts +0 -13
  303. package/dist/packages/core/src/commands/insertText.d.ts +0 -12
  304. package/dist/packages/core/src/commands/replace.d.ts +0 -13
  305. package/dist/packages/core/src/commands/replaceRange.d.ts +0 -13
  306. package/dist/packages/core/src/commands/resetNodeAttributes.d.ts +0 -13
  307. package/dist/packages/core/src/commands/updateNodeAttributes.d.ts +0 -13
  308. package/dist/packages/core/src/utilities/removeElement.d.ts +0 -1
  309. package/dist/tiptap-core.bundle.umd.min.js +0 -17
  310. package/dist/tiptap-core.bundle.umd.min.js.map +0 -1
  311. package/src/commands/insertHTML.ts +0 -30
  312. package/src/commands/insertNode.ts +0 -33
  313. package/src/commands/insertText.ts +0 -22
  314. package/src/commands/replace.ts +0 -20
  315. package/src/commands/replaceRange.ts +0 -36
  316. package/src/commands/resetNodeAttributes.ts +0 -31
  317. package/src/commands/updateNodeAttributes.ts +0 -33
  318. package/src/utilities/removeElement.ts +0 -5
@@ -0,0 +1,36 @@
1
+ import { NodeType } from 'prosemirror-model'
2
+ import { getNodeType } from '../helpers/getNodeType'
3
+ import { RawCommands } from '../types'
4
+
5
+ declare module '@tiptap/core' {
6
+ interface Commands<ReturnType> {
7
+ deleteNode: {
8
+ /**
9
+ * Delete a node.
10
+ */
11
+ deleteNode: (typeOrName: string | NodeType) => ReturnType,
12
+ }
13
+ }
14
+ }
15
+
16
+ export const deleteNode: RawCommands['deleteNode'] = typeOrName => ({ tr, state, dispatch }) => {
17
+ const type = getNodeType(typeOrName, state.schema)
18
+ const $pos = tr.selection.$anchor
19
+
20
+ for (let depth = $pos.depth; depth > 0; depth -= 1) {
21
+ const node = $pos.node(depth)
22
+
23
+ if (node.type === type) {
24
+ if (dispatch) {
25
+ const from = $pos.before(depth)
26
+ const to = $pos.after(depth)
27
+
28
+ tr.delete(from, to).scrollIntoView()
29
+ }
30
+
31
+ return true
32
+ }
33
+ }
34
+
35
+ return false
36
+ }
@@ -1,12 +1,12 @@
1
- import { Command, RawCommands, Range } from '../types'
1
+ import { RawCommands, Range } from '../types'
2
2
 
3
3
  declare module '@tiptap/core' {
4
- interface Commands {
4
+ interface Commands<ReturnType> {
5
5
  deleteRange: {
6
6
  /**
7
7
  * Delete a given range.
8
8
  */
9
- deleteRange: (range: Range) => Command,
9
+ deleteRange: (range: Range) => ReturnType,
10
10
  }
11
11
  }
12
12
  }
@@ -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'
4
- import getMarkType from '../helpers/getMarkType'
5
- import getMarkRange from '../helpers/getMarkRange'
3
+ import { RawCommands } from '../types'
4
+ import { getMarkType } from '../helpers/getMarkType'
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,79 +1,80 @@
1
- import { EditorState, TextSelection } from 'prosemirror-state'
2
- import { Command, RawCommands, FocusPosition } from '../types'
3
- import minMax from '../utilities/minMax'
4
- import isTextSelection from '../helpers/isTextSelection'
5
-
6
- function resolveSelection(state: EditorState, position: FocusPosition = null) {
7
- if (!position) {
8
- return null
9
- }
10
-
11
- if (position === 'start' || position === true) {
12
- return {
13
- from: 0,
14
- to: 0,
15
- }
16
- }
17
-
18
- if (position === 'end') {
19
- const { size } = state.doc.content
20
-
21
- return {
22
- from: size,
23
- to: size,
24
- }
25
- }
26
-
27
- return {
28
- from: position,
29
- to: position,
30
- }
31
- }
1
+ import { RawCommands, FocusPosition } from '../types'
2
+ import { isTextSelection } from '../helpers/isTextSelection'
3
+ import { isiOS } from '../utilities/isiOS'
4
+ import { resolveFocusPosition } from '../helpers/resolveFocusPosition'
32
5
 
33
6
  declare module '@tiptap/core' {
34
- interface Commands {
7
+ interface Commands<ReturnType> {
35
8
  focus: {
36
9
  /**
37
10
  * Focus the editor at the given position.
38
11
  */
39
- focus: (position?: FocusPosition) => Command,
12
+ focus: (
13
+ position?: FocusPosition,
14
+ options?: {
15
+ scrollIntoView?: boolean,
16
+ },
17
+ ) => ReturnType,
40
18
  }
41
19
  }
42
20
  }
43
21
 
44
- export const focus: RawCommands['focus'] = (position = null) => ({
22
+ export const focus: RawCommands['focus'] = (position = null, options) => ({
45
23
  editor,
46
24
  view,
47
25
  tr,
48
26
  dispatch,
49
27
  }) => {
28
+ options = {
29
+ scrollIntoView: true,
30
+ ...options,
31
+ }
32
+
33
+ const delayedFocus = () => {
34
+ // focus within `requestAnimationFrame` breaks focus on iOS
35
+ // so we have to call this
36
+ if (isiOS()) {
37
+ (view.dom as HTMLElement).focus()
38
+ }
39
+
40
+ // For React we have to focus asynchronously. Otherwise wild things happen.
41
+ // see: https://github.com/ueberdosis/tiptap/issues/1520
42
+ requestAnimationFrame(() => {
43
+ if (!editor.isDestroyed) {
44
+ view.focus()
45
+
46
+ if (options?.scrollIntoView) {
47
+ editor.commands.scrollIntoView()
48
+ }
49
+ }
50
+ })
51
+ }
52
+
50
53
  if ((view.hasFocus() && position === null) || position === false) {
51
54
  return true
52
55
  }
53
56
 
54
57
  // we don’t try to resolve a NodeSelection or CellSelection
55
58
  if (dispatch && position === null && !isTextSelection(editor.state.selection)) {
56
- view.focus()
59
+ delayedFocus()
57
60
  return true
58
61
  }
59
62
 
60
- const { from, to } = resolveSelection(editor.state, position) || editor.state.selection
61
- const { doc, storedMarks } = tr
62
- const resolvedFrom = minMax(from, 0, doc.content.size)
63
- const resolvedEnd = minMax(to, 0, doc.content.size)
64
- const selection = TextSelection.create(doc, resolvedFrom, resolvedEnd)
63
+ const selection = resolveFocusPosition(editor.state.doc, position) || editor.state.selection
65
64
  const isSameSelection = editor.state.selection.eq(selection)
66
65
 
67
66
  if (dispatch) {
68
- tr.setSelection(selection)
67
+ if (!isSameSelection) {
68
+ tr.setSelection(selection)
69
+ }
69
70
 
70
71
  // `tr.setSelection` resets the stored marks
71
72
  // so we’ll restore them if the selection is the same as before
72
- if (isSameSelection && storedMarks) {
73
- tr.setStoredMarks(storedMarks)
73
+ if (isSameSelection && tr.storedMarks) {
74
+ tr.setStoredMarks(tr.storedMarks)
74
75
  }
75
76
 
76
- view.focus()
77
+ delayedFocus()
77
78
  }
78
79
 
79
80
  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
+ }
@@ -1,35 +1,23 @@
1
- import createNodeFromContent from '../helpers/createNodeFromContent'
2
- import selectionToInsertionEnd from '../helpers/selectionToInsertionEnd'
3
- import { Command, RawCommands, Content } from '../types'
1
+ import { ParseOptions } from 'prosemirror-model'
2
+ import { RawCommands, Content } from '../types'
4
3
 
5
4
  declare module '@tiptap/core' {
6
- interface Commands {
5
+ interface Commands<ReturnType> {
7
6
  insertContent: {
8
7
  /**
9
8
  * Insert a node or string of HTML at the current position.
10
9
  */
11
- insertContent: (value: Content) => Command,
10
+ insertContent: (
11
+ value: Content,
12
+ options?: {
13
+ parseOptions?: ParseOptions,
14
+ updateSelection?: boolean,
15
+ },
16
+ ) => ReturnType,
12
17
  }
13
18
  }
14
19
  }
15
20
 
16
- export const insertContent: RawCommands['insertContent'] = value => ({ tr, dispatch, editor }) => {
17
- if (dispatch) {
18
- const content = createNodeFromContent(value, editor.schema)
19
-
20
- if (typeof content === 'string') {
21
- tr.insertText(content)
22
-
23
- return true
24
- }
25
-
26
- if (!tr.selection.empty) {
27
- tr.deleteSelection()
28
- }
29
-
30
- tr.insert(tr.selection.anchor, content)
31
- selectionToInsertionEnd(tr, tr.steps.length - 1, -1)
32
- }
33
-
34
- return true
21
+ export const insertContent: RawCommands['insertContent'] = (value, options) => ({ tr, commands }) => {
22
+ return commands.insertContentAt({ from: tr.selection.from, to: tr.selection.to }, value, options)
35
23
  }
@@ -0,0 +1,107 @@
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 isOnlyTextContent = true
57
+ let isOnlyBlockContent = true
58
+ const nodes = isFragment(content)
59
+ ? content
60
+ : [content]
61
+
62
+ nodes.forEach(node => {
63
+ // check if added node is valid
64
+ node.check()
65
+
66
+ isOnlyTextContent = isOnlyTextContent
67
+ ? node.isText && node.marks.length === 0
68
+ : false
69
+
70
+ isOnlyBlockContent = isOnlyBlockContent
71
+ ? node.isBlock
72
+ : false
73
+ })
74
+
75
+ // check if we can replace the wrapping node by
76
+ // the newly inserted content
77
+ // example:
78
+ // replace an empty paragraph by an inserted image
79
+ // instead of inserting the image below the paragraph
80
+ if (from === to && isOnlyBlockContent) {
81
+ const { parent } = tr.doc.resolve(from)
82
+ const isEmptyTextBlock = parent.isTextblock
83
+ && !parent.type.spec.code
84
+ && !parent.childCount
85
+
86
+ if (isEmptyTextBlock) {
87
+ from -= 1
88
+ to += 1
89
+ }
90
+ }
91
+
92
+ // if there is only plain text we have to use `insertText`
93
+ // because this will keep the current marks
94
+ if (isOnlyTextContent) {
95
+ tr.insertText(value as string, from, to)
96
+ } else {
97
+ tr.replaceWith(from, to, content)
98
+ }
99
+
100
+ // set cursor at end of inserted content
101
+ if (options.updateSelection) {
102
+ selectionToInsertionEnd(tr, tr.steps.length - 1, -1)
103
+ }
104
+ }
105
+
106
+ return true
107
+ }
@@ -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,6 +1,6 @@
1
- import { Command, RawCommands } from '../types'
2
-
3
- const mac = typeof navigator !== 'undefined' ? /Mac/.test(navigator.platform) : false
1
+ import { RawCommands } from '../types'
2
+ import { isiOS } from '../utilities/isiOS'
3
+ import { isMacOS } from '../utilities/isMacOS'
4
4
 
5
5
  function normalizeKeyName(name: string) {
6
6
  const parts = name.split(/-(?!$)/)
@@ -27,7 +27,7 @@ function normalizeKeyName(name: string) {
27
27
  } else if (/^s(hift)?$/i.test(mod)) {
28
28
  shift = true
29
29
  } else if (/^mod$/i.test(mod)) {
30
- if (mac) {
30
+ if (isiOS() || isMacOS()) {
31
31
  meta = true
32
32
  } else {
33
33
  ctrl = true
@@ -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'
4
- import isNodeActive from '../helpers/isNodeActive'
5
- import getNodeType from '../helpers/getNodeType'
3
+ import { RawCommands } from '../types'
4
+ import { isNodeActive } from '../helpers/isNodeActive'
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'
4
- import getNodeType from '../helpers/getNodeType'
3
+ import { RawCommands } from '../types'
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
+ }