@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/Node.ts CHANGED
@@ -1,348 +1,614 @@
1
1
  import {
2
- DOMOutputSpec,
3
- NodeSpec,
4
- Node as ProseMirrorNode,
5
- NodeType,
6
- } from 'prosemirror-model'
7
- import { Command as ProseMirrorCommand } from 'prosemirror-commands'
8
- import { Plugin, Transaction } from 'prosemirror-state'
9
- import { InputRule } from 'prosemirror-inputrules'
10
- import mergeDeep from './utilities/mergeDeep'
2
+ DOMOutputSpec, Node as ProseMirrorNode, NodeSpec, NodeType,
3
+ } from '@tiptap/pm/model'
4
+ import { Plugin, Transaction } from '@tiptap/pm/state'
5
+
6
+ import { NodeConfig } from '.'
7
+ import { Editor } from './Editor'
8
+ import { getExtensionField } from './helpers/getExtensionField'
9
+ import { InputRule } from './InputRule'
10
+ import { PasteRule } from './PasteRule'
11
11
  import {
12
+ AnyConfig,
12
13
  Attributes,
13
- NodeViewRenderer,
14
+ Extensions,
14
15
  GlobalAttributes,
16
+ KeyboardShortcutCommand,
17
+ NodeViewRenderer,
18
+ ParentConfig,
15
19
  RawCommands,
16
20
  } from './types'
17
- import { NodeConfig } from '.'
18
- import { Editor } from './Editor'
21
+ import { callOrReturn } from './utilities/callOrReturn'
22
+ import { mergeDeep } from './utilities/mergeDeep'
19
23
 
20
24
  declare module '@tiptap/core' {
21
- interface NodeConfig<Options = any> {
22
- [key: string]: any;
25
+ interface NodeConfig<Options = any, Storage = any> {
26
+ [key: string]: any
23
27
 
24
28
  /**
25
29
  * Name
26
30
  */
27
- name: string,
31
+ name: string
28
32
 
29
33
  /**
30
34
  * Priority
31
35
  */
32
- priority?: number,
36
+ priority?: number
33
37
 
34
38
  /**
35
39
  * Default options
36
40
  */
37
- defaultOptions?: Options,
41
+ defaultOptions?: Options
42
+
43
+ /**
44
+ * Default Options
45
+ */
46
+ addOptions?: (this: {
47
+ name: string
48
+ parent: Exclude<ParentConfig<NodeConfig<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<NodeConfig<Options, Storage>>['addStorage'], undefined>
58
+ }) => Storage
38
59
 
39
60
  /**
40
61
  * Global attributes
41
62
  */
42
63
  addGlobalAttributes?: (this: {
43
- options: Options,
44
- }) => GlobalAttributes | {},
64
+ name: string
65
+ options: Options
66
+ storage: Storage
67
+ parent: ParentConfig<NodeConfig<Options, Storage>>['addGlobalAttributes']
68
+ }) => GlobalAttributes | {}
45
69
 
46
70
  /**
47
71
  * Raw
48
72
  */
49
73
  addCommands?: (this: {
50
- options: Options,
51
- editor: Editor,
52
- type: NodeType,
53
- }) => Partial<RawCommands>,
74
+ name: string
75
+ options: Options
76
+ storage: Storage
77
+ editor: Editor
78
+ type: NodeType
79
+ parent: ParentConfig<NodeConfig<Options, Storage>>['addCommands']
80
+ }) => Partial<RawCommands>
54
81
 
55
82
  /**
56
83
  * Keyboard shortcuts
57
84
  */
58
85
  addKeyboardShortcuts?: (this: {
59
- options: Options,
60
- editor: Editor,
61
- type: NodeType,
86
+ name: string
87
+ options: Options
88
+ storage: Storage
89
+ editor: Editor
90
+ type: NodeType
91
+ parent: ParentConfig<NodeConfig<Options, Storage>>['addKeyboardShortcuts']
62
92
  }) => {
63
- [key: string]: ProseMirrorCommand,
64
- },
93
+ [key: string]: KeyboardShortcutCommand
94
+ }
65
95
 
66
96
  /**
67
97
  * Input rules
68
98
  */
69
99
  addInputRules?: (this: {
70
- options: Options,
71
- editor: Editor,
72
- type: NodeType,
73
- }) => InputRule[],
100
+ name: string
101
+ options: Options
102
+ storage: Storage
103
+ editor: Editor
104
+ type: NodeType
105
+ parent: ParentConfig<NodeConfig<Options, Storage>>['addInputRules']
106
+ }) => InputRule[]
74
107
 
75
108
  /**
76
109
  * Paste rules
77
110
  */
78
111
  addPasteRules?: (this: {
79
- options: Options,
80
- editor: Editor,
81
- type: NodeType,
82
- }) => Plugin[],
112
+ name: string
113
+ options: Options
114
+ storage: Storage
115
+ editor: Editor
116
+ type: NodeType
117
+ parent: ParentConfig<NodeConfig<Options, Storage>>['addPasteRules']
118
+ }) => PasteRule[]
83
119
 
84
120
  /**
85
121
  * ProseMirror plugins
86
122
  */
87
123
  addProseMirrorPlugins?: (this: {
88
- options: Options,
89
- editor: Editor,
90
- type: NodeType,
91
- }) => Plugin[],
124
+ name: string
125
+ options: Options
126
+ storage: Storage
127
+ editor: Editor
128
+ type: NodeType
129
+ parent: ParentConfig<NodeConfig<Options, Storage>>['addProseMirrorPlugins']
130
+ }) => Plugin[]
131
+
132
+ /**
133
+ * Extensions
134
+ */
135
+ addExtensions?: (this: {
136
+ name: string
137
+ options: Options
138
+ storage: Storage
139
+ parent: ParentConfig<NodeConfig<Options, Storage>>['addExtensions']
140
+ }) => Extensions
92
141
 
93
142
  /**
94
143
  * Extend Node Schema
95
144
  */
96
- extendNodeSchema?: ((
97
- this: {
98
- options: Options,
99
- },
100
- extension: Node,
101
- ) => {
102
- [key: string]: any,
103
- }) | null,
145
+ extendNodeSchema?:
146
+ | ((
147
+ this: {
148
+ name: string
149
+ options: Options
150
+ storage: Storage
151
+ parent: ParentConfig<NodeConfig<Options, Storage>>['extendNodeSchema']
152
+ },
153
+ extension: Node,
154
+ ) => Record<string, any>)
155
+ | null
104
156
 
105
157
  /**
106
158
  * Extend Mark Schema
107
159
  */
108
- extendMarkSchema?: ((
109
- this: {
110
- options: Options,
111
- },
112
- extension: Node,
113
- ) => {
114
- [key: string]: any,
115
- }) | null,
160
+ extendMarkSchema?:
161
+ | ((
162
+ this: {
163
+ name: string
164
+ options: Options
165
+ storage: Storage
166
+ parent: ParentConfig<NodeConfig<Options, Storage>>['extendMarkSchema']
167
+ },
168
+ extension: Node,
169
+ ) => Record<string, any>)
170
+ | null
171
+
172
+ /**
173
+ * The editor is not ready yet.
174
+ */
175
+ onBeforeCreate?:
176
+ | ((this: {
177
+ name: string
178
+ options: Options
179
+ storage: Storage
180
+ editor: Editor
181
+ type: NodeType
182
+ parent: ParentConfig<NodeConfig<Options, Storage>>['onBeforeCreate']
183
+ }) => void)
184
+ | null
116
185
 
117
186
  /**
118
187
  * The editor is ready.
119
188
  */
120
- onCreate?: ((this: {
121
- options: Options,
122
- editor: Editor,
123
- type: NodeType,
124
- }) => void) | null,
189
+ onCreate?:
190
+ | ((this: {
191
+ name: string
192
+ options: Options
193
+ storage: Storage
194
+ editor: Editor
195
+ type: NodeType
196
+ parent: ParentConfig<NodeConfig<Options, Storage>>['onCreate']
197
+ }) => void)
198
+ | null
125
199
 
126
200
  /**
127
201
  * The content has changed.
128
202
  */
129
- onUpdate?: ((this: {
130
- options: Options,
131
- editor: Editor,
132
- type: NodeType,
133
- }) => void) | null,
203
+ onUpdate?:
204
+ | ((this: {
205
+ name: string
206
+ options: Options
207
+ storage: Storage
208
+ editor: Editor
209
+ type: NodeType
210
+ parent: ParentConfig<NodeConfig<Options, Storage>>['onUpdate']
211
+ }) => void)
212
+ | null
134
213
 
135
214
  /**
136
215
  * The selection has changed.
137
216
  */
138
- onSelectionUpdate?: ((this: {
139
- options: Options,
140
- editor: Editor,
141
- type: NodeType,
142
- }) => void) | null,
217
+ onSelectionUpdate?:
218
+ | ((this: {
219
+ name: string
220
+ options: Options
221
+ storage: Storage
222
+ editor: Editor
223
+ type: NodeType
224
+ parent: ParentConfig<NodeConfig<Options, Storage>>['onSelectionUpdate']
225
+ }) => void)
226
+ | null
143
227
 
144
228
  /**
145
229
  * The editor state has changed.
146
230
  */
147
- onTransaction?: ((
148
- this: {
149
- options: Options,
150
- editor: Editor,
151
- type: NodeType,
152
- },
153
- props: {
154
- transaction: Transaction,
155
- },
156
- ) => void) | null,
231
+ onTransaction?:
232
+ | ((
233
+ this: {
234
+ name: string
235
+ options: Options
236
+ storage: Storage
237
+ editor: Editor
238
+ type: NodeType
239
+ parent: ParentConfig<NodeConfig<Options, Storage>>['onTransaction']
240
+ },
241
+ props: {
242
+ transaction: Transaction
243
+ },
244
+ ) => void)
245
+ | null
157
246
 
158
247
  /**
159
248
  * The editor is focused.
160
249
  */
161
- onFocus?: ((
162
- this: {
163
- options: Options,
164
- editor: Editor,
165
- type: NodeType,
166
- },
167
- props: {
168
- event: FocusEvent,
169
- },
170
- ) => void) | null,
250
+ onFocus?:
251
+ | ((
252
+ this: {
253
+ name: string
254
+ options: Options
255
+ storage: Storage
256
+ editor: Editor
257
+ type: NodeType
258
+ parent: ParentConfig<NodeConfig<Options, Storage>>['onFocus']
259
+ },
260
+ props: {
261
+ event: FocusEvent
262
+ },
263
+ ) => void)
264
+ | null
171
265
 
172
266
  /**
173
267
  * The editor isn’t focused anymore.
174
268
  */
175
- onBlur?: ((
176
- this: {
177
- options: Options,
178
- editor: Editor,
179
- type: NodeType,
180
- },
181
- props: {
182
- event: FocusEvent,
183
- },
184
- ) => void) | null,
269
+ onBlur?:
270
+ | ((
271
+ this: {
272
+ name: string
273
+ options: Options
274
+ storage: Storage
275
+ editor: Editor
276
+ type: NodeType
277
+ parent: ParentConfig<NodeConfig<Options, Storage>>['onBlur']
278
+ },
279
+ props: {
280
+ event: FocusEvent
281
+ },
282
+ ) => void)
283
+ | null
185
284
 
186
285
  /**
187
286
  * The editor is destroyed.
188
287
  */
189
- onDestroy?: ((this: {
190
- options: Options,
191
- editor: Editor,
192
- type: NodeType,
193
- }) => void) | null,
288
+ onDestroy?:
289
+ | ((this: {
290
+ name: string
291
+ options: Options
292
+ storage: Storage
293
+ editor: Editor
294
+ type: NodeType
295
+ parent: ParentConfig<NodeConfig<Options, Storage>>['onDestroy']
296
+ }) => void)
297
+ | null
194
298
 
195
299
  /**
196
300
  * Node View
197
301
  */
198
- addNodeView?: ((this: {
199
- options: Options,
200
- editor: Editor,
201
- type: NodeType,
202
- }) => NodeViewRenderer) | null,
302
+ addNodeView?:
303
+ | ((this: {
304
+ name: string
305
+ options: Options
306
+ storage: Storage
307
+ editor: Editor
308
+ type: NodeType
309
+ parent: ParentConfig<NodeConfig<Options, Storage>>['addNodeView']
310
+ }) => NodeViewRenderer)
311
+ | null
203
312
 
204
313
  /**
205
314
  * TopNode
206
315
  */
207
- topNode?: boolean,
316
+ topNode?: boolean
208
317
 
209
318
  /**
210
319
  * Content
211
320
  */
212
- content?: NodeSpec['content'] | ((this: { options: Options }) => NodeSpec['content']),
321
+ content?:
322
+ | NodeSpec['content']
323
+ | ((this: {
324
+ name: string
325
+ options: Options
326
+ storage: Storage
327
+ parent: ParentConfig<NodeConfig<Options, Storage>>['content']
328
+ }) => NodeSpec['content'])
213
329
 
214
330
  /**
215
331
  * Marks
216
332
  */
217
- marks?: NodeSpec['marks'] | ((this: { options: Options }) => NodeSpec['marks']),
333
+ marks?:
334
+ | NodeSpec['marks']
335
+ | ((this: {
336
+ name: string
337
+ options: Options
338
+ storage: Storage
339
+ parent: ParentConfig<NodeConfig<Options, Storage>>['marks']
340
+ }) => NodeSpec['marks'])
218
341
 
219
342
  /**
220
343
  * Group
221
344
  */
222
- group?: NodeSpec['group'] | ((this: { options: Options }) => NodeSpec['group']),
345
+ group?:
346
+ | NodeSpec['group']
347
+ | ((this: {
348
+ name: string
349
+ options: Options
350
+ storage: Storage
351
+ parent: ParentConfig<NodeConfig<Options, Storage>>['group']
352
+ }) => NodeSpec['group'])
223
353
 
224
354
  /**
225
355
  * Inline
226
356
  */
227
- inline?: NodeSpec['inline'] | ((this: { options: Options }) => NodeSpec['inline']),
357
+ inline?:
358
+ | NodeSpec['inline']
359
+ | ((this: {
360
+ name: string
361
+ options: Options
362
+ storage: Storage
363
+ parent: ParentConfig<NodeConfig<Options, Storage>>['inline']
364
+ }) => NodeSpec['inline'])
228
365
 
229
366
  /**
230
367
  * Atom
231
368
  */
232
- atom?: NodeSpec['atom'] | ((this: { options: Options }) => NodeSpec['atom']),
369
+ atom?:
370
+ | NodeSpec['atom']
371
+ | ((this: {
372
+ name: string
373
+ options: Options
374
+ storage: Storage
375
+ parent: ParentConfig<NodeConfig<Options, Storage>>['atom']
376
+ }) => NodeSpec['atom'])
233
377
 
234
378
  /**
235
379
  * Selectable
236
380
  */
237
- selectable?: NodeSpec['selectable'] | ((this: { options: Options }) => NodeSpec['selectable']),
381
+ selectable?:
382
+ | NodeSpec['selectable']
383
+ | ((this: {
384
+ name: string
385
+ options: Options
386
+ storage: Storage
387
+ parent: ParentConfig<NodeConfig<Options, Storage>>['selectable']
388
+ }) => NodeSpec['selectable'])
238
389
 
239
390
  /**
240
391
  * Draggable
241
392
  */
242
- draggable?: NodeSpec['draggable'] | ((this: { options: Options }) => NodeSpec['draggable']),
393
+ draggable?:
394
+ | NodeSpec['draggable']
395
+ | ((this: {
396
+ name: string
397
+ options: Options
398
+ storage: Storage
399
+ parent: ParentConfig<NodeConfig<Options, Storage>>['draggable']
400
+ }) => NodeSpec['draggable'])
243
401
 
244
402
  /**
245
403
  * Code
246
404
  */
247
- code?: NodeSpec['code'] | ((this: { options: Options }) => NodeSpec['code']),
405
+ code?:
406
+ | NodeSpec['code']
407
+ | ((this: {
408
+ name: string
409
+ options: Options
410
+ storage: Storage
411
+ parent: ParentConfig<NodeConfig<Options, Storage>>['code']
412
+ }) => NodeSpec['code'])
413
+
414
+ /**
415
+ * Whitespace
416
+ */
417
+ whitespace?:
418
+ | NodeSpec['whitespace']
419
+ | ((this: {
420
+ name: string
421
+ options: Options
422
+ storage: Storage
423
+ parent: ParentConfig<NodeConfig<Options, Storage>>['whitespace']
424
+ }) => NodeSpec['whitespace'])
248
425
 
249
426
  /**
250
427
  * Defining
251
428
  */
252
- defining?: NodeSpec['defining'] | ((this: { options: Options }) => NodeSpec['defining']),
429
+ defining?:
430
+ | NodeSpec['defining']
431
+ | ((this: {
432
+ name: string
433
+ options: Options
434
+ storage: Storage
435
+ parent: ParentConfig<NodeConfig<Options, Storage>>['defining']
436
+ }) => NodeSpec['defining'])
253
437
 
254
438
  /**
255
439
  * Isolating
256
440
  */
257
- isolating?: NodeSpec['isolating'] | ((this: { options: Options }) => NodeSpec['isolating']),
441
+ isolating?:
442
+ | NodeSpec['isolating']
443
+ | ((this: {
444
+ name: string
445
+ options: Options
446
+ storage: Storage
447
+ parent: ParentConfig<NodeConfig<Options, Storage>>['isolating']
448
+ }) => NodeSpec['isolating'])
258
449
 
259
450
  /**
260
451
  * Parse HTML
261
452
  */
262
- parseHTML?: (
263
- this: {
264
- options: Options,
265
- },
266
- ) => NodeSpec['parseDOM'],
453
+ parseHTML?: (this: {
454
+ name: string
455
+ options: Options
456
+ storage: Storage
457
+ parent: ParentConfig<NodeConfig<Options, Storage>>['parseHTML']
458
+ }) => NodeSpec['parseDOM']
267
459
 
268
460
  /**
269
461
  * Render HTML
270
462
  */
271
- renderHTML?: ((
272
- this: {
273
- options: Options,
274
- },
275
- props: {
276
- node: ProseMirrorNode,
277
- HTMLAttributes: { [key: string]: any },
278
- }
279
- ) => DOMOutputSpec) | null,
463
+ renderHTML?:
464
+ | ((
465
+ this: {
466
+ name: string
467
+ options: Options
468
+ storage: Storage
469
+ parent: ParentConfig<NodeConfig<Options, Storage>>['renderHTML']
470
+ },
471
+ props: {
472
+ node: ProseMirrorNode
473
+ HTMLAttributes: Record<string, any>
474
+ },
475
+ ) => DOMOutputSpec)
476
+ | null
280
477
 
281
478
  /**
282
479
  * Render Text
283
480
  */
284
- renderText?: ((
285
- this: {
286
- options: Options,
287
- editor: Editor,
288
- type: NodeType,
289
- },
290
- props: {
291
- node: ProseMirrorNode,
292
- }
293
- ) => string) | null,
481
+ renderText?:
482
+ | ((
483
+ this: {
484
+ name: string
485
+ options: Options
486
+ storage: Storage
487
+ parent: ParentConfig<NodeConfig<Options, Storage>>['renderText']
488
+ },
489
+ props: {
490
+ node: ProseMirrorNode
491
+ pos: number
492
+ parent: ProseMirrorNode
493
+ index: number
494
+ },
495
+ ) => string)
496
+ | null
294
497
 
295
498
  /**
296
499
  * Add Attributes
297
500
  */
298
- addAttributes?: (
299
- this: {
300
- options: Options,
301
- },
302
- ) => Attributes | {},
501
+ addAttributes?: (this: {
502
+ name: string
503
+ options: Options
504
+ storage: Storage
505
+ parent: ParentConfig<NodeConfig<Options, Storage>>['addAttributes']
506
+ }) => Attributes | {}
303
507
  }
304
508
  }
305
509
 
306
- export class Node<Options = any> {
510
+ export class Node<Options = any, Storage = any> {
307
511
  type = 'node'
308
512
 
513
+ name = 'node'
514
+
515
+ parent: Node | null = null
516
+
517
+ child: Node | null = null
518
+
519
+ options: Options
520
+
521
+ storage: Storage
522
+
309
523
  config: NodeConfig = {
310
- name: 'node',
311
- priority: 100,
524
+ name: this.name,
312
525
  defaultOptions: {},
313
526
  }
314
527
 
315
- options!: Options
316
-
317
- constructor(config: NodeConfig<Options>) {
528
+ constructor(config: Partial<NodeConfig<Options, Storage>> = {}) {
318
529
  this.config = {
319
530
  ...this.config,
320
531
  ...config,
321
532
  }
322
533
 
534
+ this.name = this.config.name
535
+
536
+ if (config.defaultOptions) {
537
+ console.warn(
538
+ `[tiptap warn]: BREAKING CHANGE: "defaultOptions" is deprecated. Please use "addOptions" instead. Found in extension: "${this.name}".`,
539
+ )
540
+ }
541
+
542
+ // TODO: remove `addOptions` fallback
323
543
  this.options = this.config.defaultOptions
544
+
545
+ if (this.config.addOptions) {
546
+ this.options = callOrReturn(
547
+ getExtensionField<AnyConfig['addOptions']>(this, 'addOptions', {
548
+ name: this.name,
549
+ }),
550
+ )
551
+ }
552
+
553
+ this.storage = callOrReturn(
554
+ getExtensionField<AnyConfig['addStorage']>(this, 'addStorage', {
555
+ name: this.name,
556
+ options: this.options,
557
+ }),
558
+ ) || {}
324
559
  }
325
560
 
326
- static create<O>(config: NodeConfig<O>) {
327
- return new Node<O>(config)
561
+ static create<O = any, S = any>(config: Partial<NodeConfig<O, S>> = {}) {
562
+ return new Node<O, S>(config)
328
563
  }
329
564
 
330
565
  configure(options: Partial<Options> = {}) {
331
- return Node
332
- .create<Options>(this.config as NodeConfig<Options>)
333
- .#configure(options)
334
- }
566
+ // return a new instance so we can use the same extension
567
+ // with different calls of `configure`
568
+ const extension = this.extend()
335
569
 
336
- #configure = (options: Partial<Options>) => {
337
- this.options = mergeDeep(this.config.defaultOptions, options) as Options
570
+ extension.options = mergeDeep(this.options as Record<string, any>, options) as Options
338
571
 
339
- return this
572
+ extension.storage = callOrReturn(
573
+ getExtensionField<AnyConfig['addStorage']>(extension, 'addStorage', {
574
+ name: extension.name,
575
+ options: extension.options,
576
+ }),
577
+ )
578
+
579
+ return extension
340
580
  }
341
581
 
342
- extend<ExtendedOptions = Options>(extendedConfig: Partial<NodeConfig<ExtendedOptions>>) {
343
- return new Node<ExtendedOptions>({
344
- ...this.config,
345
- ...extendedConfig,
346
- } as NodeConfig<ExtendedOptions>)
582
+ extend<ExtendedOptions = Options, ExtendedStorage = Storage>(
583
+ extendedConfig: Partial<NodeConfig<ExtendedOptions, ExtendedStorage>> = {},
584
+ ) {
585
+ const extension = new Node<ExtendedOptions, ExtendedStorage>(extendedConfig)
586
+
587
+ extension.parent = this
588
+
589
+ this.child = extension
590
+
591
+ extension.name = extendedConfig.name ? extendedConfig.name : extension.parent.name
592
+
593
+ if (extendedConfig.defaultOptions) {
594
+ console.warn(
595
+ `[tiptap warn]: BREAKING CHANGE: "defaultOptions" is deprecated. Please use "addOptions" instead. Found in extension: "${extension.name}".`,
596
+ )
597
+ }
598
+
599
+ extension.options = callOrReturn(
600
+ getExtensionField<AnyConfig['addOptions']>(extension, 'addOptions', {
601
+ name: extension.name,
602
+ }),
603
+ )
604
+
605
+ extension.storage = callOrReturn(
606
+ getExtensionField<AnyConfig['addStorage']>(extension, 'addStorage', {
607
+ name: extension.name,
608
+ options: extension.options,
609
+ }),
610
+ )
611
+
612
+ return extension
347
613
  }
348
614
  }