bootstrap-vue-next
Version:
BootstrapVueNext is an early and lovely component library for Vue 3 & Nuxt 3 based on Bootstrap 5 and Typescript.
86 lines (85 loc) • 3.15 kB
JavaScript
import { inject, ref, computed, shallowRef, watchEffect, getCurrentInstance as getCurrentInstance$1, provide } from "vue";
import { f as defaultsKey } from "./keys-BLeKMItg.mjs";
function injectSelf(key, vm = getCurrentInstance("injectSelf")) {
const { provides } = vm;
if (provides && key in provides) {
return provides[key];
}
return void 0;
}
function getCurrentInstance(name, message) {
const vm = getCurrentInstance$1();
if (!vm) {
throw new Error(`[Bvn] ${name} ${"must be called from inside a setup function"}`);
}
return vm;
}
const toKebabCase = (str = "") => str.replace(/[^a-z]/gi, "-").replace(/\B([A-Z])/g, "-$1").toLowerCase();
const 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);
continue;
}
out[key] = targetProperty;
}
return out;
}
const 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("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.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;
}
export {
useDefaults as u
};
//# sourceMappingURL=useDefaults-DESCdb0p.mjs.map