@tiptap/core 2.0.0-beta.21 → 2.0.0-beta.211

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 (289) hide show
  1. package/README.md +2 -2
  2. package/dist/index.cjs +4311 -0
  3. package/dist/index.d.ts +2330 -0
  4. package/dist/index.js +4311 -0
  5. package/package.json +39 -25
  6. package/src/CommandManager.ts +76 -86
  7. package/src/Editor.ts +120 -81
  8. package/src/EventEmitter.ts +14 -4
  9. package/src/Extension.ts +280 -108
  10. package/src/ExtensionManager.ts +254 -108
  11. package/src/InputRule.ts +260 -0
  12. package/src/Mark.ts +398 -147
  13. package/src/Node.ts +437 -171
  14. package/src/NodeView.ts +132 -63
  15. package/src/PasteRule.ts +240 -0
  16. package/src/Tracker.ts +38 -0
  17. package/src/commands/blur.ts +12 -6
  18. package/src/commands/clearContent.ts +3 -3
  19. package/src/commands/clearNodes.ts +31 -19
  20. package/src/commands/command.ts +2 -2
  21. package/src/commands/createParagraphNear.ts +5 -4
  22. package/src/commands/deleteCurrentNode.ts +41 -0
  23. package/src/commands/deleteNode.ts +37 -0
  24. package/src/commands/deleteRange.ts +3 -3
  25. package/src/commands/deleteSelection.ts +5 -4
  26. package/src/commands/enter.ts +3 -3
  27. package/src/commands/exitCode.ts +5 -4
  28. package/src/commands/extendMarkRange.ts +16 -12
  29. package/src/commands/first.ts +3 -3
  30. package/src/commands/focus.ts +47 -44
  31. package/src/commands/forEach.ts +24 -0
  32. package/src/commands/index.ts +50 -0
  33. package/src/commands/insertContent.ts +17 -24
  34. package/src/commands/insertContentAt.ts +94 -0
  35. package/src/commands/join.ts +53 -0
  36. package/src/commands/keyboardShortcut.ts +6 -6
  37. package/src/commands/lift.ts +8 -7
  38. package/src/commands/liftEmptyBlock.ts +5 -4
  39. package/src/commands/liftListItem.ts +7 -6
  40. package/src/commands/newlineInCode.ts +5 -4
  41. package/src/commands/resetAttributes.ts +18 -12
  42. package/src/commands/scrollIntoView.ts +3 -3
  43. package/src/commands/selectAll.ts +8 -6
  44. package/src/commands/selectNodeBackward.ts +5 -4
  45. package/src/commands/selectNodeForward.ts +5 -4
  46. package/src/commands/selectParentNode.ts +5 -4
  47. package/src/commands/selectTextblockEnd.ts +20 -0
  48. package/src/commands/selectTextblockStart.ts +20 -0
  49. package/src/commands/setContent.ts +9 -16
  50. package/src/commands/setMark.ts +90 -14
  51. package/src/commands/setMeta.ts +18 -0
  52. package/src/commands/setNode.ts +32 -8
  53. package/src/commands/setNodeSelection.ts +27 -0
  54. package/src/commands/setTextSelection.ts +31 -0
  55. package/src/commands/sinkListItem.ts +7 -6
  56. package/src/commands/splitBlock.ts +31 -41
  57. package/src/commands/splitListItem.ts +46 -29
  58. package/src/commands/toggleList.ts +88 -20
  59. package/src/commands/toggleMark.ts +19 -8
  60. package/src/commands/toggleNode.ts +11 -6
  61. package/src/commands/toggleWrap.ts +10 -10
  62. package/src/commands/undoInputRule.ts +34 -5
  63. package/src/commands/unsetAllMarks.ts +7 -11
  64. package/src/commands/unsetMark.ts +36 -23
  65. package/src/commands/updateAttributes.ts +27 -15
  66. package/src/commands/wrapIn.ts +7 -12
  67. package/src/commands/wrapInList.ts +7 -6
  68. package/src/extensions/clipboardTextSerializer.ts +15 -36
  69. package/src/extensions/commands.ts +3 -147
  70. package/src/extensions/editable.ts +2 -1
  71. package/src/extensions/focusEvents.ts +4 -6
  72. package/src/extensions/index.ts +1 -0
  73. package/src/extensions/keymap.ts +106 -13
  74. package/src/extensions/tabindex.ts +18 -0
  75. package/src/helpers/combineTransactionSteps.ts +21 -0
  76. package/src/helpers/createChainableState.ts +38 -0
  77. package/src/helpers/createDocument.ts +5 -6
  78. package/src/helpers/createNodeFromContent.ts +20 -28
  79. package/src/helpers/defaultBlockAt.ts +13 -0
  80. package/src/helpers/findChildren.ts +18 -0
  81. package/src/helpers/findChildrenInRange.ts +36 -0
  82. package/src/helpers/findParentNode.ts +4 -3
  83. package/src/helpers/findParentNodeClosestToPos.ts +13 -7
  84. package/src/helpers/generateHTML.ts +7 -6
  85. package/src/helpers/generateJSON.ts +12 -0
  86. package/src/helpers/generateText.ts +27 -0
  87. package/src/helpers/getAttributes.ts +26 -0
  88. package/src/helpers/getAttributesFromExtensions.ts +42 -14
  89. package/src/helpers/getChangedRanges.ts +83 -0
  90. package/src/helpers/getDebugJSON.ts +54 -0
  91. package/src/helpers/getExtensionField.ts +25 -0
  92. package/src/helpers/getHTMLFromFragment.ts +5 -6
  93. package/src/helpers/getMarkAttributes.ts +18 -11
  94. package/src/helpers/getMarkRange.ts +41 -8
  95. package/src/helpers/getMarkType.ts +8 -2
  96. package/src/helpers/getMarksBetween.ts +34 -10
  97. package/src/helpers/getNodeAttributes.ts +14 -13
  98. package/src/helpers/getNodeType.ts +8 -2
  99. package/src/helpers/getRenderedAttributes.ts +9 -7
  100. package/src/helpers/getSchema.ts +7 -133
  101. package/src/helpers/getSchemaByResolvedExtensions.ts +192 -0
  102. package/src/helpers/getSchemaTypeByName.ts +3 -11
  103. package/src/helpers/getSchemaTypeNameByName.ts +2 -2
  104. package/src/helpers/getSplittedAttributes.ts +4 -4
  105. package/src/helpers/getText.ts +19 -0
  106. package/src/helpers/getTextBetween.ts +46 -0
  107. package/src/helpers/getTextContentFromNodes.ts +26 -0
  108. package/src/helpers/getTextSerializersFromSchema.ts +11 -0
  109. package/src/helpers/index.ts +33 -0
  110. package/src/helpers/injectExtensionAttributesToParseRule.ts +22 -23
  111. package/src/helpers/isActive.ts +10 -6
  112. package/src/helpers/isExtensionRulesEnabled.ts +15 -0
  113. package/src/helpers/isList.ts +14 -7
  114. package/src/helpers/isMarkActive.ts +49 -27
  115. package/src/helpers/isNodeActive.ts +29 -39
  116. package/src/helpers/isNodeEmpty.ts +2 -2
  117. package/src/helpers/isNodeSelection.ts +3 -4
  118. package/src/helpers/isTextSelection.ts +3 -4
  119. package/src/helpers/posToDOMRect.ts +35 -0
  120. package/src/helpers/resolveFocusPosition.ts +42 -0
  121. package/src/helpers/selectionToInsertionEnd.ts +3 -3
  122. package/src/helpers/splitExtensions.ts +3 -3
  123. package/src/index.ts +15 -24
  124. package/src/inputRules/index.ts +5 -0
  125. package/src/inputRules/markInputRule.ts +59 -40
  126. package/src/inputRules/nodeInputRule.ts +45 -12
  127. package/src/inputRules/textInputRule.ts +35 -0
  128. package/src/inputRules/textblockTypeInputRule.ts +37 -0
  129. package/src/inputRules/wrappingInputRule.ts +59 -0
  130. package/src/pasteRules/index.ts +3 -0
  131. package/src/pasteRules/markPasteRule.ts +61 -53
  132. package/src/pasteRules/nodePasteRule.ts +37 -0
  133. package/src/pasteRules/textPasteRule.ts +35 -0
  134. package/src/style.ts +16 -3
  135. package/src/types.ts +170 -97
  136. package/src/utilities/callOrReturn.ts +6 -3
  137. package/src/utilities/createStyleTag.ts +12 -1
  138. package/src/utilities/deleteProps.ts +2 -4
  139. package/src/utilities/elementFromString.ts +4 -5
  140. package/src/utilities/escapeForRegEx.ts +4 -0
  141. package/src/utilities/findDuplicates.ts +5 -0
  142. package/src/utilities/fromString.ts +2 -2
  143. package/src/utilities/index.ts +20 -0
  144. package/src/utilities/isEmptyObject.ts +2 -2
  145. package/src/utilities/isFunction.ts +3 -0
  146. package/src/utilities/isMacOS.ts +5 -0
  147. package/src/utilities/isNumber.ts +3 -0
  148. package/src/utilities/isPlainObject.ts +8 -5
  149. package/src/utilities/isRegExp.ts +3 -0
  150. package/src/utilities/isString.ts +3 -0
  151. package/src/utilities/isiOS.ts +12 -0
  152. package/src/utilities/mergeAttributes.ts +2 -3
  153. package/src/utilities/mergeDeep.ts +2 -3
  154. package/src/utilities/minMax.ts +1 -1
  155. package/src/utilities/objectIncludes.ts +17 -5
  156. package/src/utilities/removeDuplicates.ts +15 -0
  157. package/CHANGELOG.md +0 -365
  158. package/LICENSE.md +0 -21
  159. package/dist/packages/core/src/CommandManager.d.ts +0 -13
  160. package/dist/packages/core/src/Editor.d.ts +0 -142
  161. package/dist/packages/core/src/EventEmitter.d.ts +0 -7
  162. package/dist/packages/core/src/Extension.d.ts +0 -148
  163. package/dist/packages/core/src/ExtensionManager.d.ts +0 -24
  164. package/dist/packages/core/src/Mark.d.ts +0 -211
  165. package/dist/packages/core/src/Node.d.ts +0 -265
  166. package/dist/packages/core/src/NodeView.d.ts +0 -31
  167. package/dist/packages/core/src/commands/blur.d.ts +0 -12
  168. package/dist/packages/core/src/commands/clearContent.d.ts +0 -12
  169. package/dist/packages/core/src/commands/clearNodes.d.ts +0 -12
  170. package/dist/packages/core/src/commands/command.d.ts +0 -12
  171. package/dist/packages/core/src/commands/createParagraphNear.d.ts +0 -12
  172. package/dist/packages/core/src/commands/deleteRange.d.ts +0 -12
  173. package/dist/packages/core/src/commands/deleteSelection.d.ts +0 -12
  174. package/dist/packages/core/src/commands/enter.d.ts +0 -12
  175. package/dist/packages/core/src/commands/exitCode.d.ts +0 -12
  176. package/dist/packages/core/src/commands/extendMarkRange.d.ts +0 -13
  177. package/dist/packages/core/src/commands/first.d.ts +0 -12
  178. package/dist/packages/core/src/commands/focus.d.ts +0 -12
  179. package/dist/packages/core/src/commands/insertContent.d.ts +0 -12
  180. package/dist/packages/core/src/commands/insertHTML.d.ts +0 -12
  181. package/dist/packages/core/src/commands/insertNode.d.ts +0 -13
  182. package/dist/packages/core/src/commands/insertText.d.ts +0 -12
  183. package/dist/packages/core/src/commands/joinBackward.d.ts +0 -12
  184. package/dist/packages/core/src/commands/joinForward.d.ts +0 -12
  185. package/dist/packages/core/src/commands/keyboardShortcut.d.ts +0 -12
  186. package/dist/packages/core/src/commands/lift.d.ts +0 -13
  187. package/dist/packages/core/src/commands/liftEmptyBlock.d.ts +0 -12
  188. package/dist/packages/core/src/commands/liftListItem.d.ts +0 -13
  189. package/dist/packages/core/src/commands/newlineInCode.d.ts +0 -12
  190. package/dist/packages/core/src/commands/replace.d.ts +0 -13
  191. package/dist/packages/core/src/commands/replaceRange.d.ts +0 -13
  192. package/dist/packages/core/src/commands/resetAttributes.d.ts +0 -13
  193. package/dist/packages/core/src/commands/resetNodeAttributes.d.ts +0 -13
  194. package/dist/packages/core/src/commands/scrollIntoView.d.ts +0 -12
  195. package/dist/packages/core/src/commands/selectAll.d.ts +0 -12
  196. package/dist/packages/core/src/commands/selectNodeBackward.d.ts +0 -12
  197. package/dist/packages/core/src/commands/selectNodeForward.d.ts +0 -12
  198. package/dist/packages/core/src/commands/selectParentNode.d.ts +0 -12
  199. package/dist/packages/core/src/commands/setContent.d.ts +0 -12
  200. package/dist/packages/core/src/commands/setMark.d.ts +0 -13
  201. package/dist/packages/core/src/commands/setNode.d.ts +0 -13
  202. package/dist/packages/core/src/commands/sinkListItem.d.ts +0 -13
  203. package/dist/packages/core/src/commands/splitBlock.d.ts +0 -14
  204. package/dist/packages/core/src/commands/splitListItem.d.ts +0 -13
  205. package/dist/packages/core/src/commands/toggleList.d.ts +0 -13
  206. package/dist/packages/core/src/commands/toggleMark.d.ts +0 -13
  207. package/dist/packages/core/src/commands/toggleNode.d.ts +0 -13
  208. package/dist/packages/core/src/commands/toggleWrap.d.ts +0 -13
  209. package/dist/packages/core/src/commands/undoInputRule.d.ts +0 -12
  210. package/dist/packages/core/src/commands/unsetAllMarks.d.ts +0 -12
  211. package/dist/packages/core/src/commands/unsetMark.d.ts +0 -13
  212. package/dist/packages/core/src/commands/updateAttributes.d.ts +0 -13
  213. package/dist/packages/core/src/commands/updateNodeAttributes.d.ts +0 -13
  214. package/dist/packages/core/src/commands/wrapIn.d.ts +0 -13
  215. package/dist/packages/core/src/commands/wrapInList.d.ts +0 -13
  216. package/dist/packages/core/src/extensions/clipboardTextSerializer.d.ts +0 -2
  217. package/dist/packages/core/src/extensions/commands.d.ts +0 -100
  218. package/dist/packages/core/src/extensions/editable.d.ts +0 -2
  219. package/dist/packages/core/src/extensions/focusEvents.d.ts +0 -2
  220. package/dist/packages/core/src/extensions/index.d.ts +0 -5
  221. package/dist/packages/core/src/extensions/keymap.d.ts +0 -2
  222. package/dist/packages/core/src/helpers/createDocument.d.ts +0 -4
  223. package/dist/packages/core/src/helpers/createNodeFromContent.d.ts +0 -8
  224. package/dist/packages/core/src/helpers/findParentNode.d.ts +0 -9
  225. package/dist/packages/core/src/helpers/findParentNodeClosestToPos.d.ts +0 -8
  226. package/dist/packages/core/src/helpers/generateHTML.d.ts +0 -2
  227. package/dist/packages/core/src/helpers/getAttributesFromExtensions.d.ts +0 -6
  228. package/dist/packages/core/src/helpers/getHTMLFromFragment.d.ts +0 -2
  229. package/dist/packages/core/src/helpers/getMarkAttributes.d.ts +0 -4
  230. package/dist/packages/core/src/helpers/getMarkRange.d.ts +0 -3
  231. package/dist/packages/core/src/helpers/getMarkType.d.ts +0 -2
  232. package/dist/packages/core/src/helpers/getMarksBetween.d.ts +0 -3
  233. package/dist/packages/core/src/helpers/getNodeAttributes.d.ts +0 -4
  234. package/dist/packages/core/src/helpers/getNodeType.d.ts +0 -2
  235. package/dist/packages/core/src/helpers/getRenderedAttributes.d.ts +0 -3
  236. package/dist/packages/core/src/helpers/getSchema.d.ts +0 -3
  237. package/dist/packages/core/src/helpers/getSchemaTypeByName.d.ts +0 -2
  238. package/dist/packages/core/src/helpers/getSchemaTypeNameByName.d.ts +0 -2
  239. package/dist/packages/core/src/helpers/getSplittedAttributes.d.ts +0 -2
  240. package/dist/packages/core/src/helpers/injectExtensionAttributesToParseRule.d.ts +0 -9
  241. package/dist/packages/core/src/helpers/isActive.d.ts +0 -3
  242. package/dist/packages/core/src/helpers/isList.d.ts +0 -2
  243. package/dist/packages/core/src/helpers/isMarkActive.d.ts +0 -4
  244. package/dist/packages/core/src/helpers/isNodeActive.d.ts +0 -4
  245. package/dist/packages/core/src/helpers/isNodeEmpty.d.ts +0 -2
  246. package/dist/packages/core/src/helpers/isNodeSelection.d.ts +0 -2
  247. package/dist/packages/core/src/helpers/isTextSelection.d.ts +0 -2
  248. package/dist/packages/core/src/helpers/selectionToInsertionEnd.d.ts +0 -2
  249. package/dist/packages/core/src/helpers/splitExtensions.d.ts +0 -9
  250. package/dist/packages/core/src/index.d.ts +0 -30
  251. package/dist/packages/core/src/inputRules/markInputRule.d.ts +0 -3
  252. package/dist/packages/core/src/inputRules/nodeInputRule.d.ts +0 -3
  253. package/dist/packages/core/src/pasteRules/markPasteRule.d.ts +0 -3
  254. package/dist/packages/core/src/style.d.ts +0 -2
  255. package/dist/packages/core/src/types.d.ts +0 -154
  256. package/dist/packages/core/src/utilities/callOrReturn.d.ts +0 -8
  257. package/dist/packages/core/src/utilities/createStyleTag.d.ts +0 -1
  258. package/dist/packages/core/src/utilities/deleteProps.d.ts +0 -7
  259. package/dist/packages/core/src/utilities/elementFromString.d.ts +0 -1
  260. package/dist/packages/core/src/utilities/fromString.d.ts +0 -1
  261. package/dist/packages/core/src/utilities/isClass.d.ts +0 -1
  262. package/dist/packages/core/src/utilities/isEmptyObject.d.ts +0 -1
  263. package/dist/packages/core/src/utilities/isObject.d.ts +0 -1
  264. package/dist/packages/core/src/utilities/isPlainObject.d.ts +0 -1
  265. package/dist/packages/core/src/utilities/mergeAttributes.d.ts +0 -2
  266. package/dist/packages/core/src/utilities/mergeDeep.d.ts +0 -2
  267. package/dist/packages/core/src/utilities/minMax.d.ts +0 -1
  268. package/dist/packages/core/src/utilities/objectIncludes.d.ts +0 -7
  269. package/dist/packages/core/src/utilities/removeElement.d.ts +0 -1
  270. package/dist/tiptap-core.bundle.umd.min.js +0 -17
  271. package/dist/tiptap-core.bundle.umd.min.js.map +0 -1
  272. package/dist/tiptap-core.cjs.js +0 -3027
  273. package/dist/tiptap-core.cjs.js.map +0 -1
  274. package/dist/tiptap-core.esm.js +0 -3002
  275. package/dist/tiptap-core.esm.js.map +0 -1
  276. package/dist/tiptap-core.umd.js +0 -3024
  277. package/dist/tiptap-core.umd.js.map +0 -1
  278. package/src/commands/insertHTML.ts +0 -30
  279. package/src/commands/insertNode.ts +0 -33
  280. package/src/commands/insertText.ts +0 -22
  281. package/src/commands/joinBackward.ts +0 -17
  282. package/src/commands/joinForward.ts +0 -17
  283. package/src/commands/replace.ts +0 -20
  284. package/src/commands/replaceRange.ts +0 -36
  285. package/src/commands/resetNodeAttributes.ts +0 -33
  286. package/src/commands/updateNodeAttributes.ts +0 -35
  287. package/src/utilities/isClass.ts +0 -7
  288. package/src/utilities/isObject.ts +0 -10
  289. package/src/utilities/removeElement.ts +0 -5
@@ -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,17 @@
1
- import { lift as originalLift } from 'prosemirror-commands'
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'
1
+ import { lift as originalLift } from '@tiptap/pm/commands'
2
+ import { NodeType } from '@tiptap/pm/model'
3
+
4
+ import { getNodeType } from '../helpers/getNodeType'
5
+ import { isNodeActive } from '../helpers/isNodeActive'
6
+ import { RawCommands } from '../types'
6
7
 
7
8
  declare module '@tiptap/core' {
8
- interface Commands {
9
+ interface Commands<ReturnType> {
9
10
  lift: {
10
11
  /**
11
12
  * Removes an existing wrap.
12
13
  */
13
- lift: (typeOrName: string | NodeType, attributes?: AnyObject) => Command,
14
+ lift: (typeOrName: string | NodeType, attributes?: Record<string, any>) => ReturnType
14
15
  }
15
16
  }
16
17
  }
@@ -1,13 +1,14 @@
1
- import { liftEmptyBlock as originalLiftEmptyBlock } from 'prosemirror-commands'
2
- import { Command, RawCommands } from '../types'
1
+ import { liftEmptyBlock as originalLiftEmptyBlock } from '@tiptap/pm/commands'
2
+
3
+ import { RawCommands } from '../types'
3
4
 
4
5
  declare module '@tiptap/core' {
5
- interface Commands {
6
+ interface Commands<ReturnType> {
6
7
  liftEmptyBlock: {
7
8
  /**
8
9
  * Lift block if empty.
9
10
  */
10
- liftEmptyBlock: () => Command,
11
+ liftEmptyBlock: () => ReturnType,
11
12
  }
12
13
  }
13
14
  }
@@ -1,15 +1,16 @@
1
- import { liftListItem as originalLiftListItem } from 'prosemirror-schema-list'
2
- import { NodeType } from 'prosemirror-model'
3
- import { Command, RawCommands } from '../types'
4
- import getNodeType from '../helpers/getNodeType'
1
+ import { NodeType } from '@tiptap/pm/model'
2
+ import { liftListItem as originalLiftListItem } from '@tiptap/pm/schema-list'
3
+
4
+ import { getNodeType } from '../helpers/getNodeType'
5
+ import { RawCommands } from '../types'
5
6
 
6
7
  declare module '@tiptap/core' {
7
- interface Commands {
8
+ interface Commands<ReturnType> {
8
9
  liftListItem: {
9
10
  /**
10
11
  * Lift the list item into a wrapping list.
11
12
  */
12
- liftListItem: (typeOrName: string | NodeType) => Command,
13
+ liftListItem: (typeOrName: string | NodeType) => ReturnType
13
14
  }
14
15
  }
15
16
  }
@@ -1,13 +1,14 @@
1
- import { newlineInCode as originalNewlineInCode } from 'prosemirror-commands'
2
- import { Command, RawCommands } from '../types'
1
+ import { newlineInCode as originalNewlineInCode } from '@tiptap/pm/commands'
2
+
3
+ import { RawCommands } from '../types'
3
4
 
4
5
  declare module '@tiptap/core' {
5
- interface Commands {
6
+ interface Commands<ReturnType> {
6
7
  newlineInCode: {
7
8
  /**
8
9
  * Add a newline character in code.
9
10
  */
10
- newlineInCode: () => Command,
11
+ newlineInCode: () => ReturnType
11
12
  }
12
13
  }
13
14
  }
@@ -1,17 +1,21 @@
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 { Command, RawCommands } from '../types'
1
+ import { MarkType, NodeType } from '@tiptap/pm/model'
2
+
3
+ import { getMarkType } from '../helpers/getMarkType'
4
+ import { getNodeType } from '../helpers/getNodeType'
5
+ import { getSchemaTypeNameByName } from '../helpers/getSchemaTypeNameByName'
6
+ import { RawCommands } from '../types'
7
+ import { deleteProps } from '../utilities/deleteProps'
7
8
 
8
9
  declare module '@tiptap/core' {
9
- interface Commands {
10
+ interface Commands<ReturnType> {
10
11
  resetAttributes: {
11
12
  /**
12
13
  * Resets some node attributes to the default value.
13
14
  */
14
- resetAttributes: (typeOrName: string | NodeType | MarkType, attributes: string | string[]) => Command,
15
+ resetAttributes: (
16
+ typeOrName: string | NodeType | MarkType,
17
+ attributes: string | string[],
18
+ ) => ReturnType
15
19
  }
16
20
  }
17
21
  }
@@ -21,9 +25,7 @@ export const resetAttributes: RawCommands['resetAttributes'] = (typeOrName, attr
21
25
  let markType: MarkType | null = null
22
26
 
23
27
  const schemaType = getSchemaTypeNameByName(
24
- typeof typeOrName === 'string'
25
- ? typeOrName
26
- : typeOrName.name,
28
+ typeof typeOrName === 'string' ? typeOrName : typeOrName.name,
27
29
  state.schema,
28
30
  )
29
31
 
@@ -49,7 +51,11 @@ export const resetAttributes: RawCommands['resetAttributes'] = (typeOrName, attr
49
51
  if (markType && node.marks.length) {
50
52
  node.marks.forEach(mark => {
51
53
  if (markType === mark.type) {
52
- tr.addMark(pos, pos + node.nodeSize, markType.create(deleteProps(mark.attrs, attributes)))
54
+ tr.addMark(
55
+ pos,
56
+ pos + node.nodeSize,
57
+ markType.create(deleteProps(mark.attrs, attributes)),
58
+ )
53
59
  }
54
60
  })
55
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,14 @@
1
- import { selectNodeBackward as originalSelectNodeBackward } from 'prosemirror-commands'
2
- import { Command, RawCommands } from '../types'
1
+ import { selectNodeBackward as originalSelectNodeBackward } from '@tiptap/pm/commands'
2
+
3
+ import { RawCommands } from '../types'
3
4
 
4
5
  declare module '@tiptap/core' {
5
- interface Commands {
6
+ interface Commands<ReturnType> {
6
7
  selectNodeBackward: {
7
8
  /**
8
9
  * Select a node backward.
9
10
  */
10
- selectNodeBackward: () => Command,
11
+ selectNodeBackward: () => ReturnType
11
12
  }
12
13
  }
13
14
  }
@@ -1,13 +1,14 @@
1
- import { selectNodeForward as originalSelectNodeForward } from 'prosemirror-commands'
2
- import { Command, RawCommands } from '../types'
1
+ import { selectNodeForward as originalSelectNodeForward } from '@tiptap/pm/commands'
2
+
3
+ import { RawCommands } from '../types'
3
4
 
4
5
  declare module '@tiptap/core' {
5
- interface Commands {
6
+ interface Commands<ReturnType> {
6
7
  selectNodeForward: {
7
8
  /**
8
9
  * Select a node forward.
9
10
  */
10
- selectNodeForward: () => Command,
11
+ selectNodeForward: () => ReturnType
11
12
  }
12
13
  }
13
14
  }
@@ -1,13 +1,14 @@
1
- import { selectParentNode as originalSelectParentNode } from 'prosemirror-commands'
2
- import { Command, RawCommands } from '../types'
1
+ import { selectParentNode as originalSelectParentNode } from '@tiptap/pm/commands'
2
+
3
+ import { RawCommands } from '../types'
3
4
 
4
5
  declare module '@tiptap/core' {
5
- interface Commands {
6
+ interface Commands<ReturnType> {
6
7
  selectParentNode: {
7
8
  /**
8
9
  * Select the parent node.
9
10
  */
10
- selectParentNode: () => Command,
11
+ selectParentNode: () => ReturnType
11
12
  }
12
13
  }
13
14
  }
@@ -0,0 +1,20 @@
1
+ // @ts-ignore
2
+ // TODO: add types to @types/prosemirror-commands
3
+ import { selectTextblockEnd as originalSelectTextblockEnd } from '@tiptap/pm/commands'
4
+
5
+ import { RawCommands } from '../types'
6
+
7
+ declare module '@tiptap/core' {
8
+ interface Commands<ReturnType> {
9
+ selectTextblockEnd: {
10
+ /**
11
+ * Moves the cursor to the end of current text block.
12
+ */
13
+ selectTextblockEnd: () => ReturnType
14
+ }
15
+ }
16
+ }
17
+
18
+ export const selectTextblockEnd: RawCommands['selectTextblockEnd'] = () => ({ state, dispatch }) => {
19
+ return originalSelectTextblockEnd(state, dispatch)
20
+ }
@@ -0,0 +1,20 @@
1
+ // @ts-ignore
2
+ // TODO: add types to @types/prosemirror-commands
3
+ import { selectTextblockStart as originalSelectTextblockStart } from '@tiptap/pm/commands'
4
+
5
+ import { RawCommands } from '../types'
6
+
7
+ declare module '@tiptap/core' {
8
+ interface Commands<ReturnType> {
9
+ selectTextblockStart: {
10
+ /**
11
+ * Moves the cursor to the start of current text block.
12
+ */
13
+ selectTextblockStart: () => ReturnType
14
+ }
15
+ }
16
+ }
17
+
18
+ export const selectTextblockStart: RawCommands['selectTextblockStart'] = () => ({ state, dispatch }) => {
19
+ return originalSelectTextblockStart(state, dispatch)
20
+ }
@@ -1,23 +1,19 @@
1
- import { TextSelection } from 'prosemirror-state'
2
- import createDocument from '../helpers/createDocument'
3
- import {
4
- AnyObject,
5
- Command,
6
- RawCommands,
7
- Content,
8
- } from '../types'
1
+ import { ParseOptions } from '@tiptap/pm/model'
2
+
3
+ import { createDocument } from '../helpers/createDocument'
4
+ import { Content, RawCommands } from '../types'
9
5
 
10
6
  declare module '@tiptap/core' {
11
- interface Commands {
7
+ interface Commands<ReturnType> {
12
8
  setContent: {
13
9
  /**
14
10
  * Replace the whole document with new content.
15
11
  */
16
12
  setContent: (
17
13
  content: Content,
18
- emitUpdate?: Boolean,
19
- parseOptions?: AnyObject,
20
- ) => Command,
14
+ emitUpdate?: boolean,
15
+ parseOptions?: ParseOptions,
16
+ ) => ReturnType
21
17
  }
22
18
  }
23
19
  }
@@ -25,12 +21,9 @@ declare module '@tiptap/core' {
25
21
  export const setContent: RawCommands['setContent'] = (content, emitUpdate = false, parseOptions = {}) => ({ tr, editor, dispatch }) => {
26
22
  const { doc } = tr
27
23
  const document = createDocument(content, editor.schema, parseOptions)
28
- const selection = TextSelection.create(doc, 0, doc.content.size)
29
24
 
30
25
  if (dispatch) {
31
- tr.setSelection(selection)
32
- .replaceSelectionWith(document, false)
33
- .setMeta('preventUpdate', !emitUpdate)
26
+ tr.replaceWith(0, doc.content.size, document).setMeta('preventUpdate', !emitUpdate)
34
27
  }
35
28
 
36
29
  return true
@@ -1,38 +1,114 @@
1
- import { MarkType } from 'prosemirror-model'
2
- import { AnyObject, Command, RawCommands } from '../types'
3
- import getMarkType from '../helpers/getMarkType'
4
- import getMarkAttributes from '../helpers/getMarkAttributes'
1
+ import { MarkType, ResolvedPos } from '@tiptap/pm/model'
2
+ import { EditorState, Transaction } from '@tiptap/pm/state'
3
+
4
+ import { isTextSelection } from '../helpers'
5
+ import { getMarkAttributes } from '../helpers/getMarkAttributes'
6
+ import { getMarkType } from '../helpers/getMarkType'
7
+ import { RawCommands } from '../types'
5
8
 
6
9
  declare module '@tiptap/core' {
7
- interface Commands {
10
+ interface Commands<ReturnType> {
8
11
  setMark: {
9
12
  /**
10
13
  * Add a mark with new attributes.
11
14
  */
12
- setMark: (typeOrName: string | MarkType, attributes?: AnyObject) => Command,
15
+ setMark: (typeOrName: string | MarkType, attributes?: Record<string, any>) => ReturnType
13
16
  }
14
17
  }
15
18
  }
16
19
 
20
+ function canSetMark(state: EditorState, tr: Transaction, newMarkType: MarkType) {
21
+ const { selection } = tr
22
+ let cursor: ResolvedPos | null = null
23
+
24
+ if (isTextSelection(selection)) {
25
+ cursor = selection.$cursor
26
+ }
27
+
28
+ if (cursor) {
29
+ const currentMarks = state.storedMarks ?? cursor.marks()
30
+
31
+ // There can be no current marks that exclude the new mark
32
+ return (
33
+ !!newMarkType.isInSet(currentMarks)
34
+ || !currentMarks.some(mark => mark.type.excludes(newMarkType))
35
+ )
36
+ }
37
+
38
+ const { ranges } = selection
39
+
40
+ return ranges.some(({ $from, $to }) => {
41
+ let someNodeSupportsMark = $from.depth === 0
42
+ ? state.doc.inlineContent && state.doc.type.allowsMarkType(newMarkType)
43
+ : false
44
+
45
+ state.doc.nodesBetween($from.pos, $to.pos, (node, _pos, parent) => {
46
+ // If we already found a mark that we can enable, return false to bypass the remaining search
47
+ if (someNodeSupportsMark) {
48
+ return false
49
+ }
50
+
51
+ if (node.isInline) {
52
+ const parentAllowsMarkType = !parent || parent.type.allowsMarkType(newMarkType)
53
+ const currentMarksAllowMarkType = !!newMarkType.isInSet(node.marks)
54
+ || !node.marks.some(otherMark => otherMark.type.excludes(newMarkType))
55
+
56
+ someNodeSupportsMark = parentAllowsMarkType && currentMarksAllowMarkType
57
+ }
58
+ return !someNodeSupportsMark
59
+ })
60
+
61
+ return someNodeSupportsMark
62
+ })
63
+ }
17
64
  export const setMark: RawCommands['setMark'] = (typeOrName, attributes = {}) => ({ tr, state, dispatch }) => {
18
65
  const { selection } = tr
19
66
  const { empty, ranges } = selection
20
67
  const type = getMarkType(typeOrName, state.schema)
21
- const oldAttributes = getMarkAttributes(state, type)
22
- const newAttributes = {
23
- ...oldAttributes,
24
- ...attributes,
25
- }
26
68
 
27
69
  if (dispatch) {
28
70
  if (empty) {
29
- tr.addStoredMark(type.create(newAttributes))
71
+ const oldAttributes = getMarkAttributes(state, type)
72
+
73
+ tr.addStoredMark(
74
+ type.create({
75
+ ...oldAttributes,
76
+ ...attributes,
77
+ }),
78
+ )
30
79
  } else {
31
80
  ranges.forEach(range => {
32
- tr.addMark(range.$from.pos, range.$to.pos, type.create(newAttributes))
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
+ })
33
109
  })
34
110
  }
35
111
  }
36
112
 
37
- return true
113
+ return canSetMark(state, tr, type)
38
114
  }
@@ -0,0 +1,18 @@
1
+ import { RawCommands } from '../types'
2
+
3
+ declare module '@tiptap/core' {
4
+ interface Commands<ReturnType> {
5
+ setMeta: {
6
+ /**
7
+ * Store a metadata property in the current transaction.
8
+ */
9
+ setMeta: (key: string, value: any) => ReturnType,
10
+ }
11
+ }
12
+ }
13
+
14
+ export const setMeta: RawCommands['setMeta'] = (key, value) => ({ tr }) => {
15
+ tr.setMeta(key, value)
16
+
17
+ return true
18
+ }
@@ -1,21 +1,45 @@
1
- import { NodeType } from 'prosemirror-model'
2
- import { setBlockType } from 'prosemirror-commands'
3
- import { AnyObject, Command, RawCommands } from '../types'
4
- import getNodeType from '../helpers/getNodeType'
1
+ import { setBlockType } from '@tiptap/pm/commands'
2
+ import { NodeType } from '@tiptap/pm/model'
3
+
4
+ import { getNodeType } from '../helpers/getNodeType'
5
+ import { RawCommands } from '../types'
5
6
 
6
7
  declare module '@tiptap/core' {
7
- interface Commands {
8
+ interface Commands<ReturnType> {
8
9
  setNode: {
9
10
  /**
10
11
  * Replace a given range with a node.
11
12
  */
12
- setNode: (typeOrName: string | NodeType, attributes?: AnyObject) => Command,
13
+ setNode: (typeOrName: string | NodeType, attributes?: Record<string, any>) => ReturnType
13
14
  }
14
15
  }
15
16
  }
16
17
 
17
- export const setNode: RawCommands['setNode'] = (typeOrName, attributes = {}) => ({ state, dispatch }) => {
18
+ export const setNode: RawCommands['setNode'] = (typeOrName, attributes = {}) => ({ state, dispatch, chain }) => {
18
19
  const type = getNodeType(typeOrName, state.schema)
19
20
 
20
- return setBlockType(type, attributes)(state, dispatch)
21
+ // TODO: use a fallback like insertContent?
22
+ if (!type.isTextblock) {
23
+ console.warn('[tiptap warn]: Currently "setNode()" only supports text block nodes.')
24
+
25
+ return false
26
+ }
27
+
28
+ return (
29
+ chain()
30
+ // try to convert node to default node if needed
31
+ .command(({ commands }) => {
32
+ const canSetBlock = setBlockType(type, attributes)(state)
33
+
34
+ if (canSetBlock) {
35
+ return true
36
+ }
37
+
38
+ return commands.clearNodes()
39
+ })
40
+ .command(({ state: updatedState }) => {
41
+ return setBlockType(type, attributes)(updatedState, dispatch)
42
+ })
43
+ .run()
44
+ )
21
45
  }
@@ -0,0 +1,27 @@
1
+ import { NodeSelection } from '@tiptap/pm/state'
2
+
3
+ import { RawCommands } from '../types'
4
+ import { minMax } from '../utilities/minMax'
5
+
6
+ declare module '@tiptap/core' {
7
+ interface Commands<ReturnType> {
8
+ setNodeSelection: {
9
+ /**
10
+ * Creates a NodeSelection.
11
+ */
12
+ setNodeSelection: (position: number) => ReturnType
13
+ }
14
+ }
15
+ }
16
+
17
+ export const setNodeSelection: RawCommands['setNodeSelection'] = position => ({ tr, dispatch }) => {
18
+ if (dispatch) {
19
+ const { doc } = tr
20
+ const from = minMax(position, 0, doc.content.size)
21
+ const selection = NodeSelection.create(doc, from)
22
+
23
+ tr.setSelection(selection)
24
+ }
25
+
26
+ return true
27
+ }
@@ -0,0 +1,31 @@
1
+ import { TextSelection } from '@tiptap/pm/state'
2
+
3
+ import { Range, RawCommands } from '../types'
4
+ import { minMax } from '../utilities/minMax'
5
+
6
+ declare module '@tiptap/core' {
7
+ interface Commands<ReturnType> {
8
+ setTextSelection: {
9
+ /**
10
+ * Creates a TextSelection.
11
+ */
12
+ setTextSelection: (position: number | Range) => ReturnType
13
+ }
14
+ }
15
+ }
16
+
17
+ export const setTextSelection: RawCommands['setTextSelection'] = position => ({ tr, dispatch }) => {
18
+ if (dispatch) {
19
+ const { doc } = tr
20
+ const { from, to } = typeof position === 'number' ? { from: position, to: position } : position
21
+ const minPos = TextSelection.atStart(doc).from
22
+ const maxPos = TextSelection.atEnd(doc).to
23
+ const resolvedFrom = minMax(from, minPos, maxPos)
24
+ const resolvedEnd = minMax(to, minPos, maxPos)
25
+ const selection = TextSelection.create(doc, resolvedFrom, resolvedEnd)
26
+
27
+ tr.setSelection(selection)
28
+ }
29
+
30
+ return true
31
+ }
@@ -1,15 +1,16 @@
1
- import { sinkListItem as originalSinkListItem } from 'prosemirror-schema-list'
2
- import { NodeType } from 'prosemirror-model'
3
- import { Command, RawCommands } from '../types'
4
- import getNodeType from '../helpers/getNodeType'
1
+ import { NodeType } from '@tiptap/pm/model'
2
+ import { sinkListItem as originalSinkListItem } from '@tiptap/pm/schema-list'
3
+
4
+ import { getNodeType } from '../helpers/getNodeType'
5
+ import { RawCommands } from '../types'
5
6
 
6
7
  declare module '@tiptap/core' {
7
- interface Commands {
8
+ interface Commands<ReturnType> {
8
9
  sinkListItem: {
9
10
  /**
10
11
  * Sink the list item down into an inner list.
11
12
  */
12
- sinkListItem: (typeOrName: string | NodeType) => Command,
13
+ sinkListItem: (typeOrName: string | NodeType) => ReturnType
13
14
  }
14
15
  }
15
16
  }