ember-legacy-class-transform
Version:
The default blueprint for ember-cli addons.
722 lines (587 loc) • 22.1 kB
JavaScript
define('@glimmer/reference', ['exports', '@glimmer/util'], function (exports, _glimmer_util) { 'use strict';
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 _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); }
function _classCallCheck$1(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var CONSTANT = 0;
var INITIAL = 1;
var VOLATILE = NaN;
var RevisionTag = function () {
function RevisionTag() {
_classCallCheck$1(this, RevisionTag);
}
RevisionTag.prototype.validate = function validate(snapshot) {
return this.value() === snapshot;
};
return RevisionTag;
}();
RevisionTag.id = 0;
var VALUE = [];
var VALIDATE = [];
var TagWrapper = function () {
function TagWrapper(type, inner) {
_classCallCheck$1(this, TagWrapper);
this.type = type;
this.inner = inner;
}
TagWrapper.prototype.value = function value() {
var func = VALUE[this.type];
return func(this.inner);
};
TagWrapper.prototype.validate = function validate(snapshot) {
var func = VALIDATE[this.type];
return func(this.inner, snapshot);
};
return TagWrapper;
}();
function register(Type) {
var type = VALUE.length;
VALUE.push(function (tag) {
return tag.value();
});
VALIDATE.push(function (tag, snapshot) {
return tag.validate(snapshot);
});
Type.id = type;
}
///
// CONSTANT: 0
VALUE.push(function () {
return CONSTANT;
});
VALIDATE.push(function (_tag, snapshot) {
return snapshot === CONSTANT;
});
var CONSTANT_TAG = new TagWrapper(0, null);
// VOLATILE: 1
VALUE.push(function () {
return VOLATILE;
});
VALIDATE.push(function (_tag, snapshot) {
return snapshot === VOLATILE;
});
var VOLATILE_TAG = new TagWrapper(1, null);
// CURRENT: 2
VALUE.push(function () {
return $REVISION;
});
VALIDATE.push(function (_tag, snapshot) {
return snapshot === $REVISION;
});
var CURRENT_TAG = new TagWrapper(2, null);
///
var $REVISION = INITIAL;
var DirtyableTag = function (_RevisionTag) {
_inherits(DirtyableTag, _RevisionTag);
DirtyableTag.create = function create() {
var revision = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : $REVISION;
return new TagWrapper(this.id, new DirtyableTag(revision));
};
function DirtyableTag() {
var revision = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : $REVISION;
_classCallCheck$1(this, DirtyableTag);
var _this = _possibleConstructorReturn(this, _RevisionTag.call(this));
_this.revision = revision;
return _this;
}
DirtyableTag.prototype.value = function value() {
return this.revision;
};
DirtyableTag.prototype.dirty = function dirty() {
this.revision = ++$REVISION;
};
return DirtyableTag;
}(RevisionTag);
register(DirtyableTag);
function combineTagged(tagged) {
var optimized = [];
for (var i = 0, l = tagged.length; i < l; i++) {
var tag = tagged[i].tag;
if (tag === VOLATILE_TAG) return VOLATILE_TAG;
if (tag === CONSTANT_TAG) continue;
optimized.push(tag);
}
return _combine(optimized);
}
function combineSlice(slice) {
var optimized = [];
var node = slice.head();
while (node !== null) {
var tag = node.tag;
if (tag === VOLATILE_TAG) return VOLATILE_TAG;
if (tag !== CONSTANT_TAG) optimized.push(tag);
node = slice.nextNode(node);
}
return _combine(optimized);
}
function combine(tags) {
var optimized = [];
for (var i = 0, l = tags.length; i < l; i++) {
var tag = tags[i];
if (tag === VOLATILE_TAG) return VOLATILE_TAG;
if (tag === CONSTANT_TAG) continue;
optimized.push(tag);
}
return _combine(optimized);
}
function _combine(tags) {
switch (tags.length) {
case 0:
return CONSTANT_TAG;
case 1:
return tags[0];
case 2:
return TagsPair.create(tags[0], tags[1]);
default:
return TagsCombinator.create(tags);
}
}
var CachedTag = function (_RevisionTag2) {
_inherits(CachedTag, _RevisionTag2);
function CachedTag() {
_classCallCheck$1(this, CachedTag);
var _this2 = _possibleConstructorReturn(this, _RevisionTag2.apply(this, arguments));
_this2.lastChecked = null;
_this2.lastValue = null;
return _this2;
}
CachedTag.prototype.value = function value() {
var lastChecked = this.lastChecked,
lastValue = this.lastValue;
if (lastChecked !== $REVISION) {
this.lastChecked = $REVISION;
this.lastValue = lastValue = this.compute();
}
return this.lastValue;
};
CachedTag.prototype.invalidate = function invalidate() {
this.lastChecked = null;
};
return CachedTag;
}(RevisionTag);
var TagsPair = function (_CachedTag) {
_inherits(TagsPair, _CachedTag);
TagsPair.create = function create(first, second) {
return new TagWrapper(this.id, new TagsPair(first, second));
};
function TagsPair(first, second) {
_classCallCheck$1(this, TagsPair);
var _this3 = _possibleConstructorReturn(this, _CachedTag.call(this));
_this3.first = first;
_this3.second = second;
return _this3;
}
TagsPair.prototype.compute = function compute() {
return Math.max(this.first.value(), this.second.value());
};
return TagsPair;
}(CachedTag);
register(TagsPair);
var TagsCombinator = function (_CachedTag2) {
_inherits(TagsCombinator, _CachedTag2);
TagsCombinator.create = function create(tags) {
return new TagWrapper(this.id, new TagsCombinator(tags));
};
function TagsCombinator(tags) {
_classCallCheck$1(this, TagsCombinator);
var _this4 = _possibleConstructorReturn(this, _CachedTag2.call(this));
_this4.tags = tags;
return _this4;
}
TagsCombinator.prototype.compute = function compute() {
var tags = this.tags;
var max = -1;
for (var i = 0; i < tags.length; i++) {
var value = tags[i].value();
max = Math.max(value, max);
}
return max;
};
return TagsCombinator;
}(CachedTag);
register(TagsCombinator);
var UpdatableTag = function (_CachedTag3) {
_inherits(UpdatableTag, _CachedTag3);
UpdatableTag.create = function create(tag) {
return new TagWrapper(this.id, new UpdatableTag(tag));
};
function UpdatableTag(tag) {
_classCallCheck$1(this, UpdatableTag);
var _this5 = _possibleConstructorReturn(this, _CachedTag3.call(this));
_this5.tag = tag;
_this5.lastUpdated = INITIAL;
return _this5;
}
UpdatableTag.prototype.compute = function compute() {
return Math.max(this.lastUpdated, this.tag.value());
};
UpdatableTag.prototype.update = function update(tag) {
if (tag !== this.tag) {
this.tag = tag;
this.lastUpdated = $REVISION;
this.invalidate();
}
};
return UpdatableTag;
}(CachedTag);
register(UpdatableTag);
var CachedReference = function () {
function CachedReference() {
_classCallCheck$1(this, CachedReference);
this.lastRevision = null;
this.lastValue = null;
}
CachedReference.prototype.value = function value() {
var tag = this.tag,
lastRevision = this.lastRevision,
lastValue = this.lastValue;
if (!lastRevision || !tag.validate(lastRevision)) {
lastValue = this.lastValue = this.compute();
this.lastRevision = tag.value();
}
return lastValue;
};
CachedReference.prototype.invalidate = function invalidate() {
this.lastRevision = null;
};
return CachedReference;
}();
var MapperReference = function (_CachedReference) {
_inherits(MapperReference, _CachedReference);
function MapperReference(reference, mapper) {
_classCallCheck$1(this, MapperReference);
var _this6 = _possibleConstructorReturn(this, _CachedReference.call(this));
_this6.tag = reference.tag;
_this6.reference = reference;
_this6.mapper = mapper;
return _this6;
}
MapperReference.prototype.compute = function compute() {
var reference = this.reference,
mapper = this.mapper;
return mapper(reference.value());
};
return MapperReference;
}(CachedReference);
function map(reference, mapper) {
return new MapperReference(reference, mapper);
}
//////////
var ReferenceCache = function () {
function ReferenceCache(reference) {
_classCallCheck$1(this, ReferenceCache);
this.lastValue = null;
this.lastRevision = null;
this.initialized = false;
this.tag = reference.tag;
this.reference = reference;
}
ReferenceCache.prototype.peek = function peek() {
if (!this.initialized) {
return this.initialize();
}
return this.lastValue;
};
ReferenceCache.prototype.revalidate = function revalidate() {
if (!this.initialized) {
return this.initialize();
}
var reference = this.reference,
lastRevision = this.lastRevision;
var tag = reference.tag;
if (tag.validate(lastRevision)) return NOT_MODIFIED;
this.lastRevision = tag.value();
var lastValue = this.lastValue;
var value = reference.value();
if (value === lastValue) return NOT_MODIFIED;
this.lastValue = value;
return value;
};
ReferenceCache.prototype.initialize = function initialize() {
var reference = this.reference;
var value = this.lastValue = reference.value();
this.lastRevision = reference.tag.value();
this.initialized = true;
return value;
};
return ReferenceCache;
}();
var NOT_MODIFIED = "adb3b78e-3d22-4e4b-877a-6317c2c5c145";
function isModified(value) {
return value !== NOT_MODIFIED;
}
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var ConstReference = function () {
function ConstReference(inner) {
_classCallCheck(this, ConstReference);
this.inner = inner;
this.tag = CONSTANT_TAG;
}
ConstReference.prototype.value = function value() {
return this.inner;
};
return ConstReference;
}();
function isConst(reference) {
return reference.tag === CONSTANT_TAG;
}
function _defaults$1(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$2(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn$1(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$1(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$1(subClass, superClass); }
var ListItem = function (_ListNode) {
_inherits$1(ListItem, _ListNode);
function ListItem(iterable, result) {
_classCallCheck$2(this, ListItem);
var _this = _possibleConstructorReturn$1(this, _ListNode.call(this, iterable.valueReferenceFor(result)));
_this.retained = false;
_this.seen = false;
_this.key = result.key;
_this.iterable = iterable;
_this.memo = iterable.memoReferenceFor(result);
return _this;
}
ListItem.prototype.update = function update(item) {
this.retained = true;
this.iterable.updateValueReference(this.value, item);
this.iterable.updateMemoReference(this.memo, item);
};
ListItem.prototype.shouldRemove = function shouldRemove() {
return !this.retained;
};
ListItem.prototype.reset = function reset() {
this.retained = false;
this.seen = false;
};
return ListItem;
}(_glimmer_util.ListNode);
var IterationArtifacts = function () {
function IterationArtifacts(iterable) {
_classCallCheck$2(this, IterationArtifacts);
this.map = _glimmer_util.dict();
this.list = new _glimmer_util.LinkedList();
this.tag = iterable.tag;
this.iterable = iterable;
}
IterationArtifacts.prototype.isEmpty = function isEmpty() {
var iterator = this.iterator = this.iterable.iterate();
return iterator.isEmpty();
};
IterationArtifacts.prototype.iterate = function iterate() {
var iterator = this.iterator || this.iterable.iterate();
this.iterator = null;
return iterator;
};
IterationArtifacts.prototype.has = function has(key) {
return !!this.map[key];
};
IterationArtifacts.prototype.get = function get(key) {
return this.map[key];
};
IterationArtifacts.prototype.wasSeen = function wasSeen(key) {
var node = this.map[key];
return node && node.seen;
};
IterationArtifacts.prototype.append = function append(item) {
var map = this.map,
list = this.list,
iterable = this.iterable;
var node = map[item.key] = new ListItem(iterable, item);
list.append(node);
return node;
};
IterationArtifacts.prototype.insertBefore = function insertBefore(item, reference) {
var map = this.map,
list = this.list,
iterable = this.iterable;
var node = map[item.key] = new ListItem(iterable, item);
node.retained = true;
list.insertBefore(node, reference);
return node;
};
IterationArtifacts.prototype.move = function move(item, reference) {
var list = this.list;
item.retained = true;
list.remove(item);
list.insertBefore(item, reference);
};
IterationArtifacts.prototype.remove = function remove(item) {
var list = this.list;
list.remove(item);
delete this.map[item.key];
};
IterationArtifacts.prototype.nextNode = function nextNode(item) {
return this.list.nextNode(item);
};
IterationArtifacts.prototype.head = function head() {
return this.list.head();
};
return IterationArtifacts;
}();
var ReferenceIterator = function () {
// if anyone needs to construct this object with something other than
// an iterable, let @wycats know.
function ReferenceIterator(iterable) {
_classCallCheck$2(this, ReferenceIterator);
this.iterator = null;
var artifacts = new IterationArtifacts(iterable);
this.artifacts = artifacts;
}
ReferenceIterator.prototype.next = function next() {
var artifacts = this.artifacts;
var iterator = this.iterator = this.iterator || artifacts.iterate();
var item = iterator.next();
if (!item) return null;
return artifacts.append(item);
};
return ReferenceIterator;
}();
var Phase;
(function (Phase) {
Phase[Phase["Append"] = 0] = "Append";
Phase[Phase["Prune"] = 1] = "Prune";
Phase[Phase["Done"] = 2] = "Done";
})(Phase || (Phase = {}));
var IteratorSynchronizer = function () {
function IteratorSynchronizer(_ref) {
var target = _ref.target,
artifacts = _ref.artifacts;
_classCallCheck$2(this, IteratorSynchronizer);
this.target = target;
this.artifacts = artifacts;
this.iterator = artifacts.iterate();
this.current = artifacts.head();
}
IteratorSynchronizer.prototype.sync = function sync() {
var phase = Phase.Append;
while (true) {
switch (phase) {
case Phase.Append:
phase = this.nextAppend();
break;
case Phase.Prune:
phase = this.nextPrune();
break;
case Phase.Done:
this.nextDone();
return;
}
}
};
IteratorSynchronizer.prototype.advanceToKey = function advanceToKey(key) {
var current = this.current,
artifacts = this.artifacts;
var seek = current;
while (seek && seek.key !== key) {
seek.seen = true;
seek = artifacts.nextNode(seek);
}
this.current = seek && artifacts.nextNode(seek);
};
IteratorSynchronizer.prototype.nextAppend = function nextAppend() {
var iterator = this.iterator,
current = this.current,
artifacts = this.artifacts;
var item = iterator.next();
if (item === null) {
return this.startPrune();
}
var key = item.key;
if (current && current.key === key) {
this.nextRetain(item);
} else if (artifacts.has(key)) {
this.nextMove(item);
} else {
this.nextInsert(item);
}
return Phase.Append;
};
IteratorSynchronizer.prototype.nextRetain = function nextRetain(item) {
var artifacts = this.artifacts,
current = this.current;
current = current;
current.update(item);
this.current = artifacts.nextNode(current);
this.target.retain(item.key, current.value, current.memo);
};
IteratorSynchronizer.prototype.nextMove = function nextMove(item) {
var current = this.current,
artifacts = this.artifacts,
target = this.target;
var key = item.key;
var found = artifacts.get(item.key);
found.update(item);
if (artifacts.wasSeen(item.key)) {
artifacts.move(found, current);
target.move(found.key, found.value, found.memo, current ? current.key : null);
} else {
this.advanceToKey(key);
}
};
IteratorSynchronizer.prototype.nextInsert = function nextInsert(item) {
var artifacts = this.artifacts,
target = this.target,
current = this.current;
var node = artifacts.insertBefore(item, current);
target.insert(node.key, node.value, node.memo, current ? current.key : null);
};
IteratorSynchronizer.prototype.startPrune = function startPrune() {
this.current = this.artifacts.head();
return Phase.Prune;
};
IteratorSynchronizer.prototype.nextPrune = function nextPrune() {
var artifacts = this.artifacts,
target = this.target,
current = this.current;
if (current === null) {
return Phase.Done;
}
var node = current;
this.current = artifacts.nextNode(node);
if (node.shouldRemove()) {
artifacts.remove(node);
target.delete(node.key);
} else {
node.reset();
}
return Phase.Prune;
};
IteratorSynchronizer.prototype.nextDone = function nextDone() {
this.target.done();
};
return IteratorSynchronizer;
}();
function referenceFromParts(root, parts) {
var reference = root;
for (var i = 0; i < parts.length; i++) {
reference = reference.get(parts[i]);
}
return reference;
}
exports.ConstReference = ConstReference;
exports.isConst = isConst;
exports.ListItem = ListItem;
exports.referenceFromParts = referenceFromParts;
exports.IterationArtifacts = IterationArtifacts;
exports.ReferenceIterator = ReferenceIterator;
exports.IteratorSynchronizer = IteratorSynchronizer;
exports.CONSTANT = CONSTANT;
exports.INITIAL = INITIAL;
exports.VOLATILE = VOLATILE;
exports.RevisionTag = RevisionTag;
exports.TagWrapper = TagWrapper;
exports.CONSTANT_TAG = CONSTANT_TAG;
exports.VOLATILE_TAG = VOLATILE_TAG;
exports.CURRENT_TAG = CURRENT_TAG;
exports.DirtyableTag = DirtyableTag;
exports.combineTagged = combineTagged;
exports.combineSlice = combineSlice;
exports.combine = combine;
exports.CachedTag = CachedTag;
exports.UpdatableTag = UpdatableTag;
exports.CachedReference = CachedReference;
exports.map = map;
exports.ReferenceCache = ReferenceCache;
exports.isModified = isModified;
Object.defineProperty(exports, '__esModule', { value: true });
});