{"version":3,"file":"index.mjs","names":[],"sources":["../../../../../packages/hooks/use-ordered-children/index.ts"],"sourcesContent":["import {\n  defineComponent,\n  h,\n  isVNode,\n  onMounted,\n  shallowRef,\n  triggerRef,\n} from 'vue'\nimport { flattedChildren } from '@element-plus/utils'\n\nimport type { Component, ComponentInternalInstance, VNode } from 'vue'\n\ntype ChildEssential = {\n  uid: number\n  getVnode: () => VNode\n}\n\nconst getOrderedChildren = <T>(\n  vm: ComponentInternalInstance,\n  childComponentName: string,\n  children: Record<number, T>\n): T[] => {\n  const nodes = flattedChildren(vm.subTree).filter(\n    (n): n is VNode =>\n      isVNode(n) &&\n      (n.type as Component)?.name === childComponentName &&\n      !!n.component\n  )\n  const uids = nodes.map((n) => n.component!.uid)\n  return uids.map((uid) => children[uid]).filter((p) => !!p)\n}\n\nexport const useOrderedChildren = <T extends ChildEssential>(\n  vm: ComponentInternalInstance,\n  childComponentName: string\n) => {\n  const children = shallowRef<Record<number, T>>({})\n  const orderedChildren = shallowRef<T[]>([])\n  const nodesMap = new WeakMap<ParentNode, Node[]>()\n\n  const addChild = (child: T) => {\n    children.value[child.uid] = child\n    triggerRef(children)\n\n    onMounted(() => {\n      const childNode = child.getVnode().el! as Node\n      const parentNode = childNode.parentNode!\n\n      if (!nodesMap.has(parentNode)) {\n        nodesMap.set(parentNode, [])\n\n        const originalFn = parentNode.insertBefore.bind(parentNode)\n        parentNode.insertBefore = <T extends Node>(\n          node: T,\n          anchor: Node | null\n        ) => {\n          // Schedule a job to update `orderedChildren` if the root element of child components is moved\n          const shouldSortChildren = nodesMap\n            .get(parentNode)!\n            .some((el) => node === el || anchor === el)\n          if (shouldSortChildren) triggerRef(children)\n\n          return originalFn(node, anchor)\n        }\n      }\n\n      nodesMap.get(parentNode)!.push(childNode)\n    })\n  }\n\n  const removeChild = (child: T) => {\n    delete children.value[child.uid]\n    triggerRef(children)\n\n    const childNode = child.getVnode().el! as Node\n    const parentNode = childNode.parentNode!\n    const childNodes = nodesMap.get(parentNode)!\n    const index = childNodes.indexOf(childNode)\n    childNodes.splice(index, 1)\n  }\n\n  const sortChildren = () => {\n    orderedChildren.value = getOrderedChildren(\n      vm,\n      childComponentName,\n      children.value\n    )\n  }\n\n  const IsolatedRenderer = (props: { render: () => VNode[] }) => {\n    return props.render()\n  }\n\n  // TODO: Refactor `el-description` before converting this to a functional component\n  const ChildrenSorter = defineComponent({\n    setup(_, { slots }) {\n      return () => {\n        sortChildren()\n\n        return slots.default\n          ? // Create a new `ReactiveEffect` to ensure `ChildrenSorter` doesn't track any extra dependencies\n            // @ts-ignore TODO: Remove this after Vue is upgraded\n            h(IsolatedRenderer, {\n              render: slots.default,\n            })\n          : null\n      }\n    },\n  })\n\n  return {\n    children: orderedChildren,\n    addChild,\n    removeChild,\n    ChildrenSorter,\n  }\n}\n"],"mappings":";;;;AAiBA,MAAM,sBACJ,IACA,oBACA,aACQ;AAQR,QAPc,gBAAgB,GAAG,QAAQ,CAAC,QACvC,MACC,QAAQ,EAAE,IACT,EAAE,MAAoB,SAAS,sBAChC,CAAC,CAAC,EAAE,UACP,CACkB,KAAK,MAAM,EAAE,UAAW,IAAI,CACnC,KAAK,QAAQ,SAAS,KAAK,CAAC,QAAQ,MAAM,CAAC,CAAC,EAAE;;AAG5D,MAAa,sBACX,IACA,uBACG;CACH,MAAM,WAAW,WAA8B,EAAE,CAAC;CAClD,MAAM,kBAAkB,WAAgB,EAAE,CAAC;CAC3C,MAAM,2BAAW,IAAI,SAA6B;CAElD,MAAM,YAAY,UAAa;AAC7B,WAAS,MAAM,MAAM,OAAO;AAC5B,aAAW,SAAS;AAEpB,kBAAgB;GACd,MAAM,YAAY,MAAM,UAAU,CAAC;GACnC,MAAM,aAAa,UAAU;AAE7B,OAAI,CAAC,SAAS,IAAI,WAAW,EAAE;AAC7B,aAAS,IAAI,YAAY,EAAE,CAAC;IAE5B,MAAM,aAAa,WAAW,aAAa,KAAK,WAAW;AAC3D,eAAW,gBACT,MACA,WACG;AAKH,SAH2B,SACxB,IAAI,WAAW,CACf,MAAM,OAAO,SAAS,MAAM,WAAW,GAAG,CACrB,YAAW,SAAS;AAE5C,YAAO,WAAW,MAAM,OAAO;;;AAInC,YAAS,IAAI,WAAW,CAAE,KAAK,UAAU;IACzC;;CAGJ,MAAM,eAAe,UAAa;AAChC,SAAO,SAAS,MAAM,MAAM;AAC5B,aAAW,SAAS;EAEpB,MAAM,YAAY,MAAM,UAAU,CAAC;EACnC,MAAM,aAAa,UAAU;EAC7B,MAAM,aAAa,SAAS,IAAI,WAAW;EAC3C,MAAM,QAAQ,WAAW,QAAQ,UAAU;AAC3C,aAAW,OAAO,OAAO,EAAE;;CAG7B,MAAM,qBAAqB;AACzB,kBAAgB,QAAQ,mBACtB,IACA,oBACA,SAAS,MACV;;CAGH,MAAM,oBAAoB,UAAqC;AAC7D,SAAO,MAAM,QAAQ;;AAoBvB,QAAO;EACL,UAAU;EACV;EACA;EACA,gBApBqB,gBAAgB,EACrC,MAAM,GAAG,EAAE,SAAS;AAClB,gBAAa;AACX,kBAAc;AAEd,WAAO,MAAM,UAGT,EAAE,kBAAkB,EAClB,QAAQ,MAAM,SACf,CAAC,GACF;;KAGT,CAAC;EAOD"}