UNPKG

@ngxs-labs/entity-state

Version:

<p align="center"> <img src="https://raw.githubusercontent.com/ngxs-labs/emitter/master/docs/assets/logo.png"> </p>

32 lines 5.26 kB
import { asArray } from '../internal'; /** * Adds or replaces the given entities to the state. * For each entity an ID will be calculated, based on the given provider. * This operator ensures that the calculated ID is added to the entity, at the specified id-field. * The `lastUpdated` timestamp will be updated. * @param entities the new entities to add or replace * @param idKey key of the id-field of an entity * @param idProvider function to provide an ID for the given entity */ export function addOrReplace(entities, idKey, idProvider) { return (state) => { const nextEntities = Object.assign({}, state.entities); const nextIds = [...state.ids]; let nextState = state; // will be reassigned while looping over new entities asArray(entities).forEach(entity => { const id = idProvider(entity, nextState); let updatedEntity = entity; if (entity[idKey] !== id) { // ensure ID is in the entity updatedEntity = Object.assign(Object.assign({}, entity), { [idKey]: id }); } nextEntities[id] = updatedEntity; if (!nextIds.includes(id)) { nextIds.push(id); } nextState = Object.assign(Object.assign({}, nextState), { entities: nextEntities, ids: nextIds }); }); return Object.assign(Object.assign({}, nextState), { entities: nextEntities, ids: nextIds, lastUpdated: Date.now() }); }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGF0ZS1vcGVyYXRvcnMvYWRkaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHdEM7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUMxQixRQUFpQixFQUNqQixLQUFhLEVBQ2IsVUFBeUI7SUFFekIsT0FBTyxDQUFDLEtBQTBCLEVBQUUsRUFBRTtRQUNwQyxNQUFNLFlBQVkscUJBQVEsS0FBSyxDQUFDLFFBQVEsQ0FBRSxDQUFDO1FBQzNDLE1BQU0sT0FBTyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDL0IsSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDLENBQUMscURBQXFEO1FBRTVFLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDakMsTUFBTSxFQUFFLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztZQUN6QyxJQUFJLGFBQWEsR0FBRyxNQUFNLENBQUM7WUFDM0IsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUN4Qiw2QkFBNkI7Z0JBQzdCLGFBQWEsbUNBQVEsTUFBTSxLQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxHQUFFLENBQUM7YUFDNUM7WUFDRCxZQUFZLENBQUMsRUFBRSxDQUFDLEdBQUcsYUFBYSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxFQUFFO2dCQUN6QixPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQ2xCO1lBQ0QsU0FBUyxtQ0FDSixTQUFTLEtBQ1osUUFBUSxFQUFFLFlBQVksRUFDdEIsR0FBRyxFQUFFLE9BQU8sR0FDYixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCx1Q0FDSyxTQUFTLEtBQ1osUUFBUSxFQUFFLFlBQVksRUFDdEIsR0FBRyxFQUFFLE9BQU8sRUFDWixXQUFXLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUN2QjtJQUNKLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdGF0ZU9wZXJhdG9yIH0gZnJvbSAnQG5neHMvc3RvcmUnO1xyXG5pbXBvcnQgeyBhc0FycmF5IH0gZnJvbSAnLi4vaW50ZXJuYWwnO1xyXG5pbXBvcnQgeyBFbnRpdHlTdGF0ZU1vZGVsLCBJZFByb3ZpZGVyIH0gZnJvbSAnLi4vbW9kZWxzJztcclxuXHJcbi8qKlxyXG4gKiBBZGRzIG9yIHJlcGxhY2VzIHRoZSBnaXZlbiBlbnRpdGllcyB0byB0aGUgc3RhdGUuXHJcbiAqIEZvciBlYWNoIGVudGl0eSBhbiBJRCB3aWxsIGJlIGNhbGN1bGF0ZWQsIGJhc2VkIG9uIHRoZSBnaXZlbiBwcm92aWRlci5cclxuICogVGhpcyBvcGVyYXRvciBlbnN1cmVzIHRoYXQgdGhlIGNhbGN1bGF0ZWQgSUQgaXMgYWRkZWQgdG8gdGhlIGVudGl0eSwgYXQgdGhlIHNwZWNpZmllZCBpZC1maWVsZC5cclxuICogVGhlIGBsYXN0VXBkYXRlZGAgdGltZXN0YW1wIHdpbGwgYmUgdXBkYXRlZC5cclxuICogQHBhcmFtIGVudGl0aWVzIHRoZSBuZXcgZW50aXRpZXMgdG8gYWRkIG9yIHJlcGxhY2VcclxuICogQHBhcmFtIGlkS2V5IGtleSBvZiB0aGUgaWQtZmllbGQgb2YgYW4gZW50aXR5XHJcbiAqIEBwYXJhbSBpZFByb3ZpZGVyIGZ1bmN0aW9uIHRvIHByb3ZpZGUgYW4gSUQgZm9yIHRoZSBnaXZlbiBlbnRpdHlcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRPclJlcGxhY2U8VD4oXHJcbiAgZW50aXRpZXM6IFQgfCBUW10sXHJcbiAgaWRLZXk6IHN0cmluZyxcclxuICBpZFByb3ZpZGVyOiBJZFByb3ZpZGVyPFQ+XHJcbik6IFN0YXRlT3BlcmF0b3I8RW50aXR5U3RhdGVNb2RlbDxUPj4ge1xyXG4gIHJldHVybiAoc3RhdGU6IEVudGl0eVN0YXRlTW9kZWw8VD4pID0+IHtcclxuICAgIGNvbnN0IG5leHRFbnRpdGllcyA9IHsgLi4uc3RhdGUuZW50aXRpZXMgfTtcclxuICAgIGNvbnN0IG5leHRJZHMgPSBbLi4uc3RhdGUuaWRzXTtcclxuICAgIGxldCBuZXh0U3RhdGUgPSBzdGF0ZTsgLy8gd2lsbCBiZSByZWFzc2lnbmVkIHdoaWxlIGxvb3Bpbmcgb3ZlciBuZXcgZW50aXRpZXNcclxuXHJcbiAgICBhc0FycmF5KGVudGl0aWVzKS5mb3JFYWNoKGVudGl0eSA9PiB7XHJcbiAgICAgIGNvbnN0IGlkID0gaWRQcm92aWRlcihlbnRpdHksIG5leHRTdGF0ZSk7XHJcbiAgICAgIGxldCB1cGRhdGVkRW50aXR5ID0gZW50aXR5O1xyXG4gICAgICBpZiAoZW50aXR5W2lkS2V5XSAhPT0gaWQpIHtcclxuICAgICAgICAvLyBlbnN1cmUgSUQgaXMgaW4gdGhlIGVudGl0eVxyXG4gICAgICAgIHVwZGF0ZWRFbnRpdHkgPSB7IC4uLmVudGl0eSwgW2lkS2V5XTogaWQgfTtcclxuICAgICAgfVxyXG4gICAgICBuZXh0RW50aXRpZXNbaWRdID0gdXBkYXRlZEVudGl0eTtcclxuICAgICAgaWYgKCFuZXh0SWRzLmluY2x1ZGVzKGlkKSkge1xyXG4gICAgICAgIG5leHRJZHMucHVzaChpZCk7XHJcbiAgICAgIH1cclxuICAgICAgbmV4dFN0YXRlID0ge1xyXG4gICAgICAgIC4uLm5leHRTdGF0ZSxcclxuICAgICAgICBlbnRpdGllczogbmV4dEVudGl0aWVzLFxyXG4gICAgICAgIGlkczogbmV4dElkc1xyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgLi4ubmV4dFN0YXRlLFxyXG4gICAgICBlbnRpdGllczogbmV4dEVudGl0aWVzLFxyXG4gICAgICBpZHM6IG5leHRJZHMsXHJcbiAgICAgIGxhc3RVcGRhdGVkOiBEYXRlLm5vdygpXHJcbiAgICB9O1xyXG4gIH07XHJcbn1cclxuIl19