/** * Create a basic component with common options */ import '../../locale'; import { isFunction } from '..'; import { camelize } from '../format/string'; import { SlotsMixin } from '../../mixins/slots'; import Vue from 'vue'; function install(Vue) { var name = this.name; Vue.component(name, this); Vue.component(camelize("-" + name), this); } // unify slots & scopedSlots export function unifySlots(context) { // use data.scopedSlots in lower Vue version var scopedSlots = context.scopedSlots || context.data.scopedSlots || {}; var slots = context.slots(); Object.keys(slots).forEach(function (key) { if (!scopedSlots[key]) { scopedSlots[key] = function () { return slots[key]; }; } }); return scopedSlots; } // should be removed after Vue 3 function transformFunctionComponent(pure) { return { functional: true, props: pure.props, model: pure.model, render: function render(h, context) { return pure(h, context.props, unifySlots(context), context); } }; } export function createComponent(name) { return function (sfc) { if (isFunction(sfc)) { sfc = transformFunctionComponent(sfc); } if (!sfc.functional) { sfc.mixins = sfc.mixins || []; sfc.mixins.push(SlotsMixin); } sfc.name = name; sfc.install = install; return sfc; }; }