@tiptap/core 3.0.0-next.4 → 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.
- package/LICENSE.md +1 -1
- package/dist/index.cjs +352 -238
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1084 -1431
- package/dist/index.d.ts +1084 -1431
- package/dist/index.js +344 -235
- package/dist/index.js.map +1 -1
- package/dist/jsx-runtime/jsx-runtime.cjs +56 -0
- package/dist/jsx-runtime/jsx-runtime.cjs.map +1 -0
- package/dist/jsx-runtime/jsx-runtime.d.cts +22 -0
- package/dist/jsx-runtime/jsx-runtime.d.ts +22 -0
- package/dist/jsx-runtime/jsx-runtime.js +26 -0
- package/dist/jsx-runtime/jsx-runtime.js.map +1 -0
- package/jsx-runtime/index.cjs +1 -0
- package/jsx-runtime/index.d.cts +1 -0
- package/jsx-runtime/index.d.ts +1 -0
- package/jsx-runtime/index.js +1 -0
- package/package.json +20 -3
- package/src/Editor.ts +104 -22
- package/src/Extendable.ts +483 -0
- package/src/Extension.ts +5 -490
- package/src/ExtensionManager.ts +55 -10
- package/src/Mark.ts +135 -623
- package/src/MarkView.ts +66 -0
- package/src/Node.ts +325 -829
- package/src/commands/clearContent.ts +9 -4
- package/src/commands/focus.ts +7 -1
- package/src/commands/insertContentAt.ts +6 -2
- package/src/commands/setContent.ts +15 -14
- package/src/extensions/delete.ts +89 -0
- package/src/extensions/index.ts +1 -0
- package/src/extensions/keymap.ts +4 -0
- package/src/helpers/getExtensionField.ts +10 -7
- package/src/index.ts +3 -7
- package/src/jsx-runtime.ts +64 -0
- package/src/types.ts +334 -19
- package/src/utilities/elementFromString.ts +3 -0
- package/src/utilities/index.ts +1 -0
- package/src/utilities/mergeAttributes.ts +1 -1
|
@@ -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
|
+
}
|