@tiptap/core 2.0.0-beta.98 → 2.0.0-rc.1

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 (297) hide show
  1. package/README.md +3 -3
  2. package/dist/index.cjs +4360 -0
  3. package/dist/index.cjs.map +1 -0
  4. package/dist/{tiptap-core.esm.js → index.js} +2349 -1447
  5. package/dist/index.js.map +1 -0
  6. package/dist/index.umd.js +4358 -0
  7. package/dist/index.umd.js.map +1 -0
  8. package/dist/packages/core/src/CommandManager.d.ts +14 -7
  9. package/dist/packages/core/src/Editor.d.ts +25 -11
  10. package/dist/packages/core/src/EventEmitter.d.ts +8 -4
  11. package/dist/packages/core/src/Extension.d.ts +63 -29
  12. package/dist/packages/core/src/ExtensionManager.d.ts +3 -4
  13. package/dist/packages/core/src/InputRule.d.ts +42 -0
  14. package/dist/packages/core/src/Mark.d.ts +94 -36
  15. package/dist/packages/core/src/Node.d.ts +104 -45
  16. package/dist/packages/core/src/NodeView.d.ts +8 -8
  17. package/dist/packages/core/src/PasteRule.d.ts +42 -0
  18. package/dist/packages/core/src/Tracker.d.ts +1 -1
  19. package/dist/packages/core/src/commands/deleteCurrentNode.d.ts +12 -0
  20. package/dist/packages/core/src/commands/deleteNode.d.ts +1 -1
  21. package/dist/packages/core/src/commands/deleteRange.d.ts +1 -1
  22. package/dist/packages/core/src/commands/extendMarkRange.d.ts +1 -1
  23. package/dist/packages/core/src/commands/focus.d.ts +4 -2
  24. package/dist/packages/core/src/commands/index.d.ts +50 -0
  25. package/dist/packages/core/src/commands/insertContent.d.ts +6 -3
  26. package/dist/packages/core/src/commands/insertContentAt.d.ts +6 -3
  27. package/dist/packages/core/src/commands/join.d.ts +33 -0
  28. package/dist/packages/core/src/commands/lift.d.ts +1 -1
  29. package/dist/packages/core/src/commands/liftListItem.d.ts +1 -1
  30. package/dist/packages/core/src/commands/resetAttributes.d.ts +1 -1
  31. package/dist/packages/core/src/commands/selectTextblockEnd.d.ts +12 -0
  32. package/dist/packages/core/src/commands/selectTextblockStart.d.ts +12 -0
  33. package/dist/packages/core/src/commands/setContent.d.ts +2 -2
  34. package/dist/packages/core/src/commands/setMark.d.ts +1 -1
  35. package/dist/packages/core/src/commands/setNode.d.ts +1 -1
  36. package/dist/packages/core/src/commands/setTextSelection.d.ts +1 -1
  37. package/dist/packages/core/src/commands/sinkListItem.d.ts +1 -1
  38. package/dist/packages/core/src/commands/splitListItem.d.ts +1 -1
  39. package/dist/packages/core/src/commands/toggleList.d.ts +2 -2
  40. package/dist/packages/core/src/commands/toggleMark.d.ts +7 -2
  41. package/dist/packages/core/src/commands/toggleNode.d.ts +1 -1
  42. package/dist/packages/core/src/commands/toggleWrap.d.ts +1 -1
  43. package/dist/packages/core/src/commands/unsetMark.d.ts +7 -2
  44. package/dist/packages/core/src/commands/updateAttributes.d.ts +1 -1
  45. package/dist/packages/core/src/commands/wrapIn.d.ts +1 -1
  46. package/dist/packages/core/src/commands/wrapInList.d.ts +1 -1
  47. package/dist/packages/core/src/extensions/clipboardTextSerializer.d.ts +1 -1
  48. package/dist/packages/core/src/extensions/commands.d.ts +2 -97
  49. package/dist/packages/core/src/extensions/editable.d.ts +1 -1
  50. package/dist/packages/core/src/extensions/focusEvents.d.ts +1 -1
  51. package/dist/packages/core/src/extensions/index.d.ts +1 -0
  52. package/dist/packages/core/src/extensions/keymap.d.ts +1 -1
  53. package/dist/packages/core/src/extensions/tabindex.d.ts +2 -0
  54. package/dist/packages/core/src/helpers/combineTransactionSteps.d.ts +7 -0
  55. package/dist/packages/core/src/helpers/createChainableState.d.ts +5 -0
  56. package/dist/packages/core/src/helpers/createDocument.d.ts +2 -2
  57. package/dist/packages/core/src/helpers/createNodeFromContent.d.ts +2 -2
  58. package/dist/packages/core/src/helpers/defaultBlockAt.d.ts +2 -0
  59. package/dist/packages/core/src/helpers/findChildren.d.ts +3 -3
  60. package/dist/packages/core/src/helpers/findChildrenInRange.d.ts +3 -3
  61. package/dist/packages/core/src/helpers/findParentNode.d.ts +3 -4
  62. package/dist/packages/core/src/helpers/findParentNodeClosestToPos.d.ts +3 -3
  63. package/dist/packages/core/src/helpers/generateHTML.d.ts +1 -1
  64. package/dist/packages/core/src/helpers/generateJSON.d.ts +1 -1
  65. package/dist/packages/core/src/helpers/generateText.d.ts +5 -0
  66. package/dist/packages/core/src/helpers/getAttributes.d.ts +3 -3
  67. package/dist/packages/core/src/helpers/getAttributesFromExtensions.d.ts +2 -2
  68. package/dist/packages/core/src/helpers/getChangedRanges.d.ts +11 -0
  69. package/dist/packages/core/src/helpers/getDebugJSON.d.ts +2 -5
  70. package/dist/packages/core/src/helpers/getExtensionField.d.ts +2 -2
  71. package/dist/packages/core/src/helpers/getHTMLFromFragment.d.ts +2 -2
  72. package/dist/packages/core/src/helpers/getMarkAttributes.d.ts +3 -3
  73. package/dist/packages/core/src/helpers/getMarkRange.d.ts +2 -2
  74. package/dist/packages/core/src/helpers/getMarkType.d.ts +2 -2
  75. package/dist/packages/core/src/helpers/getMarksBetween.d.ts +2 -2
  76. package/dist/packages/core/src/helpers/getNodeAttributes.d.ts +3 -3
  77. package/dist/packages/core/src/helpers/getNodeType.d.ts +2 -2
  78. package/dist/packages/core/src/helpers/getRenderedAttributes.d.ts +2 -2
  79. package/dist/packages/core/src/helpers/getSchema.d.ts +2 -2
  80. package/dist/packages/core/src/helpers/getSchemaByResolvedExtensions.d.ts +2 -2
  81. package/dist/packages/core/src/helpers/getSchemaTypeByName.d.ts +2 -2
  82. package/dist/packages/core/src/helpers/getSchemaTypeNameByName.d.ts +2 -2
  83. package/dist/packages/core/src/helpers/getSplittedAttributes.d.ts +1 -1
  84. package/dist/packages/core/src/helpers/getText.d.ts +6 -0
  85. package/dist/packages/core/src/helpers/getTextBetween.d.ts +6 -0
  86. package/dist/packages/core/src/helpers/getTextContentFromNodes.d.ts +2 -0
  87. package/dist/packages/core/src/helpers/getTextSerializersFromSchema.d.ts +3 -0
  88. package/dist/packages/core/src/helpers/index.d.ts +47 -0
  89. package/dist/packages/core/src/helpers/injectExtensionAttributesToParseRule.d.ts +2 -2
  90. package/dist/packages/core/src/helpers/isActive.d.ts +2 -2
  91. package/dist/packages/core/src/helpers/isExtensionRulesEnabled.d.ts +2 -0
  92. package/dist/packages/core/src/helpers/isList.d.ts +1 -1
  93. package/dist/packages/core/src/helpers/isMarkActive.d.ts +3 -3
  94. package/dist/packages/core/src/helpers/isNodeActive.d.ts +3 -3
  95. package/dist/packages/core/src/helpers/isNodeEmpty.d.ts +2 -2
  96. package/dist/packages/core/src/helpers/isNodeSelection.d.ts +2 -2
  97. package/dist/packages/core/src/helpers/isTextSelection.d.ts +2 -2
  98. package/dist/packages/core/src/helpers/posToDOMRect.d.ts +2 -2
  99. package/dist/packages/core/src/helpers/resolveFocusPosition.d.ts +4 -0
  100. package/dist/packages/core/src/helpers/selectionToInsertionEnd.d.ts +2 -2
  101. package/dist/packages/core/src/helpers/splitExtensions.d.ts +6 -6
  102. package/dist/packages/core/src/index.d.ts +12 -34
  103. package/dist/packages/core/src/inputRules/index.d.ts +5 -0
  104. package/dist/packages/core/src/inputRules/markInputRule.d.ts +12 -3
  105. package/dist/packages/core/src/inputRules/nodeInputRule.d.ts +12 -3
  106. package/dist/packages/core/src/inputRules/textInputRule.d.ts +9 -0
  107. package/dist/packages/core/src/inputRules/textblockTypeInputRule.d.ts +14 -0
  108. package/dist/packages/core/src/inputRules/wrappingInputRule.d.ts +27 -0
  109. package/dist/packages/core/src/pasteRules/index.d.ts +3 -0
  110. package/dist/packages/core/src/pasteRules/markPasteRule.d.ts +12 -3
  111. package/dist/packages/core/src/pasteRules/nodePasteRule.d.ts +12 -0
  112. package/dist/packages/core/src/pasteRules/textPasteRule.d.ts +9 -0
  113. package/dist/packages/core/src/style.d.ts +1 -2
  114. package/dist/packages/core/src/types.d.ts +70 -40
  115. package/dist/packages/core/src/utilities/callOrReturn.d.ts +1 -1
  116. package/dist/packages/core/src/utilities/createStyleTag.d.ts +1 -1
  117. package/dist/packages/core/src/utilities/deleteProps.d.ts +1 -1
  118. package/dist/packages/core/src/utilities/elementFromString.d.ts +1 -1
  119. package/dist/packages/core/src/utilities/escapeForRegEx.d.ts +1 -0
  120. package/dist/packages/core/src/utilities/findDuplicates.d.ts +1 -0
  121. package/dist/packages/core/src/utilities/fromString.d.ts +1 -1
  122. package/dist/packages/core/src/utilities/index.d.ts +20 -0
  123. package/dist/packages/core/src/utilities/isEmptyObject.d.ts +1 -1
  124. package/dist/packages/core/src/utilities/isFunction.d.ts +1 -0
  125. package/dist/packages/core/src/utilities/isMacOS.d.ts +1 -0
  126. package/dist/packages/core/src/utilities/isNumber.d.ts +1 -0
  127. package/dist/packages/core/src/utilities/isPlainObject.d.ts +1 -1
  128. package/dist/packages/core/src/utilities/isRegExp.d.ts +1 -0
  129. package/dist/packages/core/src/utilities/isString.d.ts +1 -0
  130. package/dist/packages/core/src/utilities/isiOS.d.ts +1 -1
  131. package/dist/packages/core/src/utilities/mergeAttributes.d.ts +1 -1
  132. package/dist/packages/core/src/utilities/mergeDeep.d.ts +1 -1
  133. package/dist/packages/core/src/utilities/minMax.d.ts +1 -1
  134. package/dist/packages/core/src/utilities/objectIncludes.d.ts +3 -1
  135. package/dist/packages/core/src/utilities/removeDuplicates.d.ts +8 -0
  136. package/package.json +25 -24
  137. package/src/CommandManager.ts +73 -83
  138. package/src/Editor.ts +101 -53
  139. package/src/EventEmitter.ts +14 -4
  140. package/src/Extension.ts +244 -138
  141. package/src/ExtensionManager.ts +153 -152
  142. package/src/InputRule.ts +260 -0
  143. package/src/Mark.ts +365 -204
  144. package/src/Node.ts +406 -253
  145. package/src/NodeView.ts +59 -38
  146. package/src/PasteRule.ts +240 -0
  147. package/src/Tracker.ts +4 -8
  148. package/src/commands/blur.ts +4 -0
  149. package/src/commands/clearNodes.ts +15 -9
  150. package/src/commands/createParagraphNear.ts +3 -2
  151. package/src/commands/deleteCurrentNode.ts +41 -0
  152. package/src/commands/deleteNode.ts +3 -2
  153. package/src/commands/deleteRange.ts +1 -1
  154. package/src/commands/deleteSelection.ts +3 -2
  155. package/src/commands/exitCode.ts +3 -2
  156. package/src/commands/extendMarkRange.ts +9 -5
  157. package/src/commands/focus.ts +31 -42
  158. package/src/commands/index.ts +50 -0
  159. package/src/commands/insertContent.ts +15 -4
  160. package/src/commands/insertContentAt.ts +71 -14
  161. package/src/commands/join.ts +53 -0
  162. package/src/commands/keyboardShortcut.ts +3 -3
  163. package/src/commands/lift.ts +6 -5
  164. package/src/commands/liftEmptyBlock.ts +2 -1
  165. package/src/commands/liftListItem.ts +5 -4
  166. package/src/commands/newlineInCode.ts +3 -2
  167. package/src/commands/resetAttributes.ts +16 -10
  168. package/src/commands/selectAll.ts +5 -3
  169. package/src/commands/selectNodeBackward.ts +3 -2
  170. package/src/commands/selectNodeForward.ts +3 -2
  171. package/src/commands/selectParentNode.ts +3 -2
  172. package/src/commands/selectTextblockEnd.ts +20 -0
  173. package/src/commands/selectTextblockStart.ts +20 -0
  174. package/src/commands/setContent.ts +6 -9
  175. package/src/commands/setMark.ts +66 -13
  176. package/src/commands/setNode.ts +30 -6
  177. package/src/commands/setNodeSelection.ts +6 -7
  178. package/src/commands/setTextSelection.ts +8 -9
  179. package/src/commands/sinkListItem.ts +5 -4
  180. package/src/commands/splitBlock.ts +23 -38
  181. package/src/commands/splitListItem.ts +30 -27
  182. package/src/commands/toggleList.ts +108 -19
  183. package/src/commands/toggleMark.ts +17 -6
  184. package/src/commands/toggleNode.ts +9 -4
  185. package/src/commands/toggleWrap.ts +8 -8
  186. package/src/commands/undoInputRule.ts +31 -2
  187. package/src/commands/unsetAllMarks.ts +4 -8
  188. package/src/commands/unsetMark.ts +34 -21
  189. package/src/commands/updateAttributes.ts +18 -12
  190. package/src/commands/wrapIn.ts +5 -10
  191. package/src/commands/wrapInList.ts +5 -4
  192. package/src/extensions/clipboardTextSerializer.ts +15 -36
  193. package/src/extensions/commands.ts +3 -144
  194. package/src/extensions/editable.ts +2 -1
  195. package/src/extensions/focusEvents.ts +4 -6
  196. package/src/extensions/index.ts +1 -0
  197. package/src/extensions/keymap.ts +111 -13
  198. package/src/extensions/tabindex.ts +18 -0
  199. package/src/helpers/combineTransactionSteps.ts +21 -0
  200. package/src/helpers/createChainableState.ts +38 -0
  201. package/src/helpers/createDocument.ts +4 -3
  202. package/src/helpers/createNodeFromContent.ts +10 -15
  203. package/src/helpers/defaultBlockAt.ts +13 -0
  204. package/src/helpers/findChildren.ts +4 -3
  205. package/src/helpers/findChildrenInRange.ts +8 -3
  206. package/src/helpers/findParentNode.ts +4 -3
  207. package/src/helpers/findParentNodeClosestToPos.ts +13 -7
  208. package/src/helpers/generateHTML.ts +6 -5
  209. package/src/helpers/generateJSON.ts +6 -7
  210. package/src/helpers/generateText.ts +27 -0
  211. package/src/helpers/getAttributes.ts +8 -9
  212. package/src/helpers/getAttributesFromExtensions.ts +25 -12
  213. package/src/helpers/getChangedRanges.ts +83 -0
  214. package/src/helpers/getDebugJSON.ts +42 -38
  215. package/src/helpers/getExtensionField.ts +3 -3
  216. package/src/helpers/getHTMLFromFragment.ts +5 -6
  217. package/src/helpers/getMarkAttributes.ts +18 -10
  218. package/src/helpers/getMarkRange.ts +13 -8
  219. package/src/helpers/getMarkType.ts +5 -3
  220. package/src/helpers/getMarksBetween.ts +34 -10
  221. package/src/helpers/getNodeAttributes.ts +14 -12
  222. package/src/helpers/getNodeType.ts +5 -3
  223. package/src/helpers/getRenderedAttributes.ts +8 -6
  224. package/src/helpers/getSchema.ts +5 -4
  225. package/src/helpers/getSchemaByResolvedExtensions.ts +165 -111
  226. package/src/helpers/getSchemaTypeByName.ts +3 -11
  227. package/src/helpers/getSchemaTypeNameByName.ts +2 -2
  228. package/src/helpers/getSplittedAttributes.ts +1 -1
  229. package/src/helpers/getText.ts +19 -0
  230. package/src/helpers/getTextBetween.ts +46 -0
  231. package/src/helpers/getTextContentFromNodes.ts +26 -0
  232. package/src/helpers/getTextSerializersFromSchema.ts +11 -0
  233. package/src/helpers/index.ts +47 -0
  234. package/src/helpers/injectExtensionAttributesToParseRule.ts +22 -23
  235. package/src/helpers/isActive.ts +10 -5
  236. package/src/helpers/isExtensionRulesEnabled.ts +15 -0
  237. package/src/helpers/isList.ts +6 -5
  238. package/src/helpers/isMarkActive.ts +32 -35
  239. package/src/helpers/isNodeActive.ts +27 -37
  240. package/src/helpers/isNodeEmpty.ts +2 -2
  241. package/src/helpers/isNodeSelection.ts +3 -4
  242. package/src/helpers/isTextSelection.ts +3 -4
  243. package/src/helpers/posToDOMRect.ts +10 -4
  244. package/src/helpers/resolveFocusPosition.ts +42 -0
  245. package/src/helpers/selectionToInsertionEnd.ts +3 -3
  246. package/src/helpers/splitExtensions.ts +3 -3
  247. package/src/index.ts +12 -37
  248. package/src/inputRules/index.ts +5 -0
  249. package/src/inputRules/markInputRule.ts +59 -40
  250. package/src/inputRules/nodeInputRule.ts +45 -12
  251. package/src/inputRules/textInputRule.ts +35 -0
  252. package/src/inputRules/textblockTypeInputRule.ts +37 -0
  253. package/src/inputRules/wrappingInputRule.ts +84 -0
  254. package/src/pasteRules/index.ts +3 -0
  255. package/src/pasteRules/markPasteRule.ts +49 -56
  256. package/src/pasteRules/nodePasteRule.ts +37 -0
  257. package/src/pasteRules/textPasteRule.ts +35 -0
  258. package/src/style.ts +12 -3
  259. package/src/types.ts +140 -106
  260. package/src/utilities/callOrReturn.ts +3 -2
  261. package/src/utilities/createStyleTag.ts +8 -4
  262. package/src/utilities/deleteProps.ts +1 -1
  263. package/src/utilities/elementFromString.ts +1 -1
  264. package/src/utilities/escapeForRegEx.ts +4 -0
  265. package/src/utilities/findDuplicates.ts +5 -0
  266. package/src/utilities/fromString.ts +2 -2
  267. package/src/utilities/index.ts +20 -0
  268. package/src/utilities/isEmptyObject.ts +2 -2
  269. package/src/utilities/isFunction.ts +3 -0
  270. package/src/utilities/isMacOS.ts +5 -0
  271. package/src/utilities/isNumber.ts +3 -0
  272. package/src/utilities/isPlainObject.ts +8 -5
  273. package/src/utilities/isRegExp.ts +3 -0
  274. package/src/utilities/isString.ts +3 -0
  275. package/src/utilities/isiOS.ts +1 -1
  276. package/src/utilities/mergeAttributes.ts +2 -1
  277. package/src/utilities/mergeDeep.ts +2 -2
  278. package/src/utilities/minMax.ts +1 -1
  279. package/src/utilities/objectIncludes.ts +18 -4
  280. package/src/utilities/removeDuplicates.ts +15 -0
  281. package/CHANGELOG.md +0 -1182
  282. package/LICENSE.md +0 -21
  283. package/dist/packages/core/src/commands/joinBackward.d.ts +0 -12
  284. package/dist/packages/core/src/commands/joinForward.d.ts +0 -12
  285. package/dist/packages/core/src/utilities/isClass.d.ts +0 -1
  286. package/dist/packages/core/src/utilities/isObject.d.ts +0 -1
  287. package/dist/packages/core/src/utilities/removeElement.d.ts +0 -1
  288. package/dist/tiptap-core.cjs.js +0 -3408
  289. package/dist/tiptap-core.cjs.js.map +0 -1
  290. package/dist/tiptap-core.esm.js.map +0 -1
  291. package/dist/tiptap-core.umd.js +0 -3405
  292. package/dist/tiptap-core.umd.js.map +0 -1
  293. package/src/commands/joinBackward.ts +0 -17
  294. package/src/commands/joinForward.ts +0 -17
  295. package/src/utilities/isClass.ts +0 -7
  296. package/src/utilities/isObject.ts +0 -10
  297. package/src/utilities/removeElement.ts +0 -5
@@ -1,34 +1,7 @@
1
- import { EditorState, Selection, TextSelection } from 'prosemirror-state'
2
- import { 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
7
  interface Commands<ReturnType> {
@@ -36,23 +9,43 @@ declare module '@tiptap/core' {
36
9
  /**
37
10
  * Focus the editor at the given position.
38
11
  */
39
- focus: (position?: FocusPosition) => ReturnType,
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
+
50
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
+
51
40
  // For React we have to focus asynchronously. Otherwise wild things happen.
52
41
  // see: https://github.com/ueberdosis/tiptap/issues/1520
53
42
  requestAnimationFrame(() => {
54
43
  if (!editor.isDestroyed) {
55
44
  view.focus()
45
+
46
+ if (options?.scrollIntoView) {
47
+ editor.commands.scrollIntoView()
48
+ }
56
49
  }
57
50
  })
58
51
  }
@@ -67,13 +60,9 @@ export const focus: RawCommands['focus'] = (position = null) => ({
67
60
  return true
68
61
  }
69
62
 
70
- const { from, to } = resolveSelection(editor.state, position) || editor.state.selection
71
- const { doc, storedMarks } = tr
72
- const minPos = Selection.atStart(doc).from
73
- const maxPos = Selection.atEnd(doc).to
74
- const resolvedFrom = minMax(from, minPos, maxPos)
75
- const resolvedEnd = minMax(to, minPos, maxPos)
76
- 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
77
66
  const isSameSelection = editor.state.selection.eq(selection)
78
67
 
79
68
  if (dispatch) {
@@ -83,8 +72,8 @@ export const focus: RawCommands['focus'] = (position = null) => ({
83
72
 
84
73
  // `tr.setSelection` resets the stored marks
85
74
  // so we’ll restore them if the selection is the same as before
86
- if (isSameSelection && storedMarks) {
87
- tr.setStoredMarks(storedMarks)
75
+ if (isSameSelection && tr.storedMarks) {
76
+ tr.setStoredMarks(tr.storedMarks)
88
77
  }
89
78
 
90
79
  delayedFocus()
@@ -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,5 +1,6 @@
1
- import { CreateNodeFromContentOptions } from '../helpers/createNodeFromContent'
2
- import { RawCommands, Content } from '../types'
1
+ import { ParseOptions } from '@tiptap/pm/model'
2
+
3
+ import { Content, RawCommands } from '../types'
3
4
 
4
5
  declare module '@tiptap/core' {
5
6
  interface Commands<ReturnType> {
@@ -7,11 +8,21 @@ declare module '@tiptap/core' {
7
8
  /**
8
9
  * Insert a node or string of HTML at the current position.
9
10
  */
10
- insertContent: (value: Content, options?: CreateNodeFromContentOptions) => ReturnType,
11
+ insertContent: (
12
+ value: Content,
13
+ options?: {
14
+ parseOptions?: ParseOptions
15
+ updateSelection?: boolean
16
+ },
17
+ ) => ReturnType
11
18
  }
12
19
  }
13
20
  }
14
21
 
15
22
  export const insertContent: RawCommands['insertContent'] = (value, options) => ({ tr, commands }) => {
16
- return commands.insertContentAt({ from: tr.selection.from, to: tr.selection.to }, value, options)
23
+ return commands.insertContentAt(
24
+ { from: tr.selection.from, to: tr.selection.to },
25
+ value,
26
+ options,
27
+ )
17
28
  }
@@ -1,10 +1,8 @@
1
- import createNodeFromContent, { CreateNodeFromContentOptions } from '../helpers/createNodeFromContent'
2
- import selectionToInsertionEnd from '../helpers/selectionToInsertionEnd'
3
- import {
4
- RawCommands,
5
- Content,
6
- Range,
7
- } from '../types'
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'
8
6
 
9
7
  declare module '@tiptap/core' {
10
8
  interface Commands<ReturnType> {
@@ -12,18 +10,35 @@ declare module '@tiptap/core' {
12
10
  /**
13
11
  * Insert a node or string of HTML at a specific position.
14
12
  */
15
- insertContentAt: (position: number | Range, value: Content, options?: CreateNodeFromContentOptions) => ReturnType,
13
+ insertContentAt: (
14
+ position: number | Range,
15
+ value: Content,
16
+ options?: {
17
+ parseOptions?: ParseOptions
18
+ updateSelection?: boolean
19
+ },
20
+ ) => ReturnType
16
21
  }
17
22
  }
18
23
  }
19
24
 
25
+ const isFragment = (nodeOrFragment: ProseMirrorNode | Fragment): nodeOrFragment is Fragment => {
26
+ return nodeOrFragment.toString().startsWith('<')
27
+ }
28
+
20
29
  export const insertContentAt: RawCommands['insertContentAt'] = (position, value, options) => ({ tr, dispatch, editor }) => {
21
30
  if (dispatch) {
31
+ options = {
32
+ parseOptions: {},
33
+ updateSelection: true,
34
+ ...options,
35
+ }
36
+
22
37
  const content = createNodeFromContent(value, editor.schema, {
23
38
  parseOptions: {
24
39
  preserveWhitespace: 'full',
40
+ ...options.parseOptions,
25
41
  },
26
- ...(options || {}),
27
42
  })
28
43
 
29
44
  // don’t dispatch an empty fragment because this can lead to strange errors
@@ -31,14 +46,56 @@ export const insertContentAt: RawCommands['insertContentAt'] = (position, value,
31
46
  return true
32
47
  }
33
48
 
34
- const { from, to } = typeof position === 'number'
35
- ? { from: position, to: position }
36
- : position
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]
37
54
 
38
- tr.replaceWith(from, to, content)
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
+ // if value is string, we can use it directly
83
+ // otherwise if it is an array, we have to join it
84
+ if (Array.isArray(value)) {
85
+ tr.insertText(value.map(v => v.text || '').join(''), from, to)
86
+ } else if (typeof value === 'object' && !!value && !!value.text) {
87
+ tr.insertText(value.text, from, to)
88
+ } else {
89
+ tr.insertText(value as string, from, to)
90
+ }
91
+ } else {
92
+ tr.replaceWith(from, to, content)
93
+ }
39
94
 
40
95
  // set cursor at end of inserted content
41
- selectionToInsertionEnd(tr, tr.steps.length - 1, 1)
96
+ if (options.updateSelection) {
97
+ selectionToInsertionEnd(tr, tr.steps.length - 1, -1)
98
+ }
42
99
  }
43
100
 
44
101
  return true
@@ -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
+ }
@@ -1,6 +1,6 @@
1
1
  import { RawCommands } from '../types'
2
-
3
- const mac = typeof navigator !== 'undefined' ? /Mac/.test(navigator.platform) : false
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
@@ -1,8 +1,9 @@
1
- import { lift as originalLift } from 'prosemirror-commands'
2
- import { NodeType } from 'prosemirror-model'
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'
3
6
  import { RawCommands } from '../types'
4
- import isNodeActive from '../helpers/isNodeActive'
5
- import getNodeType from '../helpers/getNodeType'
6
7
 
7
8
  declare module '@tiptap/core' {
8
9
  interface Commands<ReturnType> {
@@ -10,7 +11,7 @@ declare module '@tiptap/core' {
10
11
  /**
11
12
  * Removes an existing wrap.
12
13
  */
13
- lift: (typeOrName: string | NodeType, attributes?: Record<string, any>) => ReturnType,
14
+ lift: (typeOrName: string | NodeType, attributes?: Record<string, any>) => ReturnType
14
15
  }
15
16
  }
16
17
  }
@@ -1,4 +1,5 @@
1
- import { liftEmptyBlock as originalLiftEmptyBlock } from 'prosemirror-commands'
1
+ import { liftEmptyBlock as originalLiftEmptyBlock } from '@tiptap/pm/commands'
2
+
2
3
  import { RawCommands } from '../types'
3
4
 
4
5
  declare module '@tiptap/core' {
@@ -1,7 +1,8 @@
1
- import { liftListItem as originalLiftListItem } from 'prosemirror-schema-list'
2
- import { NodeType } from 'prosemirror-model'
1
+ import { NodeType } from '@tiptap/pm/model'
2
+ import { liftListItem as originalLiftListItem } from '@tiptap/pm/schema-list'
3
+
4
+ import { getNodeType } from '../helpers/getNodeType'
3
5
  import { RawCommands } from '../types'
4
- import getNodeType from '../helpers/getNodeType'
5
6
 
6
7
  declare module '@tiptap/core' {
7
8
  interface Commands<ReturnType> {
@@ -9,7 +10,7 @@ declare module '@tiptap/core' {
9
10
  /**
10
11
  * Lift the list item into a wrapping list.
11
12
  */
12
- liftListItem: (typeOrName: string | NodeType) => ReturnType,
13
+ liftListItem: (typeOrName: string | NodeType) => ReturnType
13
14
  }
14
15
  }
15
16
  }
@@ -1,4 +1,5 @@
1
- import { newlineInCode as originalNewlineInCode } from 'prosemirror-commands'
1
+ import { newlineInCode as originalNewlineInCode } from '@tiptap/pm/commands'
2
+
2
3
  import { RawCommands } from '../types'
3
4
 
4
5
  declare module '@tiptap/core' {
@@ -7,7 +8,7 @@ declare module '@tiptap/core' {
7
8
  /**
8
9
  * Add a newline character in code.
9
10
  */
10
- newlineInCode: () => ReturnType,
11
+ newlineInCode: () => ReturnType
11
12
  }
12
13
  }
13
14
  }
@@ -1,9 +1,10 @@
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'
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
6
  import { RawCommands } from '../types'
7
+ import { deleteProps } from '../utilities/deleteProps'
7
8
 
8
9
  declare module '@tiptap/core' {
9
10
  interface Commands<ReturnType> {
@@ -11,7 +12,10 @@ declare module '@tiptap/core' {
11
12
  /**
12
13
  * Resets some node attributes to the default value.
13
14
  */
14
- resetAttributes: (typeOrName: string | NodeType | MarkType, attributes: string | string[]) => ReturnType,
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,4 +1,3 @@
1
- import { selectAll as originalSelectAll } from 'prosemirror-commands'
2
1
  import { RawCommands } from '../types'
3
2
 
4
3
  declare module '@tiptap/core' {
@@ -12,6 +11,9 @@ declare module '@tiptap/core' {
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,4 +1,5 @@
1
- import { selectNodeBackward as originalSelectNodeBackward } from 'prosemirror-commands'
1
+ import { selectNodeBackward as originalSelectNodeBackward } from '@tiptap/pm/commands'
2
+
2
3
  import { RawCommands } from '../types'
3
4
 
4
5
  declare module '@tiptap/core' {
@@ -7,7 +8,7 @@ declare module '@tiptap/core' {
7
8
  /**
8
9
  * Select a node backward.
9
10
  */
10
- selectNodeBackward: () => ReturnType,
11
+ selectNodeBackward: () => ReturnType
11
12
  }
12
13
  }
13
14
  }
@@ -1,4 +1,5 @@
1
- import { selectNodeForward as originalSelectNodeForward } from 'prosemirror-commands'
1
+ import { selectNodeForward as originalSelectNodeForward } from '@tiptap/pm/commands'
2
+
2
3
  import { RawCommands } from '../types'
3
4
 
4
5
  declare module '@tiptap/core' {
@@ -7,7 +8,7 @@ declare module '@tiptap/core' {
7
8
  /**
8
9
  * Select a node forward.
9
10
  */
10
- selectNodeForward: () => ReturnType,
11
+ selectNodeForward: () => ReturnType
11
12
  }
12
13
  }
13
14
  }
@@ -1,4 +1,5 @@
1
- import { selectParentNode as originalSelectParentNode } from 'prosemirror-commands'
1
+ import { selectParentNode as originalSelectParentNode } from '@tiptap/pm/commands'
2
+
2
3
  import { RawCommands } from '../types'
3
4
 
4
5
  declare module '@tiptap/core' {
@@ -7,7 +8,7 @@ declare module '@tiptap/core' {
7
8
  /**
8
9
  * Select the parent node.
9
10
  */
10
- selectParentNode: () => ReturnType,
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,7 +1,7 @@
1
- import { TextSelection } from 'prosemirror-state'
2
- import { ParseOptions } from 'prosemirror-model'
3
- import createDocument from '../helpers/createDocument'
4
- import { RawCommands, Content } from '../types'
1
+ import { ParseOptions } from '@tiptap/pm/model'
2
+
3
+ import { createDocument } from '../helpers/createDocument'
4
+ import { Content, RawCommands } from '../types'
5
5
 
6
6
  declare module '@tiptap/core' {
7
7
  interface Commands<ReturnType> {
@@ -13,7 +13,7 @@ declare module '@tiptap/core' {
13
13
  content: Content,
14
14
  emitUpdate?: boolean,
15
15
  parseOptions?: ParseOptions,
16
- ) => ReturnType,
16
+ ) => ReturnType
17
17
  }
18
18
  }
19
19
  }
@@ -21,12 +21,9 @@ declare module '@tiptap/core' {
21
21
  export const setContent: RawCommands['setContent'] = (content, emitUpdate = false, parseOptions = {}) => ({ tr, editor, dispatch }) => {
22
22
  const { doc } = tr
23
23
  const document = createDocument(content, editor.schema, parseOptions)
24
- const selection = TextSelection.create(doc, 0, doc.content.size)
25
24
 
26
25
  if (dispatch) {
27
- tr.setSelection(selection)
28
- .replaceSelectionWith(document, false)
29
- .setMeta('preventUpdate', !emitUpdate)
26
+ tr.replaceWith(0, doc.content.size, document).setMeta('preventUpdate', !emitUpdate)
30
27
  }
31
28
 
32
29
  return true