From 5897cee00125bf7941f17ef2ec29aa7b852ea4f4 Mon Sep 17 00:00:00 2001 From: bendtherules Date: Tue, 23 Jul 2019 11:13:40 +0530 Subject: [PATCH] Add 3 findNode methods - by name, comp and instance 1. By Component name 2. By Component (Class Or Function) reference 3. By Component (ClassComponent) instance reference --- src/findNode.ts | 91 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 src/findNode.ts diff --git a/src/findNode.ts b/src/findNode.ts new file mode 100644 index 0000000..b7e1c2f --- /dev/null +++ b/src/findNode.ts @@ -0,0 +1,91 @@ +import { FiberNode } from "./mocked-types"; +import { isNotHtmlLike } from "./utils"; + +function findNodeByComponentName( + node: FiberNode | null, + expectedName: string +): FiberNode | null { + if (node === null) { + return null; + } + + if (isNotHtmlLike(node) && node.type.name === expectedName) { + console.debug("Found node " + node); + return node; + } + + { + const returnVal = findNodeByComponentName(node.child, expectedName); + if (returnVal !== null) { + return returnVal; + } + } + { + const returnVal = findNodeByComponentName(node.sibling, expectedName); + if (returnVal !== null) { + return returnVal; + } + } + + return null; +} + +function findNodeByComponent( + node: FiberNode | null, + expectedClassOrFunction: React.ComponentType +): FiberNode | null { + if (node === null) { + return null; + } + + if (isNotHtmlLike(node) && node.type === expectedClassOrFunction) { + console.debug("Found node " + node); + return node; + } + + { + const returnVal = findNodeByComponent(node.child, expectedClassOrFunction); + if (returnVal !== null) { + return returnVal; + } + } + { + const returnVal = findNodeByComponent(node.sibling, expectedClassOrFunction); + if (returnVal !== null) { + return returnVal; + } + } + + return null; +} + +function findNodeByComponentInstance( + node: FiberNode | null, + expectedClassInstance: React.Component +): FiberNode | null { + if (node === null) { + return null; + } + + if (isNotHtmlLike(node) && node.stateNode === expectedClassInstance) { + console.debug("Found node " + node); + return node; + } + + { + const returnVal = findNodeByComponentInstance(node.child, expectedClassInstance); + if (returnVal !== null) { + return returnVal; + } + } + { + const returnVal = findNodeByComponentInstance(node.sibling, expectedClassInstance); + if (returnVal !== null) { + return returnVal; + } + } + + return null; +} + +export { findNodeByComponentName, findNodeByComponent, findNodeByComponentInstance };