@arco-design/web-vue
Version:
Arco Design Vue 2.0: A Vue.js 3 UI Library
189 lines (188 loc) • 5.76 kB
JavaScript
import { cloneVNode, isVNode, Fragment } from "vue";
import { isArray, isFunction, isString } from "./is.js";
const isElement = (vn) => {
return Boolean(vn && vn.shapeFlag & 1);
};
const isComponent = (vn, type) => {
return Boolean(vn && vn.shapeFlag & 6);
};
const isTextChildren = (child, children) => {
return Boolean(child && child.shapeFlag & 8);
};
const isArrayChildren = (vn, children) => {
return Boolean(vn && vn.shapeFlag & 16);
};
const isSlotsChildren = (vn, children) => {
return Boolean(vn && vn.shapeFlag & 32);
};
const getFirstComponent = (children) => {
var _a, _b;
if (!children) {
return void 0;
}
for (const child of children) {
if (isElement(child) || isComponent(child)) {
return child;
}
if (isArrayChildren(child, child.children)) {
const result = getFirstComponent(child.children);
if (result)
return result;
} else if (isSlotsChildren(child, child.children)) {
const children2 = (_b = (_a = child.children).default) == null ? void 0 : _b.call(_a);
if (children2) {
const result = getFirstComponent(children2);
if (result)
return result;
}
} else if (isArray(child)) {
const result = getFirstComponent(child);
if (result)
return result;
}
}
return void 0;
};
const isEmptyChildren = (children) => {
if (!children) {
return true;
}
for (const item of children) {
if (item.children) {
return false;
}
}
return true;
};
const mergeFirstChild = (children, extraProps) => {
if (children && children.length > 0) {
for (let i = 0; i < children.length; i++) {
const child = children[i];
if (isElement(child) || isComponent(child)) {
const props = isFunction(extraProps) ? extraProps(child) : extraProps;
children[i] = cloneVNode(child, props, true);
return true;
}
const _children = getChildrenArray(child);
if (_children && _children.length > 0) {
const result = mergeFirstChild(_children, extraProps);
if (result)
return true;
}
}
}
return false;
};
const getChildrenArray = (vn) => {
if (isArrayChildren(vn, vn.children)) {
return vn.children;
}
if (isArray(vn)) {
return vn;
}
return void 0;
};
const getFirstElementFromVNode = (vn) => {
var _a, _b;
if (isElement(vn)) {
return vn.el;
}
if (isComponent(vn)) {
if (((_a = vn.el) == null ? void 0 : _a.nodeType) === 1) {
return vn.el;
}
if ((_b = vn.component) == null ? void 0 : _b.subTree) {
const ele = getFirstElementFromVNode(vn.component.subTree);
if (ele)
return ele;
}
} else {
const children = getChildrenArray(vn);
return getFirstElementFromChildren(children);
}
return void 0;
};
const getFirstElementFromChildren = (children) => {
if (children && children.length > 0) {
for (const child of children) {
const element = getFirstElementFromVNode(child);
if (element)
return element;
}
}
return void 0;
};
const getAllElements = (children, includeText = false) => {
var _a, _b;
const results = [];
for (const item of children != null ? children : []) {
if (isElement(item) || isComponent(item) || includeText && isTextChildren(item, item.children)) {
results.push(item);
} else if (isArrayChildren(item, item.children)) {
results.push(...getAllElements(item.children, includeText));
} else if (isSlotsChildren(item, item.children)) {
results.push(...getAllElements((_b = (_a = item.children).default) == null ? void 0 : _b.call(_a), includeText));
} else if (isArray(item)) {
results.push(...getAllElements(item, includeText));
}
}
return results;
};
function unFragment(nodeList) {
function loop(nodes) {
const unFragmentNodeList = [];
nodes.forEach((node) => {
var _a, _b;
if (isVNode(node) && node.type === Fragment) {
if (isSlotsChildren(node, node.children)) {
unFragmentNodeList.push(...loop(((_b = (_a = node.children).default) == null ? void 0 : _b.call(_a)) || []));
} else if (isArrayChildren(node, node.children)) {
unFragmentNodeList.push(...loop(node.children));
} else if (isString(node.children)) {
unFragmentNodeList.push(node.children);
}
} else {
unFragmentNodeList.push(node);
}
});
return unFragmentNodeList;
}
return loop(nodeList);
}
const getSlotFunction = (param) => {
if (param) {
if (isFunction(param))
return param;
return () => param;
}
return void 0;
};
const getComponentsFromVNode = (vn, name) => {
var _a;
const components = [];
if (isComponent(vn, vn.type)) {
if (vn.type.name === name) {
if (vn.component) {
components.push(vn.component.uid);
}
} else if ((_a = vn.component) == null ? void 0 : _a.subTree) {
components.push(...getComponentsFromVNode(vn.component.subTree, name));
}
} else {
const children = getChildrenArray(vn);
if (children) {
components.push(...getComponentsFromChildren(children, name));
}
}
return components;
};
const getComponentsFromChildren = (children, name) => {
const components = [];
if (children && children.length > 0) {
for (const child of children) {
components.push(...getComponentsFromVNode(child, name));
}
}
return components;
};
export { getAllElements, getChildrenArray, getComponentsFromChildren, getComponentsFromVNode, getFirstComponent, getFirstElementFromChildren, getFirstElementFromVNode, getSlotFunction, isArrayChildren, isComponent, isElement, isEmptyChildren, isSlotsChildren, isTextChildren, mergeFirstChild, unFragment };