import { extend, NOOP } from '@vue/shared' import { PublicPropertiesMap } from '../componentPublicInstance' import { getCompatChildren } from './instanceChildren' import { DeprecationTypes, assertCompatEnabled, checkCompatEnabled, isCompatEnabled } from './compatConfig' import { off, on, once } from './instanceEventEmitter' import { getCompatListeners } from './instanceListeners' import { shallowReadonly } from '@vue/reactivity' import { legacySlotProxyHandlers } from './component' export function installCompatInstanceProperties(map: PublicPropertiesMap) { const set = (target: any, key: any, val: any) => { target[key] = val } const del = (target: any, key: any) => { delete target[key] } extend(map, { $set: i => { assertCompatEnabled(DeprecationTypes.INSTANCE_SET, i) return set }, $delete: i => { assertCompatEnabled(DeprecationTypes.INSTANCE_DELETE, i) return del }, $mount: i => { assertCompatEnabled( DeprecationTypes.GLOBAL_MOUNT, null /* this warning is global */ ) // root mount override from ./global.ts in installCompatMount return i.ctx._compat_mount || NOOP }, $destroy: i => { assertCompatEnabled(DeprecationTypes.INSTANCE_DESTROY, i) // root destroy override from ./global.ts in installCompatMount return i.ctx._compat_destroy || NOOP }, // overrides existing accessor $slots: i => { if ( isCompatEnabled(DeprecationTypes.RENDER_FUNCTION, i) && i.render && i.render._compatWrapped ) { return new Proxy(i.slots, legacySlotProxyHandlers) } return __DEV__ ? shallowReadonly(i.slots) : i.slots }, $scopedSlots: i => { assertCompatEnabled(DeprecationTypes.INSTANCE_SCOPED_SLOTS, i) return __DEV__ ? shallowReadonly(i.slots) : i.slots }, // overrides existing accessor $attrs: i => { if (__DEV__ && i.type.inheritAttrs === false) { checkCompatEnabled(DeprecationTypes.INSTANCE_ATTRS_CLASS_STYLE, i) } return __DEV__ ? shallowReadonly(i.attrs) : i.attrs }, $on: i => on.bind(null, i), $once: i => once.bind(null, i), $off: i => off.bind(null, i), $children: getCompatChildren, $listeners: getCompatListeners } as PublicPropertiesMap) }