vue-di-kit
Version:
Vue Dependency Injection Kit
106 lines • 3.66 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
require("reflect-metadata");
var globalization_1 = require("../globalization");
var argumenter_1 = require("@joejukan/argumenter");
var classification_1 = require("../classification");
var web_kit_1 = require("@joejukan/web-kit");
var function_1 = require("../function");
var V = function_1.getVue();
function Component() {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
var argue = new argumenter_1.Argumenter(args);
var options = argue.object || {};
return function (type) {
process(options, type);
var _super = findSuper(type.prototype);
var extended = _super.extend(options);
globalization_1.class_components[web_kit_1.singular(type)] = extended;
if (!options.name) {
options.name = web_kit_1.singular(type);
}
globalization_1.components[options.name] = extended;
return extended;
};
}
exports.Component = Component;
function findSuper(proto) {
var parent = Object.getPrototypeOf(proto);
if (parent instanceof V)
return parent.constructor;
return V;
}
function isProp(key) {
if (key.startsWith('$'))
return false;
if (key.startsWith('_'))
return false;
if (key === 'constructor' || key === '__proto__')
return false;
if (isLCM(key))
return false;
return true;
}
function isLCM(key) {
// screen for lifecycle methods
if (key.match(/created|destroyed|mounted|updated|activated|deactivated/i))
return true;
else if (key.match(/beforeCreate|beforeDestroy|beforeMount|beforeUpdate/i))
return true;
// screen for navigation guard methods
else if (key.match(/beforeRouteEnter|beforeRouteLeave|beforeRouteUpdate/i))
return true;
return false;
}
function process(options, type) {
if (!options.name)
options.name = web_kit_1.kebab(type);
var vue = new type();
var keys = web_kit_1.properties(vue, true);
var data = {};
var props = options.props = {};
options.computed = {};
var watch = options.watch = {};
options.methods = {};
for (var i = 0; i < keys.length; i++) {
var key = keys[i];
var value = vue[key];
if (isProp(key)) {
// TODO: find a more efficient way to get the value.
if (Reflect.hasMetadata(key, type.prototype)) {
var property = Reflect.getMetadata(key, type.prototype);
property.setValue(value);
options.props[key] = property;
}
else if (value instanceof classification_1.Property) {
options.props[key] = value;
}
else if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
data[key] = value;
}
else if (Array.isArray(value)) {
data[key] = value;
}
else if (typeof value === 'function') {
options.methods[key] = value;
vue[key] = function () { };
}
else if (value instanceof classification_1.Computed) {
options.computed[key] = value;
}
else if (typeof value === 'object')
data[key] = value;
}
else if (typeof value === 'function') {
if (isLCM(key))
options[key] = value;
}
options.data = function () {
return web_kit_1.clone(data);
};
}
}
//# sourceMappingURL=component.js.map