diff --git a/packages/slate/src/interfaces/node.ts b/packages/slate/src/interfaces/node.ts
index 05bea24e4c..d62e83d91a 100644
--- a/packages/slate/src/interfaces/node.ts
+++ b/packages/slate/src/interfaces/node.ts
@@ -131,6 +131,11 @@ export interface NodeInterface {
*/
get: (root: Node, path: Path) => Node
+ /**
+ * Similar to get, but returns undefined if the node does not exist.
+ */
+ getIf: (root: Node, path: Path) => Node | undefined
+
/**
* Check if a descendant node exists at a specific path.
*/
@@ -408,6 +413,22 @@ export const Node: NodeInterface = {
return node
},
+ getIf(root: Node, path: Path): Node | undefined {
+ let node = root
+
+ for (let i = 0; i < path.length; i++) {
+ const p = path[i]
+
+ if (Text.isText(node) || !node.children[p]) {
+ return
+ }
+
+ node = node.children[p]
+ }
+
+ return node
+ },
+
has(root: Node, path: Path): boolean {
let node = root
diff --git a/packages/slate/test/interfaces/Node/getIf/root.tsx b/packages/slate/test/interfaces/Node/getIf/root.tsx
new file mode 100644
index 0000000000..e42fe02fc2
--- /dev/null
+++ b/packages/slate/test/interfaces/Node/getIf/root.tsx
@@ -0,0 +1,17 @@
+/** @jsx jsx */
+import { Node } from 'slate'
+import { jsx } from 'slate-hyperscript'
+import { cloneDeep } from 'lodash'
+
+export const input = (
+
+
+
+
+
+)
+export const test = value => {
+ return Node.getIf(value, [])
+}
+export const skip = true // TODO: see https://github.com/ianstormtaylor/slate/pull/4188
+export const output = cloneDeep(input)
diff --git a/packages/slate/test/interfaces/Node/getIf/success.tsx b/packages/slate/test/interfaces/Node/getIf/success.tsx
new file mode 100644
index 0000000000..49879127a3
--- /dev/null
+++ b/packages/slate/test/interfaces/Node/getIf/success.tsx
@@ -0,0 +1,19 @@
+/** @jsx jsx */
+import { Node } from 'slate'
+import { jsx } from 'slate-hyperscript'
+
+export const input = (
+
+
+
+
+
+)
+export const test = value => {
+ return Node.getIf(value, [0])
+}
+export const output = (
+
+
+
+)
diff --git a/packages/slate/test/interfaces/Node/getIf/undefined.tsx b/packages/slate/test/interfaces/Node/getIf/undefined.tsx
new file mode 100644
index 0000000000..c4c41331f9
--- /dev/null
+++ b/packages/slate/test/interfaces/Node/getIf/undefined.tsx
@@ -0,0 +1,15 @@
+/** @jsx jsx */
+import { Node } from 'slate'
+import { jsx } from 'slate-hyperscript'
+
+export const input = (
+
+
+
+
+
+)
+export const test = value => {
+ return Node.getIf(value, [0, 0, 0])
+}
+export const output = undefined