ember-legacy-class-transform
Version:
The default blueprint for ember-cli addons.
151 lines (146 loc) • 16.3 kB
JavaScript
'use strict';
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');
class ComputedBlueprint extends _mixin.Blueprint {
constructor(accessor, deps = []) {
super();
this.metadata = {};
this.accessor = accessor;
this.deps = deps;
}
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);
}
property(...paths) {
this.deps = paths.map(d => d.split('.'));
return this;
}
meta(object) {
this.metadata = object;
return this;
}
volatile() {
return this;
}
}
exports.ComputedBlueprint = ComputedBlueprint;
class Computed {
constructor(accessor) {
this["5d90f84f-908e-4a42-9749-3d0f523c262c"] = true;
this.accessor = accessor;
}
define(prototype, key, home) {
Object.defineProperty(prototype, key, wrapAccessor(home, key, this.accessor));
}
}
function wrapAccessor(home, accessorName, _desc) {
let superDesc = getPropertyDescriptor(home, accessorName);
let originalGet;
let originalSet;
let desc = {
enumerable: true,
configurable: true
};
let get = _desc.get;
if (get && get.length > 0) {
originalGet = function () {
return get.call(this, accessorName);
};
} else {
originalGet = _desc.get;
}
let set = _desc.set;
if (set && set.length > 1) {
originalSet = function (value) {
return set.call(this, accessorName, value);
};
} else {
originalSet = _desc.set;
}
let cacheGet = function () {
if (_objectReference.Meta.exists(this)) {
let slot = _objectReference.Meta.for(this).getSlots()[accessorName];
if (slot !== _object.EMPTY_CACHE) return slot;
}
return originalGet.call(this);
};
let cacheSet;
if (originalSet) {
cacheSet = function (value) {
let meta = _objectReference.Meta.for(this);
let slots = meta.getSlots();
let ret = originalSet.call(this, value);
if (ret !== undefined) {
slots[accessorName] = ret;
}
};
} else {
cacheSet = function (value) {
let meta = _objectReference.Meta.for(this);
let 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 () {
let lastSuper = this._super;
this._super = function () {
return superDesc.get.call(this);
};
try {
return cacheGet.call(this);
} finally {
this._super = lastSuper;
}
};
desc.set = function (val) {
let 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) {
let pd = Object.getOwnPropertyDescriptor(subject, name);
let proto = Object.getPrototypeOf(subject);
while (typeof pd === 'undefined' && proto !== null) {
pd = Object.getOwnPropertyDescriptor(proto, name);
proto = Object.getPrototypeOf(proto);
}
return pd;
}
function computed(...args) {
let last = args.pop();
let deps = args;
if (typeof last === 'function') {
return new ComputedBlueprint({
get: last
}).property(...deps);
} else if (typeof last === 'object') {
return new ComputedBlueprint(last).property(...deps);
} else {
throw new TypeError("computed expects a function or an object as last argument");
}
}
function observer(..._args) {}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21wdXRlZC5qcyJdLCJuYW1lcyI6WyJjb21wdXRlZCIsIm9ic2VydmVyIiwiQ29tcHV0ZWRCbHVlcHJpbnQiLCJjb25zdHJ1Y3RvciIsImFjY2Vzc29yIiwiZGVwcyIsIm1ldGFkYXRhIiwiZGVzY3JpcHRvciIsIl90YXJnZXQiLCJrZXkiLCJjbGFzc01ldGEiLCJhZGRSZWZlcmVuY2VUeXBlRm9yIiwiYWRkUHJvcGVydHlNZXRhZGF0YSIsImFkZFNsb3RGb3IiLCJDb21wdXRlZCIsInByb3BlcnR5IiwicGF0aHMiLCJtYXAiLCJkIiwic3BsaXQiLCJtZXRhIiwib2JqZWN0Iiwidm9sYXRpbGUiLCJkZWZpbmUiLCJwcm90b3R5cGUiLCJob21lIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJ3cmFwQWNjZXNzb3IiLCJhY2Nlc3Nvck5hbWUiLCJfZGVzYyIsInN1cGVyRGVzYyIsImdldFByb3BlcnR5RGVzY3JpcHRvciIsIm9yaWdpbmFsR2V0Iiwib3JpZ2luYWxTZXQiLCJkZXNjIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsImdldCIsImxlbmd0aCIsImNhbGwiLCJzZXQiLCJ2YWx1ZSIsImNhY2hlR2V0IiwiZXhpc3RzIiwic2xvdCIsImZvciIsImdldFNsb3RzIiwiY2FjaGVTZXQiLCJzbG90cyIsInJldCIsInVuZGVmaW5lZCIsImxhc3RTdXBlciIsIl9zdXBlciIsInZhbCIsInN1YmplY3QiLCJuYW1lIiwicGQiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJwcm90byIsImdldFByb3RvdHlwZU9mIiwiYXJncyIsImxhc3QiLCJwb3AiLCJUeXBlRXJyb3IiLCJfYXJncyJdLCJtYXBwaW5ncyI6Ijs7Ozs7O1FBMkhnQkEsUSxHQUFBQSxRO1FBYUFDLFEsR0FBQUEsUTs7QUF4SWhCOztBQUNBOztBQUNBOztBQUNPLE1BQU1DLGlCQUFOLDBCQUEwQztBQUM3Q0MsZ0JBQVlDLFFBQVosRUFBc0JDLE9BQU8sRUFBN0IsRUFBaUM7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RUE7QUFDSCxjQUFNLElBQUkyRCxTQUFKLENBQWMsMkRBQWQsQ0FBTjtBQUNIO0FBQ0o7QUFDTSxTQUFTL0QsUUFBVCxDQUFrQixHQUFHZ0UsS0FBckIsRUFBNEIsQ0FBRSIsImZpbGUiOiJsaWIvY29tcHV0ZWQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wdXRlZFJlZmVyZW5jZUJsdWVwcmludCwgTWV0YSB9IGZyb20gJ0BnbGltbWVyL29iamVjdC1yZWZlcmVuY2UnO1xuaW1wb3J0IHsgRU1QVFlfQ0FDSEUgfSBmcm9tICcuL29iamVjdCc7XG5pbXBvcnQgeyBCbHVlcHJpbnQgfSBmcm9tICcuL21peGluJztcbmV4cG9ydCBjbGFzcyBDb21wdXRlZEJsdWVwcmludCBleHRlbmRzIEJsdWVwcmludCB7XG4gICAgY29uc3RydWN0b3IoYWNjZXNzb3IsIGRlcHMgPSBbXSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLm1ldGFkYXRhID0ge307XG4gICAgICAgIHRoaXMuYWNjZXNzb3IgPSBhY2Nlc3NvcjtcbiAgICAgICAgdGhpcy5kZXBzID0gZGVwcztcbiAgICB9XG4gICAgZGVzY3JpcHRvcihfdGFyZ2V0LCBrZXksIGNsYXNzTWV0YSkge1xuICAgICAgICBjbGFzc01ldGEuYWRkUmVmZXJlbmNlVHlwZUZvcihrZXksIENvbXB1dGVkUmVmZXJlbmNlQmx1ZXByaW50KGtleSwgdGhpcy5kZXBzKSk7XG4gICAgICAgIGNsYXNzTWV0YS5hZGRQcm9wZXJ0eU1ldGFkYXRhKGtleSwgdGhpcy5tZXRhZGF0YSk7XG4gICAgICAgIGNsYXNzTWV0YS5hZGRTbG90Rm9yKGtleSk7XG4gICAgICAgIHJldHVybiBuZXcgQ29tcHV0ZWQodGhpcy5hY2Nlc3Nvcik7XG4gICAgfVxuICAgIHByb3BlcnR5KC4uLnBhdGhzKSB7XG4gICAgICAgIHRoaXMuZGVwcyA9IHBhdGhzLm1hcChkID0+IGQuc3BsaXQoJy4nKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBtZXRhKG9iamVjdCkge1xuICAgICAgICB0aGlzLm1ldGFkYXRhID0gb2JqZWN0O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdm9sYXRpbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cbmNsYXNzIENvbXB1dGVkIHtcbiAgICBjb25zdHJ1Y3RvcihhY2Nlc3Nvcikge1xuICAgICAgICB0aGlzW1wiNWQ5MGY4NGYtOTA4ZS00YTQyLTk3NDktM2QwZjUyM2MyNjJjXCJdID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5hY2Nlc3NvciA9IGFjY2Vzc29yO1xuICAgIH1cbiAgICBkZWZpbmUocHJvdG90eXBlLCBrZXksIGhvbWUpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvdHlwZSwga2V5LCB3cmFwQWNjZXNzb3IoaG9tZSwga2V5LCB0aGlzLmFjY2Vzc29yKSk7XG4gICAgfVxufVxuZnVuY3Rpb24gd3JhcEFjY2Vzc29yKGhvbWUsIGFjY2Vzc29yTmFtZSwgX2Rlc2MpIHtcbiAgICBsZXQgc3VwZXJEZXNjID0gZ2V0UHJvcGVydHlEZXNjcmlwdG9yKGhvbWUsIGFjY2Vzc29yTmFtZSk7XG4gICAgbGV0IG9yaWdpbmFsR2V0O1xuICAgIGxldCBvcmlnaW5hbFNldDtcbiAgICBsZXQgZGVzYyA9IHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfTtcbiAgICBsZXQgZ2V0ID0gX2Rlc2MuZ2V0O1xuICAgIGlmIChnZXQgJiYgZ2V0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgb3JpZ2luYWxHZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0LmNhbGwodGhpcywgYWNjZXNzb3JOYW1lKTtcbiAgICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBvcmlnaW5hbEdldCA9IF9kZXNjLmdldDtcbiAgICB9XG4gICAgbGV0IHNldCA9IF9kZXNjLnNldDtcbiAgICBpZiAoc2V0ICYmIHNldC5sZW5ndGggPiAxKSB7XG4gICAgICAgIG9yaWdpbmFsU2V0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gc2V0LmNhbGwodGhpcywgYWNjZXNzb3JOYW1lLCB2YWx1ZSk7XG4gICAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgb3JpZ2luYWxTZXQgPSBfZGVzYy5zZXQ7XG4gICAgfVxuICAgIGxldCBjYWNoZUdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKE1ldGEuZXhpc3RzKHRoaXMpKSB7XG4gICAgICAgICAgICBsZXQgc2xvdCA9IE1ldGEuZm9yKHRoaXMpLmdldFNsb3RzKClbYWNjZXNzb3JOYW1lXTtcbiAgICAgICAgICAgIGlmIChzbG90ICE9PSBFTVBUWV9DQUNIRSkgcmV0dXJuIHNsb3Q7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsR2V0LmNhbGwodGhpcyk7XG4gICAgfTtcbiAgICBsZXQgY2FjaGVTZXQ7XG4gICAgaWYgKG9yaWdpbmFsU2V0KSB7XG4gICAgICAgIGNhY2hlU2V0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICBsZXQgbWV0YSA9IE1ldGEuZm9yKHRoaXMpO1xuICAgICAgICAgICAgbGV0IHNsb3RzID0gbWV0YS5nZXRTbG90cygpO1xuICAgICAgICAgICAgbGV0IHJldCA9IG9yaWdpbmFsU2V0LmNhbGwodGhpcywgdmFsdWUpO1xuICAgICAgICAgICAgaWYgKHJldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgc2xvdHNbYWNjZXNzb3JOYW1lXSA9IHJldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjYWNoZVNldCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgbGV0IG1ldGEgPSBNZXRhLmZvcih0aGlzKTtcbiAgICAgICAgICAgIGxldCBzbG90cyA9IG1ldGEuZ2V0U2xvdHMoKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSBzbG90c1thY2Nlc3Nvck5hbWVdID0gdmFsdWU7XG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmICghc3VwZXJEZXNjIHx8ICd2YWx1ZScgaW4gc3VwZXJEZXNjKSB7XG4gICAgICAgIGRlc2MuZ2V0ID0gY2FjaGVHZXQ7XG4gICAgICAgIGRlc2Muc2V0ID0gY2FjaGVTZXQ7XG4gICAgICAgIHJldHVybiBkZXNjO1xuICAgIH1cbiAgICBkZXNjLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IGxhc3RTdXBlciA9IHRoaXMuX3N1cGVyO1xuICAgICAgICB0aGlzLl9zdXBlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBzdXBlckRlc2MuZ2V0LmNhbGwodGhpcyk7XG4gICAgICAgIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVHZXQuY2FsbCh0aGlzKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMuX3N1cGVyID0gbGFzdFN1cGVyO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBkZXNjLnNldCA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgbGV0IGxhc3RTdXBlciA9IHRoaXMuX3N1cGVyO1xuICAgICAgICB0aGlzLl9zdXBlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBzdXBlckRlc2Muc2V0LmNhbGwodGhpcywgdmFsKTtcbiAgICAgICAgfTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBjYWNoZVNldC5jYWxsKHRoaXMsIHZhbCk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLl9zdXBlciA9IGxhc3RTdXBlcjtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIGRlc2M7XG59XG5mdW5jdGlvbiBnZXRQcm9wZXJ0eURlc2NyaXB0b3Ioc3ViamVjdCwgbmFtZSkge1xuICAgIGxldCBwZCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc3ViamVjdCwgbmFtZSk7XG4gICAgbGV0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHN1YmplY3QpO1xuICAgIHdoaWxlICh0eXBlb2YgcGQgPT09ICd1bmRlZmluZWQnICYmIHByb3RvICE9PSBudWxsKSB7XG4gICAgICAgIHBkID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90bywgbmFtZSk7XG4gICAgICAgIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKTtcbiAgICB9XG4gICAgcmV0dXJuIHBkO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVkKC4uLmFyZ3MpIHtcbiAgICBsZXQgbGFzdCA9IGFyZ3MucG9wKCk7XG4gICAgbGV0IGRlcHMgPSBhcmdzO1xuICAgIGlmICh0eXBlb2YgbGFzdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gbmV3IENvbXB1dGVkQmx1ZXByaW50KHtcbiAgICAgICAgICAgIGdldDogbGFzdFxuICAgICAgICB9KS5wcm9wZXJ0eSguLi5kZXBzKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBsYXN0ID09PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gbmV3IENvbXB1dGVkQmx1ZXByaW50KGxhc3QpLnByb3BlcnR5KC4uLmRlcHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJjb21wdXRlZCBleHBlY3RzIGEgZnVuY3Rpb24gb3IgYW4gb2JqZWN0IGFzIGxhc3QgYXJndW1lbnRcIik7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIG9ic2VydmVyKC4uLl9hcmdzKSB7fSJdfQ==