@tiptap/core 2.0.0-beta.14 → 2.0.0-beta.143

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