Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: ueberdosis/tiptap
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: @tiptap/core@2.5.6
Choose a base ref
...
head repository: ueberdosis/tiptap
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: @tiptap/core@2.5.7
Choose a head ref
  • 5 commits
  • 114 files changed
  • 3 contributors

Commits on Jul 24, 2024

  1. fix(core): address enableContentCheck insertion bug (#5390)

    nperez0111 authored Jul 24, 2024
    Copy the full SHA
    cc3497e View commit details

Commits on Jul 25, 2024

  1. fix(core): isNodeEmpty no longer considers attributes for it's checks (

    nperez0111 authored Jul 25, 2024
    Copy the full SHA
    b012471 View commit details

Commits on Jul 26, 2024

  1. fix(react): if using a deps array, destroy the previous instance

    nperez0111 committed Jul 26, 2024
    Copy the full SHA
    42dc27a View commit details
  2. fix: emit a contentError on inserting invalid content

    nperez0111 committed Jul 26, 2024
    Copy the full SHA
    d3e88e7 View commit details
  3. chore: publish a new release version (#5375)

    Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
    github-actions[bot] and github-actions[bot] authored Jul 26, 2024
    Copy the full SHA
    a1c5120 View commit details
Showing with 961 additions and 250 deletions.
  1. +8 −0 packages/core/CHANGELOG.md
  2. +3 −3 packages/core/package.json
  3. +2 −0 packages/core/src/Editor.ts
  4. +7 −0 packages/core/src/commands/insertContentAt.ts
  5. +21 −13 packages/core/src/helpers/createNodeFromContent.ts
  6. +34 −4 packages/core/src/helpers/isNodeEmpty.ts
  7. +8 −0 packages/extension-blockquote/CHANGELOG.md
  8. +3 −3 packages/extension-blockquote/package.json
  9. +8 −0 packages/extension-bold/CHANGELOG.md
  10. +3 −3 packages/extension-bold/package.json
  11. +9 −0 packages/extension-bubble-menu/CHANGELOG.md
  12. +5 −5 packages/extension-bubble-menu/package.json
  13. +8 −0 packages/extension-bullet-list/CHANGELOG.md
  14. +3 −3 packages/extension-bullet-list/package.json
  15. +9 −0 packages/extension-character-count/CHANGELOG.md
  16. +5 −5 packages/extension-character-count/package.json
  17. +10 −0 packages/extension-code-block-lowlight/CHANGELOG.md
  18. +7 −7 packages/extension-code-block-lowlight/package.json
  19. +9 −0 packages/extension-code-block/CHANGELOG.md
  20. +5 −5 packages/extension-code-block/package.json
  21. +8 −0 packages/extension-code/CHANGELOG.md
  22. +3 −3 packages/extension-code/package.json
  23. +8 −0 packages/extension-collaboration-cursor/CHANGELOG.md
  24. +3 −3 packages/extension-collaboration-cursor/package.json
  25. +9 −0 packages/extension-collaboration/CHANGELOG.md
  26. +5 −5 packages/extension-collaboration/package.json
  27. +9 −0 packages/extension-color/CHANGELOG.md
  28. +5 −5 packages/extension-color/package.json
  29. +8 −0 packages/extension-document/CHANGELOG.md
  30. +3 −3 packages/extension-document/package.json
  31. +9 −0 packages/extension-dropcursor/CHANGELOG.md
  32. +5 −5 packages/extension-dropcursor/package.json
  33. +9 −0 packages/extension-floating-menu/CHANGELOG.md
  34. +5 −5 packages/extension-floating-menu/package.json
  35. +9 −0 packages/extension-focus/CHANGELOG.md
  36. +5 −5 packages/extension-focus/package.json
  37. +9 −0 packages/extension-font-family/CHANGELOG.md
  38. +5 −5 packages/extension-font-family/package.json
  39. +9 −0 packages/extension-gapcursor/CHANGELOG.md
  40. +5 −5 packages/extension-gapcursor/package.json
  41. +8 −0 packages/extension-hard-break/CHANGELOG.md
  42. +3 −3 packages/extension-hard-break/package.json
  43. +8 −0 packages/extension-heading/CHANGELOG.md
  44. +3 −3 packages/extension-heading/package.json
  45. +8 −0 packages/extension-highlight/CHANGELOG.md
  46. +3 −3 packages/extension-highlight/package.json
  47. +9 −0 packages/extension-history/CHANGELOG.md
  48. +5 −5 packages/extension-history/package.json
  49. +9 −0 packages/extension-horizontal-rule/CHANGELOG.md
  50. +5 −5 packages/extension-horizontal-rule/package.json
  51. +8 −0 packages/extension-image/CHANGELOG.md
  52. +3 −3 packages/extension-image/package.json
  53. +8 −0 packages/extension-italic/CHANGELOG.md
  54. +3 −3 packages/extension-italic/package.json
  55. +9 −0 packages/extension-link/CHANGELOG.md
  56. +5 −5 packages/extension-link/package.json
  57. +8 −0 packages/extension-list-item/CHANGELOG.md
  58. +3 −3 packages/extension-list-item/package.json
  59. +8 −0 packages/extension-list-keymap/CHANGELOG.md
  60. +3 −3 packages/extension-list-keymap/package.json
  61. +10 −0 packages/extension-mention/CHANGELOG.md
  62. +7 −7 packages/extension-mention/package.json
  63. +8 −0 packages/extension-ordered-list/CHANGELOG.md
  64. +3 −3 packages/extension-ordered-list/package.json
  65. +8 −0 packages/extension-paragraph/CHANGELOG.md
  66. +3 −3 packages/extension-paragraph/package.json
  67. +10 −0 packages/extension-placeholder/CHANGELOG.md
  68. +5 −5 packages/extension-placeholder/package.json
  69. +8 −0 packages/extension-strike/CHANGELOG.md
  70. +3 −3 packages/extension-strike/package.json
  71. +8 −0 packages/extension-subscript/CHANGELOG.md
  72. +3 −3 packages/extension-subscript/package.json
  73. +8 −0 packages/extension-superscript/CHANGELOG.md
  74. +3 −3 packages/extension-superscript/package.json
  75. +8 −0 packages/extension-table-cell/CHANGELOG.md
  76. +3 −3 packages/extension-table-cell/package.json
  77. +8 −0 packages/extension-table-header/CHANGELOG.md
  78. +3 −3 packages/extension-table-header/package.json
  79. +8 −0 packages/extension-table-row/CHANGELOG.md
  80. +3 −3 packages/extension-table-row/package.json
  81. +9 −0 packages/extension-table/CHANGELOG.md
  82. +5 −5 packages/extension-table/package.json
  83. +9 −0 packages/extension-task-item/CHANGELOG.md
  84. +5 −5 packages/extension-task-item/package.json
  85. +8 −0 packages/extension-task-list/CHANGELOG.md
  86. +3 −3 packages/extension-task-list/package.json
  87. +8 −0 packages/extension-text-align/CHANGELOG.md
  88. +3 −3 packages/extension-text-align/package.json
  89. +8 −0 packages/extension-text-style/CHANGELOG.md
  90. +3 −3 packages/extension-text-style/package.json
  91. +8 −0 packages/extension-text/CHANGELOG.md
  92. +3 −3 packages/extension-text/package.json
  93. +8 −0 packages/extension-typography/CHANGELOG.md
  94. +3 −3 packages/extension-typography/package.json
  95. +8 −0 packages/extension-underline/CHANGELOG.md
  96. +3 −3 packages/extension-underline/package.json
  97. +8 −0 packages/extension-youtube/CHANGELOG.md
  98. +3 −3 packages/extension-youtube/package.json
  99. +9 −0 packages/html/CHANGELOG.md
  100. +5 −5 packages/html/package.json
  101. +2 −0 packages/pm/CHANGELOG.md
  102. +1 −1 packages/pm/package.json
  103. +12 −0 packages/react/CHANGELOG.md
  104. +7 −7 packages/react/package.json
  105. +4 −0 packages/react/src/useEditor.ts
  106. +26 −0 packages/starter-kit/CHANGELOG.md
  107. +20 −20 packages/starter-kit/package.json
  108. +9 −0 packages/suggestion/CHANGELOG.md
  109. +5 −5 packages/suggestion/package.json
  110. +11 −0 packages/vue-2/CHANGELOG.md
  111. +7 −7 packages/vue-2/package.json
  112. +11 −0 packages/vue-3/CHANGELOG.md
  113. +7 −7 packages/vue-3/package.json
  114. +183 −0 tests/cypress/integration/core/isNodeEmpty.spec.ts
8 changes: 8 additions & 0 deletions packages/core/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
# Change Log

## 2.5.7

### Patch Changes

- b012471: This addresses an issue with `isNodeEmpty` function where it was also comparing node attributes and finding mismatches on actually empty nodes. This helps placeholders find empty content correctly
- cc3497e: Fixes a bug where if `enableContentCheck` was true, inserting content as JSON nodes would fail. This was because the node that was being created technically had a different schema than the content being inserted, so it would fail to generate the correct content value
- @tiptap/pm@2.5.7

## 2.5.6

### Patch Changes
6 changes: 3 additions & 3 deletions packages/core/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "@tiptap/core",
"description": "headless rich text editor",
"version": "2.5.6",
"version": "2.5.7",
"homepage": "https://tiptap.dev",
"keywords": [
"tiptap",
@@ -32,10 +32,10 @@
"dist"
],
"devDependencies": {
"@tiptap/pm": "^2.5.6"
"@tiptap/pm": "^2.5.7"
},
"peerDependencies": {
"@tiptap/pm": "^2.5.6"
"@tiptap/pm": "^2.5.7"
},
"repository": {
"type": "git",
2 changes: 2 additions & 0 deletions packages/core/src/Editor.ts
Original file line number Diff line number Diff line change
@@ -39,6 +39,7 @@ import { isFunction } from './utilities/isFunction.js'

export * as extensions from './extensions/index.js'

// @ts-ignore
export interface TiptapEditorHTMLElement extends HTMLElement {
editor?: Editor
}
@@ -340,6 +341,7 @@ export class Editor extends EventEmitter<EditorEvents> {

// Let’s store the editor instance in the DOM element.
// So we’ll have access to it for tests.
// @ts-ignore
const dom = this.view.dom as TiptapEditorHTMLElement

dom.editor = this
7 changes: 7 additions & 0 deletions packages/core/src/commands/insertContentAt.ts
Original file line number Diff line number Diff line change
@@ -81,6 +81,13 @@ export const insertContentAt: RawCommands['insertContentAt'] = (position, value,
errorOnInvalidContent: options.errorOnInvalidContent ?? editor.options.enableContentCheck,
})
} catch (e) {
editor.emit('contentError', {
editor,
error: e as Error,
disableCollaboration: () => {
console.error('[tiptap error]: Unable to disable collaboration at this point in time')
},
})
return false
}

34 changes: 21 additions & 13 deletions packages/core/src/helpers/createNodeFromContent.ts
Original file line number Diff line number Diff line change
@@ -58,13 +58,14 @@ export function createNodeFromContent(
}

if (isTextContent) {
let schemaToUse = schema
let hasInvalidContent = false
let invalidContent = ''

// Only ever check for invalid content if we're supposed to throw an error
// Check for invalid content
if (options.errorOnInvalidContent) {
schemaToUse = new Schema({
let hasInvalidContent = false
let invalidContent = ''

// A copy of the current schema with a catch-all node at the end
const contentCheckSchema = new Schema({
topNode: schema.spec.topNode,
marks: schema.spec.marks,
// Prosemirror's schemas are executed such that: the last to execute, matches last
@@ -88,19 +89,26 @@ export function createNodeFromContent(
},
}),
})
}

const parser = DOMParser.fromSchema(schemaToUse)
if (options.slice) {
DOMParser.fromSchema(contentCheckSchema).parseSlice(elementFromString(content), options.parseOptions)
} else {
DOMParser.fromSchema(contentCheckSchema).parse(elementFromString(content), options.parseOptions)
}

const response = options.slice
? parser.parseSlice(elementFromString(content), options.parseOptions).content
: parser.parse(elementFromString(content), options.parseOptions)
if (options.errorOnInvalidContent && hasInvalidContent) {
throw new Error('[tiptap error]: Invalid HTML content', { cause: new Error(`Invalid element found: ${invalidContent}`) })
}
}

const parser = DOMParser.fromSchema(schema)

if (options.errorOnInvalidContent && hasInvalidContent) {
throw new Error('[tiptap error]: Invalid HTML content', { cause: new Error(`Invalid element found: ${invalidContent}`) })
if (options.slice) {
return parser.parseSlice(elementFromString(content), options.parseOptions).content
}

return response
return parser.parse(elementFromString(content), options.parseOptions)

}

return createNodeFromContent('', schema, options)
38 changes: 34 additions & 4 deletions packages/core/src/helpers/isNodeEmpty.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,41 @@
import { Node as ProseMirrorNode } from '@tiptap/pm/model'

export function isNodeEmpty(node: ProseMirrorNode): boolean {
const defaultContent = node.type.createAndFill(node.attrs)
/**
* Returns true if the given node is empty.
* When `checkChildren` is true (default), it will also check if all children are empty.
*/
export function isNodeEmpty(
node: ProseMirrorNode,
{ checkChildren }: { checkChildren: boolean } = { checkChildren: true },
): boolean {
if (node.isText) {
return !node.text
}

if (node.content.childCount === 0) {
return true
}

if (!defaultContent) {
if (node.isLeaf) {
return false
}

return node.eq(defaultContent)
if (checkChildren) {
let hasSameContent = true

node.content.forEach(childNode => {
if (hasSameContent === false) {
// Exit early for perf
return
}

if (!isNodeEmpty(childNode)) {
hasSameContent = false
}
})

return hasSameContent
}

return false
}
8 changes: 8 additions & 0 deletions packages/extension-blockquote/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
# Change Log

## 2.5.7

### Patch Changes

- Updated dependencies [b012471]
- Updated dependencies [cc3497e]
- @tiptap/core@2.5.7

## 2.5.6

### Patch Changes
6 changes: 3 additions & 3 deletions packages/extension-blockquote/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "@tiptap/extension-blockquote",
"description": "blockquote extension for tiptap",
"version": "2.5.6",
"version": "2.5.7",
"homepage": "https://tiptap.dev",
"keywords": [
"tiptap",
@@ -29,10 +29,10 @@
"dist"
],
"devDependencies": {
"@tiptap/core": "^2.5.6"
"@tiptap/core": "^2.5.7"
},
"peerDependencies": {
"@tiptap/core": "^2.5.6"
"@tiptap/core": "^2.5.7"
},
"repository": {
"type": "git",
8 changes: 8 additions & 0 deletions packages/extension-bold/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
# Change Log

## 2.5.7

### Patch Changes

- Updated dependencies [b012471]
- Updated dependencies [cc3497e]
- @tiptap/core@2.5.7

## 2.5.6

### Patch Changes
6 changes: 3 additions & 3 deletions packages/extension-bold/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "@tiptap/extension-bold",
"description": "bold extension for tiptap",
"version": "2.5.6",
"version": "2.5.7",
"homepage": "https://tiptap.dev",
"keywords": [
"tiptap",
@@ -29,10 +29,10 @@
"dist"
],
"devDependencies": {
"@tiptap/core": "^2.5.6"
"@tiptap/core": "^2.5.7"
},
"peerDependencies": {
"@tiptap/core": "^2.5.6"
"@tiptap/core": "^2.5.7"
},
"repository": {
"type": "git",
9 changes: 9 additions & 0 deletions packages/extension-bubble-menu/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
# Change Log

## 2.5.7

### Patch Changes

- Updated dependencies [b012471]
- Updated dependencies [cc3497e]
- @tiptap/core@2.5.7
- @tiptap/pm@2.5.7

## 2.5.6

### Patch Changes
10 changes: 5 additions & 5 deletions packages/extension-bubble-menu/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "@tiptap/extension-bubble-menu",
"description": "bubble-menu extension for tiptap",
"version": "2.5.6",
"version": "2.5.7",
"homepage": "https://tiptap.dev",
"keywords": [
"tiptap",
@@ -38,12 +38,12 @@
},
"sideEffects": false,
"devDependencies": {
"@tiptap/core": "^2.5.6",
"@tiptap/pm": "^2.5.6"
"@tiptap/core": "^2.5.7",
"@tiptap/pm": "^2.5.7"
},
"peerDependencies": {
"@tiptap/core": "^2.5.6",
"@tiptap/pm": "^2.5.6"
"@tiptap/core": "^2.5.7",
"@tiptap/pm": "^2.5.7"
},
"scripts": {
"clean": "rm -rf dist",
8 changes: 8 additions & 0 deletions packages/extension-bullet-list/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
# Change Log

## 2.5.7

### Patch Changes

- Updated dependencies [b012471]
- Updated dependencies [cc3497e]
- @tiptap/core@2.5.7

## 2.5.6

### Patch Changes
6 changes: 3 additions & 3 deletions packages/extension-bullet-list/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "@tiptap/extension-bullet-list",
"description": "bullet list extension for tiptap",
"version": "2.5.6",
"version": "2.5.7",
"homepage": "https://tiptap.dev",
"keywords": [
"tiptap",
@@ -29,10 +29,10 @@
"dist"
],
"devDependencies": {
"@tiptap/core": "^2.5.6"
"@tiptap/core": "^2.5.7"
},
"peerDependencies": {
"@tiptap/core": "^2.5.6"
"@tiptap/core": "^2.5.7"
},
"repository": {
"type": "git",
9 changes: 9 additions & 0 deletions packages/extension-character-count/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
# Change Log

## 2.5.7

### Patch Changes

- Updated dependencies [b012471]
- Updated dependencies [cc3497e]
- @tiptap/core@2.5.7
- @tiptap/pm@2.5.7

## 2.5.6

### Patch Changes
10 changes: 5 additions & 5 deletions packages/extension-character-count/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "@tiptap/extension-character-count",
"description": "font family extension for tiptap",
"version": "2.5.6",
"version": "2.5.7",
"homepage": "https://tiptap.dev",
"keywords": [
"tiptap",
@@ -29,12 +29,12 @@
"dist"
],
"devDependencies": {
"@tiptap/core": "^2.5.6",
"@tiptap/pm": "^2.5.6"
"@tiptap/core": "^2.5.7",
"@tiptap/pm": "^2.5.7"
},
"peerDependencies": {
"@tiptap/core": "^2.5.6",
"@tiptap/pm": "^2.5.6"
"@tiptap/core": "^2.5.7",
"@tiptap/pm": "^2.5.7"
},
"repository": {
"type": "git",
10 changes: 10 additions & 0 deletions packages/extension-code-block-lowlight/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,15 @@
# Change Log

## 2.5.7

### Patch Changes

- Updated dependencies [b012471]
- Updated dependencies [cc3497e]
- @tiptap/core@2.5.7
- @tiptap/extension-code-block@2.5.7
- @tiptap/pm@2.5.7

## 2.5.6

### Patch Changes
Loading