UNPKG

computed

Version:

ES7 decorator for computed properties

39 lines (31 loc) 1.13 kB
import isFunction from '../utils/is-function'; import isAarryEqual from '../utils/is-array-equal'; function createGetter(properties, key, descriptor) { /** @constant {Function} Original getter function */ const originalGet = descriptor.get; /** @type {Boolean} */ let isFirstRun = true; /** @type {Array.<*>} */ let lastPropertiesValues; /** @type {*} */ let lastReturnValue; descriptor.get = function() { /** @constant {Array.<*>} */ const currentPropertiesValues = properties.map((property) => this[property], this); if (isFirstRun || (!isAarryEqual(currentPropertiesValues, lastPropertiesValues))) { isFirstRun = false; /** Cache current properties */ lastPropertiesValues = currentPropertiesValues; /** In Ember it's (key, value, lastValue) */ return lastReturnValue = originalGet.call(this, lastReturnValue, key); } return lastReturnValue; } } export default function computedDecorator(...properties) { return function(target, key, descriptor) { if (isFunction(descriptor.get)) { createGetter(properties, key, descriptor); } }; }