@tiptap/core 2.0.0-beta.99 → 2.0.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (297) hide show
  1. package/README.md +3 -3
  2. package/dist/index.cjs +4360 -0
  3. package/dist/index.cjs.map +1 -0
  4. package/dist/{tiptap-core.esm.js → index.js} +2349 -1447
  5. package/dist/index.js.map +1 -0
  6. package/dist/index.umd.js +4358 -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 +25 -11
  10. package/dist/packages/core/src/EventEmitter.d.ts +8 -4
  11. package/dist/packages/core/src/Extension.d.ts +63 -29
  12. package/dist/packages/core/src/ExtensionManager.d.ts +3 -4
  13. package/dist/packages/core/src/InputRule.d.ts +42 -0
  14. package/dist/packages/core/src/Mark.d.ts +94 -36
  15. package/dist/packages/core/src/Node.d.ts +104 -45
  16. package/dist/packages/core/src/NodeView.d.ts +8 -8
  17. package/dist/packages/core/src/PasteRule.d.ts +42 -0
  18. package/dist/packages/core/src/Tracker.d.ts +1 -1
  19. package/dist/packages/core/src/commands/deleteCurrentNode.d.ts +12 -0
  20. package/dist/packages/core/src/commands/deleteNode.d.ts +1 -1
  21. package/dist/packages/core/src/commands/deleteRange.d.ts +1 -1
  22. package/dist/packages/core/src/commands/extendMarkRange.d.ts +1 -1
  23. package/dist/packages/core/src/commands/focus.d.ts +4 -2
  24. package/dist/packages/core/src/commands/index.d.ts +50 -0
  25. package/dist/packages/core/src/commands/insertContent.d.ts +6 -3
  26. package/dist/packages/core/src/commands/insertContentAt.d.ts +6 -3
  27. package/dist/packages/core/src/commands/join.d.ts +33 -0
  28. package/dist/packages/core/src/commands/lift.d.ts +1 -1
  29. package/dist/packages/core/src/commands/liftListItem.d.ts +1 -1
  30. package/dist/packages/core/src/commands/resetAttributes.d.ts +1 -1
  31. package/dist/packages/core/src/commands/selectTextblockEnd.d.ts +12 -0
  32. package/dist/packages/core/src/commands/selectTextblockStart.d.ts +12 -0
  33. package/dist/packages/core/src/commands/setContent.d.ts +2 -2
  34. package/dist/packages/core/src/commands/setMark.d.ts +1 -1
  35. package/dist/packages/core/src/commands/setNode.d.ts +1 -1
  36. package/dist/packages/core/src/commands/setTextSelection.d.ts +1 -1
  37. package/dist/packages/core/src/commands/sinkListItem.d.ts +1 -1
  38. package/dist/packages/core/src/commands/splitListItem.d.ts +1 -1
  39. package/dist/packages/core/src/commands/toggleList.d.ts +2 -2
  40. package/dist/packages/core/src/commands/toggleMark.d.ts +7 -2
  41. package/dist/packages/core/src/commands/toggleNode.d.ts +1 -1
  42. package/dist/packages/core/src/commands/toggleWrap.d.ts +1 -1
  43. package/dist/packages/core/src/commands/unsetMark.d.ts +7 -2
  44. package/dist/packages/core/src/commands/updateAttributes.d.ts +1 -1
  45. package/dist/packages/core/src/commands/wrapIn.d.ts +1 -1
  46. package/dist/packages/core/src/commands/wrapInList.d.ts +1 -1
  47. package/dist/packages/core/src/extensions/clipboardTextSerializer.d.ts +1 -1
  48. package/dist/packages/core/src/extensions/commands.d.ts +2 -97
  49. package/dist/packages/core/src/extensions/editable.d.ts +1 -1
  50. package/dist/packages/core/src/extensions/focusEvents.d.ts +1 -1
  51. package/dist/packages/core/src/extensions/index.d.ts +1 -0
  52. package/dist/packages/core/src/extensions/keymap.d.ts +1 -1
  53. package/dist/packages/core/src/extensions/tabindex.d.ts +2 -0
  54. package/dist/packages/core/src/helpers/combineTransactionSteps.d.ts +7 -0
  55. package/dist/packages/core/src/helpers/createChainableState.d.ts +5 -0
  56. package/dist/packages/core/src/helpers/createDocument.d.ts +2 -2
  57. package/dist/packages/core/src/helpers/createNodeFromContent.d.ts +2 -2
  58. package/dist/packages/core/src/helpers/defaultBlockAt.d.ts +2 -0
  59. package/dist/packages/core/src/helpers/findChildren.d.ts +3 -3
  60. package/dist/packages/core/src/helpers/findChildrenInRange.d.ts +3 -3
  61. package/dist/packages/core/src/helpers/findParentNode.d.ts +3 -4
  62. package/dist/packages/core/src/helpers/findParentNodeClosestToPos.d.ts +3 -3
  63. package/dist/packages/core/src/helpers/generateHTML.d.ts +1 -1
  64. package/dist/packages/core/src/helpers/generateJSON.d.ts +1 -1
  65. package/dist/packages/core/src/helpers/generateText.d.ts +5 -0
  66. package/dist/packages/core/src/helpers/getAttributes.d.ts +3 -3
  67. package/dist/packages/core/src/helpers/getAttributesFromExtensions.d.ts +2 -2
  68. package/dist/packages/core/src/helpers/getChangedRanges.d.ts +11 -0
  69. package/dist/packages/core/src/helpers/getDebugJSON.d.ts +2 -5
  70. package/dist/packages/core/src/helpers/getExtensionField.d.ts +2 -2
  71. package/dist/packages/core/src/helpers/getHTMLFromFragment.d.ts +2 -2
  72. package/dist/packages/core/src/helpers/getMarkAttributes.d.ts +3 -3
  73. package/dist/packages/core/src/helpers/getMarkRange.d.ts +2 -2
  74. package/dist/packages/core/src/helpers/getMarkType.d.ts +2 -2
  75. package/dist/packages/core/src/helpers/getMarksBetween.d.ts +2 -2
  76. package/dist/packages/core/src/helpers/getNodeAttributes.d.ts +3 -3
  77. package/dist/packages/core/src/helpers/getNodeType.d.ts +2 -2
  78. package/dist/packages/core/src/helpers/getRenderedAttributes.d.ts +2 -2
  79. package/dist/packages/core/src/helpers/getSchema.d.ts +2 -2
  80. package/dist/packages/core/src/helpers/getSchemaByResolvedExtensions.d.ts +2 -2
  81. package/dist/packages/core/src/helpers/getSchemaTypeByName.d.ts +2 -2
  82. package/dist/packages/core/src/helpers/getSchemaTypeNameByName.d.ts +2 -2
  83. package/dist/packages/core/src/helpers/getSplittedAttributes.d.ts +1 -1
  84. package/dist/packages/core/src/helpers/getText.d.ts +6 -0
  85. package/dist/packages/core/src/helpers/getTextBetween.d.ts +6 -0
  86. package/dist/packages/core/src/helpers/getTextContentFromNodes.d.ts +2 -0
  87. package/dist/packages/core/src/helpers/getTextSerializersFromSchema.d.ts +3 -0
  88. package/dist/packages/core/src/helpers/index.d.ts +47 -0
  89. package/dist/packages/core/src/helpers/injectExtensionAttributesToParseRule.d.ts +2 -2
  90. package/dist/packages/core/src/helpers/isActive.d.ts +2 -2
  91. package/dist/packages/core/src/helpers/isExtensionRulesEnabled.d.ts +2 -0
  92. package/dist/packages/core/src/helpers/isList.d.ts +1 -1
  93. package/dist/packages/core/src/helpers/isMarkActive.d.ts +3 -3
  94. package/dist/packages/core/src/helpers/isNodeActive.d.ts +3 -3
  95. package/dist/packages/core/src/helpers/isNodeEmpty.d.ts +2 -2
  96. package/dist/packages/core/src/helpers/isNodeSelection.d.ts +2 -2
  97. package/dist/packages/core/src/helpers/isTextSelection.d.ts +2 -2
  98. package/dist/packages/core/src/helpers/posToDOMRect.d.ts +2 -2
  99. package/dist/packages/core/src/helpers/resolveFocusPosition.d.ts +4 -0
  100. package/dist/packages/core/src/helpers/selectionToInsertionEnd.d.ts +2 -2
  101. package/dist/packages/core/src/helpers/splitExtensions.d.ts +6 -6
  102. package/dist/packages/core/src/index.d.ts +12 -34
  103. package/dist/packages/core/src/inputRules/index.d.ts +5 -0
  104. package/dist/packages/core/src/inputRules/markInputRule.d.ts +12 -3
  105. package/dist/packages/core/src/inputRules/nodeInputRule.d.ts +12 -3
  106. package/dist/packages/core/src/inputRules/textInputRule.d.ts +9 -0
  107. package/dist/packages/core/src/inputRules/textblockTypeInputRule.d.ts +14 -0
  108. package/dist/packages/core/src/inputRules/wrappingInputRule.d.ts +27 -0
  109. package/dist/packages/core/src/pasteRules/index.d.ts +3 -0
  110. package/dist/packages/core/src/pasteRules/markPasteRule.d.ts +12 -3
  111. package/dist/packages/core/src/pasteRules/nodePasteRule.d.ts +12 -0
  112. package/dist/packages/core/src/pasteRules/textPasteRule.d.ts +9 -0
  113. package/dist/packages/core/src/style.d.ts +1 -2
  114. package/dist/packages/core/src/types.d.ts +70 -40
  115. package/dist/packages/core/src/utilities/callOrReturn.d.ts +1 -1
  116. package/dist/packages/core/src/utilities/createStyleTag.d.ts +1 -1
  117. package/dist/packages/core/src/utilities/deleteProps.d.ts +1 -1
  118. package/dist/packages/core/src/utilities/elementFromString.d.ts +1 -1
  119. package/dist/packages/core/src/utilities/escapeForRegEx.d.ts +1 -0
  120. package/dist/packages/core/src/utilities/findDuplicates.d.ts +1 -0
  121. package/dist/packages/core/src/utilities/fromString.d.ts +1 -1
  122. package/dist/packages/core/src/utilities/index.d.ts +20 -0
  123. package/dist/packages/core/src/utilities/isEmptyObject.d.ts +1 -1
  124. package/dist/packages/core/src/utilities/isFunction.d.ts +1 -0
  125. package/dist/packages/core/src/utilities/isMacOS.d.ts +1 -0
  126. package/dist/packages/core/src/utilities/isNumber.d.ts +1 -0
  127. package/dist/packages/core/src/utilities/isPlainObject.d.ts +1 -1
  128. package/dist/packages/core/src/utilities/isRegExp.d.ts +1 -0
  129. package/dist/packages/core/src/utilities/isString.d.ts +1 -0
  130. package/dist/packages/core/src/utilities/isiOS.d.ts +1 -1
  131. package/dist/packages/core/src/utilities/mergeAttributes.d.ts +1 -1
  132. package/dist/packages/core/src/utilities/mergeDeep.d.ts +1 -1
  133. package/dist/packages/core/src/utilities/minMax.d.ts +1 -1
  134. package/dist/packages/core/src/utilities/objectIncludes.d.ts +3 -1
  135. package/dist/packages/core/src/utilities/removeDuplicates.d.ts +8 -0
  136. package/package.json +25 -24
  137. package/src/CommandManager.ts +73 -83
  138. package/src/Editor.ts +101 -53
  139. package/src/EventEmitter.ts +14 -4
  140. package/src/Extension.ts +244 -138
  141. package/src/ExtensionManager.ts +153 -152
  142. package/src/InputRule.ts +260 -0
  143. package/src/Mark.ts +365 -204
  144. package/src/Node.ts +406 -253
  145. package/src/NodeView.ts +59 -38
  146. package/src/PasteRule.ts +240 -0
  147. package/src/Tracker.ts +4 -8
  148. package/src/commands/blur.ts +4 -0
  149. package/src/commands/clearNodes.ts +15 -9
  150. package/src/commands/createParagraphNear.ts +3 -2
  151. package/src/commands/deleteCurrentNode.ts +41 -0
  152. package/src/commands/deleteNode.ts +3 -2
  153. package/src/commands/deleteRange.ts +1 -1
  154. package/src/commands/deleteSelection.ts +3 -2
  155. package/src/commands/exitCode.ts +3 -2
  156. package/src/commands/extendMarkRange.ts +9 -5
  157. package/src/commands/focus.ts +31 -42
  158. package/src/commands/index.ts +50 -0
  159. package/src/commands/insertContent.ts +15 -4
  160. package/src/commands/insertContentAt.ts +71 -14
  161. package/src/commands/join.ts +53 -0
  162. package/src/commands/keyboardShortcut.ts +3 -3
  163. package/src/commands/lift.ts +6 -5
  164. package/src/commands/liftEmptyBlock.ts +2 -1
  165. package/src/commands/liftListItem.ts +5 -4
  166. package/src/commands/newlineInCode.ts +3 -2
  167. package/src/commands/resetAttributes.ts +16 -10
  168. package/src/commands/selectAll.ts +5 -3
  169. package/src/commands/selectNodeBackward.ts +3 -2
  170. package/src/commands/selectNodeForward.ts +3 -2
  171. package/src/commands/selectParentNode.ts +3 -2
  172. package/src/commands/selectTextblockEnd.ts +20 -0
  173. package/src/commands/selectTextblockStart.ts +20 -0
  174. package/src/commands/setContent.ts +6 -9
  175. package/src/commands/setMark.ts +66 -13
  176. package/src/commands/setNode.ts +30 -6
  177. package/src/commands/setNodeSelection.ts +6 -7
  178. package/src/commands/setTextSelection.ts +8 -9
  179. package/src/commands/sinkListItem.ts +5 -4
  180. package/src/commands/splitBlock.ts +23 -38
  181. package/src/commands/splitListItem.ts +30 -27
  182. package/src/commands/toggleList.ts +108 -19
  183. package/src/commands/toggleMark.ts +17 -6
  184. package/src/commands/toggleNode.ts +9 -4
  185. package/src/commands/toggleWrap.ts +8 -8
  186. package/src/commands/undoInputRule.ts +31 -2
  187. package/src/commands/unsetAllMarks.ts +4 -8
  188. package/src/commands/unsetMark.ts +34 -21
  189. package/src/commands/updateAttributes.ts +18 -12
  190. package/src/commands/wrapIn.ts +5 -10
  191. package/src/commands/wrapInList.ts +5 -4
  192. package/src/extensions/clipboardTextSerializer.ts +15 -36
  193. package/src/extensions/commands.ts +3 -144
  194. package/src/extensions/editable.ts +2 -1
  195. package/src/extensions/focusEvents.ts +4 -6
  196. package/src/extensions/index.ts +1 -0
  197. package/src/extensions/keymap.ts +111 -13
  198. package/src/extensions/tabindex.ts +18 -0
  199. package/src/helpers/combineTransactionSteps.ts +21 -0
  200. package/src/helpers/createChainableState.ts +38 -0
  201. package/src/helpers/createDocument.ts +4 -3
  202. package/src/helpers/createNodeFromContent.ts +10 -15
  203. package/src/helpers/defaultBlockAt.ts +13 -0
  204. package/src/helpers/findChildren.ts +4 -3
  205. package/src/helpers/findChildrenInRange.ts +8 -3
  206. package/src/helpers/findParentNode.ts +4 -3
  207. package/src/helpers/findParentNodeClosestToPos.ts +13 -7
  208. package/src/helpers/generateHTML.ts +6 -5
  209. package/src/helpers/generateJSON.ts +6 -7
  210. package/src/helpers/generateText.ts +27 -0
  211. package/src/helpers/getAttributes.ts +8 -9
  212. package/src/helpers/getAttributesFromExtensions.ts +25 -12
  213. package/src/helpers/getChangedRanges.ts +83 -0
  214. package/src/helpers/getDebugJSON.ts +42 -38
  215. package/src/helpers/getExtensionField.ts +3 -3
  216. package/src/helpers/getHTMLFromFragment.ts +5 -6
  217. package/src/helpers/getMarkAttributes.ts +18 -10
  218. package/src/helpers/getMarkRange.ts +13 -8
  219. package/src/helpers/getMarkType.ts +5 -3
  220. package/src/helpers/getMarksBetween.ts +34 -10
  221. package/src/helpers/getNodeAttributes.ts +14 -12
  222. package/src/helpers/getNodeType.ts +5 -3
  223. package/src/helpers/getRenderedAttributes.ts +8 -6
  224. package/src/helpers/getSchema.ts +5 -4
  225. package/src/helpers/getSchemaByResolvedExtensions.ts +165 -111
  226. package/src/helpers/getSchemaTypeByName.ts +3 -11
  227. package/src/helpers/getSchemaTypeNameByName.ts +2 -2
  228. package/src/helpers/getSplittedAttributes.ts +1 -1
  229. package/src/helpers/getText.ts +19 -0
  230. package/src/helpers/getTextBetween.ts +46 -0
  231. package/src/helpers/getTextContentFromNodes.ts +26 -0
  232. package/src/helpers/getTextSerializersFromSchema.ts +11 -0
  233. package/src/helpers/index.ts +47 -0
  234. package/src/helpers/injectExtensionAttributesToParseRule.ts +22 -23
  235. package/src/helpers/isActive.ts +10 -5
  236. package/src/helpers/isExtensionRulesEnabled.ts +15 -0
  237. package/src/helpers/isList.ts +6 -5
  238. package/src/helpers/isMarkActive.ts +32 -35
  239. package/src/helpers/isNodeActive.ts +27 -37
  240. package/src/helpers/isNodeEmpty.ts +2 -2
  241. package/src/helpers/isNodeSelection.ts +3 -4
  242. package/src/helpers/isTextSelection.ts +3 -4
  243. package/src/helpers/posToDOMRect.ts +10 -4
  244. package/src/helpers/resolveFocusPosition.ts +42 -0
  245. package/src/helpers/selectionToInsertionEnd.ts +3 -3
  246. package/src/helpers/splitExtensions.ts +3 -3
  247. package/src/index.ts +12 -37
  248. package/src/inputRules/index.ts +5 -0
  249. package/src/inputRules/markInputRule.ts +59 -40
  250. package/src/inputRules/nodeInputRule.ts +45 -12
  251. package/src/inputRules/textInputRule.ts +35 -0
  252. package/src/inputRules/textblockTypeInputRule.ts +37 -0
  253. package/src/inputRules/wrappingInputRule.ts +84 -0
  254. package/src/pasteRules/index.ts +3 -0
  255. package/src/pasteRules/markPasteRule.ts +49 -56
  256. package/src/pasteRules/nodePasteRule.ts +37 -0
  257. package/src/pasteRules/textPasteRule.ts +35 -0
  258. package/src/style.ts +12 -3
  259. package/src/types.ts +140 -106
  260. package/src/utilities/callOrReturn.ts +3 -2
  261. package/src/utilities/createStyleTag.ts +8 -4
  262. package/src/utilities/deleteProps.ts +1 -1
  263. package/src/utilities/elementFromString.ts +1 -1
  264. package/src/utilities/escapeForRegEx.ts +4 -0
  265. package/src/utilities/findDuplicates.ts +5 -0
  266. package/src/utilities/fromString.ts +2 -2
  267. package/src/utilities/index.ts +20 -0
  268. package/src/utilities/isEmptyObject.ts +2 -2
  269. package/src/utilities/isFunction.ts +3 -0
  270. package/src/utilities/isMacOS.ts +5 -0
  271. package/src/utilities/isNumber.ts +3 -0
  272. package/src/utilities/isPlainObject.ts +8 -5
  273. package/src/utilities/isRegExp.ts +3 -0
  274. package/src/utilities/isString.ts +3 -0
  275. package/src/utilities/isiOS.ts +1 -1
  276. package/src/utilities/mergeAttributes.ts +2 -1
  277. package/src/utilities/mergeDeep.ts +2 -2
  278. package/src/utilities/minMax.ts +1 -1
  279. package/src/utilities/objectIncludes.ts +18 -4
  280. package/src/utilities/removeDuplicates.ts +15 -0
  281. package/CHANGELOG.md +0 -1190
  282. package/LICENSE.md +0 -21
  283. package/dist/packages/core/src/commands/joinBackward.d.ts +0 -12
  284. package/dist/packages/core/src/commands/joinForward.d.ts +0 -12
  285. package/dist/packages/core/src/utilities/isClass.d.ts +0 -1
  286. package/dist/packages/core/src/utilities/isObject.d.ts +0 -1
  287. package/dist/packages/core/src/utilities/removeElement.d.ts +0 -1
  288. package/dist/tiptap-core.cjs.js +0 -3408
  289. package/dist/tiptap-core.cjs.js.map +0 -1
  290. package/dist/tiptap-core.esm.js.map +0 -1
  291. package/dist/tiptap-core.umd.js +0 -3405
  292. package/dist/tiptap-core.umd.js.map +0 -1
  293. package/src/commands/joinBackward.ts +0 -17
  294. package/src/commands/joinForward.ts +0 -17
  295. package/src/utilities/isClass.ts +0 -7
  296. package/src/utilities/isObject.ts +0 -10
  297. package/src/utilities/removeElement.ts +0 -5
package/src/Mark.ts CHANGED
@@ -1,326 +1,412 @@
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 { InputRule } from 'prosemirror-inputrules'
9
- import mergeDeep from './utilities/mergeDeep'
2
+ DOMOutputSpec, Mark as ProseMirrorMark, MarkSpec, MarkType,
3
+ } from '@tiptap/pm/model'
4
+ import { Plugin, Transaction } from '@tiptap/pm/state'
5
+
6
+ import { MarkConfig } from '.'
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'
10
12
  import {
11
- Extensions,
13
+ AnyConfig,
12
14
  Attributes,
13
- RawCommands,
15
+ Extensions,
14
16
  GlobalAttributes,
15
- ParentConfig,
16
17
  KeyboardShortcutCommand,
18
+ ParentConfig,
19
+ RawCommands,
17
20
  } from './types'
18
- import { Node } from './Node'
19
- import { MarkConfig } from '.'
20
- import { Editor } from './Editor'
21
+ import { callOrReturn } from './utilities/callOrReturn'
22
+ import { mergeDeep } from './utilities/mergeDeep'
21
23
 
22
24
  declare module '@tiptap/core' {
23
- export interface MarkConfig<Options = any> {
24
- [key: string]: any;
25
+ export interface MarkConfig<Options = any, Storage = any> {
26
+ [key: string]: any
25
27
 
26
28
  /**
27
29
  * Name
28
30
  */
29
- name: string,
31
+ name: string
30
32
 
31
33
  /**
32
34
  * Priority
33
35
  */
34
- priority?: number,
36
+ priority?: number
35
37
 
36
38
  /**
37
39
  * Default options
38
40
  */
39
- 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
40
59
 
41
60
  /**
42
61
  * Global attributes
43
62
  */
44
63
  addGlobalAttributes?: (this: {
45
- name: string,
46
- options: Options,
47
- parent: ParentConfig<MarkConfig<Options>>['addGlobalAttributes'],
48
- }) => GlobalAttributes | {},
64
+ name: string
65
+ options: Options
66
+ storage: Storage
67
+ parent: ParentConfig<MarkConfig<Options, Storage>>['addGlobalAttributes']
68
+ }) => GlobalAttributes | {}
49
69
 
50
70
  /**
51
71
  * Raw
52
72
  */
53
73
  addCommands?: (this: {
54
- name: string,
55
- options: Options,
56
- editor: Editor,
57
- type: MarkType,
58
- parent: ParentConfig<MarkConfig<Options>>['addCommands'],
59
- }) => 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>
60
81
 
61
82
  /**
62
83
  * Keyboard shortcuts
63
84
  */
64
85
  addKeyboardShortcuts?: (this: {
65
- name: string,
66
- options: Options,
67
- editor: Editor,
68
- type: MarkType,
69
- parent: ParentConfig<MarkConfig<Options>>['addKeyboardShortcuts'],
86
+ name: string
87
+ options: Options
88
+ storage: Storage
89
+ editor: Editor
90
+ type: MarkType
91
+ parent: ParentConfig<MarkConfig<Options, Storage>>['addKeyboardShortcuts']
70
92
  }) => {
71
- [key: string]: KeyboardShortcutCommand,
72
- },
93
+ [key: string]: KeyboardShortcutCommand
94
+ }
73
95
 
74
96
  /**
75
97
  * Input rules
76
98
  */
77
99
  addInputRules?: (this: {
78
- name: string,
79
- options: Options,
80
- editor: Editor,
81
- type: MarkType,
82
- parent: ParentConfig<MarkConfig<Options>>['addInputRules'],
83
- }) => 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[]
84
107
 
85
108
  /**
86
109
  * Paste rules
87
110
  */
88
111
  addPasteRules?: (this: {
89
- name: string,
90
- options: Options,
91
- editor: Editor,
92
- type: MarkType,
93
- parent: ParentConfig<MarkConfig<Options>>['addPasteRules'],
94
- }) => 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[]
95
119
 
96
120
  /**
97
121
  * ProseMirror plugins
98
122
  */
99
123
  addProseMirrorPlugins?: (this: {
100
- name: string,
101
- options: Options,
102
- editor: Editor,
103
- type: MarkType,
104
- parent: ParentConfig<MarkConfig<Options>>['addProseMirrorPlugins'],
105
- }) => 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[]
106
131
 
107
132
  /**
108
133
  * Extensions
109
134
  */
110
135
  addExtensions?: (this: {
111
- name: string,
112
- options: Options,
113
- parent: ParentConfig<MarkConfig<Options>>['addExtensions'],
114
- }) => Extensions,
136
+ name: string
137
+ options: Options
138
+ storage: Storage
139
+ parent: ParentConfig<MarkConfig<Options, Storage>>['addExtensions']
140
+ }) => Extensions
115
141
 
116
142
  /**
117
143
  * Extend Node Schema
118
144
  */
119
- extendNodeSchema?: ((
120
- this: {
121
- name: string,
122
- options: Options,
123
- parent: ParentConfig<MarkConfig<Options>>['extendNodeSchema'],
124
- },
125
- extension: Node,
126
- ) => Record<string, any>) | 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
127
156
 
128
157
  /**
129
158
  * Extend Mark Schema
130
159
  */
131
- extendMarkSchema?: ((
132
- this: {
133
- name: string,
134
- options: Options,
135
- parent: ParentConfig<MarkConfig<Options>>['extendMarkSchema'],
136
- },
137
- extension: Mark,
138
- ) => Record<string, any>) | 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
139
171
 
140
172
  /**
141
173
  * The editor is not ready yet.
142
174
  */
143
- onBeforeCreate?: ((this: {
144
- name: string,
145
- options: Options,
146
- editor: Editor,
147
- type: MarkType,
148
- parent: ParentConfig<MarkConfig<Options>>['onBeforeCreate'],
149
- }) => void) | null,
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
150
185
 
151
186
  /**
152
187
  * The editor is ready.
153
188
  */
154
- onCreate?: ((this: {
155
- name: string,
156
- options: Options,
157
- editor: Editor,
158
- type: MarkType,
159
- parent: ParentConfig<MarkConfig<Options>>['onCreate'],
160
- }) => 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
161
199
 
162
200
  /**
163
201
  * The content has changed.
164
202
  */
165
- onUpdate?: ((this: {
166
- name: string,
167
- options: Options,
168
- editor: Editor,
169
- type: MarkType,
170
- parent: ParentConfig<MarkConfig<Options>>['onUpdate'],
171
- }) => 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
172
213
 
173
214
  /**
174
215
  * The selection has changed.
175
216
  */
176
- onSelectionUpdate?: ((this: {
177
- name: string,
178
- options: Options,
179
- editor: Editor,
180
- type: MarkType,
181
- parent: ParentConfig<MarkConfig<Options>>['onSelectionUpdate'],
182
- }) => 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
183
227
 
184
228
  /**
185
229
  * The editor state has changed.
186
230
  */
187
- onTransaction?: ((
188
- this: {
189
- name: string,
190
- options: Options,
191
- editor: Editor,
192
- type: MarkType,
193
- parent: ParentConfig<MarkConfig<Options>>['onTransaction'],
194
- },
195
- props: {
196
- transaction: Transaction,
197
- },
198
- ) => 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
199
246
 
200
247
  /**
201
248
  * The editor is focused.
202
249
  */
203
- onFocus?: ((
204
- this: {
205
- name: string,
206
- options: Options,
207
- editor: Editor,
208
- type: MarkType,
209
- parent: ParentConfig<MarkConfig<Options>>['onFocus'],
210
- },
211
- props: {
212
- event: FocusEvent,
213
- },
214
- ) => 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
215
265
 
216
266
  /**
217
267
  * The editor isn’t focused anymore.
218
268
  */
219
- onBlur?: ((
220
- this: {
221
- name: string,
222
- options: Options,
223
- editor: Editor,
224
- type: MarkType,
225
- parent: ParentConfig<MarkConfig<Options>>['onBlur'],
226
- },
227
- props: {
228
- event: FocusEvent,
229
- },
230
- ) => 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
231
284
 
232
285
  /**
233
286
  * The editor is destroyed.
234
287
  */
235
- onDestroy?: ((this: {
236
- name: string,
237
- options: Options,
238
- editor: Editor,
239
- type: MarkType,
240
- parent: ParentConfig<MarkConfig<Options>>['onDestroy'],
241
- }) => 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
242
298
 
243
299
  /**
244
300
  * Keep mark after split node
245
301
  */
246
- keepOnSplit?: boolean | (() => boolean),
302
+ keepOnSplit?: boolean | (() => boolean)
247
303
 
248
304
  /**
249
305
  * Inclusive
250
306
  */
251
- inclusive?: MarkSpec['inclusive'] | ((this: {
252
- name: string,
253
- options: Options,
254
- parent: ParentConfig<MarkConfig<Options>>['inclusive'],
255
- }) => 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'])
256
315
 
257
316
  /**
258
317
  * Excludes
259
318
  */
260
- excludes?: MarkSpec['excludes'] | ((this: {
261
- name: string,
262
- options: Options,
263
- parent: ParentConfig<MarkConfig<Options>>['excludes'],
264
- }) => 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)
265
332
 
266
333
  /**
267
334
  * Group
268
335
  */
269
- group?: MarkSpec['group'] | ((this: {
270
- name: string,
271
- options: Options,
272
- parent: ParentConfig<MarkConfig<Options>>['group'],
273
- }) => 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'])
274
344
 
275
345
  /**
276
346
  * Spanning
277
347
  */
278
- spanning?: MarkSpec['spanning'] | ((this: {
279
- name: string,
280
- options: Options,
281
- parent: ParentConfig<MarkConfig<Options>>['spanning'],
282
- }) => 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)
283
368
 
284
369
  /**
285
370
  * Parse HTML
286
371
  */
287
- parseHTML?: (
288
- this: {
289
- name: string,
290
- options: Options,
291
- parent: ParentConfig<MarkConfig<Options>>['parseHTML'],
292
- },
293
- ) => MarkSpec['parseDOM'],
372
+ parseHTML?: (this: {
373
+ name: string
374
+ options: Options
375
+ storage: Storage
376
+ parent: ParentConfig<MarkConfig<Options, Storage>>['parseHTML']
377
+ }) => MarkSpec['parseDOM']
294
378
 
295
379
  /**
296
380
  * Render HTML
297
381
  */
298
- renderHTML?: ((
299
- this: {
300
- name: string,
301
- options: Options,
302
- parent: ParentConfig<MarkConfig<Options>>['renderHTML'],
303
- },
304
- props: {
305
- mark: ProseMirrorMark,
306
- HTMLAttributes: Record<string, any>,
307
- },
308
- ) => 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
309
396
 
310
397
  /**
311
398
  * Attributes
312
399
  */
313
- addAttributes?: (
314
- this: {
315
- name: string,
316
- options: Options,
317
- parent: ParentConfig<MarkConfig<Options>>['addAttributes'],
318
- },
319
- ) => Attributes | {},
400
+ addAttributes?: (this: {
401
+ name: string
402
+ options: Options
403
+ storage: Storage
404
+ parent: ParentConfig<MarkConfig<Options, Storage>>['addAttributes']
405
+ }) => Attributes | {}
320
406
  }
321
407
  }
322
408
 
323
- export class Mark<Options = any> {
409
+ export class Mark<Options = any, Storage = any> {
324
410
  type = 'mark'
325
411
 
326
412
  name = 'mark'
@@ -331,23 +417,48 @@ export class Mark<Options = any> {
331
417
 
332
418
  options: Options
333
419
 
420
+ storage: Storage
421
+
334
422
  config: MarkConfig = {
335
423
  name: this.name,
336
424
  defaultOptions: {},
337
425
  }
338
426
 
339
- constructor(config: Partial<MarkConfig<Options>> = {}) {
427
+ constructor(config: Partial<MarkConfig<Options, Storage>> = {}) {
340
428
  this.config = {
341
429
  ...this.config,
342
430
  ...config,
343
431
  }
344
432
 
345
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
346
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
+ ) || {}
347
458
  }
348
459
 
349
- static create<O>(config: Partial<MarkConfig<O>> = {}) {
350
- return new Mark<O>(config)
460
+ static create<O = any, S = any>(config: Partial<MarkConfig<O, S>> = {}) {
461
+ return new Mark<O, S>(config)
351
462
  }
352
463
 
353
464
  configure(options: Partial<Options> = {}) {
@@ -355,26 +466,76 @@ export class Mark<Options = any> {
355
466
  // with different calls of `configure`
356
467
  const extension = this.extend()
357
468
 
358
- extension.options = mergeDeep(this.options, options) as Options
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
+ )
359
477
 
360
478
  return extension
361
479
  }
362
480
 
363
- extend<ExtendedOptions = Options>(extendedConfig: Partial<MarkConfig<ExtendedOptions>> = {}) {
364
- const extension = new Mark<ExtendedOptions>(extendedConfig)
481
+ extend<ExtendedOptions = Options, ExtendedStorage = Storage>(
482
+ extendedConfig: Partial<MarkConfig<ExtendedOptions, ExtendedStorage>> = {},
483
+ ) {
484
+ const extension = new Mark<ExtendedOptions, ExtendedStorage>(extendedConfig)
365
485
 
366
486
  extension.parent = this
367
487
 
368
488
  this.child = extension
369
489
 
370
- extension.name = extendedConfig.name
371
- ? extendedConfig.name
372
- : extension.parent.name
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
+ }
373
497
 
374
- extension.options = extendedConfig.defaultOptions
375
- ? extendedConfig.defaultOptions
376
- : extension.parent.options
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
+ )
377
510
 
378
511
  return extension
379
512
  }
513
+
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
540
+ }
380
541
  }