@tiptap/core 2.0.0-beta.22 → 2.0.0-beta.220

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 (344) hide show
  1. package/README.md +2 -2
  2. package/dist/index.cjs +4354 -0
  3. package/dist/index.cjs.map +1 -0
  4. package/dist/index.js +4264 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/index.umd.js +4352 -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 +27 -22
  10. package/dist/packages/core/src/EventEmitter.d.ts +8 -4
  11. package/dist/packages/core/src/Extension.d.ts +93 -21
  12. package/dist/packages/core/src/ExtensionManager.d.ts +8 -14
  13. package/dist/packages/core/src/InputRule.d.ts +42 -0
  14. package/dist/packages/core/src/Mark.d.ts +132 -24
  15. package/dist/packages/core/src/Node.d.ts +150 -26
  16. package/dist/packages/core/src/NodeView.d.ts +11 -15
  17. package/dist/packages/core/src/PasteRule.d.ts +42 -0
  18. package/dist/packages/core/src/Tracker.d.ts +11 -0
  19. package/dist/packages/core/src/commands/blur.d.ts +3 -3
  20. package/dist/packages/core/src/commands/clearContent.d.ts +3 -3
  21. package/dist/packages/core/src/commands/clearNodes.d.ts +3 -3
  22. package/dist/packages/core/src/commands/command.d.ts +2 -2
  23. package/dist/packages/core/src/commands/createParagraphNear.d.ts +3 -3
  24. package/dist/packages/core/src/commands/deleteCurrentNode.d.ts +12 -0
  25. package/dist/packages/core/src/commands/deleteNode.d.ts +13 -0
  26. package/dist/packages/core/src/commands/deleteRange.d.ts +3 -3
  27. package/dist/packages/core/src/commands/deleteSelection.d.ts +3 -3
  28. package/dist/packages/core/src/commands/enter.d.ts +3 -3
  29. package/dist/packages/core/src/commands/exitCode.d.ts +3 -3
  30. package/dist/packages/core/src/commands/extendMarkRange.d.ts +4 -4
  31. package/dist/packages/core/src/commands/first.d.ts +3 -3
  32. package/dist/packages/core/src/commands/focus.d.ts +5 -3
  33. package/dist/packages/core/src/commands/forEach.d.ts +14 -0
  34. package/dist/packages/core/src/commands/index.d.ts +50 -0
  35. package/dist/packages/core/src/commands/insertContent.d.ts +7 -3
  36. package/dist/packages/core/src/commands/insertContentAt.d.ts +16 -0
  37. package/dist/packages/core/src/commands/join.d.ts +33 -0
  38. package/dist/packages/core/src/commands/keyboardShortcut.d.ts +3 -3
  39. package/dist/packages/core/src/commands/lift.d.ts +4 -4
  40. package/dist/packages/core/src/commands/liftEmptyBlock.d.ts +3 -3
  41. package/dist/packages/core/src/commands/liftListItem.d.ts +4 -4
  42. package/dist/packages/core/src/commands/newlineInCode.d.ts +3 -3
  43. package/dist/packages/core/src/commands/resetAttributes.d.ts +4 -4
  44. package/dist/packages/core/src/commands/scrollIntoView.d.ts +3 -3
  45. package/dist/packages/core/src/commands/selectAll.d.ts +3 -3
  46. package/dist/packages/core/src/commands/selectNodeBackward.d.ts +3 -3
  47. package/dist/packages/core/src/commands/selectNodeForward.d.ts +3 -3
  48. package/dist/packages/core/src/commands/selectParentNode.d.ts +3 -3
  49. package/dist/packages/core/src/commands/selectTextblockEnd.d.ts +12 -0
  50. package/dist/packages/core/src/commands/selectTextblockStart.d.ts +12 -0
  51. package/dist/packages/core/src/commands/setContent.d.ts +4 -3
  52. package/dist/packages/core/src/commands/setMark.d.ts +4 -4
  53. package/dist/packages/core/src/commands/setMeta.d.ts +12 -0
  54. package/dist/packages/core/src/commands/setNode.d.ts +4 -4
  55. package/dist/packages/core/src/commands/setNodeSelection.d.ts +12 -0
  56. package/dist/packages/core/src/commands/setTextSelection.d.ts +12 -0
  57. package/dist/packages/core/src/commands/sinkListItem.d.ts +4 -4
  58. package/dist/packages/core/src/commands/splitBlock.d.ts +3 -3
  59. package/dist/packages/core/src/commands/splitListItem.d.ts +4 -4
  60. package/dist/packages/core/src/commands/toggleList.d.ts +4 -4
  61. package/dist/packages/core/src/commands/toggleMark.d.ts +9 -4
  62. package/dist/packages/core/src/commands/toggleNode.d.ts +4 -4
  63. package/dist/packages/core/src/commands/toggleWrap.d.ts +4 -4
  64. package/dist/packages/core/src/commands/undoInputRule.d.ts +3 -3
  65. package/dist/packages/core/src/commands/unsetAllMarks.d.ts +3 -3
  66. package/dist/packages/core/src/commands/unsetMark.d.ts +9 -4
  67. package/dist/packages/core/src/commands/updateAttributes.d.ts +4 -4
  68. package/dist/packages/core/src/commands/wrapIn.d.ts +4 -4
  69. package/dist/packages/core/src/commands/wrapInList.d.ts +4 -4
  70. package/dist/packages/core/src/extensions/clipboardTextSerializer.d.ts +1 -1
  71. package/dist/packages/core/src/extensions/commands.d.ts +2 -99
  72. package/dist/packages/core/src/extensions/editable.d.ts +1 -1
  73. package/dist/packages/core/src/extensions/focusEvents.d.ts +1 -1
  74. package/dist/packages/core/src/extensions/index.d.ts +1 -0
  75. package/dist/packages/core/src/extensions/keymap.d.ts +1 -1
  76. package/dist/packages/core/src/extensions/tabindex.d.ts +2 -0
  77. package/dist/packages/core/src/helpers/combineTransactionSteps.d.ts +7 -0
  78. package/dist/packages/core/src/helpers/createChainableState.d.ts +5 -0
  79. package/dist/packages/core/src/helpers/createDocument.d.ts +3 -4
  80. package/dist/packages/core/src/helpers/createNodeFromContent.d.ts +4 -5
  81. package/dist/packages/core/src/helpers/defaultBlockAt.d.ts +2 -0
  82. package/dist/packages/core/src/helpers/findChildren.d.ts +3 -8
  83. package/dist/packages/core/src/helpers/findChildrenInRange.d.ts +6 -0
  84. package/dist/packages/core/src/helpers/findParentNode.d.ts +3 -4
  85. package/dist/packages/core/src/helpers/findParentNodeClosestToPos.d.ts +3 -3
  86. package/dist/packages/core/src/helpers/generateHTML.d.ts +2 -2
  87. package/dist/packages/core/src/helpers/generateJSON.d.ts +2 -0
  88. package/dist/packages/core/src/helpers/generateText.d.ts +5 -0
  89. package/dist/packages/core/src/helpers/getAttributes.d.ts +3 -0
  90. package/dist/packages/core/src/helpers/getAttributesFromExtensions.d.ts +2 -2
  91. package/dist/packages/core/src/helpers/getChangedRanges.d.ts +11 -0
  92. package/dist/packages/core/src/helpers/getDebugJSON.d.ts +8 -0
  93. package/dist/packages/core/src/helpers/getExtensionField.d.ts +2 -0
  94. package/dist/packages/core/src/helpers/getHTMLFromFragment.d.ts +2 -2
  95. package/dist/packages/core/src/helpers/getMarkAttributes.d.ts +3 -4
  96. package/dist/packages/core/src/helpers/getMarkRange.d.ts +2 -2
  97. package/dist/packages/core/src/helpers/getMarkType.d.ts +2 -2
  98. package/dist/packages/core/src/helpers/getMarksBetween.d.ts +2 -2
  99. package/dist/packages/core/src/helpers/getNodeAttributes.d.ts +3 -4
  100. package/dist/packages/core/src/helpers/getNodeType.d.ts +2 -2
  101. package/dist/packages/core/src/helpers/getRenderedAttributes.d.ts +3 -3
  102. package/dist/packages/core/src/helpers/getSchema.d.ts +2 -2
  103. package/dist/packages/core/src/helpers/getSchemaByResolvedExtensions.d.ts +3 -0
  104. package/dist/packages/core/src/helpers/getSchemaTypeByName.d.ts +2 -2
  105. package/dist/packages/core/src/helpers/getSchemaTypeNameByName.d.ts +2 -2
  106. package/dist/packages/core/src/helpers/getSplittedAttributes.d.ts +2 -2
  107. package/dist/packages/core/src/helpers/getText.d.ts +6 -0
  108. package/dist/packages/core/src/helpers/getTextBetween.d.ts +6 -0
  109. package/dist/packages/core/src/helpers/getTextContentFromNodes.d.ts +2 -0
  110. package/dist/packages/core/src/helpers/getTextSerializersFromSchema.d.ts +3 -0
  111. package/dist/packages/core/src/helpers/index.d.ts +47 -0
  112. package/dist/packages/core/src/helpers/injectExtensionAttributesToParseRule.d.ts +2 -2
  113. package/dist/packages/core/src/helpers/isActive.d.ts +2 -3
  114. package/dist/packages/core/src/helpers/isExtensionRulesEnabled.d.ts +2 -0
  115. package/dist/packages/core/src/helpers/isList.d.ts +1 -1
  116. package/dist/packages/core/src/helpers/isMarkActive.d.ts +3 -4
  117. package/dist/packages/core/src/helpers/isNodeActive.d.ts +3 -4
  118. package/dist/packages/core/src/helpers/isNodeEmpty.d.ts +2 -2
  119. package/dist/packages/core/src/helpers/isNodeSelection.d.ts +2 -2
  120. package/dist/packages/core/src/helpers/isTextSelection.d.ts +2 -2
  121. package/dist/packages/core/src/helpers/posToDOMRect.d.ts +2 -0
  122. package/dist/packages/core/src/helpers/resolveFocusPosition.d.ts +4 -0
  123. package/dist/packages/core/src/helpers/selectionToInsertionEnd.d.ts +2 -2
  124. package/dist/packages/core/src/helpers/splitExtensions.d.ts +6 -6
  125. package/dist/packages/core/src/index.d.ts +14 -23
  126. package/dist/packages/core/src/inputRules/index.d.ts +5 -0
  127. package/dist/packages/core/src/inputRules/markInputRule.d.ts +12 -3
  128. package/dist/packages/core/src/inputRules/nodeInputRule.d.ts +12 -3
  129. package/dist/packages/core/src/inputRules/textInputRule.d.ts +9 -0
  130. package/dist/packages/core/src/inputRules/textblockTypeInputRule.d.ts +14 -0
  131. package/dist/packages/core/src/inputRules/wrappingInputRule.d.ts +27 -0
  132. package/dist/packages/core/src/pasteRules/index.d.ts +3 -0
  133. package/dist/packages/core/src/pasteRules/markPasteRule.d.ts +12 -3
  134. package/dist/packages/core/src/pasteRules/nodePasteRule.d.ts +12 -0
  135. package/dist/packages/core/src/pasteRules/textPasteRule.d.ts +9 -0
  136. package/dist/packages/core/src/style.d.ts +1 -2
  137. package/dist/packages/core/src/types.d.ts +122 -62
  138. package/dist/packages/core/src/utilities/callOrReturn.d.ts +2 -1
  139. package/dist/packages/core/src/utilities/createStyleTag.d.ts +1 -1
  140. package/dist/packages/core/src/utilities/deleteProps.d.ts +1 -2
  141. package/dist/packages/core/src/utilities/elementFromString.d.ts +1 -1
  142. package/dist/packages/core/src/utilities/escapeForRegEx.d.ts +1 -0
  143. package/dist/packages/core/src/utilities/findDuplicates.d.ts +1 -0
  144. package/dist/packages/core/src/utilities/fromString.d.ts +1 -1
  145. package/dist/packages/core/src/utilities/index.d.ts +20 -0
  146. package/dist/packages/core/src/utilities/isEmptyObject.d.ts +1 -1
  147. package/dist/packages/core/src/utilities/isFunction.d.ts +1 -0
  148. package/dist/packages/core/src/utilities/isMacOS.d.ts +1 -0
  149. package/dist/packages/core/src/utilities/isNumber.d.ts +1 -0
  150. package/dist/packages/core/src/utilities/isPlainObject.d.ts +1 -1
  151. package/dist/packages/core/src/utilities/isRegExp.d.ts +1 -0
  152. package/dist/packages/core/src/utilities/isString.d.ts +1 -0
  153. package/dist/packages/core/src/utilities/isiOS.d.ts +1 -0
  154. package/dist/packages/core/src/utilities/mergeAttributes.d.ts +1 -2
  155. package/dist/packages/core/src/utilities/mergeDeep.d.ts +1 -2
  156. package/dist/packages/core/src/utilities/minMax.d.ts +1 -1
  157. package/dist/packages/core/src/utilities/objectIncludes.d.ts +3 -2
  158. package/dist/packages/core/src/utilities/removeDuplicates.d.ts +8 -0
  159. package/package.json +29 -24
  160. package/src/CommandManager.ts +76 -86
  161. package/src/Editor.ts +121 -79
  162. package/src/EventEmitter.ts +14 -4
  163. package/src/Extension.ts +276 -112
  164. package/src/ExtensionManager.ts +252 -110
  165. package/src/InputRule.ts +260 -0
  166. package/src/Mark.ts +394 -152
  167. package/src/Node.ts +433 -176
  168. package/src/NodeView.ts +144 -67
  169. package/src/PasteRule.ts +240 -0
  170. package/src/Tracker.ts +38 -0
  171. package/src/commands/blur.ts +12 -6
  172. package/src/commands/clearContent.ts +3 -3
  173. package/src/commands/clearNodes.ts +31 -19
  174. package/src/commands/command.ts +2 -2
  175. package/src/commands/createParagraphNear.ts +5 -4
  176. package/src/commands/deleteCurrentNode.ts +41 -0
  177. package/src/commands/deleteNode.ts +37 -0
  178. package/src/commands/deleteRange.ts +3 -3
  179. package/src/commands/deleteSelection.ts +5 -4
  180. package/src/commands/enter.ts +3 -3
  181. package/src/commands/exitCode.ts +5 -4
  182. package/src/commands/extendMarkRange.ts +16 -12
  183. package/src/commands/first.ts +3 -3
  184. package/src/commands/focus.ts +47 -44
  185. package/src/commands/forEach.ts +24 -0
  186. package/src/commands/index.ts +50 -0
  187. package/src/commands/insertContent.ts +17 -24
  188. package/src/commands/insertContentAt.ts +102 -0
  189. package/src/commands/join.ts +53 -0
  190. package/src/commands/keyboardShortcut.ts +6 -6
  191. package/src/commands/lift.ts +8 -7
  192. package/src/commands/liftEmptyBlock.ts +5 -4
  193. package/src/commands/liftListItem.ts +7 -6
  194. package/src/commands/newlineInCode.ts +5 -4
  195. package/src/commands/resetAttributes.ts +18 -12
  196. package/src/commands/scrollIntoView.ts +3 -3
  197. package/src/commands/selectAll.ts +8 -6
  198. package/src/commands/selectNodeBackward.ts +5 -4
  199. package/src/commands/selectNodeForward.ts +5 -4
  200. package/src/commands/selectParentNode.ts +5 -4
  201. package/src/commands/selectTextblockEnd.ts +20 -0
  202. package/src/commands/selectTextblockStart.ts +20 -0
  203. package/src/commands/setContent.ts +9 -16
  204. package/src/commands/setMark.ts +90 -14
  205. package/src/commands/setMeta.ts +18 -0
  206. package/src/commands/setNode.ts +32 -8
  207. package/src/commands/setNodeSelection.ts +27 -0
  208. package/src/commands/setTextSelection.ts +31 -0
  209. package/src/commands/sinkListItem.ts +7 -6
  210. package/src/commands/splitBlock.ts +31 -41
  211. package/src/commands/splitListItem.ts +58 -29
  212. package/src/commands/toggleList.ts +109 -20
  213. package/src/commands/toggleMark.ts +19 -8
  214. package/src/commands/toggleNode.ts +11 -6
  215. package/src/commands/toggleWrap.ts +10 -10
  216. package/src/commands/undoInputRule.ts +34 -5
  217. package/src/commands/unsetAllMarks.ts +7 -11
  218. package/src/commands/unsetMark.ts +36 -23
  219. package/src/commands/updateAttributes.ts +27 -15
  220. package/src/commands/wrapIn.ts +7 -12
  221. package/src/commands/wrapInList.ts +7 -6
  222. package/src/extensions/clipboardTextSerializer.ts +15 -36
  223. package/src/extensions/commands.ts +3 -147
  224. package/src/extensions/editable.ts +2 -1
  225. package/src/extensions/focusEvents.ts +4 -6
  226. package/src/extensions/index.ts +1 -0
  227. package/src/extensions/keymap.ts +106 -13
  228. package/src/extensions/tabindex.ts +18 -0
  229. package/src/helpers/combineTransactionSteps.ts +21 -0
  230. package/src/helpers/createChainableState.ts +38 -0
  231. package/src/helpers/createDocument.ts +5 -6
  232. package/src/helpers/createNodeFromContent.ts +20 -28
  233. package/src/helpers/defaultBlockAt.ts +13 -0
  234. package/src/helpers/findChildren.ts +3 -7
  235. package/src/helpers/findChildrenInRange.ts +36 -0
  236. package/src/helpers/findParentNode.ts +4 -3
  237. package/src/helpers/findParentNodeClosestToPos.ts +13 -7
  238. package/src/helpers/generateHTML.ts +7 -6
  239. package/src/helpers/generateJSON.ts +12 -0
  240. package/src/helpers/generateText.ts +27 -0
  241. package/src/helpers/getAttributes.ts +26 -0
  242. package/src/helpers/getAttributesFromExtensions.ts +42 -14
  243. package/src/helpers/getChangedRanges.ts +83 -0
  244. package/src/helpers/getDebugJSON.ts +54 -0
  245. package/src/helpers/getExtensionField.ts +25 -0
  246. package/src/helpers/getHTMLFromFragment.ts +5 -6
  247. package/src/helpers/getMarkAttributes.ts +18 -11
  248. package/src/helpers/getMarkRange.ts +41 -8
  249. package/src/helpers/getMarkType.ts +8 -2
  250. package/src/helpers/getMarksBetween.ts +34 -10
  251. package/src/helpers/getNodeAttributes.ts +14 -13
  252. package/src/helpers/getNodeType.ts +8 -2
  253. package/src/helpers/getRenderedAttributes.ts +9 -7
  254. package/src/helpers/getSchema.ts +7 -133
  255. package/src/helpers/getSchemaByResolvedExtensions.ts +192 -0
  256. package/src/helpers/getSchemaTypeByName.ts +3 -11
  257. package/src/helpers/getSchemaTypeNameByName.ts +2 -2
  258. package/src/helpers/getSplittedAttributes.ts +4 -4
  259. package/src/helpers/getText.ts +19 -0
  260. package/src/helpers/getTextBetween.ts +46 -0
  261. package/src/helpers/getTextContentFromNodes.ts +26 -0
  262. package/src/helpers/getTextSerializersFromSchema.ts +11 -0
  263. package/src/helpers/index.ts +47 -0
  264. package/src/helpers/injectExtensionAttributesToParseRule.ts +22 -23
  265. package/src/helpers/isActive.ts +10 -6
  266. package/src/helpers/isExtensionRulesEnabled.ts +15 -0
  267. package/src/helpers/isList.ts +14 -7
  268. package/src/helpers/isMarkActive.ts +49 -27
  269. package/src/helpers/isNodeActive.ts +29 -39
  270. package/src/helpers/isNodeEmpty.ts +2 -2
  271. package/src/helpers/isNodeSelection.ts +3 -4
  272. package/src/helpers/isTextSelection.ts +3 -4
  273. package/src/helpers/posToDOMRect.ts +35 -0
  274. package/src/helpers/resolveFocusPosition.ts +42 -0
  275. package/src/helpers/selectionToInsertionEnd.ts +3 -3
  276. package/src/helpers/splitExtensions.ts +3 -3
  277. package/src/index.ts +15 -26
  278. package/src/inputRules/index.ts +5 -0
  279. package/src/inputRules/markInputRule.ts +59 -40
  280. package/src/inputRules/nodeInputRule.ts +45 -12
  281. package/src/inputRules/textInputRule.ts +35 -0
  282. package/src/inputRules/textblockTypeInputRule.ts +37 -0
  283. package/src/inputRules/wrappingInputRule.ts +84 -0
  284. package/src/pasteRules/index.ts +3 -0
  285. package/src/pasteRules/markPasteRule.ts +61 -53
  286. package/src/pasteRules/nodePasteRule.ts +37 -0
  287. package/src/pasteRules/textPasteRule.ts +35 -0
  288. package/src/style.ts +16 -3
  289. package/src/types.ts +175 -97
  290. package/src/utilities/callOrReturn.ts +6 -3
  291. package/src/utilities/createStyleTag.ts +12 -1
  292. package/src/utilities/deleteProps.ts +2 -4
  293. package/src/utilities/elementFromString.ts +4 -5
  294. package/src/utilities/escapeForRegEx.ts +4 -0
  295. package/src/utilities/findDuplicates.ts +5 -0
  296. package/src/utilities/fromString.ts +2 -2
  297. package/src/utilities/index.ts +20 -0
  298. package/src/utilities/isEmptyObject.ts +2 -2
  299. package/src/utilities/isFunction.ts +3 -0
  300. package/src/utilities/isMacOS.ts +5 -0
  301. package/src/utilities/isNumber.ts +3 -0
  302. package/src/utilities/isPlainObject.ts +8 -5
  303. package/src/utilities/isRegExp.ts +3 -0
  304. package/src/utilities/isString.ts +3 -0
  305. package/src/utilities/isiOS.ts +12 -0
  306. package/src/utilities/mergeAttributes.ts +2 -3
  307. package/src/utilities/mergeDeep.ts +2 -3
  308. package/src/utilities/minMax.ts +1 -1
  309. package/src/utilities/objectIncludes.ts +17 -5
  310. package/src/utilities/removeDuplicates.ts +15 -0
  311. package/CHANGELOG.md +0 -373
  312. package/LICENSE.md +0 -21
  313. package/dist/packages/core/src/commands/insertHTML.d.ts +0 -12
  314. package/dist/packages/core/src/commands/insertNode.d.ts +0 -13
  315. package/dist/packages/core/src/commands/insertText.d.ts +0 -12
  316. package/dist/packages/core/src/commands/joinBackward.d.ts +0 -12
  317. package/dist/packages/core/src/commands/joinForward.d.ts +0 -12
  318. package/dist/packages/core/src/commands/replace.d.ts +0 -13
  319. package/dist/packages/core/src/commands/replaceRange.d.ts +0 -13
  320. package/dist/packages/core/src/commands/resetNodeAttributes.d.ts +0 -13
  321. package/dist/packages/core/src/commands/updateNodeAttributes.d.ts +0 -13
  322. package/dist/packages/core/src/utilities/isClass.d.ts +0 -1
  323. package/dist/packages/core/src/utilities/isObject.d.ts +0 -1
  324. package/dist/packages/core/src/utilities/removeElement.d.ts +0 -1
  325. package/dist/tiptap-core.bundle.umd.min.js +0 -17
  326. package/dist/tiptap-core.bundle.umd.min.js.map +0 -1
  327. package/dist/tiptap-core.cjs.js +0 -3048
  328. package/dist/tiptap-core.cjs.js.map +0 -1
  329. package/dist/tiptap-core.esm.js +0 -3021
  330. package/dist/tiptap-core.esm.js.map +0 -1
  331. package/dist/tiptap-core.umd.js +0 -3045
  332. package/dist/tiptap-core.umd.js.map +0 -1
  333. package/src/commands/insertHTML.ts +0 -30
  334. package/src/commands/insertNode.ts +0 -33
  335. package/src/commands/insertText.ts +0 -22
  336. package/src/commands/joinBackward.ts +0 -17
  337. package/src/commands/joinForward.ts +0 -17
  338. package/src/commands/replace.ts +0 -20
  339. package/src/commands/replaceRange.ts +0 -36
  340. package/src/commands/resetNodeAttributes.ts +0 -33
  341. package/src/commands/updateNodeAttributes.ts +0 -35
  342. package/src/utilities/isClass.ts +0 -7
  343. package/src/utilities/isObject.ts +0 -10
  344. package/src/utilities/removeElement.ts +0 -5
@@ -1,20 +1,25 @@
1
- import { keymap } from 'prosemirror-keymap'
2
- import { Schema, Node as ProsemirrorNode } from 'prosemirror-model'
3
- import { inputRules as inputRulesPlugin } from 'prosemirror-inputrules'
4
- import { EditorView, Decoration } from 'prosemirror-view'
5
- import { Plugin } from 'prosemirror-state'
6
- import { Editor } from './Editor'
7
- import { Extensions, NodeViewRenderer, RawCommands } from './types'
8
- import getSchema from './helpers/getSchema'
9
- import getSchemaTypeByName from './helpers/getSchemaTypeByName'
10
- import getNodeType from './helpers/getNodeType'
11
- import splitExtensions from './helpers/splitExtensions'
12
- import getAttributesFromExtensions from './helpers/getAttributesFromExtensions'
13
- import getRenderedAttributes from './helpers/getRenderedAttributes'
14
- import callOrReturn from './utilities/callOrReturn'
15
-
16
- export default class ExtensionManager {
1
+ import { keymap } from '@tiptap/pm/keymap'
2
+ import { Node as ProsemirrorNode, Schema } from '@tiptap/pm/model'
3
+ import { Plugin } from '@tiptap/pm/state'
4
+ import { Decoration, EditorView } from '@tiptap/pm/view'
17
5
 
6
+ import { Mark, NodeConfig } from '.'
7
+ import { Editor } from './Editor'
8
+ import { getAttributesFromExtensions } from './helpers/getAttributesFromExtensions'
9
+ import { getExtensionField } from './helpers/getExtensionField'
10
+ import { getNodeType } from './helpers/getNodeType'
11
+ import { getRenderedAttributes } from './helpers/getRenderedAttributes'
12
+ import { getSchemaByResolvedExtensions } from './helpers/getSchemaByResolvedExtensions'
13
+ import { getSchemaTypeByName } from './helpers/getSchemaTypeByName'
14
+ import { isExtensionRulesEnabled } from './helpers/isExtensionRulesEnabled'
15
+ import { splitExtensions } from './helpers/splitExtensions'
16
+ import { inputRulesPlugin } from './InputRule'
17
+ import { pasteRulesPlugin } from './PasteRule'
18
+ import { AnyConfig, Extensions, RawCommands } from './types'
19
+ import { callOrReturn } from './utilities/callOrReturn'
20
+ import { findDuplicates } from './utilities/findDuplicates'
21
+
22
+ export class ExtensionManager {
18
23
  editor: Editor
19
24
 
20
25
  schema: Schema
@@ -25,67 +30,145 @@ export default class ExtensionManager {
25
30
 
26
31
  constructor(extensions: Extensions, editor: Editor) {
27
32
  this.editor = editor
28
- this.extensions = this.sort(extensions)
29
- this.schema = getSchema(this.extensions)
33
+ this.extensions = ExtensionManager.resolve(extensions)
34
+ this.schema = getSchemaByResolvedExtensions(this.extensions)
30
35
 
31
36
  this.extensions.forEach(extension => {
37
+ // store extension storage in editor
38
+ this.editor.extensionStorage[extension.name] = extension.storage
39
+
32
40
  const context = {
41
+ name: extension.name,
33
42
  options: extension.options,
43
+ storage: extension.storage,
34
44
  editor: this.editor,
35
- type: getSchemaTypeByName(extension.config.name, this.schema),
45
+ type: getSchemaTypeByName(extension.name, this.schema),
36
46
  }
37
47
 
38
48
  if (extension.type === 'mark') {
39
- const keepOnSplit = callOrReturn(extension.config.keepOnSplit, context) ?? true
49
+ const keepOnSplit = callOrReturn(getExtensionField(extension, 'keepOnSplit', context)) ?? true
40
50
 
41
51
  if (keepOnSplit) {
42
- this.splittableMarks.push(extension.config.name)
52
+ this.splittableMarks.push(extension.name)
43
53
  }
44
54
  }
45
55
 
46
- if (typeof extension.config.onBeforeCreate === 'function') {
47
- this.editor.on('beforeCreate', extension.config.onBeforeCreate.bind(context))
56
+ const onBeforeCreate = getExtensionField<AnyConfig['onBeforeCreate']>(
57
+ extension,
58
+ 'onBeforeCreate',
59
+ context,
60
+ )
61
+
62
+ if (onBeforeCreate) {
63
+ this.editor.on('beforeCreate', onBeforeCreate)
48
64
  }
49
65
 
50
- if (typeof extension.config.onCreate === 'function') {
51
- this.editor.on('create', extension.config.onCreate.bind(context))
66
+ const onCreate = getExtensionField<AnyConfig['onCreate']>(extension, 'onCreate', context)
67
+
68
+ if (onCreate) {
69
+ this.editor.on('create', onCreate)
52
70
  }
53
71
 
54
- if (typeof extension.config.onUpdate === 'function') {
55
- this.editor.on('update', extension.config.onUpdate.bind(context))
72
+ const onUpdate = getExtensionField<AnyConfig['onUpdate']>(extension, 'onUpdate', context)
73
+
74
+ if (onUpdate) {
75
+ this.editor.on('update', onUpdate)
56
76
  }
57
77
 
58
- if (typeof extension.config.onSelectionUpdate === 'function') {
59
- this.editor.on('selectionUpdate', extension.config.onSelectionUpdate.bind(context))
78
+ const onSelectionUpdate = getExtensionField<AnyConfig['onSelectionUpdate']>(
79
+ extension,
80
+ 'onSelectionUpdate',
81
+ context,
82
+ )
83
+
84
+ if (onSelectionUpdate) {
85
+ this.editor.on('selectionUpdate', onSelectionUpdate)
60
86
  }
61
87
 
62
- if (typeof extension.config.onTransaction === 'function') {
63
- this.editor.on('transaction', extension.config.onTransaction.bind(context))
88
+ const onTransaction = getExtensionField<AnyConfig['onTransaction']>(
89
+ extension,
90
+ 'onTransaction',
91
+ context,
92
+ )
93
+
94
+ if (onTransaction) {
95
+ this.editor.on('transaction', onTransaction)
64
96
  }
65
97
 
66
- if (typeof extension.config.onFocus === 'function') {
67
- this.editor.on('focus', extension.config.onFocus.bind(context))
98
+ const onFocus = getExtensionField<AnyConfig['onFocus']>(extension, 'onFocus', context)
99
+
100
+ if (onFocus) {
101
+ this.editor.on('focus', onFocus)
68
102
  }
69
103
 
70
- if (typeof extension.config.onBlur === 'function') {
71
- this.editor.on('blur', extension.config.onBlur.bind(context))
104
+ const onBlur = getExtensionField<AnyConfig['onBlur']>(extension, 'onBlur', context)
105
+
106
+ if (onBlur) {
107
+ this.editor.on('blur', onBlur)
72
108
  }
73
109
 
74
- if (typeof extension.config.onDestroy === 'function') {
75
- this.editor.on('destroy', extension.config.onDestroy.bind(context))
110
+ const onDestroy = getExtensionField<AnyConfig['onDestroy']>(extension, 'onDestroy', context)
111
+
112
+ if (onDestroy) {
113
+ this.editor.on('destroy', onDestroy)
76
114
  }
77
115
  })
78
116
  }
79
117
 
80
- private sort(extensions: Extensions) {
118
+ static resolve(extensions: Extensions): Extensions {
119
+ const resolvedExtensions = ExtensionManager.sort(ExtensionManager.flatten(extensions))
120
+ const duplicatedNames = findDuplicates(resolvedExtensions.map(extension => extension.name))
121
+
122
+ if (duplicatedNames.length) {
123
+ console.warn(
124
+ `[tiptap warn]: Duplicate extension names found: [${duplicatedNames
125
+ .map(item => `'${item}'`)
126
+ .join(', ')}]. This can lead to issues.`,
127
+ )
128
+ }
129
+
130
+ return resolvedExtensions
131
+ }
132
+
133
+ static flatten(extensions: Extensions): Extensions {
134
+ return (
135
+ extensions
136
+ .map(extension => {
137
+ const context = {
138
+ name: extension.name,
139
+ options: extension.options,
140
+ storage: extension.storage,
141
+ }
142
+
143
+ const addExtensions = getExtensionField<AnyConfig['addExtensions']>(
144
+ extension,
145
+ 'addExtensions',
146
+ context,
147
+ )
148
+
149
+ if (addExtensions) {
150
+ return [extension, ...this.flatten(addExtensions())]
151
+ }
152
+
153
+ return extension
154
+ })
155
+ // `Infinity` will break TypeScript so we set a number that is probably high enough
156
+ .flat(10)
157
+ )
158
+ }
159
+
160
+ static sort(extensions: Extensions): Extensions {
81
161
  const defaultPriority = 100
82
162
 
83
163
  return extensions.sort((a, b) => {
84
- if ((a.config.priority || defaultPriority) > (b.config.priority || defaultPriority)) {
164
+ const priorityA = getExtensionField<AnyConfig['priority']>(a, 'priority') || defaultPriority
165
+ const priorityB = getExtensionField<AnyConfig['priority']>(b, 'priority') || defaultPriority
166
+
167
+ if (priorityA > priorityB) {
85
168
  return -1
86
169
  }
87
170
 
88
- if ((a.config.priority || defaultPriority) < (b.config.priority || defaultPriority)) {
171
+ if (priorityA < priorityB) {
89
172
  return 1
90
173
  }
91
174
 
@@ -96,57 +179,110 @@ export default class ExtensionManager {
96
179
  get commands(): RawCommands {
97
180
  return this.extensions.reduce((commands, extension) => {
98
181
  const context = {
182
+ name: extension.name,
99
183
  options: extension.options,
184
+ storage: extension.storage,
100
185
  editor: this.editor,
101
- type: getSchemaTypeByName(extension.config.name, this.schema),
186
+ type: getSchemaTypeByName(extension.name, this.schema),
102
187
  }
103
188
 
104
- if (!extension.config.addCommands) {
189
+ const addCommands = getExtensionField<AnyConfig['addCommands']>(
190
+ extension,
191
+ 'addCommands',
192
+ context,
193
+ )
194
+
195
+ if (!addCommands) {
105
196
  return commands
106
197
  }
107
198
 
108
199
  return {
109
200
  ...commands,
110
- ...extension.config.addCommands.bind(context)(),
201
+ ...addCommands(),
111
202
  }
112
203
  }, {} as RawCommands)
113
204
  }
114
205
 
115
206
  get plugins(): Plugin[] {
116
- return [...this.extensions]
117
- .reverse()
207
+ const { editor } = this
208
+
209
+ // With ProseMirror, first plugins within an array are executed first.
210
+ // In tiptap, we provide the ability to override plugins,
211
+ // so it feels more natural to run plugins at the end of an array first.
212
+ // That’s why we have to reverse the `extensions` array and sort again
213
+ // based on the `priority` option.
214
+ const extensions = ExtensionManager.sort([...this.extensions].reverse())
215
+
216
+ const inputRules: any[] = []
217
+ const pasteRules: any[] = []
218
+
219
+ const allPlugins = extensions
118
220
  .map(extension => {
119
221
  const context = {
222
+ name: extension.name,
120
223
  options: extension.options,
121
- editor: this.editor,
122
- type: getSchemaTypeByName(extension.config.name, this.schema),
224
+ storage: extension.storage,
225
+ editor,
226
+ type: getSchemaTypeByName(extension.name, this.schema),
123
227
  }
124
228
 
125
229
  const plugins: Plugin[] = []
126
230
 
127
- if (extension.config.addKeyboardShortcuts) {
128
- const keyMapPlugin = keymap(extension.config.addKeyboardShortcuts.bind(context)())
231
+ const addKeyboardShortcuts = getExtensionField<AnyConfig['addKeyboardShortcuts']>(
232
+ extension,
233
+ 'addKeyboardShortcuts',
234
+ context,
235
+ )
236
+
237
+ let defaultBindings: Record<string, () => boolean> = {}
238
+
239
+ // bind exit handling
240
+ if (extension.type === 'mark' && extension.config.exitable) {
241
+ defaultBindings.ArrowRight = () => Mark.handleExit({ editor, mark: extension as Mark })
242
+ }
243
+
244
+ if (addKeyboardShortcuts) {
245
+ const bindings = Object.fromEntries(
246
+ Object.entries(addKeyboardShortcuts()).map(([shortcut, method]) => {
247
+ return [shortcut, () => method({ editor })]
248
+ }),
249
+ )
129
250
 
130
- plugins.push(keyMapPlugin)
251
+ defaultBindings = { ...defaultBindings, ...bindings }
131
252
  }
132
253
 
133
- if (this.editor.options.enableInputRules && extension.config.addInputRules) {
134
- const inputRules = extension.config.addInputRules.bind(context)()
135
- const inputRulePlugins = inputRules.length
136
- ? [inputRulesPlugin({ rules: inputRules })]
137
- : []
254
+ const keyMapPlugin = keymap(defaultBindings)
255
+
256
+ plugins.push(keyMapPlugin)
257
+
258
+ const addInputRules = getExtensionField<AnyConfig['addInputRules']>(
259
+ extension,
260
+ 'addInputRules',
261
+ context,
262
+ )
138
263
 
139
- plugins.push(...inputRulePlugins)
264
+ if (isExtensionRulesEnabled(extension, editor.options.enableInputRules) && addInputRules) {
265
+ inputRules.push(...addInputRules())
140
266
  }
141
267
 
142
- if (this.editor.options.enablePasteRules && extension.config.addPasteRules) {
143
- const pasteRulePlugins = extension.config.addPasteRules.bind(context)()
268
+ const addPasteRules = getExtensionField<AnyConfig['addPasteRules']>(
269
+ extension,
270
+ 'addPasteRules',
271
+ context,
272
+ )
144
273
 
145
- plugins.push(...pasteRulePlugins)
274
+ if (isExtensionRulesEnabled(extension, editor.options.enablePasteRules) && addPasteRules) {
275
+ pasteRules.push(...addPasteRules())
146
276
  }
147
277
 
148
- if (extension.config.addProseMirrorPlugins) {
149
- const proseMirrorPlugins = extension.config.addProseMirrorPlugins.bind(context)()
278
+ const addProseMirrorPlugins = getExtensionField<AnyConfig['addProseMirrorPlugins']>(
279
+ extension,
280
+ 'addProseMirrorPlugins',
281
+ context,
282
+ )
283
+
284
+ if (addProseMirrorPlugins) {
285
+ const proseMirrorPlugins = addProseMirrorPlugins()
150
286
 
151
287
  plugins.push(...proseMirrorPlugins)
152
288
  }
@@ -154,6 +290,18 @@ export default class ExtensionManager {
154
290
  return plugins
155
291
  })
156
292
  .flat()
293
+
294
+ return [
295
+ inputRulesPlugin({
296
+ editor,
297
+ rules: inputRules,
298
+ }),
299
+ ...pasteRulesPlugin({
300
+ editor,
301
+ rules: pasteRules,
302
+ }),
303
+ ...allPlugins,
304
+ ]
157
305
  }
158
306
 
159
307
  get attributes() {
@@ -164,56 +312,50 @@ export default class ExtensionManager {
164
312
  const { editor } = this
165
313
  const { nodeExtensions } = splitExtensions(this.extensions)
166
314
 
167
- return Object.fromEntries(nodeExtensions
168
- .filter(extension => !!extension.config.addNodeView)
169
- .map(extension => {
170
- const extensionAttributes = this.attributes.filter(attribute => attribute.type === extension.config.name)
171
- const context = {
172
- options: extension.options,
173
- editor,
174
- type: getNodeType(extension.config.name, this.schema),
175
- }
176
- const renderer = extension.config.addNodeView?.call(context) as NodeViewRenderer
177
-
178
- const nodeview = (
179
- node: ProsemirrorNode,
180
- view: EditorView,
181
- getPos: (() => number) | boolean,
182
- decorations: Decoration[],
183
- ) => {
184
- const HTMLAttributes = getRenderedAttributes(node, extensionAttributes)
185
-
186
- return renderer({
315
+ return Object.fromEntries(
316
+ nodeExtensions
317
+ .filter(extension => !!getExtensionField(extension, 'addNodeView'))
318
+ .map(extension => {
319
+ const extensionAttributes = this.attributes.filter(
320
+ attribute => attribute.type === extension.name,
321
+ )
322
+ const context = {
323
+ name: extension.name,
324
+ options: extension.options,
325
+ storage: extension.storage,
187
326
  editor,
188
- node,
189
- getPos,
190
- decorations,
191
- HTMLAttributes,
327
+ type: getNodeType(extension.name, this.schema),
328
+ }
329
+ const addNodeView = getExtensionField<NodeConfig['addNodeView']>(
192
330
  extension,
193
- })
194
- }
195
-
196
- return [extension.config.name, nodeview]
197
- }))
198
- }
199
-
200
- get textSerializers() {
201
- const { editor } = this
202
- const { nodeExtensions } = splitExtensions(this.extensions)
203
-
204
- return Object.fromEntries(nodeExtensions
205
- .filter(extension => !!extension.config.renderText)
206
- .map(extension => {
207
- const context = {
208
- options: extension.options,
209
- editor,
210
- type: getNodeType(extension.config.name, this.schema),
211
- }
212
-
213
- const textSerializer = (props: { node: ProsemirrorNode }) => extension.config.renderText?.call(context, props)
214
-
215
- return [extension.config.name, textSerializer]
216
- }))
331
+ 'addNodeView',
332
+ context,
333
+ )
334
+
335
+ if (!addNodeView) {
336
+ return []
337
+ }
338
+
339
+ const nodeview = (
340
+ node: ProsemirrorNode,
341
+ view: EditorView,
342
+ getPos: (() => number) | boolean,
343
+ decorations: Decoration[],
344
+ ) => {
345
+ const HTMLAttributes = getRenderedAttributes(node, extensionAttributes)
346
+
347
+ return addNodeView()({
348
+ editor,
349
+ node,
350
+ getPos,
351
+ decorations,
352
+ HTMLAttributes,
353
+ extension,
354
+ })
355
+ }
356
+
357
+ return [extension.name, nodeview]
358
+ }),
359
+ )
217
360
  }
218
-
219
361
  }