@datorama/akita
Version:
State Management Tailored-Made for JS Applications
81 lines • 8.84 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { isFunction } from './isFunction';
import { hasEntity } from './hasEntity';
import { isPlainObject } from './isPlainObject';
// @internal
/**
* @template S, E
* @param {?} __0
* @return {?}
*/
export function updateEntities({ state, ids, idKey, newStateOrFn, preUpdateEntity }) {
/** @type {?} */
const updatedEntities = {};
/** @type {?} */
let isUpdatingIdKey = false;
/** @type {?} */
let idToUpdate;
for (const id of ids) {
// if the entity doesn't exist don't do anything
if (hasEntity(state.entities, id) === false) {
continue;
}
/** @type {?} */
const oldEntity = state.entities[id];
/** @type {?} */
const newState = isFunction(newStateOrFn) ? newStateOrFn(oldEntity) : newStateOrFn;
/** @type {?} */
const isIdChanged = newState.hasOwnProperty(idKey) && newState[idKey] !== oldEntity[idKey];
/** @type {?} */
let newEntity;
idToUpdate = id;
if (isIdChanged) {
isUpdatingIdKey = true;
idToUpdate = newState[idKey];
}
/** @type {?} */
const merged = Object.assign({}, oldEntity, newState);
if (isPlainObject(oldEntity)) {
newEntity = merged;
}
else {
/**
* In case that new state is class of it's own, there's
* a possibility that it will be different than the old
* class.
* For example, Old state is an instance of animal class
* and new state is instance of person class.
* To avoid run over new person class with the old animal
* class we check if the new state is a class of it's own.
* If so, use it. Otherwise, use the old state class
*/
if (isPlainObject(newState)) {
newEntity = new ((/** @type {?} */ (oldEntity))).constructor(merged);
}
else {
newEntity = new ((/** @type {?} */ (newState))).constructor(merged);
}
}
updatedEntities[idToUpdate] = preUpdateEntity(oldEntity, newEntity);
}
/** @type {?} */
let updatedIds = state.ids;
/** @type {?} */
let stateEntities = state.entities;
if (isUpdatingIdKey) {
const [id] = ids;
const _a = state.entities, _b = id, deletedEntity = _a[_b], rest = tslib_1.__rest(_a, [typeof _b === "symbol" ? _b : _b + ""]);
stateEntities = rest;
updatedIds = state.ids.map((/**
* @param {?} current
* @return {?}
*/
current => (current === id ? idToUpdate : current)));
}
return Object.assign({}, state, { entities: Object.assign({}, stateEntities, updatedEntities), ids: updatedIds });
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlRW50aXRpZXMuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AZGF0b3JhbWEvYWtpdGEvIiwic291cmNlcyI6WyJzcmMvdXBkYXRlRW50aXRpZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFDQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDeEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7Ozs7O0FBV2hELE1BQU0sVUFBVSxjQUFjLENBQThCLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBOEI7O1VBQ3BJLGVBQWUsR0FBRyxFQUFFOztRQUV0QixlQUFlLEdBQUcsS0FBSzs7UUFDdkIsVUFBYztJQUVsQixLQUFLLE1BQU0sRUFBRSxJQUFJLEdBQUcsRUFBRTtRQUNwQixnREFBZ0Q7UUFDaEQsSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsS0FBSyxLQUFLLEVBQUU7WUFDM0MsU0FBUztTQUNWOztjQUVLLFNBQVMsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQzs7Y0FDOUIsUUFBUSxHQUFHLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZOztjQUU1RSxXQUFXLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssU0FBUyxDQUFDLEtBQUssQ0FBQzs7WUFDdEYsU0FBWTtRQUNoQixVQUFVLEdBQUcsRUFBRSxDQUFDO1FBRWhCLElBQUksV0FBVyxFQUFFO1lBQ2YsZUFBZSxHQUFHLElBQUksQ0FBQztZQUN2QixVQUFVLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzlCOztjQUVLLE1BQU0scUJBQ1AsU0FBUyxFQUNULFFBQVEsQ0FDWjtRQUVELElBQUksYUFBYSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQzVCLFNBQVMsR0FBRyxNQUFNLENBQUM7U0FDcEI7YUFBTTtZQUNMOzs7Ozs7Ozs7ZUFTRztZQUNILElBQUksYUFBYSxDQUFDLFFBQVEsQ0FBQyxFQUFFO2dCQUMzQixTQUFTLEdBQUcsSUFBSSxDQUFDLG1CQUFBLFNBQVMsRUFBTyxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQ3hEO2lCQUFNO2dCQUNMLFNBQVMsR0FBRyxJQUFJLENBQUMsbUJBQUEsUUFBUSxFQUFPLENBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDdkQ7U0FDRjtRQUVELGVBQWUsQ0FBQyxVQUFVLENBQUMsR0FBRyxlQUFlLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0tBQ3JFOztRQUVHLFVBQVUsR0FBRyxLQUFLLENBQUMsR0FBRzs7UUFDdEIsYUFBYSxHQUFHLEtBQUssQ0FBQyxRQUFRO0lBRWxDLElBQUksZUFBZSxFQUFFO2NBQ2IsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHO2NBQ1YsbUJBQWlELEVBQS9DLE9BQUksRUFBSixzQkFBbUIsRUFBRSxrRUFBTztRQUNwQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLFVBQVUsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUc7Ozs7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBQyxDQUFDO0tBQ2hGO0lBRUQseUJBQ0ssS0FBSyxJQUNSLFFBQVEsb0JBQ0gsYUFBYSxFQUNiLGVBQWUsR0FFcEIsR0FBRyxFQUFFLFVBQVUsSUFDZjtBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbnRpdHlTdGF0ZSwgSUQsIFByZVVwZGF0ZUVudGl0eSwgVXBkYXRlU3RhdGVDYWxsYmFjayB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgaXNGdW5jdGlvbiB9IGZyb20gJy4vaXNGdW5jdGlvbic7XG5pbXBvcnQgeyBoYXNFbnRpdHkgfSBmcm9tICcuL2hhc0VudGl0eSc7XG5pbXBvcnQgeyBpc1BsYWluT2JqZWN0IH0gZnJvbSAnLi9pc1BsYWluT2JqZWN0JztcblxuZXhwb3J0IHR5cGUgVXBkYXRlRW50aXRpZXNQYXJhbXM8U3RhdGUsIEVudGl0eT4gPSB7XG4gIHN0YXRlOiBTdGF0ZTtcbiAgaWRzOiBhbnlbXTtcbiAgaWRLZXk6IHN0cmluZztcbiAgbmV3U3RhdGVPckZuOiBVcGRhdGVTdGF0ZUNhbGxiYWNrPEVudGl0eT4gfCBQYXJ0aWFsPEVudGl0eT4gfCBQYXJ0aWFsPFN0YXRlPjtcbiAgcHJlVXBkYXRlRW50aXR5OiBQcmVVcGRhdGVFbnRpdHk8RW50aXR5Pjtcbn07XG5cbi8vIEBpbnRlcm5hbFxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUVudGl0aWVzPFMgZXh0ZW5kcyBFbnRpdHlTdGF0ZTxFPiwgRT4oeyBzdGF0ZSwgaWRzLCBpZEtleSwgbmV3U3RhdGVPckZuLCBwcmVVcGRhdGVFbnRpdHkgfTogVXBkYXRlRW50aXRpZXNQYXJhbXM8UywgRT4pIHtcbiAgY29uc3QgdXBkYXRlZEVudGl0aWVzID0ge307XG5cbiAgbGV0IGlzVXBkYXRpbmdJZEtleSA9IGZhbHNlO1xuICBsZXQgaWRUb1VwZGF0ZTogSUQ7XG5cbiAgZm9yIChjb25zdCBpZCBvZiBpZHMpIHtcbiAgICAvLyBpZiB0aGUgZW50aXR5IGRvZXNuJ3QgZXhpc3QgZG9uJ3QgZG8gYW55dGhpbmdcbiAgICBpZiAoaGFzRW50aXR5KHN0YXRlLmVudGl0aWVzLCBpZCkgPT09IGZhbHNlKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBvbGRFbnRpdHkgPSBzdGF0ZS5lbnRpdGllc1tpZF07XG4gICAgY29uc3QgbmV3U3RhdGUgPSBpc0Z1bmN0aW9uKG5ld1N0YXRlT3JGbikgPyBuZXdTdGF0ZU9yRm4ob2xkRW50aXR5KSA6IG5ld1N0YXRlT3JGbjtcblxuICAgIGNvbnN0IGlzSWRDaGFuZ2VkID0gbmV3U3RhdGUuaGFzT3duUHJvcGVydHkoaWRLZXkpICYmIG5ld1N0YXRlW2lkS2V5XSAhPT0gb2xkRW50aXR5W2lkS2V5XTtcbiAgICBsZXQgbmV3RW50aXR5OiBFO1xuICAgIGlkVG9VcGRhdGUgPSBpZDtcblxuICAgIGlmIChpc0lkQ2hhbmdlZCkge1xuICAgICAgaXNVcGRhdGluZ0lkS2V5ID0gdHJ1ZTtcbiAgICAgIGlkVG9VcGRhdGUgPSBuZXdTdGF0ZVtpZEtleV07XG4gICAgfVxuXG4gICAgY29uc3QgbWVyZ2VkID0ge1xuICAgICAgLi4ub2xkRW50aXR5LFxuICAgICAgLi4ubmV3U3RhdGVcbiAgICB9O1xuXG4gICAgaWYgKGlzUGxhaW5PYmplY3Qob2xkRW50aXR5KSkge1xuICAgICAgbmV3RW50aXR5ID0gbWVyZ2VkO1xuICAgIH0gZWxzZSB7XG4gICAgICAvKipcbiAgICAgICAqIEluIGNhc2UgdGhhdCBuZXcgc3RhdGUgaXMgY2xhc3Mgb2YgaXQncyBvd24sIHRoZXJlJ3NcbiAgICAgICAqIGEgcG9zc2liaWxpdHkgdGhhdCBpdCB3aWxsIGJlIGRpZmZlcmVudCB0aGFuIHRoZSBvbGRcbiAgICAgICAqIGNsYXNzLlxuICAgICAgICogRm9yIGV4YW1wbGUsIE9sZCBzdGF0ZSBpcyBhbiBpbnN0YW5jZSBvZiBhbmltYWwgY2xhc3NcbiAgICAgICAqIGFuZCBuZXcgc3RhdGUgaXMgaW5zdGFuY2Ugb2YgcGVyc29uIGNsYXNzLlxuICAgICAgICogVG8gYXZvaWQgcnVuIG92ZXIgbmV3IHBlcnNvbiBjbGFzcyB3aXRoIHRoZSBvbGQgYW5pbWFsXG4gICAgICAgKiBjbGFzcyB3ZSBjaGVjayBpZiB0aGUgbmV3IHN0YXRlIGlzIGEgY2xhc3Mgb2YgaXQncyBvd24uXG4gICAgICAgKiBJZiBzbywgdXNlIGl0LiBPdGhlcndpc2UsIHVzZSB0aGUgb2xkIHN0YXRlIGNsYXNzXG4gICAgICAgKi9cbiAgICAgIGlmIChpc1BsYWluT2JqZWN0KG5ld1N0YXRlKSkge1xuICAgICAgICBuZXdFbnRpdHkgPSBuZXcgKG9sZEVudGl0eSBhcyBhbnkpLmNvbnN0cnVjdG9yKG1lcmdlZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXdFbnRpdHkgPSBuZXcgKG5ld1N0YXRlIGFzIGFueSkuY29uc3RydWN0b3IobWVyZ2VkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVkRW50aXRpZXNbaWRUb1VwZGF0ZV0gPSBwcmVVcGRhdGVFbnRpdHkob2xkRW50aXR5LCBuZXdFbnRpdHkpO1xuICB9XG5cbiAgbGV0IHVwZGF0ZWRJZHMgPSBzdGF0ZS5pZHM7XG4gIGxldCBzdGF0ZUVudGl0aWVzID0gc3RhdGUuZW50aXRpZXM7XG5cbiAgaWYgKGlzVXBkYXRpbmdJZEtleSkge1xuICAgIGNvbnN0IFtpZF0gPSBpZHM7XG4gICAgY29uc3QgeyBbaWRdOiBkZWxldGVkRW50aXR5LCAuLi5yZXN0IH0gPSBzdGF0ZS5lbnRpdGllcztcbiAgICBzdGF0ZUVudGl0aWVzID0gcmVzdDtcbiAgICB1cGRhdGVkSWRzID0gc3RhdGUuaWRzLm1hcChjdXJyZW50ID0+IChjdXJyZW50ID09PSBpZCA/IGlkVG9VcGRhdGUgOiBjdXJyZW50KSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGVudGl0aWVzOiB7XG4gICAgICAuLi5zdGF0ZUVudGl0aWVzLFxuICAgICAgLi4udXBkYXRlZEVudGl0aWVzXG4gICAgfSxcbiAgICBpZHM6IHVwZGF0ZWRJZHNcbiAgfTtcbn1cbiJdfQ==