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'