UNPKG

bootstrap-vue-next

Version:

BootstrapVueNext is an early and lovely component library for Vue 3 & Nuxt 3 based on Bootstrap 5 and Typescript.

1 lines 6.98 kB
{"version":3,"file":"useDefaults-CzkRF2AY.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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"}