inferno-clone-vnode
Version:
provides helper function to clone Inferno's vNodes
64 lines (60 loc) • 2.56 kB
JavaScript
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;
;