{"version":3,"file":"index.mjs","sources":["../../../../../../packages/hooks/use-children/index.ts"],"sourcesContent":["import { getCurrentInstance, isVNode, provide, reactive } from 'vue'\n\nimport type {\n  ComponentInternalInstance,\n  ComponentPublicInstance,\n  InjectionKey,\n  VNode,\n  VNodeNormalizedChildren,\n} from 'vue'\n\nexport function flattenVNodes(children: VNodeNormalizedChildren) {\n  const result: VNode[] = []\n\n  const traverse = (children: VNodeNormalizedChildren) => {\n    if (Array.isArray(children)) {\n      children.forEach((child) => {\n        if (isVNode(child)) {\n          result.push(child)\n\n          if (child.component?.subTree) {\n            result.push(child.component.subTree)\n            traverse(child.component.subTree.children)\n          }\n\n          if (child.children) {\n            traverse(child.children)\n          }\n        }\n      })\n    }\n  }\n\n  traverse(children)\n\n  return result\n}\n\nconst findVNodeIndex = (vnodes: VNode[], vnode: VNode) => {\n  const index = vnodes.indexOf(vnode)\n  if (index === -1) {\n    return vnodes.findIndex(\n      (item) =>\n        vnode.key !== undefined &&\n        vnode.key !== null &&\n        item.type === vnode.type &&\n        item.key === vnode.key\n    )\n  }\n  return index\n}\n\n// sort children instances by vnodes order\nexport function sortChildren(\n  parent: ComponentInternalInstance,\n  publicChildren: ComponentPublicInstance[],\n  internalChildren: ComponentInternalInstance[]\n) {\n  const vnodes = flattenVNodes(parent.subTree.children)\n\n  internalChildren.sort(\n    (a, b) => findVNodeIndex(vnodes, a.vnode) - findVNodeIndex(vnodes, b.vnode)\n  )\n\n  const orderedPublicChildren = internalChildren.map((item) => item.proxy!)\n\n  publicChildren.sort((a, b) => {\n    const indexA = orderedPublicChildren.indexOf(a)\n    const indexB = orderedPublicChildren.indexOf(b)\n    return indexA - indexB\n  })\n}\n\nexport function useChildren<\n  Child extends ComponentPublicInstance = ComponentPublicInstance<\n    Record<any, any>,\n    any\n  >,\n  ProvideValue = never\n>(key: InjectionKey<ProvideValue>) {\n  const publicChildren: Child[] = reactive([])\n  const internalChildren: ComponentInternalInstance[] = reactive([])\n  const parent = getCurrentInstance()!\n\n  const linkChildren = (value?: ProvideValue) => {\n    const link = (child: ComponentInternalInstance) => {\n      if (child.proxy) {\n        internalChildren.push(child)\n        publicChildren.push(child.proxy as Child)\n        sortChildren(parent, publicChildren, internalChildren)\n      }\n    }\n\n    const unlink = (child: ComponentInternalInstance) => {\n      const index = internalChildren.indexOf(child)\n      publicChildren.splice(index, 1)\n      internalChildren.splice(index, 1)\n    }\n\n    provide(\n      key,\n      Object.assign(\n        {\n          link,\n          unlink,\n          children: publicChildren,\n          internalChildren,\n        },\n        value\n      )\n    )\n  }\n\n  return {\n    children: publicChildren,\n    linkChildren,\n  }\n}\n"],"names":["children"],"mappings":"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"}