UNPKG

@datorama/akita

Version:

State Management Tailored-Made for JS Applications

81 lines 8.84 kB
/** * @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==