@tiptap/core 2.0.0-beta.21 → 2.0.0-beta.211

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 (289) hide show
  1. package/README.md +2 -2
  2. package/dist/index.cjs +4311 -0
  3. package/dist/index.d.ts +2330 -0
  4. package/dist/index.js +4311 -0
  5. package/package.json +39 -25
  6. package/src/CommandManager.ts +76 -86
  7. package/src/Editor.ts +120 -81
  8. package/src/EventEmitter.ts +14 -4
  9. package/src/Extension.ts +280 -108
  10. package/src/ExtensionManager.ts +254 -108
  11. package/src/InputRule.ts +260 -0
  12. package/src/Mark.ts +398 -147
  13. package/src/Node.ts +437 -171
  14. package/src/NodeView.ts +132 -63
  15. package/src/PasteRule.ts +240 -0
  16. package/src/Tracker.ts +38 -0
  17. package/src/commands/blur.ts +12 -6
  18. package/src/commands/clearContent.ts +3 -3
  19. package/src/commands/clearNodes.ts +31 -19
  20. package/src/commands/command.ts +2 -2
  21. package/src/commands/createParagraphNear.ts +5 -4
  22. package/src/commands/deleteCurrentNode.ts +41 -0
  23. package/src/commands/deleteNode.ts +37 -0
  24. package/src/commands/deleteRange.ts +3 -3
  25. package/src/commands/deleteSelection.ts +5 -4
  26. package/src/commands/enter.ts +3 -3
  27. package/src/commands/exitCode.ts +5 -4
  28. package/src/commands/extendMarkRange.ts +16 -12
  29. package/src/commands/first.ts +3 -3
  30. package/src/commands/focus.ts +47 -44
  31. package/src/commands/forEach.ts +24 -0
  32. package/src/commands/index.ts +50 -0
  33. package/src/commands/insertContent.ts +17 -24
  34. package/src/commands/insertContentAt.ts +94 -0
  35. package/src/commands/join.ts +53 -0
  36. package/src/commands/keyboardShortcut.ts +6 -6
  37. package/src/commands/lift.ts +8 -7
  38. package/src/commands/liftEmptyBlock.ts +5 -4
  39. package/src/commands/liftListItem.ts +7 -6
  40. package/src/commands/newlineInCode.ts +5 -4
  41. package/src/commands/resetAttributes.ts +18 -12
  42. package/src/commands/scrollIntoView.ts +3 -3
  43. package/src/commands/selectAll.ts +8 -6
  44. package/src/commands/selectNodeBackward.ts +5 -4
  45. package/src/commands/selectNodeForward.ts +5 -4
  46. package/src/commands/selectParentNode.ts +5 -4
  47. package/src/commands/selectTextblockEnd.ts +20 -0
  48. package/src/commands/selectTextblockStart.ts +20 -0
  49. package/src/commands/setContent.ts +9 -16
  50. package/src/commands/setMark.ts +90 -14
  51. package/src/commands/setMeta.ts +18 -0
  52. package/src/commands/setNode.ts +32 -8
  53. package/src/commands/setNodeSelection.ts +27 -0
  54. package/src/commands/setTextSelection.ts +31 -0
  55. package/src/commands/sinkListItem.ts +7 -6
  56. package/src/commands/splitBlock.ts +31 -41
  57. package/src/commands/splitListItem.ts +46 -29
  58. package/src/commands/toggleList.ts +88 -20
  59. package/src/commands/toggleMark.ts +19 -8
  60. package/src/commands/toggleNode.ts +11 -6
  61. package/src/commands/toggleWrap.ts +10 -10
  62. package/src/commands/undoInputRule.ts +34 -5
  63. package/src/commands/unsetAllMarks.ts +7 -11
  64. package/src/commands/unsetMark.ts +36 -23
  65. package/src/commands/updateAttributes.ts +27 -15
  66. package/src/commands/wrapIn.ts +7 -12
  67. package/src/commands/wrapInList.ts +7 -6
  68. package/src/extensions/clipboardTextSerializer.ts +15 -36
  69. package/src/extensions/commands.ts +3 -147
  70. package/src/extensions/editable.ts +2 -1
  71. package/src/extensions/focusEvents.ts +4 -6
  72. package/src/extensions/index.ts +1 -0
  73. package/src/extensions/keymap.ts +106 -13
  74. package/src/extensions/tabindex.ts +18 -0
  75. package/src/helpers/combineTransactionSteps.ts +21 -0
  76. package/src/helpers/createChainableState.ts +38 -0
  77. package/src/helpers/createDocument.ts +5 -6
  78. package/src/helpers/createNodeFromContent.ts +20 -28
  79. package/src/helpers/defaultBlockAt.ts +13 -0
  80. package/src/helpers/findChildren.ts +18 -0
  81. package/src/helpers/findChildrenInRange.ts +36 -0
  82. package/src/helpers/findParentNode.ts +4 -3
  83. package/src/helpers/findParentNodeClosestToPos.ts +13 -7
  84. package/src/helpers/generateHTML.ts +7 -6
  85. package/src/helpers/generateJSON.ts +12 -0
  86. package/src/helpers/generateText.ts +27 -0
  87. package/src/helpers/getAttributes.ts +26 -0
  88. package/src/helpers/getAttributesFromExtensions.ts +42 -14
  89. package/src/helpers/getChangedRanges.ts +83 -0
  90. package/src/helpers/getDebugJSON.ts +54 -0
  91. package/src/helpers/getExtensionField.ts +25 -0
  92. package/src/helpers/getHTMLFromFragment.ts +5 -6
  93. package/src/helpers/getMarkAttributes.ts +18 -11
  94. package/src/helpers/getMarkRange.ts +41 -8
  95. package/src/helpers/getMarkType.ts +8 -2
  96. package/src/helpers/getMarksBetween.ts +34 -10
  97. package/src/helpers/getNodeAttributes.ts +14 -13
  98. package/src/helpers/getNodeType.ts +8 -2
  99. package/src/helpers/getRenderedAttributes.ts +9 -7
  100. package/src/helpers/getSchema.ts +7 -133
  101. package/src/helpers/getSchemaByResolvedExtensions.ts +192 -0
  102. package/src/helpers/getSchemaTypeByName.ts +3 -11
  103. package/src/helpers/getSchemaTypeNameByName.ts +2 -2
  104. package/src/helpers/getSplittedAttributes.ts +4 -4
  105. package/src/helpers/getText.ts +19 -0
  106. package/src/helpers/getTextBetween.ts +46 -0
  107. package/src/helpers/getTextContentFromNodes.ts +26 -0
  108. package/src/helpers/getTextSerializersFromSchema.ts +11 -0
  109. package/src/helpers/index.ts +33 -0
  110. package/src/helpers/injectExtensionAttributesToParseRule.ts +22 -23
  111. package/src/helpers/isActive.ts +10 -6
  112. package/src/helpers/isExtensionRulesEnabled.ts +15 -0
  113. package/src/helpers/isList.ts +14 -7
  114. package/src/helpers/isMarkActive.ts +49 -27
  115. package/src/helpers/isNodeActive.ts +29 -39
  116. package/src/helpers/isNodeEmpty.ts +2 -2
  117. package/src/helpers/isNodeSelection.ts +3 -4
  118. package/src/helpers/isTextSelection.ts +3 -4
  119. package/src/helpers/posToDOMRect.ts +35 -0
  120. package/src/helpers/resolveFocusPosition.ts +42 -0
  121. package/src/helpers/selectionToInsertionEnd.ts +3 -3
  122. package/src/helpers/splitExtensions.ts +3 -3
  123. package/src/index.ts +15 -24
  124. package/src/inputRules/index.ts +5 -0
  125. package/src/inputRules/markInputRule.ts +59 -40
  126. package/src/inputRules/nodeInputRule.ts +45 -12
  127. package/src/inputRules/textInputRule.ts +35 -0
  128. package/src/inputRules/textblockTypeInputRule.ts +37 -0
  129. package/src/inputRules/wrappingInputRule.ts +59 -0
  130. package/src/pasteRules/index.ts +3 -0
  131. package/src/pasteRules/markPasteRule.ts +61 -53
  132. package/src/pasteRules/nodePasteRule.ts +37 -0
  133. package/src/pasteRules/textPasteRule.ts +35 -0
  134. package/src/style.ts +16 -3
  135. package/src/types.ts +170 -97
  136. package/src/utilities/callOrReturn.ts +6 -3
  137. package/src/utilities/createStyleTag.ts +12 -1
  138. package/src/utilities/deleteProps.ts +2 -4
  139. package/src/utilities/elementFromString.ts +4 -5
  140. package/src/utilities/escapeForRegEx.ts +4 -0
  141. package/src/utilities/findDuplicates.ts +5 -0
  142. package/src/utilities/fromString.ts +2 -2
  143. package/src/utilities/index.ts +20 -0
  144. package/src/utilities/isEmptyObject.ts +2 -2
  145. package/src/utilities/isFunction.ts +3 -0
  146. package/src/utilities/isMacOS.ts +5 -0
  147. package/src/utilities/isNumber.ts +3 -0
  148. package/src/utilities/isPlainObject.ts +8 -5
  149. package/src/utilities/isRegExp.ts +3 -0
  150. package/src/utilities/isString.ts +3 -0
  151. package/src/utilities/isiOS.ts +12 -0
  152. package/src/utilities/mergeAttributes.ts +2 -3
  153. package/src/utilities/mergeDeep.ts +2 -3
  154. package/src/utilities/minMax.ts +1 -1
  155. package/src/utilities/objectIncludes.ts +17 -5
  156. package/src/utilities/removeDuplicates.ts +15 -0
  157. package/CHANGELOG.md +0 -365
  158. package/LICENSE.md +0 -21
  159. package/dist/packages/core/src/CommandManager.d.ts +0 -13
  160. package/dist/packages/core/src/Editor.d.ts +0 -142
  161. package/dist/packages/core/src/EventEmitter.d.ts +0 -7
  162. package/dist/packages/core/src/Extension.d.ts +0 -148
  163. package/dist/packages/core/src/ExtensionManager.d.ts +0 -24
  164. package/dist/packages/core/src/Mark.d.ts +0 -211
  165. package/dist/packages/core/src/Node.d.ts +0 -265
  166. package/dist/packages/core/src/NodeView.d.ts +0 -31
  167. package/dist/packages/core/src/commands/blur.d.ts +0 -12
  168. package/dist/packages/core/src/commands/clearContent.d.ts +0 -12
  169. package/dist/packages/core/src/commands/clearNodes.d.ts +0 -12
  170. package/dist/packages/core/src/commands/command.d.ts +0 -12
  171. package/dist/packages/core/src/commands/createParagraphNear.d.ts +0 -12
  172. package/dist/packages/core/src/commands/deleteRange.d.ts +0 -12
  173. package/dist/packages/core/src/commands/deleteSelection.d.ts +0 -12
  174. package/dist/packages/core/src/commands/enter.d.ts +0 -12
  175. package/dist/packages/core/src/commands/exitCode.d.ts +0 -12
  176. package/dist/packages/core/src/commands/extendMarkRange.d.ts +0 -13
  177. package/dist/packages/core/src/commands/first.d.ts +0 -12
  178. package/dist/packages/core/src/commands/focus.d.ts +0 -12
  179. package/dist/packages/core/src/commands/insertContent.d.ts +0 -12
  180. package/dist/packages/core/src/commands/insertHTML.d.ts +0 -12
  181. package/dist/packages/core/src/commands/insertNode.d.ts +0 -13
  182. package/dist/packages/core/src/commands/insertText.d.ts +0 -12
  183. package/dist/packages/core/src/commands/joinBackward.d.ts +0 -12
  184. package/dist/packages/core/src/commands/joinForward.d.ts +0 -12
  185. package/dist/packages/core/src/commands/keyboardShortcut.d.ts +0 -12
  186. package/dist/packages/core/src/commands/lift.d.ts +0 -13
  187. package/dist/packages/core/src/commands/liftEmptyBlock.d.ts +0 -12
  188. package/dist/packages/core/src/commands/liftListItem.d.ts +0 -13
  189. package/dist/packages/core/src/commands/newlineInCode.d.ts +0 -12
  190. package/dist/packages/core/src/commands/replace.d.ts +0 -13
  191. package/dist/packages/core/src/commands/replaceRange.d.ts +0 -13
  192. package/dist/packages/core/src/commands/resetAttributes.d.ts +0 -13
  193. package/dist/packages/core/src/commands/resetNodeAttributes.d.ts +0 -13
  194. package/dist/packages/core/src/commands/scrollIntoView.d.ts +0 -12
  195. package/dist/packages/core/src/commands/selectAll.d.ts +0 -12
  196. package/dist/packages/core/src/commands/selectNodeBackward.d.ts +0 -12
  197. package/dist/packages/core/src/commands/selectNodeForward.d.ts +0 -12
  198. package/dist/packages/core/src/commands/selectParentNode.d.ts +0 -12
  199. package/dist/packages/core/src/commands/setContent.d.ts +0 -12
  200. package/dist/packages/core/src/commands/setMark.d.ts +0 -13
  201. package/dist/packages/core/src/commands/setNode.d.ts +0 -13
  202. package/dist/packages/core/src/commands/sinkListItem.d.ts +0 -13
  203. package/dist/packages/core/src/commands/splitBlock.d.ts +0 -14
  204. package/dist/packages/core/src/commands/splitListItem.d.ts +0 -13
  205. package/dist/packages/core/src/commands/toggleList.d.ts +0 -13
  206. package/dist/packages/core/src/commands/toggleMark.d.ts +0 -13
  207. package/dist/packages/core/src/commands/toggleNode.d.ts +0 -13
  208. package/dist/packages/core/src/commands/toggleWrap.d.ts +0 -13
  209. package/dist/packages/core/src/commands/undoInputRule.d.ts +0 -12
  210. package/dist/packages/core/src/commands/unsetAllMarks.d.ts +0 -12
  211. package/dist/packages/core/src/commands/unsetMark.d.ts +0 -13
  212. package/dist/packages/core/src/commands/updateAttributes.d.ts +0 -13
  213. package/dist/packages/core/src/commands/updateNodeAttributes.d.ts +0 -13
  214. package/dist/packages/core/src/commands/wrapIn.d.ts +0 -13
  215. package/dist/packages/core/src/commands/wrapInList.d.ts +0 -13
  216. package/dist/packages/core/src/extensions/clipboardTextSerializer.d.ts +0 -2
  217. package/dist/packages/core/src/extensions/commands.d.ts +0 -100
  218. package/dist/packages/core/src/extensions/editable.d.ts +0 -2
  219. package/dist/packages/core/src/extensions/focusEvents.d.ts +0 -2
  220. package/dist/packages/core/src/extensions/index.d.ts +0 -5
  221. package/dist/packages/core/src/extensions/keymap.d.ts +0 -2
  222. package/dist/packages/core/src/helpers/createDocument.d.ts +0 -4
  223. package/dist/packages/core/src/helpers/createNodeFromContent.d.ts +0 -8
  224. package/dist/packages/core/src/helpers/findParentNode.d.ts +0 -9
  225. package/dist/packages/core/src/helpers/findParentNodeClosestToPos.d.ts +0 -8
  226. package/dist/packages/core/src/helpers/generateHTML.d.ts +0 -2
  227. package/dist/packages/core/src/helpers/getAttributesFromExtensions.d.ts +0 -6
  228. package/dist/packages/core/src/helpers/getHTMLFromFragment.d.ts +0 -2
  229. package/dist/packages/core/src/helpers/getMarkAttributes.d.ts +0 -4
  230. package/dist/packages/core/src/helpers/getMarkRange.d.ts +0 -3
  231. package/dist/packages/core/src/helpers/getMarkType.d.ts +0 -2
  232. package/dist/packages/core/src/helpers/getMarksBetween.d.ts +0 -3
  233. package/dist/packages/core/src/helpers/getNodeAttributes.d.ts +0 -4
  234. package/dist/packages/core/src/helpers/getNodeType.d.ts +0 -2
  235. package/dist/packages/core/src/helpers/getRenderedAttributes.d.ts +0 -3
  236. package/dist/packages/core/src/helpers/getSchema.d.ts +0 -3
  237. package/dist/packages/core/src/helpers/getSchemaTypeByName.d.ts +0 -2
  238. package/dist/packages/core/src/helpers/getSchemaTypeNameByName.d.ts +0 -2
  239. package/dist/packages/core/src/helpers/getSplittedAttributes.d.ts +0 -2
  240. package/dist/packages/core/src/helpers/injectExtensionAttributesToParseRule.d.ts +0 -9
  241. package/dist/packages/core/src/helpers/isActive.d.ts +0 -3
  242. package/dist/packages/core/src/helpers/isList.d.ts +0 -2
  243. package/dist/packages/core/src/helpers/isMarkActive.d.ts +0 -4
  244. package/dist/packages/core/src/helpers/isNodeActive.d.ts +0 -4
  245. package/dist/packages/core/src/helpers/isNodeEmpty.d.ts +0 -2
  246. package/dist/packages/core/src/helpers/isNodeSelection.d.ts +0 -2
  247. package/dist/packages/core/src/helpers/isTextSelection.d.ts +0 -2
  248. package/dist/packages/core/src/helpers/selectionToInsertionEnd.d.ts +0 -2
  249. package/dist/packages/core/src/helpers/splitExtensions.d.ts +0 -9
  250. package/dist/packages/core/src/index.d.ts +0 -30
  251. package/dist/packages/core/src/inputRules/markInputRule.d.ts +0 -3
  252. package/dist/packages/core/src/inputRules/nodeInputRule.d.ts +0 -3
  253. package/dist/packages/core/src/pasteRules/markPasteRule.d.ts +0 -3
  254. package/dist/packages/core/src/style.d.ts +0 -2
  255. package/dist/packages/core/src/types.d.ts +0 -154
  256. package/dist/packages/core/src/utilities/callOrReturn.d.ts +0 -8
  257. package/dist/packages/core/src/utilities/createStyleTag.d.ts +0 -1
  258. package/dist/packages/core/src/utilities/deleteProps.d.ts +0 -7
  259. package/dist/packages/core/src/utilities/elementFromString.d.ts +0 -1
  260. package/dist/packages/core/src/utilities/fromString.d.ts +0 -1
  261. package/dist/packages/core/src/utilities/isClass.d.ts +0 -1
  262. package/dist/packages/core/src/utilities/isEmptyObject.d.ts +0 -1
  263. package/dist/packages/core/src/utilities/isObject.d.ts +0 -1
  264. package/dist/packages/core/src/utilities/isPlainObject.d.ts +0 -1
  265. package/dist/packages/core/src/utilities/mergeAttributes.d.ts +0 -2
  266. package/dist/packages/core/src/utilities/mergeDeep.d.ts +0 -2
  267. package/dist/packages/core/src/utilities/minMax.d.ts +0 -1
  268. package/dist/packages/core/src/utilities/objectIncludes.d.ts +0 -7
  269. package/dist/packages/core/src/utilities/removeElement.d.ts +0 -1
  270. package/dist/tiptap-core.bundle.umd.min.js +0 -17
  271. package/dist/tiptap-core.bundle.umd.min.js.map +0 -1
  272. package/dist/tiptap-core.cjs.js +0 -3027
  273. package/dist/tiptap-core.cjs.js.map +0 -1
  274. package/dist/tiptap-core.esm.js +0 -3002
  275. package/dist/tiptap-core.esm.js.map +0 -1
  276. package/dist/tiptap-core.umd.js +0 -3024
  277. package/dist/tiptap-core.umd.js.map +0 -1
  278. package/src/commands/insertHTML.ts +0 -30
  279. package/src/commands/insertNode.ts +0 -33
  280. package/src/commands/insertText.ts +0 -22
  281. package/src/commands/joinBackward.ts +0 -17
  282. package/src/commands/joinForward.ts +0 -17
  283. package/src/commands/replace.ts +0 -20
  284. package/src/commands/replaceRange.ts +0 -36
  285. package/src/commands/resetNodeAttributes.ts +0 -33
  286. package/src/commands/updateNodeAttributes.ts +0 -35
  287. package/src/utilities/isClass.ts +0 -7
  288. package/src/utilities/isObject.ts +0 -10
  289. package/src/utilities/removeElement.ts +0 -5
package/src/Mark.ts CHANGED
@@ -1,290 +1,541 @@
1
1
  import {
2
- DOMOutputSpec,
3
- MarkSpec,
4
- Mark as ProseMirrorMark,
5
- MarkType,
6
- } from 'prosemirror-model'
7
- import { Plugin, Transaction } from 'prosemirror-state'
8
- import { Command as ProseMirrorCommand } from 'prosemirror-commands'
9
- import { InputRule } from 'prosemirror-inputrules'
10
- import mergeDeep from './utilities/mergeDeep'
11
- import { Attributes, RawCommands, GlobalAttributes } from './types'
2
+ DOMOutputSpec, Mark as ProseMirrorMark, MarkSpec, MarkType,
3
+ } from '@tiptap/pm/model'
4
+ import { Plugin, Transaction } from '@tiptap/pm/state'
5
+
12
6
  import { MarkConfig } from '.'
13
7
  import { Editor } from './Editor'
8
+ import { getExtensionField } from './helpers/getExtensionField'
9
+ import { InputRule } from './InputRule'
10
+ import { Node } from './Node'
11
+ import { PasteRule } from './PasteRule'
12
+ import {
13
+ AnyConfig,
14
+ Attributes,
15
+ Extensions,
16
+ GlobalAttributes,
17
+ KeyboardShortcutCommand,
18
+ ParentConfig,
19
+ RawCommands,
20
+ } from './types'
21
+ import { callOrReturn } from './utilities/callOrReturn'
22
+ import { mergeDeep } from './utilities/mergeDeep'
14
23
 
15
24
  declare module '@tiptap/core' {
16
- export interface MarkConfig<Options = any> {
17
- [key: string]: any;
25
+ export interface MarkConfig<Options = any, Storage = any> {
26
+ [key: string]: any
18
27
 
19
28
  /**
20
29
  * Name
21
30
  */
22
- name: string,
31
+ name: string
23
32
 
24
33
  /**
25
34
  * Priority
26
35
  */
27
- priority?: number,
36
+ priority?: number
28
37
 
29
38
  /**
30
39
  * Default options
31
40
  */
32
- defaultOptions?: Options,
41
+ defaultOptions?: Options
42
+
43
+ /**
44
+ * Default Options
45
+ */
46
+ addOptions?: (this: {
47
+ name: string
48
+ parent: Exclude<ParentConfig<MarkConfig<Options, Storage>>['addOptions'], undefined>
49
+ }) => Options
50
+
51
+ /**
52
+ * Default Storage
53
+ */
54
+ addStorage?: (this: {
55
+ name: string
56
+ options: Options
57
+ parent: Exclude<ParentConfig<MarkConfig<Options, Storage>>['addStorage'], undefined>
58
+ }) => Storage
33
59
 
34
60
  /**
35
61
  * Global attributes
36
62
  */
37
63
  addGlobalAttributes?: (this: {
38
- options: Options,
39
- }) => GlobalAttributes | {},
64
+ name: string
65
+ options: Options
66
+ storage: Storage
67
+ parent: ParentConfig<MarkConfig<Options, Storage>>['addGlobalAttributes']
68
+ }) => GlobalAttributes | {}
40
69
 
41
70
  /**
42
71
  * Raw
43
72
  */
44
73
  addCommands?: (this: {
45
- options: Options,
46
- editor: Editor,
47
- type: MarkType,
48
- }) => Partial<RawCommands>,
74
+ name: string
75
+ options: Options
76
+ storage: Storage
77
+ editor: Editor
78
+ type: MarkType
79
+ parent: ParentConfig<MarkConfig<Options, Storage>>['addCommands']
80
+ }) => Partial<RawCommands>
49
81
 
50
82
  /**
51
83
  * Keyboard shortcuts
52
84
  */
53
85
  addKeyboardShortcuts?: (this: {
54
- options: Options,
55
- editor: Editor,
56
- type: MarkType,
86
+ name: string
87
+ options: Options
88
+ storage: Storage
89
+ editor: Editor
90
+ type: MarkType
91
+ parent: ParentConfig<MarkConfig<Options, Storage>>['addKeyboardShortcuts']
57
92
  }) => {
58
- [key: string]: ProseMirrorCommand,
59
- },
93
+ [key: string]: KeyboardShortcutCommand
94
+ }
60
95
 
61
96
  /**
62
97
  * Input rules
63
98
  */
64
99
  addInputRules?: (this: {
65
- options: Options,
66
- editor: Editor,
67
- type: MarkType,
68
- }) => InputRule[],
100
+ name: string
101
+ options: Options
102
+ storage: Storage
103
+ editor: Editor
104
+ type: MarkType
105
+ parent: ParentConfig<MarkConfig<Options, Storage>>['addInputRules']
106
+ }) => InputRule[]
69
107
 
70
108
  /**
71
109
  * Paste rules
72
110
  */
73
111
  addPasteRules?: (this: {
74
- options: Options,
75
- editor: Editor,
76
- type: MarkType,
77
- }) => Plugin[],
112
+ name: string
113
+ options: Options
114
+ storage: Storage
115
+ editor: Editor
116
+ type: MarkType
117
+ parent: ParentConfig<MarkConfig<Options, Storage>>['addPasteRules']
118
+ }) => PasteRule[]
78
119
 
79
120
  /**
80
121
  * ProseMirror plugins
81
122
  */
82
123
  addProseMirrorPlugins?: (this: {
83
- options: Options,
84
- editor: Editor,
85
- type: MarkType,
86
- }) => Plugin[],
124
+ name: string
125
+ options: Options
126
+ storage: Storage
127
+ editor: Editor
128
+ type: MarkType
129
+ parent: ParentConfig<MarkConfig<Options, Storage>>['addProseMirrorPlugins']
130
+ }) => Plugin[]
131
+
132
+ /**
133
+ * Extensions
134
+ */
135
+ addExtensions?: (this: {
136
+ name: string
137
+ options: Options
138
+ storage: Storage
139
+ parent: ParentConfig<MarkConfig<Options, Storage>>['addExtensions']
140
+ }) => Extensions
87
141
 
88
142
  /**
89
143
  * Extend Node Schema
90
144
  */
91
- extendNodeSchema?: ((
92
- this: {
93
- options: Options,
94
- },
95
- extension: Node,
96
- ) => {
97
- [key: string]: any,
98
- }) | null,
145
+ extendNodeSchema?:
146
+ | ((
147
+ this: {
148
+ name: string
149
+ options: Options
150
+ storage: Storage
151
+ parent: ParentConfig<MarkConfig<Options, Storage>>['extendNodeSchema']
152
+ },
153
+ extension: Node,
154
+ ) => Record<string, any>)
155
+ | null
99
156
 
100
157
  /**
101
158
  * Extend Mark Schema
102
159
  */
103
- extendMarkSchema?: ((
104
- this: {
105
- options: Options,
106
- },
107
- extension: Node,
108
- ) => {
109
- [key: string]: any,
110
- }) | null,
160
+ extendMarkSchema?:
161
+ | ((
162
+ this: {
163
+ name: string
164
+ options: Options
165
+ storage: Storage
166
+ parent: ParentConfig<MarkConfig<Options, Storage>>['extendMarkSchema']
167
+ },
168
+ extension: Mark,
169
+ ) => Record<string, any>)
170
+ | null
171
+
172
+ /**
173
+ * The editor is not ready yet.
174
+ */
175
+ onBeforeCreate?:
176
+ | ((this: {
177
+ name: string
178
+ options: Options
179
+ storage: Storage
180
+ editor: Editor
181
+ type: MarkType
182
+ parent: ParentConfig<MarkConfig<Options, Storage>>['onBeforeCreate']
183
+ }) => void)
184
+ | null
111
185
 
112
186
  /**
113
187
  * The editor is ready.
114
188
  */
115
- onCreate?: ((this: {
116
- options: Options,
117
- editor: Editor,
118
- type: MarkType,
119
- }) => void) | null,
189
+ onCreate?:
190
+ | ((this: {
191
+ name: string
192
+ options: Options
193
+ storage: Storage
194
+ editor: Editor
195
+ type: MarkType
196
+ parent: ParentConfig<MarkConfig<Options, Storage>>['onCreate']
197
+ }) => void)
198
+ | null
120
199
 
121
200
  /**
122
201
  * The content has changed.
123
202
  */
124
- onUpdate?: ((this: {
125
- options: Options,
126
- editor: Editor,
127
- type: MarkType,
128
- }) => void) | null,
203
+ onUpdate?:
204
+ | ((this: {
205
+ name: string
206
+ options: Options
207
+ storage: Storage
208
+ editor: Editor
209
+ type: MarkType
210
+ parent: ParentConfig<MarkConfig<Options, Storage>>['onUpdate']
211
+ }) => void)
212
+ | null
129
213
 
130
214
  /**
131
215
  * The selection has changed.
132
216
  */
133
- onSelectionUpdate?: ((this: {
134
- options: Options,
135
- editor: Editor,
136
- type: MarkType,
137
- }) => void) | null,
217
+ onSelectionUpdate?:
218
+ | ((this: {
219
+ name: string
220
+ options: Options
221
+ storage: Storage
222
+ editor: Editor
223
+ type: MarkType
224
+ parent: ParentConfig<MarkConfig<Options, Storage>>['onSelectionUpdate']
225
+ }) => void)
226
+ | null
138
227
 
139
228
  /**
140
229
  * The editor state has changed.
141
230
  */
142
- onTransaction?: ((
143
- this: {
144
- options: Options,
145
- editor: Editor,
146
- type: MarkType,
147
- },
148
- props: {
149
- transaction: Transaction,
150
- },
151
- ) => void) | null,
231
+ onTransaction?:
232
+ | ((
233
+ this: {
234
+ name: string
235
+ options: Options
236
+ storage: Storage
237
+ editor: Editor
238
+ type: MarkType
239
+ parent: ParentConfig<MarkConfig<Options, Storage>>['onTransaction']
240
+ },
241
+ props: {
242
+ transaction: Transaction
243
+ },
244
+ ) => void)
245
+ | null
152
246
 
153
247
  /**
154
248
  * The editor is focused.
155
249
  */
156
- onFocus?: ((
157
- this: {
158
- options: Options,
159
- editor: Editor,
160
- type: MarkType,
161
- },
162
- props: {
163
- event: FocusEvent,
164
- },
165
- ) => void) | null,
250
+ onFocus?:
251
+ | ((
252
+ this: {
253
+ name: string
254
+ options: Options
255
+ storage: Storage
256
+ editor: Editor
257
+ type: MarkType
258
+ parent: ParentConfig<MarkConfig<Options, Storage>>['onFocus']
259
+ },
260
+ props: {
261
+ event: FocusEvent
262
+ },
263
+ ) => void)
264
+ | null
166
265
 
167
266
  /**
168
267
  * The editor isn’t focused anymore.
169
268
  */
170
- onBlur?: ((
171
- this: {
172
- options: Options,
173
- editor: Editor,
174
- type: MarkType,
175
- },
176
- props: {
177
- event: FocusEvent,
178
- },
179
- ) => void) | null,
269
+ onBlur?:
270
+ | ((
271
+ this: {
272
+ name: string
273
+ options: Options
274
+ storage: Storage
275
+ editor: Editor
276
+ type: MarkType
277
+ parent: ParentConfig<MarkConfig<Options, Storage>>['onBlur']
278
+ },
279
+ props: {
280
+ event: FocusEvent
281
+ },
282
+ ) => void)
283
+ | null
180
284
 
181
285
  /**
182
286
  * The editor is destroyed.
183
287
  */
184
- onDestroy?: ((this: {
185
- options: Options,
186
- editor: Editor,
187
- type: MarkType,
188
- }) => void) | null,
288
+ onDestroy?:
289
+ | ((this: {
290
+ name: string
291
+ options: Options
292
+ storage: Storage
293
+ editor: Editor
294
+ type: MarkType
295
+ parent: ParentConfig<MarkConfig<Options, Storage>>['onDestroy']
296
+ }) => void)
297
+ | null
189
298
 
190
299
  /**
191
300
  * Keep mark after split node
192
301
  */
193
- keepOnSplit?: boolean | (() => boolean),
302
+ keepOnSplit?: boolean | (() => boolean)
194
303
 
195
304
  /**
196
305
  * Inclusive
197
306
  */
198
- inclusive?: MarkSpec['inclusive'] | ((this: { options: Options }) => MarkSpec['inclusive']),
307
+ inclusive?:
308
+ | MarkSpec['inclusive']
309
+ | ((this: {
310
+ name: string
311
+ options: Options
312
+ storage: Storage
313
+ parent: ParentConfig<MarkConfig<Options, Storage>>['inclusive']
314
+ }) => MarkSpec['inclusive'])
199
315
 
200
316
  /**
201
317
  * Excludes
202
318
  */
203
- excludes?: MarkSpec['excludes'] | ((this: { options: Options }) => MarkSpec['excludes']),
319
+ excludes?:
320
+ | MarkSpec['excludes']
321
+ | ((this: {
322
+ name: string
323
+ options: Options
324
+ storage: Storage
325
+ parent: ParentConfig<MarkConfig<Options, Storage>>['excludes']
326
+ }) => MarkSpec['excludes'])
327
+
328
+ /**
329
+ * Marks this Mark as exitable
330
+ */
331
+ exitable?: boolean | (() => boolean)
204
332
 
205
333
  /**
206
334
  * Group
207
335
  */
208
- group?: MarkSpec['group'] | ((this: { options: Options }) => MarkSpec['group']),
336
+ group?:
337
+ | MarkSpec['group']
338
+ | ((this: {
339
+ name: string
340
+ options: Options
341
+ storage: Storage
342
+ parent: ParentConfig<MarkConfig<Options, Storage>>['group']
343
+ }) => MarkSpec['group'])
209
344
 
210
345
  /**
211
346
  * Spanning
212
347
  */
213
- spanning?: MarkSpec['spanning'] | ((this: { options: Options }) => MarkSpec['spanning']),
348
+ spanning?:
349
+ | MarkSpec['spanning']
350
+ | ((this: {
351
+ name: string
352
+ options: Options
353
+ storage: Storage
354
+ parent: ParentConfig<MarkConfig<Options, Storage>>['spanning']
355
+ }) => MarkSpec['spanning'])
356
+
357
+ /**
358
+ * Code
359
+ */
360
+ code?:
361
+ | boolean
362
+ | ((this: {
363
+ name: string
364
+ options: Options
365
+ storage: Storage
366
+ parent: ParentConfig<MarkConfig<Options, Storage>>['code']
367
+ }) => boolean)
214
368
 
215
369
  /**
216
370
  * Parse HTML
217
371
  */
218
- parseHTML?: (
219
- this: {
220
- options: Options,
221
- },
222
- ) => MarkSpec['parseDOM'],
372
+ parseHTML?: (this: {
373
+ name: string
374
+ options: Options
375
+ storage: Storage
376
+ parent: ParentConfig<MarkConfig<Options, Storage>>['parseHTML']
377
+ }) => MarkSpec['parseDOM']
223
378
 
224
379
  /**
225
380
  * Render HTML
226
381
  */
227
- renderHTML?: ((
228
- this: {
229
- options: Options,
230
- },
231
- props: {
232
- mark: ProseMirrorMark,
233
- HTMLAttributes: { [key: string]: any },
234
- }
235
- ) => DOMOutputSpec) | null,
382
+ renderHTML?:
383
+ | ((
384
+ this: {
385
+ name: string
386
+ options: Options
387
+ storage: Storage
388
+ parent: ParentConfig<MarkConfig<Options, Storage>>['renderHTML']
389
+ },
390
+ props: {
391
+ mark: ProseMirrorMark
392
+ HTMLAttributes: Record<string, any>
393
+ },
394
+ ) => DOMOutputSpec)
395
+ | null
236
396
 
237
397
  /**
238
398
  * Attributes
239
399
  */
240
- addAttributes?: (
241
- this: {
242
- options: Options,
243
- },
244
- ) => Attributes | {},
400
+ addAttributes?: (this: {
401
+ name: string
402
+ options: Options
403
+ storage: Storage
404
+ parent: ParentConfig<MarkConfig<Options, Storage>>['addAttributes']
405
+ }) => Attributes | {}
245
406
  }
246
407
  }
247
408
 
248
- export class Mark<Options = any> {
409
+ export class Mark<Options = any, Storage = any> {
249
410
  type = 'mark'
250
411
 
412
+ name = 'mark'
413
+
414
+ parent: Mark | null = null
415
+
416
+ child: Mark | null = null
417
+
418
+ options: Options
419
+
420
+ storage: Storage
421
+
251
422
  config: MarkConfig = {
252
- name: 'mark',
253
- priority: 100,
423
+ name: this.name,
254
424
  defaultOptions: {},
255
425
  }
256
426
 
257
- options!: Options
258
-
259
- constructor(config: MarkConfig<Options>) {
427
+ constructor(config: Partial<MarkConfig<Options, Storage>> = {}) {
260
428
  this.config = {
261
429
  ...this.config,
262
430
  ...config,
263
431
  }
264
432
 
433
+ this.name = this.config.name
434
+
435
+ if (config.defaultOptions) {
436
+ console.warn(
437
+ `[tiptap warn]: BREAKING CHANGE: "defaultOptions" is deprecated. Please use "addOptions" instead. Found in extension: "${this.name}".`,
438
+ )
439
+ }
440
+
441
+ // TODO: remove `addOptions` fallback
265
442
  this.options = this.config.defaultOptions
443
+
444
+ if (this.config.addOptions) {
445
+ this.options = callOrReturn(
446
+ getExtensionField<AnyConfig['addOptions']>(this, 'addOptions', {
447
+ name: this.name,
448
+ }),
449
+ )
450
+ }
451
+
452
+ this.storage = callOrReturn(
453
+ getExtensionField<AnyConfig['addStorage']>(this, 'addStorage', {
454
+ name: this.name,
455
+ options: this.options,
456
+ }),
457
+ ) || {}
266
458
  }
267
459
 
268
- static create<O>(config: MarkConfig<O>) {
269
- return new Mark<O>(config)
460
+ static create<O = any, S = any>(config: Partial<MarkConfig<O, S>> = {}) {
461
+ return new Mark<O, S>(config)
270
462
  }
271
463
 
272
464
  configure(options: Partial<Options> = {}) {
273
- return Mark
274
- .create<Options>(this.config as MarkConfig<Options>)
275
- .#configure(options)
465
+ // return a new instance so we can use the same extension
466
+ // with different calls of `configure`
467
+ const extension = this.extend()
468
+
469
+ extension.options = mergeDeep(this.options as Record<string, any>, options) as Options
470
+
471
+ extension.storage = callOrReturn(
472
+ getExtensionField<AnyConfig['addStorage']>(extension, 'addStorage', {
473
+ name: extension.name,
474
+ options: extension.options,
475
+ }),
476
+ )
477
+
478
+ return extension
276
479
  }
277
480
 
278
- #configure = (options: Partial<Options>) => {
279
- this.options = mergeDeep(this.config.defaultOptions, options) as Options
481
+ extend<ExtendedOptions = Options, ExtendedStorage = Storage>(
482
+ extendedConfig: Partial<MarkConfig<ExtendedOptions, ExtendedStorage>> = {},
483
+ ) {
484
+ const extension = new Mark<ExtendedOptions, ExtendedStorage>(extendedConfig)
485
+
486
+ extension.parent = this
487
+
488
+ this.child = extension
489
+
490
+ extension.name = extendedConfig.name ? extendedConfig.name : extension.parent.name
491
+
492
+ if (extendedConfig.defaultOptions) {
493
+ console.warn(
494
+ `[tiptap warn]: BREAKING CHANGE: "defaultOptions" is deprecated. Please use "addOptions" instead. Found in extension: "${extension.name}".`,
495
+ )
496
+ }
280
497
 
281
- return this
498
+ extension.options = callOrReturn(
499
+ getExtensionField<AnyConfig['addOptions']>(extension, 'addOptions', {
500
+ name: extension.name,
501
+ }),
502
+ )
503
+
504
+ extension.storage = callOrReturn(
505
+ getExtensionField<AnyConfig['addStorage']>(extension, 'addStorage', {
506
+ name: extension.name,
507
+ options: extension.options,
508
+ }),
509
+ )
510
+
511
+ return extension
282
512
  }
283
513
 
284
- extend<ExtendedOptions = Options>(extendedConfig: Partial<MarkConfig<ExtendedOptions>>) {
285
- return new Mark<ExtendedOptions>({
286
- ...this.config,
287
- ...extendedConfig,
288
- } as MarkConfig<ExtendedOptions>)
514
+ static handleExit({ editor, mark }: { editor: Editor; mark: Mark }) {
515
+ const { tr } = editor.state
516
+ const currentPos = editor.state.selection.$from
517
+ const isAtEnd = currentPos.pos === currentPos.end()
518
+
519
+ if (isAtEnd) {
520
+ const currentMarks = currentPos.marks()
521
+ const isInMark = !!currentMarks.find(m => m?.type.name === mark.name)
522
+
523
+ if (!isInMark) {
524
+ return false
525
+ }
526
+
527
+ const removeMark = currentMarks.find(m => m?.type.name === mark.name)
528
+
529
+ if (removeMark) {
530
+ tr.removeStoredMark(removeMark)
531
+ }
532
+ tr.insertText(' ', currentPos.pos)
533
+
534
+ editor.view.dispatch(tr)
535
+
536
+ return true
537
+ }
538
+
539
+ return false
289
540
  }
290
541
  }