import PropTypes from './vue-types' import { getOptionProps } from './props-util' function getDisplayName (WrappedComponent) { return WrappedComponent.name || 'Component' } export default function wrapWithConnect (WrappedComponent) { const tempProps = WrappedComponent.props || {} const methods = WrappedComponent.methods || {} const props = {} Object.keys(tempProps).forEach(k => { props[k] = ({ ...k, required: false }) }) WrappedComponent.props.__propsSymbol__ = PropTypes.any WrappedComponent.props.children = PropTypes.array.def([]) const ProxyWrappedComponent = { props, model: WrappedComponent.model, name: `Proxy_${getDisplayName(WrappedComponent)}`, methods: { getProxyWrappedInstance () { return this.$refs.wrappedInstance }, }, render () { const { $listeners, $slots = {}, $attrs, $scopedSlots } = this const props = getOptionProps(this) const wrapProps = { props: { ...props, __propsSymbol__: Symbol(), componentWillReceiveProps: { ...props }, children: $slots.default || props.children || [], }, on: $listeners, attrs: $attrs, } if (Object.keys($scopedSlots).length) { wrapProps.scopedSlots = $scopedSlots } const slotsKey = Object.keys($slots) return ( {slotsKey.length ? slotsKey.map(name => { return }) : null} ) }, } Object.keys(methods).map(m => { ProxyWrappedComponent.methods[m] = function () { return this.getProxyWrappedInstance()[m](...arguments) } }) return ProxyWrappedComponent }