Skip to content

Upgrading @tiptap/extension-link 2 to 3

Breaking2.27.3 → 3.32.2Breaking21Security11Platform2New102Changed259Fixed285Other45

Fetching 152 releases from GitHub…150 / 152
BreakingUpgrade verdict

16 breaking changes and 2 platform requirement changes and 11 security fixes.

  • Custom configuration keys on extensions now require extending the TypeScript types.
  • Clearing or setting content now triggers update events by default, making reactivity more predictable.
  • Menus like FloatingMenu, BubbleMenu, Mention and Suggestion now use Floating UI instead of Tippy.js, which requires code changes and a new peer dependency.
  • The package no longer ships a browser-global build; you must bundle it yourself if you relied on that.
Top 5 of 29 that need code or config changes
Breaking16
Node, Mark, and Extension configs no longer allow arbitrary keys unless their TypeScript interfaces are extended.
NodeMarkExtension
clearContent and setContent now emit updates by default.
clearContentsetContent
Replaces Tippy.js with Floating UI across menu-related extensions, removing tippyOptions in favor of an options prop.
FloatingMenuBubbleMenuMentionSuggestiontippyOptionsoptions
Switches to tsup for bundling, so UMD builds are no longer supported.
tsup
Renames the History extension to UndoRedo.
HistoryUndoRedo
Renames the CollaborationCursor extension to CollaborationCaret.
CollaborationCursorCollaborationCaret
Renames @tiptap/extension-utils to @tiptap/extensions.
@tiptap/extension-utils@tiptap/extensions
Removes tippy.js and replaces it with Floating UI for floating elements.
tippy.jsFloating UI
Changes Tiptap component prop types so that either the editor or the instance field is required.
Tiptapeditorinstance
Switches @tiptap/core to tsup for bundling, dropping UMD builds.
getPos now returns number | undefined for stronger typings.
getPos
editor.storage becomes per-editor instance and strongly typed.
editor.storage
VueNodeViewRenderer returns null for contentDOM when the node is not a leaf and no NodeViewContent is rendered.
VueNodeViewRenderercontentDOMNodeViewContent
Changes math node insertion so the current text selection is used and replaced when no LaTeX string is given.
The Math extension now renders math content using nodes instead of text content, which is not backwards compatible.
Updating a math equation's latex content now requires an explicit update command.
editor.commands.updateInlineMath()editor.commands.updateBlockMath()
Security11
Prevents extra CSS declarations from being rendered from editor content.
Prevents extra CSS declarations from being rendered from editor content.
Fixes a bug that allowed potentially unsafe color values from other collaboration clients; unsafe colors are now ignored.
Bumps prosemirror-view to ^1.42.3, fixing an XSS vulnerability where pasting crafted HTML could run arbitrary JavaScript.
prosemirror-view
Fixes a denial-of-service risk where crafted block or inline Markdown attributes could consume excessive CPU and block the event loop.
Prevents untrusted HTML attributes from changing an object's prototype when merged with mergeAttributes.
mergeAttributes
Escapes HTML string renderer text content and attribute values to prevent injected markup from untrusted content.
Fixes CVE-2025-62410 by updating happy-dom to ^20.0.2.
happy-dom
Fixes CVE-2025-61927 by bumping happy-dom to 20.0.0 in @tiptap/html.
happy-dom@tiptap/html
Bumps linkifyjs to the latest version to address a recently discovered prototype pollution vulnerability.
linkifyjs
Fixes Link extension commands not respecting XSS prevention via unallowed protocols.
Platform2
Adds @tiptap/pm as a peer dependency of @tiptap/extension-blockquote to avoid duplicate ProseMirror packages.
@tiptap/pm@tiptap/extension-blockquoteprosemirror-model
Requires installing @floating-ui/dom@^1.6.0 as a peer dependency.
@floating-ui/dom