UNPKG

inferno-clone-vnode

Version:

provides helper function to clone Inferno's vNodes

64 lines (60 loc) 2.56 kB
'use strict'; var inferno = require('inferno'); function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); } /* directClone is preferred over cloneVNode and used internally also. This function makes Inferno backwards compatible. And can be tree-shaked by modern bundlers */ /** * Clones given virtual node by creating new instance of it * @param {VNode} vNodeToClone virtual node to be cloned * @param {Props=} props additional props for new virtual node * @param {...*} childArgs new children for new virtual node * @returns {VNode} new virtual node */ function cloneVNode(vNodeToClone, props) { var _vNodeToClone$props; var flags = vNodeToClone.flags; var children = flags & 14 /* VNodeFlags.Component */ ? (_vNodeToClone$props = vNodeToClone.props) == null ? void 0 : _vNodeToClone$props.children : vNodeToClone.children; var childLen = arguments.length <= 2 ? 0 : arguments.length - 2; var className = vNodeToClone.className; var key = vNodeToClone.key; var ref = vNodeToClone.ref; if (props) { if (props.className !== void 0) { className = props.className; } if (props.ref !== void 0) { ref = props.ref; } if (props.key !== void 0) { key = props.key; } if (props.children !== void 0) { children = props.children; } } else { props = {}; } if (childLen === 1) { children = arguments.length <= 2 ? undefined : arguments[2]; } else if (childLen > 1) { children = []; for (var i = 0; i < childLen; i++) { children.push(i + 2 < 2 || arguments.length <= i + 2 ? undefined : arguments[i + 2]); } } props.children = children; if (flags & 14 /* VNodeFlags.Component */) { return inferno.createComponentVNode(flags, vNodeToClone.type, !vNodeToClone.props && !props ? inferno.EMPTY_OBJ : _extends({}, vNodeToClone.props, props), key, ref); } if (flags & 16 /* VNodeFlags.Text */) { return inferno.createTextVNode(children); } if (flags & 8192 /* VNodeFlags.Fragment */) { return inferno.createFragment(childLen === 1 ? [children] : children, 0 /* ChildFlags.UnknownChildren */, key); } return inferno.normalizeProps(inferno.createVNode(flags, vNodeToClone.type, className, null, 1 /* ChildFlags.HasInvalidChildren */, _extends({}, vNodeToClone.props, props), key, ref)); } exports.cloneVNode = cloneVNode;