ember-legacy-class-transform
Version:
The default blueprint for ember-cli addons.
195 lines (148 loc) • 16.3 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.CLASS_META = undefined;
exports.metaFor = metaFor;
var _descriptors = require('./references/descriptors');
var _root = require('./references/root');
var _root2 = _interopRequireDefault(_root);
var _util = require('@glimmer/util');
var _reference = require('@glimmer/reference');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
var NOOP_DESTROY = {
destroy: function () {}
};
var ConstPath = function () {
function ConstPath(parent, _property) {
_classCallCheck(this, ConstPath);
this.tag = _reference.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 = _reference.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;
}();
var CLASS_META = exports.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 || _root2.default;
this.DefaultPathReferenceFactory = DefaultPathReferenceFactory || _descriptors.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 || (0, _util.dict)();
var set = refs[property] = refs[property] || new _util.DictSet();
set.add(reference);
};
Meta.prototype.addReferenceTypeFor = function addReferenceTypeFor(property, type) {
this.referenceTypes = this.referenceTypes || (0, _util.dict)();
this.referenceTypes[property] = type;
};
Meta.prototype.referenceTypeFor = function referenceTypeFor(property) {
if (!this.referenceTypes) return _descriptors.PropertyReference;
return this.referenceTypes[property] || _descriptors.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 || (0, _util.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 || (0, _util.dict)();
};
Meta.prototype.root = function root() {
return this.rootCache = this.rootCache || new this.RootReferenceFactory(this.object);
};
return Meta;
}();
exports.default = Meta;
function metaFor(obj) {
return Meta.for(obj);
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9tZXRhLmpzIl0sIm5hbWVzIjpbIlByb3BlcnR5UmVmZXJlbmNlIiwiUm9vdFJlZmVyZW5jZSIsIkRpY3RTZXQiLCJkaWN0IiwiVk9MQVRJTEVfVEFHIiwiTk9PUF9ERVNUUk9ZIiwiZGVzdHJveSIsIkNvbnN0UGF0aCIsInBhcmVudCIsIl9wcm9wZXJ0eSIsInRhZyIsImNoYWluIiwibm90aWZ5IiwidmFsdWUiLCJwcm9wZXJ0eSIsImdldCIsInByb3AiLCJDb25zdFJvb3QiLCJpbm5lciIsInVwZGF0ZSIsInJlZmVyZW5jZUZyb21QYXJ0cyIsIl9wYXJ0cyIsIkVycm9yIiwiY2hhaW5Gb3IiLCJfcHJvcCIsIkNvbnN0TWV0YSIsIm9iamVjdCIsInJvb3QiLCJDTEFTU19NRVRBIiwiaGFzT3duUHJvcGVydHkiLCJPYmplY3QiLCJNZXRhIiwiUm9vdFJlZmVyZW5jZUZhY3RvcnkiLCJEZWZhdWx0UGF0aFJlZmVyZW5jZUZhY3RvcnkiLCJyZWZlcmVuY2VzIiwic2xvdHMiLCJyZWZlcmVuY2VUeXBlcyIsInByb3BlcnR5TWV0YWRhdGEiLCJmb3IiLCJvYmoiLCJ1bmRlZmluZWQiLCJjYWxsIiwiX21ldGEiLCJpc0V4dGVuc2libGUiLCJNZXRhVG9Vc2UiLCJjb25zdHJ1Y3RvciIsImNsYXNzTWV0YSIsIkluc3RhbmNlTWV0YUNvbnN0cnVjdG9yIiwiZXhpc3RzIiwibWV0YWRhdGFGb3JQcm9wZXJ0eSIsIl9rZXkiLCJhZGRSZWZlcmVuY2UiLCJyZWZlcmVuY2UiLCJyZWZzIiwic2V0IiwiYWRkIiwiYWRkUmVmZXJlbmNlVHlwZUZvciIsInR5cGUiLCJyZWZlcmVuY2VUeXBlRm9yIiwicmVtb3ZlUmVmZXJlbmNlIiwiZGVsZXRlIiwiZ2V0UmVmZXJlbmNlVHlwZXMiLCJyZWZlcmVuY2VzRm9yIiwiZ2V0U2xvdHMiLCJyb290Q2FjaGUiLCJtZXRhRm9yIl0sIm1hcHBpbmdzIjoiOzs7Ozs7UUF1SE8sQUFBUzs7QUF2SGhCLEFBQVMsQUFBeUI7O0FBQ2xD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Q2Y7QTs7bUIsQUFDRCx1Q0FBYyxBLFVBQVUsQUFDcEI7WUFBSSxDQUFDLEtBQUwsQUFBVSxZQUFZLE9BQUEsQUFBTyxBQUM3QjtlQUFPLEtBQUEsQUFBSyxXQUFaLEFBQU8sQUFBZ0IsQUFDMUI7QTs7bUJBQ0QsQSwrQkFBVyxBQUNQO2VBQU8sS0FBQSxBQUFLLFFBQVEsS0FBQSxBQUFLLFNBQXpCLEFBQWtDLEFBQ3JDO0E7O21CQUNELEEsdUJBQU8sQUFDSDtlQUFPLEtBQUEsQUFBSyxZQUFZLEtBQUEsQUFBSyxhQUFhLElBQUksS0FBSixBQUFTLHFCQUFxQixLQUF4RSxBQUEwQyxBQUFtQyxBQUNoRjtBOzs7QUFFTDs7a0JBQUEsQUFBZSxBQUNmO0FBQU8saUJBQUEsQUFBaUIsS0FBSyxBQUN6QjtXQUFPLEtBQUEsQUFBSyxJQUFaLEFBQU8sQUFBUyxBQUNuQiIsImZpbGUiOiJsaWIvbWV0YS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFByb3BlcnR5UmVmZXJlbmNlIH0gZnJvbSAnLi9yZWZlcmVuY2VzL2Rlc2NyaXB0b3JzJztcbmltcG9ydCBSb290UmVmZXJlbmNlIGZyb20gJy4vcmVmZXJlbmNlcy9yb290JztcbmltcG9ydCB7IERpY3RTZXQsIGRpY3QgfSBmcm9tICdAZ2xpbW1lci91dGlsJztcbmltcG9ydCB7IFZPTEFUSUxFX1RBRyB9IGZyb20gJ0BnbGltbWVyL3JlZmVyZW5jZSc7XG5jb25zdCBOT09QX0RFU1RST1kgPSB7IGRlc3Ryb3koKSB7fSB9O1xuY2xhc3MgQ29uc3RQYXRoIHtcbiAgICBjb25zdHJ1Y3RvcihwYXJlbnQsIF9wcm9wZXJ0eSkge1xuICAgICAgICB0aGlzLnRhZyA9IFZPTEFUSUxFX1RBRztcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgfVxuICAgIGNoYWluKCkge1xuICAgICAgICByZXR1cm4gTk9PUF9ERVNUUk9ZO1xuICAgIH1cbiAgICBub3RpZnkoKSB7fVxuICAgIHZhbHVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnRbdGhpcy5wcm9wZXJ0eV07XG4gICAgfVxuICAgIGdldChwcm9wKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29uc3RQYXRoKHRoaXMucGFyZW50W3RoaXMucHJvcGVydHldLCBwcm9wKTtcbiAgICB9XG59XG5jbGFzcyBDb25zdFJvb3Qge1xuICAgIGNvbnN0cnVjdG9yKHZhbHVlKSB7XG4gICAgICAgIHRoaXMudGFnID0gVk9MQVRJTEVfVEFHO1xuICAgICAgICB0aGlzLmlubmVyID0gdmFsdWU7XG4gICAgfVxuICAgIHVwZGF0ZShpbm5lcikge1xuICAgICAgICB0aGlzLmlubmVyID0gaW5uZXI7XG4gICAgfVxuICAgIGNoYWluKCkge1xuICAgICAgICByZXR1cm4gTk9PUF9ERVNUUk9ZO1xuICAgIH1cbiAgICBub3RpZnkoKSB7fVxuICAgIHZhbHVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbm5lcjtcbiAgICB9XG4gICAgcmVmZXJlbmNlRnJvbVBhcnRzKF9wYXJ0cykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWRcIik7XG4gICAgfVxuICAgIGNoYWluRm9yKF9wcm9wKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgICB9XG4gICAgZ2V0KHByb3ApIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb25zdFBhdGgodGhpcy5pbm5lciwgcHJvcCk7XG4gICAgfVxufVxuY2xhc3MgQ29uc3RNZXRhIC8qaW1wbGVtZW50cyBJTWV0YSovIHtcbiAgICBjb25zdHJ1Y3RvcihvYmplY3QpIHtcbiAgICAgICAgdGhpcy5vYmplY3QgPSBvYmplY3Q7XG4gICAgfVxuICAgIHJvb3QoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29uc3RSb290KHRoaXMub2JqZWN0KTtcbiAgICB9XG59XG5leHBvcnQgY29uc3QgQ0xBU1NfTUVUQSA9IFwiZGY4YmU0YzgtNGU4OS00NGUyLWE4ZjktNTUwYzhkYWNkY2E3XCI7XG5jb25zdCBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5oYXNPd25Qcm9wZXJ0eTtcbmNsYXNzIE1ldGEge1xuICAgIGNvbnN0cnVjdG9yKG9iamVjdCwgeyBSb290UmVmZXJlbmNlRmFjdG9yeSwgRGVmYXVsdFBhdGhSZWZlcmVuY2VGYWN0b3J5IH0pIHtcbiAgICAgICAgdGhpcy5yZWZlcmVuY2VzID0gbnVsbDtcbiAgICAgICAgdGhpcy5zbG90cyA9IG51bGw7XG4gICAgICAgIHRoaXMucmVmZXJlbmNlVHlwZXMgPSBudWxsO1xuICAgICAgICB0aGlzLnByb3BlcnR5TWV0YWRhdGEgPSBudWxsO1xuICAgICAgICB0aGlzLm9iamVjdCA9IG9iamVjdDtcbiAgICAgICAgdGhpcy5Sb290UmVmZXJlbmNlRmFjdG9yeSA9IFJvb3RSZWZlcmVuY2VGYWN0b3J5IHx8IFJvb3RSZWZlcmVuY2U7XG4gICAgICAgIHRoaXMuRGVmYXVsdFBhdGhSZWZlcmVuY2VGYWN0b3J5ID0gRGVmYXVsdFBhdGhSZWZlcmVuY2VGYWN0b3J5IHx8IFByb3BlcnR5UmVmZXJlbmNlO1xuICAgIH1cbiAgICBzdGF0aWMgZm9yKG9iaikge1xuICAgICAgICBpZiAob2JqID09PSBudWxsIHx8IG9iaiA9PT0gdW5kZWZpbmVkKSByZXR1cm4gbmV3IE1ldGEob2JqLCB7fSk7XG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgJ19tZXRhJykgJiYgb2JqLl9tZXRhKSByZXR1cm4gb2JqLl9tZXRhO1xuICAgICAgICBpZiAoIU9iamVjdC5pc0V4dGVuc2libGUob2JqKSkgcmV0dXJuIG5ldyBDb25zdE1ldGEob2JqKTtcbiAgICAgICAgbGV0IE1ldGFUb1VzZSA9IE1ldGE7XG4gICAgICAgIGlmIChvYmouY29uc3RydWN0b3IgJiYgb2JqLmNvbnN0cnVjdG9yW0NMQVNTX01FVEFdKSB7XG4gICAgICAgICAgICBsZXQgY2xhc3NNZXRhID0gb2JqLmNvbnN0cnVjdG9yW0NMQVNTX01FVEFdO1xuICAgICAgICAgICAgTWV0YVRvVXNlID0gY2xhc3NNZXRhLkluc3RhbmNlTWV0YUNvbnN0cnVjdG9yO1xuICAgICAgICB9IGVsc2UgaWYgKG9ialtDTEFTU19NRVRBXSkge1xuICAgICAgICAgICAgTWV0YVRvVXNlID0gb2JqW0NMQVNTX01FVEFdLkluc3RhbmNlTWV0YUNvbnN0cnVjdG9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmouX21ldGEgPSBuZXcgTWV0YVRvVXNlKG9iaiwge30pO1xuICAgIH1cbiAgICBzdGF0aWMgZXhpc3RzKG9iaikge1xuICAgICAgICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgb2JqLl9tZXRhO1xuICAgIH1cbiAgICBzdGF0aWMgbWV0YWRhdGFGb3JQcm9wZXJ0eShfa2V5KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBhZGRSZWZlcmVuY2UocHJvcGVydHksIHJlZmVyZW5jZSkge1xuICAgICAgICBsZXQgcmVmcyA9IHRoaXMucmVmZXJlbmNlcyA9IHRoaXMucmVmZXJlbmNlcyB8fCBkaWN0KCk7XG4gICAgICAgIGxldCBzZXQgPSByZWZzW3Byb3BlcnR5XSA9IHJlZnNbcHJvcGVydHldIHx8IG5ldyBEaWN0U2V0KCk7XG4gICAgICAgIHNldC5hZGQocmVmZXJlbmNlKTtcbiAgICB9XG4gICAgYWRkUmVmZXJlbmNlVHlwZUZvcihwcm9wZXJ0eSwgdHlwZSkge1xuICAgICAgICB0aGlzLnJlZmVyZW5jZVR5cGVzID0gdGhpcy5yZWZlcmVuY2VUeXBlcyB8fCBkaWN0KCk7XG4gICAgICAgIHRoaXMucmVmZXJlbmNlVHlwZXNbcHJvcGVydHldID0gdHlwZTtcbiAgICB9XG4gICAgcmVmZXJlbmNlVHlwZUZvcihwcm9wZXJ0eSkge1xuICAgICAgICBpZiAoIXRoaXMucmVmZXJlbmNlVHlwZXMpIHJldHVybiBQcm9wZXJ0eVJlZmVyZW5jZTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVmZXJlbmNlVHlwZXNbcHJvcGVydHldIHx8IFByb3BlcnR5UmVmZXJlbmNlO1xuICAgIH1cbiAgICByZW1vdmVSZWZlcmVuY2UocHJvcGVydHksIHJlZmVyZW5jZSkge1xuICAgICAgICBpZiAoIXRoaXMucmVmZXJlbmNlcykgcmV0dXJuO1xuICAgICAgICBsZXQgc2V0ID0gdGhpcy5yZWZlcmVuY2VzW3Byb3BlcnR5XTtcbiAgICAgICAgc2V0LmRlbGV0ZShyZWZlcmVuY2UpO1xuICAgIH1cbiAgICBnZXRSZWZlcmVuY2VUeXBlcygpIHtcbiAgICAgICAgdGhpcy5yZWZlcmVuY2VUeXBlcyA9IHRoaXMucmVmZXJlbmNlVHlwZXMgfHwgZGljdCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5yZWZlcmVuY2VUeXBlcztcbiAgICB9XG4gICAgcmVmZXJlbmNlc0Zvcihwcm9wZXJ0eSkge1xuICAgICAgICBpZiAoIXRoaXMucmVmZXJlbmNlcykgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiB0aGlzLnJlZmVyZW5jZXNbcHJvcGVydHldO1xuICAgIH1cbiAgICBnZXRTbG90cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2xvdHMgPSB0aGlzLnNsb3RzIHx8IGRpY3QoKTtcbiAgICB9XG4gICAgcm9vdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm9vdENhY2hlID0gdGhpcy5yb290Q2FjaGUgfHwgbmV3IHRoaXMuUm9vdFJlZmVyZW5jZUZhY3RvcnkodGhpcy5vYmplY3QpO1xuICAgIH1cbn1cbmV4cG9ydCBkZWZhdWx0IE1ldGE7XG5leHBvcnQgZnVuY3Rpb24gbWV0YUZvcihvYmopIHtcbiAgICByZXR1cm4gTWV0YS5mb3Iob2JqKTtcbn0iXX0=