UNPKG

ember-app-scheduler

Version:

Ember addon to schedule work at different phases of app life cycle.

139 lines (131 loc) 14.8 kB
'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 }; } const NOOP_DESTROY = { destroy() {} }; class ConstPath { constructor(parent, _property) { this.tag = _reference.VOLATILE_TAG; this.parent = parent; } chain() { return NOOP_DESTROY; } notify() {} value() { return this.parent[this.property]; } get(prop) { return new ConstPath(this.parent[this.property], prop); } } class ConstRoot { constructor(value) { this.tag = _reference.VOLATILE_TAG; this.inner = value; } update(inner) { this.inner = inner; } chain() { return NOOP_DESTROY; } notify() {} value() { return this.inner; } referenceFromParts(_parts) { throw new Error("Not implemented"); } chainFor(_prop) { throw new Error("Not implemented"); } get(prop) { return new ConstPath(this.inner, prop); } } class ConstMeta /*implements IMeta*/ { constructor(object) { this.object = object; } root() { return new ConstRoot(this.object); } } const CLASS_META = exports.CLASS_META = "df8be4c8-4e89-44e2-a8f9-550c8dacdca7"; const hasOwnProperty = Object.hasOwnProperty; class Meta { constructor(object, { RootReferenceFactory, DefaultPathReferenceFactory }) { 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; } static 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); let MetaToUse = Meta; if (obj.constructor && obj.constructor[CLASS_META]) { let classMeta = obj.constructor[CLASS_META]; MetaToUse = classMeta.InstanceMetaConstructor; } else if (obj[CLASS_META]) { MetaToUse = obj[CLASS_META].InstanceMetaConstructor; } return obj._meta = new MetaToUse(obj, {}); } static exists(obj) { return typeof obj === 'object' && obj._meta; } static metadataForProperty(_key) { return null; } addReference(property, reference) { let refs = this.references = this.references || (0, _util.dict)(); let set = refs[property] = refs[property] || new _util.DictSet(); set.add(reference); } addReferenceTypeFor(property, type) { this.referenceTypes = this.referenceTypes || (0, _util.dict)(); this.referenceTypes[property] = type; } referenceTypeFor(property) { if (!this.referenceTypes) return _descriptors.PropertyReference; return this.referenceTypes[property] || _descriptors.PropertyReference; } removeReference(property, reference) { if (!this.references) return; let set = this.references[property]; set.delete(reference); } getReferenceTypes() { this.referenceTypes = this.referenceTypes || (0, _util.dict)(); return this.referenceTypes; } referencesFor(property) { if (!this.references) return null; return this.references[property]; } getSlots() { return this.slots = this.slots || (0, _util.dict)(); } root() { return this.rootCache = this.rootCache || new this.RootReferenceFactory(this.object); } } exports.default = Meta; function metaFor(obj) { return Meta.for(obj); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9tZXRhLmpzIl0sIm5hbWVzIjpbIm1ldGFGb3IiLCJOT09QX0RFU1RST1kiLCJkZXN0cm95IiwiQ29uc3RQYXRoIiwiY29uc3RydWN0b3IiLCJwYXJlbnQiLCJfcHJvcGVydHkiLCJ0YWciLCJjaGFpbiIsIm5vdGlmeSIsInZhbHVlIiwicHJvcGVydHkiLCJnZXQiLCJwcm9wIiwiQ29uc3RSb290IiwiaW5uZXIiLCJ1cGRhdGUiLCJyZWZlcmVuY2VGcm9tUGFydHMiLCJfcGFydHMiLCJFcnJvciIsImNoYWluRm9yIiwiX3Byb3AiLCJDb25zdE1ldGEiLCJvYmplY3QiLCJyb290IiwiQ0xBU1NfTUVUQSIsImhhc093blByb3BlcnR5IiwiT2JqZWN0IiwiTWV0YSIsIlJvb3RSZWZlcmVuY2VGYWN0b3J5IiwiRGVmYXVsdFBhdGhSZWZlcmVuY2VGYWN0b3J5IiwicmVmZXJlbmNlcyIsInNsb3RzIiwicmVmZXJlbmNlVHlwZXMiLCJwcm9wZXJ0eU1ldGFkYXRhIiwiZm9yIiwib2JqIiwidW5kZWZpbmVkIiwiY2FsbCIsIl9tZXRhIiwiaXNFeHRlbnNpYmxlIiwiTWV0YVRvVXNlIiwiY2xhc3NNZXRhIiwiSW5zdGFuY2VNZXRhQ29uc3RydWN0b3IiLCJleGlzdHMiLCJtZXRhZGF0YUZvclByb3BlcnR5IiwiX2tleSIsImFkZFJlZmVyZW5jZSIsInJlZmVyZW5jZSIsInJlZnMiLCJzZXQiLCJhZGQiLCJhZGRSZWZlcmVuY2VUeXBlRm9yIiwidHlwZSIsInJlZmVyZW5jZVR5cGVGb3IiLCJyZW1vdmVSZWZlcmVuY2UiLCJkZWxldGUiLCJnZXRSZWZlcmVuY2VUeXBlcyIsInJlZmVyZW5jZXNGb3IiLCJnZXRTbG90cyIsInJvb3RDYWNoZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O1FBdUhnQkEsTyxHQUFBQSxPOztBQXZIaEI7O0FBQ0E7Ozs7QUFDQTs7QUFDQTs7OztBQUNBLE1BQU1DLGVBQWUsRUFBRUMsVUFBVSxDQUFFLENBQWQsRUFBckI7QUFDQSxNQUFNQyxT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SUFBdUIsaUJBQTdDO0FBQ0EsZUFBTyxLQUFLQSxjQUFaO0FBQ0g7QUFDRHlCLGtCQUFjL0MsUUFBZCxFQUF3QjtBQUNwQixZQUFJLENBQUMsS0FBS29CLFVBQVYsRUFBc0IsT0FBTyxJQUFQO0FBQ3RCLGVBQU8sS0FBS0EsVUFBTCxDQUFnQnBCLFFBQWhCLENBQVA7QUFDSDtBQUNEZ0QsZUFBVztBQUNQLGVBQU8sS0FBSzNCLEtBQUwsR0FBYSxLQUFLQSxLQUFMLElBQWMsaUJBQWxDO0FBQ0g7QUFDRFIsV0FBTztBQUNILGVBQU8sS0FBS29DLFNBQUwsR0FBaUIsS0FBS0EsU0FBTCxJQUFrQixJQUFJLEtBQUsvQixvQkFBVCxDQUE4QixLQUFLTixNQUFuQyxDQUExQztBQUNIO0FBNURNO2tCQThESUssSTtBQUNSLFNBQVM1QixPQUFULENBQWlCb0MsR0FBakIsRUFBc0I7QUFDekIsV0FBT1IsS0FBS08sR0FBTCxDQUFTQyxHQUFULENBQVA7QUFDSCIsImZpbGUiOiJsaWIvbWV0YS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFByb3BlcnR5UmVmZXJlbmNlIH0gZnJvbSAnLi9yZWZlcmVuY2VzL2Rlc2NyaXB0b3JzJztcbmltcG9ydCBSb290UmVmZXJlbmNlIGZyb20gJy4vcmVmZXJlbmNlcy9yb290JztcbmltcG9ydCB7IERpY3RTZXQsIGRpY3QgfSBmcm9tICdAZ2xpbW1lci91dGlsJztcbmltcG9ydCB7IFZPTEFUSUxFX1RBRyB9IGZyb20gJ0BnbGltbWVyL3JlZmVyZW5jZSc7XG5jb25zdCBOT09QX0RFU1RST1kgPSB7IGRlc3Ryb3koKSB7fSB9O1xuY2xhc3MgQ29uc3RQYXRoIHtcbiAgICBjb25zdHJ1Y3RvcihwYXJlbnQsIF9wcm9wZXJ0eSkge1xuICAgICAgICB0aGlzLnRhZyA9IFZPTEFUSUxFX1RBRztcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgfVxuICAgIGNoYWluKCkge1xuICAgICAgICByZXR1cm4gTk9PUF9ERVNUUk9ZO1xuICAgIH1cbiAgICBub3RpZnkoKSB7fVxuICAgIHZhbHVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnRbdGhpcy5wcm9wZXJ0eV07XG4gICAgfVxuICAgIGdldChwcm9wKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29uc3RQYXRoKHRoaXMucGFyZW50W3RoaXMucHJvcGVydHldLCBwcm9wKTtcbiAgICB9XG59XG5jbGFzcyBDb25zdFJvb3Qge1xuICAgIGNvbnN0cnVjdG9yKHZhbHVlKSB7XG4gICAgICAgIHRoaXMudGFnID0gVk9MQVRJTEVfVEFHO1xuICAgICAgICB0aGlzLmlubmVyID0gdmFsdWU7XG4gICAgfVxuICAgIHVwZGF0ZShpbm5lcikge1xuICAgICAgICB0aGlzLmlubmVyID0gaW5uZXI7XG4gICAgfVxuICAgIGNoYWluKCkge1xuICAgICAgICByZXR1cm4gTk9PUF9ERVNUUk9ZO1xuICAgIH1cbiAgICBub3RpZnkoKSB7fVxuICAgIHZhbHVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbm5lcjtcbiAgICB9XG4gICAgcmVmZXJlbmNlRnJvbVBhcnRzKF9wYXJ0cykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWRcIik7XG4gICAgfVxuICAgIGNoYWluRm9yKF9wcm9wKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgICB9XG4gICAgZ2V0KHByb3ApIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb25zdFBhdGgodGhpcy5pbm5lciwgcHJvcCk7XG4gICAgfVxufVxuY2xhc3MgQ29uc3RNZXRhIC8qaW1wbGVtZW50cyBJTWV0YSovIHtcbiAgICBjb25zdHJ1Y3RvcihvYmplY3QpIHtcbiAgICAgICAgdGhpcy5vYmplY3QgPSBvYmplY3Q7XG4gICAgfVxuICAgIHJvb3QoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29uc3RSb290KHRoaXMub2JqZWN0KTtcbiAgICB9XG59XG5leHBvcnQgY29uc3QgQ0xBU1NfTUVUQSA9IFwiZGY4YmU0YzgtNGU4OS00NGUyLWE4ZjktNTUwYzhkYWNkY2E3XCI7XG5jb25zdCBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5oYXNPd25Qcm9wZXJ0eTtcbmNsYXNzIE1ldGEge1xuICAgIGNvbnN0cnVjdG9yKG9iamVjdCwgeyBSb290UmVmZXJlbmNlRmFjdG9yeSwgRGVmYXVsdFBhdGhSZWZlcmVuY2VGYWN0b3J5IH0pIHtcbiAgICAgICAgdGhpcy5yZWZlcmVuY2VzID0gbnVsbDtcbiAgICAgICAgdGhpcy5zbG90cyA9IG51bGw7XG4gICAgICAgIHRoaXMucmVmZXJlbmNlVHlwZXMgPSBudWxsO1xuICAgICAgICB0aGlzLnByb3BlcnR5TWV0YWRhdGEgPSBudWxsO1xuICAgICAgICB0aGlzLm9iamVjdCA9IG9iamVjdDtcbiAgICAgICAgdGhpcy5Sb290UmVmZXJlbmNlRmFjdG9yeSA9IFJvb3RSZWZlcmVuY2VGYWN0b3J5IHx8IFJvb3RSZWZlcmVuY2U7XG4gICAgICAgIHRoaXMuRGVmYXVsdFBhdGhSZWZlcmVuY2VGYWN0b3J5ID0gRGVmYXVsdFBhdGhSZWZlcmVuY2VGYWN0b3J5IHx8IFByb3BlcnR5UmVmZXJlbmNlO1xuICAgIH1cbiAgICBzdGF0aWMgZm9yKG9iaikge1xuICAgICAgICBpZiAob2JqID09PSBudWxsIHx8IG9iaiA9PT0gdW5kZWZpbmVkKSByZXR1cm4gbmV3IE1ldGEob2JqLCB7fSk7XG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgJ19tZXRhJykgJiYgb2JqLl9tZXRhKSByZXR1cm4gb2JqLl9tZXRhO1xuICAgICAgICBpZiAoIU9iamVjdC5pc0V4dGVuc2libGUob2JqKSkgcmV0dXJuIG5ldyBDb25zdE1ldGEob2JqKTtcbiAgICAgICAgbGV0IE1ldGFUb1VzZSA9IE1ldGE7XG4gICAgICAgIGlmIChvYmouY29uc3RydWN0b3IgJiYgb2JqLmNvbnN0cnVjdG9yW0NMQVNTX01FVEFdKSB7XG4gICAgICAgICAgICBsZXQgY2xhc3NNZXRhID0gb2JqLmNvbnN0cnVjdG9yW0NMQVNTX01FVEFdO1xuICAgICAgICAgICAgTWV0YVRvVXNlID0gY2xhc3NNZXRhLkluc3RhbmNlTWV0YUNvbnN0cnVjdG9yO1xuICAgICAgICB9IGVsc2UgaWYgKG9ialtDTEFTU19NRVRBXSkge1xuICAgICAgICAgICAgTWV0YVRvVXNlID0gb2JqW0NMQVNTX01FVEFdLkluc3RhbmNlTWV0YUNvbnN0cnVjdG9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmouX21ldGEgPSBuZXcgTWV0YVRvVXNlKG9iaiwge30pO1xuICAgIH1cbiAgICBzdGF0aWMgZXhpc3RzKG9iaikge1xuICAgICAgICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgb2JqLl9tZXRhO1xuICAgIH1cbiAgICBzdGF0aWMgbWV0YWRhdGFGb3JQcm9wZXJ0eShfa2V5KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBhZGRSZWZlcmVuY2UocHJvcGVydHksIHJlZmVyZW5jZSkge1xuICAgICAgICBsZXQgcmVmcyA9IHRoaXMucmVmZXJlbmNlcyA9IHRoaXMucmVmZXJlbmNlcyB8fCBkaWN0KCk7XG4gICAgICAgIGxldCBzZXQgPSByZWZzW3Byb3BlcnR5XSA9IHJlZnNbcHJvcGVydHldIHx8IG5ldyBEaWN0U2V0KCk7XG4gICAgICAgIHNldC5hZGQocmVmZXJlbmNlKTtcbiAgICB9XG4gICAgYWRkUmVmZXJlbmNlVHlwZUZvcihwcm9wZXJ0eSwgdHlwZSkge1xuICAgICAgICB0aGlzLnJlZmVyZW5jZVR5cGVzID0gdGhpcy5yZWZlcmVuY2VUeXBlcyB8fCBkaWN0KCk7XG4gICAgICAgIHRoaXMucmVmZXJlbmNlVHlwZXNbcHJvcGVydHldID0gdHlwZTtcbiAgICB9XG4gICAgcmVmZXJlbmNlVHlwZUZvcihwcm9wZXJ0eSkge1xuICAgICAgICBpZiAoIXRoaXMucmVmZXJlbmNlVHlwZXMpIHJldHVybiBQcm9wZXJ0eVJlZmVyZW5jZTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVmZXJlbmNlVHlwZXNbcHJvcGVydHldIHx8IFByb3BlcnR5UmVmZXJlbmNlO1xuICAgIH1cbiAgICByZW1vdmVSZWZlcmVuY2UocHJvcGVydHksIHJlZmVyZW5jZSkge1xuICAgICAgICBpZiAoIXRoaXMucmVmZXJlbmNlcykgcmV0dXJuO1xuICAgICAgICBsZXQgc2V0ID0gdGhpcy5yZWZlcmVuY2VzW3Byb3BlcnR5XTtcbiAgICAgICAgc2V0LmRlbGV0ZShyZWZlcmVuY2UpO1xuICAgIH1cbiAgICBnZXRSZWZlcmVuY2VUeXBlcygpIHtcbiAgICAgICAgdGhpcy5yZWZlcmVuY2VUeXBlcyA9IHRoaXMucmVmZXJlbmNlVHlwZXMgfHwgZGljdCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5yZWZlcmVuY2VUeXBlcztcbiAgICB9XG4gICAgcmVmZXJlbmNlc0Zvcihwcm9wZXJ0eSkge1xuICAgICAgICBpZiAoIXRoaXMucmVmZXJlbmNlcykgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiB0aGlzLnJlZmVyZW5jZXNbcHJvcGVydHldO1xuICAgIH1cbiAgICBnZXRTbG90cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2xvdHMgPSB0aGlzLnNsb3RzIHx8IGRpY3QoKTtcbiAgICB9XG4gICAgcm9vdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm9vdENhY2hlID0gdGhpcy5yb290Q2FjaGUgfHwgbmV3IHRoaXMuUm9vdFJlZmVyZW5jZUZhY3RvcnkodGhpcy5vYmplY3QpO1xuICAgIH1cbn1cbmV4cG9ydCBkZWZhdWx0IE1ldGE7XG5leHBvcnQgZnVuY3Rpb24gbWV0YUZvcihvYmopIHtcbiAgICByZXR1cm4gTWV0YS5mb3Iob2JqKTtcbn0iXX0=