import { clone, isString, isFunction, toLowerCase } from '../util'; import { isFunctionalComponent } from './functional-component'; /** Check if two nodes are equivalent. * @param {Element} node * @param {VNode} vnode * @private */ export function isSameNodeType(node, vnode) { if (isString(vnode)) { return node instanceof Text; } if (isString(vnode.nodeName)) { return isNamedNode(node, vnode.nodeName); } if (isFunction(vnode.nodeName)) { return node._componentConstructor===vnode.nodeName || isFunctionalComponent(vnode); } } export function isNamedNode(node, nodeName) { return node.normalizedNodeName===nodeName || toLowerCase(node.nodeName)===toLowerCase(nodeName); } /** * Reconstruct Component-style `props` from a VNode. * Ensures default/fallback values from `defaultProps`: * Own-properties of `defaultProps` not present in `vnode.attributes` are added. * @param {VNode} vnode * @returns {Object} props */ export function getNodeProps(vnode) { let props = clone(vnode.attributes); props.children = vnode.children; let defaultProps = vnode.nodeName.defaultProps; if (defaultProps) { for (let i in defaultProps) { if (props[i]===undefined) { props[i] = defaultProps[i]; } } } return props; }