@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/Extension.ts CHANGED
@@ -1,217 +1,389 @@
1
- import { Plugin, Transaction } from 'prosemirror-state'
2
- import { Command as ProseMirrorCommand } from 'prosemirror-commands'
3
- import { InputRule } from 'prosemirror-inputrules'
1
+ import { Plugin, Transaction } from '@tiptap/pm/state'
2
+
3
+ import { ExtensionConfig } from '.'
4
4
  import { Editor } from './Editor'
5
+ import { getExtensionField } from './helpers/getExtensionField'
6
+ import { InputRule } from './InputRule'
7
+ import { Mark } from './Mark'
5
8
  import { Node } from './Node'
6
- import mergeDeep from './utilities/mergeDeep'
7
- import { GlobalAttributes, RawCommands } from './types'
8
- import { ExtensionConfig } from '.'
9
+ import { PasteRule } from './PasteRule'
10
+ import {
11
+ AnyConfig,
12
+ Extensions,
13
+ GlobalAttributes,
14
+ KeyboardShortcutCommand,
15
+ ParentConfig,
16
+ RawCommands,
17
+ } from './types'
18
+ import { callOrReturn } from './utilities/callOrReturn'
19
+ import { mergeDeep } from './utilities/mergeDeep'
9
20
 
10
21
  declare module '@tiptap/core' {
11
- interface ExtensionConfig<Options = any> {
12
- [key: string]: any;
22
+ interface ExtensionConfig<Options = any, Storage = any> {
23
+ [key: string]: any
13
24
 
14
25
  /**
15
26
  * Name
16
27
  */
17
- name: string,
28
+ name: string
18
29
 
19
30
  /**
20
31
  * Priority
21
32
  */
22
- priority?: number,
33
+ priority?: number
23
34
 
24
35
  /**
25
36
  * Default options
26
37
  */
27
- defaultOptions?: Options,
38
+ defaultOptions?: Options
39
+
40
+ /**
41
+ * Default Options
42
+ */
43
+ addOptions?: (this: {
44
+ name: string
45
+ parent: Exclude<ParentConfig<ExtensionConfig<Options, Storage>>['addOptions'], undefined>
46
+ }) => Options
47
+
48
+ /**
49
+ * Default Storage
50
+ */
51
+ addStorage?: (this: {
52
+ name: string
53
+ options: Options
54
+ parent: Exclude<ParentConfig<ExtensionConfig<Options, Storage>>['addStorage'], undefined>
55
+ }) => Storage
28
56
 
29
57
  /**
30
58
  * Global attributes
31
59
  */
32
60
  addGlobalAttributes?: (this: {
33
- options: Options,
34
- }) => GlobalAttributes | {},
61
+ name: string
62
+ options: Options
63
+ storage: Storage
64
+ parent: ParentConfig<ExtensionConfig<Options, Storage>>['addGlobalAttributes']
65
+ }) => GlobalAttributes | {}
35
66
 
36
67
  /**
37
68
  * Raw
38
69
  */
39
70
  addCommands?: (this: {
40
- options: Options,
41
- editor: Editor,
42
- }) => Partial<RawCommands>,
71
+ name: string
72
+ options: Options
73
+ storage: Storage
74
+ editor: Editor
75
+ parent: ParentConfig<ExtensionConfig<Options, Storage>>['addCommands']
76
+ }) => Partial<RawCommands>
43
77
 
44
78
  /**
45
79
  * Keyboard shortcuts
46
80
  */
47
81
  addKeyboardShortcuts?: (this: {
48
- options: Options,
49
- editor: Editor,
82
+ name: string
83
+ options: Options
84
+ storage: Storage
85
+ editor: Editor
86
+ parent: ParentConfig<ExtensionConfig<Options, Storage>>['addKeyboardShortcuts']
50
87
  }) => {
51
- [key: string]: ProseMirrorCommand,
52
- },
88
+ [key: string]: KeyboardShortcutCommand
89
+ }
53
90
 
54
91
  /**
55
92
  * Input rules
56
93
  */
57
94
  addInputRules?: (this: {
58
- options: Options,
59
- editor: Editor,
60
- }) => InputRule[],
95
+ name: string
96
+ options: Options
97
+ storage: Storage
98
+ editor: Editor
99
+ parent: ParentConfig<ExtensionConfig<Options, Storage>>['addInputRules']
100
+ }) => InputRule[]
61
101
 
62
102
  /**
63
103
  * Paste rules
64
104
  */
65
105
  addPasteRules?: (this: {
66
- options: Options,
67
- editor: Editor,
68
- }) => Plugin[],
106
+ name: string
107
+ options: Options
108
+ storage: Storage
109
+ editor: Editor
110
+ parent: ParentConfig<ExtensionConfig<Options, Storage>>['addPasteRules']
111
+ }) => PasteRule[]
69
112
 
70
113
  /**
71
114
  * ProseMirror plugins
72
115
  */
73
116
  addProseMirrorPlugins?: (this: {
74
- options: Options,
75
- editor: Editor,
76
- }) => Plugin[],
117
+ name: string
118
+ options: Options
119
+ storage: Storage
120
+ editor: Editor
121
+ parent: ParentConfig<ExtensionConfig<Options, Storage>>['addProseMirrorPlugins']
122
+ }) => Plugin[]
123
+
124
+ /**
125
+ * Extensions
126
+ */
127
+ addExtensions?: (this: {
128
+ name: string
129
+ options: Options
130
+ storage: Storage
131
+ parent: ParentConfig<ExtensionConfig<Options, Storage>>['addExtensions']
132
+ }) => Extensions
77
133
 
78
134
  /**
79
135
  * Extend Node Schema
80
136
  */
81
- extendNodeSchema?: ((
82
- this: {
83
- options: Options,
84
- },
85
- extension: Node,
86
- ) => {
87
- [key: string]: any,
88
- }) | null,
137
+ extendNodeSchema?:
138
+ | ((
139
+ this: {
140
+ name: string
141
+ options: Options
142
+ storage: Storage
143
+ parent: ParentConfig<ExtensionConfig<Options, Storage>>['extendNodeSchema']
144
+ },
145
+ extension: Node,
146
+ ) => Record<string, any>)
147
+ | null
89
148
 
90
149
  /**
91
150
  * Extend Mark Schema
92
151
  */
93
- extendMarkSchema?: ((
94
- this: {
95
- options: Options,
96
- },
97
- extension: Node,
98
- ) => {
99
- [key: string]: any,
100
- }) | null,
152
+ extendMarkSchema?:
153
+ | ((
154
+ this: {
155
+ name: string
156
+ options: Options
157
+ storage: Storage
158
+ parent: ParentConfig<ExtensionConfig<Options, Storage>>['extendMarkSchema']
159
+ },
160
+ extension: Mark,
161
+ ) => Record<string, any>)
162
+ | null
163
+
164
+ /**
165
+ * The editor is not ready yet.
166
+ */
167
+ onBeforeCreate?:
168
+ | ((this: {
169
+ name: string
170
+ options: Options
171
+ storage: Storage
172
+ editor: Editor
173
+ parent: ParentConfig<ExtensionConfig<Options, Storage>>['onBeforeCreate']
174
+ }) => void)
175
+ | null
101
176
 
102
177
  /**
103
178
  * The editor is ready.
104
179
  */
105
- onCreate?: ((this: {
106
- options: Options,
107
- editor: Editor,
108
- }) => void) | null,
180
+ onCreate?:
181
+ | ((this: {
182
+ name: string
183
+ options: Options
184
+ storage: Storage
185
+ editor: Editor
186
+ parent: ParentConfig<ExtensionConfig<Options, Storage>>['onCreate']
187
+ }) => void)
188
+ | null
109
189
 
110
190
  /**
111
191
  * The content has changed.
112
192
  */
113
- onUpdate?: ((this: {
114
- options: Options,
115
- editor: Editor,
116
- }) => void) | null,
193
+ onUpdate?:
194
+ | ((this: {
195
+ name: string
196
+ options: Options
197
+ storage: Storage
198
+ editor: Editor
199
+ parent: ParentConfig<ExtensionConfig<Options, Storage>>['onUpdate']
200
+ }) => void)
201
+ | null
117
202
 
118
203
  /**
119
204
  * The selection has changed.
120
205
  */
121
- onSelectionUpdate?: ((this: {
122
- options: Options,
123
- editor: Editor,
124
- }) => void) | null,
206
+ onSelectionUpdate?:
207
+ | ((this: {
208
+ name: string
209
+ options: Options
210
+ storage: Storage
211
+ editor: Editor
212
+ parent: ParentConfig<ExtensionConfig<Options, Storage>>['onSelectionUpdate']
213
+ }) => void)
214
+ | null
125
215
 
126
216
  /**
127
217
  * The editor state has changed.
128
218
  */
129
- onTransaction?: ((
130
- this: {
131
- options: Options,
132
- editor: Editor,
133
- },
134
- props: {
135
- transaction: Transaction,
136
- },
137
- ) => void) | null,
219
+ onTransaction?:
220
+ | ((
221
+ this: {
222
+ name: string
223
+ options: Options
224
+ storage: Storage
225
+ editor: Editor
226
+ parent: ParentConfig<ExtensionConfig<Options, Storage>>['onTransaction']
227
+ },
228
+ props: {
229
+ transaction: Transaction
230
+ },
231
+ ) => void)
232
+ | null
138
233
 
139
234
  /**
140
235
  * The editor is focused.
141
236
  */
142
- onFocus?: ((
143
- this: {
144
- options: Options,
145
- editor: Editor,
146
- },
147
- props: {
148
- event: FocusEvent,
149
- },
150
- ) => void) | null,
237
+ onFocus?:
238
+ | ((
239
+ this: {
240
+ name: string
241
+ options: Options
242
+ storage: Storage
243
+ editor: Editor
244
+ parent: ParentConfig<ExtensionConfig<Options, Storage>>['onFocus']
245
+ },
246
+ props: {
247
+ event: FocusEvent
248
+ },
249
+ ) => void)
250
+ | null
151
251
 
152
252
  /**
153
253
  * The editor isn’t focused anymore.
154
254
  */
155
- onBlur?: ((
156
- this: {
157
- options: Options,
158
- editor: Editor,
159
- },
160
- props: {
161
- event: FocusEvent,
162
- },
163
- ) => void) | null,
255
+ onBlur?:
256
+ | ((
257
+ this: {
258
+ name: string
259
+ options: Options
260
+ storage: Storage
261
+ editor: Editor
262
+ parent: ParentConfig<ExtensionConfig<Options, Storage>>['onBlur']
263
+ },
264
+ props: {
265
+ event: FocusEvent
266
+ },
267
+ ) => void)
268
+ | null
164
269
 
165
270
  /**
166
271
  * The editor is destroyed.
167
272
  */
168
- onDestroy?: ((this: {
169
- options: Options,
170
- editor: Editor,
171
- }) => void) | null,
273
+ onDestroy?:
274
+ | ((this: {
275
+ name: string
276
+ options: Options
277
+ storage: Storage
278
+ editor: Editor
279
+ parent: ParentConfig<ExtensionConfig<Options, Storage>>['onDestroy']
280
+ }) => void)
281
+ | null
172
282
  }
173
283
  }
174
284
 
175
- export class Extension<Options = any> {
285
+ export class Extension<Options = any, Storage = any> {
176
286
  type = 'extension'
177
287
 
288
+ name = 'extension'
289
+
290
+ parent: Extension | null = null
291
+
292
+ child: Extension | null = null
293
+
294
+ options: Options
295
+
296
+ storage: Storage
297
+
178
298
  config: ExtensionConfig = {
179
- name: 'extension',
180
- priority: 100,
299
+ name: this.name,
181
300
  defaultOptions: {},
182
301
  }
183
302
 
184
- options!: Options
185
-
186
- constructor(config: ExtensionConfig<Options>) {
303
+ constructor(config: Partial<ExtensionConfig<Options, Storage>> = {}) {
187
304
  this.config = {
188
305
  ...this.config,
189
306
  ...config,
190
307
  }
191
308
 
309
+ this.name = this.config.name
310
+
311
+ if (config.defaultOptions) {
312
+ console.warn(
313
+ `[tiptap warn]: BREAKING CHANGE: "defaultOptions" is deprecated. Please use "addOptions" instead. Found in extension: "${this.name}".`,
314
+ )
315
+ }
316
+
317
+ // TODO: remove `addOptions` fallback
192
318
  this.options = this.config.defaultOptions
319
+
320
+ if (this.config.addOptions) {
321
+ this.options = callOrReturn(
322
+ getExtensionField<AnyConfig['addOptions']>(this, 'addOptions', {
323
+ name: this.name,
324
+ }),
325
+ )
326
+ }
327
+
328
+ this.storage = callOrReturn(
329
+ getExtensionField<AnyConfig['addStorage']>(this, 'addStorage', {
330
+ name: this.name,
331
+ options: this.options,
332
+ }),
333
+ ) || {}
193
334
  }
194
335
 
195
- static create<O>(config: ExtensionConfig<O>) {
196
- return new Extension<O>(config)
336
+ static create<O = any, S = any>(config: Partial<ExtensionConfig<O, S>> = {}) {
337
+ return new Extension<O, S>(config)
197
338
  }
198
339
 
199
340
  configure(options: Partial<Options> = {}) {
200
- return Extension
201
- .create<Options>(this.config as ExtensionConfig<Options>)
202
- .#configure(options)
203
- }
341
+ // return a new instance so we can use the same extension
342
+ // with different calls of `configure`
343
+ const extension = this.extend()
344
+
345
+ extension.options = mergeDeep(this.options as Record<string, any>, options) as Options
204
346
 
205
- #configure = (options: Partial<Options>) => {
206
- this.options = mergeDeep(this.config.defaultOptions, options) as Options
347
+ extension.storage = callOrReturn(
348
+ getExtensionField<AnyConfig['addStorage']>(extension, 'addStorage', {
349
+ name: extension.name,
350
+ options: extension.options,
351
+ }),
352
+ )
207
353
 
208
- return this
354
+ return extension
209
355
  }
210
356
 
211
- extend<ExtendedOptions = Options>(extendedConfig: Partial<ExtensionConfig<ExtendedOptions>>) {
212
- return new Extension<ExtendedOptions>({
213
- ...this.config,
214
- ...extendedConfig,
215
- } as ExtensionConfig<ExtendedOptions>)
357
+ extend<ExtendedOptions = Options, ExtendedStorage = Storage>(
358
+ extendedConfig: Partial<ExtensionConfig<ExtendedOptions, ExtendedStorage>> = {},
359
+ ) {
360
+ const extension = new Extension<ExtendedOptions, ExtendedStorage>(extendedConfig)
361
+
362
+ extension.parent = this
363
+
364
+ this.child = extension
365
+
366
+ extension.name = extendedConfig.name ? extendedConfig.name : extension.parent.name
367
+
368
+ if (extendedConfig.defaultOptions) {
369
+ console.warn(
370
+ `[tiptap warn]: BREAKING CHANGE: "defaultOptions" is deprecated. Please use "addOptions" instead. Found in extension: "${extension.name}".`,
371
+ )
372
+ }
373
+
374
+ extension.options = callOrReturn(
375
+ getExtensionField<AnyConfig['addOptions']>(extension, 'addOptions', {
376
+ name: extension.name,
377
+ }),
378
+ )
379
+
380
+ extension.storage = callOrReturn(
381
+ getExtensionField<AnyConfig['addStorage']>(extension, 'addStorage', {
382
+ name: extension.name,
383
+ options: extension.options,
384
+ }),
385
+ )
386
+
387
+ return extension
216
388
  }
217
389
  }