UNPKG

@arco-design/web-vue

Version:

Arco Design Vue 2.0: A Vue.js 3 UI Library

189 lines (188 loc) 5.76 kB
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 };