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