{"version":3,"file":"createSlots.mjs","sources":["../../../../../src/services/config-transport/createSlots.ts"],"sourcesContent":["import { ComponentInternalInstance, Ref, VNode, computed } from 'vue'\nimport { injectChildPropsFromParent } from '../../composables/useChildComponents'\nimport { Props } from './shared'\nimport { makeVNode, renderSlotNode } from './createRenderFn'\n\nconst SLOT_PREFIX = 'slot:'\n\n/**\n * @param propsFromConfig Ref of custom props. Required to be ref so vue can rerender component on custom props change.\n * @returns new props object, where some props replaced with props from config.\n */\nexport const createSlots = (instance: ComponentInternalInstance, propsFromConfig: Ref<Props>) => {\n  /**\n   * Reactive and compiled props. Compiled props considering default value, Boolean transformation etc.\n   * It is a default props that passed to setup function.\n   */\n  const instanceSlots = instance.slots\n\n  const childPropsFromParent = injectChildPropsFromParent()\n\n  const slotsFromConfig = computed(() => {\n    return Object.keys(propsFromConfig.value).reduce((acc, key) => {\n      if (key.startsWith(SLOT_PREFIX)) {\n        acc[key.slice(SLOT_PREFIX.length)] = propsFromConfig.value[key]\n      }\n      return acc\n    }, {} as Record<string, any>)\n  })\n\n  return new Proxy(instanceSlots, {\n    get: (target, key: string) => {\n      if (typeof key !== 'string') { return target[key] }\n\n      const prefixedKey = `${SLOT_PREFIX}${key}`\n\n      /**\n       * Child props is passed from parent component by user.\n       * We need to override default props that provided by Vuestic UI with user props.\n       */\n      const childSlot = childPropsFromParent?.value?.[prefixedKey]\n\n      if (childSlot !== undefined) {\n        return renderSlotNode(makeVNode(childSlot))\n      }\n\n      const originalSlot = target[key]\n\n      if (originalSlot !== undefined) {\n        return originalSlot\n      }\n\n      const propFromConfig = slotsFromConfig.value?.[key] as VNode | undefined\n\n      // Return prop from config only if user didn't pass props manually\n      if (propFromConfig !== undefined) {\n        return renderSlotNode(makeVNode(propFromConfig))\n      }\n\n      return originalSlot\n    },\n    ownKeys (target) {\n      return [...new Set([...Object.keys(instanceSlots), ...Object.keys(slotsFromConfig.value)])]\n    },\n    getOwnPropertyDescriptor (target, key) {\n      return Reflect.getOwnPropertyDescriptor(slotsFromConfig.value, key) ?? Reflect.getOwnPropertyDescriptor(instanceSlots, key)\n    },\n  })\n}\n"],"names":[],"mappings":";;;AAKA,MAAM,cAAc;AAMP,MAAA,cAAc,CAAC,UAAqC,oBAAgC;AAK/F,QAAM,gBAAgB,SAAS;AAE/B,QAAM,uBAAuB;AAEvB,QAAA,kBAAkB,SAAS,MAAM;AAC9B,WAAA,OAAO,KAAK,gBAAgB,KAAK,EAAE,OAAO,CAAC,KAAK,QAAQ;AACzD,UAAA,IAAI,WAAW,WAAW,GAAG;AAC3B,YAAA,IAAI,MAAM,YAAY,MAAM,CAAC,IAAI,gBAAgB,MAAM,GAAG;AAAA,MAChE;AACO,aAAA;AAAA,IACT,GAAG,CAAyB,CAAA;AAAA,EAAA,CAC7B;AAEM,SAAA,IAAI,MAAM,eAAe;AAAA,IAC9B,KAAK,CAAC,QAAQ,QAAgB;;AACxB,UAAA,OAAO,QAAQ,UAAU;AAAE,eAAO,OAAO,GAAG;AAAA,MAAE;AAElD,YAAM,cAAc,GAAG,WAAW,GAAG,GAAG;AAMlC,YAAA,aAAY,kEAAsB,UAAtB,mBAA8B;AAEhD,UAAI,cAAc,QAAW;AACpB,eAAA,eAAe,UAAU,SAAS,CAAC;AAAA,MAC5C;AAEM,YAAA,eAAe,OAAO,GAAG;AAE/B,UAAI,iBAAiB,QAAW;AACvB,eAAA;AAAA,MACT;AAEM,YAAA,kBAAiB,qBAAgB,UAAhB,mBAAwB;AAG/C,UAAI,mBAAmB,QAAW;AACzB,eAAA,eAAe,UAAU,cAAc,CAAC;AAAA,MACjD;AAEO,aAAA;AAAA,IACT;AAAA,IACA,QAAS,QAAQ;AACf,aAAO,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,OAAO,KAAK,aAAa,GAAG,GAAG,OAAO,KAAK,gBAAgB,KAAK,CAAC,CAAC,CAAC;AAAA,IAC5F;AAAA,IACA,yBAA0B,QAAQ,KAAK;AAC9B,aAAA,QAAQ,yBAAyB,gBAAgB,OAAO,GAAG,KAAK,QAAQ,yBAAyB,eAAe,GAAG;AAAA,IAC5H;AAAA,EAAA,CACD;AACH;"}