From 8cbeca320a0fdb73415f4a77f3ab37807f348ad9 Mon Sep 17 00:00:00 2001 From: Dominik Biedebach <6538827+bdbch@users.noreply.github.com> Date: Wed, 30 Sep 2026 14:41:08 +0200 Subject: [PATCH 1/3] fix(collaboration): restore input rule markers on undo (#8415) * fix(collaboration): restore input rule markers on undo * chore: fix demo HTML formatting * fix(core): preserve input rule history metadata --- .../2026-09-29-restore-input-rule-markers.md | 6 + .../InputRuleUndo/React/index.html | 0 .../Experiments/InputRuleUndo/React/index.tsx | 65 ++++++ packages/core/src/InputRule.ts | 200 +++++++++++------- packages/extension-collaboration/package.json | 3 +- .../src/collaboration.ts | 9 + .../tests/integration/inputRuleUndo.test.ts | 160 ++++++++++++++ pnpm-lock.yaml | 3 + 8 files changed, 373 insertions(+), 73 deletions(-) create mode 100644 .changeset/2026-09-29-restore-input-rule-markers.md create mode 100644 demos/src/Experiments/InputRuleUndo/React/index.html create mode 100644 demos/src/Experiments/InputRuleUndo/React/index.tsx create mode 100644 packages/extension-collaboration/tests/integration/inputRuleUndo.test.ts diff --git a/.changeset/2026-09-29-restore-input-rule-markers.md b/.changeset/2026-09-29-restore-input-rule-markers.md new file mode 100644 index 0000000000..85474120ec --- /dev/null +++ b/.changeset/2026-09-29-restore-input-rule-markers.md @@ -0,0 +1,6 @@ +--- +'@tiptap/core': patch +'@tiptap/extension-collaboration': patch +--- + +Undoing an input rule restores the Markdown characters that triggered it when using Collaboration. diff --git a/demos/src/Experiments/InputRuleUndo/React/index.html b/demos/src/Experiments/InputRuleUndo/React/index.html new file mode 100644 index 0000000000..e69de29bb2 diff --git a/demos/src/Experiments/InputRuleUndo/React/index.tsx b/demos/src/Experiments/InputRuleUndo/React/index.tsx new file mode 100644 index 0000000000..d714bc666a --- /dev/null +++ b/demos/src/Experiments/InputRuleUndo/React/index.tsx @@ -0,0 +1,65 @@ +import { Extension, InputRule } from '@tiptap/core' +import Collaboration from '@tiptap/extension-collaboration' +import Document from '@tiptap/extension-document' +import { BulletList, ListItem } from '@tiptap/extension-list' +import Paragraph from '@tiptap/extension-paragraph' +import Text from '@tiptap/extension-text' +import { EditorContent, useEditor } from '@tiptap/react' +import * as Y from 'yjs' + +const document = new Y.Doc() + +const CustomListInputRule = Extension.create({ + name: 'customListInputRule', + + addInputRules() { + return [ + new InputRule({ + find: /^-\s$/, + handler: ({ chain, range, state }) => { + const $from = state.doc.resolve(range.from) + + chain() + .setTextSelection({ from: $from.start(), to: $from.end() }) + .toggleBulletList() + .command(({ tr }) => { + tr.delete(tr.selection.from, tr.selection.from + 2) + return true + }) + .run() + }, + }), + ] + }, +}) + +export default function InputRuleUndo() { + const editor = useEditor({ + extensions: [ + Document, + Paragraph, + Text, + BulletList, + ListItem, + CustomListInputRule, + Collaboration.configure({ document }), + ], + }) + + return ( + <> +
+

Type "- " at the start of the paragraph. Undo should restore the marker.

+
+ + +
+
+ + + ) +} diff --git a/packages/core/src/InputRule.ts b/packages/core/src/InputRule.ts index c6b127adb6..225bc41881 100644 --- a/packages/core/src/InputRule.ts +++ b/packages/core/src/InputRule.ts @@ -1,7 +1,8 @@ -import type { Node as PMNode } from '@tiptap/pm/model' +import type { Node as PMNode, ResolvedPos } from '@tiptap/pm/model' import { Fragment } from '@tiptap/pm/model' -import type { EditorState, TextSelection } from '@tiptap/pm/state' -import { Plugin } from '@tiptap/pm/state' +import { closeHistory } from '@tiptap/pm/history' +import type { TextSelection } from '@tiptap/pm/state' +import { EditorState, Plugin } from '@tiptap/pm/state' import { CommandManager } from './CommandManager.js' import type { Editor } from './Editor.js' @@ -92,6 +93,120 @@ const inputRuleMatcherHandler = ( return result } +/** + * Prepares the typed text so the rule handler can inspect the resulting document. + */ +function createRuleTransaction(config: { + editor: Editor + from: number + to: number + text: string + insertText?: boolean +}) { + const { editor, from, to, text, insertText } = config + + if (!insertText) { + return { inputTransaction: null, tr: editor.view.state.tr } + } + + const inputTransaction = editor.view.state.tr.insertText(text, from, to) + const inputState = EditorState.create({ + doc: inputTransaction.doc, + selection: inputTransaction.selection, + storedMarks: inputTransaction.storedMarks, + }) + + return { inputTransaction, tr: inputState.tr } +} + +/** + * Runs a matching rule and dispatches the typed text before its conversion. + */ +function applyRule(config: { + editor: Editor + from: number + to: number + text: string + rule: InputRule + match: ExtendedRegExpMatchArray + plugin: Plugin + insertText?: boolean +}): boolean { + const { editor, from, to, text, rule, match, plugin, insertText } = config + const { view } = editor + const { inputTransaction, tr } = createRuleTransaction({ editor, from, to, text, insertText }) + const inputEnd = inputTransaction ? from + text.length : to + const state = createChainableState({ + state: view.state, + transaction: tr, + }) + const range = { + from: from - (match[0].length - text.length), + to: inputEnd, + } + + const { commands, chain, can } = new CommandManager({ + editor, + state, + }) + + const handler = rule.handler({ + state, + range, + match, + commands, + chain, + can, + }) + + if (handler === null || !tr.steps.length) { + return false + } + + if (inputTransaction) { + view.dispatch(inputTransaction) + + if (!view.state.doc.eq(inputTransaction.doc)) { + return true + } + } + + closeHistory(tr) + tr.setMeta('inputRule', true) + + if (rule.undoable) { + tr.setMeta(plugin, { + transform: tr, + from, + to: inputEnd, + text, + }) + } + + view.dispatch(tr) + return true +} + +/** + * Checks that the part of a match already in the document has matching positions. + */ +function matchesDocument($from: ResolvedPos, match: ExtendedRegExpMatchArray, text: string) { + // Leaf nodes can have different text and document lengths. + const matchedDocLength = match[0].length - text.length + + if (matchedDocLength <= 0) { + return true + } + + const matchStartOffset = $from.parentOffset - matchedDocLength + + return ( + matchStartOffset >= 0 && + $from.parent.textBetween(matchStartOffset, $from.parentOffset) === + match[0].slice(0, matchedDocLength) + ) +} + function run(config: { editor: Editor from: number @@ -99,8 +214,9 @@ function run(config: { text: string rules: InputRule[] plugin: Plugin + insertText?: boolean }): boolean { - const { editor, from, to, text, rules, plugin } = config + const { editor, from, to, text, rules, plugin, insertText } = config const { view } = editor if (view.composing) { @@ -118,82 +234,21 @@ function run(config: { return false } - let matched = false - const textBefore = getTextContentFromNodes($from) + text - rules.forEach(rule => { - if (matched) { - return - } - + for (const rule of rules) { const match = inputRuleMatcherHandler(textBefore, rule.find) - if (!match) { - return + if (!match || !matchesDocument($from, match, text)) { + continue } - // Leaf nodes have a different length in text and the document. - // Skip matches across them to avoid wrong document positions. - const matchedDocLength = match[0].length - text.length - - if (matchedDocLength > 0) { - const matchStartOffset = $from.parentOffset - matchedDocLength - - if ( - matchStartOffset < 0 || - $from.parent.textBetween(matchStartOffset, $from.parentOffset) !== - match[0].slice(0, matchedDocLength) - ) { - return - } + if (applyRule({ editor, from, to, text, rule, match, plugin, insertText })) { + return true } + } - const tr = view.state.tr - const state = createChainableState({ - state: view.state, - transaction: tr, - }) - const range = { - from: from - (match[0].length - text.length), - to, - } - - const { commands, chain, can } = new CommandManager({ - editor, - state, - }) - - const handler = rule.handler({ - state, - range, - match, - commands, - chain, - can, - }) - - // stop if there are no changes - if (handler === null || !tr.steps.length) { - return - } - - // store transform as meta data - // so we can undo input rules within the `undoInputRules` command - if (rule.undoable) { - tr.setMeta(plugin, { - transform: tr, - from, - to, - text, - }) - } - - view.dispatch(tr) - matched = true - }) - - return matched + return false } /** @@ -261,6 +316,7 @@ export function inputRulesPlugin(props: { editor: Editor; rules: InputRule[] }): text, rules, plugin, + insertText: true, }) }, diff --git a/packages/extension-collaboration/package.json b/packages/extension-collaboration/package.json index a24e88317d..1e49dae5c4 100644 --- a/packages/extension-collaboration/package.json +++ b/packages/extension-collaboration/package.json @@ -44,7 +44,8 @@ "devDependencies": { "@tiptap/core": "workspace:^", "@tiptap/pm": "workspace:^", - "@tiptap/y-tiptap": "^3.0.7" + "@tiptap/y-tiptap": "^3.0.7", + "vite-plus": "catalog:" }, "peerDependencies": { "@tiptap/core": "workspace:*", diff --git a/packages/extension-collaboration/src/collaboration.ts b/packages/extension-collaboration/src/collaboration.ts index 02703514d5..62da362800 100644 --- a/packages/extension-collaboration/src/collaboration.ts +++ b/packages/extension-collaboration/src/collaboration.ts @@ -225,6 +225,15 @@ export const Collaboration = Extension.create { + if (transaction.getMeta('inputRule')) { + yUndoPluginKey.getState(state).undoManager.stopCapturing() + } + + return true + }, + }), // Only add the filterInvalidContent plugin if content checking is enabled this.editor.options.enableContentCheck && new Plugin({ diff --git a/packages/extension-collaboration/tests/integration/inputRuleUndo.test.ts b/packages/extension-collaboration/tests/integration/inputRuleUndo.test.ts new file mode 100644 index 0000000000..330db62c09 --- /dev/null +++ b/packages/extension-collaboration/tests/integration/inputRuleUndo.test.ts @@ -0,0 +1,160 @@ +import { Editor, Extension, InputRule } from '@tiptap/core' +import Bold from '@tiptap/extension-bold' +import Collaboration from '@tiptap/extension-collaboration' +import Document from '@tiptap/extension-document' +import Italic from '@tiptap/extension-italic' +import { BulletList, ListItem } from '@tiptap/extension-list' +import Paragraph from '@tiptap/extension-paragraph' +import Strike from '@tiptap/extension-strike' +import Text from '@tiptap/extension-text' +import { UndoRedo } from '@tiptap/extensions' +import { afterEach, describe, expect, it } from 'vite-plus/test' +import * as Y from 'yjs' + +const DecliningRule = Extension.create({ + name: 'decliningRule', + priority: 200, + addInputRules() { + return [new InputRule({ find: /^-\s$/, handler: () => null })] + }, +}) + +const CustomListRule = Extension.create({ + name: 'customListRule', + priority: 201, + addInputRules() { + return [ + new InputRule({ + find: /^-\s$/, + handler: ({ chain, range, state }) => { + const $from = state.doc.resolve(range.from) + + chain() + .setTextSelection({ from: $from.start(), to: $from.end() }) + .toggleBulletList() + .command(({ tr }) => { + tr.delete(tr.selection.from, tr.selection.from + 2) + return true + }) + .run() + }, + }), + ] + }, +}) + +describe('input rule undo with collaboration', () => { + let editor: Editor + let element: HTMLElement + let document: Y.Doc + + afterEach(() => { + editor?.destroy() + element?.remove() + document?.destroy() + }) + + const createEditor = async (collaboration: boolean, customRule = false) => { + element = window.document.createElement('div') + window.document.body.appendChild(element) + document = new Y.Doc() + + editor = new Editor({ + element, + extensions: [ + Document, + Paragraph, + Text, + Bold, + Italic, + Strike, + BulletList, + ListItem, + DecliningRule, + ...(customRule ? [CustomListRule] : []), + ...(collaboration ? [Collaboration.configure({ document })] : []), + ...(!collaboration ? [UndoRedo] : []), + ], + }) + + await new Promise(resolve => setTimeout(resolve, 10)) + } + + const type = (text: string) => { + for (const character of text) { + const { from, to } = editor.state.selection + const handled = editor.view.someProp('handleTextInput', handler => + handler(editor.view, from, to, character), + ) + + if (!handled) { + editor.commands.insertContent(character) + } + } + } + + it('restores a list marker with collaboration undo', async () => { + await createEditor(true) + type('- ') + + expect(editor.getHTML()).toBe('
') + + editor.commands.undo() + + expect(editor.getHTML()).toBe('

-

') + + editor.commands.redo() + + expect(editor.getHTML()).toBe('
') + }) + + it('restores a marker removed by a custom list input rule', async () => { + await createEditor(true, true) + type('- ') + + expect(editor.getHTML()).toBe('
') + + editor.commands.undo() + + expect(editor.getHTML()).toBe('

-

') + }) + + it('restores a list marker with normal history undo', async () => { + await createEditor(false) + type('- ') + + editor.commands.undo() + + expect(editor.getHTML()).toBe('

-

') + + editor.commands.redo() + + expect(editor.getHTML()).toBe('
') + }) + + it.each([ + { input: '**bold**', output: '

bold

' }, + { input: '*italic*', output: '

italic

' }, + { input: '~~strike~~', output: '

strike

' }, + ])('restores $input with Backspace', async ({ input, output }) => { + await createEditor(true) + type(input) + + expect(editor.getHTML()).toBe(output) + + editor.view.dom.dispatchEvent(new KeyboardEvent('keydown', { key: 'Backspace', bubbles: true })) + + expect(editor.getHTML()).toBe(`

${input}

`) + }) + + it('restores bold delimiters with Backspace without collaboration', async () => { + await createEditor(false) + type('**bold**') + + expect(editor.getHTML()).toBe('

bold

') + + editor.view.dom.dispatchEvent(new KeyboardEvent('keydown', { key: 'Backspace', bubbles: true })) + + expect(editor.getHTML()).toBe('

**bold**

') + }) +}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 32fa9a2fe5..f47d88daa7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -432,6 +432,9 @@ importers: '@tiptap/y-tiptap': specifier: ^3.0.7 version: 3.0.8(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.3)(y-protocols@1.0.7(yjs@13.6.23))(yjs@13.6.23) + vite-plus: + specifier: 'catalog:' + version: 0.3.0(@types/node@22.20.1)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@22.20.1)(jiti@2.6.1)(sass-embedded@1.100.0)(sass@1.100.0)(terser@5.50.0)(typescript@5.9.3))(happy-dom@20.11.2)(jiti@2.6.1)(sass-embedded@1.100.0)(sass@1.100.0)(svelte@5.56.8)(terser@5.50.0)(typescript@5.9.3) packages/extension-collaboration-caret: devDependencies: From 6ec63ef76dc29479199997bcdb7962a85a7215c8 Mon Sep 17 00:00:00 2001 From: Noor Nabi Date: Wed, 30 Sep 2026 17:45:31 +0500 Subject: [PATCH 2/3] fix(core): keep role="textbox" on the editor element after setOptions (#8410) createView merged the default role into editorProps.attributes, but setOptions passed editorProps to view.setProps without that merge. A re-render in React calls setOptions, so the user attributes replaced the default role and the editor element lost role="textbox". Build the attributes in one helper and use it on mount and on update. The helper also supports attributes passed as a function. Fixes #8407 Co-authored-by: Claude Fable 5.1 --- ...-09-29-keep-textbox-role-on-set-options.md | 5 ++ packages/core/src/Editor.test.ts | 75 +++++++++++++++++++ packages/core/src/Editor.ts | 32 ++++++-- 3 files changed, 106 insertions(+), 6 deletions(-) create mode 100644 .changeset/2026-09-29-keep-textbox-role-on-set-options.md diff --git a/.changeset/2026-09-29-keep-textbox-role-on-set-options.md b/.changeset/2026-09-29-keep-textbox-role-on-set-options.md new file mode 100644 index 0000000000..12a87a40bd --- /dev/null +++ b/.changeset/2026-09-29-keep-textbox-role-on-set-options.md @@ -0,0 +1,5 @@ +--- +'@tiptap/core': patch +--- + +The editor element keeps `role="textbox"` after `setOptions()` when `editorProps.attributes` is set. Before, a re-render in React replaced the default role with the user attributes. Attributes passed as a function now get the default role as well. diff --git a/packages/core/src/Editor.test.ts b/packages/core/src/Editor.test.ts index 4ff5d3b770..eeb6e42246 100644 --- a/packages/core/src/Editor.test.ts +++ b/packages/core/src/Editor.test.ts @@ -114,6 +114,81 @@ describe('editorProps', () => { }) }) +describe('editorProps.attributes', () => { + let editor: Editor + + afterEach(() => { + editor.destroy() + }) + + it('adds role="textbox" when attributes are set while constructing Editor', () => { + editor = new Editor({ + element: document.createElement('div'), + extensions: [StarterKit], + editorProps: { attributes: { class: 'my-editor' } }, + }) + + expect(editor.view.dom.getAttribute('role')).toBe('textbox') + expect(editor.view.dom.classList.contains('my-editor')).toBe(true) + }) + + it('keeps role="textbox" when attributes are set through setOptions', () => { + editor = new Editor({ + element: document.createElement('div'), + extensions: [StarterKit], + editorProps: { attributes: { class: 'my-editor' } }, + }) + + editor.setOptions({ editorProps: { attributes: { class: 'my-editor is-updated' } } }) + + expect(editor.view.dom.getAttribute('role')).toBe('textbox') + expect(editor.view.dom.classList.contains('is-updated')).toBe(true) + }) + + it('keeps role="textbox" when setOptions is called with unrelated options', () => { + editor = new Editor({ + element: document.createElement('div'), + extensions: [StarterKit], + editorProps: { attributes: { class: 'my-editor' } }, + }) + + editor.setOptions({ editable: false }) + + expect(editor.view.dom.getAttribute('role')).toBe('textbox') + expect(editor.view.dom.classList.contains('my-editor')).toBe(true) + }) + + it('lets the user override the role', () => { + editor = new Editor({ + element: document.createElement('div'), + extensions: [StarterKit], + editorProps: { attributes: { role: 'document' } }, + }) + + expect(editor.view.dom.getAttribute('role')).toBe('document') + + editor.setOptions({ editorProps: { attributes: { role: 'document', class: 'my-editor' } } }) + + expect(editor.view.dom.getAttribute('role')).toBe('document') + }) + + it('keeps role="textbox" when attributes are a function', () => { + editor = new Editor({ + element: document.createElement('div'), + extensions: [StarterKit], + editorProps: { attributes: () => ({ class: 'my-editor' }) }, + }) + + expect(editor.view.dom.getAttribute('role')).toBe('textbox') + expect(editor.view.dom.classList.contains('my-editor')).toBe(true) + + editor.setOptions({ editorProps: { attributes: () => ({ class: 'is-updated' }) } }) + + expect(editor.view.dom.getAttribute('role')).toBe('textbox') + expect(editor.view.dom.classList.contains('is-updated')).toBe(true) + }) +}) + describe('editor.getHTML / editor.getJSON', () => { let editor: Editor diff --git a/packages/core/src/Editor.ts b/packages/core/src/Editor.ts index 009df36b15..9bf28d2396 100644 --- a/packages/core/src/Editor.ts +++ b/packages/core/src/Editor.ts @@ -295,7 +295,10 @@ export class Editor extends EventEmitter { } if (this.options.editorProps) { - this.view.setProps(this.options.editorProps) + this.view.setProps({ + ...this.options.editorProps, + attributes: this.getEditorViewAttributes(), + }) } this.view.updateState(this.state) @@ -575,6 +578,27 @@ export class Editor extends EventEmitter { return doc } + /** + * Returns the attributes for the editor element. + * Merges the default `role="textbox"` with the attributes from `editorProps`, + * so the role is kept no matter when the props are applied. + */ + private getEditorViewAttributes(): NonNullable { + const attributes = this.options.editorProps?.attributes + + if (isFunction(attributes)) { + return state => ({ + role: 'textbox', + ...attributes(state), + }) + } + + return { + role: 'textbox', + ...attributes, + } + } + /** * Creates a ProseMirror view. */ @@ -595,11 +619,7 @@ export class Editor extends EventEmitter { this.editorView = new EditorView(element, { ...editorProps, - attributes: { - // add `role="textbox"` to the editor element - role: 'textbox', - ...editorProps?.attributes, - }, + attributes: this.getEditorViewAttributes(), dispatchTransaction: dispatch, transformPastedHTML, state: this.editorState, From c402400e60192895cfed85e1a72adf3fbb43d08e Mon Sep 17 00:00:00 2001 From: Dominik Biedebach <6538827+bdbch@users.noreply.github.com> Date: Wed, 30 Sep 2026 16:08:36 +0200 Subject: [PATCH 3/3] chore: update ProseMirror dependencies to latest versions (#8409) - Updated ProseMirror packages in package.json files across demos and core packages. - Adjusted pnpm-lock.yaml to reflect new versions of ProseMirror dependencies. - Removed unnecessary editor click in Default example test. - Fixed clipboard paste event handling in Link example test. - Updated pnpm-workspace.yaml to reflect new ProseMirror model and view versions. --- .changeset/2026-09-29-update-prosemirror.md | 5 + demos/package.json | 18 +- demos/src/Examples/Default/index.spec.ts | 1 - demos/src/Marks/Link/index.spec.ts | 6 +- packages/core/package.json | 2 +- packages/pm/package.json | 14 +- pnpm-lock.yaml | 242 ++++++++++---------- pnpm-workspace.yaml | 5 +- 8 files changed, 149 insertions(+), 144 deletions(-) create mode 100644 .changeset/2026-09-29-update-prosemirror.md diff --git a/.changeset/2026-09-29-update-prosemirror.md b/.changeset/2026-09-29-update-prosemirror.md new file mode 100644 index 0000000000..f55f78b9db --- /dev/null +++ b/.changeset/2026-09-29-update-prosemirror.md @@ -0,0 +1,5 @@ +--- +'@tiptap/pm': patch +--- + +Update ProseMirror dependencies to their latest versions. diff --git a/demos/package.json b/demos/package.json index 6880339a25..0d02ce3e77 100644 --- a/demos/package.json +++ b/demos/package.json @@ -24,24 +24,24 @@ "lexical": "^0.36.2", "linkifyjs": "^4.3.2", "lowlight": "^3.3.0", - "prosemirror-changeset": "^2.4.1", + "prosemirror-changeset": "^2.4.4", "prosemirror-collab": "^1.3.1", - "prosemirror-commands": "^1.7.1", - "prosemirror-dropcursor": "^1.8.2", + "prosemirror-commands": "^1.7.2", + "prosemirror-dropcursor": "^1.8.4", "prosemirror-gapcursor": "^1.4.1", - "prosemirror-history": "^1.5.0", + "prosemirror-history": "^1.5.1", "prosemirror-inputrules": "^1.5.1", "prosemirror-keymap": "^1.2.3", - "prosemirror-markdown": "^1.13.4", + "prosemirror-markdown": "^1.13.8", "prosemirror-menu": "^1.3.2", - "prosemirror-model": "^1.25.9", - "prosemirror-schema-basic": "^1.2.4", + "prosemirror-model": "^1.25.12", + "prosemirror-schema-basic": "^1.2.5", "prosemirror-schema-list": "^1.5.1", "prosemirror-state": "^1.4.4", "prosemirror-tables": "^1.8.5", "prosemirror-trailing-node": "^3.0.0", - "prosemirror-transform": "^1.12.0", - "prosemirror-view": "^1.42.3", + "prosemirror-transform": "^1.12.2", + "prosemirror-view": "^1.42.6", "remixicon": "^2.5.0", "shiki": "^1.25.1", "y-webrtc": "10.3.0", diff --git a/demos/src/Examples/Default/index.spec.ts b/demos/src/Examples/Default/index.spec.ts index ef44470f2c..7d7b55e41d 100644 --- a/demos/src/Examples/Default/index.spec.ts +++ b/demos/src/Examples/Default/index.spec.ts @@ -45,7 +45,6 @@ test.describe(`${demoPath}/${demoName}`, () => { await expect(page.locator('.tiptap h1')).toBeVisible() const editor = await getEditor(page) - await editor.click() await editor.evaluate((el: any) => el.editor.commands.selectAll()) await editor.press(process.platform === 'darwin' ? 'Meta+Alt+0' : 'Control+Alt+0') diff --git a/demos/src/Marks/Link/index.spec.ts b/demos/src/Marks/Link/index.spec.ts index b10209368a..1a3a2c5eb8 100644 --- a/demos/src/Marks/Link/index.spec.ts +++ b/demos/src/Marks/Link/index.spec.ts @@ -13,9 +13,9 @@ async function paste( await editor.evaluate((el: HTMLElement, text: string) => { const dt = new DataTransfer() dt.setData('text/plain', text) - el.dispatchEvent( - new ClipboardEvent('paste', { clipboardData: dt, bubbles: true, cancelable: true }), - ) + const event = new ClipboardEvent('paste', { bubbles: true, cancelable: true }) + Object.defineProperty(event, 'clipboardData', { value: dt }) + el.dispatchEvent(event) }, payload) } diff --git a/packages/core/package.json b/packages/core/package.json index 7ed0d29f24..0e774f3c24 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -65,7 +65,7 @@ }, "devDependencies": { "@tiptap/pm": "workspace:^", - "prosemirror-model": "^1.25.11" + "prosemirror-model": "^1.25.12" }, "peerDependencies": { "@tiptap/pm": "workspace:*" diff --git a/packages/pm/package.json b/packages/pm/package.json index eb67c31b60..9fe2841aa1 100644 --- a/packages/pm/package.json +++ b/packages/pm/package.json @@ -149,18 +149,18 @@ "build": "vp pack" }, "dependencies": { - "prosemirror-changeset": "^2.4.1", - "prosemirror-commands": "^1.7.1", - "prosemirror-dropcursor": "^1.8.2", + "prosemirror-changeset": "^2.4.4", + "prosemirror-commands": "^1.7.2", + "prosemirror-dropcursor": "^1.8.4", "prosemirror-gapcursor": "^1.4.1", - "prosemirror-history": "^1.5.0", + "prosemirror-history": "^1.5.1", "prosemirror-inputrules": "^1.5.1", "prosemirror-keymap": "^1.2.3", - "prosemirror-model": "^1.25.11", + "prosemirror-model": "^1.25.12", "prosemirror-schema-list": "^1.5.1", "prosemirror-state": "^1.4.4", "prosemirror-tables": "^1.8.5", - "prosemirror-transform": "^1.12.0", - "prosemirror-view": "^1.42.3" + "prosemirror-transform": "^1.12.2", + "prosemirror-view": "^1.42.6" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f47d88daa7..ae488a6d87 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,8 +15,8 @@ catalogs: overrides: '@rollup/pluginutils>picomatch': 2.3.2 - prosemirror-model: ^1.25.11 - prosemirror-view: ^1.42.3 + prosemirror-model: ^1.25.12 + prosemirror-view: ^1.42.6 '@octokit/action>undici': 6.24.1 anymatch>picomatch: 2.3.2 glob: ^10.5.0 @@ -153,7 +153,7 @@ importers: version: 2.15.3(y-protocols@1.0.7(yjs@13.6.23))(yjs@13.6.23) '@hocuspocus/transformer': specifier: ^2.15.0 - version: 2.15.3(@tiptap/core@3.30.3(@tiptap/pm@3.30.3))(@tiptap/pm@3.30.3)(y-prosemirror@1.3.7(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.3)(y-protocols@1.0.7(yjs@13.6.23))(yjs@13.6.23))(yjs@13.6.23) + version: 2.15.3(@tiptap/core@3.30.3(@tiptap/pm@3.30.3))(@tiptap/pm@3.30.3)(y-prosemirror@1.3.7(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.6)(y-protocols@1.0.7(yjs@13.6.23))(yjs@13.6.23))(yjs@13.6.23) '@lexical/react': specifier: ^0.36.2 version: 0.36.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(yjs@13.6.23) @@ -165,7 +165,7 @@ importers: version: 1.10.3 '@tiptap/y-tiptap': specifier: ^3.0.7 - version: 3.0.8(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.3)(y-protocols@1.0.7(yjs@13.6.23))(yjs@13.6.23) + version: 3.0.8(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.6)(y-protocols@1.0.7(yjs@13.6.23))(yjs@13.6.23) d3: specifier: ^7.9.0 version: 7.9.0 @@ -188,23 +188,23 @@ importers: specifier: ^3.3.0 version: 3.3.0 prosemirror-changeset: - specifier: ^2.4.1 - version: 2.4.1 + specifier: ^2.4.4 + version: 2.4.4 prosemirror-collab: specifier: ^1.3.1 version: 1.3.1 prosemirror-commands: - specifier: ^1.7.1 + specifier: ^1.7.2 version: 1.7.2 prosemirror-dropcursor: - specifier: ^1.8.2 - version: 1.8.3 + specifier: ^1.8.4 + version: 1.8.4 prosemirror-gapcursor: specifier: ^1.4.1 version: 1.4.1 prosemirror-history: - specifier: ^1.5.0 - version: 1.5.0 + specifier: ^1.5.1 + version: 1.5.1 prosemirror-inputrules: specifier: ^1.5.1 version: 1.5.1 @@ -212,17 +212,17 @@ importers: specifier: ^1.2.3 version: 1.2.3 prosemirror-markdown: - specifier: ^1.13.4 - version: 1.13.5 + specifier: ^1.13.8 + version: 1.13.8 prosemirror-menu: specifier: ^1.3.2 version: 1.3.2 prosemirror-model: - specifier: ^1.25.11 - version: 1.25.11 + specifier: ^1.25.12 + version: 1.25.12 prosemirror-schema-basic: - specifier: ^1.2.4 - version: 1.2.4 + specifier: ^1.2.5 + version: 1.2.5 prosemirror-schema-list: specifier: ^1.5.1 version: 1.5.1 @@ -234,13 +234,13 @@ importers: version: 1.8.5 prosemirror-trailing-node: specifier: ^3.0.0 - version: 3.0.0(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.3) + version: 3.0.0(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.6) prosemirror-transform: - specifier: ^1.12.0 - version: 1.12.0 + specifier: ^1.12.2 + version: 1.12.2 prosemirror-view: - specifier: ^1.42.3 - version: 1.42.3 + specifier: ^1.42.6 + version: 1.42.6 remixicon: specifier: ^2.5.0 version: 2.5.0 @@ -329,7 +329,7 @@ importers: version: link:../pm '@tiptap/y-tiptap': specifier: ^3.0.7 - version: 3.0.8(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.3)(y-protocols@1.0.7(yjs@13.6.23))(yjs@13.6.23) + version: 3.0.8(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.6)(y-protocols@1.0.7(yjs@13.6.23))(yjs@13.6.23) yjs: specifier: ^13.6.23 version: 13.6.23 @@ -340,8 +340,8 @@ importers: specifier: workspace:^ version: link:../pm prosemirror-model: - specifier: ^1.25.11 - version: 1.25.11 + specifier: ^1.25.12 + version: 1.25.12 packages/extension-audio: devDependencies: @@ -431,7 +431,7 @@ importers: version: link:../pm '@tiptap/y-tiptap': specifier: ^3.0.7 - version: 3.0.8(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.3)(y-protocols@1.0.7(yjs@13.6.23))(yjs@13.6.23) + version: 3.0.8(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.6)(y-protocols@1.0.7(yjs@13.6.23))(yjs@13.6.23) vite-plus: specifier: 'catalog:' version: 0.3.0(@types/node@22.20.1)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@22.20.1)(jiti@2.6.1)(sass-embedded@1.100.0)(sass@1.100.0)(terser@5.50.0)(typescript@5.9.3))(happy-dom@20.11.2)(jiti@2.6.1)(sass-embedded@1.100.0)(sass@1.100.0)(svelte@5.56.8)(terser@5.50.0)(typescript@5.9.3) @@ -461,7 +461,7 @@ importers: version: link:../pm '@tiptap/y-tiptap': specifier: ^3.0.7 - version: 3.0.8(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.3)(y-protocols@1.0.7(yjs@13.6.23))(yjs@13.6.23) + version: 3.0.8(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.6)(y-protocols@1.0.7(yjs@13.6.23))(yjs@13.6.23) yjs: specifier: ^13.6.23 version: 13.6.23 @@ -510,7 +510,7 @@ importers: version: link:../pm '@tiptap/y-tiptap': specifier: ^3.0.7 - version: 3.0.8(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.3)(y-protocols@1.0.7(yjs@13.6.23))(yjs@13.6.23) + version: 3.0.8(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.6)(y-protocols@1.0.7(yjs@13.6.23))(yjs@13.6.23) packages/extension-drag-handle-react: devDependencies: @@ -900,20 +900,20 @@ importers: packages/pm: dependencies: prosemirror-changeset: - specifier: ^2.4.1 - version: 2.4.1 + specifier: ^2.4.4 + version: 2.4.4 prosemirror-commands: - specifier: ^1.7.1 + specifier: ^1.7.2 version: 1.7.2 prosemirror-dropcursor: - specifier: ^1.8.2 - version: 1.8.3 + specifier: ^1.8.4 + version: 1.8.4 prosemirror-gapcursor: specifier: ^1.4.1 version: 1.4.1 prosemirror-history: - specifier: ^1.5.0 - version: 1.5.0 + specifier: ^1.5.1 + version: 1.5.1 prosemirror-inputrules: specifier: ^1.5.1 version: 1.5.1 @@ -921,8 +921,8 @@ importers: specifier: ^1.2.3 version: 1.2.3 prosemirror-model: - specifier: ^1.25.11 - version: 1.25.11 + specifier: ^1.25.12 + version: 1.25.12 prosemirror-schema-list: specifier: ^1.5.1 version: 1.5.1 @@ -933,11 +933,11 @@ importers: specifier: ^1.8.5 version: 1.8.5 prosemirror-transform: - specifier: ^1.12.0 - version: 1.12.0 + specifier: ^1.12.2 + version: 1.12.2 prosemirror-view: - specifier: ^1.42.3 - version: 1.42.3 + specifier: ^1.42.6 + version: 1.42.6 packages/react: dependencies: @@ -2742,9 +2742,9 @@ packages: resolution: {integrity: sha512-+kndlSuoUK9sKVRuxbAHXNrbDvyydnG/Y0NFU9XXqaSkI9IRcrjpOf1RGd7NrC9jJXquDqZS96wOQf6eUpP9Dg==} engines: {node: '>=16.0.0', npm: '>=8.0.0'} peerDependencies: - prosemirror-model: ^1.25.11 + prosemirror-model: ^1.25.12 prosemirror-state: ^1.2.3 - prosemirror-view: ^1.42.3 + prosemirror-view: ^1.42.6 y-protocols: ^1.0.1 yjs: ^13.5.38 @@ -5086,8 +5086,8 @@ packages: property-information@7.2.0: resolution: {integrity: sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==} - prosemirror-changeset@2.4.1: - resolution: {integrity: sha512-96WBLhOaYhJ+kPhLg3uW359Tz6I/MfcrQfL4EGv4SrcqKEMC1gmoGrXHecPE8eOwTVCJ4IwgfzM8fFad25wNfw==} + prosemirror-changeset@2.4.4: + resolution: {integrity: sha512-Gyuz9jYdrAeA9I7AholyOes9KUmv/lEwsC5O9s5xF5VB3EgTPsXMGUxz4+H1B+wKVPdZbvRcg1Cp3x8qX+8ofA==} prosemirror-collab@1.3.1: resolution: {integrity: sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==} @@ -5095,14 +5095,14 @@ packages: prosemirror-commands@1.7.2: resolution: {integrity: sha512-q6Q6szxqdu9Xd6EcdKsqXghu5nQdZTpB4Q9yd04WRc7/jt763e/rT60Owh0L1GYY+T46o5rD+9lEN36dZS43tw==} - prosemirror-dropcursor@1.8.3: - resolution: {integrity: sha512-FoYbsJR8gK+DGlqhNoE29Loa38eIZPzQRIb1VMaDNBoo4OLP6vVof/jR8qFY/6XvUd6Dhug8MDCHl2a/h8RTfQ==} + prosemirror-dropcursor@1.8.4: + resolution: {integrity: sha512-VmKxhcA6a+h5oPSYmfF1ZNeQqPbyYaIxqZsKqeYCyTlPtrjUgNaHL3P8vVaO19oqAV0zuaM/axkowZHrB1P3Tg==} prosemirror-gapcursor@1.4.1: resolution: {integrity: sha512-pMdYaEnjNMSwl11yjEGtgTmLkR08m/Vl+Jj443167p9eB3HVQKhYCc4gmHVDsLPODfZfjr/MmirsdyZziXbQKw==} - prosemirror-history@1.5.0: - resolution: {integrity: sha512-zlzTiH01eKA55UAf1MEjtssJeHnGxO0j4K4Dpx+gnmX9n+SHNlDqI2oO1Kv1iPN5B1dm5fsljCfqKF9nFL6HRg==} + prosemirror-history@1.5.1: + resolution: {integrity: sha512-onlwnqKvgtFg6srZOmDOAhlAy1FIHQpOExORybX0S+DvJepE5tPALrB9iGet/2sqqqrelSnB10OoiOJqAvu2DA==} prosemirror-inputrules@1.5.1: resolution: {integrity: sha512-7wj4uMjKaXWAQ1CDgxNzNtR9AlsuwzHfdFH1ygEHA2KHF2DOEaXl1CJfNPAKCg9qNEh4rum975QLaCiQPyY6Fw==} @@ -5110,17 +5110,17 @@ packages: prosemirror-keymap@1.2.3: resolution: {integrity: sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==} - prosemirror-markdown@1.13.5: - resolution: {integrity: sha512-ac8trNQ01ybKDRTcfUc56LZufG3oYyU4N25qSXgp8dS0U4JtzzCj7oQlKu5v09VSmS5IseYoQ2yDkTbo7f7D8Q==} + prosemirror-markdown@1.13.8: + resolution: {integrity: sha512-Zi43BXX28jmxDJKvk8TDS2gMkBY/mgP8ynd6l/Vxrv8rgNFs5hsV1G0VscxTID1UCzVPcidADP9fUOBY3xxUeA==} prosemirror-menu@1.3.2: resolution: {integrity: sha512-6VgUJTYod0nMBlCaYJGhXGLu7Gt4AvcwcOq0YfJCY/6Uh+3S7UsWhpy6rJFCBFOmonq1hD8KyWOtZhkppd4YPg==} - prosemirror-model@1.25.11: - resolution: {integrity: sha512-QWg9RhnpLlogAmp3p96uEFrE5txQpFynd4vhBAELkwgOCWQs/X0yCzB3/hrHqiPwf91RG5KyWq6553zs9JqIOQ==} + prosemirror-model@1.25.12: + resolution: {integrity: sha512-Ue2gTmXMa7EhpLNhC7J+h4+ykD8ha12K6rrZFFKKJHBForfIStw5gJ6Zrf1mqqAa9NmpmEB4wp9bKmA4eUVjWg==} - prosemirror-schema-basic@1.2.4: - resolution: {integrity: sha512-ELxP4TlX3yr2v5rM7Sb70SqStq5NvI15c0j9j/gjsrO5vaw+fnnpovCLEGIcpeGfifkuqJwl4fon6b+KdrODYQ==} + prosemirror-schema-basic@1.2.5: + resolution: {integrity: sha512-McBWhfgOfThyu3Nltbs8SOUbM4t/h0pxteibaaHd1QR4S+F1t0u7M1ETaCE6/cveFoF+2fowTIBNkJOyeZQjNg==} prosemirror-schema-list@1.5.1: resolution: {integrity: sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q==} @@ -5134,15 +5134,15 @@ packages: prosemirror-trailing-node@3.0.0: resolution: {integrity: sha512-xiun5/3q0w5eRnGYfNlW1uU9W6x5MoFKWwq/0TIRgt09lv7Hcser2QYV8t4muXbEr+Fwo0geYn79Xs4GKywrRQ==} peerDependencies: - prosemirror-model: ^1.25.11 + prosemirror-model: ^1.25.12 prosemirror-state: ^1.4.2 - prosemirror-view: ^1.42.3 + prosemirror-view: ^1.42.6 - prosemirror-transform@1.12.0: - resolution: {integrity: sha512-GxboyN4AMIsoHNtz5uf2r2Ru551i5hWeCMD6E2Ib4Eogqoub0NflniaBPVQ4MrGE5yZ8JV9tUHg9qcZTTrcN4w==} + prosemirror-transform@1.12.2: + resolution: {integrity: sha512-PE/aY0HEY4zczvmqrilgkUK/WautF0chvMqkmM/iN5/aPHvwrCWaQZjS6CIZp+K84YrvPFqrL+YArrfJX8xX7g==} - prosemirror-view@1.42.3: - resolution: {integrity: sha512-oTN7EtH+CpwxU9NrwEYWd0UZ4JUx7l048l5A2Xppm4p/60isZYLnth9QVQmC3VRIvdrIWCxwZSd+Uz791G31/w==} + prosemirror-view@1.42.6: + resolution: {integrity: sha512-3g25f6hKV2bBxo3puH3EcYWmmVNSH0iWmNsMVT7sugDSpA025jgpOLarcDWr39SdzPjYMaiYtRdNtXialPSjEQ==} punycode.js@2.3.1: resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} @@ -5980,9 +5980,9 @@ packages: resolution: {integrity: sha512-NpM99WSdD4Fx4if5xOMDpPtU3oAmTSjlzh5U4353ABbRHl1HtAFUx6HlebLZfyFxXN9jzKMDkVbcRjqOZVkYQg==} engines: {node: '>=16.0.0', npm: '>=8.0.0'} peerDependencies: - prosemirror-model: ^1.25.11 + prosemirror-model: ^1.25.12 prosemirror-state: ^1.2.3 - prosemirror-view: ^1.42.3 + prosemirror-view: ^1.42.6 y-protocols: ^1.0.1 yjs: ^13.5.38 @@ -7204,12 +7204,12 @@ snapshots: - bufferutil - utf-8-validate - '@hocuspocus/transformer@2.15.3(@tiptap/core@3.30.3(@tiptap/pm@3.30.3))(@tiptap/pm@3.30.3)(y-prosemirror@1.3.7(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.3)(y-protocols@1.0.7(yjs@13.6.23))(yjs@13.6.23))(yjs@13.6.23)': + '@hocuspocus/transformer@2.15.3(@tiptap/core@3.30.3(@tiptap/pm@3.30.3))(@tiptap/pm@3.30.3)(y-prosemirror@1.3.7(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.6)(y-protocols@1.0.7(yjs@13.6.23))(yjs@13.6.23))(yjs@13.6.23)': dependencies: '@tiptap/core': 3.30.3(@tiptap/pm@3.30.3) '@tiptap/pm': 3.30.3 '@tiptap/starter-kit': 2.27.2 - y-prosemirror: 1.3.7(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.3)(y-protocols@1.0.7(yjs@13.6.23))(yjs@13.6.23) + y-prosemirror: 1.3.7(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.6)(y-protocols@1.0.7(yjs@13.6.23))(yjs@13.6.23) yjs: 13.6.23 '@inquirer/external-editor@1.0.3(@types/node@22.20.1)': @@ -7905,40 +7905,40 @@ snapshots: '@tiptap/pm@2.27.2': dependencies: - prosemirror-changeset: 2.4.1 + prosemirror-changeset: 2.4.4 prosemirror-collab: 1.3.1 prosemirror-commands: 1.7.2 - prosemirror-dropcursor: 1.8.3 + prosemirror-dropcursor: 1.8.4 prosemirror-gapcursor: 1.4.1 - prosemirror-history: 1.5.0 + prosemirror-history: 1.5.1 prosemirror-inputrules: 1.5.1 prosemirror-keymap: 1.2.3 - prosemirror-markdown: 1.13.5 + prosemirror-markdown: 1.13.8 prosemirror-menu: 1.3.2 - prosemirror-model: 1.25.11 - prosemirror-schema-basic: 1.2.4 + prosemirror-model: 1.25.12 + prosemirror-schema-basic: 1.2.5 prosemirror-schema-list: 1.5.1 prosemirror-state: 1.4.4 prosemirror-tables: 1.8.5 - prosemirror-trailing-node: 3.0.0(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.3) - prosemirror-transform: 1.12.0 - prosemirror-view: 1.42.3 + prosemirror-trailing-node: 3.0.0(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.6) + prosemirror-transform: 1.12.2 + prosemirror-view: 1.42.6 '@tiptap/pm@3.30.3': dependencies: - prosemirror-changeset: 2.4.1 + prosemirror-changeset: 2.4.4 prosemirror-commands: 1.7.2 - prosemirror-dropcursor: 1.8.3 + prosemirror-dropcursor: 1.8.4 prosemirror-gapcursor: 1.4.1 - prosemirror-history: 1.5.0 + prosemirror-history: 1.5.1 prosemirror-inputrules: 1.5.1 prosemirror-keymap: 1.2.3 - prosemirror-model: 1.25.11 + prosemirror-model: 1.25.12 prosemirror-schema-list: 1.5.1 prosemirror-state: 1.4.4 prosemirror-tables: 1.8.5 - prosemirror-transform: 1.12.0 - prosemirror-view: 1.42.3 + prosemirror-transform: 1.12.2 + prosemirror-view: 1.42.6 '@tiptap/starter-kit@2.27.2': dependencies: @@ -7964,12 +7964,12 @@ snapshots: '@tiptap/extension-text-style': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) '@tiptap/pm': 2.27.2 - '@tiptap/y-tiptap@3.0.8(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.3)(y-protocols@1.0.7(yjs@13.6.23))(yjs@13.6.23)': + '@tiptap/y-tiptap@3.0.8(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.6)(y-protocols@1.0.7(yjs@13.6.23))(yjs@13.6.23)': dependencies: lib0: 0.2.117 - prosemirror-model: 1.25.11 + prosemirror-model: 1.25.12 prosemirror-state: 1.4.4 - prosemirror-view: 1.42.3 + prosemirror-view: 1.42.6 y-protocols: 1.0.7(yjs@13.6.23) yjs: 13.6.23 @@ -10222,9 +10222,9 @@ snapshots: property-information@7.2.0: {} - prosemirror-changeset@2.4.1: + prosemirror-changeset@2.4.4: dependencies: - prosemirror-transform: 1.12.0 + prosemirror-transform: 1.12.2 prosemirror-collab@1.3.1: dependencies: @@ -10232,98 +10232,98 @@ snapshots: prosemirror-commands@1.7.2: dependencies: - prosemirror-model: 1.25.11 + prosemirror-model: 1.25.12 prosemirror-state: 1.4.4 - prosemirror-transform: 1.12.0 + prosemirror-transform: 1.12.2 - prosemirror-dropcursor@1.8.3: + prosemirror-dropcursor@1.8.4: dependencies: prosemirror-state: 1.4.4 - prosemirror-transform: 1.12.0 - prosemirror-view: 1.42.3 + prosemirror-transform: 1.12.2 + prosemirror-view: 1.42.6 prosemirror-gapcursor@1.4.1: dependencies: prosemirror-keymap: 1.2.3 - prosemirror-model: 1.25.11 + prosemirror-model: 1.25.12 prosemirror-state: 1.4.4 - prosemirror-view: 1.42.3 + prosemirror-view: 1.42.6 - prosemirror-history@1.5.0: + prosemirror-history@1.5.1: dependencies: prosemirror-state: 1.4.4 - prosemirror-transform: 1.12.0 - prosemirror-view: 1.42.3 + prosemirror-transform: 1.12.2 + prosemirror-view: 1.42.6 rope-sequence: 1.3.4 prosemirror-inputrules@1.5.1: dependencies: prosemirror-state: 1.4.4 - prosemirror-transform: 1.12.0 + prosemirror-transform: 1.12.2 prosemirror-keymap@1.2.3: dependencies: prosemirror-state: 1.4.4 w3c-keyname: 2.2.8 - prosemirror-markdown@1.13.5: + prosemirror-markdown@1.13.8: dependencies: '@types/markdown-it': 14.1.2 markdown-it: 14.3.0 - prosemirror-model: 1.25.11 + prosemirror-model: 1.25.12 prosemirror-menu@1.3.2: dependencies: crelt: 1.0.7 prosemirror-commands: 1.7.2 - prosemirror-history: 1.5.0 + prosemirror-history: 1.5.1 prosemirror-state: 1.4.4 - prosemirror-model@1.25.11: + prosemirror-model@1.25.12: dependencies: orderedmap: 2.1.1 - prosemirror-schema-basic@1.2.4: + prosemirror-schema-basic@1.2.5: dependencies: - prosemirror-model: 1.25.11 + prosemirror-model: 1.25.12 prosemirror-schema-list@1.5.1: dependencies: - prosemirror-model: 1.25.11 + prosemirror-model: 1.25.12 prosemirror-state: 1.4.4 - prosemirror-transform: 1.12.0 + prosemirror-transform: 1.12.2 prosemirror-state@1.4.4: dependencies: - prosemirror-model: 1.25.11 - prosemirror-transform: 1.12.0 - prosemirror-view: 1.42.3 + prosemirror-model: 1.25.12 + prosemirror-transform: 1.12.2 + prosemirror-view: 1.42.6 prosemirror-tables@1.8.5: dependencies: prosemirror-keymap: 1.2.3 - prosemirror-model: 1.25.11 + prosemirror-model: 1.25.12 prosemirror-state: 1.4.4 - prosemirror-transform: 1.12.0 - prosemirror-view: 1.42.3 + prosemirror-transform: 1.12.2 + prosemirror-view: 1.42.6 - prosemirror-trailing-node@3.0.0(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.3): + prosemirror-trailing-node@3.0.0(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.6): dependencies: '@remirror/core-constants': 3.0.0 escape-string-regexp: 4.0.0 - prosemirror-model: 1.25.11 + prosemirror-model: 1.25.12 prosemirror-state: 1.4.4 - prosemirror-view: 1.42.3 + prosemirror-view: 1.42.6 - prosemirror-transform@1.12.0: + prosemirror-transform@1.12.2: dependencies: - prosemirror-model: 1.25.11 + prosemirror-model: 1.25.12 - prosemirror-view@1.42.3: + prosemirror-view@1.42.6: dependencies: - prosemirror-model: 1.25.11 + prosemirror-model: 1.25.12 prosemirror-state: 1.4.4 - prosemirror-transform: 1.12.0 + prosemirror-transform: 1.12.2 punycode.js@2.3.1: {} @@ -11268,12 +11268,12 @@ snapshots: ws@8.21.3: {} - y-prosemirror@1.3.7(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.3)(y-protocols@1.0.7(yjs@13.6.23))(yjs@13.6.23): + y-prosemirror@1.3.7(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.6)(y-protocols@1.0.7(yjs@13.6.23))(yjs@13.6.23): dependencies: lib0: 0.2.117 - prosemirror-model: 1.25.11 + prosemirror-model: 1.25.12 prosemirror-state: 1.4.4 - prosemirror-view: 1.42.3 + prosemirror-view: 1.42.6 y-protocols: 1.0.7(yjs@13.6.23) yjs: 13.6.23 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index dd019afb7f..c06799b90e 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -11,10 +11,11 @@ allowBuilds: iframe-resizer: true minimumReleaseAgeExclude: - '@tiptap/*' + - prosemirror-history@1.5.1 overrides: '@rollup/pluginutils>picomatch': '2.3.2' - 'prosemirror-model': '^1.25.11' - 'prosemirror-view': '^1.42.3' + 'prosemirror-model': '^1.25.12' + 'prosemirror-view': '^1.42.6' '@octokit/action>undici': '6.24.1' 'anymatch>picomatch': '2.3.2' 'glob': '^10.5.0'