{"version":3,"file":"render-tnode.mjs","sources":["../../../components/utils/render-tnode.ts"],"sourcesContent":["import { h, ComponentPublicInstance, VNode, isVNode, Fragment } from 'vue';\nimport { isEmpty } from 'lodash-es';\nimport { isString } from 'lodash-es';\nimport { isFunction } from 'lodash-es';\nimport { isObject } from 'lodash-es';\nimport { camelCase } from 'lodash-es';\nimport { kebabCase } from 'lodash-es';\nimport { isArray } from 'lodash-es';\n\nexport interface JSXRenderContext {\n  defaultNode?: VNode | string;\n  params?: Record<string, any>;\n  slotFirst?: boolean;\n  // 是否不打印 LOG\n  silent?: boolean;\n}\n\nexport type OptionsType = VNode | JSXRenderContext | string;\n\nexport function getDefaultNode(options?: OptionsType) {\n  let defaultNode;\n  if (isObject(options) && 'defaultNode' in options) {\n    defaultNode = options.defaultNode;\n  } else if (isVNode(options) || isString(options)) {\n    defaultNode = options;\n  }\n\n  return defaultNode;\n}\n\nexport function getChildren(content: VNode[]) {\n  const childList: VNode[] = [];\n  const innerGetChildren = (content: VNode[]) => {\n    if (!isArray(content)) return;\n    content.forEach((item: VNode) => {\n      if (item.children && isArray(item.children)) {\n        if (item.type !== Fragment) return;\n        innerGetChildren(item.children as VNode[]);\n      } else {\n        childList.push(item);\n      }\n    });\n    return childList;\n  };\n\n  return innerGetChildren(content);\n}\n\nexport function getParams(options?: OptionsType) {\n  return isObject(options) && 'params' in options ? options.params : {};\n}\n\nexport function getSlotFirst(options?: OptionsType) {\n  return isObject(options) && 'slotFirst' in options ? options.slotFirst : false;\n}\n\n// 同时支持驼峰命名和中划线命名的插槽，示例：value-display 和 valueDisplay\nexport function handleSlots(instance: ComponentPublicInstance, params: Record<string, any>, name: string) {\n  // 检查是否存在 驼峰命名 的插槽\n  let node = instance.$slots[camelCase(name)]?.(params);\n  if (node) return node;\n  // 检查是否存在 中划线命名 的插槽\n  node = instance.$slots[kebabCase(name)]?.(params);\n  if (node) return node;\n  return null;\n}\n\n/**\n * 通过JSX的方式渲染 TNode，props 和 插槽同时处理，也能处理默认值为 true 则渲染默认节点的情况\n * @param vm 组件实例\n * @param name 插槽和属性名称\n * @param options 值可能为默认渲染节点，也可能是默认渲染节点和参数的集合\n * @example renderTNodeJSX(this, 'closeBtn')  优先级 props function 大于 插槽\n * @example renderTNodeJSX(this, 'closeBtn', <close-icon />)。 当属性值为 true 时则渲染 <close-icon />\n * @example renderTNodeJSX(this, 'closeBtn', { defaultNode: <close-icon />, params })。 params 为渲染节点时所需的参数\n */\nexport const renderTNodeJSX = (instance: ComponentPublicInstance, name: string, options?: OptionsType) => {\n  // assemble params && defaultNode\n  const params = getParams(options);\n  const defaultNode = getDefaultNode(options);\n\n  // 处理 props 类型的Node\n  let propsNode;\n  if (name in instance) {\n    propsNode = instance[name];\n  }\n\n  // 是否静默日志\n  // const isSilent = Boolean(isObject(options) && 'silent' in options && options.silent);\n  // // 同名插槽和属性同时存在，则提醒用户只需要选择一种方式即可\n  // if (instance.$slots[name] && propsNode && propsNode !== true && !isSilent) {\n  //   console.warn(`Both $slots.${name} and $props.${name} exist, $props.${name} is preferred`);\n  // }\n\n  // propsNode 为 false 不渲染\n  if (propsNode === false || propsNode === null) return;\n  if (propsNode === true && defaultNode) {\n    return handleSlots(instance, params, name) || defaultNode;\n  }\n\n  // 同名 props 和 slot 优先处理 props\n  if (isFunction(propsNode)) return propsNode(h, params);\n  const isPropsEmpty = [undefined, params, ''].includes(propsNode);\n  // Props 为空，但插槽存在\n  if (isPropsEmpty && (instance.$slots[camelCase(name)] || instance.$slots[kebabCase(name)])) {\n    return handleSlots(instance, params, name);\n  }\n  return propsNode;\n};\n\n/**\n * 通过JSX的方式渲染 TNode，props 和 插槽同时处理。与 renderTNodeJSX 区别在于 属性值为 undefined 时会渲染默认节点\n * @param vm 组件实例\n * @param name 插槽和属性名称\n * @example renderTNodeJSX(this, 'closeBtn')\n * @example renderTNodeJSX(this, 'closeBtn', <close-icon />)。this.closeBtn 为空时，则兜底渲染 <close-icon />\n * @example renderTNodeJSX(this, 'closeBtn', { defaultNode: <close-icon />, params }) 。params 为渲染节点时所需的参数\n */\nexport const renderTNodeJSXDefault = (vm: ComponentPublicInstance, name: string, options?: OptionsType) => {\n  const defaultNode = getDefaultNode(options);\n  return renderTNodeJSX(vm, name, options) || defaultNode;\n};\n\n/**\n * 用于处理相同名称的 TNode 渲染\n * @param vm 组件实例\n * @param name1 第一个名称，优先级高于 name2\n * @param name2 第二个名称\n * @param defaultNode 默认渲染内容：当 name1 和 name2 都为空时会启动默认内容渲染\n * @example renderContent(this, 'default', 'content')\n * @example renderContent(this, 'default', 'content', '我是默认内容')\n * @example renderContent(this, 'default', 'content', { defaultNode: '我是默认内容', params })\n */\nexport const renderContent = (vm: ComponentPublicInstance, name1: string, name2: string, options?: OptionsType) => {\n  const params = getParams(options);\n  const defaultNode = getDefaultNode(options);\n\n  const toParams = params ? { params } : undefined;\n\n  const node1 = renderTNodeJSX(vm, name1, toParams);\n  const node2 = renderTNodeJSX(vm, name2, toParams);\n\n  const res = isEmpty(node1) ? node2 : node1;\n  return isEmpty(res) ? defaultNode : res;\n};\n"],"names":["getDefaultNode","options","defaultNode","isObject","isVNode","isString","getChildren","content","childList","innerGetChildren","isArray","forEach","item","children","type","Fragment","push","getParams","params","getSlotFirst","slotFirst","handleSlots","instance","name","_instance$$slots$came","_instance$$slots","_instance$$slots$keba","_instance$$slots2","node","$slots","camelCase","call","kebabCase","renderTNodeJSX","propsNode","isFunction","h","isPropsEmpty","includes","renderTNodeJSXDefault","vm","renderContent","name1","name2","toParams","node1","node2","res","isEmpty"],"mappings":";;;;;;;;;AAmBO,SAASA,eAAeC,OAAuB,EAAA;AAChD,EAAA,IAAAC,WAAA,CAAA;EACJ,IAAIC,QAAS,CAAAF,OAAO,CAAK,IAAA,aAAA,IAAiBA,OAAS,EAAA;IACjDC,WAAA,GAAcD,OAAQ,CAAAC,WAAA,CAAA;aACbE,OAAQ,CAAAH,OAAO,CAAK,IAAAI,QAAA,CAASJ,OAAO,CAAG,EAAA;AAClCC,IAAAA,WAAA,GAAAD,OAAA,CAAA;AAChB,GAAA;AAEO,EAAA,OAAAC,WAAA,CAAA;AACT,CAAA;AAEO,SAASI,YAAYC,OAAkB,EAAA;EAC5C,IAAMC,YAAqB,EAAC,CAAA;AACtB,EAAA,IAAAC,iBAAA,GAAmB,SAAnBA,gBAAAA,CAAoBF,QAAqB,EAAA;AACzC,IAAA,IAAA,CAACG,QAAQH,QAAO,CAAA,EAAG,OAAA;AACvBA,IAAAA,QAAAA,CAAQI,OAAQ,CAAA,UAACC,IAAgB,EAAA;MAC/B,IAAIA,IAAK,CAAAC,QAAA,IAAYH,OAAQ,CAAAE,IAAA,CAAKC,QAAQ,CAAG,EAAA;AAC3C,QAAA,IAAID,KAAKE,IAAS,KAAAC,QAAA,EAAU,OAAA;AAC5BN,QAAAA,iBAAA,CAAiBG,KAAKC,QAAmB,CAAA,CAAA;AAC3C,OAAO,MAAA;AACLL,QAAAA,SAAA,CAAUQ,KAAKJ,IAAI,CAAA,CAAA;AACrB,OAAA;AACF,KAAC,CAAA,CAAA;AACM,IAAA,OAAAJ,SAAA,CAAA;GACT,CAAA;EAEA,OAAOC,kBAAiBF,OAAO,CAAA,CAAA;AACjC,CAAA;AAEO,SAASU,UAAUhB,OAAuB,EAAA;AAC/C,EAAA,OAAOE,SAASF,OAAO,CAAA,IAAK,YAAYA,OAAU,GAAAA,OAAA,CAAQiB,SAAS,EAAC,CAAA;AACtE,CAAA;AAEO,SAASC,aAAalB,OAAuB,EAAA;AAClD,EAAA,OAAOE,SAASF,OAAO,CAAA,IAAK,WAAe,IAAAA,OAAA,GAAUA,QAAQmB,SAAY,GAAA,KAAA,CAAA;AAC3E,CAAA;AAGgB,SAAAC,WAAAA,CAAYC,QAAmC,EAAAJ,MAAA,EAA6BK,IAAc,EAAA;AAAA,EAAA,IAAAC,qBAAA,EAAAC,gBAAA,EAAAC,qBAAA,EAAAC,iBAAA,CAAA;EAExG,IAAIC,gCAAO,CAAAH,gBAAA,GAAAH,QAAS,CAAAO,MAAA,EAAOC,SAAU,CAAAP,IAAI,0CAA9BC,KAAAA,CAAAA,GAAAA,KAAAA,CAAAA,GAAAA,qBAAA,CAAAO,IAAA,CAAAN,gBAAA,EAAmCP,MAAM,CAAA,CAAA;EAChD,IAAAU,IAAA,EAAa,OAAAA,IAAA,CAAA;EAEjBA,IAAA,GAAA,CAAAF,qBAAA,GAAO,CAAAC,iBAAA,GAAAL,QAAS,CAAAO,MAAA,EAAOG,SAAU,CAAAT,IAAI,0CAA9BG,KAAAA,CAAAA,GAAAA,KAAAA,CAAAA,GAAAA,qBAAA,CAAAK,IAAA,CAAAJ,iBAAA,EAAmCT,MAAM,CAAA,CAAA;EAC5C,IAAAU,IAAA,EAAa,OAAAA,IAAA,CAAA;AACV,EAAA,OAAA,IAAA,CAAA;AACT,CAAA;AAWO,IAAMK,cAAiB,GAAA,SAAjBA,cAAiBA,CAACX,QAAmC,EAAAC,IAAA,EAActB,OAA0B,EAAA;AAElG,EAAA,IAAAiB,MAAA,GAASD,UAAUhB,OAAO,CAAA,CAAA;AAC1B,EAAA,IAAAC,WAAA,GAAcF,eAAeC,OAAO,CAAA,CAAA;AAGtC,EAAA,IAAAiC,SAAA,CAAA;EACJ,IAAIX,QAAQD,QAAU,EAAA;AACpBY,IAAAA,SAAA,GAAYZ,QAAS,CAAAC,IAAA,CAAA,CAAA;AACvB,GAAA;AAUI,EAAA,IAAAW,SAAA,KAAc,SAASA,SAAc,KAAA,IAAA,EAAM,OAAA;AAC3C,EAAA,IAAAA,SAAA,KAAc,QAAQhC,WAAa,EAAA;IACrC,OAAOmB,WAAY,CAAAC,QAAA,EAAUJ,MAAQ,EAAAK,IAAI,CAAK,IAAArB,WAAA,CAAA;AAChD,GAAA;EAGA,IAAIiC,WAAWD,SAAS,CAAA,EAAU,OAAAA,SAAA,CAAUE,GAAGlB,MAAM,CAAA,CAAA;AACrD,EAAA,IAAMmB,eAAe,CAAC,KAAA,CAAA,EAAWnB,QAAQ,EAAE,CAAA,CAAEoB,SAASJ,SAAS,CAAA,CAAA;EAE3D,IAAAG,YAAA,KAAiBf,QAAS,CAAAO,MAAA,CAAOC,SAAU,CAAAP,IAAI,MAAMD,QAAS,CAAAO,MAAA,CAAOG,SAAU,CAAAT,IAAI,CAAK,CAAA,CAAA,EAAA;AACnF,IAAA,OAAAF,WAAA,CAAYC,QAAU,EAAAJ,MAAA,EAAQK,IAAI,CAAA,CAAA;AAC3C,GAAA;AACO,EAAA,OAAAW,SAAA,CAAA;AACT,EAAA;AAUO,IAAMK,qBAAwB,GAAA,SAAxBA,qBAAwBA,CAACC,EAA6B,EAAAjB,IAAA,EAActB,OAA0B,EAAA;AACnG,EAAA,IAAAC,WAAA,GAAcF,eAAeC,OAAO,CAAA,CAAA;EAC1C,OAAOgC,cAAe,CAAAO,EAAA,EAAIjB,IAAM,EAAAtB,OAAO,CAAK,IAAAC,WAAA,CAAA;AAC9C,EAAA;AAYauC,IAAAA,aAAgB,GAAA,SAAhBA,aAAgBA,CAACD,EAA6B,EAAAE,KAAA,EAAeC,OAAe1C,OAA0B,EAAA;AAC3G,EAAA,IAAAiB,MAAA,GAASD,UAAUhB,OAAO,CAAA,CAAA;AAC1B,EAAA,IAAAC,WAAA,GAAcF,eAAeC,OAAO,CAAA,CAAA;EAE1C,IAAM2C,QAAW,GAAA1B,MAAA,GAAS;AAAEA,IAAAA,MAAA,EAAAA,MAAAA;GAAW,GAAA,KAAA,CAAA,CAAA;EAEvC,IAAM2B,KAAQ,GAAAZ,cAAA,CAAeO,EAAI,EAAAE,KAAA,EAAOE,QAAQ,CAAA,CAAA;EAChD,IAAME,KAAQ,GAAAb,cAAA,CAAeO,EAAI,EAAAG,KAAA,EAAOC,QAAQ,CAAA,CAAA;EAEhD,IAAMG,GAAM,GAAAC,OAAA,CAAQH,KAAK,CAAA,GAAIC,KAAQ,GAAAD,KAAA,CAAA;AAC9B,EAAA,OAAAG,OAAA,CAAQD,GAAG,CAAA,GAAI7C,WAAc,GAAA6C,GAAA,CAAA;AACtC;;;;"}