@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
JavaScript
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