ember-legacy-class-transform
Version:
The default blueprint for ember-cli addons.
211 lines (184 loc) • 18.5 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.ComputedBlueprint = undefined;
exports.computed = computed;
exports.observer = observer;
var _objectReference = require("@glimmer/object-reference");
var _object = require("./object");
var _mixin = require("./mixin");
function _defaults(obj, defaults) {
var keys = Object.getOwnPropertyNames(defaults);for (var i = 0; i < keys.length; i++) {
var key = keys[i];var value = Object.getOwnPropertyDescriptor(defaults, key);if (value && value.configurable && obj[key] === undefined) {
Object.defineProperty(obj, key, value);
}
}return obj;
}
function _classCallCheck(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
function _possibleConstructorReturn(self, call) {
if (!self) {
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
}return call && (typeof call === "object" || typeof call === "function") ? call : self;
}
function _inherits(subClass, superClass) {
if (typeof superClass !== "function" && superClass !== null) {
throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
}subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass);
}
var ComputedBlueprint = exports.ComputedBlueprint = function (_Blueprint) {
_inherits(ComputedBlueprint, _Blueprint);
function ComputedBlueprint(accessor) {
var deps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
_classCallCheck(this, ComputedBlueprint);
var _this = _possibleConstructorReturn(this, _Blueprint.call(this));
_this.metadata = {};
_this.accessor = accessor;
_this.deps = deps;
return _this;
}
ComputedBlueprint.prototype.descriptor = function descriptor(_target, key, classMeta) {
classMeta.addReferenceTypeFor(key, (0, _objectReference.ComputedReferenceBlueprint)(key, this.deps));
classMeta.addPropertyMetadata(key, this.metadata);
classMeta.addSlotFor(key);
return new Computed(this.accessor);
};
ComputedBlueprint.prototype.property = function property() {
for (var _len = arguments.length, paths = Array(_len), _key = 0; _key < _len; _key++) {
paths[_key] = arguments[_key];
}
this.deps = paths.map(function (d) {
return d.split('.');
});
return this;
};
ComputedBlueprint.prototype.meta = function meta(object) {
this.metadata = object;
return this;
};
ComputedBlueprint.prototype.volatile = function volatile() {
return this;
};
return ComputedBlueprint;
}(_mixin.Blueprint);
var Computed = function () {
function Computed(accessor) {
_classCallCheck(this, Computed);
this["5d90f84f-908e-4a42-9749-3d0f523c262c"] = true;
this.accessor = accessor;
}
Computed.prototype.define = function define(prototype, key, home) {
Object.defineProperty(prototype, key, wrapAccessor(home, key, this.accessor));
};
return Computed;
}();
function wrapAccessor(home, accessorName, _desc) {
var superDesc = getPropertyDescriptor(home, accessorName);
var originalGet = void 0;
var originalSet = void 0;
var desc = {
enumerable: true,
configurable: true
};
var get = _desc.get;
if (get && get.length > 0) {
originalGet = function () {
return get.call(this, accessorName);
};
} else {
originalGet = _desc.get;
}
var set = _desc.set;
if (set && set.length > 1) {
originalSet = function (value) {
return set.call(this, accessorName, value);
};
} else {
originalSet = _desc.set;
}
var cacheGet = function () {
if (_objectReference.Meta.exists(this)) {
var slot = _objectReference.Meta.for(this).getSlots()[accessorName];
if (slot !== _object.EMPTY_CACHE) return slot;
}
return originalGet.call(this);
};
var cacheSet = void 0;
if (originalSet) {
cacheSet = function (value) {
var meta = _objectReference.Meta.for(this);
var slots = meta.getSlots();
var ret = originalSet.call(this, value);
if (ret !== undefined) {
slots[accessorName] = ret;
}
};
} else {
cacheSet = function (value) {
var meta = _objectReference.Meta.for(this);
var slots = meta.getSlots();
if (value !== undefined) slots[accessorName] = value;
};
}
if (!superDesc || 'value' in superDesc) {
desc.get = cacheGet;
desc.set = cacheSet;
return desc;
}
desc.get = function () {
var lastSuper = this._super;
this._super = function () {
return superDesc.get.call(this);
};
try {
return cacheGet.call(this);
} finally {
this._super = lastSuper;
}
};
desc.set = function (val) {
var lastSuper = this._super;
this._super = function () {
return superDesc.set.call(this, val);
};
try {
return cacheSet.call(this, val);
} finally {
this._super = lastSuper;
}
};
return desc;
}
function getPropertyDescriptor(subject, name) {
var pd = Object.getOwnPropertyDescriptor(subject, name);
var proto = Object.getPrototypeOf(subject);
while (typeof pd === 'undefined' && proto !== null) {
pd = Object.getOwnPropertyDescriptor(proto, name);
proto = Object.getPrototypeOf(proto);
}
return pd;
}
function computed() {
for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
args[_key2] = arguments[_key2];
}
var last = args.pop();
var deps = args;
if (typeof last === 'function') {
var _ref;
return (_ref = new ComputedBlueprint({
get: last
})).property.apply(_ref, deps);
} else if (typeof last === 'object') {
var _ref2;
return (_ref2 = new ComputedBlueprint(last)).property.apply(_ref2, deps);
} else {
throw new TypeError("computed expects a function or an object as last argument");
}
}
function observer() {}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21wdXRlZC5qcyJdLCJuYW1lcyI6WyJDb21wdXRlZFJlZmVyZW5jZUJsdWVwcmludCIsIk1ldGEiLCJFTVBUWV9DQUNIRSIsIkJsdWVwcmludCIsIkNvbXB1dGVkQmx1ZXByaW50IiwiYWNjZXNzb3IiLCJkZXBzIiwibWV0YWRhdGEiLCJkZXNjcmlwdG9yIiwiX3RhcmdldCIsImtleSIsImNsYXNzTWV0YSIsImFkZFJlZmVyZW5jZVR5cGVGb3IiLCJhZGRQcm9wZXJ0eU1ldGFkYXRhIiwiYWRkU2xvdEZvciIsIkNvbXB1dGVkIiwicHJvcGVydHkiLCJwYXRocyIsIm1hcCIsImQiLCJzcGxpdCIsIm1ldGEiLCJvYmplY3QiLCJ2b2xhdGlsZSIsImRlZmluZSIsInByb3RvdHlwZSIsImhvbWUiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsIndyYXBBY2Nlc3NvciIsImFjY2Vzc29yTmFtZSIsIl9kZXNjIiwic3VwZXJEZXNjIiwiZ2V0UHJvcGVydHlEZXNjcmlwdG9yIiwib3JpZ2luYWxHZXQiLCJvcmlnaW5hbFNldCIsImRlc2MiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwiZ2V0IiwibGVuZ3RoIiwiY2FsbCIsInNldCIsInZhbHVlIiwiY2FjaGVHZXQiLCJleGlzdHMiLCJzbG90IiwiZm9yIiwiZ2V0U2xvdHMiLCJjYWNoZVNldCIsInNsb3RzIiwicmV0IiwidW5kZWZpbmVkIiwibGFzdFN1cGVyIiwiX3N1cGVyIiwidmFsIiwic3ViamVjdCIsIm5hbWUiLCJwZCIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInByb3RvIiwiZ2V0UHJvdG90eXBlT2YiLCJjb21wdXRlZCIsImFyZ3MiLCJsYXN0IiwicG9wIiwiVHlwZUVycm9yIiwib2JzZXJ2ZXIiXSwibWFwcGluZ3MiOiI7Ozs7OztRQTJITyxBQUFTO1FBYVQsQUFBUzs7QUF4SWhCLEFBQVMsQUFBNEIsQUFBWTs7QUFDakQsQUFBUyxBQUFtQjs7QUFDNUIsQUFBUyxBQUFpQixB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QUFPLG9CQUE0QixBQUFFIiwiZmlsZSI6ImxpYi9jb21wdXRlZC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXB1dGVkUmVmZXJlbmNlQmx1ZXByaW50LCBNZXRhIH0gZnJvbSAnQGdsaW1tZXIvb2JqZWN0LXJlZmVyZW5jZSc7XG5pbXBvcnQgeyBFTVBUWV9DQUNIRSB9IGZyb20gJy4vb2JqZWN0JztcbmltcG9ydCB7IEJsdWVwcmludCB9IGZyb20gJy4vbWl4aW4nO1xuZXhwb3J0IGNsYXNzIENvbXB1dGVkQmx1ZXByaW50IGV4dGVuZHMgQmx1ZXByaW50IHtcbiAgICBjb25zdHJ1Y3RvcihhY2Nlc3NvciwgZGVwcyA9IFtdKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMubWV0YWRhdGEgPSB7fTtcbiAgICAgICAgdGhpcy5hY2Nlc3NvciA9IGFjY2Vzc29yO1xuICAgICAgICB0aGlzLmRlcHMgPSBkZXBzO1xuICAgIH1cbiAgICBkZXNjcmlwdG9yKF90YXJnZXQsIGtleSwgY2xhc3NNZXRhKSB7XG4gICAgICAgIGNsYXNzTWV0YS5hZGRSZWZlcmVuY2VUeXBlRm9yKGtleSwgQ29tcHV0ZWRSZWZlcmVuY2VCbHVlcHJpbnQoa2V5LCB0aGlzLmRlcHMpKTtcbiAgICAgICAgY2xhc3NNZXRhLmFkZFByb3BlcnR5TWV0YWRhdGEoa2V5LCB0aGlzLm1ldGFkYXRhKTtcbiAgICAgICAgY2xhc3NNZXRhLmFkZFNsb3RGb3Ioa2V5KTtcbiAgICAgICAgcmV0dXJuIG5ldyBDb21wdXRlZCh0aGlzLmFjY2Vzc29yKTtcbiAgICB9XG4gICAgcHJvcGVydHkoLi4ucGF0aHMpIHtcbiAgICAgICAgdGhpcy5kZXBzID0gcGF0aHMubWFwKGQgPT4gZC5zcGxpdCgnLicpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIG1ldGEob2JqZWN0KSB7XG4gICAgICAgIHRoaXMubWV0YWRhdGEgPSBvYmplY3Q7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB2b2xhdGlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuY2xhc3MgQ29tcHV0ZWQge1xuICAgIGNvbnN0cnVjdG9yKGFjY2Vzc29yKSB7XG4gICAgICAgIHRoaXNbXCI1ZDkwZjg0Zi05MDhlLTRhNDItOTc0OS0zZDBmNTIzYzI2MmNcIl0gPSB0cnVlO1xuICAgICAgICB0aGlzLmFjY2Vzc29yID0gYWNjZXNzb3I7XG4gICAgfVxuICAgIGRlZmluZShwcm90b3R5cGUsIGtleSwgaG9tZSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG90eXBlLCBrZXksIHdyYXBBY2Nlc3Nvcihob21lLCBrZXksIHRoaXMuYWNjZXNzb3IpKTtcbiAgICB9XG59XG5mdW5jdGlvbiB3cmFwQWNjZXNzb3IoaG9tZSwgYWNjZXNzb3JOYW1lLCBfZGVzYykge1xuICAgIGxldCBzdXBlckRlc2MgPSBnZXRQcm9wZXJ0eURlc2NyaXB0b3IoaG9tZSwgYWNjZXNzb3JOYW1lKTtcbiAgICBsZXQgb3JpZ2luYWxHZXQ7XG4gICAgbGV0IG9yaWdpbmFsU2V0O1xuICAgIGxldCBkZXNjID0ge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9O1xuICAgIGxldCBnZXQgPSBfZGVzYy5nZXQ7XG4gICAgaWYgKGdldCAmJiBnZXQubGVuZ3RoID4gMCkge1xuICAgICAgICBvcmlnaW5hbEdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXQuY2FsbCh0aGlzLCBhY2Nlc3Nvck5hbWUpO1xuICAgICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIG9yaWdpbmFsR2V0ID0gX2Rlc2MuZ2V0O1xuICAgIH1cbiAgICBsZXQgc2V0ID0gX2Rlc2Muc2V0O1xuICAgIGlmIChzZXQgJiYgc2V0Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgb3JpZ2luYWxTZXQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBzZXQuY2FsbCh0aGlzLCBhY2Nlc3Nvck5hbWUsIHZhbHVlKTtcbiAgICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBvcmlnaW5hbFNldCA9IF9kZXNjLnNldDtcbiAgICB9XG4gICAgbGV0IGNhY2hlR2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoTWV0YS5leGlzdHModGhpcykpIHtcbiAgICAgICAgICAgIGxldCBzbG90ID0gTWV0YS5mb3IodGhpcykuZ2V0U2xvdHMoKVthY2Nlc3Nvck5hbWVdO1xuICAgICAgICAgICAgaWYgKHNsb3QgIT09IEVNUFRZX0NBQ0hFKSByZXR1cm4gc2xvdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3JpZ2luYWxHZXQuY2FsbCh0aGlzKTtcbiAgICB9O1xuICAgIGxldCBjYWNoZVNldDtcbiAgICBpZiAob3JpZ2luYWxTZXQpIHtcbiAgICAgICAgY2FjaGVTZXQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIGxldCBtZXRhID0gTWV0YS5mb3IodGhpcyk7XG4gICAgICAgICAgICBsZXQgc2xvdHMgPSBtZXRhLmdldFNsb3RzKCk7XG4gICAgICAgICAgICBsZXQgcmV0ID0gb3JpZ2luYWxTZXQuY2FsbCh0aGlzLCB2YWx1ZSk7XG4gICAgICAgICAgICBpZiAocmV0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBzbG90c1thY2Nlc3Nvck5hbWVdID0gcmV0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNhY2hlU2V0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICBsZXQgbWV0YSA9IE1ldGEuZm9yKHRoaXMpO1xuICAgICAgICAgICAgbGV0IHNsb3RzID0gbWV0YS5nZXRTbG90cygpO1xuICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHNsb3RzW2FjY2Vzc29yTmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKCFzdXBlckRlc2MgfHwgJ3ZhbHVlJyBpbiBzdXBlckRlc2MpIHtcbiAgICAgICAgZGVzYy5nZXQgPSBjYWNoZUdldDtcbiAgICAgICAgZGVzYy5zZXQgPSBjYWNoZVNldDtcbiAgICAgICAgcmV0dXJuIGRlc2M7XG4gICAgfVxuICAgIGRlc2MuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgbGFzdFN1cGVyID0gdGhpcy5fc3VwZXI7XG4gICAgICAgIHRoaXMuX3N1cGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHN1cGVyRGVzYy5nZXQuY2FsbCh0aGlzKTtcbiAgICAgICAgfTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBjYWNoZUdldC5jYWxsKHRoaXMpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5fc3VwZXIgPSBsYXN0U3VwZXI7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGRlc2Muc2V0ID0gZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICBsZXQgbGFzdFN1cGVyID0gdGhpcy5fc3VwZXI7XG4gICAgICAgIHRoaXMuX3N1cGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHN1cGVyRGVzYy5zZXQuY2FsbCh0aGlzLCB2YWwpO1xuICAgICAgICB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGNhY2hlU2V0LmNhbGwodGhpcywgdmFsKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMuX3N1cGVyID0gbGFzdFN1cGVyO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gZGVzYztcbn1cbmZ1bmN0aW9uIGdldFByb3BlcnR5RGVzY3JpcHRvcihzdWJqZWN0LCBuYW1lKSB7XG4gICAgbGV0IHBkID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzdWJqZWN0LCBuYW1lKTtcbiAgICBsZXQgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yoc3ViamVjdCk7XG4gICAgd2hpbGUgKHR5cGVvZiBwZCA9PT0gJ3VuZGVmaW5lZCcgJiYgcHJvdG8gIT09IG51bGwpIHtcbiAgICAgICAgcGQgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3RvLCBuYW1lKTtcbiAgICAgICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuICAgIH1cbiAgICByZXR1cm4gcGQ7XG59XG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZWQoLi4uYXJncykge1xuICAgIGxldCBsYXN0ID0gYXJncy5wb3AoKTtcbiAgICBsZXQgZGVwcyA9IGFyZ3M7XG4gICAgaWYgKHR5cGVvZiBsYXN0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29tcHV0ZWRCbHVlcHJpbnQoe1xuICAgICAgICAgICAgZ2V0OiBsYXN0XG4gICAgICAgIH0pLnByb3BlcnR5KC4uLmRlcHMpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGxhc3QgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29tcHV0ZWRCbHVlcHJpbnQobGFzdCkucHJvcGVydHkoLi4uZGVwcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImNvbXB1dGVkIGV4cGVjdHMgYSBmdW5jdGlvbiBvciBhbiBvYmplY3QgYXMgbGFzdCBhcmd1bWVudFwiKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gb2JzZXJ2ZXIoLi4uX2FyZ3MpIHt9Il19