@tiptap/core 2.11.7 → 3.0.0-beta.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 (499) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +5 -1
  3. package/dist/index.cjs +5047 -5070
  4. package/dist/index.cjs.map +1 -1
  5. package/dist/index.d.cts +3326 -0
  6. package/dist/index.d.ts +3326 -25
  7. package/dist/index.js +4931 -4976
  8. package/dist/index.js.map +1 -1
  9. package/dist/jsx-runtime/jsx-runtime.cjs +56 -0
  10. package/dist/jsx-runtime/jsx-runtime.cjs.map +1 -0
  11. package/dist/jsx-runtime/jsx-runtime.d.cts +22 -0
  12. package/dist/jsx-runtime/jsx-runtime.d.ts +22 -0
  13. package/dist/jsx-runtime/jsx-runtime.js +26 -0
  14. package/dist/jsx-runtime/jsx-runtime.js.map +1 -0
  15. package/jsx-runtime/index.cjs +1 -0
  16. package/jsx-runtime/index.d.cts +1 -0
  17. package/jsx-runtime/index.d.ts +1 -0
  18. package/jsx-runtime/index.js +1 -0
  19. package/package.json +28 -9
  20. package/src/CommandManager.ts +4 -11
  21. package/src/Editor.ts +219 -103
  22. package/src/EventEmitter.ts +7 -10
  23. package/src/Extendable.ts +484 -0
  24. package/src/Extension.ts +17 -492
  25. package/src/ExtensionManager.ts +88 -140
  26. package/src/InputRule.ts +40 -51
  27. package/src/Mark.ts +146 -623
  28. package/src/MarkView.ts +66 -0
  29. package/src/Node.ts +332 -825
  30. package/src/NodePos.ts +3 -5
  31. package/src/NodeView.ts +13 -23
  32. package/src/PasteRule.ts +46 -56
  33. package/src/Tracker.ts +8 -10
  34. package/src/commands/blur.ts +15 -13
  35. package/src/commands/clearContent.ts +13 -6
  36. package/src/commands/clearNodes.ts +33 -31
  37. package/src/commands/command.ts +2 -2
  38. package/src/commands/createParagraphNear.ts +6 -4
  39. package/src/commands/cut.ts +13 -11
  40. package/src/commands/deleteCurrentNode.ts +24 -22
  41. package/src/commands/deleteNode.ts +20 -18
  42. package/src/commands/deleteRange.ts +11 -9
  43. package/src/commands/deleteSelection.ts +6 -4
  44. package/src/commands/enter.ts +7 -5
  45. package/src/commands/exitCode.ts +6 -4
  46. package/src/commands/extendMarkRange.ts +16 -14
  47. package/src/commands/first.ts +3 -5
  48. package/src/commands/focus.ts +50 -53
  49. package/src/commands/forEach.ts +3 -3
  50. package/src/commands/insertContent.ts +14 -16
  51. package/src/commands/insertContentAt.ts +111 -95
  52. package/src/commands/join.ts +21 -13
  53. package/src/commands/joinItemBackward.ts +17 -19
  54. package/src/commands/joinItemForward.ts +17 -19
  55. package/src/commands/joinTextblockBackward.ts +6 -4
  56. package/src/commands/joinTextblockForward.ts +6 -4
  57. package/src/commands/keyboardShortcut.ts +30 -35
  58. package/src/commands/lift.ts +12 -10
  59. package/src/commands/liftEmptyBlock.ts +7 -5
  60. package/src/commands/liftListItem.ts +8 -6
  61. package/src/commands/newlineInCode.ts +6 -4
  62. package/src/commands/resetAttributes.ts +38 -43
  63. package/src/commands/scrollIntoView.ts +10 -8
  64. package/src/commands/selectAll.ts +11 -9
  65. package/src/commands/selectNodeBackward.ts +6 -4
  66. package/src/commands/selectNodeForward.ts +6 -4
  67. package/src/commands/selectParentNode.ts +6 -4
  68. package/src/commands/selectTextblockEnd.ts +6 -4
  69. package/src/commands/selectTextblockStart.ts +6 -4
  70. package/src/commands/setContent.ts +39 -38
  71. package/src/commands/setMark.ts +58 -60
  72. package/src/commands/setMeta.ts +8 -6
  73. package/src/commands/setNode.ts +34 -32
  74. package/src/commands/setNodeSelection.ts +12 -10
  75. package/src/commands/setTextSelection.ts +16 -14
  76. package/src/commands/sinkListItem.ts +8 -6
  77. package/src/commands/splitBlock.ts +70 -78
  78. package/src/commands/splitListItem.ts +95 -107
  79. package/src/commands/toggleList.ts +76 -74
  80. package/src/commands/toggleMark.ts +13 -11
  81. package/src/commands/toggleNode.ts +20 -18
  82. package/src/commands/toggleWrap.ts +12 -10
  83. package/src/commands/undoInputRule.ts +32 -30
  84. package/src/commands/unsetAllMarks.ts +17 -15
  85. package/src/commands/unsetMark.ts +29 -27
  86. package/src/commands/updateAttributes.ts +94 -102
  87. package/src/commands/wrapIn.ts +8 -6
  88. package/src/commands/wrapInList.ts +8 -6
  89. package/src/extensions/clipboardTextSerializer.ts +2 -4
  90. package/src/extensions/delete.ts +89 -0
  91. package/src/extensions/focusEvents.ts +2 -6
  92. package/src/extensions/index.ts +1 -0
  93. package/src/extensions/keymap.ts +54 -50
  94. package/src/extensions/paste.ts +0 -1
  95. package/src/extensions/tabindex.ts +1 -1
  96. package/src/helpers/combineTransactionSteps.ts +3 -6
  97. package/src/helpers/createChainableState.ts +2 -5
  98. package/src/helpers/createDocument.ts +2 -4
  99. package/src/helpers/createNodeFromContent.ts +7 -12
  100. package/src/helpers/defaultBlockAt.ts +1 -1
  101. package/src/helpers/findChildren.ts +2 -2
  102. package/src/helpers/findChildrenInRange.ts +3 -7
  103. package/src/helpers/findParentNode.ts +5 -3
  104. package/src/helpers/findParentNodeClosestToPos.ts +2 -2
  105. package/src/helpers/flattenExtensions.ts +30 -0
  106. package/src/helpers/generateHTML.ts +1 -1
  107. package/src/helpers/generateJSON.ts +1 -1
  108. package/src/helpers/generateText.ts +1 -1
  109. package/src/helpers/getAttributes.ts +3 -6
  110. package/src/helpers/getAttributesFromExtensions.ts +29 -38
  111. package/src/helpers/getChangedRanges.ts +15 -13
  112. package/src/helpers/getDebugJSON.ts +2 -2
  113. package/src/helpers/getExtensionField.ts +12 -12
  114. package/src/helpers/getHTMLFromFragment.ts +2 -1
  115. package/src/helpers/getMarkAttributes.ts +3 -6
  116. package/src/helpers/getMarkRange.ts +7 -17
  117. package/src/helpers/getMarkType.ts +2 -4
  118. package/src/helpers/getMarksBetween.ts +2 -2
  119. package/src/helpers/getNodeAtPosition.ts +2 -2
  120. package/src/helpers/getNodeAttributes.ts +3 -6
  121. package/src/helpers/getNodeType.ts +2 -4
  122. package/src/helpers/getRenderedAttributes.ts +3 -5
  123. package/src/helpers/getSchema.ts +5 -5
  124. package/src/helpers/getSchemaByResolvedExtensions.ts +47 -78
  125. package/src/helpers/getSchemaTypeByName.ts +1 -1
  126. package/src/helpers/getSchemaTypeNameByName.ts +1 -1
  127. package/src/helpers/getSplittedAttributes.ts +5 -5
  128. package/src/helpers/getText.ts +2 -2
  129. package/src/helpers/getTextBetween.ts +2 -2
  130. package/src/helpers/getTextContentFromNodes.ts +9 -12
  131. package/src/helpers/getTextSerializersFromSchema.ts +2 -2
  132. package/src/helpers/index.ts +3 -0
  133. package/src/helpers/injectExtensionAttributesToParseRule.ts +3 -3
  134. package/src/helpers/isActive.ts +2 -6
  135. package/src/helpers/isAtEndOfNode.ts +1 -1
  136. package/src/helpers/isAtStartOfNode.ts +1 -1
  137. package/src/helpers/isExtensionRulesEnabled.ts +2 -4
  138. package/src/helpers/isList.ts +2 -2
  139. package/src/helpers/isMarkActive.ts +3 -3
  140. package/src/helpers/isNodeActive.ts +3 -3
  141. package/src/helpers/isNodeEmpty.ts +3 -3
  142. package/src/helpers/posToDOMRect.ts +1 -1
  143. package/src/helpers/resolveExtensions.ts +25 -0
  144. package/src/helpers/resolveFocusPosition.ts +5 -16
  145. package/src/helpers/rewriteUnknownContent.ts +25 -24
  146. package/src/helpers/selectionToInsertionEnd.ts +2 -1
  147. package/src/helpers/sortExtensions.ts +26 -0
  148. package/src/helpers/splitExtensions.ts +4 -4
  149. package/src/index.ts +3 -7
  150. package/src/inputRules/markInputRule.ts +5 -8
  151. package/src/inputRules/nodeInputRule.ts +6 -12
  152. package/src/inputRules/textInputRule.ts +3 -5
  153. package/src/inputRules/textblockTypeInputRule.ts +6 -11
  154. package/src/inputRules/wrappingInputRule.ts +18 -23
  155. package/src/jsx-runtime.ts +64 -0
  156. package/src/pasteRules/markPasteRule.ts +5 -6
  157. package/src/pasteRules/nodePasteRule.ts +6 -11
  158. package/src/pasteRules/textPasteRule.ts +3 -5
  159. package/src/style.ts +0 -4
  160. package/src/types.ts +534 -179
  161. package/src/utilities/callOrReturn.ts +1 -1
  162. package/src/utilities/createStyleTag.ts +3 -1
  163. package/src/utilities/deleteProps.ts +7 -11
  164. package/src/utilities/elementFromString.ts +3 -0
  165. package/src/utilities/findDuplicates.ts +4 -1
  166. package/src/utilities/index.ts +1 -0
  167. package/src/utilities/isMacOS.ts +1 -3
  168. package/src/utilities/isiOS.ts +5 -10
  169. package/src/utilities/mergeAttributes.ts +16 -6
  170. package/src/utilities/removeDuplicates.ts +1 -3
  171. package/dist/CommandManager.d.ts +0 -21
  172. package/dist/CommandManager.d.ts.map +0 -1
  173. package/dist/Editor.d.ts +0 -166
  174. package/dist/Editor.d.ts.map +0 -1
  175. package/dist/EventEmitter.d.ts +0 -13
  176. package/dist/EventEmitter.d.ts.map +0 -1
  177. package/dist/Extension.d.ts +0 -345
  178. package/dist/Extension.d.ts.map +0 -1
  179. package/dist/ExtensionManager.d.ts +0 -57
  180. package/dist/ExtensionManager.d.ts.map +0 -1
  181. package/dist/InputRule.d.ts +0 -43
  182. package/dist/InputRule.d.ts.map +0 -1
  183. package/dist/Mark.d.ts +0 -453
  184. package/dist/Mark.d.ts.map +0 -1
  185. package/dist/Node.d.ts +0 -629
  186. package/dist/Node.d.ts.map +0 -1
  187. package/dist/NodePos.d.ts +0 -45
  188. package/dist/NodePos.d.ts.map +0 -1
  189. package/dist/NodeView.d.ts +0 -41
  190. package/dist/NodeView.d.ts.map +0 -1
  191. package/dist/PasteRule.d.ts +0 -51
  192. package/dist/PasteRule.d.ts.map +0 -1
  193. package/dist/Tracker.d.ts +0 -12
  194. package/dist/Tracker.d.ts.map +0 -1
  195. package/dist/commands/blur.d.ts +0 -14
  196. package/dist/commands/blur.d.ts.map +0 -1
  197. package/dist/commands/clearContent.d.ts +0 -15
  198. package/dist/commands/clearContent.d.ts.map +0 -1
  199. package/dist/commands/clearNodes.d.ts +0 -14
  200. package/dist/commands/clearNodes.d.ts.map +0 -1
  201. package/dist/commands/command.d.ts +0 -19
  202. package/dist/commands/command.d.ts.map +0 -1
  203. package/dist/commands/createParagraphNear.d.ts +0 -14
  204. package/dist/commands/createParagraphNear.d.ts.map +0 -1
  205. package/dist/commands/cut.d.ts +0 -21
  206. package/dist/commands/cut.d.ts.map +0 -1
  207. package/dist/commands/deleteCurrentNode.d.ts +0 -14
  208. package/dist/commands/deleteCurrentNode.d.ts.map +0 -1
  209. package/dist/commands/deleteNode.d.ts +0 -16
  210. package/dist/commands/deleteNode.d.ts.map +0 -1
  211. package/dist/commands/deleteRange.d.ts +0 -15
  212. package/dist/commands/deleteRange.d.ts.map +0 -1
  213. package/dist/commands/deleteSelection.d.ts +0 -14
  214. package/dist/commands/deleteSelection.d.ts.map +0 -1
  215. package/dist/commands/enter.d.ts +0 -14
  216. package/dist/commands/enter.d.ts.map +0 -1
  217. package/dist/commands/exitCode.d.ts +0 -14
  218. package/dist/commands/exitCode.d.ts.map +0 -1
  219. package/dist/commands/extendMarkRange.d.ts +0 -26
  220. package/dist/commands/extendMarkRange.d.ts.map +0 -1
  221. package/dist/commands/first.d.ts +0 -15
  222. package/dist/commands/first.d.ts.map +0 -1
  223. package/dist/commands/focus.d.ts +0 -28
  224. package/dist/commands/focus.d.ts.map +0 -1
  225. package/dist/commands/forEach.d.ts +0 -15
  226. package/dist/commands/forEach.d.ts.map +0 -1
  227. package/dist/commands/index.d.ts +0 -56
  228. package/dist/commands/index.d.ts.map +0 -1
  229. package/dist/commands/insertContent.d.ts +0 -35
  230. package/dist/commands/insertContent.d.ts.map +0 -1
  231. package/dist/commands/insertContentAt.d.ts +0 -48
  232. package/dist/commands/insertContentAt.d.ts.map +0 -1
  233. package/dist/commands/join.d.ts +0 -42
  234. package/dist/commands/join.d.ts.map +0 -1
  235. package/dist/commands/joinItemBackward.d.ts +0 -14
  236. package/dist/commands/joinItemBackward.d.ts.map +0 -1
  237. package/dist/commands/joinItemForward.d.ts +0 -14
  238. package/dist/commands/joinItemForward.d.ts.map +0 -1
  239. package/dist/commands/joinTextblockBackward.d.ts +0 -13
  240. package/dist/commands/joinTextblockBackward.d.ts.map +0 -1
  241. package/dist/commands/joinTextblockForward.d.ts +0 -13
  242. package/dist/commands/joinTextblockForward.d.ts.map +0 -1
  243. package/dist/commands/keyboardShortcut.d.ts +0 -15
  244. package/dist/commands/keyboardShortcut.d.ts.map +0 -1
  245. package/dist/commands/lift.d.ts +0 -18
  246. package/dist/commands/lift.d.ts.map +0 -1
  247. package/dist/commands/liftEmptyBlock.d.ts +0 -14
  248. package/dist/commands/liftEmptyBlock.d.ts.map +0 -1
  249. package/dist/commands/liftListItem.d.ts +0 -16
  250. package/dist/commands/liftListItem.d.ts.map +0 -1
  251. package/dist/commands/newlineInCode.d.ts +0 -14
  252. package/dist/commands/newlineInCode.d.ts.map +0 -1
  253. package/dist/commands/resetAttributes.d.ts +0 -17
  254. package/dist/commands/resetAttributes.d.ts.map +0 -1
  255. package/dist/commands/scrollIntoView.d.ts +0 -14
  256. package/dist/commands/scrollIntoView.d.ts.map +0 -1
  257. package/dist/commands/selectAll.d.ts +0 -14
  258. package/dist/commands/selectAll.d.ts.map +0 -1
  259. package/dist/commands/selectNodeBackward.d.ts +0 -14
  260. package/dist/commands/selectNodeBackward.d.ts.map +0 -1
  261. package/dist/commands/selectNodeForward.d.ts +0 -14
  262. package/dist/commands/selectNodeForward.d.ts.map +0 -1
  263. package/dist/commands/selectParentNode.d.ts +0 -14
  264. package/dist/commands/selectParentNode.d.ts.map +0 -1
  265. package/dist/commands/selectTextblockEnd.d.ts +0 -14
  266. package/dist/commands/selectTextblockEnd.d.ts.map +0 -1
  267. package/dist/commands/selectTextblockStart.d.ts +0 -14
  268. package/dist/commands/selectTextblockStart.d.ts.map +0 -1
  269. package/dist/commands/setContent.d.ts +0 -41
  270. package/dist/commands/setContent.d.ts.map +0 -1
  271. package/dist/commands/setMark.d.ts +0 -16
  272. package/dist/commands/setMark.d.ts.map +0 -1
  273. package/dist/commands/setMeta.d.ts +0 -17
  274. package/dist/commands/setMeta.d.ts.map +0 -1
  275. package/dist/commands/setNode.d.ts +0 -17
  276. package/dist/commands/setNode.d.ts.map +0 -1
  277. package/dist/commands/setNodeSelection.d.ts +0 -15
  278. package/dist/commands/setNodeSelection.d.ts.map +0 -1
  279. package/dist/commands/setTextSelection.d.ts +0 -15
  280. package/dist/commands/setTextSelection.d.ts.map +0 -1
  281. package/dist/commands/sinkListItem.d.ts +0 -16
  282. package/dist/commands/sinkListItem.d.ts.map +0 -1
  283. package/dist/commands/splitBlock.d.ts +0 -18
  284. package/dist/commands/splitBlock.d.ts.map +0 -1
  285. package/dist/commands/splitListItem.d.ts +0 -17
  286. package/dist/commands/splitListItem.d.ts.map +0 -1
  287. package/dist/commands/toggleList.d.ts +0 -19
  288. package/dist/commands/toggleList.d.ts.map +0 -1
  289. package/dist/commands/toggleMark.d.ts +0 -31
  290. package/dist/commands/toggleMark.d.ts.map +0 -1
  291. package/dist/commands/toggleNode.d.ts +0 -18
  292. package/dist/commands/toggleNode.d.ts.map +0 -1
  293. package/dist/commands/toggleWrap.d.ts +0 -17
  294. package/dist/commands/toggleWrap.d.ts.map +0 -1
  295. package/dist/commands/undoInputRule.d.ts +0 -14
  296. package/dist/commands/undoInputRule.d.ts.map +0 -1
  297. package/dist/commands/unsetAllMarks.d.ts +0 -14
  298. package/dist/commands/unsetAllMarks.d.ts.map +0 -1
  299. package/dist/commands/unsetMark.d.ts +0 -26
  300. package/dist/commands/unsetMark.d.ts.map +0 -1
  301. package/dist/commands/updateAttributes.d.ts +0 -25
  302. package/dist/commands/updateAttributes.d.ts.map +0 -1
  303. package/dist/commands/wrapIn.d.ts +0 -17
  304. package/dist/commands/wrapIn.d.ts.map +0 -1
  305. package/dist/commands/wrapInList.d.ts +0 -17
  306. package/dist/commands/wrapInList.d.ts.map +0 -1
  307. package/dist/extensions/clipboardTextSerializer.d.ts +0 -6
  308. package/dist/extensions/clipboardTextSerializer.d.ts.map +0 -1
  309. package/dist/extensions/commands.d.ts +0 -4
  310. package/dist/extensions/commands.d.ts.map +0 -1
  311. package/dist/extensions/drop.d.ts +0 -3
  312. package/dist/extensions/drop.d.ts.map +0 -1
  313. package/dist/extensions/editable.d.ts +0 -3
  314. package/dist/extensions/editable.d.ts.map +0 -1
  315. package/dist/extensions/focusEvents.d.ts +0 -5
  316. package/dist/extensions/focusEvents.d.ts.map +0 -1
  317. package/dist/extensions/index.d.ts +0 -9
  318. package/dist/extensions/index.d.ts.map +0 -1
  319. package/dist/extensions/keymap.d.ts +0 -3
  320. package/dist/extensions/keymap.d.ts.map +0 -1
  321. package/dist/extensions/paste.d.ts +0 -3
  322. package/dist/extensions/paste.d.ts.map +0 -1
  323. package/dist/extensions/tabindex.d.ts +0 -3
  324. package/dist/extensions/tabindex.d.ts.map +0 -1
  325. package/dist/helpers/combineTransactionSteps.d.ts +0 -11
  326. package/dist/helpers/combineTransactionSteps.d.ts.map +0 -1
  327. package/dist/helpers/createChainableState.d.ts +0 -11
  328. package/dist/helpers/createChainableState.d.ts.map +0 -1
  329. package/dist/helpers/createDocument.d.ts +0 -13
  330. package/dist/helpers/createDocument.d.ts.map +0 -1
  331. package/dist/helpers/createNodeFromContent.d.ts +0 -16
  332. package/dist/helpers/createNodeFromContent.d.ts.map +0 -1
  333. package/dist/helpers/defaultBlockAt.d.ts +0 -8
  334. package/dist/helpers/defaultBlockAt.d.ts.map +0 -1
  335. package/dist/helpers/findChildren.d.ts +0 -10
  336. package/dist/helpers/findChildren.d.ts.map +0 -1
  337. package/dist/helpers/findChildrenInRange.d.ts +0 -11
  338. package/dist/helpers/findChildrenInRange.d.ts.map +0 -1
  339. package/dist/helpers/findParentNode.d.ts +0 -17
  340. package/dist/helpers/findParentNode.d.ts.map +0 -1
  341. package/dist/helpers/findParentNodeClosestToPos.d.ts +0 -18
  342. package/dist/helpers/findParentNodeClosestToPos.d.ts.map +0 -1
  343. package/dist/helpers/generateHTML.d.ts +0 -9
  344. package/dist/helpers/generateHTML.d.ts.map +0 -1
  345. package/dist/helpers/generateJSON.d.ts +0 -9
  346. package/dist/helpers/generateJSON.d.ts.map +0 -1
  347. package/dist/helpers/generateText.d.ts +0 -13
  348. package/dist/helpers/generateText.d.ts.map +0 -1
  349. package/dist/helpers/getAttributes.d.ts +0 -10
  350. package/dist/helpers/getAttributes.d.ts.map +0 -1
  351. package/dist/helpers/getAttributesFromExtensions.d.ts +0 -7
  352. package/dist/helpers/getAttributesFromExtensions.d.ts.map +0 -1
  353. package/dist/helpers/getChangedRanges.d.ts +0 -12
  354. package/dist/helpers/getChangedRanges.d.ts.map +0 -1
  355. package/dist/helpers/getDebugJSON.d.ts +0 -9
  356. package/dist/helpers/getDebugJSON.d.ts.map +0 -1
  357. package/dist/helpers/getExtensionField.d.ts +0 -10
  358. package/dist/helpers/getExtensionField.d.ts.map +0 -1
  359. package/dist/helpers/getHTMLFromFragment.d.ts +0 -3
  360. package/dist/helpers/getHTMLFromFragment.d.ts.map +0 -1
  361. package/dist/helpers/getMarkAttributes.d.ts +0 -4
  362. package/dist/helpers/getMarkAttributes.d.ts.map +0 -1
  363. package/dist/helpers/getMarkRange.d.ts +0 -20
  364. package/dist/helpers/getMarkRange.d.ts.map +0 -1
  365. package/dist/helpers/getMarkType.d.ts +0 -3
  366. package/dist/helpers/getMarkType.d.ts.map +0 -1
  367. package/dist/helpers/getMarksBetween.d.ts +0 -4
  368. package/dist/helpers/getMarksBetween.d.ts.map +0 -1
  369. package/dist/helpers/getNodeAtPosition.d.ts +0 -12
  370. package/dist/helpers/getNodeAtPosition.d.ts.map +0 -1
  371. package/dist/helpers/getNodeAttributes.d.ts +0 -4
  372. package/dist/helpers/getNodeAttributes.d.ts.map +0 -1
  373. package/dist/helpers/getNodeType.d.ts +0 -3
  374. package/dist/helpers/getNodeType.d.ts.map +0 -1
  375. package/dist/helpers/getRenderedAttributes.d.ts +0 -4
  376. package/dist/helpers/getRenderedAttributes.d.ts.map +0 -1
  377. package/dist/helpers/getSchema.d.ts +0 -5
  378. package/dist/helpers/getSchema.d.ts.map +0 -1
  379. package/dist/helpers/getSchemaByResolvedExtensions.d.ts +0 -11
  380. package/dist/helpers/getSchemaByResolvedExtensions.d.ts.map +0 -1
  381. package/dist/helpers/getSchemaTypeByName.d.ts +0 -9
  382. package/dist/helpers/getSchemaTypeByName.d.ts.map +0 -1
  383. package/dist/helpers/getSchemaTypeNameByName.d.ts +0 -9
  384. package/dist/helpers/getSchemaTypeNameByName.d.ts.map +0 -1
  385. package/dist/helpers/getSplittedAttributes.d.ts +0 -10
  386. package/dist/helpers/getSplittedAttributes.d.ts.map +0 -1
  387. package/dist/helpers/getText.d.ts +0 -16
  388. package/dist/helpers/getText.d.ts.map +0 -1
  389. package/dist/helpers/getTextBetween.d.ts +0 -15
  390. package/dist/helpers/getTextBetween.d.ts.map +0 -1
  391. package/dist/helpers/getTextContentFromNodes.d.ts +0 -9
  392. package/dist/helpers/getTextContentFromNodes.d.ts.map +0 -1
  393. package/dist/helpers/getTextSerializersFromSchema.d.ts +0 -9
  394. package/dist/helpers/getTextSerializersFromSchema.d.ts.map +0 -1
  395. package/dist/helpers/index.d.ts +0 -52
  396. package/dist/helpers/index.d.ts.map +0 -1
  397. package/dist/helpers/injectExtensionAttributesToParseRule.d.ts +0 -10
  398. package/dist/helpers/injectExtensionAttributesToParseRule.d.ts.map +0 -1
  399. package/dist/helpers/isActive.d.ts +0 -3
  400. package/dist/helpers/isActive.d.ts.map +0 -1
  401. package/dist/helpers/isAtEndOfNode.d.ts +0 -3
  402. package/dist/helpers/isAtEndOfNode.d.ts.map +0 -1
  403. package/dist/helpers/isAtStartOfNode.d.ts +0 -3
  404. package/dist/helpers/isAtStartOfNode.d.ts.map +0 -1
  405. package/dist/helpers/isExtensionRulesEnabled.d.ts +0 -3
  406. package/dist/helpers/isExtensionRulesEnabled.d.ts.map +0 -1
  407. package/dist/helpers/isList.d.ts +0 -3
  408. package/dist/helpers/isList.d.ts.map +0 -1
  409. package/dist/helpers/isMarkActive.d.ts +0 -4
  410. package/dist/helpers/isMarkActive.d.ts.map +0 -1
  411. package/dist/helpers/isNodeActive.d.ts +0 -4
  412. package/dist/helpers/isNodeActive.d.ts.map +0 -1
  413. package/dist/helpers/isNodeEmpty.d.ts +0 -15
  414. package/dist/helpers/isNodeEmpty.d.ts.map +0 -1
  415. package/dist/helpers/isNodeSelection.d.ts +0 -3
  416. package/dist/helpers/isNodeSelection.d.ts.map +0 -1
  417. package/dist/helpers/isTextSelection.d.ts +0 -3
  418. package/dist/helpers/isTextSelection.d.ts.map +0 -1
  419. package/dist/helpers/posToDOMRect.d.ts +0 -3
  420. package/dist/helpers/posToDOMRect.d.ts.map +0 -1
  421. package/dist/helpers/resolveFocusPosition.d.ts +0 -5
  422. package/dist/helpers/resolveFocusPosition.d.ts.map +0 -1
  423. package/dist/helpers/rewriteUnknownContent.d.ts +0 -46
  424. package/dist/helpers/rewriteUnknownContent.d.ts.map +0 -1
  425. package/dist/helpers/selectionToInsertionEnd.d.ts +0 -3
  426. package/dist/helpers/selectionToInsertionEnd.d.ts.map +0 -1
  427. package/dist/helpers/splitExtensions.d.ts +0 -10
  428. package/dist/helpers/splitExtensions.d.ts.map +0 -1
  429. package/dist/index.d.ts.map +0 -1
  430. package/dist/index.umd.js +0 -5525
  431. package/dist/index.umd.js.map +0 -1
  432. package/dist/inputRules/index.d.ts +0 -6
  433. package/dist/inputRules/index.d.ts.map +0 -1
  434. package/dist/inputRules/markInputRule.d.ts +0 -14
  435. package/dist/inputRules/markInputRule.d.ts.map +0 -1
  436. package/dist/inputRules/nodeInputRule.d.ts +0 -24
  437. package/dist/inputRules/nodeInputRule.d.ts.map +0 -1
  438. package/dist/inputRules/textInputRule.d.ts +0 -11
  439. package/dist/inputRules/textInputRule.d.ts.map +0 -1
  440. package/dist/inputRules/textblockTypeInputRule.d.ts +0 -16
  441. package/dist/inputRules/textblockTypeInputRule.d.ts.map +0 -1
  442. package/dist/inputRules/wrappingInputRule.d.ts +0 -29
  443. package/dist/inputRules/wrappingInputRule.d.ts.map +0 -1
  444. package/dist/pasteRules/index.d.ts +0 -4
  445. package/dist/pasteRules/index.d.ts.map +0 -1
  446. package/dist/pasteRules/markPasteRule.d.ts +0 -14
  447. package/dist/pasteRules/markPasteRule.d.ts.map +0 -1
  448. package/dist/pasteRules/nodePasteRule.d.ts +0 -15
  449. package/dist/pasteRules/nodePasteRule.d.ts.map +0 -1
  450. package/dist/pasteRules/textPasteRule.d.ts +0 -11
  451. package/dist/pasteRules/textPasteRule.d.ts.map +0 -1
  452. package/dist/style.d.ts +0 -2
  453. package/dist/style.d.ts.map +0 -1
  454. package/dist/types.d.ts +0 -323
  455. package/dist/types.d.ts.map +0 -1
  456. package/dist/utilities/callOrReturn.d.ts +0 -10
  457. package/dist/utilities/callOrReturn.d.ts.map +0 -1
  458. package/dist/utilities/createStyleTag.d.ts +0 -2
  459. package/dist/utilities/createStyleTag.d.ts.map +0 -1
  460. package/dist/utilities/deleteProps.d.ts +0 -7
  461. package/dist/utilities/deleteProps.d.ts.map +0 -1
  462. package/dist/utilities/elementFromString.d.ts +0 -2
  463. package/dist/utilities/elementFromString.d.ts.map +0 -1
  464. package/dist/utilities/escapeForRegEx.d.ts +0 -2
  465. package/dist/utilities/escapeForRegEx.d.ts.map +0 -1
  466. package/dist/utilities/findDuplicates.d.ts +0 -2
  467. package/dist/utilities/findDuplicates.d.ts.map +0 -1
  468. package/dist/utilities/fromString.d.ts +0 -2
  469. package/dist/utilities/fromString.d.ts.map +0 -1
  470. package/dist/utilities/index.d.ts +0 -21
  471. package/dist/utilities/index.d.ts.map +0 -1
  472. package/dist/utilities/isAndroid.d.ts +0 -2
  473. package/dist/utilities/isAndroid.d.ts.map +0 -1
  474. package/dist/utilities/isEmptyObject.d.ts +0 -2
  475. package/dist/utilities/isEmptyObject.d.ts.map +0 -1
  476. package/dist/utilities/isFunction.d.ts +0 -2
  477. package/dist/utilities/isFunction.d.ts.map +0 -1
  478. package/dist/utilities/isMacOS.d.ts +0 -2
  479. package/dist/utilities/isMacOS.d.ts.map +0 -1
  480. package/dist/utilities/isNumber.d.ts +0 -2
  481. package/dist/utilities/isNumber.d.ts.map +0 -1
  482. package/dist/utilities/isPlainObject.d.ts +0 -2
  483. package/dist/utilities/isPlainObject.d.ts.map +0 -1
  484. package/dist/utilities/isRegExp.d.ts +0 -2
  485. package/dist/utilities/isRegExp.d.ts.map +0 -1
  486. package/dist/utilities/isString.d.ts +0 -2
  487. package/dist/utilities/isString.d.ts.map +0 -1
  488. package/dist/utilities/isiOS.d.ts +0 -2
  489. package/dist/utilities/isiOS.d.ts.map +0 -1
  490. package/dist/utilities/mergeAttributes.d.ts +0 -2
  491. package/dist/utilities/mergeAttributes.d.ts.map +0 -1
  492. package/dist/utilities/mergeDeep.d.ts +0 -2
  493. package/dist/utilities/mergeDeep.d.ts.map +0 -1
  494. package/dist/utilities/minMax.d.ts +0 -2
  495. package/dist/utilities/minMax.d.ts.map +0 -1
  496. package/dist/utilities/objectIncludes.d.ts +0 -9
  497. package/dist/utilities/objectIncludes.d.ts.map +0 -1
  498. package/dist/utilities/removeDuplicates.d.ts +0 -9
  499. package/dist/utilities/removeDuplicates.d.ts.map +0 -1
package/src/Editor.ts CHANGED
@@ -1,20 +1,21 @@
1
1
  /* eslint-disable @typescript-eslint/no-empty-object-type */
2
- import {
3
- MarkType,
4
- Node as ProseMirrorNode,
5
- NodeType,
6
- Schema,
7
- } from '@tiptap/pm/model'
8
- import {
9
- EditorState, Plugin, PluginKey, Transaction,
10
- } from '@tiptap/pm/state'
2
+ import type { MarkType, Node as ProseMirrorNode, NodeType, Schema } from '@tiptap/pm/model'
3
+ import type { Plugin, PluginKey, Transaction } from '@tiptap/pm/state'
4
+ import { EditorState } from '@tiptap/pm/state'
11
5
  import { EditorView } from '@tiptap/pm/view'
12
6
 
13
7
  import { CommandManager } from './CommandManager.js'
14
8
  import { EventEmitter } from './EventEmitter.js'
15
9
  import { ExtensionManager } from './ExtensionManager.js'
16
10
  import {
17
- ClipboardTextSerializer, Commands, Drop, Editable, FocusEvents, Keymap, Paste,
11
+ ClipboardTextSerializer,
12
+ Commands,
13
+ Delete,
14
+ Drop,
15
+ Editable,
16
+ FocusEvents,
17
+ Keymap,
18
+ Paste,
18
19
  Tabindex,
19
20
  } from './extensions/index.js'
20
21
  import { createDocument } from './helpers/createDocument.js'
@@ -25,16 +26,19 @@ import { getTextSerializersFromSchema } from './helpers/getTextSerializersFromSc
25
26
  import { isActive } from './helpers/isActive.js'
26
27
  import { isNodeEmpty } from './helpers/isNodeEmpty.js'
27
28
  import { resolveFocusPosition } from './helpers/resolveFocusPosition.js'
29
+ import type { Storage } from './index.js'
28
30
  import { NodePos } from './NodePos.js'
29
31
  import { style } from './style.js'
30
- import {
32
+ import type {
31
33
  CanCommands,
32
34
  ChainedCommands,
35
+ DocumentType,
33
36
  EditorEvents,
34
37
  EditorOptions,
35
- JSONContent,
38
+ NodeType as TNodeType,
36
39
  SingleCommands,
37
40
  TextSerializer,
41
+ TextType as TTextType,
38
42
  } from './types.js'
39
43
  import { createStyleTag } from './utilities/createStyleTag.js'
40
44
  import { isFunction } from './utilities/isFunction.js'
@@ -51,23 +55,30 @@ export class Editor extends EventEmitter<EditorEvents> {
51
55
 
52
56
  public extensionManager!: ExtensionManager
53
57
 
54
- private css!: HTMLStyleElement
58
+ private css: HTMLStyleElement | null = null
55
59
 
56
60
  public schema!: Schema
57
61
 
58
- public view!: EditorView
62
+ private editorView: EditorView | null = null
59
63
 
60
64
  public isFocused = false
61
65
 
66
+ private editorState!: EditorState
67
+
62
68
  /**
63
69
  * The editor is considered initialized after the `create` event has been emitted.
64
70
  */
65
71
  public isInitialized = false
66
72
 
67
- public extensionStorage: Record<string, any> = {}
73
+ public extensionStorage: Storage = {} as Storage
74
+
75
+ /**
76
+ * A unique ID for this editor instance.
77
+ */
78
+ public instanceId = Math.random().toString(36).slice(2, 9)
68
79
 
69
80
  public options: EditorOptions = {
70
- element: document.createElement('div'),
81
+ element: typeof document !== 'undefined' ? document.createElement('div') : null,
71
82
  content: '',
72
83
  injectCSS: true,
73
84
  injectNonce: undefined,
@@ -89,9 +100,12 @@ export class Editor extends EventEmitter<EditorEvents> {
89
100
  onFocus: () => null,
90
101
  onBlur: () => null,
91
102
  onDestroy: () => null,
92
- onContentError: ({ error }) => { throw error },
103
+ onContentError: ({ error }) => {
104
+ throw error
105
+ },
93
106
  onPaste: () => null,
94
107
  onDrop: () => null,
108
+ onDelete: () => null,
95
109
  }
96
110
 
97
111
  constructor(options: Partial<EditorOptions> = {}) {
@@ -103,8 +117,6 @@ export class Editor extends EventEmitter<EditorEvents> {
103
117
  this.on('beforeCreate', this.options.onBeforeCreate)
104
118
  this.emit('beforeCreate', { editor: this })
105
119
  this.on('contentError', this.options.onContentError)
106
- this.createView()
107
- this.injectCSS()
108
120
  this.on('create', this.options.onCreate)
109
121
  this.on('update', this.options.onUpdate)
110
122
  this.on('selectionUpdate', this.options.onSelectionUpdate)
@@ -114,6 +126,33 @@ export class Editor extends EventEmitter<EditorEvents> {
114
126
  this.on('destroy', this.options.onDestroy)
115
127
  this.on('drop', ({ event, slice, moved }) => this.options.onDrop(event, slice, moved))
116
128
  this.on('paste', ({ event, slice }) => this.options.onPaste(event, slice))
129
+ this.on('delete', this.options.onDelete)
130
+
131
+ const initialDoc = this.createDoc()
132
+ const selection = resolveFocusPosition(initialDoc, this.options.autofocus)
133
+
134
+ // Set editor state immediately, so that it's available independently from the view
135
+ this.editorState = EditorState.create({
136
+ doc: initialDoc,
137
+ schema: this.schema,
138
+ selection: selection || undefined,
139
+ })
140
+
141
+ if (this.options.element) {
142
+ this.mount(this.options.element)
143
+ }
144
+ }
145
+
146
+ /**
147
+ * Attach the editor to the DOM, creating a new editor view.
148
+ */
149
+ public mount(el: NonNullable<EditorOptions['element']> & {}) {
150
+ if (typeof document === 'undefined') {
151
+ throw new Error(
152
+ `[tiptap error]: The editor cannot be mounted because there is no 'document' defined in this environment.`,
153
+ )
154
+ }
155
+ this.createView(el)
117
156
 
118
157
  window.setTimeout(() => {
119
158
  if (this.isDestroyed) {
@@ -126,10 +165,30 @@ export class Editor extends EventEmitter<EditorEvents> {
126
165
  }, 0)
127
166
  }
128
167
 
168
+ /**
169
+ * Remove the editor from the DOM, but still allow remounting at a different point in time
170
+ */
171
+ public unmount() {
172
+ if (this.editorView) {
173
+ // Cleanup our reference to prevent circular references which caused memory leaks
174
+ // @ts-ignore
175
+ const dom = this.editorView.dom as TiptapEditorHTMLElement
176
+
177
+ if (dom?.editor) {
178
+ delete dom.editor
179
+ }
180
+ this.editorView.destroy()
181
+ }
182
+ this.editorView = null
183
+ this.isInitialized = false
184
+ this.css?.remove()
185
+ this.css = null
186
+ }
187
+
129
188
  /**
130
189
  * Returns the editor storage.
131
190
  */
132
- public get storage(): Record<string, any> {
191
+ public get storage(): Storage {
133
192
  return this.extensionStorage
134
193
  }
135
194
 
@@ -158,7 +217,7 @@ export class Editor extends EventEmitter<EditorEvents> {
158
217
  * Inject CSS styles.
159
218
  */
160
219
  private injectCSS(): void {
161
- if (this.options.injectCSS && document) {
220
+ if (this.options.injectCSS && typeof document !== 'undefined') {
162
221
  this.css = createStyleTag(style, this.options.injectNonce)
163
222
  }
164
223
  }
@@ -174,7 +233,7 @@ export class Editor extends EventEmitter<EditorEvents> {
174
233
  ...options,
175
234
  }
176
235
 
177
- if (!this.view || !this.state || this.isDestroyed) {
236
+ if (!this.editorView || !this.state || this.isDestroyed) {
178
237
  return
179
238
  }
180
239
 
@@ -192,7 +251,7 @@ export class Editor extends EventEmitter<EditorEvents> {
192
251
  this.setOptions({ editable })
193
252
 
194
253
  if (emitUpdate) {
195
- this.emit('update', { editor: this, transaction: this.state.tr })
254
+ this.emit('update', { editor: this, transaction: this.state.tr, appendedTransactions: [] })
196
255
  }
197
256
  }
198
257
 
@@ -206,11 +265,57 @@ export class Editor extends EventEmitter<EditorEvents> {
206
265
  return this.options.editable && this.view && this.view.editable
207
266
  }
208
267
 
268
+ /**
269
+ * Returns the editor state.
270
+ */
271
+ public get view(): EditorView {
272
+ if (this.editorView) {
273
+ return this.editorView
274
+ }
275
+
276
+ return new Proxy(
277
+ {
278
+ state: this.editorState,
279
+ updateState: (state: EditorState): ReturnType<EditorView['updateState']> => {
280
+ this.editorState = state
281
+ },
282
+ dispatch: (tr: Transaction): ReturnType<EditorView['dispatch']> => {
283
+ this.editorState = this.state.apply(tr)
284
+ },
285
+
286
+ // Stub some commonly accessed properties to prevent errors
287
+ composing: false,
288
+ dragging: null,
289
+ editable: true,
290
+ } as EditorView,
291
+ {
292
+ get: (obj, key) => {
293
+ // Specifically always return the most recent editorState
294
+ if (key === 'state') {
295
+ return this.editorState
296
+ }
297
+ if (key in obj) {
298
+ return Reflect.get(obj, key)
299
+ }
300
+
301
+ // We throw an error here, because we know the view is not available
302
+ throw new Error(
303
+ `[tiptap error]: The editor view is not available. Cannot access view['${key as string}']. The editor may not be mounted yet.`,
304
+ )
305
+ },
306
+ },
307
+ ) as EditorView
308
+ }
309
+
209
310
  /**
210
311
  * Returns the editor state.
211
312
  */
212
313
  public get state(): EditorState {
213
- return this.view.state
314
+ if (this.editorView) {
315
+ this.editorState = this.view.state
316
+ }
317
+
318
+ return this.editorState
214
319
  }
215
320
 
216
321
  /**
@@ -241,15 +346,17 @@ export class Editor extends EventEmitter<EditorEvents> {
241
346
  * @param nameOrPluginKeyToRemove The plugins name
242
347
  * @returns The new editor state or undefined if the editor is destroyed
243
348
  */
244
- public unregisterPlugin(nameOrPluginKeyToRemove: string | PluginKey | (string | PluginKey)[]): EditorState | undefined {
349
+ public unregisterPlugin(
350
+ nameOrPluginKeyToRemove: string | PluginKey | (string | PluginKey)[],
351
+ ): EditorState | undefined {
245
352
  if (this.isDestroyed) {
246
353
  return undefined
247
354
  }
248
355
 
249
356
  const prevPlugins = this.state.plugins
250
- let plugins = prevPlugins;
357
+ let plugins = prevPlugins
251
358
 
252
- ([] as (string | PluginKey)[]).concat(nameOrPluginKeyToRemove).forEach(nameOrPluginKey => {
359
+ ;([] as (string | PluginKey)[]).concat(nameOrPluginKeyToRemove).forEach(nameOrPluginKey => {
253
360
  // @ts-ignore
254
361
  const name = typeof nameOrPluginKey === 'string' ? `${nameOrPluginKey}$` : nameOrPluginKey.key
255
362
 
@@ -275,24 +382,28 @@ export class Editor extends EventEmitter<EditorEvents> {
275
382
  * Creates an extension manager.
276
383
  */
277
384
  private createExtensionManager(): void {
278
-
279
- const coreExtensions = this.options.enableCoreExtensions ? [
280
- Editable,
281
- ClipboardTextSerializer.configure({
282
- blockSeparator: this.options.coreExtensionOptions?.clipboardTextSerializer?.blockSeparator,
283
- }),
284
- Commands,
285
- FocusEvents,
286
- Keymap,
287
- Tabindex,
288
- Drop,
289
- Paste,
290
- ].filter(ext => {
291
- if (typeof this.options.enableCoreExtensions === 'object') {
292
- return this.options.enableCoreExtensions[ext.name as keyof typeof this.options.enableCoreExtensions] !== false
293
- }
294
- return true
295
- }) : []
385
+ const coreExtensions = this.options.enableCoreExtensions
386
+ ? [
387
+ Editable,
388
+ ClipboardTextSerializer.configure({
389
+ blockSeparator: this.options.coreExtensionOptions?.clipboardTextSerializer?.blockSeparator,
390
+ }),
391
+ Commands,
392
+ FocusEvents,
393
+ Keymap,
394
+ Tabindex,
395
+ Drop,
396
+ Paste,
397
+ Delete,
398
+ ].filter(ext => {
399
+ if (typeof this.options.enableCoreExtensions === 'object') {
400
+ return (
401
+ this.options.enableCoreExtensions[ext.name as keyof typeof this.options.enableCoreExtensions] !== false
402
+ )
403
+ }
404
+ return true
405
+ })
406
+ : []
296
407
  const allExtensions = [...coreExtensions, ...this.options.extensions].filter(extension => {
297
408
  return ['extension', 'node', 'mark'].includes(extension?.type)
298
409
  })
@@ -317,20 +428,20 @@ export class Editor extends EventEmitter<EditorEvents> {
317
428
  }
318
429
 
319
430
  /**
320
- * Creates a ProseMirror view.
431
+ * Creates the initial document.
321
432
  */
322
- private createView(): void {
433
+ private createDoc(): ProseMirrorNode {
323
434
  let doc: ProseMirrorNode
324
435
 
325
436
  try {
326
- doc = createDocument(
327
- this.options.content,
328
- this.schema,
329
- this.options.parseOptions,
330
- { errorOnInvalidContent: this.options.enableContentCheck },
331
- )
437
+ doc = createDocument(this.options.content, this.schema, this.options.parseOptions, {
438
+ errorOnInvalidContent: this.options.enableContentCheck,
439
+ })
332
440
  } catch (e) {
333
- if (!(e instanceof Error) || !['[tiptap error]: Invalid JSON content', '[tiptap error]: Invalid HTML content'].includes(e.message)) {
441
+ if (
442
+ !(e instanceof Error) ||
443
+ !['[tiptap error]: Invalid JSON content', '[tiptap error]: Invalid HTML content'].includes(e.message)
444
+ ) {
334
445
  // Not the content error we were expecting
335
446
  throw e
336
447
  }
@@ -338,8 +449,12 @@ export class Editor extends EventEmitter<EditorEvents> {
338
449
  editor: this,
339
450
  error: e as Error,
340
451
  disableCollaboration: () => {
341
- if (this.storage.collaboration) {
342
- this.storage.collaboration.isDisabled = true
452
+ if (
453
+ 'collaboration' in this.storage &&
454
+ typeof this.storage.collaboration === 'object' &&
455
+ this.storage.collaboration
456
+ ) {
457
+ ;(this.storage.collaboration as any).isDisabled = true
343
458
  }
344
459
  // To avoid syncing back invalid content, reinitialize the extensions without the collaboration extension
345
460
  this.options.extensions = this.options.extensions.filter(extension => extension.name !== 'collaboration')
@@ -350,16 +465,18 @@ export class Editor extends EventEmitter<EditorEvents> {
350
465
  })
351
466
 
352
467
  // Content is invalid, but attempt to create it anyway, stripping out the invalid parts
353
- doc = createDocument(
354
- this.options.content,
355
- this.schema,
356
- this.options.parseOptions,
357
- { errorOnInvalidContent: false },
358
- )
468
+ doc = createDocument(this.options.content, this.schema, this.options.parseOptions, {
469
+ errorOnInvalidContent: false,
470
+ })
359
471
  }
360
- const selection = resolveFocusPosition(doc, this.options.autofocus)
472
+ return doc
473
+ }
361
474
 
362
- this.view = new EditorView(this.options.element, {
475
+ /**
476
+ * Creates a ProseMirror view.
477
+ */
478
+ private createView(element: NonNullable<EditorOptions['element']> & {}): void {
479
+ this.editorView = new EditorView(element, {
363
480
  ...this.options.editorProps,
364
481
  attributes: {
365
482
  // add `role="textbox"` to the editor element
@@ -367,10 +484,7 @@ export class Editor extends EventEmitter<EditorEvents> {
367
484
  ...this.options.editorProps?.attributes,
368
485
  },
369
486
  dispatchTransaction: this.dispatchTransaction.bind(this),
370
- state: EditorState.create({
371
- doc,
372
- selection: selection || undefined,
373
- }),
487
+ state: this.editorState,
374
488
  })
375
489
 
376
490
  // `editor.view` is not yet available at this time.
@@ -383,6 +497,7 @@ export class Editor extends EventEmitter<EditorEvents> {
383
497
 
384
498
  this.createNodeViews()
385
499
  this.prependClass()
500
+ this.injectCSS()
386
501
 
387
502
  // Let’s store the editor instance in the DOM element.
388
503
  // So we’ll have access to it for tests.
@@ -393,7 +508,7 @@ export class Editor extends EventEmitter<EditorEvents> {
393
508
  }
394
509
 
395
510
  /**
396
- * Creates all node views.
511
+ * Creates all node and mark views.
397
512
  */
398
513
  public createNodeViews(): void {
399
514
  if (this.view.isDestroyed) {
@@ -401,6 +516,7 @@ export class Editor extends EventEmitter<EditorEvents> {
401
516
  }
402
517
 
403
518
  this.view.setProps({
519
+ markViews: this.extensionManager.markViews,
404
520
  nodeViews: this.extensionManager.nodeViews,
405
521
  })
406
522
  }
@@ -452,18 +568,30 @@ export class Editor extends EventEmitter<EditorEvents> {
452
568
  return
453
569
  }
454
570
 
455
- const state = this.state.apply(transaction)
571
+ // Apply transaction and get resulting state and transactions
572
+ const { state, transactions } = this.state.applyTransaction(transaction)
456
573
  const selectionHasChanged = !this.state.selection.eq(state.selection)
574
+ const rootTrWasApplied = transactions.includes(transaction)
575
+ const prevState = this.state
457
576
 
458
577
  this.emit('beforeTransaction', {
459
578
  editor: this,
460
579
  transaction,
461
580
  nextState: state,
462
581
  })
582
+
583
+ // If transaction was filtered out, we can return early
584
+ if (!rootTrWasApplied) {
585
+ return
586
+ }
587
+
463
588
  this.view.updateState(state)
589
+
590
+ // Emit transaction event with appended transactions info
464
591
  this.emit('transaction', {
465
592
  editor: this,
466
593
  transaction,
594
+ appendedTransactions: transactions.slice(1),
467
595
  })
468
596
 
469
597
  if (selectionHasChanged) {
@@ -473,14 +601,17 @@ export class Editor extends EventEmitter<EditorEvents> {
473
601
  })
474
602
  }
475
603
 
476
- const focus = transaction.getMeta('focus')
477
- const blur = transaction.getMeta('blur')
604
+ // Only emit the latest between focus and blur events
605
+ const mostRecentFocusTr = transactions.findLast(tr => tr.getMeta('focus') || tr.getMeta('blur'))
606
+ const focus = mostRecentFocusTr?.getMeta('focus')
607
+ const blur = mostRecentFocusTr?.getMeta('blur')
478
608
 
479
609
  if (focus) {
480
610
  this.emit('focus', {
481
611
  editor: this,
482
612
  event: focus.event,
483
- transaction,
613
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
614
+ transaction: mostRecentFocusTr!,
484
615
  })
485
616
  }
486
617
 
@@ -488,17 +619,24 @@ export class Editor extends EventEmitter<EditorEvents> {
488
619
  this.emit('blur', {
489
620
  editor: this,
490
621
  event: blur.event,
491
- transaction,
622
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
623
+ transaction: mostRecentFocusTr!,
492
624
  })
493
625
  }
494
626
 
495
- if (!transaction.docChanged || transaction.getMeta('preventUpdate')) {
627
+ // Compare states for update event
628
+ if (
629
+ transaction.getMeta('preventUpdate') ||
630
+ !transactions.some(tr => tr.docChanged) ||
631
+ prevState.doc.eq(state.doc)
632
+ ) {
496
633
  return
497
634
  }
498
635
 
499
636
  this.emit('update', {
500
637
  editor: this,
501
638
  transaction,
639
+ appendedTransactions: transactions.slice(1),
502
640
  })
503
641
  }
504
642
 
@@ -528,7 +666,10 @@ export class Editor extends EventEmitter<EditorEvents> {
528
666
  /**
529
667
  * Get the document as JSON.
530
668
  */
531
- public getJSON(): JSONContent {
669
+ public getJSON(): DocumentType<
670
+ Record<string, any> | undefined,
671
+ TNodeType<string, undefined | Record<string, any>, any, (TNodeType | TTextType)[]>[]
672
+ > {
532
673
  return this.state.doc.toJSON()
533
674
  }
534
675
 
@@ -542,10 +683,7 @@ export class Editor extends EventEmitter<EditorEvents> {
542
683
  /**
543
684
  * Get the document as text.
544
685
  */
545
- public getText(options?: {
546
- blockSeparator?: string
547
- textSerializers?: Record<string, TextSerializer>
548
- }): string {
686
+ public getText(options?: { blockSeparator?: string; textSerializers?: Record<string, TextSerializer> }): string {
549
687
  const { blockSeparator = '\n\n', textSerializers = {} } = options || {}
550
688
 
551
689
  return getText(this.state.doc, {
@@ -564,35 +702,13 @@ export class Editor extends EventEmitter<EditorEvents> {
564
702
  return isNodeEmpty(this.state.doc)
565
703
  }
566
704
 
567
- /**
568
- * Get the number of characters for the current document.
569
- *
570
- * @deprecated
571
- */
572
- public getCharacterCount(): number {
573
- console.warn(
574
- '[tiptap warn]: "editor.getCharacterCount()" is deprecated. Please use "editor.storage.characterCount.characters()" instead.',
575
- )
576
-
577
- return this.state.doc.content.size - 2
578
- }
579
-
580
705
  /**
581
706
  * Destroy the editor.
582
707
  */
583
708
  public destroy(): void {
584
709
  this.emit('destroy')
585
710
 
586
- if (this.view) {
587
- // Cleanup our reference to prevent circular references which caused memory leaks
588
- // @ts-ignore
589
- const dom = this.view.dom as TiptapEditorHTMLElement
590
-
591
- if (dom && dom.editor) {
592
- delete dom.editor
593
- }
594
- this.view.destroy()
595
- }
711
+ this.unmount()
596
712
 
597
713
  this.removeAllListeners()
598
714
  }
@@ -1,16 +1,13 @@
1
1
  type StringKeyOf<T> = Extract<keyof T, string>
2
- type CallbackType<
3
- T extends Record<string, any>,
4
- EventName extends StringKeyOf<T>,
5
- > = T[EventName] extends any[] ? T[EventName] : [T[EventName]]
6
- type CallbackFunction<
7
- T extends Record<string, any>,
8
- EventName extends StringKeyOf<T>,
9
- > = (...props: CallbackType<T, EventName>) => any
2
+ type CallbackType<T extends Record<string, any>, EventName extends StringKeyOf<T>> = T[EventName] extends any[]
3
+ ? T[EventName]
4
+ : [T[EventName]]
5
+ type CallbackFunction<T extends Record<string, any>, EventName extends StringKeyOf<T>> = (
6
+ ...props: CallbackType<T, EventName>
7
+ ) => any
10
8
 
11
9
  export class EventEmitter<T extends Record<string, any>> {
12
-
13
- private callbacks: { [key: string]: Array<(...args: any[])=>void> } = {}
10
+ private callbacks: { [key: string]: Array<(...args: any[]) => void> } = {}
14
11
 
15
12
  public on<EventName extends StringKeyOf<T>>(event: EventName, fn: CallbackFunction<T, EventName>): this {
16
13
  if (!this.callbacks[event]) {