lodash-decorators
Version:
A collection of decorators using lodash at it's core.
97 lines (74 loc) • 2.93 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', {
value: true
});
exports['default'] = bindWrapper;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _lodashLangIsFunction = require('lodash/lang/isFunction');
var _lodashLangIsFunction2 = _interopRequireDefault(_lodashLangIsFunction);
var _lodashFunctionBind = require('lodash/function/bind');
var _lodashFunctionBind2 = _interopRequireDefault(_lodashFunctionBind);
var _Applicator = require('./Applicator');
var _Applicator2 = _interopRequireDefault(_Applicator);
function bindWrapper() {
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return function bindDecorator() {
for (var _len2 = arguments.length, properties = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
properties[_key2] = arguments[_key2];
}
return properties.length === 1 ? bindClass.apply(undefined, properties.concat(args)) : bindMethod.apply(undefined, properties.concat(args));
};
}
;
function bindClass(target, name, descriptor) {
for (var _len3 = arguments.length, args = Array(_len3 > 3 ? _len3 - 3 : 0), _key3 = 3; _key3 < _len3; _key3++) {
args[_key3 - 3] = arguments[_key3];
}
var keys = Reflect.ownKeys(target.prototype).forEach(function (key) {
if (key !== 'constructor') {
var _descriptor = Object.getOwnPropertyDescriptor(target.prototype, key);
if ((0, _lodashLangIsFunction2['default'])(_descriptor.value) || (0, _lodashLangIsFunction2['default'])(_descriptor.get)) {
Object.defineProperty(target.prototype, key, bindMethod(target, key, _descriptor));
}
}
});
}
function bindMethod(target, name, descriptor) {
for (var _len4 = arguments.length, args = Array(_len4 > 3 ? _len4 - 3 : 0), _key4 = 3; _key4 < _len4; _key4++) {
args[_key4 - 3] = arguments[_key4];
}
var value = descriptor.value;
var _get = descriptor.get;
var writable = descriptor.writable;
return {
configurable: true,
// Allows the user to reassign the variable
set: function set(value) {
Object.defineProperty(this, name, {
configurable: true,
value: value,
writable: writable
});
},
get: function get() {
var thisValue = value;
if ((0, _lodashLangIsFunction2['default'])(_get)) {
thisValue = _get.call(this);
}
var boundValue = thisValue;
if ((0, _lodashLangIsFunction2['default'])(thisValue)) {
boundValue = _lodashFunctionBind2['default'].apply(undefined, [thisValue, this].concat(args));
_Applicator2['default'].copyMetaData(thisValue, boundValue);
}
Object.defineProperty(this, name, {
writable: writable,
configurable: true,
value: boundValue
});
return boundValue;
}
};
}
module.exports = exports['default'];