@tiptap/core 3.0.0 → 3.0.2

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 (340) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +5 -1
  3. package/dist/index.cjs +5169 -4654
  4. package/dist/index.cjs.map +1 -1
  5. package/dist/index.d.cts +3356 -0
  6. package/dist/index.d.ts +3356 -0
  7. package/dist/index.js +5051 -4561
  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-dev-runtime/index.cjs +1 -0
  16. package/jsx-dev-runtime/index.d.cts +1 -0
  17. package/jsx-dev-runtime/index.d.ts +1 -0
  18. package/jsx-dev-runtime/index.js +1 -0
  19. package/jsx-runtime/index.cjs +1 -0
  20. package/jsx-runtime/index.d.cts +1 -0
  21. package/jsx-runtime/index.d.ts +1 -0
  22. package/jsx-runtime/index.js +1 -0
  23. package/package.json +30 -10
  24. package/src/CommandManager.ts +4 -11
  25. package/src/Editor.ts +273 -100
  26. package/src/EventEmitter.ts +16 -10
  27. package/src/Extendable.ts +484 -0
  28. package/src/Extension.ts +29 -493
  29. package/src/ExtensionManager.ts +100 -143
  30. package/src/InputRule.ts +28 -24
  31. package/src/Mark.ts +157 -624
  32. package/src/MarkView.ts +122 -0
  33. package/src/Node.ts +343 -807
  34. package/src/NodePos.ts +18 -9
  35. package/src/NodeView.ts +58 -35
  36. package/src/PasteRule.ts +68 -24
  37. package/src/Tracker.ts +8 -10
  38. package/src/commands/blur.ts +15 -13
  39. package/src/commands/clearContent.ts +13 -6
  40. package/src/commands/clearNodes.ts +33 -31
  41. package/src/commands/command.ts +2 -2
  42. package/src/commands/createParagraphNear.ts +6 -4
  43. package/src/commands/cut.ts +13 -11
  44. package/src/commands/deleteCurrentNode.ts +24 -22
  45. package/src/commands/deleteNode.ts +20 -18
  46. package/src/commands/deleteRange.ts +11 -9
  47. package/src/commands/deleteSelection.ts +6 -4
  48. package/src/commands/enter.ts +7 -5
  49. package/src/commands/exitCode.ts +6 -4
  50. package/src/commands/extendMarkRange.ts +16 -14
  51. package/src/commands/first.ts +3 -5
  52. package/src/commands/focus.ts +51 -53
  53. package/src/commands/forEach.ts +3 -3
  54. package/src/commands/insertContent.ts +8 -10
  55. package/src/commands/insertContentAt.ts +131 -76
  56. package/src/commands/join.ts +21 -13
  57. package/src/commands/joinItemBackward.ts +17 -19
  58. package/src/commands/joinItemForward.ts +17 -19
  59. package/src/commands/joinTextblockBackward.ts +6 -4
  60. package/src/commands/joinTextblockForward.ts +6 -4
  61. package/src/commands/keyboardShortcut.ts +30 -35
  62. package/src/commands/lift.ts +12 -10
  63. package/src/commands/liftEmptyBlock.ts +7 -5
  64. package/src/commands/liftListItem.ts +8 -6
  65. package/src/commands/newlineInCode.ts +6 -4
  66. package/src/commands/resetAttributes.ts +38 -43
  67. package/src/commands/scrollIntoView.ts +10 -8
  68. package/src/commands/selectAll.ts +15 -8
  69. package/src/commands/selectNodeBackward.ts +6 -4
  70. package/src/commands/selectNodeForward.ts +6 -4
  71. package/src/commands/selectParentNode.ts +6 -4
  72. package/src/commands/selectTextblockEnd.ts +6 -4
  73. package/src/commands/selectTextblockStart.ts +6 -4
  74. package/src/commands/setContent.ts +37 -40
  75. package/src/commands/setMark.ts +58 -60
  76. package/src/commands/setMeta.ts +10 -6
  77. package/src/commands/setNode.ts +36 -27
  78. package/src/commands/setNodeSelection.ts +12 -10
  79. package/src/commands/setTextSelection.ts +16 -14
  80. package/src/commands/sinkListItem.ts +8 -6
  81. package/src/commands/splitBlock.ts +60 -68
  82. package/src/commands/splitListItem.ts +99 -101
  83. package/src/commands/toggleList.ts +76 -74
  84. package/src/commands/toggleMark.ts +13 -11
  85. package/src/commands/toggleNode.ts +22 -11
  86. package/src/commands/toggleWrap.ts +12 -10
  87. package/src/commands/undoInputRule.ts +32 -30
  88. package/src/commands/unsetAllMarks.ts +17 -15
  89. package/src/commands/unsetMark.ts +29 -27
  90. package/src/commands/updateAttributes.ts +97 -45
  91. package/src/commands/wrapIn.ts +8 -6
  92. package/src/commands/wrapInList.ts +8 -6
  93. package/src/extensions/clipboardTextSerializer.ts +2 -4
  94. package/src/extensions/delete.ts +89 -0
  95. package/src/extensions/drop.ts +26 -0
  96. package/src/extensions/focusEvents.ts +5 -7
  97. package/src/extensions/index.ts +4 -1
  98. package/src/extensions/keymap.ts +63 -52
  99. package/src/extensions/paste.ts +25 -0
  100. package/src/extensions/tabindex.ts +1 -1
  101. package/src/helpers/combineTransactionSteps.ts +3 -6
  102. package/src/helpers/createChainableState.ts +2 -5
  103. package/src/helpers/createDocument.ts +3 -3
  104. package/src/helpers/createNodeFromContent.ts +37 -25
  105. package/src/helpers/defaultBlockAt.ts +1 -1
  106. package/src/helpers/findChildren.ts +2 -2
  107. package/src/helpers/findChildrenInRange.ts +3 -7
  108. package/src/helpers/findParentNode.ts +5 -3
  109. package/src/helpers/findParentNodeClosestToPos.ts +2 -2
  110. package/src/helpers/flattenExtensions.ts +30 -0
  111. package/src/helpers/generateHTML.ts +1 -1
  112. package/src/helpers/generateJSON.ts +1 -1
  113. package/src/helpers/generateText.ts +1 -1
  114. package/src/helpers/getAttributes.ts +3 -6
  115. package/src/helpers/getAttributesFromExtensions.ts +29 -38
  116. package/src/helpers/getChangedRanges.ts +15 -13
  117. package/src/helpers/getDebugJSON.ts +2 -2
  118. package/src/helpers/getExtensionField.ts +12 -12
  119. package/src/helpers/getHTMLFromFragment.ts +2 -1
  120. package/src/helpers/getMarkAttributes.ts +3 -6
  121. package/src/helpers/getMarkRange.ts +36 -19
  122. package/src/helpers/getMarkType.ts +2 -4
  123. package/src/helpers/getMarksBetween.ts +3 -3
  124. package/src/helpers/getNodeAtPosition.ts +2 -2
  125. package/src/helpers/getNodeAttributes.ts +3 -6
  126. package/src/helpers/getNodeType.ts +2 -4
  127. package/src/helpers/getRenderedAttributes.ts +3 -2
  128. package/src/helpers/getSchema.ts +5 -5
  129. package/src/helpers/getSchemaByResolvedExtensions.ts +49 -79
  130. package/src/helpers/getSchemaTypeByName.ts +1 -1
  131. package/src/helpers/getSchemaTypeNameByName.ts +1 -1
  132. package/src/helpers/getSplittedAttributes.ts +5 -5
  133. package/src/helpers/getText.ts +2 -2
  134. package/src/helpers/getTextBetween.ts +2 -2
  135. package/src/helpers/getTextContentFromNodes.ts +9 -12
  136. package/src/helpers/getTextSerializersFromSchema.ts +2 -2
  137. package/src/helpers/index.ts +4 -0
  138. package/src/helpers/injectExtensionAttributesToParseRule.ts +3 -3
  139. package/src/helpers/isActive.ts +2 -6
  140. package/src/helpers/isAtEndOfNode.ts +1 -1
  141. package/src/helpers/isAtStartOfNode.ts +1 -1
  142. package/src/helpers/isExtensionRulesEnabled.ts +2 -4
  143. package/src/helpers/isList.ts +2 -2
  144. package/src/helpers/isMarkActive.ts +3 -3
  145. package/src/helpers/isNodeActive.ts +3 -3
  146. package/src/helpers/isNodeEmpty.ts +56 -5
  147. package/src/helpers/posToDOMRect.ts +1 -1
  148. package/src/helpers/resolveExtensions.ts +25 -0
  149. package/src/helpers/resolveFocusPosition.ts +5 -16
  150. package/src/helpers/rewriteUnknownContent.ts +149 -0
  151. package/src/helpers/selectionToInsertionEnd.ts +2 -1
  152. package/src/helpers/sortExtensions.ts +26 -0
  153. package/src/helpers/splitExtensions.ts +4 -4
  154. package/src/index.ts +3 -7
  155. package/src/inputRules/markInputRule.ts +6 -9
  156. package/src/inputRules/nodeInputRule.ts +7 -13
  157. package/src/inputRules/textInputRule.ts +4 -6
  158. package/src/inputRules/textblockTypeInputRule.ts +7 -12
  159. package/src/inputRules/wrappingInputRule.ts +19 -24
  160. package/src/jsx-runtime.ts +64 -0
  161. package/src/pasteRules/markPasteRule.ts +6 -7
  162. package/src/pasteRules/nodePasteRule.ts +15 -11
  163. package/src/pasteRules/textPasteRule.ts +4 -6
  164. package/src/style.ts +2 -6
  165. package/src/types.ts +513 -58
  166. package/src/utilities/callOrReturn.ts +1 -1
  167. package/src/utilities/canInsertNode.ts +30 -0
  168. package/src/utilities/createStyleTag.ts +3 -1
  169. package/src/utilities/deleteProps.ts +7 -11
  170. package/src/utilities/elementFromString.ts +3 -0
  171. package/src/utilities/findDuplicates.ts +5 -2
  172. package/src/utilities/index.ts +2 -0
  173. package/src/utilities/isFunction.ts +1 -0
  174. package/src/utilities/isMacOS.ts +1 -3
  175. package/src/utilities/isiOS.ts +5 -10
  176. package/src/utilities/mergeAttributes.ts +32 -5
  177. package/src/utilities/removeDuplicates.ts +1 -3
  178. package/dist/index.umd.js +0 -5098
  179. package/dist/index.umd.js.map +0 -1
  180. package/dist/packages/core/src/CommandManager.d.ts +0 -20
  181. package/dist/packages/core/src/Editor.d.ts +0 -161
  182. package/dist/packages/core/src/EventEmitter.d.ts +0 -11
  183. package/dist/packages/core/src/Extension.d.ts +0 -343
  184. package/dist/packages/core/src/ExtensionManager.d.ts +0 -55
  185. package/dist/packages/core/src/InputRule.d.ts +0 -42
  186. package/dist/packages/core/src/Mark.d.ts +0 -451
  187. package/dist/packages/core/src/Node.d.ts +0 -611
  188. package/dist/packages/core/src/NodePos.d.ts +0 -44
  189. package/dist/packages/core/src/NodeView.d.ts +0 -31
  190. package/dist/packages/core/src/PasteRule.d.ts +0 -50
  191. package/dist/packages/core/src/Tracker.d.ts +0 -11
  192. package/dist/packages/core/src/commands/blur.d.ts +0 -13
  193. package/dist/packages/core/src/commands/clearContent.d.ts +0 -14
  194. package/dist/packages/core/src/commands/clearNodes.d.ts +0 -13
  195. package/dist/packages/core/src/commands/command.d.ts +0 -18
  196. package/dist/packages/core/src/commands/createParagraphNear.d.ts +0 -13
  197. package/dist/packages/core/src/commands/cut.d.ts +0 -20
  198. package/dist/packages/core/src/commands/deleteCurrentNode.d.ts +0 -13
  199. package/dist/packages/core/src/commands/deleteNode.d.ts +0 -15
  200. package/dist/packages/core/src/commands/deleteRange.d.ts +0 -14
  201. package/dist/packages/core/src/commands/deleteSelection.d.ts +0 -13
  202. package/dist/packages/core/src/commands/enter.d.ts +0 -13
  203. package/dist/packages/core/src/commands/exitCode.d.ts +0 -13
  204. package/dist/packages/core/src/commands/extendMarkRange.d.ts +0 -25
  205. package/dist/packages/core/src/commands/first.d.ts +0 -14
  206. package/dist/packages/core/src/commands/focus.d.ts +0 -27
  207. package/dist/packages/core/src/commands/forEach.d.ts +0 -14
  208. package/dist/packages/core/src/commands/index.d.ts +0 -55
  209. package/dist/packages/core/src/commands/insertContent.d.ts +0 -34
  210. package/dist/packages/core/src/commands/insertContentAt.d.ts +0 -47
  211. package/dist/packages/core/src/commands/join.d.ts +0 -41
  212. package/dist/packages/core/src/commands/joinItemBackward.d.ts +0 -13
  213. package/dist/packages/core/src/commands/joinItemForward.d.ts +0 -13
  214. package/dist/packages/core/src/commands/joinTextblockBackward.d.ts +0 -12
  215. package/dist/packages/core/src/commands/joinTextblockForward.d.ts +0 -12
  216. package/dist/packages/core/src/commands/keyboardShortcut.d.ts +0 -14
  217. package/dist/packages/core/src/commands/lift.d.ts +0 -17
  218. package/dist/packages/core/src/commands/liftEmptyBlock.d.ts +0 -13
  219. package/dist/packages/core/src/commands/liftListItem.d.ts +0 -15
  220. package/dist/packages/core/src/commands/newlineInCode.d.ts +0 -13
  221. package/dist/packages/core/src/commands/resetAttributes.d.ts +0 -16
  222. package/dist/packages/core/src/commands/scrollIntoView.d.ts +0 -13
  223. package/dist/packages/core/src/commands/selectAll.d.ts +0 -13
  224. package/dist/packages/core/src/commands/selectNodeBackward.d.ts +0 -13
  225. package/dist/packages/core/src/commands/selectNodeForward.d.ts +0 -13
  226. package/dist/packages/core/src/commands/selectParentNode.d.ts +0 -13
  227. package/dist/packages/core/src/commands/selectTextblockEnd.d.ts +0 -13
  228. package/dist/packages/core/src/commands/selectTextblockStart.d.ts +0 -13
  229. package/dist/packages/core/src/commands/setContent.d.ts +0 -40
  230. package/dist/packages/core/src/commands/setMark.d.ts +0 -15
  231. package/dist/packages/core/src/commands/setMeta.d.ts +0 -15
  232. package/dist/packages/core/src/commands/setNode.d.ts +0 -16
  233. package/dist/packages/core/src/commands/setNodeSelection.d.ts +0 -14
  234. package/dist/packages/core/src/commands/setTextSelection.d.ts +0 -14
  235. package/dist/packages/core/src/commands/sinkListItem.d.ts +0 -15
  236. package/dist/packages/core/src/commands/splitBlock.d.ts +0 -17
  237. package/dist/packages/core/src/commands/splitListItem.d.ts +0 -15
  238. package/dist/packages/core/src/commands/toggleList.d.ts +0 -18
  239. package/dist/packages/core/src/commands/toggleMark.d.ts +0 -30
  240. package/dist/packages/core/src/commands/toggleNode.d.ts +0 -17
  241. package/dist/packages/core/src/commands/toggleWrap.d.ts +0 -16
  242. package/dist/packages/core/src/commands/undoInputRule.d.ts +0 -13
  243. package/dist/packages/core/src/commands/unsetAllMarks.d.ts +0 -13
  244. package/dist/packages/core/src/commands/unsetMark.d.ts +0 -25
  245. package/dist/packages/core/src/commands/updateAttributes.d.ts +0 -24
  246. package/dist/packages/core/src/commands/wrapIn.d.ts +0 -16
  247. package/dist/packages/core/src/commands/wrapInList.d.ts +0 -16
  248. package/dist/packages/core/src/extensions/clipboardTextSerializer.d.ts +0 -5
  249. package/dist/packages/core/src/extensions/commands.d.ts +0 -3
  250. package/dist/packages/core/src/extensions/editable.d.ts +0 -2
  251. package/dist/packages/core/src/extensions/focusEvents.d.ts +0 -2
  252. package/dist/packages/core/src/extensions/index.d.ts +0 -6
  253. package/dist/packages/core/src/extensions/keymap.d.ts +0 -2
  254. package/dist/packages/core/src/extensions/tabindex.d.ts +0 -2
  255. package/dist/packages/core/src/helpers/combineTransactionSteps.d.ts +0 -10
  256. package/dist/packages/core/src/helpers/createChainableState.d.ts +0 -10
  257. package/dist/packages/core/src/helpers/createDocument.d.ts +0 -12
  258. package/dist/packages/core/src/helpers/createNodeFromContent.d.ts +0 -15
  259. package/dist/packages/core/src/helpers/defaultBlockAt.d.ts +0 -7
  260. package/dist/packages/core/src/helpers/findChildren.d.ts +0 -9
  261. package/dist/packages/core/src/helpers/findChildrenInRange.d.ts +0 -10
  262. package/dist/packages/core/src/helpers/findParentNode.d.ts +0 -16
  263. package/dist/packages/core/src/helpers/findParentNodeClosestToPos.d.ts +0 -17
  264. package/dist/packages/core/src/helpers/generateHTML.d.ts +0 -8
  265. package/dist/packages/core/src/helpers/generateJSON.d.ts +0 -8
  266. package/dist/packages/core/src/helpers/generateText.d.ts +0 -12
  267. package/dist/packages/core/src/helpers/getAttributes.d.ts +0 -9
  268. package/dist/packages/core/src/helpers/getAttributesFromExtensions.d.ts +0 -6
  269. package/dist/packages/core/src/helpers/getChangedRanges.d.ts +0 -11
  270. package/dist/packages/core/src/helpers/getDebugJSON.d.ts +0 -8
  271. package/dist/packages/core/src/helpers/getExtensionField.d.ts +0 -9
  272. package/dist/packages/core/src/helpers/getHTMLFromFragment.d.ts +0 -2
  273. package/dist/packages/core/src/helpers/getMarkAttributes.d.ts +0 -3
  274. package/dist/packages/core/src/helpers/getMarkRange.d.ts +0 -3
  275. package/dist/packages/core/src/helpers/getMarkType.d.ts +0 -2
  276. package/dist/packages/core/src/helpers/getMarksBetween.d.ts +0 -3
  277. package/dist/packages/core/src/helpers/getNodeAtPosition.d.ts +0 -11
  278. package/dist/packages/core/src/helpers/getNodeAttributes.d.ts +0 -3
  279. package/dist/packages/core/src/helpers/getNodeType.d.ts +0 -2
  280. package/dist/packages/core/src/helpers/getRenderedAttributes.d.ts +0 -3
  281. package/dist/packages/core/src/helpers/getSchema.d.ts +0 -4
  282. package/dist/packages/core/src/helpers/getSchemaByResolvedExtensions.d.ts +0 -10
  283. package/dist/packages/core/src/helpers/getSchemaTypeByName.d.ts +0 -8
  284. package/dist/packages/core/src/helpers/getSchemaTypeNameByName.d.ts +0 -8
  285. package/dist/packages/core/src/helpers/getSplittedAttributes.d.ts +0 -9
  286. package/dist/packages/core/src/helpers/getText.d.ts +0 -15
  287. package/dist/packages/core/src/helpers/getTextBetween.d.ts +0 -14
  288. package/dist/packages/core/src/helpers/getTextContentFromNodes.d.ts +0 -8
  289. package/dist/packages/core/src/helpers/getTextSerializersFromSchema.d.ts +0 -8
  290. package/dist/packages/core/src/helpers/index.d.ts +0 -50
  291. package/dist/packages/core/src/helpers/injectExtensionAttributesToParseRule.d.ts +0 -9
  292. package/dist/packages/core/src/helpers/isActive.d.ts +0 -2
  293. package/dist/packages/core/src/helpers/isAtEndOfNode.d.ts +0 -2
  294. package/dist/packages/core/src/helpers/isAtStartOfNode.d.ts +0 -2
  295. package/dist/packages/core/src/helpers/isExtensionRulesEnabled.d.ts +0 -2
  296. package/dist/packages/core/src/helpers/isList.d.ts +0 -2
  297. package/dist/packages/core/src/helpers/isMarkActive.d.ts +0 -3
  298. package/dist/packages/core/src/helpers/isNodeActive.d.ts +0 -3
  299. package/dist/packages/core/src/helpers/isNodeEmpty.d.ts +0 -2
  300. package/dist/packages/core/src/helpers/isNodeSelection.d.ts +0 -2
  301. package/dist/packages/core/src/helpers/isTextSelection.d.ts +0 -2
  302. package/dist/packages/core/src/helpers/posToDOMRect.d.ts +0 -2
  303. package/dist/packages/core/src/helpers/resolveFocusPosition.d.ts +0 -4
  304. package/dist/packages/core/src/helpers/selectionToInsertionEnd.d.ts +0 -2
  305. package/dist/packages/core/src/helpers/splitExtensions.d.ts +0 -9
  306. package/dist/packages/core/src/index.d.ts +0 -24
  307. package/dist/packages/core/src/inputRules/index.d.ts +0 -5
  308. package/dist/packages/core/src/inputRules/markInputRule.d.ts +0 -13
  309. package/dist/packages/core/src/inputRules/nodeInputRule.d.ts +0 -23
  310. package/dist/packages/core/src/inputRules/textInputRule.d.ts +0 -10
  311. package/dist/packages/core/src/inputRules/textblockTypeInputRule.d.ts +0 -15
  312. package/dist/packages/core/src/inputRules/wrappingInputRule.d.ts +0 -28
  313. package/dist/packages/core/src/pasteRules/index.d.ts +0 -3
  314. package/dist/packages/core/src/pasteRules/markPasteRule.d.ts +0 -13
  315. package/dist/packages/core/src/pasteRules/nodePasteRule.d.ts +0 -13
  316. package/dist/packages/core/src/pasteRules/textPasteRule.d.ts +0 -10
  317. package/dist/packages/core/src/style.d.ts +0 -1
  318. package/dist/packages/core/src/types.d.ts +0 -255
  319. package/dist/packages/core/src/utilities/callOrReturn.d.ts +0 -9
  320. package/dist/packages/core/src/utilities/createStyleTag.d.ts +0 -1
  321. package/dist/packages/core/src/utilities/deleteProps.d.ts +0 -6
  322. package/dist/packages/core/src/utilities/elementFromString.d.ts +0 -1
  323. package/dist/packages/core/src/utilities/escapeForRegEx.d.ts +0 -1
  324. package/dist/packages/core/src/utilities/findDuplicates.d.ts +0 -1
  325. package/dist/packages/core/src/utilities/fromString.d.ts +0 -1
  326. package/dist/packages/core/src/utilities/index.d.ts +0 -20
  327. package/dist/packages/core/src/utilities/isAndroid.d.ts +0 -1
  328. package/dist/packages/core/src/utilities/isEmptyObject.d.ts +0 -1
  329. package/dist/packages/core/src/utilities/isFunction.d.ts +0 -1
  330. package/dist/packages/core/src/utilities/isMacOS.d.ts +0 -1
  331. package/dist/packages/core/src/utilities/isNumber.d.ts +0 -1
  332. package/dist/packages/core/src/utilities/isPlainObject.d.ts +0 -1
  333. package/dist/packages/core/src/utilities/isRegExp.d.ts +0 -1
  334. package/dist/packages/core/src/utilities/isString.d.ts +0 -1
  335. package/dist/packages/core/src/utilities/isiOS.d.ts +0 -1
  336. package/dist/packages/core/src/utilities/mergeAttributes.d.ts +0 -1
  337. package/dist/packages/core/src/utilities/mergeDeep.d.ts +0 -1
  338. package/dist/packages/core/src/utilities/minMax.d.ts +0 -1
  339. package/dist/packages/core/src/utilities/objectIncludes.d.ts +0 -8
  340. package/dist/packages/core/src/utilities/removeDuplicates.d.ts +0 -8
@@ -0,0 +1,30 @@
1
+ import type { AnyConfig, Extensions } from '../types.js'
2
+ import { getExtensionField } from './getExtensionField.js'
3
+
4
+ /**
5
+ * Create a flattened array of extensions by traversing the `addExtensions` field.
6
+ * @param extensions An array of Tiptap extensions
7
+ * @returns A flattened array of Tiptap extensions
8
+ */
9
+ export function flattenExtensions(extensions: Extensions): Extensions {
10
+ return (
11
+ extensions
12
+ .map(extension => {
13
+ const context = {
14
+ name: extension.name,
15
+ options: extension.options,
16
+ storage: extension.storage,
17
+ }
18
+
19
+ const addExtensions = getExtensionField<AnyConfig['addExtensions']>(extension, 'addExtensions', context)
20
+
21
+ if (addExtensions) {
22
+ return [extension, ...flattenExtensions(addExtensions())]
23
+ }
24
+
25
+ return extension
26
+ })
27
+ // `Infinity` will break TypeScript so we set a number that is probably high enough
28
+ .flat(10)
29
+ )
30
+ }
@@ -1,6 +1,6 @@
1
1
  import { Node } from '@tiptap/pm/model'
2
2
 
3
- import { Extensions, JSONContent } from '../types.js'
3
+ import type { Extensions, JSONContent } from '../types.js'
4
4
  import { getHTMLFromFragment } from './getHTMLFromFragment.js'
5
5
  import { getSchema } from './getSchema.js'
6
6
 
@@ -1,6 +1,6 @@
1
1
  import { DOMParser } from '@tiptap/pm/model'
2
2
 
3
- import { Extensions } from '../types.js'
3
+ import type { Extensions } from '../types.js'
4
4
  import { elementFromString } from '../utilities/elementFromString.js'
5
5
  import { getSchema } from './getSchema.js'
6
6
 
@@ -1,6 +1,6 @@
1
1
  import { Node } from '@tiptap/pm/model'
2
2
 
3
- import { Extensions, JSONContent, TextSerializer } from '../types.js'
3
+ import type { Extensions, JSONContent, TextSerializer } from '../types.js'
4
4
  import { getSchema } from './getSchema.js'
5
5
  import { getText } from './getText.js'
6
6
  import { getTextSerializersFromSchema } from './getTextSerializersFromSchema.js'
@@ -1,5 +1,5 @@
1
- import { MarkType, NodeType } from '@tiptap/pm/model'
2
- import { EditorState } from '@tiptap/pm/state'
1
+ import type { MarkType, NodeType } from '@tiptap/pm/model'
2
+ import type { EditorState } from '@tiptap/pm/state'
3
3
 
4
4
  import { getMarkAttributes } from './getMarkAttributes.js'
5
5
  import { getNodeAttributes } from './getNodeAttributes.js'
@@ -11,10 +11,7 @@ import { getSchemaTypeNameByName } from './getSchemaTypeNameByName.js'
11
11
  * @param typeOrName The node or mark type or name
12
12
  * @returns The attributes of the node or mark or an empty object
13
13
  */
14
- export function getAttributes(
15
- state: EditorState,
16
- typeOrName: string | NodeType | MarkType,
17
- ): Record<string, any> {
14
+ export function getAttributes(state: EditorState, typeOrName: string | NodeType | MarkType): Record<string, any> {
18
15
  const schemaType = getSchemaTypeNameByName(
19
16
  typeof typeOrName === 'string' ? typeOrName : typeOrName.name,
20
17
  state.schema,
@@ -1,11 +1,5 @@
1
- import { MarkConfig, NodeConfig } from '../index.js'
2
- import {
3
- AnyConfig,
4
- Attribute,
5
- Attributes,
6
- ExtensionAttribute,
7
- Extensions,
8
- } from '../types.js'
1
+ import type { MarkConfig, NodeConfig } from '../index.js'
2
+ import type { AnyConfig, Attribute, Attributes, ExtensionAttribute, Extensions } from '../types.js'
9
3
  import { getExtensionField } from './getExtensionField.js'
10
4
  import { splitExtensions } from './splitExtensions.js'
11
5
 
@@ -17,8 +11,9 @@ export function getAttributesFromExtensions(extensions: Extensions): ExtensionAt
17
11
  const extensionAttributes: ExtensionAttribute[] = []
18
12
  const { nodeExtensions, markExtensions } = splitExtensions(extensions)
19
13
  const nodeAndMarkExtensions = [...nodeExtensions, ...markExtensions]
20
- const defaultAttribute: Required<Attribute> = {
14
+ const defaultAttribute: Required<Omit<Attribute, 'validate'>> & Pick<Attribute, 'validate'> = {
21
15
  default: null,
16
+ validate: undefined,
22
17
  rendered: true,
23
18
  renderHTML: null,
24
19
  parseHTML: null,
@@ -48,18 +43,16 @@ export function getAttributesFromExtensions(extensions: Extensions): ExtensionAt
48
43
 
49
44
  globalAttributes.forEach(globalAttribute => {
50
45
  globalAttribute.types.forEach(type => {
51
- Object
52
- .entries(globalAttribute.attributes)
53
- .forEach(([name, attribute]) => {
54
- extensionAttributes.push({
55
- type,
56
- name,
57
- attribute: {
58
- ...defaultAttribute,
59
- ...attribute,
60
- },
61
- })
46
+ Object.entries(globalAttribute.attributes).forEach(([name, attribute]) => {
47
+ extensionAttributes.push({
48
+ type,
49
+ name,
50
+ attribute: {
51
+ ...defaultAttribute,
52
+ ...attribute,
53
+ },
62
54
  })
55
+ })
63
56
  })
64
57
  })
65
58
  })
@@ -84,28 +77,26 @@ export function getAttributesFromExtensions(extensions: Extensions): ExtensionAt
84
77
  // TODO: remove `as Attributes`
85
78
  const attributes = addAttributes() as Attributes
86
79
 
87
- Object
88
- .entries(attributes)
89
- .forEach(([name, attribute]) => {
90
- const mergedAttr = {
91
- ...defaultAttribute,
92
- ...attribute,
93
- }
80
+ Object.entries(attributes).forEach(([name, attribute]) => {
81
+ const mergedAttr = {
82
+ ...defaultAttribute,
83
+ ...attribute,
84
+ }
94
85
 
95
- if (typeof mergedAttr?.default === 'function') {
96
- mergedAttr.default = mergedAttr.default()
97
- }
86
+ if (typeof mergedAttr?.default === 'function') {
87
+ mergedAttr.default = mergedAttr.default()
88
+ }
98
89
 
99
- if (mergedAttr?.isRequired && mergedAttr?.default === undefined) {
100
- delete mergedAttr.default
101
- }
90
+ if (mergedAttr?.isRequired && mergedAttr?.default === undefined) {
91
+ delete mergedAttr.default
92
+ }
102
93
 
103
- extensionAttributes.push({
104
- type: extension.name,
105
- name,
106
- attribute: mergedAttr,
107
- })
94
+ extensionAttributes.push({
95
+ type: extension.name,
96
+ name,
97
+ attribute: mergedAttr,
108
98
  })
99
+ })
109
100
  })
110
101
 
111
102
  return extensionAttributes
@@ -1,11 +1,11 @@
1
- import { Step, Transform } from '@tiptap/pm/transform'
1
+ import type { Step, Transform } from '@tiptap/pm/transform'
2
2
 
3
- import { Range } from '../types.js'
3
+ import type { Range } from '../types.js'
4
4
  import { removeDuplicates } from '../utilities/removeDuplicates.js'
5
5
 
6
6
  export type ChangedRange = {
7
- oldRange: Range,
8
- newRange: Range,
7
+ oldRange: Range
8
+ newRange: Range
9
9
  }
10
10
 
11
11
  /**
@@ -18,15 +18,17 @@ function simplifyChangedRanges(changes: ChangedRange[]): ChangedRange[] {
18
18
  return uniqueChanges.length === 1
19
19
  ? uniqueChanges
20
20
  : uniqueChanges.filter((change, index) => {
21
- const rest = uniqueChanges.filter((_, i) => i !== index)
21
+ const rest = uniqueChanges.filter((_, i) => i !== index)
22
22
 
23
- return !rest.some(otherChange => {
24
- return change.oldRange.from >= otherChange.oldRange.from
25
- && change.oldRange.to <= otherChange.oldRange.to
26
- && change.newRange.from >= otherChange.newRange.from
27
- && change.newRange.to <= otherChange.newRange.to
23
+ return !rest.some(otherChange => {
24
+ return (
25
+ change.oldRange.from >= otherChange.oldRange.from &&
26
+ change.oldRange.to <= otherChange.oldRange.to &&
27
+ change.newRange.from >= otherChange.newRange.from &&
28
+ change.newRange.to <= otherChange.newRange.to
29
+ )
30
+ })
28
31
  })
29
- })
30
32
  }
31
33
 
32
34
  /**
@@ -45,8 +47,8 @@ export function getChangedRanges(transform: Transform): ChangedRange[] {
45
47
  // @ts-ignore
46
48
  if (!stepMap.ranges.length) {
47
49
  const { from, to } = steps[index] as Step & {
48
- from?: number,
49
- to?: number,
50
+ from?: number
51
+ to?: number
50
52
  }
51
53
 
52
54
  if (from === undefined || to === undefined) {
@@ -1,6 +1,6 @@
1
- import { Node as ProseMirrorNode } from '@tiptap/pm/model'
1
+ import type { Node as ProseMirrorNode } from '@tiptap/pm/model'
2
2
 
3
- import { JSONContent } from '../types.js'
3
+ import type { JSONContent } from '../types.js'
4
4
 
5
5
  interface DebugJSONContent extends JSONContent {
6
6
  from: number
@@ -1,4 +1,7 @@
1
- import { AnyExtension, MaybeThisParameterType, RemoveThis } from '../types.js'
1
+ import type { ExtensionConfig } from '../Extension.js'
2
+ import type { MarkConfig } from '../Mark.js'
3
+ import type { NodeConfig } from '../Node.js'
4
+ import type { AnyExtension, MaybeThisParameterType, RemoveThis } from '../types.js'
2
5
 
3
6
  /**
4
7
  * Returns a field from an extension
@@ -7,26 +10,23 @@ import { AnyExtension, MaybeThisParameterType, RemoveThis } from '../types.js'
7
10
  * @param context The context object that should be passed as `this` into the function
8
11
  * @returns The field value
9
12
  */
10
- export function getExtensionField<T = any>(
11
- extension: AnyExtension,
12
- field: string,
13
+ export function getExtensionField<T = any, E extends AnyExtension = any>(
14
+ extension: E,
15
+ field: keyof ExtensionConfig | keyof MarkConfig | keyof NodeConfig,
13
16
  context?: Omit<MaybeThisParameterType<T>, 'parent'>,
14
17
  ): RemoveThis<T> {
15
-
16
- if (extension.config[field] === undefined && extension.parent) {
18
+ if (extension.config[field as keyof typeof extension.config] === undefined && extension.parent) {
17
19
  return getExtensionField(extension.parent, field, context)
18
20
  }
19
21
 
20
- if (typeof extension.config[field] === 'function') {
21
- const value = extension.config[field].bind({
22
+ if (typeof extension.config[field as keyof typeof extension.config] === 'function') {
23
+ const value = (extension.config[field as keyof typeof extension.config] as any).bind({
22
24
  ...context,
23
- parent: extension.parent
24
- ? getExtensionField(extension.parent, field, context)
25
- : null,
25
+ parent: extension.parent ? getExtensionField(extension.parent, field, context) : null,
26
26
  })
27
27
 
28
28
  return value
29
29
  }
30
30
 
31
- return extension.config[field]
31
+ return extension.config[field as keyof typeof extension.config] as RemoveThis<T>
32
32
  }
@@ -1,4 +1,5 @@
1
- import { DOMSerializer, Fragment, Schema } from '@tiptap/pm/model'
1
+ import type { Fragment, Schema } from '@tiptap/pm/model'
2
+ import { DOMSerializer } from '@tiptap/pm/model'
2
3
 
3
4
  export function getHTMLFromFragment(fragment: Fragment, schema: Schema): string {
4
5
  const documentFragment = DOMSerializer.fromSchema(schema).serializeFragment(fragment)
@@ -1,12 +1,9 @@
1
- import { Mark, MarkType } from '@tiptap/pm/model'
2
- import { EditorState } from '@tiptap/pm/state'
1
+ import type { Mark, MarkType } from '@tiptap/pm/model'
2
+ import type { EditorState } from '@tiptap/pm/state'
3
3
 
4
4
  import { getMarkType } from './getMarkType.js'
5
5
 
6
- export function getMarkAttributes(
7
- state: EditorState,
8
- typeOrName: string | MarkType,
9
- ): Record<string, any> {
6
+ export function getMarkAttributes(state: EditorState, typeOrName: string | MarkType): Record<string, any> {
10
7
  const type = getMarkType(typeOrName, state.schema)
11
8
  const { from, to, empty } = state.selection
12
9
  const marks: Mark[] = []
@@ -1,6 +1,6 @@
1
- import { Mark as ProseMirrorMark, MarkType, ResolvedPos } from '@tiptap/pm/model'
1
+ import type { Mark as ProseMirrorMark, MarkType, ResolvedPos } from '@tiptap/pm/model'
2
2
 
3
- import { Range } from '../types.js'
3
+ import type { Range } from '../types.js'
4
4
  import { objectIncludes } from '../utilities/objectIncludes.js'
5
5
 
6
6
  function findMarkInSet(
@@ -9,37 +9,59 @@ function findMarkInSet(
9
9
  attributes: Record<string, any> = {},
10
10
  ): ProseMirrorMark | undefined {
11
11
  return marks.find(item => {
12
- return item.type === type && objectIncludes(item.attrs, attributes)
12
+ return (
13
+ item.type === type &&
14
+ objectIncludes(
15
+ // Only check equality for the attributes that are provided
16
+ Object.fromEntries(Object.keys(attributes).map(k => [k, item.attrs[k]])),
17
+ attributes,
18
+ )
19
+ )
13
20
  })
14
21
  }
15
22
 
16
- function isMarkInSet(
17
- marks: ProseMirrorMark[],
18
- type: MarkType,
19
- attributes: Record<string, any> = {},
20
- ): boolean {
23
+ function isMarkInSet(marks: ProseMirrorMark[], type: MarkType, attributes: Record<string, any> = {}): boolean {
21
24
  return !!findMarkInSet(marks, type, attributes)
22
25
  }
23
26
 
27
+ /**
28
+ * Get the range of a mark at a resolved position.
29
+ */
24
30
  export function getMarkRange(
31
+ /**
32
+ * The position to get the mark range for.
33
+ */
25
34
  $pos: ResolvedPos,
35
+ /**
36
+ * The mark type to get the range for.
37
+ */
26
38
  type: MarkType,
27
- attributes: Record<string, any> = {},
39
+ /**
40
+ * The attributes to match against.
41
+ * If not provided, only the first mark at the position will be matched.
42
+ */
43
+ attributes?: Record<string, any>,
28
44
  ): Range | void {
29
45
  if (!$pos || !type) {
30
46
  return
31
47
  }
32
-
33
48
  let start = $pos.parent.childAfter($pos.parentOffset)
34
49
 
35
- if ($pos.parentOffset === start.offset && start.offset !== 0) {
50
+ // If the cursor is at the start of a text node that does not have the mark, look backward
51
+ if (!start.node || !start.node.marks.some(mark => mark.type === type)) {
36
52
  start = $pos.parent.childBefore($pos.parentOffset)
37
53
  }
38
54
 
39
- if (!start.node) {
55
+ // If there is no text node with the mark even backward, return undefined
56
+ if (!start.node || !start.node.marks.some(mark => mark.type === type)) {
40
57
  return
41
58
  }
42
59
 
60
+ // Default to only matching against the first mark's attributes
61
+ attributes = attributes || start.node.marks[0]?.attrs
62
+
63
+ // We now know that the cursor is either at the start, middle or end of a text node with the specified mark
64
+ // so we can look it up on the targeted mark
43
65
  const mark = findMarkInSet([...start.node.marks], type, attributes)
44
66
 
45
67
  if (!mark) {
@@ -51,17 +73,12 @@ export function getMarkRange(
51
73
  let endIndex = startIndex + 1
52
74
  let endPos = startPos + start.node.nodeSize
53
75
 
54
- findMarkInSet([...start.node.marks], type, attributes)
55
-
56
- while (startIndex > 0 && mark.isInSet($pos.parent.child(startIndex - 1).marks)) {
76
+ while (startIndex > 0 && isMarkInSet([...$pos.parent.child(startIndex - 1).marks], type, attributes)) {
57
77
  startIndex -= 1
58
78
  startPos -= $pos.parent.child(startIndex).nodeSize
59
79
  }
60
80
 
61
- while (
62
- endIndex < $pos.parent.childCount
63
- && isMarkInSet([...$pos.parent.child(endIndex).marks], type, attributes)
64
- ) {
81
+ while (endIndex < $pos.parent.childCount && isMarkInSet([...$pos.parent.child(endIndex).marks], type, attributes)) {
65
82
  endPos += $pos.parent.child(endIndex).nodeSize
66
83
  endIndex += 1
67
84
  }
@@ -1,11 +1,9 @@
1
- import { MarkType, Schema } from '@tiptap/pm/model'
1
+ import type { MarkType, Schema } from '@tiptap/pm/model'
2
2
 
3
3
  export function getMarkType(nameOrType: string | MarkType, schema: Schema): MarkType {
4
4
  if (typeof nameOrType === 'string') {
5
5
  if (!schema.marks[nameOrType]) {
6
- throw Error(
7
- `There is no mark type named '${nameOrType}'. Maybe you forgot to add the extension?`,
8
- )
6
+ throw Error(`There is no mark type named '${nameOrType}'. Maybe you forgot to add the extension?`)
9
7
  }
10
8
 
11
9
  return schema.marks[nameOrType]
@@ -1,6 +1,6 @@
1
- import { Node as ProseMirrorNode } from '@tiptap/pm/model'
1
+ import type { Node as ProseMirrorNode } from '@tiptap/pm/model'
2
2
 
3
- import { MarkRange } from '../types.js'
3
+ import type { MarkRange } from '../types.js'
4
4
  import { getMarkRange } from './getMarkRange.js'
5
5
 
6
6
  export function getMarksBetween(from: number, to: number, doc: ProseMirrorNode): MarkRange[] {
@@ -12,7 +12,7 @@ export function getMarksBetween(from: number, to: number, doc: ProseMirrorNode):
12
12
  .resolve(from)
13
13
  .marks()
14
14
  .forEach(mark => {
15
- const $pos = doc.resolve(from - 1)
15
+ const $pos = doc.resolve(from)
16
16
  const range = getMarkRange($pos, mark.type)
17
17
 
18
18
  if (!range) {
@@ -1,5 +1,5 @@
1
- import { Node, NodeType } from '@tiptap/pm/model'
2
- import { EditorState } from '@tiptap/pm/state'
1
+ import type { Node, NodeType } from '@tiptap/pm/model'
2
+ import type { EditorState } from '@tiptap/pm/state'
3
3
 
4
4
  /**
5
5
  * Finds the first node of a given type or name in the current selection.
@@ -1,12 +1,9 @@
1
- import { Node, NodeType } from '@tiptap/pm/model'
2
- import { EditorState } from '@tiptap/pm/state'
1
+ import type { Node, NodeType } from '@tiptap/pm/model'
2
+ import type { EditorState } from '@tiptap/pm/state'
3
3
 
4
4
  import { getNodeType } from './getNodeType.js'
5
5
 
6
- export function getNodeAttributes(
7
- state: EditorState,
8
- typeOrName: string | NodeType,
9
- ): Record<string, any> {
6
+ export function getNodeAttributes(state: EditorState, typeOrName: string | NodeType): Record<string, any> {
10
7
  const type = getNodeType(typeOrName, state.schema)
11
8
  const { from, to } = state.selection
12
9
  const nodes: Node[] = []
@@ -1,11 +1,9 @@
1
- import { NodeType, Schema } from '@tiptap/pm/model'
1
+ import type { NodeType, Schema } from '@tiptap/pm/model'
2
2
 
3
3
  export function getNodeType(nameOrType: string | NodeType, schema: Schema): NodeType {
4
4
  if (typeof nameOrType === 'string') {
5
5
  if (!schema.nodes[nameOrType]) {
6
- throw Error(
7
- `There is no node type named '${nameOrType}'. Maybe you forgot to add the extension?`,
8
- )
6
+ throw Error(`There is no node type named '${nameOrType}'. Maybe you forgot to add the extension?`)
9
7
  }
10
8
 
11
9
  return schema.nodes[nameOrType]
@@ -1,6 +1,6 @@
1
- import { Mark, Node } from '@tiptap/pm/model'
1
+ import type { Mark, Node } from '@tiptap/pm/model'
2
2
 
3
- import { ExtensionAttribute } from '../types.js'
3
+ import type { ExtensionAttribute } from '../types.js'
4
4
  import { mergeAttributes } from '../utilities/mergeAttributes.js'
5
5
 
6
6
  export function getRenderedAttributes(
@@ -8,6 +8,7 @@ export function getRenderedAttributes(
8
8
  extensionAttributes: ExtensionAttribute[],
9
9
  ): Record<string, any> {
10
10
  return extensionAttributes
11
+ .filter(attribute => attribute.type === nodeOrMark.type.name)
11
12
  .filter(item => item.attribute.rendered)
12
13
  .map(item => {
13
14
  if (!item.attribute.renderHTML) {
@@ -1,12 +1,12 @@
1
- import { Schema } from '@tiptap/pm/model'
1
+ import type { Schema } from '@tiptap/pm/model'
2
2
 
3
- import { Editor } from '../Editor.js'
4
- import { ExtensionManager } from '../ExtensionManager.js'
5
- import { Extensions } from '../types.js'
3
+ import type { Editor } from '../Editor.js'
4
+ import type { Extensions } from '../types.js'
6
5
  import { getSchemaByResolvedExtensions } from './getSchemaByResolvedExtensions.js'
6
+ import { resolveExtensions } from './resolveExtensions.js'
7
7
 
8
8
  export function getSchema(extensions: Extensions, editor?: Editor): Schema {
9
- const resolvedExtensions = ExtensionManager.resolve(extensions)
9
+ const resolvedExtensions = resolveExtensions(extensions)
10
10
 
11
11
  return getSchemaByResolvedExtensions(resolvedExtensions, editor)
12
12
  }