@tiptap/core 2.0.0-beta.99 → 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 -1190
  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,4 +1,10 @@
1
+ import { Plugin, PluginKey, Selection } from '@tiptap/pm/state'
2
+
3
+ import { CommandManager } from '../CommandManager'
1
4
  import { Extension } from '../Extension'
5
+ import { createChainableState } from '../helpers/createChainableState'
6
+ import { isiOS } from '../utilities/isiOS'
7
+ import { isMacOS } from '../utilities/isMacOS'
2
8
 
3
9
  export const Keymap = Extension.create({
4
10
  name: 'keymap',
@@ -6,6 +12,19 @@ export const Keymap = Extension.create({
6
12
  addKeyboardShortcuts() {
7
13
  const handleBackspace = () => this.editor.commands.first(({ commands }) => [
8
14
  () => commands.undoInputRule(),
15
+ // maybe convert first text block node to default node
16
+ () => commands.command(({ tr }) => {
17
+ const { selection, doc } = tr
18
+ const { empty, $anchor } = selection
19
+ const { pos, parent } = $anchor
20
+ const isAtStart = Selection.atStart(doc).from === pos
21
+
22
+ if (!empty || !isAtStart || !parent.type.isTextblock || parent.textContent.length) {
23
+ return false
24
+ }
25
+
26
+ return commands.clearNodes()
27
+ }),
9
28
  () => commands.deleteSelection(),
10
29
  () => commands.joinBackward(),
11
30
  () => commands.selectNodeBackward(),
@@ -13,24 +32,103 @@ export const Keymap = Extension.create({
13
32
 
14
33
  const handleDelete = () => this.editor.commands.first(({ commands }) => [
15
34
  () => commands.deleteSelection(),
35
+ () => commands.deleteCurrentNode(),
16
36
  () => commands.joinForward(),
17
37
  () => commands.selectNodeForward(),
18
38
  ])
19
39
 
20
- return {
21
- Enter: () => this.editor.commands.first(({ commands }) => [
22
- () => commands.newlineInCode(),
23
- () => commands.createParagraphNear(),
24
- () => commands.liftEmptyBlock(),
25
- () => commands.splitBlock(),
26
- ]),
40
+ const handleEnter = () => this.editor.commands.first(({ commands }) => [
41
+ () => commands.newlineInCode(),
42
+ () => commands.createParagraphNear(),
43
+ () => commands.liftEmptyBlock(),
44
+ () => commands.splitBlock(),
45
+ ])
46
+
47
+ const baseKeymap = {
48
+ Enter: handleEnter,
27
49
  'Mod-Enter': () => this.editor.commands.exitCode(),
28
- Backspace: () => handleBackspace(),
29
- 'Mod-Backspace': () => handleBackspace(),
30
- Delete: () => handleDelete(),
31
- 'Mod-Delete': () => handleDelete(),
32
- // we don’t need a custom `selectAll` for now
33
- // 'Mod-a': () => this.editor.commands.selectAll(),
50
+ Backspace: handleBackspace,
51
+ 'Mod-Backspace': handleBackspace,
52
+ 'Shift-Backspace': handleBackspace,
53
+ Delete: handleDelete,
54
+ 'Mod-Delete': handleDelete,
55
+ 'Mod-a': () => this.editor.commands.selectAll(),
56
+ }
57
+
58
+ const pcKeymap = {
59
+ ...baseKeymap,
60
+ }
61
+
62
+ const macKeymap = {
63
+ ...baseKeymap,
64
+ 'Ctrl-h': handleBackspace,
65
+ 'Alt-Backspace': handleBackspace,
66
+ 'Ctrl-d': handleDelete,
67
+ 'Ctrl-Alt-Backspace': handleDelete,
68
+ 'Alt-Delete': handleDelete,
69
+ 'Alt-d': handleDelete,
70
+ 'Ctrl-a': () => this.editor.commands.selectTextblockStart(),
71
+ 'Ctrl-e': () => this.editor.commands.selectTextblockEnd(),
34
72
  }
73
+
74
+ if (isiOS() || isMacOS()) {
75
+ return macKeymap
76
+ }
77
+
78
+ return pcKeymap
79
+ },
80
+
81
+ addProseMirrorPlugins() {
82
+ return [
83
+ // With this plugin we check if the whole document was selected and deleted.
84
+ // In this case we will additionally call `clearNodes()` to convert e.g. a heading
85
+ // to a paragraph if necessary.
86
+ // This is an alternative to ProseMirror's `AllSelection`, which doesn’t work well
87
+ // with many other commands.
88
+ new Plugin({
89
+ key: new PluginKey('clearDocument'),
90
+ appendTransaction: (transactions, oldState, newState) => {
91
+ const docChanges = transactions.some(transaction => transaction.docChanged)
92
+ && !oldState.doc.eq(newState.doc)
93
+
94
+ if (!docChanges) {
95
+ return
96
+ }
97
+
98
+ const { empty, from, to } = oldState.selection
99
+ const allFrom = Selection.atStart(oldState.doc).from
100
+ const allEnd = Selection.atEnd(oldState.doc).to
101
+ const allWasSelected = from === allFrom && to === allEnd
102
+
103
+ if (empty || !allWasSelected) {
104
+ return
105
+ }
106
+
107
+ const isEmpty = newState.doc.textBetween(0, newState.doc.content.size, ' ', ' ').length === 0
108
+
109
+ if (!isEmpty) {
110
+ return
111
+ }
112
+
113
+ const tr = newState.tr
114
+ const state = createChainableState({
115
+ state: newState,
116
+ transaction: tr,
117
+ })
118
+ const { commands } = new CommandManager({
119
+ editor: this.editor,
120
+ state,
121
+ })
122
+
123
+ commands.clearNodes()
124
+
125
+ if (!tr.steps.length) {
126
+ return
127
+ }
128
+
129
+ return tr
130
+ },
131
+ }),
132
+ ]
35
133
  },
36
134
  })
@@ -0,0 +1,18 @@
1
+ import { Plugin, PluginKey } from '@tiptap/pm/state'
2
+
3
+ import { Extension } from '../Extension'
4
+
5
+ export const Tabindex = Extension.create({
6
+ name: 'tabindex',
7
+
8
+ addProseMirrorPlugins() {
9
+ return [
10
+ new Plugin({
11
+ key: new PluginKey('tabindex'),
12
+ props: {
13
+ attributes: this.editor.isEditable ? { tabindex: '0' } : {},
14
+ },
15
+ }),
16
+ ]
17
+ },
18
+ })
@@ -0,0 +1,21 @@
1
+ import { Node as ProseMirrorNode } from '@tiptap/pm/model'
2
+ import { Transaction } from '@tiptap/pm/state'
3
+ import { Transform } from '@tiptap/pm/transform'
4
+
5
+ /**
6
+ * Returns a new `Transform` based on all steps of the passed transactions.
7
+ */
8
+ export function combineTransactionSteps(
9
+ oldDoc: ProseMirrorNode,
10
+ transactions: Transaction[],
11
+ ): Transform {
12
+ const transform = new Transform(oldDoc)
13
+
14
+ transactions.forEach(transaction => {
15
+ transaction.steps.forEach(step => {
16
+ transform.step(step)
17
+ })
18
+ })
19
+
20
+ return transform
21
+ }
@@ -0,0 +1,38 @@
1
+ import { EditorState, Transaction } from '@tiptap/pm/state'
2
+
3
+ export function createChainableState(config: {
4
+ transaction: Transaction
5
+ state: EditorState
6
+ }): EditorState {
7
+ const { state, transaction } = config
8
+ let { selection } = transaction
9
+ let { doc } = transaction
10
+ let { storedMarks } = transaction
11
+
12
+ return {
13
+ ...state,
14
+ apply: state.apply.bind(state),
15
+ applyTransaction: state.applyTransaction.bind(state),
16
+ filterTransaction: state.filterTransaction,
17
+ plugins: state.plugins,
18
+ schema: state.schema,
19
+ reconfigure: state.reconfigure.bind(state),
20
+ toJSON: state.toJSON.bind(state),
21
+ get storedMarks() {
22
+ return storedMarks
23
+ },
24
+ get selection() {
25
+ return selection
26
+ },
27
+ get doc() {
28
+ return doc
29
+ },
30
+ get tr() {
31
+ selection = transaction.selection
32
+ doc = transaction.doc
33
+ storedMarks = transaction.storedMarks
34
+
35
+ return transaction
36
+ },
37
+ }
38
+ }
@@ -1,8 +1,9 @@
1
- import { Schema, Node as ProseMirrorNode, ParseOptions } from 'prosemirror-model'
1
+ import { Node as ProseMirrorNode, ParseOptions, Schema } from '@tiptap/pm/model'
2
+
2
3
  import { Content } from '../types'
3
- import createNodeFromContent from './createNodeFromContent'
4
+ import { createNodeFromContent } from './createNodeFromContent'
4
5
 
5
- export default function createDocument(
6
+ export function createDocument(
6
7
  content: Content,
7
8
  schema: Schema,
8
9
  parseOptions: ParseOptions = {},
@@ -1,19 +1,20 @@
1
1
  import {
2
- Schema,
3
2
  DOMParser,
4
- Node as ProseMirrorNode,
5
3
  Fragment,
4
+ Node as ProseMirrorNode,
6
5
  ParseOptions,
7
- } from 'prosemirror-model'
8
- import elementFromString from '../utilities/elementFromString'
6
+ Schema,
7
+ } from '@tiptap/pm/model'
8
+
9
9
  import { Content } from '../types'
10
+ import { elementFromString } from '../utilities/elementFromString'
10
11
 
11
12
  export type CreateNodeFromContentOptions = {
12
- slice?: boolean,
13
- parseOptions?: ParseOptions,
13
+ slice?: boolean
14
+ parseOptions?: ParseOptions
14
15
  }
15
16
 
16
- export default function createNodeFromContent(
17
+ export function createNodeFromContent(
17
18
  content: Content,
18
19
  schema: Schema,
19
20
  options?: CreateNodeFromContentOptions,
@@ -26,19 +27,13 @@ export default function createNodeFromContent(
26
27
 
27
28
  if (typeof content === 'object' && content !== null) {
28
29
  try {
29
- if (Array.isArray(content)) {
30
+ if (Array.isArray(content) && content.length > 0) {
30
31
  return Fragment.fromArray(content.map(item => schema.nodeFromJSON(item)))
31
32
  }
32
33
 
33
34
  return schema.nodeFromJSON(content)
34
35
  } catch (error) {
35
- console.warn(
36
- '[tiptap warn]: Invalid content.',
37
- 'Passed value:',
38
- content,
39
- 'Error:',
40
- error,
41
- )
36
+ console.warn('[tiptap warn]: Invalid content.', 'Passed value:', content, 'Error:', error)
42
37
 
43
38
  return createNodeFromContent('', schema, options)
44
39
  }
@@ -0,0 +1,13 @@
1
+ import { ContentMatch, NodeType } from '@tiptap/pm/model'
2
+
3
+ export function defaultBlockAt(match: ContentMatch): NodeType | null {
4
+ for (let i = 0; i < match.edgeCount; i += 1) {
5
+ const { type } = match.edge(i)
6
+
7
+ if (type.isTextblock && !type.hasRequiredAttrs()) {
8
+ return type
9
+ }
10
+ }
11
+
12
+ return null
13
+ }
@@ -1,7 +1,8 @@
1
- import { Node as ProseMirrorNode } from 'prosemirror-model'
2
- import { Predicate, NodeWithPos } from '../types'
1
+ import { Node as ProseMirrorNode } from '@tiptap/pm/model'
3
2
 
4
- export default function findChildren(node: ProseMirrorNode, predicate: Predicate): NodeWithPos[] {
3
+ import { NodeWithPos, Predicate } from '../types'
4
+
5
+ export function findChildren(node: ProseMirrorNode, predicate: Predicate): NodeWithPos[] {
5
6
  const nodesWithPos: NodeWithPos[] = []
6
7
 
7
8
  node.descendants((child, pos) => {
@@ -1,10 +1,15 @@
1
- import { Node as ProseMirrorNode } from 'prosemirror-model'
2
- import { Predicate, Range, NodeWithPos } from '../types'
1
+ import { Node as ProseMirrorNode } from '@tiptap/pm/model'
2
+
3
+ import { NodeWithPos, Predicate, Range } from '../types'
3
4
 
4
5
  /**
5
6
  * Same as `findChildren` but searches only within a `range`.
6
7
  */
7
- export default function findChildrenInRange(node: ProseMirrorNode, range: Range, predicate: Predicate): NodeWithPos[] {
8
+ export function findChildrenInRange(
9
+ node: ProseMirrorNode,
10
+ range: Range,
11
+ predicate: Predicate,
12
+ ): NodeWithPos[] {
8
13
  const nodesWithPos: NodeWithPos[] = []
9
14
 
10
15
  // if (range.from === range.to) {
@@ -1,7 +1,8 @@
1
- import { Selection } from 'prosemirror-state'
2
- import findParentNodeClosestToPos from './findParentNodeClosestToPos'
1
+ import { Selection } from '@tiptap/pm/state'
2
+
3
3
  import { Predicate } from '../types'
4
+ import { findParentNodeClosestToPos } from './findParentNodeClosestToPos'
4
5
 
5
- export default function findParentNode(predicate: Predicate) {
6
+ export function findParentNode(predicate: Predicate) {
6
7
  return (selection: Selection) => findParentNodeClosestToPos(selection.$from, predicate)
7
8
  }
@@ -1,12 +1,18 @@
1
- import { ResolvedPos, Node as ProseMirrorNode } from 'prosemirror-model'
1
+ import { Node as ProseMirrorNode, ResolvedPos } from '@tiptap/pm/model'
2
+
2
3
  import { Predicate } from '../types'
3
4
 
4
- export default function findParentNodeClosestToPos($pos: ResolvedPos, predicate: Predicate): ({
5
- pos: number,
6
- start: number,
7
- depth: number,
8
- node: ProseMirrorNode,
9
- } | undefined) {
5
+ export function findParentNodeClosestToPos(
6
+ $pos: ResolvedPos,
7
+ predicate: Predicate,
8
+ ):
9
+ | {
10
+ pos: number
11
+ start: number
12
+ depth: number
13
+ node: ProseMirrorNode
14
+ }
15
+ | undefined {
10
16
  for (let i = $pos.depth; i > 0; i -= 1) {
11
17
  const node = $pos.node(i)
12
18
 
@@ -1,11 +1,12 @@
1
- import { Node } from 'prosemirror-model'
2
- import getSchema from './getSchema'
3
- import getHTMLFromFragment from './getHTMLFromFragment'
1
+ import { Node } from '@tiptap/pm/model'
2
+
4
3
  import { Extensions, JSONContent } from '../types'
4
+ import { getHTMLFromFragment } from './getHTMLFromFragment'
5
+ import { getSchema } from './getSchema'
5
6
 
6
- export default function generateHTML(doc: JSONContent, extensions: Extensions): string {
7
+ export function generateHTML(doc: JSONContent, extensions: Extensions): string {
7
8
  const schema = getSchema(extensions)
8
9
  const contentNode = Node.fromJSON(schema, doc)
9
10
 
10
- return getHTMLFromFragment(contentNode, schema)
11
+ return getHTMLFromFragment(contentNode.content, schema)
11
12
  }
@@ -1,13 +1,12 @@
1
- import { DOMParser } from 'prosemirror-model'
2
- import getSchema from './getSchema'
3
- import elementFromString from '../utilities/elementFromString'
1
+ import { DOMParser } from '@tiptap/pm/model'
2
+
4
3
  import { Extensions } from '../types'
4
+ import { elementFromString } from '../utilities/elementFromString'
5
+ import { getSchema } from './getSchema'
5
6
 
6
- export default function generateJSON(html: string, extensions: Extensions): Record<string, any> {
7
+ export function generateJSON(html: string, extensions: Extensions): Record<string, any> {
7
8
  const schema = getSchema(extensions)
8
9
  const dom = elementFromString(html)
9
10
 
10
- return DOMParser.fromSchema(schema)
11
- .parse(dom)
12
- .toJSON()
11
+ return DOMParser.fromSchema(schema).parse(dom).toJSON()
13
12
  }
@@ -0,0 +1,27 @@
1
+ import { Node } from '@tiptap/pm/model'
2
+
3
+ import { Extensions, JSONContent, TextSerializer } from '../types'
4
+ import { getSchema } from './getSchema'
5
+ import { getText } from './getText'
6
+ import { getTextSerializersFromSchema } from './getTextSerializersFromSchema'
7
+
8
+ export function generateText(
9
+ doc: JSONContent,
10
+ extensions: Extensions,
11
+ options?: {
12
+ blockSeparator?: string
13
+ textSerializers?: Record<string, TextSerializer>
14
+ },
15
+ ): string {
16
+ const { blockSeparator = '\n\n', textSerializers = {} } = options || {}
17
+ const schema = getSchema(extensions)
18
+ const contentNode = Node.fromJSON(schema, doc)
19
+
20
+ return getText(contentNode, {
21
+ blockSeparator,
22
+ textSerializers: {
23
+ ...getTextSerializersFromSchema(schema),
24
+ ...textSerializers,
25
+ },
26
+ })
27
+ }
@@ -1,17 +1,16 @@
1
- import { MarkType, NodeType } from 'prosemirror-model'
2
- import { EditorState } from 'prosemirror-state'
3
- import getSchemaTypeNameByName from './getSchemaTypeNameByName'
4
- import getNodeAttributes from './getNodeAttributes'
5
- import getMarkAttributes from './getMarkAttributes'
1
+ import { MarkType, NodeType } from '@tiptap/pm/model'
2
+ import { EditorState } from '@tiptap/pm/state'
6
3
 
7
- export default function getAttributes(
4
+ import { getMarkAttributes } from './getMarkAttributes'
5
+ import { getNodeAttributes } from './getNodeAttributes'
6
+ import { getSchemaTypeNameByName } from './getSchemaTypeNameByName'
7
+
8
+ export function getAttributes(
8
9
  state: EditorState,
9
10
  typeOrName: string | NodeType | MarkType,
10
11
  ): Record<string, any> {
11
12
  const schemaType = getSchemaTypeNameByName(
12
- typeof typeOrName === 'string'
13
- ? typeOrName
14
- : typeOrName.name,
13
+ typeof typeOrName === 'string' ? typeOrName : typeOrName.name,
15
14
  state.schema,
16
15
  )
17
16
 
@@ -1,20 +1,20 @@
1
- import splitExtensions from './splitExtensions'
2
- import getExtensionField from './getExtensionField'
1
+ import { MarkConfig, NodeConfig } from '..'
3
2
  import {
4
- Extensions,
5
- GlobalAttributes,
6
- Attributes,
3
+ AnyConfig,
7
4
  Attribute,
5
+ Attributes,
8
6
  ExtensionAttribute,
9
- AnyConfig,
7
+ Extensions,
8
+ GlobalAttributes,
10
9
  } from '../types'
11
- import { NodeConfig, MarkConfig } from '..'
10
+ import { getExtensionField } from './getExtensionField'
11
+ import { splitExtensions } from './splitExtensions'
12
12
 
13
13
  /**
14
14
  * Get a list of all extension attributes defined in `addAttribute` and `addGlobalAttribute`.
15
15
  * @param extensions List of extensions
16
16
  */
17
- export default function getAttributesFromExtensions(extensions: Extensions): ExtensionAttribute[] {
17
+ export function getAttributesFromExtensions(extensions: Extensions): ExtensionAttribute[] {
18
18
  const extensionAttributes: ExtensionAttribute[] = []
19
19
  const { nodeExtensions, markExtensions } = splitExtensions(extensions)
20
20
  const nodeAndMarkExtensions = [...nodeExtensions, ...markExtensions]
@@ -24,12 +24,14 @@ export default function getAttributesFromExtensions(extensions: Extensions): Ext
24
24
  renderHTML: null,
25
25
  parseHTML: null,
26
26
  keepOnSplit: true,
27
+ isRequired: false,
27
28
  }
28
29
 
29
30
  extensions.forEach(extension => {
30
31
  const context = {
31
32
  name: extension.name,
32
33
  options: extension.options,
34
+ storage: extension.storage,
33
35
  }
34
36
 
35
37
  const addGlobalAttributes = getExtensionField<AnyConfig['addGlobalAttributes']>(
@@ -67,6 +69,7 @@ export default function getAttributesFromExtensions(extensions: Extensions): Ext
67
69
  const context = {
68
70
  name: extension.name,
69
71
  options: extension.options,
72
+ storage: extension.storage,
70
73
  }
71
74
 
72
75
  const addAttributes = getExtensionField<NodeConfig['addAttributes'] | MarkConfig['addAttributes']>(
@@ -85,13 +88,23 @@ export default function getAttributesFromExtensions(extensions: Extensions): Ext
85
88
  Object
86
89
  .entries(attributes)
87
90
  .forEach(([name, attribute]) => {
91
+ const mergedAttr = {
92
+ ...defaultAttribute,
93
+ ...attribute,
94
+ }
95
+
96
+ if (typeof mergedAttr?.default === 'function') {
97
+ mergedAttr.default = mergedAttr.default()
98
+ }
99
+
100
+ if (mergedAttr?.isRequired && mergedAttr?.default === undefined) {
101
+ delete mergedAttr.default
102
+ }
103
+
88
104
  extensionAttributes.push({
89
105
  type: extension.name,
90
106
  name,
91
- attribute: {
92
- ...defaultAttribute,
93
- ...attribute,
94
- },
107
+ attribute: mergedAttr,
95
108
  })
96
109
  })
97
110
  })
@@ -0,0 +1,83 @@
1
+ import { Step, Transform } from '@tiptap/pm/transform'
2
+
3
+ import { Range } from '../types'
4
+ import { removeDuplicates } from '../utilities/removeDuplicates'
5
+
6
+ export type ChangedRange = {
7
+ oldRange: Range,
8
+ newRange: Range,
9
+ }
10
+
11
+ /**
12
+ * Removes duplicated ranges and ranges that are
13
+ * fully captured by other ranges.
14
+ */
15
+ function simplifyChangedRanges(changes: ChangedRange[]): ChangedRange[] {
16
+ const uniqueChanges = removeDuplicates(changes)
17
+
18
+ return uniqueChanges.length === 1
19
+ ? uniqueChanges
20
+ : uniqueChanges.filter((change, index) => {
21
+ const rest = uniqueChanges.filter((_, i) => i !== index)
22
+
23
+ return !rest.some(otherChange => {
24
+ return change.oldRange.from >= otherChange.oldRange.from
25
+ && change.oldRange.to <= otherChange.oldRange.to
26
+ && change.newRange.from >= otherChange.newRange.from
27
+ && change.newRange.to <= otherChange.newRange.to
28
+ })
29
+ })
30
+ }
31
+
32
+ /**
33
+ * Returns a list of changed ranges
34
+ * based on the first and last state of all steps.
35
+ */
36
+ export function getChangedRanges(transform: Transform): ChangedRange[] {
37
+ const { mapping, steps } = transform
38
+ const changes: ChangedRange[] = []
39
+
40
+ mapping.maps.forEach((stepMap, index) => {
41
+ const ranges: Range[] = []
42
+
43
+ // This accounts for step changes where no range was actually altered
44
+ // e.g. when setting a mark, node attribute, etc.
45
+ // @ts-ignore
46
+ if (!stepMap.ranges.length) {
47
+ const { from, to } = steps[index] as Step & {
48
+ from?: number,
49
+ to?: number,
50
+ }
51
+
52
+ if (from === undefined || to === undefined) {
53
+ return
54
+ }
55
+
56
+ ranges.push({ from, to })
57
+ } else {
58
+ stepMap.forEach((from, to) => {
59
+ ranges.push({ from, to })
60
+ })
61
+ }
62
+
63
+ ranges.forEach(({ from, to }) => {
64
+ const newStart = mapping.slice(index).map(from, -1)
65
+ const newEnd = mapping.slice(index).map(to)
66
+ const oldStart = mapping.invert().map(newStart, -1)
67
+ const oldEnd = mapping.invert().map(newEnd)
68
+
69
+ changes.push({
70
+ oldRange: {
71
+ from: oldStart,
72
+ to: oldEnd,
73
+ },
74
+ newRange: {
75
+ from: newStart,
76
+ to: newEnd,
77
+ },
78
+ })
79
+ })
80
+ })
81
+
82
+ return simplifyChangedRanges(changes)
83
+ }