Skip to content

Commit

Permalink
Warn when normalization removes node
Browse files Browse the repository at this point in the history
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.)
  • Loading branch information
jameshfisher committed Jan 5, 2022
1 parent e9a46ad commit c20580f
Showing 1 changed file with 10 additions and 1 deletion.
11 changes: 10 additions & 1 deletion packages/slate/src/create-editor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -227,7 +227,16 @@ export const createEditor = (): Editor => {
// other inline nodes, or parent blocks that only contain inlines and
// text.
if (isInlineOrText !== shouldHaveInlines) {
Transforms.removeNodes(editor, { at: path.concat(n), voids: true })
// 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`
)
const removePath = path.concat(n)
Transforms.removeNodes(editor, { at: removePath, voids: true })
n--
} else if (Element.isElement(child)) {
// Ensure that inline nodes are surrounded by text nodes.
Expand Down

0 comments on commit c20580f

Please sign in to comment.