diff --git a/packages/slate/src/transforms/node.ts b/packages/slate/src/transforms/node.ts
index 521f89d9e..4fac582a8 100644
--- a/packages/slate/src/transforms/node.ts
+++ b/packages/slate/src/transforms/node.ts
@@ -381,8 +381,7 @@ export const NodeTransforms: NodeTransforms = {
const emptyAncestor = Editor.above(editor, {
at: path,
mode: 'highest',
- match: n =>
- levels.includes(n) && Element.isElement(n) && n.children.length === 1,
+ match: n => levels.includes(n) && hasSingleChildNest(editor, n),
})
const emptyRef = emptyAncestor && Editor.pathRef(editor, emptyAncestor[1])
@@ -963,6 +962,23 @@ export const NodeTransforms: NodeTransforms = {
},
}
+const hasSingleChildNest = (editor: Editor, node: Node): boolean => {
+ if (Element.isElement(node)) {
+ const element = node as Element
+ if (Editor.isVoid(editor, node)) {
+ return true
+ } else if (element.children.length === 1) {
+ return hasSingleChildNest(editor, element.children[0])
+ } else {
+ return false
+ }
+ } else if (Editor.isEditor(node)) {
+ return false
+ } else {
+ return true
+ }
+}
+
/**
* Convert a range into a point by deleting it's content.
*/
diff --git a/packages/slate/test/transforms/mergeNodes/depth-block/block-nested-multi-child.tsx b/packages/slate/test/transforms/mergeNodes/depth-block/block-nested-multi-child.tsx
new file mode 100644
index 000000000..61eaf01a7
--- /dev/null
+++ b/packages/slate/test/transforms/mergeNodes/depth-block/block-nested-multi-child.tsx
@@ -0,0 +1,63 @@
+/** @jsx jsx */
+import { jsx } from '../../..'
+import { Transforms } from 'slate'
+
+export const run = editor => {
+ Transforms.mergeNodes(editor, {
+ at: {
+ path: [0, 1, 1, 0, 0, 0],
+ offset: 0,
+ },
+ })
+}
+
+export const input = (
+
+
+
+ 123
+
+
+
+ 45
+
+
+
+
+ c
+
+
+
+ edf
+
+
+
+
+
+
+
+)
+
+export const output = (
+
+
+
+ 123
+
+
+
+ 45c
+
+
+
+
+
+ edf
+
+
+
+
+
+
+
+)
diff --git a/packages/slate/test/transforms/mergeNodes/depth-block/block-nested-only-child.tsx b/packages/slate/test/transforms/mergeNodes/depth-block/block-nested-only-child.tsx
new file mode 100644
index 000000000..72562bbc4
--- /dev/null
+++ b/packages/slate/test/transforms/mergeNodes/depth-block/block-nested-only-child.tsx
@@ -0,0 +1,49 @@
+/** @jsx jsx */
+import { jsx } from '../../..'
+import { Transforms } from 'slate'
+
+export const run = editor => {
+ Transforms.mergeNodes(editor, {
+ at: {
+ path: [0, 1, 1, 0, 0, 0],
+ offset: 0,
+ },
+ })
+}
+
+export const input = (
+
+
+
+ 123
+
+
+
+ 45
+
+
+
+
+ c
+
+
+
+
+
+
+)
+
+export const output = (
+
+
+
+ 123
+
+
+
+ 45c
+
+
+
+
+)