{"version":3,"file":"useDefaults-DESCdb0p.mjs","sources":["../src/composables/useDefaults.ts"],"sourcesContent":["/* eslint-disable eqeqeq */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n// Utilities\nimport {\n  getCurrentInstance as _getCurrentInstance,\n  type ComponentInternalInstance,\n  computed,\n  inject,\n  type InjectionKey,\n  provide,\n  ref,\n  shallowRef,\n  type VNode,\n  watchEffect,\n} from 'vue'\nimport {defaultsKey} from '../utils/keys'\nimport type {BvnComponentProps} from '../types/BootstrapVueOptions'\n\n// Code here was taken from\n// https://github.com/vuetifyjs/vuetify/blob/8ed87310890e2b6c8ad2a626a02c17f9467cbb60/packages/vuetify/src/composables/defaults.ts#L138\n// Thanks to the Vuetify team. Vue does not make this easy\n\nfunction injectSelf<T>(key: InjectionKey<T> | string, vm?: ComponentInternalInstance): T | undefined\nfunction injectSelf(key: InjectionKey<any> | string, vm = getCurrentInstance('injectSelf')) {\n  // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n  // @ts-ignore\n  const {provides} = vm\n\n  if (provides && (key as string | symbol) in provides) {\n    // TS doesn't allow symbol as index type\n    return provides[key as string]\n  }\n  return undefined\n}\n\nfunction getCurrentInstance(name: string, message?: string) {\n  const vm = _getCurrentInstance()\n\n  if (!vm) {\n    throw new Error(`[Bvn] ${name} ${message || 'must be called from inside a setup function'}`)\n  }\n\n  return vm\n}\n\nconst toKebabCase = (str = '') =>\n  str\n    .replace(/[^a-z]/gi, '-')\n    .replace(/\\B([A-Z])/g, '-$1')\n    .toLowerCase()\nconst isObject = (obj: any): obj is Record<string, any> =>\n  obj !== null && typeof obj === 'object' && !Array.isArray(obj)\n\nfunction mergeDeep(\n  source: Record<string, any> = {},\n  target: Record<string, any> = {},\n  arrayFn?: (a: unknown[], b: unknown[]) => unknown[]\n) {\n  const out: Record<string, any> = {}\n\n  for (const key in source) {\n    out[key] = source[key]\n  }\n\n  for (const key in target) {\n    const sourceProperty = source[key]\n    const targetProperty = target[key]\n\n    // Only continue deep merging if\n    // both properties are objects\n    if (isObject(sourceProperty) && isObject(targetProperty)) {\n      out[key] = mergeDeep(sourceProperty, targetProperty, arrayFn)\n\n      continue\n    }\n\n    if (Array.isArray(sourceProperty) && Array.isArray(targetProperty) && arrayFn) {\n      out[key] = arrayFn(sourceProperty, targetProperty)\n\n      continue\n    }\n\n    out[key] = targetProperty\n  }\n\n  return out\n}\n\nconst propIsDefined = (vnode: VNode, prop: string) =>\n  typeof vnode.props?.[prop] !== 'undefined' ||\n  typeof vnode.props?.[toKebabCase(prop)] !== 'undefined'\n\nfunction internalUseDefaults(props: Record<string, any> = {}, name?: string) {\n  const defaults = inject(defaultsKey, ref({}))\n  const vm = getCurrentInstance('useDefaults')\n\n  name = name ?? vm.type.name ?? vm.type.__name\n  if (!name) {\n    // Should never happen\n    throw new Error('[Bvn] Could not determine component name')\n  }\n\n  const componentDefaults = computed(() => (defaults.value as any)?.[props._as ?? name])\n  const _props = new Proxy(props, {\n    get(target, prop) {\n      const propValue = Reflect.get(target, prop)\n      if (prop === 'class' || prop === 'style') {\n        return [componentDefaults.value?.[prop], propValue].filter((v) => v != null)\n      } else if (typeof prop === 'string' && !propIsDefined(vm.vnode, prop)) {\n        return (\n          componentDefaults.value?.[prop] ?? (defaults.value as any)?.global?.[prop] ?? propValue\n        )\n      }\n      return propValue\n    },\n  })\n\n  const _subcomponentDefaults = shallowRef()\n  watchEffect(() => {\n    if (componentDefaults.value) {\n      const subComponents = Object.entries(componentDefaults.value).filter(([key]) =>\n        key.startsWith(key[0].toUpperCase())\n      )\n      _subcomponentDefaults.value = subComponents.length\n        ? Object.fromEntries(subComponents)\n        : undefined\n    } else {\n      _subcomponentDefaults.value = undefined\n    }\n  })\n\n  function provideSubDefaults() {\n    const injected = injectSelf(defaultsKey, vm)\n    provide(\n      defaultsKey,\n      computed(() =>\n        _subcomponentDefaults.value\n          ? mergeDeep(injected?.value ?? {}, _subcomponentDefaults.value)\n          : injected?.value\n      ) as any\n    )\n  }\n\n  return {props: _props, provideSubDefaults}\n}\n\nexport function useDefaults<T extends Record<string, any>>(\n  props: T,\n  name: keyof BvnComponentProps\n): T {\n  const {props: _props, provideSubDefaults} = internalUseDefaults(props, name)\n  provideSubDefaults()\n  return _props as T\n}\n"],"names":["_getCurrentInstance"],"mappings":"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"}