react-form-controlled
Version:
Intuitive react forms for building powerful applications
45 lines (37 loc) • 1.17 kB
JavaScript
import { Children, cloneElement } from 'react';
import Element from '../Element';
export default function traverse(child, processCallback, replaceCallback) {
if (Array.isArray(child)) {
return Children.map(child, children => traverse(children, processCallback, replaceCallback));
}
if (!child || typeof child === 'string') {
return child;
}
if (child === Element || Element.isPrototypeOf(child.type)) {
return child;
}
if (replaceCallback) {
const replacedChild = replaceCallback(child);
if (replacedChild) {
return traverse(replacedChild, processCallback, replaceCallback);
}
}
if (processCallback) {
const processedChild = processCallback(child);
if (processedChild) {
return processedChild;
}
}
// support for preact
const children = child.props && child.props.children || child.children;
if (children) {
const traversedChildren = traverse(children, processCallback, replaceCallback);
// speed up
if (traversedChildren === children) {
return child;
}
return cloneElement(child, {}, traversedChildren);
}
return child;
}
//# sourceMappingURL=traverse.js.map