@tiptap/core 2.0.0-beta.2 → 2.0.0-beta.200

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 (331) hide show
  1. package/README.md +2 -2
  2. package/dist/packages/core/src/CommandManager.d.ts +13 -6
  3. package/dist/packages/core/src/Editor.d.ts +27 -25
  4. package/dist/packages/core/src/EventEmitter.d.ts +8 -4
  5. package/dist/packages/core/src/Extension.d.ts +103 -26
  6. package/dist/packages/core/src/ExtensionManager.d.ts +8 -12
  7. package/dist/packages/core/src/InputRule.d.ts +42 -0
  8. package/dist/packages/core/src/Mark.d.ts +148 -31
  9. package/dist/packages/core/src/Node.d.ts +162 -33
  10. package/dist/packages/core/src/NodeView.d.ts +27 -0
  11. package/dist/packages/core/src/PasteRule.d.ts +42 -0
  12. package/dist/packages/core/src/Tracker.d.ts +11 -0
  13. package/dist/packages/core/src/commands/blur.d.ts +3 -3
  14. package/dist/packages/core/src/commands/clearContent.d.ts +3 -3
  15. package/dist/packages/core/src/commands/clearNodes.d.ts +3 -3
  16. package/dist/packages/core/src/commands/command.d.ts +2 -2
  17. package/dist/packages/core/src/commands/createParagraphNear.d.ts +3 -3
  18. package/dist/packages/core/src/commands/deleteNode.d.ts +13 -0
  19. package/dist/packages/core/src/commands/deleteRange.d.ts +3 -3
  20. package/dist/packages/core/src/commands/deleteSelection.d.ts +3 -3
  21. package/dist/packages/core/src/commands/enter.d.ts +3 -3
  22. package/dist/packages/core/src/commands/exitCode.d.ts +3 -3
  23. package/dist/packages/core/src/commands/extendMarkRange.d.ts +3 -3
  24. package/dist/packages/core/src/commands/first.d.ts +3 -3
  25. package/dist/packages/core/src/commands/focus.d.ts +5 -3
  26. package/dist/packages/core/src/commands/forEach.d.ts +14 -0
  27. package/dist/packages/core/src/commands/index.d.ts +50 -0
  28. package/dist/packages/core/src/commands/insertContent.d.ts +16 -0
  29. package/dist/packages/core/src/commands/insertContentAt.d.ts +16 -0
  30. package/dist/packages/core/src/commands/joinBackward.d.ts +3 -3
  31. package/dist/packages/core/src/commands/joinForward.d.ts +3 -3
  32. package/dist/packages/core/src/commands/keyboardShortcut.d.ts +3 -3
  33. package/dist/packages/core/src/commands/lift.d.ts +3 -3
  34. package/dist/packages/core/src/commands/liftEmptyBlock.d.ts +3 -3
  35. package/dist/packages/core/src/commands/liftListItem.d.ts +3 -3
  36. package/dist/packages/core/src/commands/newlineInCode.d.ts +3 -3
  37. package/dist/packages/core/src/commands/resetAttributes.d.ts +13 -0
  38. package/dist/packages/core/src/commands/scrollIntoView.d.ts +3 -3
  39. package/dist/packages/core/src/commands/selectAll.d.ts +3 -3
  40. package/dist/packages/core/src/commands/selectNodeBackward.d.ts +3 -3
  41. package/dist/packages/core/src/commands/selectNodeForward.d.ts +3 -3
  42. package/dist/packages/core/src/commands/selectParentNode.d.ts +3 -3
  43. package/dist/packages/core/src/commands/selectTextblockEnd.d.ts +12 -0
  44. package/dist/packages/core/src/commands/selectTextblockStart.d.ts +12 -0
  45. package/dist/packages/core/src/commands/setContent.d.ts +4 -3
  46. package/dist/packages/core/src/commands/setMark.d.ts +3 -3
  47. package/dist/packages/core/src/commands/setMeta.d.ts +12 -0
  48. package/dist/packages/core/src/commands/setNode.d.ts +3 -3
  49. package/dist/packages/core/src/commands/setNodeSelection.d.ts +12 -0
  50. package/dist/packages/core/src/commands/setTextSelection.d.ts +12 -0
  51. package/dist/packages/core/src/commands/sinkListItem.d.ts +3 -3
  52. package/dist/packages/core/src/commands/splitBlock.d.ts +3 -3
  53. package/dist/packages/core/src/commands/splitListItem.d.ts +3 -3
  54. package/dist/packages/core/src/commands/toggleList.d.ts +3 -3
  55. package/dist/packages/core/src/commands/toggleMark.d.ts +8 -3
  56. package/dist/packages/core/src/commands/toggleNode.d.ts +3 -3
  57. package/dist/packages/core/src/commands/toggleWrap.d.ts +3 -3
  58. package/dist/packages/core/src/commands/undoInputRule.d.ts +3 -3
  59. package/dist/packages/core/src/commands/unsetAllMarks.d.ts +3 -3
  60. package/dist/packages/core/src/commands/unsetMark.d.ts +8 -3
  61. package/dist/packages/core/src/commands/updateAttributes.d.ts +13 -0
  62. package/dist/packages/core/src/commands/wrapIn.d.ts +3 -3
  63. package/dist/packages/core/src/commands/wrapInList.d.ts +3 -3
  64. package/dist/packages/core/src/extensions/clipboardTextSerializer.d.ts +1 -1
  65. package/dist/packages/core/src/extensions/commands.d.ts +2 -91
  66. package/dist/packages/core/src/extensions/editable.d.ts +1 -1
  67. package/dist/packages/core/src/extensions/focusEvents.d.ts +1 -1
  68. package/dist/packages/core/src/extensions/index.d.ts +1 -0
  69. package/dist/packages/core/src/extensions/keymap.d.ts +1 -1
  70. package/dist/packages/core/src/extensions/tabindex.d.ts +2 -0
  71. package/dist/packages/core/src/helpers/combineTransactionSteps.d.ts +7 -0
  72. package/dist/packages/core/src/helpers/createChainableState.d.ts +5 -0
  73. package/dist/packages/core/src/helpers/createDocument.d.ts +3 -0
  74. package/dist/packages/core/src/helpers/createNodeFromContent.d.ts +7 -0
  75. package/dist/packages/core/src/helpers/defaultBlockAt.d.ts +2 -0
  76. package/dist/packages/core/src/helpers/findChildren.d.ts +3 -0
  77. package/dist/packages/core/src/helpers/findChildrenInRange.d.ts +6 -0
  78. package/dist/packages/core/src/helpers/findParentNode.d.ts +2 -3
  79. package/dist/packages/core/src/helpers/findParentNodeClosestToPos.d.ts +2 -2
  80. package/dist/packages/core/src/helpers/generateHTML.d.ts +2 -2
  81. package/dist/packages/core/src/helpers/generateJSON.d.ts +2 -0
  82. package/dist/packages/core/src/helpers/generateText.d.ts +5 -0
  83. package/dist/packages/core/src/helpers/getAttributes.d.ts +3 -0
  84. package/dist/packages/core/src/helpers/getAttributesFromExtensions.d.ts +2 -2
  85. package/dist/packages/core/src/helpers/getChangedRanges.d.ts +11 -0
  86. package/dist/packages/core/src/helpers/getDebugJSON.d.ts +8 -0
  87. package/dist/packages/core/src/helpers/getExtensionField.d.ts +2 -0
  88. package/dist/packages/core/src/helpers/getHTMLFromFragment.d.ts +2 -2
  89. package/dist/packages/core/src/helpers/getMarkAttributes.d.ts +2 -3
  90. package/dist/packages/core/src/helpers/getMarkRange.d.ts +1 -1
  91. package/dist/packages/core/src/helpers/getMarkType.d.ts +1 -1
  92. package/dist/packages/core/src/helpers/getMarksBetween.d.ts +2 -2
  93. package/dist/packages/core/src/helpers/getNodeAttributes.d.ts +2 -3
  94. package/dist/packages/core/src/helpers/getNodeType.d.ts +1 -1
  95. package/dist/packages/core/src/helpers/getRenderedAttributes.d.ts +3 -3
  96. package/dist/packages/core/src/helpers/getSchema.d.ts +1 -1
  97. package/dist/packages/core/src/helpers/getSchemaByResolvedExtensions.d.ts +3 -0
  98. package/dist/packages/core/src/helpers/getSchemaTypeByName.d.ts +1 -1
  99. package/dist/packages/core/src/helpers/getSchemaTypeNameByName.d.ts +1 -1
  100. package/dist/packages/core/src/helpers/getSplittedAttributes.d.ts +2 -2
  101. package/dist/packages/core/src/helpers/getText.d.ts +6 -0
  102. package/dist/packages/core/src/helpers/getTextBetween.d.ts +6 -0
  103. package/dist/packages/core/src/helpers/getTextContentFromNodes.d.ts +2 -0
  104. package/dist/packages/core/src/helpers/getTextSerializersFromSchema.d.ts +3 -0
  105. package/dist/packages/core/src/helpers/index.d.ts +33 -0
  106. package/dist/packages/core/src/helpers/injectExtensionAttributesToParseRule.d.ts +1 -1
  107. package/dist/packages/core/src/helpers/isActive.d.ts +1 -2
  108. package/dist/packages/core/src/helpers/isExtensionRulesEnabled.d.ts +2 -0
  109. package/dist/packages/core/src/helpers/isList.d.ts +1 -1
  110. package/dist/packages/core/src/helpers/isMarkActive.d.ts +2 -3
  111. package/dist/packages/core/src/helpers/isNodeActive.d.ts +2 -3
  112. package/dist/packages/core/src/helpers/isNodeEmpty.d.ts +2 -0
  113. package/dist/packages/core/src/helpers/isNodeSelection.d.ts +1 -1
  114. package/dist/packages/core/src/helpers/isTextSelection.d.ts +1 -1
  115. package/dist/packages/core/src/helpers/posToDOMRect.d.ts +2 -0
  116. package/dist/packages/core/src/helpers/resolveFocusPosition.d.ts +4 -0
  117. package/dist/packages/core/src/helpers/selectionToInsertionEnd.d.ts +1 -1
  118. package/dist/packages/core/src/helpers/splitExtensions.d.ts +6 -6
  119. package/dist/packages/core/src/index.d.ts +15 -20
  120. package/dist/packages/core/src/inputRules/index.d.ts +5 -0
  121. package/dist/packages/core/src/inputRules/markInputRule.d.ts +11 -2
  122. package/dist/packages/core/src/inputRules/nodeInputRule.d.ts +11 -2
  123. package/dist/packages/core/src/inputRules/textInputRule.d.ts +9 -0
  124. package/dist/packages/core/src/inputRules/textblockTypeInputRule.d.ts +14 -0
  125. package/dist/packages/core/src/inputRules/wrappingInputRule.d.ts +23 -0
  126. package/dist/packages/core/src/pasteRules/index.d.ts +3 -0
  127. package/dist/packages/core/src/pasteRules/markPasteRule.d.ts +11 -2
  128. package/dist/packages/core/src/pasteRules/nodePasteRule.d.ts +12 -0
  129. package/dist/packages/core/src/pasteRules/textPasteRule.d.ts +9 -0
  130. package/dist/packages/core/src/style.d.ts +1 -2
  131. package/dist/packages/core/src/types.d.ts +120 -53
  132. package/dist/packages/core/src/utilities/callOrReturn.d.ts +2 -1
  133. package/dist/packages/core/src/utilities/createStyleTag.d.ts +1 -1
  134. package/dist/packages/core/src/utilities/deleteProps.d.ts +1 -2
  135. package/dist/packages/core/src/utilities/elementFromString.d.ts +1 -1
  136. package/dist/packages/core/src/utilities/escapeForRegEx.d.ts +1 -0
  137. package/dist/packages/core/src/utilities/findDuplicates.d.ts +1 -0
  138. package/dist/packages/core/src/utilities/fromString.d.ts +1 -1
  139. package/dist/packages/core/src/utilities/index.d.ts +3 -0
  140. package/dist/packages/core/src/utilities/isEmptyObject.d.ts +1 -1
  141. package/dist/packages/core/src/utilities/isFunction.d.ts +1 -0
  142. package/dist/packages/core/src/utilities/isMacOS.d.ts +1 -0
  143. package/dist/packages/core/src/utilities/isNumber.d.ts +1 -0
  144. package/dist/packages/core/src/utilities/isPlainObject.d.ts +1 -1
  145. package/dist/packages/core/src/utilities/isRegExp.d.ts +1 -0
  146. package/dist/packages/core/src/utilities/isiOS.d.ts +1 -0
  147. package/dist/packages/core/src/utilities/mergeAttributes.d.ts +1 -2
  148. package/dist/packages/core/src/utilities/mergeDeep.d.ts +1 -2
  149. package/dist/packages/core/src/utilities/minMax.d.ts +1 -1
  150. package/dist/packages/core/src/utilities/objectIncludes.d.ts +3 -2
  151. package/dist/packages/core/src/utilities/removeDuplicates.d.ts +8 -0
  152. package/dist/tiptap-core.cjs.js +2896 -1261
  153. package/dist/tiptap-core.cjs.js.map +1 -1
  154. package/dist/tiptap-core.esm.js +2889 -1290
  155. package/dist/tiptap-core.esm.js.map +1 -1
  156. package/dist/tiptap-core.umd.js +2899 -1263
  157. package/dist/tiptap-core.umd.js.map +1 -1
  158. package/package.json +16 -20
  159. package/src/CommandManager.ts +64 -65
  160. package/src/Editor.ts +133 -98
  161. package/src/EventEmitter.ts +14 -4
  162. package/src/Extension.ts +198 -41
  163. package/src/ExtensionManager.ts +263 -78
  164. package/src/InputRule.ts +265 -0
  165. package/src/Mark.ts +285 -49
  166. package/src/Node.ts +284 -56
  167. package/src/NodeView.ts +261 -0
  168. package/src/PasteRule.ts +280 -0
  169. package/src/Tracker.ts +42 -0
  170. package/src/commands/blur.ts +12 -6
  171. package/src/commands/clearContent.ts +3 -3
  172. package/src/commands/clearNodes.ts +32 -18
  173. package/src/commands/command.ts +2 -2
  174. package/src/commands/createParagraphNear.ts +4 -3
  175. package/src/commands/deleteNode.ts +37 -0
  176. package/src/commands/deleteRange.ts +3 -3
  177. package/src/commands/deleteSelection.ts +4 -3
  178. package/src/commands/enter.ts +3 -3
  179. package/src/commands/exitCode.ts +4 -3
  180. package/src/commands/extendMarkRange.ts +12 -11
  181. package/src/commands/first.ts +3 -3
  182. package/src/commands/focus.ts +47 -44
  183. package/src/commands/forEach.ts +24 -0
  184. package/src/commands/index.ts +50 -0
  185. package/src/commands/insertContent.ts +24 -0
  186. package/src/commands/insertContentAt.ts +108 -0
  187. package/src/commands/joinBackward.ts +4 -3
  188. package/src/commands/joinForward.ts +4 -3
  189. package/src/commands/keyboardShortcut.ts +6 -6
  190. package/src/commands/lift.ts +6 -5
  191. package/src/commands/liftEmptyBlock.ts +4 -3
  192. package/src/commands/liftListItem.ts +6 -5
  193. package/src/commands/newlineInCode.ts +4 -3
  194. package/src/commands/resetAttributes.ts +62 -0
  195. package/src/commands/scrollIntoView.ts +3 -3
  196. package/src/commands/selectAll.ts +8 -6
  197. package/src/commands/selectNodeBackward.ts +4 -3
  198. package/src/commands/selectNodeForward.ts +4 -3
  199. package/src/commands/selectParentNode.ts +4 -3
  200. package/src/commands/selectTextblockEnd.ts +20 -0
  201. package/src/commands/selectTextblockStart.ts +20 -0
  202. package/src/commands/setContent.ts +12 -9
  203. package/src/commands/setMark.ts +83 -15
  204. package/src/commands/setMeta.ts +18 -0
  205. package/src/commands/setNode.ts +29 -7
  206. package/src/commands/setNodeSelection.ts +27 -0
  207. package/src/commands/setTextSelection.ts +33 -0
  208. package/src/commands/sinkListItem.ts +6 -5
  209. package/src/commands/splitBlock.ts +20 -23
  210. package/src/commands/splitListItem.ts +45 -18
  211. package/src/commands/toggleList.ts +83 -18
  212. package/src/commands/toggleMark.ts +18 -7
  213. package/src/commands/toggleNode.ts +6 -5
  214. package/src/commands/toggleWrap.ts +9 -9
  215. package/src/commands/undoInputRule.ts +34 -5
  216. package/src/commands/unsetAllMarks.ts +8 -10
  217. package/src/commands/unsetMark.ts +31 -13
  218. package/src/commands/updateAttributes.ts +73 -0
  219. package/src/commands/wrapIn.ts +5 -10
  220. package/src/commands/wrapInList.ts +6 -5
  221. package/src/extensions/clipboardTextSerializer.ts +14 -35
  222. package/src/extensions/commands.ts +3 -135
  223. package/src/extensions/editable.ts +1 -0
  224. package/src/extensions/focusEvents.ts +3 -5
  225. package/src/extensions/index.ts +1 -0
  226. package/src/extensions/keymap.ts +110 -13
  227. package/src/extensions/tabindex.ts +18 -0
  228. package/src/helpers/combineTransactionSteps.ts +18 -0
  229. package/src/helpers/createChainableState.ts +38 -0
  230. package/src/helpers/createDocument.ts +12 -0
  231. package/src/helpers/createNodeFromContent.ts +57 -0
  232. package/src/helpers/defaultBlockAt.ts +13 -0
  233. package/src/helpers/findChildren.ts +18 -0
  234. package/src/helpers/findChildrenInRange.ts +32 -0
  235. package/src/helpers/findParentNode.ts +3 -2
  236. package/src/helpers/findParentNodeClosestToPos.ts +3 -2
  237. package/src/helpers/generateHTML.ts +6 -5
  238. package/src/helpers/generateJSON.ts +14 -0
  239. package/src/helpers/generateText.ts +30 -0
  240. package/src/helpers/getAttributes.ts +28 -0
  241. package/src/helpers/getAttributesFromExtensions.ts +42 -14
  242. package/src/helpers/getChangedRanges.ts +83 -0
  243. package/src/helpers/getDebugJSON.ts +54 -0
  244. package/src/helpers/getExtensionField.ts +25 -0
  245. package/src/helpers/getHTMLFromFragment.ts +6 -5
  246. package/src/helpers/getMarkAttributes.ts +14 -10
  247. package/src/helpers/getMarkRange.ts +41 -8
  248. package/src/helpers/getMarkType.ts +5 -1
  249. package/src/helpers/getMarksBetween.ts +32 -10
  250. package/src/helpers/getNodeAttributes.ts +9 -9
  251. package/src/helpers/getNodeType.ts +5 -1
  252. package/src/helpers/getRenderedAttributes.ts +6 -7
  253. package/src/helpers/getSchema.ts +7 -137
  254. package/src/helpers/getSchemaByResolvedExtensions.ts +148 -0
  255. package/src/helpers/getSchemaTypeByName.ts +2 -10
  256. package/src/helpers/getSchemaTypeNameByName.ts +1 -1
  257. package/src/helpers/getSplittedAttributes.ts +4 -4
  258. package/src/helpers/getText.ts +19 -0
  259. package/src/helpers/getTextBetween.ts +49 -0
  260. package/src/helpers/getTextContentFromNodes.ts +21 -0
  261. package/src/helpers/getTextSerializersFromSchema.ts +10 -0
  262. package/src/helpers/index.ts +33 -0
  263. package/src/helpers/injectExtensionAttributesToParseRule.ts +17 -19
  264. package/src/helpers/isActive.ts +5 -5
  265. package/src/helpers/isExtensionRulesEnabled.ts +15 -0
  266. package/src/helpers/isList.ts +14 -7
  267. package/src/helpers/isMarkActive.ts +45 -20
  268. package/src/helpers/isNodeActive.ts +28 -35
  269. package/src/helpers/isNodeEmpty.ts +8 -0
  270. package/src/helpers/isNodeSelection.ts +2 -3
  271. package/src/helpers/isTextSelection.ts +2 -3
  272. package/src/helpers/posToDOMRect.ts +35 -0
  273. package/src/helpers/resolveFocusPosition.ts +43 -0
  274. package/src/helpers/selectionToInsertionEnd.ts +2 -2
  275. package/src/helpers/splitExtensions.ts +3 -3
  276. package/src/index.ts +16 -22
  277. package/src/inputRules/index.ts +5 -0
  278. package/src/inputRules/markInputRule.ts +59 -39
  279. package/src/inputRules/nodeInputRule.ts +45 -11
  280. package/src/inputRules/textInputRule.ts +35 -0
  281. package/src/inputRules/textblockTypeInputRule.ts +38 -0
  282. package/src/inputRules/wrappingInputRule.ts +60 -0
  283. package/src/pasteRules/index.ts +3 -0
  284. package/src/pasteRules/markPasteRule.ts +62 -53
  285. package/src/pasteRules/nodePasteRule.ts +39 -0
  286. package/src/pasteRules/textPasteRule.ts +35 -0
  287. package/src/style.ts +16 -3
  288. package/src/types.ts +132 -47
  289. package/src/utilities/callOrReturn.ts +6 -3
  290. package/src/utilities/createStyleTag.ts +12 -1
  291. package/src/utilities/deleteProps.ts +2 -4
  292. package/src/utilities/elementFromString.ts +4 -5
  293. package/src/utilities/escapeForRegEx.ts +4 -0
  294. package/src/utilities/findDuplicates.ts +5 -0
  295. package/src/utilities/fromString.ts +2 -2
  296. package/src/utilities/index.ts +3 -0
  297. package/src/utilities/isEmptyObject.ts +2 -2
  298. package/src/utilities/isFunction.ts +3 -0
  299. package/src/utilities/isMacOS.ts +5 -0
  300. package/src/utilities/isNumber.ts +3 -0
  301. package/src/utilities/isPlainObject.ts +8 -5
  302. package/src/utilities/isRegExp.ts +3 -0
  303. package/src/utilities/isString.ts +3 -0
  304. package/src/utilities/isiOS.ts +12 -0
  305. package/src/utilities/mergeAttributes.ts +2 -3
  306. package/src/utilities/mergeDeep.ts +2 -3
  307. package/src/utilities/minMax.ts +1 -1
  308. package/src/utilities/objectIncludes.ts +17 -5
  309. package/src/utilities/removeDuplicates.ts +15 -0
  310. package/CHANGELOG.md +0 -198
  311. package/LICENSE.md +0 -21
  312. package/dist/packages/core/src/commands/insertHTML.d.ts +0 -12
  313. package/dist/packages/core/src/commands/insertText.d.ts +0 -12
  314. package/dist/packages/core/src/commands/replace.d.ts +0 -13
  315. package/dist/packages/core/src/commands/replaceRange.d.ts +0 -13
  316. package/dist/packages/core/src/commands/resetNodeAttributes.d.ts +0 -13
  317. package/dist/packages/core/src/commands/updateNodeAttributes.d.ts +0 -13
  318. package/dist/packages/core/src/utilities/isClass.d.ts +0 -1
  319. package/dist/packages/core/src/utilities/isObject.d.ts +0 -1
  320. package/dist/packages/core/src/utilities/removeElement.d.ts +0 -1
  321. package/dist/tiptap-core.bundle.umd.min.js +0 -17
  322. package/dist/tiptap-core.bundle.umd.min.js.map +0 -1
  323. package/src/commands/insertHTML.ts +0 -28
  324. package/src/commands/insertText.ts +0 -20
  325. package/src/commands/replace.ts +0 -20
  326. package/src/commands/replaceRange.ts +0 -36
  327. package/src/commands/resetNodeAttributes.ts +0 -29
  328. package/src/commands/updateNodeAttributes.ts +0 -31
  329. package/src/utilities/isClass.ts +0 -7
  330. package/src/utilities/isObject.ts +0 -10
  331. package/src/utilities/removeElement.ts +0 -5
package/src/Editor.ts CHANGED
@@ -1,26 +1,36 @@
1
- import { EditorState, Plugin, Transaction } from 'prosemirror-state'
1
+ import { MarkType, NodeType, Schema } from 'prosemirror-model'
2
+ import {
3
+ EditorState,
4
+ Plugin,
5
+ PluginKey,
6
+ Transaction,
7
+ } from 'prosemirror-state'
2
8
  import { EditorView } from 'prosemirror-view'
3
- import { Schema, DOMParser, Node } from 'prosemirror-model'
4
- import elementFromString from './utilities/elementFromString'
5
- import getNodeAttributes from './helpers/getNodeAttributes'
6
- import getMarkAttributes from './helpers/getMarkAttributes'
7
- import isActive from './helpers/isActive'
8
- import removeElement from './utilities/removeElement'
9
- import getHTMLFromFragment from './helpers/getHTMLFromFragment'
10
- import createStyleTag from './utilities/createStyleTag'
11
- import CommandManager from './CommandManager'
12
- import ExtensionManager from './ExtensionManager'
13
- import EventEmitter from './EventEmitter'
9
+
10
+ import { CommandManager } from './CommandManager'
11
+ import { EventEmitter } from './EventEmitter'
12
+ import { ExtensionManager } from './ExtensionManager'
13
+ import * as extensions from './extensions'
14
+ import { createDocument } from './helpers/createDocument'
15
+ import { getAttributes } from './helpers/getAttributes'
16
+ import { getHTMLFromFragment } from './helpers/getHTMLFromFragment'
17
+ import { getText } from './helpers/getText'
18
+ import { getTextSerializersFromSchema } from './helpers/getTextSerializersFromSchema'
19
+ import { isActive } from './helpers/isActive'
20
+ import { isNodeEmpty } from './helpers/isNodeEmpty'
21
+ import { resolveFocusPosition } from './helpers/resolveFocusPosition'
22
+ import { style } from './style'
14
23
  import {
15
- EditorOptions,
16
- Content,
17
24
  CanCommands,
18
25
  ChainedCommands,
26
+ EditorEvents,
27
+ EditorOptions,
28
+ JSONContent,
19
29
  SingleCommands,
20
- AnyObject,
30
+ TextSerializer,
21
31
  } from './types'
22
- import * as extensions from './extensions'
23
- import style from './style'
32
+ import { createStyleTag } from './utilities/createStyleTag'
33
+ import { isFunction } from './utilities/isFunction'
24
34
 
25
35
  export { extensions }
26
36
 
@@ -28,7 +38,7 @@ export interface HTMLElement {
28
38
  editor?: Editor
29
39
  }
30
40
 
31
- export class Editor extends EventEmitter {
41
+ export class Editor extends EventEmitter<EditorEvents> {
32
42
 
33
43
  private commandManager!: CommandManager
34
44
 
@@ -42,10 +52,13 @@ export class Editor extends EventEmitter {
42
52
 
43
53
  public isFocused = false
44
54
 
55
+ public extensionStorage: Record<string, any> = {}
56
+
45
57
  public options: EditorOptions = {
46
58
  element: document.createElement('div'),
47
59
  content: '',
48
60
  injectCSS: true,
61
+ injectNonce: undefined,
49
62
  extensions: [],
50
63
  autofocus: false,
51
64
  editable: true,
@@ -53,10 +66,11 @@ export class Editor extends EventEmitter {
53
66
  parseOptions: {},
54
67
  enableInputRules: true,
55
68
  enablePasteRules: true,
69
+ enableCoreExtensions: true,
70
+ onBeforeCreate: () => null,
56
71
  onCreate: () => null,
57
72
  onUpdate: () => null,
58
73
  onSelectionUpdate: () => null,
59
- onViewUpdate: () => null,
60
74
  onTransaction: () => null,
61
75
  onFocus: () => null,
62
76
  onBlur: () => null,
@@ -69,42 +83,54 @@ export class Editor extends EventEmitter {
69
83
  this.createExtensionManager()
70
84
  this.createCommandManager()
71
85
  this.createSchema()
86
+ this.on('beforeCreate', this.options.onBeforeCreate)
87
+ this.emit('beforeCreate', { editor: this })
72
88
  this.createView()
73
89
  this.injectCSS()
74
90
  this.on('create', this.options.onCreate)
75
91
  this.on('update', this.options.onUpdate)
76
92
  this.on('selectionUpdate', this.options.onSelectionUpdate)
77
- this.on('viewUpdate', this.options.onViewUpdate)
78
93
  this.on('transaction', this.options.onTransaction)
79
94
  this.on('focus', this.options.onFocus)
80
95
  this.on('blur', this.options.onBlur)
81
96
  this.on('destroy', this.options.onDestroy)
82
97
 
83
98
  window.setTimeout(() => {
99
+ if (this.isDestroyed) {
100
+ return
101
+ }
102
+
84
103
  this.commands.focus(this.options.autofocus)
85
104
  this.emit('create', { editor: this })
86
105
  }, 0)
87
106
  }
88
107
 
108
+ /**
109
+ * Returns the editor storage.
110
+ */
111
+ public get storage(): Record<string, any> {
112
+ return this.extensionStorage
113
+ }
114
+
89
115
  /**
90
116
  * An object of all registered commands.
91
117
  */
92
118
  public get commands(): SingleCommands {
93
- return this.commandManager.createCommands()
119
+ return this.commandManager.commands
94
120
  }
95
121
 
96
122
  /**
97
123
  * Create a command chain to call multiple commands at once.
98
124
  */
99
125
  public chain(): ChainedCommands {
100
- return this.commandManager.createChain()
126
+ return this.commandManager.chain()
101
127
  }
102
128
 
103
129
  /**
104
130
  * Check if a command or a command chain can be executed. Without executing it.
105
131
  */
106
132
  public can(): CanCommands {
107
- return this.commandManager.createCan()
133
+ return this.commandManager.can()
108
134
  }
109
135
 
110
136
  /**
@@ -112,7 +138,7 @@ export class Editor extends EventEmitter {
112
138
  */
113
139
  private injectCSS(): void {
114
140
  if (this.options.injectCSS && document) {
115
- this.css = createStyleTag(style)
141
+ this.css = createStyleTag(style, this.options.injectNonce)
116
142
  }
117
143
  }
118
144
 
@@ -122,7 +148,20 @@ export class Editor extends EventEmitter {
122
148
  * @param options A list of options
123
149
  */
124
150
  public setOptions(options: Partial<EditorOptions> = {}): void {
125
- this.options = { ...this.options, ...options }
151
+ this.options = {
152
+ ...this.options,
153
+ ...options,
154
+ }
155
+
156
+ if (!this.view || !this.state || this.isDestroyed) {
157
+ return
158
+ }
159
+
160
+ if (this.options.editorProps) {
161
+ this.view.setProps(this.options.editorProps)
162
+ }
163
+
164
+ this.view.updateState(this.state)
126
165
  }
127
166
 
128
167
  /**
@@ -130,17 +169,19 @@ export class Editor extends EventEmitter {
130
169
  */
131
170
  public setEditable(editable: boolean): void {
132
171
  this.setOptions({ editable })
133
-
134
- if (this.view && this.state && !this.isDestroyed) {
135
- this.view.updateState(this.state)
136
- }
172
+ this.emit('update', { editor: this, transaction: this.state.tr })
137
173
  }
138
174
 
139
175
  /**
140
176
  * Returns whether the editor is editable.
141
177
  */
142
178
  public get isEditable(): boolean {
143
- return this.view && this.view.editable
179
+ // since plugins are applied after creating the view
180
+ // `editable` is always `true` for one tick.
181
+ // that’s why we also have to check for `options.editable`
182
+ return this.options.editable
183
+ && this.view
184
+ && this.view.editable
144
185
  }
145
186
 
146
187
  /**
@@ -157,8 +198,8 @@ export class Editor extends EventEmitter {
157
198
  * @param handlePlugins Control how to merge the plugin into the existing plugins.
158
199
  */
159
200
  public registerPlugin(plugin: Plugin, handlePlugins?: (newPlugin: Plugin, plugins: Plugin[]) => Plugin[]): void {
160
- const plugins = typeof handlePlugins === 'function'
161
- ? handlePlugins(plugin, this.state.plugins)
201
+ const plugins = isFunction(handlePlugins)
202
+ ? handlePlugins(plugin, [...this.state.plugins])
162
203
  : [...this.state.plugins, plugin]
163
204
 
164
205
  const state = this.state.reconfigure({ plugins })
@@ -169,12 +210,21 @@ export class Editor extends EventEmitter {
169
210
  /**
170
211
  * Unregister a ProseMirror plugin.
171
212
  *
172
- * @param name The plugins name
213
+ * @param nameOrPluginKey The plugins name
173
214
  */
174
- public unregisterPlugin(name: string): void {
215
+ public unregisterPlugin(nameOrPluginKey: string | PluginKey): void {
216
+ if (this.isDestroyed) {
217
+ return
218
+ }
219
+
220
+ const name = typeof nameOrPluginKey === 'string'
221
+ ? `${nameOrPluginKey}$`
222
+ // @ts-ignore
223
+ : nameOrPluginKey.key
224
+
175
225
  const state = this.state.reconfigure({
176
226
  // @ts-ignore
177
- plugins: this.state.plugins.filter(plugin => !plugin.key.startsWith(`${name}$`)),
227
+ plugins: this.state.plugins.filter(plugin => !plugin.key.startsWith(name)),
178
228
  })
179
229
 
180
230
  this.view.updateState(state)
@@ -184,7 +234,9 @@ export class Editor extends EventEmitter {
184
234
  * Creates an extension manager.
185
235
  */
186
236
  private createExtensionManager(): void {
187
- const coreExtensions = Object.entries(extensions).map(([, extension]) => extension)
237
+ const coreExtensions = this.options.enableCoreExtensions
238
+ ? Object.values(extensions)
239
+ : []
188
240
  const allExtensions = [...coreExtensions, ...this.options.extensions].filter(extension => {
189
241
  return ['extension', 'node', 'mark'].includes(extension?.type)
190
242
  })
@@ -196,7 +248,9 @@ export class Editor extends EventEmitter {
196
248
  * Creates an command manager.
197
249
  */
198
250
  private createCommandManager(): void {
199
- this.commandManager = new CommandManager(this, this.extensionManager.commands)
251
+ this.commandManager = new CommandManager({
252
+ editor: this,
253
+ })
200
254
  }
201
255
 
202
256
  /**
@@ -210,27 +264,22 @@ export class Editor extends EventEmitter {
210
264
  * Creates a ProseMirror view.
211
265
  */
212
266
  private createView(): void {
267
+ const doc = createDocument(this.options.content, this.schema, this.options.parseOptions)
268
+ const selection = resolveFocusPosition(doc, this.options.autofocus)
269
+
213
270
  this.view = new EditorView(this.options.element, {
214
271
  ...this.options.editorProps,
215
272
  dispatchTransaction: this.dispatchTransaction.bind(this),
216
273
  state: EditorState.create({
217
- doc: this.createDocument(this.options.content),
274
+ doc,
275
+ selection: selection || undefined,
218
276
  }),
219
277
  })
220
278
 
221
279
  // `editor.view` is not yet available at this time.
222
280
  // Therefore we will add all plugins and node views directly afterwards.
223
281
  const newState = this.state.reconfigure({
224
- plugins: [
225
- new Plugin({
226
- view: () => ({
227
- update: () => this.emit('viewUpdate', {
228
- editor: this,
229
- }),
230
- }),
231
- }),
232
- ...this.extensionManager.plugins,
233
- ],
282
+ plugins: this.extensionManager.plugins,
234
283
  })
235
284
 
236
285
  this.view.updateState(newState)
@@ -240,6 +289,7 @@ export class Editor extends EventEmitter {
240
289
  // Let’s store the editor instance in the DOM element.
241
290
  // So we’ll have access to it for tests.
242
291
  const dom = this.view.dom as HTMLElement
292
+
243
293
  dom.editor = this
244
294
  }
245
295
 
@@ -252,34 +302,6 @@ export class Editor extends EventEmitter {
252
302
  })
253
303
  }
254
304
 
255
- /**
256
- * Creates a ProseMirror document.
257
- */
258
- public createDocument = (content: Content, parseOptions = this.options.parseOptions): Node => {
259
- if (content && typeof content === 'object') {
260
- try {
261
- return this.schema.nodeFromJSON(content)
262
- } catch (error) {
263
- console.warn(
264
- '[tiptap warn]: Invalid content.',
265
- 'Passed value:',
266
- content,
267
- 'Error:',
268
- error,
269
- )
270
- return this.createDocument('')
271
- }
272
- }
273
-
274
- if (typeof content === 'string') {
275
- return DOMParser
276
- .fromSchema(this.schema)
277
- .parse(elementFromString(content), parseOptions)
278
- }
279
-
280
- return this.createDocument('')
281
- }
282
-
283
305
  public isCapturingTransaction = false
284
306
 
285
307
  private capturedTransaction: Transaction | null = null
@@ -326,6 +348,7 @@ export class Editor extends EventEmitter {
326
348
  if (selectionHasChanged) {
327
349
  this.emit('selectionUpdate', {
328
350
  editor: this,
351
+ transaction,
329
352
  })
330
353
  }
331
354
 
@@ -336,6 +359,7 @@ export class Editor extends EventEmitter {
336
359
  this.emit('focus', {
337
360
  editor: this,
338
361
  event: focus.event,
362
+ transaction,
339
363
  })
340
364
  }
341
365
 
@@ -343,6 +367,7 @@ export class Editor extends EventEmitter {
343
367
  this.emit('blur', {
344
368
  editor: this,
345
369
  event: blur.event,
370
+ transaction,
346
371
  })
347
372
  }
348
373
 
@@ -357,21 +382,10 @@ export class Editor extends EventEmitter {
357
382
  }
358
383
 
359
384
  /**
360
- * Get attributes of the currently selected node.
361
- *
362
- * @param name Name of the node
385
+ * Get attributes of the currently selected node or mark.
363
386
  */
364
- public getNodeAttributes(name: string): AnyObject {
365
- return getNodeAttributes(this.state, name)
366
- }
367
-
368
- /**
369
- * Get attributes of the currently selected mark.
370
- *
371
- * @param name Name of the mark
372
- */
373
- public getMarkAttributes(name: string): AnyObject {
374
- return getMarkAttributes(this.state, name)
387
+ public getAttributes(nameOrType: string | NodeType | MarkType): Record<string, any> {
388
+ return getAttributes(this.state, nameOrType)
375
389
  }
376
390
 
377
391
  /**
@@ -397,7 +411,7 @@ export class Editor extends EventEmitter {
397
411
  /**
398
412
  * Get the document as JSON.
399
413
  */
400
- public getJSON(): AnyObject {
414
+ public getJSON(): JSONContent {
401
415
  return this.state.doc.toJSON()
402
416
  }
403
417
 
@@ -405,23 +419,45 @@ export class Editor extends EventEmitter {
405
419
  * Get the document as HTML.
406
420
  */
407
421
  public getHTML(): string {
408
- return getHTMLFromFragment(this.state.doc, this.schema)
422
+ return getHTMLFromFragment(this.state.doc.content, this.schema)
409
423
  }
410
424
 
411
425
  /**
412
- * Check if there is no content.
426
+ * Get the document as text.
413
427
  */
414
- public isEmpty(): boolean {
415
- const defaultContent = this.state.doc.type.createAndFill()?.toJSON()
416
- const content = this.getJSON()
428
+ public getText(options?: {
429
+ blockSeparator?: string,
430
+ textSerializers?: Record<string, TextSerializer>,
431
+ }): string {
432
+ const {
433
+ blockSeparator = '\n\n',
434
+ textSerializers = {},
435
+ } = options || {}
436
+
437
+ return getText(this.state.doc, {
438
+ blockSeparator,
439
+ textSerializers: {
440
+ ...textSerializers,
441
+ ...getTextSerializersFromSchema(this.schema),
442
+ },
443
+ })
444
+ }
417
445
 
418
- return JSON.stringify(defaultContent) === JSON.stringify(content)
446
+ /**
447
+ * Check if there is no content.
448
+ */
449
+ public get isEmpty(): boolean {
450
+ return isNodeEmpty(this.state.doc)
419
451
  }
420
452
 
421
453
  /**
422
454
  * Get the number of characters for the current document.
455
+ *
456
+ * @deprecated
423
457
  */
424
458
  public getCharacterCount(): number {
459
+ console.warn('[tiptap warn]: "editor.getCharacterCount()" is deprecated. Please use "editor.storage.characterCount.characters()" instead.')
460
+
425
461
  return this.state.doc.content.size - 2
426
462
  }
427
463
 
@@ -436,7 +472,6 @@ export class Editor extends EventEmitter {
436
472
  }
437
473
 
438
474
  this.removeAllListeners()
439
- removeElement(this.css)
440
475
  }
441
476
 
442
477
  /**
@@ -1,8 +1,18 @@
1
- export default class EventEmitter {
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
10
+
11
+ export class EventEmitter<T extends Record<string, any>> {
2
12
 
3
13
  private callbacks: { [key: string]: Function[] } = {}
4
14
 
5
- public on(event: string, fn: Function): this {
15
+ public on<EventName extends StringKeyOf<T>>(event: EventName, fn: CallbackFunction<T, EventName>): this {
6
16
  if (!this.callbacks[event]) {
7
17
  this.callbacks[event] = []
8
18
  }
@@ -12,7 +22,7 @@ export default class EventEmitter {
12
22
  return this
13
23
  }
14
24
 
15
- protected emit(event: string, ...args: any): this {
25
+ protected emit<EventName extends StringKeyOf<T>>(event: EventName, ...args: CallbackType<T, EventName>): this {
16
26
  const callbacks = this.callbacks[event]
17
27
 
18
28
  if (callbacks) {
@@ -22,7 +32,7 @@ export default class EventEmitter {
22
32
  return this
23
33
  }
24
34
 
25
- public off(event: string, fn?: Function): this {
35
+ public off<EventName extends StringKeyOf<T>>(event: EventName, fn?: CallbackFunction<T, EventName>): this {
26
36
  const callbacks = this.callbacks[event]
27
37
 
28
38
  if (callbacks) {