@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,12 +1,12 @@
1
1
  import { Command, RawCommands } from '../types'
2
2
 
3
3
  declare module '@tiptap/core' {
4
- interface Commands {
4
+ interface Commands<ReturnType> {
5
5
  command: {
6
6
  /**
7
7
  * Define a command inline.
8
8
  */
9
- command: (fn: (props: Parameters<Command>[0]) => boolean) => Command,
9
+ command: (fn: (props: Parameters<Command>[0]) => boolean) => ReturnType,
10
10
  }
11
11
  }
12
12
  }
@@ -1,13 +1,14 @@
1
- import { createParagraphNear as originalCreateParagraphNear } from 'prosemirror-commands'
2
- import { Command, RawCommands } from '../types'
1
+ import { createParagraphNear as originalCreateParagraphNear } 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
  createParagraphNear: {
7
8
  /**
8
9
  * Create a paragraph nearby.
9
10
  */
10
- createParagraphNear: () => Command,
11
+ createParagraphNear: () => ReturnType
11
12
  }
12
13
  }
13
14
  }
@@ -0,0 +1,41 @@
1
+ import { RawCommands } from '../types'
2
+
3
+ declare module '@tiptap/core' {
4
+ interface Commands<ReturnType> {
5
+ deleteCurrentNode: {
6
+ /**
7
+ * Delete the node that currently has the selection anchor.
8
+ */
9
+ deleteCurrentNode: () => ReturnType,
10
+ }
11
+ }
12
+ }
13
+
14
+ export const deleteCurrentNode: RawCommands['deleteCurrentNode'] = () => ({ tr, dispatch }) => {
15
+ const { selection } = tr
16
+ const currentNode = selection.$anchor.node()
17
+
18
+ // if there is content inside the current node, break out of this command
19
+ if (currentNode.content.size > 0) {
20
+ return false
21
+ }
22
+
23
+ const $pos = tr.selection.$anchor
24
+
25
+ for (let depth = $pos.depth; depth > 0; depth -= 1) {
26
+ const node = $pos.node(depth)
27
+
28
+ if (node.type === currentNode.type) {
29
+ if (dispatch) {
30
+ const from = $pos.before(depth)
31
+ const to = $pos.after(depth)
32
+
33
+ tr.delete(from, to).scrollIntoView()
34
+ }
35
+
36
+ return true
37
+ }
38
+ }
39
+
40
+ return false
41
+ }
@@ -0,0 +1,37 @@
1
+ import { NodeType } from '@tiptap/pm/model'
2
+
3
+ import { getNodeType } from '../helpers/getNodeType'
4
+ import { RawCommands } from '../types'
5
+
6
+ declare module '@tiptap/core' {
7
+ interface Commands<ReturnType> {
8
+ deleteNode: {
9
+ /**
10
+ * Delete a node.
11
+ */
12
+ deleteNode: (typeOrName: string | NodeType) => ReturnType,
13
+ }
14
+ }
15
+ }
16
+
17
+ export const deleteNode: RawCommands['deleteNode'] = typeOrName => ({ tr, state, dispatch }) => {
18
+ const type = getNodeType(typeOrName, state.schema)
19
+ const $pos = tr.selection.$anchor
20
+
21
+ for (let depth = $pos.depth; depth > 0; depth -= 1) {
22
+ const node = $pos.node(depth)
23
+
24
+ if (node.type === type) {
25
+ if (dispatch) {
26
+ const from = $pos.before(depth)
27
+ const to = $pos.after(depth)
28
+
29
+ tr.delete(from, to).scrollIntoView()
30
+ }
31
+
32
+ return true
33
+ }
34
+ }
35
+
36
+ return false
37
+ }
@@ -1,12 +1,12 @@
1
- import { Command, RawCommands, Range } from '../types'
1
+ import { Range, RawCommands } 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,14 @@
1
- import { deleteSelection as originalDeleteSelection } from 'prosemirror-commands'
2
- import { Command, RawCommands } from '../types'
1
+ import { deleteSelection as originalDeleteSelection } 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
  deleteSelection: {
7
8
  /**
8
9
  * Delete the selection, if there is one.
9
10
  */
10
- deleteSelection: () => Command,
11
+ deleteSelection: () => ReturnType
11
12
  }
12
13
  }
13
14
  }
@@ -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,14 @@
1
- import { exitCode as originalExitCode } from 'prosemirror-commands'
2
- import { Command, RawCommands } from '../types'
1
+ import { exitCode as originalExitCode } 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
  exitCode: {
7
8
  /**
8
9
  * Exit from a code block.
9
10
  */
10
- exitCode: () => Command,
11
+ exitCode: () => ReturnType
11
12
  }
12
13
  }
13
14
  }
@@ -1,29 +1,33 @@
1
- import { TextSelection } from 'prosemirror-state'
2
- import { MarkType } from 'prosemirror-model'
3
- import { Command, RawCommands } from '../types'
4
- import getMarkType from '../helpers/getMarkType'
5
- import getMarkRange from '../helpers/getMarkRange'
1
+ import { MarkType } from '@tiptap/pm/model'
2
+ import { TextSelection } from '@tiptap/pm/state'
3
+
4
+ import { getMarkRange } from '../helpers/getMarkRange'
5
+ import { getMarkType } from '../helpers/getMarkType'
6
+ import { RawCommands } from '../types'
6
7
 
7
8
  declare module '@tiptap/core' {
8
- interface Commands {
9
+ interface Commands<ReturnType> {
9
10
  extendMarkRange: {
10
11
  /**
11
12
  * Extends the text selection to the current mark.
12
13
  */
13
- extendMarkRange: (typeOrName: string | MarkType) => Command,
14
+ extendMarkRange: (
15
+ typeOrName: string | MarkType,
16
+ attributes?: Record<string, any>,
17
+ ) => ReturnType
14
18
  }
15
19
  }
16
20
  }
17
21
 
18
- export const extendMarkRange: RawCommands['extendMarkRange'] = typeOrName => ({ tr, state, dispatch }) => {
22
+ export const extendMarkRange: RawCommands['extendMarkRange'] = (typeOrName, attributes = {}) => ({ tr, state, dispatch }) => {
19
23
  const type = getMarkType(typeOrName, state.schema)
20
24
  const { doc, selection } = tr
21
- const { $from, empty } = selection
25
+ const { $from, from, to } = selection
22
26
 
23
- if (empty && dispatch) {
24
- const range = getMarkRange($from, type)
27
+ if (dispatch) {
28
+ const range = getMarkRange($from, type, attributes)
25
29
 
26
- if (range) {
30
+ if (range && range.from <= from && range.to >= to) {
27
31
  const newSelection = TextSelection.create(doc, range.from, range.to)
28
32
 
29
33
  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,82 @@
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 { isTextSelection } from '../helpers/isTextSelection'
2
+ import { resolveFocusPosition } from '../helpers/resolveFocusPosition'
3
+ import { FocusPosition, RawCommands } from '../types'
4
+ import { isiOS } from '../utilities/isiOS'
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
+ // pass through tr.doc instead of editor.state.doc
64
+ // since transactions could change the editors state before this command has been run
65
+ const selection = resolveFocusPosition(tr.doc, position) || editor.state.selection
65
66
  const isSameSelection = editor.state.selection.eq(selection)
66
67
 
67
68
  if (dispatch) {
68
- tr.setSelection(selection)
69
+ if (!isSameSelection) {
70
+ tr.setSelection(selection)
71
+ }
69
72
 
70
73
  // `tr.setSelection` resets the stored marks
71
74
  // so we’ll restore them if the selection is the same as before
72
- if (isSameSelection && storedMarks) {
73
- tr.setStoredMarks(storedMarks)
75
+ if (isSameSelection && tr.storedMarks) {
76
+ tr.setStoredMarks(tr.storedMarks)
74
77
  }
75
78
 
76
- view.focus()
79
+ delayedFocus()
77
80
  }
78
81
 
79
82
  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,50 @@
1
+ export * from './blur'
2
+ export * from './clearContent'
3
+ export * from './clearNodes'
4
+ export * from './command'
5
+ export * from './createParagraphNear'
6
+ export * from './deleteCurrentNode'
7
+ export * from './deleteNode'
8
+ export * from './deleteRange'
9
+ export * from './deleteSelection'
10
+ export * from './enter'
11
+ export * from './exitCode'
12
+ export * from './extendMarkRange'
13
+ export * from './first'
14
+ export * from './focus'
15
+ export * from './forEach'
16
+ export * from './insertContent'
17
+ export * from './insertContentAt'
18
+ export * from './join'
19
+ export * from './keyboardShortcut'
20
+ export * from './lift'
21
+ export * from './liftEmptyBlock'
22
+ export * from './liftListItem'
23
+ export * from './newlineInCode'
24
+ export * from './resetAttributes'
25
+ export * from './scrollIntoView'
26
+ export * from './selectAll'
27
+ export * from './selectNodeBackward'
28
+ export * from './selectNodeForward'
29
+ export * from './selectParentNode'
30
+ export * from './selectTextblockEnd'
31
+ export * from './selectTextblockStart'
32
+ export * from './setContent'
33
+ export * from './setMark'
34
+ export * from './setMeta'
35
+ export * from './setNode'
36
+ export * from './setNodeSelection'
37
+ export * from './setTextSelection'
38
+ export * from './sinkListItem'
39
+ export * from './splitBlock'
40
+ export * from './splitListItem'
41
+ export * from './toggleList'
42
+ export * from './toggleMark'
43
+ export * from './toggleNode'
44
+ export * from './toggleWrap'
45
+ export * from './undoInputRule'
46
+ export * from './unsetAllMarks'
47
+ export * from './unsetMark'
48
+ export * from './updateAttributes'
49
+ export * from './wrapIn'
50
+ export * from './wrapInList'
@@ -1,35 +1,28 @@
1
- import createNodeFromContent from '../helpers/createNodeFromContent'
2
- import selectionToInsertionEnd from '../helpers/selectionToInsertionEnd'
3
- import { Command, RawCommands, Content } from '../types'
1
+ import { ParseOptions } from '@tiptap/pm/model'
2
+
3
+ import { Content, RawCommands } from '../types'
4
4
 
5
5
  declare module '@tiptap/core' {
6
- interface Commands {
6
+ interface Commands<ReturnType> {
7
7
  insertContent: {
8
8
  /**
9
9
  * Insert a node or string of HTML at the current position.
10
10
  */
11
- insertContent: (value: Content) => Command,
11
+ insertContent: (
12
+ value: Content,
13
+ options?: {
14
+ parseOptions?: ParseOptions
15
+ updateSelection?: boolean
16
+ },
17
+ ) => ReturnType
12
18
  }
13
19
  }
14
20
  }
15
21
 
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
22
+ export const insertContent: RawCommands['insertContent'] = (value, options) => ({ tr, commands }) => {
23
+ return commands.insertContentAt(
24
+ { from: tr.selection.from, to: tr.selection.to },
25
+ value,
26
+ options,
27
+ )
35
28
  }
@@ -0,0 +1,94 @@
1
+ import { Fragment, Node as ProseMirrorNode, ParseOptions } from '@tiptap/pm/model'
2
+
3
+ import { createNodeFromContent } from '../helpers/createNodeFromContent'
4
+ import { selectionToInsertionEnd } from '../helpers/selectionToInsertionEnd'
5
+ import { Content, Range, RawCommands } from '../types'
6
+
7
+ declare module '@tiptap/core' {
8
+ interface Commands<ReturnType> {
9
+ insertContentAt: {
10
+ /**
11
+ * Insert a node or string of HTML at a specific position.
12
+ */
13
+ insertContentAt: (
14
+ position: number | Range,
15
+ value: Content,
16
+ options?: {
17
+ parseOptions?: ParseOptions
18
+ updateSelection?: boolean
19
+ },
20
+ ) => ReturnType
21
+ }
22
+ }
23
+ }
24
+
25
+ const isFragment = (nodeOrFragment: ProseMirrorNode | Fragment): nodeOrFragment is Fragment => {
26
+ return nodeOrFragment.toString().startsWith('<')
27
+ }
28
+
29
+ export const insertContentAt: RawCommands['insertContentAt'] = (position, value, options) => ({ tr, dispatch, editor }) => {
30
+ if (dispatch) {
31
+ options = {
32
+ parseOptions: {},
33
+ updateSelection: true,
34
+ ...options,
35
+ }
36
+
37
+ const content = createNodeFromContent(value, editor.schema, {
38
+ parseOptions: {
39
+ preserveWhitespace: 'full',
40
+ ...options.parseOptions,
41
+ },
42
+ })
43
+
44
+ // don’t dispatch an empty fragment because this can lead to strange errors
45
+ if (content.toString() === '<>') {
46
+ return true
47
+ }
48
+
49
+ let { from, to } = typeof position === 'number' ? { from: position, to: position } : position
50
+
51
+ let isOnlyTextContent = true
52
+ let isOnlyBlockContent = true
53
+ const nodes = isFragment(content) ? content : [content]
54
+
55
+ nodes.forEach(node => {
56
+ // check if added node is valid
57
+ node.check()
58
+
59
+ isOnlyTextContent = isOnlyTextContent ? node.isText && node.marks.length === 0 : false
60
+
61
+ isOnlyBlockContent = isOnlyBlockContent ? node.isBlock : false
62
+ })
63
+
64
+ // check if we can replace the wrapping node by
65
+ // the newly inserted content
66
+ // example:
67
+ // replace an empty paragraph by an inserted image
68
+ // instead of inserting the image below the paragraph
69
+ if (from === to && isOnlyBlockContent) {
70
+ const { parent } = tr.doc.resolve(from)
71
+ const isEmptyTextBlock = parent.isTextblock && !parent.type.spec.code && !parent.childCount
72
+
73
+ if (isEmptyTextBlock) {
74
+ from -= 1
75
+ to += 1
76
+ }
77
+ }
78
+
79
+ // if there is only plain text we have to use `insertText`
80
+ // because this will keep the current marks
81
+ if (isOnlyTextContent) {
82
+ tr.insertText(value as string, from, to)
83
+ } else {
84
+ tr.replaceWith(from, to, content)
85
+ }
86
+
87
+ // set cursor at end of inserted content
88
+ if (options.updateSelection) {
89
+ selectionToInsertionEnd(tr, tr.steps.length - 1, -1)
90
+ }
91
+ }
92
+
93
+ return true
94
+ }
@@ -0,0 +1,53 @@
1
+ import {
2
+ joinBackward as originalJoinBackward,
3
+ joinDown as originalJoinDown,
4
+ joinForward as originalJoinForward,
5
+ joinUp as originalJoinUp,
6
+ } from '@tiptap/pm/commands'
7
+
8
+ import { RawCommands } from '../types'
9
+
10
+ declare module '@tiptap/core' {
11
+ interface Commands<ReturnType> {
12
+ joinUp: {
13
+ /**
14
+ * Join two nodes Up.
15
+ */
16
+ joinUp: () => ReturnType
17
+ }
18
+ joinDown: {
19
+ /**
20
+ * Join two nodes Down.
21
+ */
22
+ joinDown: () => ReturnType
23
+ }
24
+ joinBackward: {
25
+ /**
26
+ * Join two nodes Backwards.
27
+ */
28
+ joinBackward: () => ReturnType
29
+ }
30
+ joinForward: {
31
+ /**
32
+ * Join two nodes Forwards.
33
+ */
34
+ joinForward: () => ReturnType
35
+ }
36
+ }
37
+ }
38
+
39
+ export const joinUp: RawCommands['joinUp'] = () => ({ state, dispatch }) => {
40
+ return originalJoinUp(state, dispatch)
41
+ }
42
+
43
+ export const joinDown: RawCommands['joinDown'] = () => ({ state, dispatch }) => {
44
+ return originalJoinDown(state, dispatch)
45
+ }
46
+
47
+ export const joinBackward: RawCommands['joinBackward'] = () => ({ state, dispatch }) => {
48
+ return originalJoinBackward(state, dispatch)
49
+ }
50
+
51
+ export const joinForward: RawCommands['joinForward'] = () => ({ state, dispatch }) => {
52
+ return originalJoinForward(state, dispatch)
53
+ }