bootstrap-vue-next
Version:
Seamless integration of Vue 3, Bootstrap 5, and TypeScript for modern, type-safe UI development
76 lines (75 loc) • 3.29 kB
JavaScript
require("./chunk-CoQrYLCe.js");
const require_keys = require("./keys-durSVUrO.js");
let vue = require("vue");
//#region src/composables/useDefaults.ts
function injectSelf(key, vm = getCurrentInstance("injectSelf")) {
const { provides } = vm;
if (provides && key in provides) return provides[key];
}
function getCurrentInstance(name, message) {
const vm = (0, vue.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 = (0, vue.inject)(require_keys.defaultsKey, (0, vue.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 = (0, vue.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 = (0, vue.shallowRef)();
(0, vue.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(require_keys.defaultsKey, vm);
(0, vue.provide)(require_keys.defaultsKey, (0, vue.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
Object.defineProperty(exports, "useDefaults", {
enumerable: true,
get: function() {
return useDefaults;
}
});
//# sourceMappingURL=useDefaults-DsLf4iRY.js.map