import { computed, getCurrentInstance } from 'vue' import { fromPairs } from 'lodash-es' import { debugWarn } from '../utils' import type { ComputedRef } from 'vue' interface Params { excludeListeners?: boolean excludeKeys?: ComputedRef excludeDefaultKeys?: boolean } const DEFAULT_EXCLUDE_KEYS = ['class', 'style'] const LISTENER_PREFIX = /^on[A-Z]/ export const useAttrs = ( params: Params = {} ): ComputedRef> => { const { excludeListeners = false, excludeKeys, excludeDefaultKeys = true, } = params const allExcludeKeys = computed(() => { return excludeDefaultKeys ? (excludeKeys?.value || []).concat(DEFAULT_EXCLUDE_KEYS) : [] }) const instance = getCurrentInstance() if (!instance) { debugWarn( 'use-attrs', 'getCurrentInstance() returned null. useAttrs() must be called at the top of a setup function' ) return computed(() => ({})) } return computed(() => fromPairs( Object.entries(instance!.proxy!.$attrs!).filter( ([key]) => !allExcludeKeys.value.includes(key) && !(excludeListeners && LISTENER_PREFIX.test(key)) ) ) ) }