UNPKG

@type-r/models

Version:

The serializable type system for JS and TypeScript

132 lines 5.02 kB
import { eventsApi } from '@type-r/mixture'; import { ItemsBehavior, transactionApi } from '../transactions'; var trigger2 = eventsApi.trigger2, trigger3 = eventsApi.trigger3, on = eventsApi.on, off = eventsApi.off, commit = transactionApi.commit, _aquire = transactionApi.aquire, _free = transactionApi.free; export function dispose(collection) { var models = collection.models; collection.models = []; collection._byId = {}; freeAll(collection, models); return models; } export function convertAndAquire(collection, attrs, options) { var model = collection.model; var record; if (collection._shared) { record = attrs instanceof model ? attrs : model.create(attrs, options); if (collection._shared & ItemsBehavior.listen) { on(record, record._changeEventName, collection._onChildrenChange, collection); } } else { record = attrs instanceof model ? (options.merge ? attrs.clone() : attrs) : model.create(attrs, options); if (record._owner) { if (record._owner !== collection) { _aquire(collection, record.clone()); var errors = collection._aggregationError || (collection._aggregationError = []); errors.push(record); } } else { _aquire(collection, record); } } var _itemEvents = collection._itemEvents; _itemEvents && _itemEvents.subscribe(collection, record); return record; } export function free(owner, child, unset) { if (owner._shared) { if (owner._shared & ItemsBehavior.listen) { off(child, child._changeEventName, owner._onChildrenChange, owner); } } else { _free(owner, child); unset || child.dispose(); } var _itemEvents = owner._itemEvents; _itemEvents && _itemEvents.unsubscribe(owner, child); } export function freeAll(collection, children) { for (var _i = 0, children_1 = children; _i < children_1.length; _i++) { var child = children_1[_i]; free(collection, child); } return children; } export function sortElements(collection, options) { var _comparator = collection._comparator; if (_comparator && options.sort !== false) { collection.models.sort(_comparator); return true; } return false; } export function addIndex(index, model) { index[model.cid] = model; var id = model.id; if (id || id === 0) { index[id] = model; } } export function removeIndex(index, model) { delete index[model.cid]; var id = model.id; if (id || id === 0) { delete index[id]; } } export function updateIndex(index, model) { delete index[model.previous(model.idAttribute)]; var id = model.id; id == null || (index[id] = model); } var CollectionTransaction = (function () { function CollectionTransaction(object, isRoot, added, removed, nested, sorted) { this.object = object; this.isRoot = isRoot; this.added = added; this.removed = removed; this.nested = nested; this.sorted = sorted; } CollectionTransaction.prototype.commit = function (initiator) { var _a = this, nested = _a.nested, object = _a.object, _isDirty = object._isDirty; for (var _i = 0, nested_1 = nested; _i < nested_1.length; _i++) { var transaction = nested_1[_i]; transaction.commit(object); } if (object._aggregationError) { logAggregationError(object, _isDirty); } for (var _b = 0, nested_2 = nested; _b < nested_2.length; _b++) { var transaction = nested_2[_b]; trigger2(object, 'change', transaction.object, _isDirty); } var _c = this, added = _c.added, removed = _c.removed; for (var _d = 0, added_1 = added; _d < added_1.length; _d++) { var record = added_1[_d]; trigger3(record, 'add', record, object, _isDirty); trigger3(object, 'add', record, object, _isDirty); } for (var _e = 0, removed_1 = removed; _e < removed_1.length; _e++) { var record = removed_1[_e]; trigger3(record, 'remove', record, object, _isDirty); trigger3(object, 'remove', record, object, _isDirty); } if (this.sorted) { trigger2(object, 'sort', object, _isDirty); } if (added.length || removed.length) { trigger2(object, 'update', object, _isDirty); } this.isRoot && commit(object, initiator); }; return CollectionTransaction; }()); export { CollectionTransaction }; export function logAggregationError(collection, options) { collection._log('warn', 'Type-R:InvalidOwner', 'added records already have an owner and were cloned. Use explicit record.clone() to dismiss this warning.', collection._aggregationError, options.logger); collection._aggregationError = void 0; } //# sourceMappingURL=commons.js.map