Files
react-fiber-traverse/src/findNode.ts
T

89 lines
1.8 KiB
TypeScript

import { FiberNode } from "./mocked-types";
import { isNodeNotHtmlLike } from "./utils";
function findNodeByComponentName(
node: FiberNode | null,
expectedName: string
): FiberNode | null {
if (node === null) {
return null;
}
if (isNodeNotHtmlLike(node) && node.type.name === expectedName) {
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 (isNodeNotHtmlLike(node) && node.type === expectedClassOrFunction) {
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 findNodeByComponentRef(
node: FiberNode | null,
expectedClassInstance: React.Component
): FiberNode | null {
if (node === null) {
return null;
}
if (isNodeNotHtmlLike(node) && node.stateNode === expectedClassInstance) {
return node;
}
{
const returnVal = findNodeByComponentRef(node.child, expectedClassInstance);
if (returnVal !== null) {
return returnVal;
}
}
{
const returnVal = findNodeByComponentRef(node.sibling, expectedClassInstance);
if (returnVal !== null) {
return returnVal;
}
}
return null;
}
export { findNodeByComponentName, findNodeByComponent, findNodeByComponentRef };