ember-legacy-class-transform
Version:
The default blueprint for ember-cli addons.
175 lines (136 loc) • 16.3 kB
JavaScript
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
import { PropertyReference } from './references/descriptors';
import RootReference from './references/root';
import { DictSet, dict } from '@glimmer/util';
import { VOLATILE_TAG } from '@glimmer/reference';
var NOOP_DESTROY = {
destroy: function () {}
};
var ConstPath = function () {
function ConstPath(parent, _property) {
_classCallCheck(this, ConstPath);
this.tag = VOLATILE_TAG;
this.parent = parent;
}
ConstPath.prototype.chain = function chain() {
return NOOP_DESTROY;
};
ConstPath.prototype.notify = function notify() {};
ConstPath.prototype.value = function value() {
return this.parent[this.property];
};
ConstPath.prototype.get = function get(prop) {
return new ConstPath(this.parent[this.property], prop);
};
return ConstPath;
}();
var ConstRoot = function () {
function ConstRoot(value) {
_classCallCheck(this, ConstRoot);
this.tag = VOLATILE_TAG;
this.inner = value;
}
ConstRoot.prototype.update = function update(inner) {
this.inner = inner;
};
ConstRoot.prototype.chain = function chain() {
return NOOP_DESTROY;
};
ConstRoot.prototype.notify = function notify() {};
ConstRoot.prototype.value = function value() {
return this.inner;
};
ConstRoot.prototype.referenceFromParts = function referenceFromParts(_parts) {
throw new Error("Not implemented");
};
ConstRoot.prototype.chainFor = function chainFor(_prop) {
throw new Error("Not implemented");
};
ConstRoot.prototype.get = function get(prop) {
return new ConstPath(this.inner, prop);
};
return ConstRoot;
}();
var ConstMeta /*implements IMeta*/ = function () {
function ConstMeta(object) {
_classCallCheck(this, ConstMeta);
this.object = object;
}
ConstMeta.prototype.root = function root() {
return new ConstRoot(this.object);
};
return ConstMeta;
}();
export var CLASS_META = "df8be4c8-4e89-44e2-a8f9-550c8dacdca7";
var hasOwnProperty = Object.hasOwnProperty;
var Meta = function () {
function Meta(object, _ref) {
var RootReferenceFactory = _ref.RootReferenceFactory,
DefaultPathReferenceFactory = _ref.DefaultPathReferenceFactory;
_classCallCheck(this, Meta);
this.references = null;
this.slots = null;
this.referenceTypes = null;
this.propertyMetadata = null;
this.object = object;
this.RootReferenceFactory = RootReferenceFactory || RootReference;
this.DefaultPathReferenceFactory = DefaultPathReferenceFactory || PropertyReference;
}
Meta.for = function _for(obj) {
if (obj === null || obj === undefined) return new Meta(obj, {});
if (hasOwnProperty.call(obj, '_meta') && obj._meta) return obj._meta;
if (!Object.isExtensible(obj)) return new ConstMeta(obj);
var MetaToUse = Meta;
if (obj.constructor && obj.constructor[CLASS_META]) {
var classMeta = obj.constructor[CLASS_META];
MetaToUse = classMeta.InstanceMetaConstructor;
} else if (obj[CLASS_META]) {
MetaToUse = obj[CLASS_META].InstanceMetaConstructor;
}
return obj._meta = new MetaToUse(obj, {});
};
Meta.exists = function exists(obj) {
return typeof obj === 'object' && obj._meta;
};
Meta.metadataForProperty = function metadataForProperty(_key) {
return null;
};
Meta.prototype.addReference = function addReference(property, reference) {
var refs = this.references = this.references || dict();
var set = refs[property] = refs[property] || new DictSet();
set.add(reference);
};
Meta.prototype.addReferenceTypeFor = function addReferenceTypeFor(property, type) {
this.referenceTypes = this.referenceTypes || dict();
this.referenceTypes[property] = type;
};
Meta.prototype.referenceTypeFor = function referenceTypeFor(property) {
if (!this.referenceTypes) return PropertyReference;
return this.referenceTypes[property] || PropertyReference;
};
Meta.prototype.removeReference = function removeReference(property, reference) {
if (!this.references) return;
var set = this.references[property];
set.delete(reference);
};
Meta.prototype.getReferenceTypes = function getReferenceTypes() {
this.referenceTypes = this.referenceTypes || dict();
return this.referenceTypes;
};
Meta.prototype.referencesFor = function referencesFor(property) {
if (!this.references) return null;
return this.references[property];
};
Meta.prototype.getSlots = function getSlots() {
return this.slots = this.slots || dict();
};
Meta.prototype.root = function root() {
return this.rootCache = this.rootCache || new this.RootReferenceFactory(this.object);
};
return Meta;
}();
export default Meta;
export function metaFor(obj) {
return Meta.for(obj);
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9tZXRhLmpzIl0sIm5hbWVzIjpbIlByb3BlcnR5UmVmZXJlbmNlIiwiUm9vdFJlZmVyZW5jZSIsIkRpY3RTZXQiLCJkaWN0IiwiVk9MQVRJTEVfVEFHIiwiTk9PUF9ERVNUUk9ZIiwiZGVzdHJveSIsIkNvbnN0UGF0aCIsInBhcmVudCIsIl9wcm9wZXJ0eSIsInRhZyIsImNoYWluIiwibm90aWZ5IiwidmFsdWUiLCJwcm9wZXJ0eSIsImdldCIsInByb3AiLCJDb25zdFJvb3QiLCJpbm5lciIsInVwZGF0ZSIsInJlZmVyZW5jZUZyb21QYXJ0cyIsIl9wYXJ0cyIsIkVycm9yIiwiY2hhaW5Gb3IiLCJfcHJvcCIsIkNvbnN0TWV0YSIsIm9iamVjdCIsInJvb3QiLCJDTEFTU19NRVRBIiwiaGFzT3duUHJvcGVydHkiLCJPYmplY3QiLCJNZXRhIiwiUm9vdFJlZmVyZW5jZUZhY3RvcnkiLCJEZWZhdWx0UGF0aFJlZmVyZW5jZUZhY3RvcnkiLCJyZWZlcmVuY2VzIiwic2xvdHMiLCJyZWZlcmVuY2VUeXBlcyIsInByb3BlcnR5TWV0YWRhdGEiLCJmb3IiLCJvYmoiLCJ1bmRlZmluZWQiLCJjYWxsIiwiX21ldGEiLCJpc0V4dGVuc2libGUiLCJNZXRhVG9Vc2UiLCJjb25zdHJ1Y3RvciIsImNsYXNzTWV0YSIsIkluc3RhbmNlTWV0YUNvbnN0cnVjdG9yIiwiZXhpc3RzIiwibWV0YWRhdGFGb3JQcm9wZXJ0eSIsIl9rZXkiLCJhZGRSZWZlcmVuY2UiLCJyZWZlcmVuY2UiLCJyZWZzIiwic2V0IiwiYWRkIiwiYWRkUmVmZXJlbmNlVHlwZUZvciIsInR5cGUiLCJyZWZlcmVuY2VUeXBlRm9yIiwicmVtb3ZlUmVmZXJlbmNlIiwiZGVsZXRlIiwiZ2V0UmVmZXJlbmNlVHlwZXMiLCJyZWZlcmVuY2VzRm9yIiwiZ2V0U2xvdHMiLCJyb290Q2FjaGUiLCJtZXRhRm9yIl0sIm1hcHBpbmdzIjoiOztBQUFBLFNBQVNBLGlCQUFULFFBQWtDLDBCQUFsQztBQUNBLE9BQU9D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QnRCLFFBQXBCLEtBQWlDZCxpQkFBeEM7QUFDSCxLOzttQkFDRDJELGUsNEJBQWdCN0MsUSxFQUFVc0MsUyxFQUFXO0FBQ2pDLFlBQUksQ0FBQyxLQUFLbEIsVUFBVixFQUFzQjtBQUN0QixZQUFJb0IsTUFBTSxLQUFLcEIsVUFBTCxDQUFnQnBCLFFBQWhCLENBQVY7QUFDQXdDLFlBQUlNLE1BQUosQ0FBV1IsU0FBWDtBQUNILEs7O21CQUNEUyxpQixnQ0FBb0I7QUFDaEIsYUFBS3pCLGNBQUwsR0FBc0IsS0FBS0EsY0FBTCxJQUF1QmpDLE1BQTdDO0FBQ0EsZUFBTyxLQUFLaUMsY0FBWjtBQUNILEs7O21CQUNEMEIsYSwwQkFBY2hELFEsRUFBVTtBQUNwQixZQUFJLENBQUMsS0FBS29CLFVBQVYsRUFBc0IsT0FBTyxJQUFQO0FBQ3RCLGVBQU8sS0FBS0EsVUFBTCxDQUFnQnBCLFFBQWhCLENBQVA7QUFDSCxLOzttQkFDRGlELFEsdUJBQVc7QUFDUCxlQUFPLEtBQUs1QixLQUFMLEdBQWEsS0FBS0EsS0FBTCxJQUFjaEMsTUFBbEM7QUFDSCxLOzttQkFDRHdCLEksbUJBQU87QUFDSCxlQUFPLEtBQUtxQyxTQUFMLEdBQWlCLEtBQUtBLFNBQUwsSUFBa0IsSUFBSSxLQUFLaEMsb0JBQVQsQ0FBOEIsS0FBS04sTUFBbkMsQ0FBMUM7QUFDSCxLOzs7OztBQUVMLGVBQWVLLElBQWY7QUFDQSxPQUFPLFNBQVNrQyxPQUFULENBQWlCMUIsR0FBakIsRUFBc0I7QUFDekIsV0FBT1IsS0FBS08sR0FBTCxDQUFTQyxHQUFULENBQVA7QUFDSCIsImZpbGUiOiJsaWIvbWV0YS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFByb3BlcnR5UmVmZXJlbmNlIH0gZnJvbSAnLi9yZWZlcmVuY2VzL2Rlc2NyaXB0b3JzJztcbmltcG9ydCBSb290UmVmZXJlbmNlIGZyb20gJy4vcmVmZXJlbmNlcy9yb290JztcbmltcG9ydCB7IERpY3RTZXQsIGRpY3QgfSBmcm9tICdAZ2xpbW1lci91dGlsJztcbmltcG9ydCB7IFZPTEFUSUxFX1RBRyB9IGZyb20gJ0BnbGltbWVyL3JlZmVyZW5jZSc7XG5jb25zdCBOT09QX0RFU1RST1kgPSB7IGRlc3Ryb3koKSB7fSB9O1xuY2xhc3MgQ29uc3RQYXRoIHtcbiAgICBjb25zdHJ1Y3RvcihwYXJlbnQsIF9wcm9wZXJ0eSkge1xuICAgICAgICB0aGlzLnRhZyA9IFZPTEFUSUxFX1RBRztcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgfVxuICAgIGNoYWluKCkge1xuICAgICAgICByZXR1cm4gTk9PUF9ERVNUUk9ZO1xuICAgIH1cbiAgICBub3RpZnkoKSB7fVxuICAgIHZhbHVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnRbdGhpcy5wcm9wZXJ0eV07XG4gICAgfVxuICAgIGdldChwcm9wKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29uc3RQYXRoKHRoaXMucGFyZW50W3RoaXMucHJvcGVydHldLCBwcm9wKTtcbiAgICB9XG59XG5jbGFzcyBDb25zdFJvb3Qge1xuICAgIGNvbnN0cnVjdG9yKHZhbHVlKSB7XG4gICAgICAgIHRoaXMudGFnID0gVk9MQVRJTEVfVEFHO1xuICAgICAgICB0aGlzLmlubmVyID0gdmFsdWU7XG4gICAgfVxuICAgIHVwZGF0ZShpbm5lcikge1xuICAgICAgICB0aGlzLmlubmVyID0gaW5uZXI7XG4gICAgfVxuICAgIGNoYWluKCkge1xuICAgICAgICByZXR1cm4gTk9PUF9ERVNUUk9ZO1xuICAgIH1cbiAgICBub3RpZnkoKSB7fVxuICAgIHZhbHVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbm5lcjtcbiAgICB9XG4gICAgcmVmZXJlbmNlRnJvbVBhcnRzKF9wYXJ0cykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWRcIik7XG4gICAgfVxuICAgIGNoYWluRm9yKF9wcm9wKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgICB9XG4gICAgZ2V0KHByb3ApIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb25zdFBhdGgodGhpcy5pbm5lciwgcHJvcCk7XG4gICAgfVxufVxuY2xhc3MgQ29uc3RNZXRhIC8qaW1wbGVtZW50cyBJTWV0YSovIHtcbiAgICBjb25zdHJ1Y3RvcihvYmplY3QpIHtcbiAgICAgICAgdGhpcy5vYmplY3QgPSBvYmplY3Q7XG4gICAgfVxuICAgIHJvb3QoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29uc3RSb290KHRoaXMub2JqZWN0KTtcbiAgICB9XG59XG5leHBvcnQgY29uc3QgQ0xBU1NfTUVUQSA9IFwiZGY4YmU0YzgtNGU4OS00NGUyLWE4ZjktNTUwYzhkYWNkY2E3XCI7XG5jb25zdCBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5oYXNPd25Qcm9wZXJ0eTtcbmNsYXNzIE1ldGEge1xuICAgIGNvbnN0cnVjdG9yKG9iamVjdCwgeyBSb290UmVmZXJlbmNlRmFjdG9yeSwgRGVmYXVsdFBhdGhSZWZlcmVuY2VGYWN0b3J5IH0pIHtcbiAgICAgICAgdGhpcy5yZWZlcmVuY2VzID0gbnVsbDtcbiAgICAgICAgdGhpcy5zbG90cyA9IG51bGw7XG4gICAgICAgIHRoaXMucmVmZXJlbmNlVHlwZXMgPSBudWxsO1xuICAgICAgICB0aGlzLnByb3BlcnR5TWV0YWRhdGEgPSBudWxsO1xuICAgICAgICB0aGlzLm9iamVjdCA9IG9iamVjdDtcbiAgICAgICAgdGhpcy5Sb290UmVmZXJlbmNlRmFjdG9yeSA9IFJvb3RSZWZlcmVuY2VGYWN0b3J5IHx8IFJvb3RSZWZlcmVuY2U7XG4gICAgICAgIHRoaXMuRGVmYXVsdFBhdGhSZWZlcmVuY2VGYWN0b3J5ID0gRGVmYXVsdFBhdGhSZWZlcmVuY2VGYWN0b3J5IHx8IFByb3BlcnR5UmVmZXJlbmNlO1xuICAgIH1cbiAgICBzdGF0aWMgZm9yKG9iaikge1xuICAgICAgICBpZiAob2JqID09PSBudWxsIHx8IG9iaiA9PT0gdW5kZWZpbmVkKSByZXR1cm4gbmV3IE1ldGEob2JqLCB7fSk7XG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgJ19tZXRhJykgJiYgb2JqLl9tZXRhKSByZXR1cm4gb2JqLl9tZXRhO1xuICAgICAgICBpZiAoIU9iamVjdC5pc0V4dGVuc2libGUob2JqKSkgcmV0dXJuIG5ldyBDb25zdE1ldGEob2JqKTtcbiAgICAgICAgbGV0IE1ldGFUb1VzZSA9IE1ldGE7XG4gICAgICAgIGlmIChvYmouY29uc3RydWN0b3IgJiYgb2JqLmNvbnN0cnVjdG9yW0NMQVNTX01FVEFdKSB7XG4gICAgICAgICAgICBsZXQgY2xhc3NNZXRhID0gb2JqLmNvbnN0cnVjdG9yW0NMQVNTX01FVEFdO1xuICAgICAgICAgICAgTWV0YVRvVXNlID0gY2xhc3NNZXRhLkluc3RhbmNlTWV0YUNvbnN0cnVjdG9yO1xuICAgICAgICB9IGVsc2UgaWYgKG9ialtDTEFTU19NRVRBXSkge1xuICAgICAgICAgICAgTWV0YVRvVXNlID0gb2JqW0NMQVNTX01FVEFdLkluc3RhbmNlTWV0YUNvbnN0cnVjdG9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmouX21ldGEgPSBuZXcgTWV0YVRvVXNlKG9iaiwge30pO1xuICAgIH1cbiAgICBzdGF0aWMgZXhpc3RzKG9iaikge1xuICAgICAgICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgb2JqLl9tZXRhO1xuICAgIH1cbiAgICBzdGF0aWMgbWV0YWRhdGFGb3JQcm9wZXJ0eShfa2V5KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBhZGRSZWZlcmVuY2UocHJvcGVydHksIHJlZmVyZW5jZSkge1xuICAgICAgICBsZXQgcmVmcyA9IHRoaXMucmVmZXJlbmNlcyA9IHRoaXMucmVmZXJlbmNlcyB8fCBkaWN0KCk7XG4gICAgICAgIGxldCBzZXQgPSByZWZzW3Byb3BlcnR5XSA9IHJlZnNbcHJvcGVydHldIHx8IG5ldyBEaWN0U2V0KCk7XG4gICAgICAgIHNldC5hZGQocmVmZXJlbmNlKTtcbiAgICB9XG4gICAgYWRkUmVmZXJlbmNlVHlwZUZvcihwcm9wZXJ0eSwgdHlwZSkge1xuICAgICAgICB0aGlzLnJlZmVyZW5jZVR5cGVzID0gdGhpcy5yZWZlcmVuY2VUeXBlcyB8fCBkaWN0KCk7XG4gICAgICAgIHRoaXMucmVmZXJlbmNlVHlwZXNbcHJvcGVydHldID0gdHlwZTtcbiAgICB9XG4gICAgcmVmZXJlbmNlVHlwZUZvcihwcm9wZXJ0eSkge1xuICAgICAgICBpZiAoIXRoaXMucmVmZXJlbmNlVHlwZXMpIHJldHVybiBQcm9wZXJ0eVJlZmVyZW5jZTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVmZXJlbmNlVHlwZXNbcHJvcGVydHldIHx8IFByb3BlcnR5UmVmZXJlbmNlO1xuICAgIH1cbiAgICByZW1vdmVSZWZlcmVuY2UocHJvcGVydHksIHJlZmVyZW5jZSkge1xuICAgICAgICBpZiAoIXRoaXMucmVmZXJlbmNlcykgcmV0dXJuO1xuICAgICAgICBsZXQgc2V0ID0gdGhpcy5yZWZlcmVuY2VzW3Byb3BlcnR5XTtcbiAgICAgICAgc2V0LmRlbGV0ZShyZWZlcmVuY2UpO1xuICAgIH1cbiAgICBnZXRSZWZlcmVuY2VUeXBlcygpIHtcbiAgICAgICAgdGhpcy5yZWZlcmVuY2VUeXBlcyA9IHRoaXMucmVmZXJlbmNlVHlwZXMgfHwgZGljdCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5yZWZlcmVuY2VUeXBlcztcbiAgICB9XG4gICAgcmVmZXJlbmNlc0Zvcihwcm9wZXJ0eSkge1xuICAgICAgICBpZiAoIXRoaXMucmVmZXJlbmNlcykgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiB0aGlzLnJlZmVyZW5jZXNbcHJvcGVydHldO1xuICAgIH1cbiAgICBnZXRTbG90cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2xvdHMgPSB0aGlzLnNsb3RzIHx8IGRpY3QoKTtcbiAgICB9XG4gICAgcm9vdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm9vdENhY2hlID0gdGhpcy5yb290Q2FjaGUgfHwgbmV3IHRoaXMuUm9vdFJlZmVyZW5jZUZhY3RvcnkodGhpcy5vYmplY3QpO1xuICAgIH1cbn1cbmV4cG9ydCBkZWZhdWx0IE1ldGE7XG5leHBvcnQgZnVuY3Rpb24gbWV0YUZvcihvYmopIHtcbiAgICByZXR1cm4gTWV0YS5mb3Iob2JqKTtcbn0iXX0=