@vuesax-alpha/nightly
Version:
A Component Library for Vue 3
1 lines • 4.22 kB
Source Map (JSON)
{"version":3,"file":"only-child.mjs","sources":["../../../../../../packages/components/slot/src/only-child.ts"],"sourcesContent":["import {\n Comment,\n Fragment,\n Text,\n cloneVNode,\n defineComponent,\n h,\n inject,\n withDirectives,\n} from 'vue'\nimport { NOOP } from '@vue/shared'\nimport {\n FORWARD_REF_INJECTION_KEY,\n useForwardRefDirective,\n useNamespace,\n} from '@vuesax-alpha/hooks'\nimport { debugWarn, isObject } from '@vuesax-alpha/utils'\n\nimport type { Ref, VNode } from 'vue'\n\nconst NAME = 'VsOnlyChild'\n\nexport const OnlyChild = defineComponent({\n name: NAME,\n setup(_, { slots, attrs }) {\n return () => {\n const forwardRefInjection = inject(FORWARD_REF_INJECTION_KEY, undefined)\n const forwardRefDirective = useForwardRefDirective(\n forwardRefInjection?.setForwardRef ?? NOOP\n )\n\n const defaultSlot = slots.default?.(attrs)\n if (!defaultSlot) return null\n\n if (defaultSlot.length > 1) {\n debugWarn(NAME, 'requires exact only one valid child.')\n return null\n }\n\n const firstLegitNode = findFirstLegitChild(defaultSlot)\n if (!firstLegitNode) {\n debugWarn(NAME, 'no valid child node found')\n return null\n }\n\n return withDirectives(cloneVNode(firstLegitNode!), [\n [forwardRefDirective],\n ])\n }\n },\n})\n\nfunction findFirstLegitChild(node: VNode[] | undefined): VNode | null {\n if (!node) return null\n const children = node as VNode[]\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)\n case Fragment:\n return findFirstLegitChild(child.children as VNode[])\n default:\n return child\n }\n }\n return wrapTextContent(child)\n }\n return null\n}\n\nfunction wrapTextContent(s: string | VNode) {\n const ns = useNamespace('only-child')\n return h(\n 'span',\n {\n className: ns.e('content'),\n },\n s\n )\n}\n\nexport interface OnlyChildExpose {\n forwardRef: Ref<HTMLElement>\n}\n"],"names":[],"mappings":";;;;;;;;AAoBA,MAAM,IAAO,GAAA,aAAA,CAAA;AAEN,MAAM,YAAY,eAAgB,CAAA;AAAA,EACvC,IAAM,EAAA,IAAA;AAAA,EACN,KAAM,CAAA,CAAA,EAAG,EAAE,KAAA,EAAO,OAAS,EAAA;AACzB,IAAA,OAAO,MAAM;AAzBjB,MAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AA0BM,MAAM,MAAA,mBAAA,GAAsB,MAAO,CAAA,yBAAA,EAA2B,KAAS,CAAA,CAAA,CAAA;AACvE,MAAA,MAAM,mBAAsB,GAAA,sBAAA;AAAA,QAC1B,CAAA,EAAA,GAAA,mBAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,mBAAA,CAAqB,kBAArB,IAAsC,GAAA,EAAA,GAAA,IAAA;AAAA,OACxC,CAAA;AAEA,MAAM,MAAA,WAAA,GAAA,CAAc,EAAM,GAAA,KAAA,CAAA,OAAA,KAAN,IAAgB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,CAAA,KAAA,EAAA,KAAA,CAAA,CAAA;AACpC,MAAA,IAAI,CAAC,WAAA;AAAa,QAAO,OAAA,IAAA,CAAA;AAEzB,MAAI,IAAA,WAAA,CAAY,SAAS,CAAG,EAAA;AAC1B,QAAA,SAAA,CAAU,MAAM,sCAAsC,CAAA,CAAA;AACtD,QAAO,OAAA,IAAA,CAAA;AAAA,OACT;AAEA,MAAM,MAAA,cAAA,GAAiB,oBAAoB,WAAW,CAAA,CAAA;AACtD,MAAA,IAAI,CAAC,cAAgB,EAAA;AACnB,QAAA,SAAA,CAAU,MAAM,2BAA2B,CAAA,CAAA;AAC3C,QAAO,OAAA,IAAA,CAAA;AAAA,OACT;AAEA,MAAO,OAAA,cAAA,CAAe,UAAW,CAAA,cAAe,CAAG,EAAA;AAAA,QACjD,CAAC,mBAAmB,CAAA;AAAA,OACrB,CAAA,CAAA;AAAA,KACH,CAAA;AAAA,GACF;AACF,CAAC,EAAA;AAED,SAAS,oBAAoB,IAAyC,EAAA;AACpE,EAAA,IAAI,CAAC,IAAA;AAAM,IAAO,OAAA,IAAA,CAAA;AAClB,EAAA,MAAM,QAAW,GAAA,IAAA,CAAA;AACjB,EAAA,KAAA,MAAW,SAAS,QAAU,EAAA;AAM5B,IAAI,IAAA,QAAA,CAAS,KAAK,CAAG,EAAA;AACnB,MAAA,QAAQ,KAAM,CAAA,IAAA;AAAA,QACP,KAAA,OAAA;AACH,UAAA,SAAA;AAAA,QACG,KAAA,IAAA,CAAA;AAAA,QACA,KAAA,KAAA;AACH,UAAA,OAAO,gBAAgB,KAAK,CAAA,CAAA;AAAA,QACzB,KAAA,QAAA;AACH,UAAO,OAAA,mBAAA,CAAoB,MAAM,QAAmB,CAAA,CAAA;AAAA,QAAA;AAEpD,UAAO,OAAA,KAAA,CAAA;AAAA,OAAA;AAAA,KAEb;AACA,IAAA,OAAO,gBAAgB,KAAK,CAAA,CAAA;AAAA,GAC9B;AACA,EAAO,OAAA,IAAA,CAAA;AACT,CAAA;AAEA,SAAS,gBAAgB,CAAmB,EAAA;AAC1C,EAAM,MAAA,EAAA,GAAK,aAAa,YAAY,CAAA,CAAA;AACpC,EAAO,OAAA,CAAA;AAAA,IACL,MAAA;AAAA,IACA;AAAA,MACE,SAAA,EAAW,EAAG,CAAA,CAAA,CAAE,SAAS,CAAA;AAAA,KAC3B;AAAA,IACA,CAAA;AAAA,GACF,CAAA;AACF;;;;"}