70 lines
1.6 KiB
70 lines
1.6 KiB
"use strict";
|
|
|
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
|
|
exports.__esModule = true;
|
|
exports.unifySlots = unifySlots;
|
|
exports.createComponent = createComponent;
|
|
|
|
require("../../locale");
|
|
|
|
var _ = require("..");
|
|
|
|
var _string = require("../format/string");
|
|
|
|
var _slots = require("../../mixins/slots");
|
|
|
|
var _vue = _interopRequireDefault(require("vue"));
|
|
|
|
/**
|
|
* Create a basic component with common options
|
|
*/
|
|
function install(Vue) {
|
|
var name = this.name;
|
|
Vue.component(name, this);
|
|
Vue.component((0, _string.camelize)("-" + name), this);
|
|
} // unify slots & scopedSlots
|
|
|
|
|
|
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);
|
|
}
|
|
};
|
|
}
|
|
|
|
function createComponent(name) {
|
|
return function (sfc) {
|
|
if ((0, _.isFunction)(sfc)) {
|
|
sfc = transformFunctionComponent(sfc);
|
|
}
|
|
|
|
if (!sfc.functional) {
|
|
sfc.mixins = sfc.mixins || [];
|
|
sfc.mixins.push(_slots.SlotsMixin);
|
|
}
|
|
|
|
sfc.name = name;
|
|
sfc.install = install;
|
|
return sfc;
|
|
};
|
|
} |