import { cloneDeep } from 'lodash-es' import { type UnwrapNestedRefs, reactive } from 'vue' interface ReflectOptions { clone?: boolean reactivity?: boolean } type ReflectType = T extends true ? UnwrapNestedRefs : O type ReflectReturn = T extends true ? UnwrapNestedRefs : O[keyof O] export const useReflect = ( obj: O, options?: ReflectOptions, ) => { const { clone = true, reactivity = true } = options || {} let target: ReflectType = obj target = clone ? cloneDeep(target) : target target = reactivity ? reactive(target) : target const has = (propertyKey: keyof O) => { return Reflect.has(target, propertyKey) } const del = (propertyKey: keyof O) => { return Reflect.deleteProperty(target, propertyKey) } const set = (propertyKey: keyof O, value: any, receiver?: O) => { return Reflect.set(target, propertyKey, value, receiver || target) } const get = ( propertyKey: keyof O, receiver?: O, ): ReflectReturn => { return Reflect.get(target, propertyKey, receiver || target) } return { target, has, del, set, get } }