@tiptap/core 3.0.0-next.3 → 3.0.0-next.5

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 (146) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +5 -1
  3. package/dist/index.cjs +2627 -2651
  4. package/dist/index.cjs.map +1 -1
  5. package/dist/index.d.cts +2423 -2688
  6. package/dist/index.d.ts +2423 -2688
  7. package/dist/index.js +2639 -2684
  8. package/dist/index.js.map +1 -1
  9. package/dist/jsx-runtime/jsx-runtime.cjs +56 -0
  10. package/dist/jsx-runtime/jsx-runtime.cjs.map +1 -0
  11. package/dist/jsx-runtime/jsx-runtime.d.cts +22 -0
  12. package/dist/jsx-runtime/jsx-runtime.d.ts +22 -0
  13. package/dist/jsx-runtime/jsx-runtime.js +26 -0
  14. package/dist/jsx-runtime/jsx-runtime.js.map +1 -0
  15. package/jsx-runtime/index.cjs +1 -0
  16. package/jsx-runtime/index.d.cts +1 -0
  17. package/jsx-runtime/index.d.ts +1 -0
  18. package/jsx-runtime/index.js +1 -0
  19. package/package.json +27 -6
  20. package/src/CommandManager.ts +2 -9
  21. package/src/Editor.ts +191 -94
  22. package/src/EventEmitter.ts +7 -10
  23. package/src/Extendable.ts +483 -0
  24. package/src/Extension.ts +5 -496
  25. package/src/ExtensionManager.ts +81 -135
  26. package/src/InputRule.ts +35 -48
  27. package/src/Mark.ts +135 -623
  28. package/src/MarkView.ts +66 -0
  29. package/src/Node.ts +325 -829
  30. package/src/NodePos.ts +1 -3
  31. package/src/NodeView.ts +10 -20
  32. package/src/PasteRule.ts +43 -55
  33. package/src/Tracker.ts +7 -9
  34. package/src/commands/blur.ts +14 -12
  35. package/src/commands/clearContent.ts +12 -5
  36. package/src/commands/clearNodes.ts +32 -30
  37. package/src/commands/command.ts +1 -1
  38. package/src/commands/createParagraphNear.ts +5 -3
  39. package/src/commands/cut.ts +12 -10
  40. package/src/commands/deleteCurrentNode.ts +23 -21
  41. package/src/commands/deleteNode.ts +18 -16
  42. package/src/commands/deleteRange.ts +10 -8
  43. package/src/commands/deleteSelection.ts +5 -3
  44. package/src/commands/enter.ts +6 -4
  45. package/src/commands/exitCode.ts +5 -3
  46. package/src/commands/extendMarkRange.ts +14 -12
  47. package/src/commands/first.ts +2 -4
  48. package/src/commands/focus.ts +51 -48
  49. package/src/commands/forEach.ts +2 -2
  50. package/src/commands/insertContent.ts +12 -14
  51. package/src/commands/insertContentAt.ts +105 -98
  52. package/src/commands/join.ts +20 -12
  53. package/src/commands/joinItemBackward.ts +16 -18
  54. package/src/commands/joinItemForward.ts +16 -18
  55. package/src/commands/joinTextblockBackward.ts +5 -3
  56. package/src/commands/joinTextblockForward.ts +5 -3
  57. package/src/commands/keyboardShortcut.ts +29 -34
  58. package/src/commands/lift.ts +10 -8
  59. package/src/commands/liftEmptyBlock.ts +6 -4
  60. package/src/commands/liftListItem.ts +6 -4
  61. package/src/commands/newlineInCode.ts +5 -3
  62. package/src/commands/resetAttributes.ts +36 -41
  63. package/src/commands/scrollIntoView.ts +9 -7
  64. package/src/commands/selectAll.ts +10 -8
  65. package/src/commands/selectNodeBackward.ts +5 -3
  66. package/src/commands/selectNodeForward.ts +5 -3
  67. package/src/commands/selectParentNode.ts +5 -3
  68. package/src/commands/selectTextblockEnd.ts +5 -3
  69. package/src/commands/selectTextblockStart.ts +5 -3
  70. package/src/commands/setContent.ts +37 -36
  71. package/src/commands/setMark.ts +55 -57
  72. package/src/commands/setMeta.ts +7 -5
  73. package/src/commands/setNode.ts +32 -30
  74. package/src/commands/setNodeSelection.ts +11 -9
  75. package/src/commands/setTextSelection.ts +15 -13
  76. package/src/commands/sinkListItem.ts +6 -4
  77. package/src/commands/splitBlock.ts +67 -76
  78. package/src/commands/splitListItem.ts +93 -106
  79. package/src/commands/toggleList.ts +73 -71
  80. package/src/commands/toggleMark.ts +11 -9
  81. package/src/commands/toggleNode.ts +18 -16
  82. package/src/commands/toggleWrap.ts +10 -8
  83. package/src/commands/undoInputRule.ts +31 -29
  84. package/src/commands/unsetAllMarks.ts +16 -14
  85. package/src/commands/unsetMark.ts +27 -25
  86. package/src/commands/updateAttributes.ts +92 -100
  87. package/src/commands/wrapIn.ts +6 -4
  88. package/src/commands/wrapInList.ts +6 -4
  89. package/src/extensions/clipboardTextSerializer.ts +2 -4
  90. package/src/extensions/delete.ts +89 -0
  91. package/src/extensions/focusEvents.ts +2 -6
  92. package/src/extensions/index.ts +1 -0
  93. package/src/extensions/keymap.ts +58 -50
  94. package/src/extensions/paste.ts +0 -1
  95. package/src/extensions/tabindex.ts +1 -1
  96. package/src/helpers/combineTransactionSteps.ts +1 -4
  97. package/src/helpers/createChainableState.ts +1 -4
  98. package/src/helpers/createDocument.ts +1 -3
  99. package/src/helpers/createNodeFromContent.ts +4 -10
  100. package/src/helpers/findChildrenInRange.ts +1 -5
  101. package/src/helpers/findParentNode.ts +3 -1
  102. package/src/helpers/flattenExtensions.ts +30 -0
  103. package/src/helpers/getAttributes.ts +1 -4
  104. package/src/helpers/getAttributesFromExtensions.ts +28 -37
  105. package/src/helpers/getChangedRanges.ts +13 -11
  106. package/src/helpers/getExtensionField.ts +11 -11
  107. package/src/helpers/getMarkAttributes.ts +1 -4
  108. package/src/helpers/getMarkRange.ts +5 -15
  109. package/src/helpers/getMarkType.ts +1 -3
  110. package/src/helpers/getNodeAttributes.ts +1 -4
  111. package/src/helpers/getNodeType.ts +1 -3
  112. package/src/helpers/getRenderedAttributes.ts +1 -3
  113. package/src/helpers/getSchema.ts +2 -2
  114. package/src/helpers/getSchemaByResolvedExtensions.ts +45 -77
  115. package/src/helpers/getSplittedAttributes.ts +4 -4
  116. package/src/helpers/getTextContentFromNodes.ts +8 -11
  117. package/src/helpers/index.ts +4 -0
  118. package/src/helpers/injectExtensionAttributesToParseRule.ts +1 -1
  119. package/src/helpers/isActive.ts +1 -5
  120. package/src/helpers/isExtensionRulesEnabled.ts +1 -3
  121. package/src/helpers/isNodeEmpty.ts +2 -2
  122. package/src/helpers/resolveExtensions.ts +25 -0
  123. package/src/helpers/resolveFocusPosition.ts +3 -14
  124. package/src/helpers/rewriteUnknownContent.ts +149 -0
  125. package/src/helpers/sortExtensions.ts +26 -0
  126. package/src/index.ts +3 -7
  127. package/src/inputRules/markInputRule.ts +1 -5
  128. package/src/inputRules/nodeInputRule.ts +2 -9
  129. package/src/inputRules/textInputRule.ts +1 -4
  130. package/src/inputRules/textblockTypeInputRule.ts +2 -8
  131. package/src/inputRules/wrappingInputRule.ts +13 -19
  132. package/src/jsx-runtime.ts +64 -0
  133. package/src/pasteRules/markPasteRule.ts +1 -3
  134. package/src/pasteRules/nodePasteRule.ts +2 -8
  135. package/src/pasteRules/textPasteRule.ts +1 -4
  136. package/src/types.ts +529 -174
  137. package/src/utilities/createStyleTag.ts +3 -1
  138. package/src/utilities/deleteProps.ts +7 -11
  139. package/src/utilities/elementFromString.ts +3 -0
  140. package/src/utilities/findDuplicates.ts +4 -1
  141. package/src/utilities/index.ts +1 -0
  142. package/src/utilities/isFunction.ts +1 -0
  143. package/src/utilities/isMacOS.ts +1 -3
  144. package/src/utilities/isiOS.ts +5 -10
  145. package/src/utilities/mergeAttributes.ts +17 -7
  146. package/src/utilities/removeDuplicates.ts +1 -3
@@ -0,0 +1,483 @@
1
+ import type { Plugin } from '@tiptap/pm/state'
2
+
3
+ import type { Editor } from './Editor.js'
4
+ import { getExtensionField } from './helpers/getExtensionField.js'
5
+ import { ExtensionConfig, MarkConfig, NodeConfig } from './index.js'
6
+ import type { InputRule } from './InputRule.js'
7
+ import type { Mark } from './Mark.js'
8
+ import type { Node } from './Node.js'
9
+ import type { PasteRule } from './PasteRule.js'
10
+ import type {
11
+ EditorEvents,
12
+ Extensions,
13
+ GlobalAttributes,
14
+ KeyboardShortcutCommand,
15
+ ParentConfig,
16
+ RawCommands,
17
+ } from './types.js'
18
+ import { AnyConfig } from './types.js'
19
+ import { callOrReturn } from './utilities/callOrReturn.js'
20
+ import { mergeDeep } from './utilities/mergeDeep.js'
21
+
22
+ export interface ExtendableConfig<
23
+ Options = any,
24
+ Storage = any,
25
+ Config extends
26
+ | ExtensionConfig<Options, Storage>
27
+ | NodeConfig<Options, Storage>
28
+ | MarkConfig<Options, Storage>
29
+ | ExtendableConfig<Options, Storage> = ExtendableConfig<Options, Storage, any, any>,
30
+ PMType = any,
31
+ > {
32
+ /**
33
+ * The extension name - this must be unique.
34
+ * It will be used to identify the extension.
35
+ *
36
+ * @example 'myExtension'
37
+ */
38
+ name: string
39
+
40
+ /**
41
+ * The priority of your extension. The higher, the earlier it will be called
42
+ * and will take precedence over other extensions with a lower priority.
43
+ * @default 100
44
+ * @example 101
45
+ */
46
+ priority?: number
47
+
48
+ /**
49
+ * This method will add options to this extension
50
+ * @see https://tiptap.dev/docs/editor/guide/custom-extensions#settings
51
+ * @example
52
+ * addOptions() {
53
+ * return {
54
+ * myOption: 'foo',
55
+ * myOtherOption: 10,
56
+ * }
57
+ */
58
+ addOptions?: (this: { name: string; parent: ParentConfig<Config>['addOptions'] }) => Options
59
+
60
+ /**
61
+ * The default storage this extension can save data to.
62
+ * @see https://tiptap.dev/docs/editor/guide/custom-extensions#storage
63
+ * @example
64
+ * defaultStorage: {
65
+ * prefetchedUsers: [],
66
+ * loading: false,
67
+ * }
68
+ */
69
+ addStorage?: (this: { name: string; options: Options; parent: ParentConfig<Config>['addStorage'] }) => Storage
70
+
71
+ /**
72
+ * This function adds globalAttributes to specific nodes.
73
+ * @see https://tiptap.dev/docs/editor/guide/custom-extensions#global-attributes
74
+ * @example
75
+ * addGlobalAttributes() {
76
+ * return [
77
+ * {
78
+ // Extend the following extensions
79
+ * types: [
80
+ * 'heading',
81
+ * 'paragraph',
82
+ * ],
83
+ * // … with those attributes
84
+ * attributes: {
85
+ * textAlign: {
86
+ * default: 'left',
87
+ * renderHTML: attributes => ({
88
+ * style: `text-align: ${attributes.textAlign}`,
89
+ * }),
90
+ * parseHTML: element => element.style.textAlign || 'left',
91
+ * },
92
+ * },
93
+ * },
94
+ * ]
95
+ * }
96
+ */
97
+ addGlobalAttributes?: (this: {
98
+ name: string
99
+ options: Options
100
+ storage: Storage
101
+ extensions: (Node | Mark)[]
102
+ parent: ParentConfig<Config>['addGlobalAttributes']
103
+ }) => GlobalAttributes
104
+
105
+ /**
106
+ * This function adds commands to the editor
107
+ * @see https://tiptap.dev/docs/editor/guide/custom-extensions#commands
108
+ * @example
109
+ * addCommands() {
110
+ * return {
111
+ * myCommand: () => ({ chain }) => chain().setMark('type', 'foo').run(),
112
+ * }
113
+ * }
114
+ */
115
+ addCommands?: (this: {
116
+ name: string
117
+ options: Options
118
+ storage: Storage
119
+ editor: Editor
120
+ type: PMType
121
+ parent: ParentConfig<Config>['addCommands']
122
+ }) => Partial<RawCommands>
123
+
124
+ /**
125
+ * This function registers keyboard shortcuts.
126
+ * @see https://tiptap.dev/docs/editor/guide/custom-extensions#keyboard-shortcuts
127
+ * @example
128
+ * addKeyboardShortcuts() {
129
+ * return {
130
+ * 'Mod-l': () => this.editor.commands.toggleBulletList(),
131
+ * }
132
+ * },
133
+ */
134
+ addKeyboardShortcuts?: (this: {
135
+ name: string
136
+ options: Options
137
+ storage: Storage
138
+ editor: Editor
139
+ type: PMType
140
+ parent: ParentConfig<Config>['addKeyboardShortcuts']
141
+ }) => {
142
+ [key: string]: KeyboardShortcutCommand
143
+ }
144
+
145
+ /**
146
+ * This function adds input rules to the editor.
147
+ * @see https://tiptap.dev/docs/editor/guide/custom-extensions#input-rules
148
+ * @example
149
+ * addInputRules() {
150
+ * return [
151
+ * markInputRule({
152
+ * find: inputRegex,
153
+ * type: this.type,
154
+ * }),
155
+ * ]
156
+ * },
157
+ */
158
+ addInputRules?: (this: {
159
+ name: string
160
+ options: Options
161
+ storage: Storage
162
+ editor: Editor
163
+ type: PMType
164
+ parent: ParentConfig<Config>['addInputRules']
165
+ }) => InputRule[]
166
+
167
+ /**
168
+ * This function adds paste rules to the editor.
169
+ * @see https://tiptap.dev/docs/editor/guide/custom-extensions#paste-rules
170
+ * @example
171
+ * addPasteRules() {
172
+ * return [
173
+ * markPasteRule({
174
+ * find: pasteRegex,
175
+ * type: this.type,
176
+ * }),
177
+ * ]
178
+ * },
179
+ */
180
+ addPasteRules?: (this: {
181
+ name: string
182
+ options: Options
183
+ storage: Storage
184
+ editor: Editor
185
+ type: PMType
186
+ parent: ParentConfig<Config>['addPasteRules']
187
+ }) => PasteRule[]
188
+
189
+ /**
190
+ * This function adds Prosemirror plugins to the editor
191
+ * @see https://tiptap.dev/docs/editor/guide/custom-extensions#prosemirror-plugins
192
+ * @example
193
+ * addProseMirrorPlugins() {
194
+ * return [
195
+ * customPlugin(),
196
+ * ]
197
+ * }
198
+ */
199
+ addProseMirrorPlugins?: (this: {
200
+ name: string
201
+ options: Options
202
+ storage: Storage
203
+ editor: Editor
204
+ type: PMType
205
+ parent: ParentConfig<Config>['addProseMirrorPlugins']
206
+ }) => Plugin[]
207
+
208
+ /**
209
+ * This function adds additional extensions to the editor. This is useful for
210
+ * building extension kits.
211
+ * @example
212
+ * addExtensions() {
213
+ * return [
214
+ * BulletList,
215
+ * OrderedList,
216
+ * ListItem
217
+ * ]
218
+ * }
219
+ */
220
+ addExtensions?: (this: {
221
+ name: string
222
+ options: Options
223
+ storage: Storage
224
+ parent: ParentConfig<Config>['addExtensions']
225
+ }) => Extensions
226
+
227
+ /**
228
+ * This function extends the schema of the node.
229
+ * @example
230
+ * extendNodeSchema() {
231
+ * return {
232
+ * group: 'inline',
233
+ * selectable: false,
234
+ * }
235
+ * }
236
+ */
237
+ extendNodeSchema?:
238
+ | ((
239
+ this: {
240
+ name: string
241
+ options: Options
242
+ storage: Storage
243
+ parent: ParentConfig<Config>['extendNodeSchema']
244
+ },
245
+ extension: Node,
246
+ ) => Record<string, any>)
247
+ | null
248
+
249
+ /**
250
+ * This function extends the schema of the mark.
251
+ * @example
252
+ * extendMarkSchema() {
253
+ * return {
254
+ * group: 'inline',
255
+ * selectable: false,
256
+ * }
257
+ * }
258
+ */
259
+ extendMarkSchema?:
260
+ | ((
261
+ this: {
262
+ name: string
263
+ options: Options
264
+ storage: Storage
265
+ parent: ParentConfig<Config>['extendMarkSchema']
266
+ },
267
+ extension: Mark,
268
+ ) => Record<string, any>)
269
+ | null
270
+
271
+ /**
272
+ * The editor is not ready yet.
273
+ */
274
+ onBeforeCreate?:
275
+ | ((
276
+ this: {
277
+ name: string
278
+ options: Options
279
+ storage: Storage
280
+ editor: Editor
281
+ type: PMType
282
+ parent: ParentConfig<Config>['onBeforeCreate']
283
+ },
284
+ event: EditorEvents['beforeCreate'],
285
+ ) => void)
286
+ | null
287
+
288
+ /**
289
+ * The editor is ready.
290
+ */
291
+ onCreate?:
292
+ | ((
293
+ this: {
294
+ name: string
295
+ options: Options
296
+ storage: Storage
297
+ editor: Editor
298
+ type: PMType
299
+ parent: ParentConfig<Config>['onCreate']
300
+ },
301
+ event: EditorEvents['create'],
302
+ ) => void)
303
+ | null
304
+
305
+ /**
306
+ * The content has changed.
307
+ */
308
+ onUpdate?:
309
+ | ((
310
+ this: {
311
+ name: string
312
+ options: Options
313
+ storage: Storage
314
+ editor: Editor
315
+ type: PMType
316
+ parent: ParentConfig<Config>['onUpdate']
317
+ },
318
+ event: EditorEvents['update'],
319
+ ) => void)
320
+ | null
321
+
322
+ /**
323
+ * The selection has changed.
324
+ */
325
+ onSelectionUpdate?:
326
+ | ((
327
+ this: {
328
+ name: string
329
+ options: Options
330
+ storage: Storage
331
+ editor: Editor
332
+ type: PMType
333
+ parent: ParentConfig<Config>['onSelectionUpdate']
334
+ },
335
+ event: EditorEvents['selectionUpdate'],
336
+ ) => void)
337
+ | null
338
+
339
+ /**
340
+ * The editor state has changed.
341
+ */
342
+ onTransaction?:
343
+ | ((
344
+ this: {
345
+ name: string
346
+ options: Options
347
+ storage: Storage
348
+ editor: Editor
349
+ type: PMType
350
+ parent: ParentConfig<Config>['onTransaction']
351
+ },
352
+ event: EditorEvents['transaction'],
353
+ ) => void)
354
+ | null
355
+
356
+ /**
357
+ * The editor is focused.
358
+ */
359
+ onFocus?:
360
+ | ((
361
+ this: {
362
+ name: string
363
+ options: Options
364
+ storage: Storage
365
+ editor: Editor
366
+ type: PMType
367
+ parent: ParentConfig<Config>['onFocus']
368
+ },
369
+ event: EditorEvents['focus'],
370
+ ) => void)
371
+ | null
372
+
373
+ /**
374
+ * The editor isn’t focused anymore.
375
+ */
376
+ onBlur?:
377
+ | ((
378
+ this: {
379
+ name: string
380
+ options: Options
381
+ storage: Storage
382
+ editor: Editor
383
+ type: PMType
384
+ parent: ParentConfig<Config>['onBlur']
385
+ },
386
+ event: EditorEvents['blur'],
387
+ ) => void)
388
+ | null
389
+
390
+ /**
391
+ * The editor is destroyed.
392
+ */
393
+ onDestroy?:
394
+ | ((
395
+ this: {
396
+ name: string
397
+ options: Options
398
+ storage: Storage
399
+ editor: Editor
400
+ type: PMType
401
+ parent: ParentConfig<Config>['onDestroy']
402
+ },
403
+ event: EditorEvents['destroy'],
404
+ ) => void)
405
+ | null
406
+ }
407
+
408
+ export class Extendable<
409
+ Options = any,
410
+ Storage = any,
411
+ Config = ExtensionConfig<Options, Storage> | NodeConfig<Options, Storage> | MarkConfig<Options, Storage>,
412
+ > {
413
+ type = 'extendable'
414
+ parent: Extendable | null = null
415
+
416
+ child: Extendable | null = null
417
+
418
+ name = ''
419
+
420
+ config: Config = {
421
+ name: this.name,
422
+ } as Config
423
+
424
+ constructor(config: Partial<Config> = {}) {
425
+ this.config = {
426
+ ...this.config,
427
+ ...config,
428
+ }
429
+
430
+ this.name = (this.config as any).name
431
+ }
432
+
433
+ get options(): Options {
434
+ return {
435
+ ...(callOrReturn(
436
+ getExtensionField<AnyConfig['addOptions']>(this as any, 'addOptions', {
437
+ name: this.name,
438
+ }),
439
+ ) || {}),
440
+ }
441
+ }
442
+
443
+ get storage(): Readonly<Storage> {
444
+ return {
445
+ ...(callOrReturn(
446
+ getExtensionField<AnyConfig['addStorage']>(this as any, 'addStorage', {
447
+ name: this.name,
448
+ options: this.options,
449
+ }),
450
+ ) || {}),
451
+ }
452
+ }
453
+
454
+ configure(options: Partial<Options> = {}) {
455
+ const extension = this.extend<Options, Storage>({
456
+ ...this.config,
457
+ addOptions: () => {
458
+ return mergeDeep(this.options as Record<string, any>, options) as Options
459
+ },
460
+ })
461
+
462
+ extension.name = this.name
463
+ extension.parent = this.parent
464
+
465
+ return extension
466
+ }
467
+
468
+ extend<ExtendedOptions = Options, ExtendedStorage = Storage>(
469
+ extendedConfig: Partial<
470
+ | ExtensionConfig<ExtendedOptions, ExtendedStorage>
471
+ | NodeConfig<ExtendedOptions, ExtendedStorage>
472
+ | MarkConfig<ExtendedOptions, ExtendedStorage>
473
+ > = {},
474
+ ): Extendable<ExtendedOptions, ExtendedStorage> {
475
+ const extension = new (this.constructor as any)({ ...this.config, ...extendedConfig })
476
+
477
+ extension.parent = this
478
+ this.child = extension
479
+ extension.name = extendedConfig.name ? extendedConfig.name : extension.parent.name
480
+
481
+ return extension
482
+ }
483
+ }