element-plus
Version:
A Component Library for Vue 3
1 lines • 4.79 kB
Source Map (JSON)
{"version":3,"file":"only-child.mjs","sources":["../../../../../../packages/components/slot/src/only-child.tsx"],"sourcesContent":["import {\n Comment,\n Fragment,\n Text,\n cloneVNode,\n defineComponent,\n inject,\n withDirectives,\n} from 'vue'\nimport { NOOP, debugWarn, isObject } from '@element-plus/utils'\nimport {\n FORWARD_REF_INJECTION_KEY,\n useForwardRefDirective,\n useNamespace,\n} from '@element-plus/hooks'\n\nimport type { Ref, VNode } from 'vue'\n\nconst NAME = 'ElOnlyChild'\n\nexport const OnlyChild = defineComponent({\n name: NAME,\n setup(_, { slots, attrs }) {\n const forwardRefInjection = inject(FORWARD_REF_INJECTION_KEY)\n const forwardRefDirective = useForwardRefDirective(\n forwardRefInjection?.setForwardRef ?? NOOP\n )\n return () => {\n const defaultSlot = slots.default?.(attrs)\n if (!defaultSlot) return null\n const [firstLegitNode, length] = findFirstLegitChild(defaultSlot)\n\n if (!firstLegitNode) {\n debugWarn(NAME, 'no valid child node found')\n return null\n }\n if (length > 1) {\n debugWarn(NAME, 'requires exact only one valid child.')\n }\n\n return withDirectives(cloneVNode(firstLegitNode!, attrs), [\n [forwardRefDirective],\n ])\n }\n },\n})\n\nfunction findFirstLegitChild(\n node: VNode[] | undefined\n): [VNode | null, number] {\n if (!node) return [null, 0]\n const children = node as VNode[]\n const len = children.filter((c) => c.type !== Comment).length\n\n for (const child of children) {\n /**\n * when user uses h(Fragment, [text]) to render plain string,\n * this switch case just cannot handle, when the value is primitives\n * we should just return the wrapped string\n */\n if (isObject(child)) {\n switch (child.type) {\n case Comment:\n continue\n case Text:\n case 'svg':\n return [wrapTextContent(child), len]\n case Fragment:\n return findFirstLegitChild(child.children as VNode[])\n default:\n return [child, len]\n }\n }\n return [wrapTextContent(child), len]\n }\n return [null, 0]\n}\n\nfunction wrapTextContent(s: string | VNode) {\n const ns = useNamespace('only-child')\n return <span class={ns.e('content')}>{s}</span>\n}\n\nexport type OnlyChildExpose = {\n forwardRef: Ref<HTMLElement>\n}\n"],"names":["NAME","OnlyChild","defineComponent","name","setup","_","slots","attrs","forwardRefInjection","inject","FORWARD_REF_INJECTION_KEY","forwardRefDirective","useForwardRefDirective","setForwardRef","NOOP","_a","defaultSlot","default","firstLegitNode","length","findFirstLegitChild","debugWarn","withDirectives","cloneVNode","node","children","len","filter","c","type","Comment","child","isObject","Text","wrapTextContent","Fragment","s","ns","useNamespace","_createVNode","e"],"mappings":";;;;;;AAkBA,MAAMA,IAAAA,GAAO,aAAA;AAEN,MAAMC,4BAAYC,eAAAA,CAAgB;AAAA,EACvCC,IAAAA,EAAMH,IAAAA;AAAAA,EACNI,MAAMC,CAAAA,EAAG;AAAA,IAAEC,KAAAA;AAAAA,IAAOC;AAAAA,GAAM,EAAG;AAtB7B,IAAA,IAAA,EAAA;AAuBI,IAAA,MAAMC,mBAAAA,GAAsBC,OAAOC,yBAAyB,CAAA;AAC5D,IAAA,MAAMC,mBAAAA,GAAsBC,sBAAAA,CAAAA,CAC1BJ,EAAAA,GAAAA,mBAAAA,IAAAA,IAAAA,GAAAA,MAAAA,GAAAA,mBAAAA,CAAqBK,aAAAA,KAArBL,YAAsCM,IACxC,CAAA;AACA,IAAA,OAAO,MAAM;AA3BjB,MAAA,IAAAC,GAAAA;AA4BM,MAAA,MAAMC,eAAcV,GAAAA,GAAAA,KAAAA,CAAMW,OAAAA,KAANX,IAAAA,GAAAA,MAAAA,GAAAA,IAAAA,IAAAA,CAAAA,KAAAA,EAAgBC,KAAAA,CAAAA;AACpC,MAAA,IAAI,CAACS,aAAa,OAAO,IAAA;AACzB,MAAA,MAAM,CAACE,cAAAA,EAAgBC,MAAM,CAAA,GAAIC,oBAAoBJ,WAAW,CAAA;AAEhE,MAAA,IAAI,CAACE,cAAAA,EAAgB;AACnBG,QAAAA,SAAAA,CAAUrB,MAAM,2BAA2B,CAAA;AAC3C,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,IAAImB,SAAS,CAAA,EAAG;AACdE,QAAAA,SAAAA,CAAUrB,MAAM,sCAAsC,CAAA;AAAA,MACxD;AAEA,MAAA,OAAOsB,cAAAA,CAAeC,WAAWL,cAAAA,EAAiBX,KAAK,GAAG,CACxD,CAACI,mBAAmB,CAAC,CACtB,CAAA;AAAA,IACH,CAAA;AAAA,EACF;AACF,CAAC;AAED,SAASS,oBACPI,IAAAA,EACwB;AACxB,EAAA,IAAI,CAACA,IAAAA,EAAM,OAAO,CAAC,MAAM,CAAC,CAAA;AAC1B,EAAA,MAAMC,QAAAA,GAAWD,IAAAA;AACjB,EAAA,MAAME,MAAMD,QAAAA,CAASE,MAAAA,CAAQC,OAAMA,CAAAA,CAAEC,IAAAA,KAASC,OAAO,CAAA,CAAEX,MAAAA;AAEvD,EAAA,KAAA,MAAWY,SAASN,QAAAA,EAAU;AAM5B,IAAA,IAAIO,QAAAA,CAASD,KAAK,CAAA,EAAG;AACnB,MAAA,QAAQA,MAAMF,IAAAA;AAAI,QAChB,KAAKC,OAAAA;AACH,UAAA;AAAA,QACF,KAAKG,IAAAA;AAAAA,QACL,KAAK,KAAA;AACH,UAAA,OAAO,CAACC,eAAAA,CAAgBH,KAAK,CAAA,EAAGL,GAAG,CAAA;AAAA,QACrC,KAAKS,QAAAA;AACH,UAAA,OAAOf,mBAAAA,CAAoBW,MAAMN,QAAmB,CAAA;AAAA,QACtD;AACE,UAAA,OAAO,CAACM,OAAOL,GAAG,CAAA;AAAA;AACtB,IACF;AACA,IAAA,OAAO,CAACQ,eAAAA,CAAgBH,KAAK,CAAA,EAAGL,GAAG,CAAA;AAAA,EACrC;AACA,EAAA,OAAO,CAAC,MAAM,CAAC,CAAA;AACjB;AAEA,SAASQ,gBAAgBE,CAAAA,EAAmB;AAC1C,EAAA,MAAMC,EAAAA,GAAKC,aAAa,YAAY,CAAA;AACpC,EAAA,OAAAC,YAAA,MAAA,EAAA;AAAA,IAAA,OAAA,EAAoBF,EAAAA,CAAGG,CAAAA,CAAE,SAAS;AAAA,GAAC,EAAA,CAAGJ,CAAC,CAAA,CAAA;AACzC;;;;"}