UNPKG

bootstrap-vue-next

Version:

Seamless integration of Vue 3, Bootstrap 5, and TypeScript for modern, type-safe UI development

70 lines (69 loc) 3.15 kB
import { l as defaultsKey } from "./keys-CQKrwmvN.mjs"; import { computed, getCurrentInstance, inject, provide, ref, shallowRef, watchEffect } from "vue"; //#region src/composables/useDefaults.ts function injectSelf(key, vm = getCurrentInstance$1("injectSelf")) { const { provides } = vm; if (provides && key in provides) return provides[key]; } function getCurrentInstance$1(name, message) { const vm = getCurrentInstance(); if (!vm) throw new Error(`[Bvn] ${name} ${message || "must be called from inside a setup function"}`); return vm; } var toKebabCase = (str = "") => str.replace(/[^a-z]/gi, "-").replace(/\B([A-Z])/g, "-$1").toLowerCase(); var isObject = (obj) => obj !== null && typeof obj === "object" && !Array.isArray(obj); function mergeDeep(source = {}, target = {}, arrayFn) { const out = {}; for (const key in source) out[key] = source[key]; for (const key in target) { const sourceProperty = source[key]; const targetProperty = target[key]; if (isObject(sourceProperty) && isObject(targetProperty)) { out[key] = mergeDeep(sourceProperty, targetProperty, arrayFn); continue; } if (Array.isArray(sourceProperty) && Array.isArray(targetProperty) && arrayFn) { out[key] = arrayFn(sourceProperty, targetProperty); continue; } out[key] = targetProperty; } return out; } var propIsDefined = (vnode, prop) => typeof vnode.props?.[prop] !== "undefined" || typeof vnode.props?.[toKebabCase(prop)] !== "undefined"; function internalUseDefaults(props = {}, name) { const defaults = inject(defaultsKey, ref({})); const vm = getCurrentInstance$1("useDefaults"); name = name ?? vm.type.name ?? vm.type.__name; if (!name) throw new Error("[Bvn] Could not determine component name"); const componentDefaults = computed(() => defaults.value?.[props._as ?? name]); const _props = new Proxy(props, { get(target, prop) { const propValue = Reflect.get(target, prop); if (prop === "class" || prop === "style") return [componentDefaults.value?.[prop], propValue].filter((v) => v != null); else if (typeof prop === "string" && !propIsDefined(vm.vnode, prop)) return componentDefaults.value?.[prop] ?? defaults.value?.global?.[prop] ?? propValue; return propValue; } }); const _subcomponentDefaults = shallowRef(); watchEffect(() => { if (componentDefaults.value) { const subComponents = Object.entries(componentDefaults.value).filter(([key]) => key[0] !== void 0 && key.startsWith(key[0].toUpperCase())); _subcomponentDefaults.value = subComponents.length ? Object.fromEntries(subComponents) : void 0; } else _subcomponentDefaults.value = void 0; }); function provideSubDefaults() { const injected = injectSelf(defaultsKey, vm); provide(defaultsKey, computed(() => _subcomponentDefaults.value ? mergeDeep(injected?.value ?? {}, _subcomponentDefaults.value) : injected?.value)); } return { props: _props, provideSubDefaults }; } function useDefaults(props, name) { const { props: _props, provideSubDefaults } = internalUseDefaults(props, name); provideSubDefaults(); return _props; } //#endregion export { useDefaults as t }; //# sourceMappingURL=useDefaults-CCWS15M8.mjs.map