Skip to content

Commit

Permalink
Warn when normalization removes node (#4769)
Browse files Browse the repository at this point in the history
* Warn when normalization removes node

Slate requires the invariant that children are all blocks or all inlines.
It enforces this in default normalization by removing children.
When such a node is removed, it's almost certainly due to a programming
error: the developer needs to fix their application to ensure it
maintains this invariant. But currently Slate does not tell the
developer this.

I made such a programming error, and spent a long time debugging nodes
that mysteriously went missing. I would have fixed it within 30 seconds
if Slate had warned me when it detected this error.

(Note I have used console.warn despite the eslint rule. As far as I can
see, Slate has no other facility for runtime warnings.)

* Add changeset
  • Loading branch information
jameshfisher authored Jan 6, 2022
1 parent e9a46ad commit 0ca31e7
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 0 deletions.
5 changes: 5 additions & 0 deletions .changeset/wild-penguins-shout.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'slate': patch
---

Warn when normalization removes node
8 changes: 8 additions & 0 deletions packages/slate/src/create-editor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,14 @@ export const createEditor = (): Editor => {
// other inline nodes, or parent blocks that only contain inlines and
// text.
if (isInlineOrText !== shouldHaveInlines) {
// eslint-disable-next-line no-console
console.warn(
`Removing ${
isInlineOrText ? 'inline' : 'block'
} node at path ${path.concat(n)} because parent expects ${
shouldHaveInlines ? 'inline' : 'block'
} children`
)
Transforms.removeNodes(editor, { at: path.concat(n), voids: true })
n--
} else if (Element.isElement(child)) {
Expand Down

0 comments on commit 0ca31e7

Please sign in to comment.