@tiptap/core 2.0.0-beta.19 → 2.0.0-beta.193

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 (283) hide show
  1. package/README.md +2 -2
  2. package/package.json +16 -20
  3. package/src/CommandManager.ts +64 -65
  4. package/src/Editor.ts +116 -78
  5. package/src/EventEmitter.ts +14 -4
  6. package/src/Extension.ts +193 -43
  7. package/src/ExtensionManager.ts +242 -84
  8. package/src/InputRule.ts +265 -0
  9. package/src/Mark.ts +277 -48
  10. package/src/Node.ts +279 -57
  11. package/src/NodeView.ts +115 -47
  12. package/src/PasteRule.ts +247 -0
  13. package/src/Tracker.ts +42 -0
  14. package/src/commands/blur.ts +12 -6
  15. package/src/commands/clearContent.ts +3 -3
  16. package/src/commands/clearNodes.ts +30 -18
  17. package/src/commands/command.ts +2 -2
  18. package/src/commands/createParagraphNear.ts +4 -3
  19. package/src/commands/deleteNode.ts +37 -0
  20. package/src/commands/deleteRange.ts +3 -3
  21. package/src/commands/deleteSelection.ts +4 -3
  22. package/src/commands/enter.ts +3 -3
  23. package/src/commands/exitCode.ts +4 -3
  24. package/src/commands/extendMarkRange.ts +12 -11
  25. package/src/commands/first.ts +3 -3
  26. package/src/commands/focus.ts +47 -44
  27. package/src/commands/forEach.ts +24 -0
  28. package/src/commands/index.ts +50 -0
  29. package/src/commands/insertContent.ts +13 -24
  30. package/src/commands/insertContentAt.ts +108 -0
  31. package/src/commands/joinBackward.ts +4 -3
  32. package/src/commands/joinForward.ts +4 -3
  33. package/src/commands/keyboardShortcut.ts +6 -6
  34. package/src/commands/lift.ts +6 -5
  35. package/src/commands/liftEmptyBlock.ts +4 -3
  36. package/src/commands/liftListItem.ts +6 -5
  37. package/src/commands/newlineInCode.ts +4 -3
  38. package/src/commands/resetAttributes.ts +62 -0
  39. package/src/commands/scrollIntoView.ts +3 -3
  40. package/src/commands/selectAll.ts +8 -6
  41. package/src/commands/selectNodeBackward.ts +4 -3
  42. package/src/commands/selectNodeForward.ts +4 -3
  43. package/src/commands/selectParentNode.ts +4 -3
  44. package/src/commands/selectTextblockEnd.ts +20 -0
  45. package/src/commands/selectTextblockStart.ts +20 -0
  46. package/src/commands/setContent.ts +9 -15
  47. package/src/commands/setMark.ts +36 -12
  48. package/src/commands/setMeta.ts +18 -0
  49. package/src/commands/setNode.ts +29 -7
  50. package/src/commands/setNodeSelection.ts +27 -0
  51. package/src/commands/setTextSelection.ts +33 -0
  52. package/src/commands/sinkListItem.ts +6 -5
  53. package/src/commands/splitBlock.ts +14 -19
  54. package/src/commands/splitListItem.ts +45 -18
  55. package/src/commands/toggleList.ts +83 -18
  56. package/src/commands/toggleMark.ts +18 -7
  57. package/src/commands/toggleNode.ts +6 -5
  58. package/src/commands/toggleWrap.ts +9 -9
  59. package/src/commands/undoInputRule.ts +34 -5
  60. package/src/commands/unsetAllMarks.ts +7 -11
  61. package/src/commands/unsetMark.ts +35 -22
  62. package/src/commands/updateAttributes.ts +16 -9
  63. package/src/commands/wrapIn.ts +5 -10
  64. package/src/commands/wrapInList.ts +6 -5
  65. package/src/extensions/clipboardTextSerializer.ts +14 -35
  66. package/src/extensions/commands.ts +3 -144
  67. package/src/extensions/editable.ts +1 -0
  68. package/src/extensions/focusEvents.ts +3 -5
  69. package/src/extensions/index.ts +1 -0
  70. package/src/extensions/keymap.ts +110 -13
  71. package/src/extensions/tabindex.ts +18 -0
  72. package/src/helpers/combineTransactionSteps.ts +18 -0
  73. package/src/helpers/createChainableState.ts +38 -0
  74. package/src/helpers/createDocument.ts +5 -6
  75. package/src/helpers/createNodeFromContent.ts +17 -19
  76. package/src/helpers/defaultBlockAt.ts +13 -0
  77. package/src/helpers/findChildren.ts +18 -0
  78. package/src/helpers/findChildrenInRange.ts +32 -0
  79. package/src/helpers/findParentNode.ts +3 -2
  80. package/src/helpers/findParentNodeClosestToPos.ts +3 -2
  81. package/src/helpers/generateHTML.ts +6 -5
  82. package/src/helpers/generateJSON.ts +14 -0
  83. package/src/helpers/generateText.ts +30 -0
  84. package/src/helpers/getAttributes.ts +28 -0
  85. package/src/helpers/getAttributesFromExtensions.ts +42 -14
  86. package/src/helpers/getChangedRanges.ts +83 -0
  87. package/src/helpers/getDebugJSON.ts +54 -0
  88. package/src/helpers/getExtensionField.ts +25 -0
  89. package/src/helpers/getHTMLFromFragment.ts +6 -5
  90. package/src/helpers/getMarkAttributes.ts +14 -10
  91. package/src/helpers/getMarkRange.ts +41 -8
  92. package/src/helpers/getMarkType.ts +5 -1
  93. package/src/helpers/getMarksBetween.ts +32 -10
  94. package/src/helpers/getNodeAttributes.ts +9 -9
  95. package/src/helpers/getNodeType.ts +5 -1
  96. package/src/helpers/getRenderedAttributes.ts +6 -7
  97. package/src/helpers/getSchema.ts +7 -133
  98. package/src/helpers/getSchemaByResolvedExtensions.ts +148 -0
  99. package/src/helpers/getSchemaTypeByName.ts +2 -10
  100. package/src/helpers/getSchemaTypeNameByName.ts +1 -1
  101. package/src/helpers/getSplittedAttributes.ts +4 -4
  102. package/src/helpers/getText.ts +19 -0
  103. package/src/helpers/getTextBetween.ts +49 -0
  104. package/src/helpers/getTextContentFromNodes.ts +17 -0
  105. package/src/helpers/getTextSerializersFromSchema.ts +10 -0
  106. package/src/helpers/index.ts +33 -0
  107. package/src/helpers/injectExtensionAttributesToParseRule.ts +17 -19
  108. package/src/helpers/isActive.ts +5 -5
  109. package/src/helpers/isExtensionRulesEnabled.ts +15 -0
  110. package/src/helpers/isList.ts +14 -7
  111. package/src/helpers/isMarkActive.ts +45 -20
  112. package/src/helpers/isNodeActive.ts +28 -35
  113. package/src/helpers/isNodeEmpty.ts +1 -1
  114. package/src/helpers/isNodeSelection.ts +2 -3
  115. package/src/helpers/isTextSelection.ts +2 -3
  116. package/src/helpers/posToDOMRect.ts +35 -0
  117. package/src/helpers/resolveFocusPosition.ts +43 -0
  118. package/src/helpers/selectionToInsertionEnd.ts +2 -2
  119. package/src/helpers/splitExtensions.ts +3 -3
  120. package/src/index.ts +15 -24
  121. package/src/inputRules/index.ts +5 -0
  122. package/src/inputRules/markInputRule.ts +59 -39
  123. package/src/inputRules/nodeInputRule.ts +45 -11
  124. package/src/inputRules/textInputRule.ts +35 -0
  125. package/src/inputRules/textblockTypeInputRule.ts +38 -0
  126. package/src/inputRules/wrappingInputRule.ts +60 -0
  127. package/src/pasteRules/index.ts +3 -0
  128. package/src/pasteRules/markPasteRule.ts +62 -53
  129. package/src/pasteRules/nodePasteRule.ts +39 -0
  130. package/src/pasteRules/textPasteRule.ts +35 -0
  131. package/src/style.ts +16 -3
  132. package/src/types.ts +129 -43
  133. package/src/utilities/callOrReturn.ts +6 -3
  134. package/src/utilities/createStyleTag.ts +12 -1
  135. package/src/utilities/deleteProps.ts +2 -4
  136. package/src/utilities/elementFromString.ts +4 -5
  137. package/src/utilities/escapeForRegEx.ts +4 -0
  138. package/src/utilities/findDuplicates.ts +5 -0
  139. package/src/utilities/fromString.ts +2 -2
  140. package/src/utilities/index.ts +3 -0
  141. package/src/utilities/isEmptyObject.ts +2 -2
  142. package/src/utilities/isFunction.ts +3 -0
  143. package/src/utilities/isMacOS.ts +5 -0
  144. package/src/utilities/isNumber.ts +3 -0
  145. package/src/utilities/isPlainObject.ts +8 -5
  146. package/src/utilities/isRegExp.ts +3 -0
  147. package/src/utilities/isString.ts +3 -0
  148. package/src/utilities/isiOS.ts +12 -0
  149. package/src/utilities/mergeAttributes.ts +2 -3
  150. package/src/utilities/mergeDeep.ts +2 -3
  151. package/src/utilities/minMax.ts +1 -1
  152. package/src/utilities/objectIncludes.ts +17 -5
  153. package/src/utilities/removeDuplicates.ts +15 -0
  154. package/CHANGELOG.md +0 -346
  155. package/LICENSE.md +0 -21
  156. package/dist/packages/core/src/CommandManager.d.ts +0 -13
  157. package/dist/packages/core/src/Editor.d.ts +0 -142
  158. package/dist/packages/core/src/EventEmitter.d.ts +0 -7
  159. package/dist/packages/core/src/Extension.d.ts +0 -155
  160. package/dist/packages/core/src/ExtensionManager.d.ts +0 -24
  161. package/dist/packages/core/src/Mark.d.ts +0 -219
  162. package/dist/packages/core/src/Node.d.ts +0 -273
  163. package/dist/packages/core/src/NodeView.d.ts +0 -31
  164. package/dist/packages/core/src/commands/blur.d.ts +0 -12
  165. package/dist/packages/core/src/commands/clearContent.d.ts +0 -12
  166. package/dist/packages/core/src/commands/clearNodes.d.ts +0 -12
  167. package/dist/packages/core/src/commands/command.d.ts +0 -12
  168. package/dist/packages/core/src/commands/createParagraphNear.d.ts +0 -12
  169. package/dist/packages/core/src/commands/deleteRange.d.ts +0 -12
  170. package/dist/packages/core/src/commands/deleteSelection.d.ts +0 -12
  171. package/dist/packages/core/src/commands/enter.d.ts +0 -12
  172. package/dist/packages/core/src/commands/exitCode.d.ts +0 -12
  173. package/dist/packages/core/src/commands/extendMarkRange.d.ts +0 -13
  174. package/dist/packages/core/src/commands/first.d.ts +0 -12
  175. package/dist/packages/core/src/commands/focus.d.ts +0 -12
  176. package/dist/packages/core/src/commands/insertContent.d.ts +0 -12
  177. package/dist/packages/core/src/commands/insertHTML.d.ts +0 -12
  178. package/dist/packages/core/src/commands/insertNode.d.ts +0 -13
  179. package/dist/packages/core/src/commands/insertText.d.ts +0 -12
  180. package/dist/packages/core/src/commands/joinBackward.d.ts +0 -12
  181. package/dist/packages/core/src/commands/joinForward.d.ts +0 -12
  182. package/dist/packages/core/src/commands/keyboardShortcut.d.ts +0 -12
  183. package/dist/packages/core/src/commands/lift.d.ts +0 -13
  184. package/dist/packages/core/src/commands/liftEmptyBlock.d.ts +0 -12
  185. package/dist/packages/core/src/commands/liftListItem.d.ts +0 -13
  186. package/dist/packages/core/src/commands/newlineInCode.d.ts +0 -12
  187. package/dist/packages/core/src/commands/replace.d.ts +0 -13
  188. package/dist/packages/core/src/commands/replaceRange.d.ts +0 -13
  189. package/dist/packages/core/src/commands/resetNodeAttributes.d.ts +0 -13
  190. package/dist/packages/core/src/commands/scrollIntoView.d.ts +0 -12
  191. package/dist/packages/core/src/commands/selectAll.d.ts +0 -12
  192. package/dist/packages/core/src/commands/selectNodeBackward.d.ts +0 -12
  193. package/dist/packages/core/src/commands/selectNodeForward.d.ts +0 -12
  194. package/dist/packages/core/src/commands/selectParentNode.d.ts +0 -12
  195. package/dist/packages/core/src/commands/setContent.d.ts +0 -12
  196. package/dist/packages/core/src/commands/setMark.d.ts +0 -13
  197. package/dist/packages/core/src/commands/setNode.d.ts +0 -13
  198. package/dist/packages/core/src/commands/sinkListItem.d.ts +0 -13
  199. package/dist/packages/core/src/commands/splitBlock.d.ts +0 -14
  200. package/dist/packages/core/src/commands/splitListItem.d.ts +0 -13
  201. package/dist/packages/core/src/commands/toggleList.d.ts +0 -13
  202. package/dist/packages/core/src/commands/toggleMark.d.ts +0 -13
  203. package/dist/packages/core/src/commands/toggleNode.d.ts +0 -13
  204. package/dist/packages/core/src/commands/toggleWrap.d.ts +0 -13
  205. package/dist/packages/core/src/commands/undoInputRule.d.ts +0 -12
  206. package/dist/packages/core/src/commands/unsetAllMarks.d.ts +0 -12
  207. package/dist/packages/core/src/commands/unsetMark.d.ts +0 -13
  208. package/dist/packages/core/src/commands/updateAttributes.d.ts +0 -13
  209. package/dist/packages/core/src/commands/updateNodeAttributes.d.ts +0 -13
  210. package/dist/packages/core/src/commands/wrapIn.d.ts +0 -13
  211. package/dist/packages/core/src/commands/wrapInList.d.ts +0 -13
  212. package/dist/packages/core/src/extensions/clipboardTextSerializer.d.ts +0 -2
  213. package/dist/packages/core/src/extensions/commands.d.ts +0 -98
  214. package/dist/packages/core/src/extensions/editable.d.ts +0 -2
  215. package/dist/packages/core/src/extensions/focusEvents.d.ts +0 -2
  216. package/dist/packages/core/src/extensions/index.d.ts +0 -5
  217. package/dist/packages/core/src/extensions/keymap.d.ts +0 -2
  218. package/dist/packages/core/src/helpers/createDocument.d.ts +0 -4
  219. package/dist/packages/core/src/helpers/createNodeFromContent.d.ts +0 -8
  220. package/dist/packages/core/src/helpers/findParentNode.d.ts +0 -9
  221. package/dist/packages/core/src/helpers/findParentNodeClosestToPos.d.ts +0 -8
  222. package/dist/packages/core/src/helpers/generateHTML.d.ts +0 -2
  223. package/dist/packages/core/src/helpers/getAttributesFromExtensions.d.ts +0 -6
  224. package/dist/packages/core/src/helpers/getHTMLFromFragment.d.ts +0 -2
  225. package/dist/packages/core/src/helpers/getMarkAttributes.d.ts +0 -4
  226. package/dist/packages/core/src/helpers/getMarkRange.d.ts +0 -3
  227. package/dist/packages/core/src/helpers/getMarkType.d.ts +0 -2
  228. package/dist/packages/core/src/helpers/getMarksBetween.d.ts +0 -3
  229. package/dist/packages/core/src/helpers/getNodeAttributes.d.ts +0 -4
  230. package/dist/packages/core/src/helpers/getNodeType.d.ts +0 -2
  231. package/dist/packages/core/src/helpers/getRenderedAttributes.d.ts +0 -3
  232. package/dist/packages/core/src/helpers/getSchema.d.ts +0 -3
  233. package/dist/packages/core/src/helpers/getSchemaTypeByName.d.ts +0 -2
  234. package/dist/packages/core/src/helpers/getSchemaTypeNameByName.d.ts +0 -2
  235. package/dist/packages/core/src/helpers/getSplittedAttributes.d.ts +0 -2
  236. package/dist/packages/core/src/helpers/injectExtensionAttributesToParseRule.d.ts +0 -9
  237. package/dist/packages/core/src/helpers/isActive.d.ts +0 -3
  238. package/dist/packages/core/src/helpers/isList.d.ts +0 -2
  239. package/dist/packages/core/src/helpers/isMarkActive.d.ts +0 -4
  240. package/dist/packages/core/src/helpers/isNodeActive.d.ts +0 -4
  241. package/dist/packages/core/src/helpers/isNodeEmpty.d.ts +0 -2
  242. package/dist/packages/core/src/helpers/isNodeSelection.d.ts +0 -2
  243. package/dist/packages/core/src/helpers/isTextSelection.d.ts +0 -2
  244. package/dist/packages/core/src/helpers/selectionToInsertionEnd.d.ts +0 -2
  245. package/dist/packages/core/src/helpers/splitExtensions.d.ts +0 -9
  246. package/dist/packages/core/src/index.d.ts +0 -30
  247. package/dist/packages/core/src/inputRules/markInputRule.d.ts +0 -3
  248. package/dist/packages/core/src/inputRules/nodeInputRule.d.ts +0 -3
  249. package/dist/packages/core/src/pasteRules/markPasteRule.d.ts +0 -3
  250. package/dist/packages/core/src/style.d.ts +0 -2
  251. package/dist/packages/core/src/types.d.ts +0 -157
  252. package/dist/packages/core/src/utilities/callOrReturn.d.ts +0 -8
  253. package/dist/packages/core/src/utilities/createStyleTag.d.ts +0 -1
  254. package/dist/packages/core/src/utilities/deleteProps.d.ts +0 -7
  255. package/dist/packages/core/src/utilities/elementFromString.d.ts +0 -1
  256. package/dist/packages/core/src/utilities/fromString.d.ts +0 -1
  257. package/dist/packages/core/src/utilities/isClass.d.ts +0 -1
  258. package/dist/packages/core/src/utilities/isEmptyObject.d.ts +0 -1
  259. package/dist/packages/core/src/utilities/isObject.d.ts +0 -1
  260. package/dist/packages/core/src/utilities/isPlainObject.d.ts +0 -1
  261. package/dist/packages/core/src/utilities/mergeAttributes.d.ts +0 -2
  262. package/dist/packages/core/src/utilities/mergeDeep.d.ts +0 -2
  263. package/dist/packages/core/src/utilities/minMax.d.ts +0 -1
  264. package/dist/packages/core/src/utilities/objectIncludes.d.ts +0 -7
  265. package/dist/packages/core/src/utilities/removeElement.d.ts +0 -1
  266. package/dist/tiptap-core.bundle.umd.min.js +0 -17
  267. package/dist/tiptap-core.bundle.umd.min.js.map +0 -1
  268. package/dist/tiptap-core.cjs.js +0 -3000
  269. package/dist/tiptap-core.cjs.js.map +0 -1
  270. package/dist/tiptap-core.esm.js +0 -2975
  271. package/dist/tiptap-core.esm.js.map +0 -1
  272. package/dist/tiptap-core.umd.js +0 -2997
  273. package/dist/tiptap-core.umd.js.map +0 -1
  274. package/src/commands/insertHTML.ts +0 -30
  275. package/src/commands/insertNode.ts +0 -33
  276. package/src/commands/insertText.ts +0 -22
  277. package/src/commands/replace.ts +0 -20
  278. package/src/commands/replaceRange.ts +0 -36
  279. package/src/commands/resetNodeAttributes.ts +0 -31
  280. package/src/commands/updateNodeAttributes.ts +0 -35
  281. package/src/utilities/isClass.ts +0 -7
  282. package/src/utilities/isObject.ts +0 -10
  283. package/src/utilities/removeElement.ts +0 -5
package/src/Editor.ts CHANGED
@@ -1,28 +1,36 @@
1
+ import { MarkType, NodeType, Schema } from 'prosemirror-model'
1
2
  import {
2
- EditorState, Plugin, PluginKey, Transaction,
3
+ EditorState,
4
+ Plugin,
5
+ PluginKey,
6
+ Transaction,
3
7
  } from 'prosemirror-state'
4
8
  import { EditorView } from 'prosemirror-view'
5
- import { Schema } from 'prosemirror-model'
6
- import getNodeAttributes from './helpers/getNodeAttributes'
7
- import getMarkAttributes from './helpers/getMarkAttributes'
8
- import isActive from './helpers/isActive'
9
- import removeElement from './utilities/removeElement'
10
- import createDocument from './helpers/createDocument'
11
- import getHTMLFromFragment from './helpers/getHTMLFromFragment'
12
- import isNodeEmpty from './helpers/isNodeEmpty'
13
- import createStyleTag from './utilities/createStyleTag'
14
- import CommandManager from './CommandManager'
15
- import ExtensionManager from './ExtensionManager'
16
- import EventEmitter from './EventEmitter'
9
+
10
+ import { CommandManager } from './CommandManager'
11
+ import { EventEmitter } from './EventEmitter'
12
+ import { ExtensionManager } from './ExtensionManager'
13
+ import * as extensions from './extensions'
14
+ import { createDocument } from './helpers/createDocument'
15
+ import { getAttributes } from './helpers/getAttributes'
16
+ import { getHTMLFromFragment } from './helpers/getHTMLFromFragment'
17
+ import { getText } from './helpers/getText'
18
+ import { getTextSerializersFromSchema } from './helpers/getTextSerializersFromSchema'
19
+ import { isActive } from './helpers/isActive'
20
+ import { isNodeEmpty } from './helpers/isNodeEmpty'
21
+ import { resolveFocusPosition } from './helpers/resolveFocusPosition'
22
+ import { style } from './style'
17
23
  import {
18
- EditorOptions,
19
24
  CanCommands,
20
25
  ChainedCommands,
26
+ EditorEvents,
27
+ EditorOptions,
28
+ JSONContent,
21
29
  SingleCommands,
22
- AnyObject,
30
+ TextSerializer,
23
31
  } from './types'
24
- import * as extensions from './extensions'
25
- import style from './style'
32
+ import { createStyleTag } from './utilities/createStyleTag'
33
+ import { isFunction } from './utilities/isFunction'
26
34
 
27
35
  export { extensions }
28
36
 
@@ -30,7 +38,7 @@ export interface HTMLElement {
30
38
  editor?: Editor
31
39
  }
32
40
 
33
- export class Editor extends EventEmitter {
41
+ export class Editor extends EventEmitter<EditorEvents> {
34
42
 
35
43
  private commandManager!: CommandManager
36
44
 
@@ -44,12 +52,13 @@ export class Editor extends EventEmitter {
44
52
 
45
53
  public isFocused = false
46
54
 
47
- private resizeObserver!: ResizeObserver
55
+ public extensionStorage: Record<string, any> = {}
48
56
 
49
57
  public options: EditorOptions = {
50
58
  element: document.createElement('div'),
51
59
  content: '',
52
60
  injectCSS: true,
61
+ injectNonce: undefined,
53
62
  extensions: [],
54
63
  autofocus: false,
55
64
  editable: true,
@@ -57,14 +66,14 @@ export class Editor extends EventEmitter {
57
66
  parseOptions: {},
58
67
  enableInputRules: true,
59
68
  enablePasteRules: true,
69
+ enableCoreExtensions: true,
70
+ onBeforeCreate: () => null,
60
71
  onCreate: () => null,
61
72
  onUpdate: () => null,
62
73
  onSelectionUpdate: () => null,
63
- onViewUpdate: () => null,
64
74
  onTransaction: () => null,
65
75
  onFocus: () => null,
66
76
  onBlur: () => null,
67
- onResize: () => null,
68
77
  onDestroy: () => null,
69
78
  }
70
79
 
@@ -74,50 +83,54 @@ export class Editor extends EventEmitter {
74
83
  this.createExtensionManager()
75
84
  this.createCommandManager()
76
85
  this.createSchema()
86
+ this.on('beforeCreate', this.options.onBeforeCreate)
87
+ this.emit('beforeCreate', { editor: this })
77
88
  this.createView()
78
89
  this.injectCSS()
79
90
  this.on('create', this.options.onCreate)
80
91
  this.on('update', this.options.onUpdate)
81
92
  this.on('selectionUpdate', this.options.onSelectionUpdate)
82
- this.on('viewUpdate', this.options.onViewUpdate)
83
93
  this.on('transaction', this.options.onTransaction)
84
94
  this.on('focus', this.options.onFocus)
85
95
  this.on('blur', this.options.onBlur)
86
96
  this.on('destroy', this.options.onDestroy)
87
97
 
88
98
  window.setTimeout(() => {
99
+ if (this.isDestroyed) {
100
+ return
101
+ }
102
+
89
103
  this.commands.focus(this.options.autofocus)
90
104
  this.emit('create', { editor: this })
91
-
92
- if (window.ResizeObserver) {
93
- this.resizeObserver = new ResizeObserver(() => {
94
- this.emit('resize', { editor: this })
95
- })
96
- this.resizeObserver.observe(this.view.dom)
97
- }
98
105
  }, 0)
106
+ }
99
107
 
108
+ /**
109
+ * Returns the editor storage.
110
+ */
111
+ public get storage(): Record<string, any> {
112
+ return this.extensionStorage
100
113
  }
101
114
 
102
115
  /**
103
116
  * An object of all registered commands.
104
117
  */
105
118
  public get commands(): SingleCommands {
106
- return this.commandManager.createCommands()
119
+ return this.commandManager.commands
107
120
  }
108
121
 
109
122
  /**
110
123
  * Create a command chain to call multiple commands at once.
111
124
  */
112
125
  public chain(): ChainedCommands {
113
- return this.commandManager.createChain()
126
+ return this.commandManager.chain()
114
127
  }
115
128
 
116
129
  /**
117
130
  * Check if a command or a command chain can be executed. Without executing it.
118
131
  */
119
132
  public can(): CanCommands {
120
- return this.commandManager.createCan()
133
+ return this.commandManager.can()
121
134
  }
122
135
 
123
136
  /**
@@ -125,7 +138,7 @@ export class Editor extends EventEmitter {
125
138
  */
126
139
  private injectCSS(): void {
127
140
  if (this.options.injectCSS && document) {
128
- this.css = createStyleTag(style)
141
+ this.css = createStyleTag(style, this.options.injectNonce)
129
142
  }
130
143
  }
131
144
 
@@ -135,7 +148,20 @@ export class Editor extends EventEmitter {
135
148
  * @param options A list of options
136
149
  */
137
150
  public setOptions(options: Partial<EditorOptions> = {}): void {
138
- this.options = { ...this.options, ...options }
151
+ this.options = {
152
+ ...this.options,
153
+ ...options,
154
+ }
155
+
156
+ if (!this.view || !this.state || this.isDestroyed) {
157
+ return
158
+ }
159
+
160
+ if (this.options.editorProps) {
161
+ this.view.setProps(this.options.editorProps)
162
+ }
163
+
164
+ this.view.updateState(this.state)
139
165
  }
140
166
 
141
167
  /**
@@ -143,17 +169,19 @@ export class Editor extends EventEmitter {
143
169
  */
144
170
  public setEditable(editable: boolean): void {
145
171
  this.setOptions({ editable })
146
-
147
- if (this.view && this.state && !this.isDestroyed) {
148
- this.view.updateState(this.state)
149
- }
172
+ this.emit('update', { editor: this, transaction: this.state.tr })
150
173
  }
151
174
 
152
175
  /**
153
176
  * Returns whether the editor is editable.
154
177
  */
155
178
  public get isEditable(): boolean {
156
- return this.view && this.view.editable
179
+ // since plugins are applied after creating the view
180
+ // `editable` is always `true` for one tick.
181
+ // that’s why we also have to check for `options.editable`
182
+ return this.options.editable
183
+ && this.view
184
+ && this.view.editable
157
185
  }
158
186
 
159
187
  /**
@@ -170,8 +198,8 @@ export class Editor extends EventEmitter {
170
198
  * @param handlePlugins Control how to merge the plugin into the existing plugins.
171
199
  */
172
200
  public registerPlugin(plugin: Plugin, handlePlugins?: (newPlugin: Plugin, plugins: Plugin[]) => Plugin[]): void {
173
- const plugins = typeof handlePlugins === 'function'
174
- ? handlePlugins(plugin, this.state.plugins)
201
+ const plugins = isFunction(handlePlugins)
202
+ ? handlePlugins(plugin, [...this.state.plugins])
175
203
  : [...this.state.plugins, plugin]
176
204
 
177
205
  const state = this.state.reconfigure({ plugins })
@@ -182,7 +210,7 @@ export class Editor extends EventEmitter {
182
210
  /**
183
211
  * Unregister a ProseMirror plugin.
184
212
  *
185
- * @param name The plugins name
213
+ * @param nameOrPluginKey The plugins name
186
214
  */
187
215
  public unregisterPlugin(nameOrPluginKey: string | PluginKey): void {
188
216
  if (this.isDestroyed) {
@@ -206,7 +234,9 @@ export class Editor extends EventEmitter {
206
234
  * Creates an extension manager.
207
235
  */
208
236
  private createExtensionManager(): void {
209
- const coreExtensions = Object.entries(extensions).map(([, extension]) => extension)
237
+ const coreExtensions = this.options.enableCoreExtensions
238
+ ? Object.values(extensions)
239
+ : []
210
240
  const allExtensions = [...coreExtensions, ...this.options.extensions].filter(extension => {
211
241
  return ['extension', 'node', 'mark'].includes(extension?.type)
212
242
  })
@@ -218,7 +248,9 @@ export class Editor extends EventEmitter {
218
248
  * Creates an command manager.
219
249
  */
220
250
  private createCommandManager(): void {
221
- this.commandManager = new CommandManager(this, this.extensionManager.commands)
251
+ this.commandManager = new CommandManager({
252
+ editor: this,
253
+ })
222
254
  }
223
255
 
224
256
  /**
@@ -232,27 +264,22 @@ export class Editor extends EventEmitter {
232
264
  * Creates a ProseMirror view.
233
265
  */
234
266
  private createView(): void {
267
+ const doc = createDocument(this.options.content, this.schema, this.options.parseOptions)
268
+ const selection = resolveFocusPosition(doc, this.options.autofocus)
269
+
235
270
  this.view = new EditorView(this.options.element, {
236
271
  ...this.options.editorProps,
237
272
  dispatchTransaction: this.dispatchTransaction.bind(this),
238
273
  state: EditorState.create({
239
- doc: createDocument(this.options.content, this.schema, this.options.parseOptions),
274
+ doc,
275
+ selection: selection || undefined,
240
276
  }),
241
277
  })
242
278
 
243
279
  // `editor.view` is not yet available at this time.
244
280
  // Therefore we will add all plugins and node views directly afterwards.
245
281
  const newState = this.state.reconfigure({
246
- plugins: [
247
- new Plugin({
248
- view: () => ({
249
- update: () => this.emit('viewUpdate', {
250
- editor: this,
251
- }),
252
- }),
253
- }),
254
- ...this.extensionManager.plugins,
255
- ],
282
+ plugins: this.extensionManager.plugins,
256
283
  })
257
284
 
258
285
  this.view.updateState(newState)
@@ -262,6 +289,7 @@ export class Editor extends EventEmitter {
262
289
  // Let’s store the editor instance in the DOM element.
263
290
  // So we’ll have access to it for tests.
264
291
  const dom = this.view.dom as HTMLElement
292
+
265
293
  dom.editor = this
266
294
  }
267
295
 
@@ -296,10 +324,6 @@ export class Editor extends EventEmitter {
296
324
  * @param transaction An editor state transaction
297
325
  */
298
326
  private dispatchTransaction(transaction: Transaction): void {
299
- if (transaction.docChanged && !this.isEditable) {
300
- return
301
- }
302
-
303
327
  if (this.isCapturingTransaction) {
304
328
  if (!this.capturedTransaction) {
305
329
  this.capturedTransaction = transaction
@@ -324,6 +348,7 @@ export class Editor extends EventEmitter {
324
348
  if (selectionHasChanged) {
325
349
  this.emit('selectionUpdate', {
326
350
  editor: this,
351
+ transaction,
327
352
  })
328
353
  }
329
354
 
@@ -334,6 +359,7 @@ export class Editor extends EventEmitter {
334
359
  this.emit('focus', {
335
360
  editor: this,
336
361
  event: focus.event,
362
+ transaction,
337
363
  })
338
364
  }
339
365
 
@@ -341,6 +367,7 @@ export class Editor extends EventEmitter {
341
367
  this.emit('blur', {
342
368
  editor: this,
343
369
  event: blur.event,
370
+ transaction,
344
371
  })
345
372
  }
346
373
 
@@ -355,21 +382,10 @@ export class Editor extends EventEmitter {
355
382
  }
356
383
 
357
384
  /**
358
- * Get attributes of the currently selected node.
359
- *
360
- * @param name Name of the node
385
+ * Get attributes of the currently selected node or mark.
361
386
  */
362
- public getNodeAttributes(name: string): AnyObject {
363
- return getNodeAttributes(this.state, name)
364
- }
365
-
366
- /**
367
- * Get attributes of the currently selected mark.
368
- *
369
- * @param name Name of the mark
370
- */
371
- public getMarkAttributes(name: string): AnyObject {
372
- return getMarkAttributes(this.state, name)
387
+ public getAttributes(nameOrType: string | NodeType | MarkType): Record<string, any> {
388
+ return getAttributes(this.state, nameOrType)
373
389
  }
374
390
 
375
391
  /**
@@ -395,7 +411,7 @@ export class Editor extends EventEmitter {
395
411
  /**
396
412
  * Get the document as JSON.
397
413
  */
398
- public getJSON(): AnyObject {
414
+ public getJSON(): JSONContent {
399
415
  return this.state.doc.toJSON()
400
416
  }
401
417
 
@@ -403,7 +419,28 @@ export class Editor extends EventEmitter {
403
419
  * Get the document as HTML.
404
420
  */
405
421
  public getHTML(): string {
406
- return getHTMLFromFragment(this.state.doc, this.schema)
422
+ return getHTMLFromFragment(this.state.doc.content, this.schema)
423
+ }
424
+
425
+ /**
426
+ * Get the document as text.
427
+ */
428
+ public getText(options?: {
429
+ blockSeparator?: string,
430
+ textSerializers?: Record<string, TextSerializer>,
431
+ }): string {
432
+ const {
433
+ blockSeparator = '\n\n',
434
+ textSerializers = {},
435
+ } = options || {}
436
+
437
+ return getText(this.state.doc, {
438
+ blockSeparator,
439
+ textSerializers: {
440
+ ...textSerializers,
441
+ ...getTextSerializersFromSchema(this.schema),
442
+ },
443
+ })
407
444
  }
408
445
 
409
446
  /**
@@ -415,8 +452,12 @@ export class Editor extends EventEmitter {
415
452
 
416
453
  /**
417
454
  * Get the number of characters for the current document.
455
+ *
456
+ * @deprecated
418
457
  */
419
458
  public getCharacterCount(): number {
459
+ console.warn('[tiptap warn]: "editor.getCharacterCount()" is deprecated. Please use "editor.storage.characterCount.characters()" instead.')
460
+
420
461
  return this.state.doc.content.size - 2
421
462
  }
422
463
 
@@ -424,8 +465,6 @@ export class Editor extends EventEmitter {
424
465
  * Destroy the editor.
425
466
  */
426
467
  public destroy(): void {
427
- this.resizeObserver?.unobserve(this.view.dom)
428
-
429
468
  this.emit('destroy')
430
469
 
431
470
  if (this.view) {
@@ -433,7 +472,6 @@ export class Editor extends EventEmitter {
433
472
  }
434
473
 
435
474
  this.removeAllListeners()
436
- removeElement(this.css)
437
475
  }
438
476
 
439
477
  /**
@@ -1,8 +1,18 @@
1
- export default class EventEmitter {
1
+ type StringKeyOf<T> = Extract<keyof T, string>
2
+ type CallbackType<
3
+ T extends Record<string, any>,
4
+ EventName extends StringKeyOf<T>,
5
+ > = T[EventName] extends any[] ? T[EventName] : [T[EventName]]
6
+ type CallbackFunction<
7
+ T extends Record<string, any>,
8
+ EventName extends StringKeyOf<T>,
9
+ > = (...props: CallbackType<T, EventName>) => any
10
+
11
+ export class EventEmitter<T extends Record<string, any>> {
2
12
 
3
13
  private callbacks: { [key: string]: Function[] } = {}
4
14
 
5
- public on(event: string, fn: Function): this {
15
+ public on<EventName extends StringKeyOf<T>>(event: EventName, fn: CallbackFunction<T, EventName>): this {
6
16
  if (!this.callbacks[event]) {
7
17
  this.callbacks[event] = []
8
18
  }
@@ -12,7 +22,7 @@ export default class EventEmitter {
12
22
  return this
13
23
  }
14
24
 
15
- protected emit(event: string, ...args: any): this {
25
+ protected emit<EventName extends StringKeyOf<T>>(event: EventName, ...args: CallbackType<T, EventName>): this {
16
26
  const callbacks = this.callbacks[event]
17
27
 
18
28
  if (callbacks) {
@@ -22,7 +32,7 @@ export default class EventEmitter {
22
32
  return this
23
33
  }
24
34
 
25
- public off(event: string, fn?: Function): this {
35
+ public off<EventName extends StringKeyOf<T>>(event: EventName, fn?: CallbackFunction<T, EventName>): this {
26
36
  const callbacks = this.callbacks[event]
27
37
 
28
38
  if (callbacks) {