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
JavaScript
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