lodash-decorators
Version:
A collection of decorators using lodash at it's core.
101 lines (70 loc) • 3.37 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', {
value: true
});
exports.createDecorator = createDecorator;
exports.createInstanceDecorator = createInstanceDecorator;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _lodashObjectForOwn = require('lodash/object/forOwn');
var _lodashObjectForOwn2 = _interopRequireDefault(_lodashObjectForOwn);
var _lodashLangIsFunction = require('lodash/lang/isFunction');
var _lodashLangIsFunction2 = _interopRequireDefault(_lodashLangIsFunction);
var _lodashFunctionPartial = require('lodash/function/partial');
var _lodashFunctionPartial2 = _interopRequireDefault(_lodashFunctionPartial);
var _utilsCompositeKeyWeakMap = require('./utils/CompositeKeyWeakMap');
var _utilsCompositeKeyWeakMap2 = _interopRequireDefault(_utilsCompositeKeyWeakMap);
var _Applicator = require('./Applicator');
var _Applicator2 = _interopRequireDefault(_Applicator);
var applicators = _Applicator2['default'].applicators;
function createDecorator(method) {
var applicator = arguments[1] === undefined ? applicators.pre : arguments[1];
return applicator === applicators.single ? wrapper() : wrapper;
function wrapper() {
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return function decorator(target, name, descriptor) {
var value = descriptor.value;
var get = descriptor.get;
if (get) {
descriptor.get = _Applicator2['default'].invoke.apply(_Applicator2['default'], [applicator, method, target, get].concat(args));
_Applicator2['default'].copyMetaData(get, descriptor.get);
} else if (value) {
descriptor.value = _Applicator2['default'].invoke.apply(_Applicator2['default'], [applicator, method, target, value].concat(args));
_Applicator2['default'].copyMetaData(value, descriptor.value);
}
return descriptor;
};
};
}
function createInstanceDecorator(method) {
var applicator = arguments[1] === undefined ? applicators.pre : arguments[1];
var objectMap = new _utilsCompositeKeyWeakMap2['default']();
return applicator === applicators.single ? wrapper() : wrapper;
function wrapper() {
for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
args[_key2] = arguments[_key2];
}
return function decorator(target, name, descriptor) {
var value = descriptor.value;
var get = descriptor.get;
var toWrap = get ? get : value;
if (get) {
descriptor.get = _Applicator2['default'].copyMetaData(toWrap, instanceDecoratorWrapper);
} else {
descriptor.value = _Applicator2['default'].copyMetaData(toWrap, instanceDecoratorWrapper);
}
return descriptor;
function instanceDecoratorWrapper() {
for (var _len3 = arguments.length, methodArgs = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
methodArgs[_key3] = arguments[_key3];
}
if (!objectMap.has([this, toWrap])) {
objectMap.set([this, toWrap], _Applicator2['default'].invoke.apply(_Applicator2['default'], [applicator, method, this, toWrap].concat(args)));
}
var fn = objectMap.get([this, toWrap]);
return fn.apply(this, methodArgs);
};
};
};
}