UNPKG

@ngxs-labs/entity-state

Version:

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

62 lines 10.2 kB
import { asArray, mustGetActive } from '../internal'; import { InvalidIdError, NoSuchEntityError, UpdateFailedError } from '../errors'; /** * Updates the given entities in the state. * Entities will be merged with the given `onUpdate` function. * @param payload the updated entities * @param idKey key of the id-field of an entity * @param onUpdate update function to call on each entity */ export function update(payload, idKey, onUpdate) { return (state) => { let entities = Object.assign({}, state.entities); // create copy const affected = getAffectedValues(Object.values(entities), payload.selector, idKey); if (typeof payload.data === 'function') { affected.forEach(entity => { entities = updateDictionary(entities, payload.data(entity), entity[idKey], onUpdate); }); } else { affected.forEach(entity => { entities = updateDictionary(entities, payload.data, entity[idKey], onUpdate); }); } return Object.assign(Object.assign({}, state), { entities, lastUpdated: Date.now() }); }; } export function updateActive(payload, idKey, onUpdate) { return (state) => { const { id: activeId, active } = mustGetActive(state); const { entities } = state; if (typeof payload === 'function') { return Object.assign(Object.assign({}, state), { entities: updateDictionary(entities, payload(active), activeId, onUpdate), lastUpdated: Date.now() }); } else { return Object.assign(Object.assign({}, state), { entities: updateDictionary(entities, payload, activeId, onUpdate), lastUpdated: Date.now() }); } }; } export function updateDictionary(entities, entity, id, onUpdate) { if (id === undefined) { throw new UpdateFailedError(new InvalidIdError(id)); } const current = entities[id]; if (current === undefined) { throw new UpdateFailedError(new NoSuchEntityError(id)); } const updated = onUpdate(current, entity); return Object.assign(Object.assign({}, entities), { [id]: updated }); } function getAffectedValues(entities, selector, idKey) { if (selector === null) { return entities; } else if (typeof selector === 'function') { return entities.filter(entity => selector(entity)); } else { const ids = asArray(selector); return entities.filter(entity => ids.includes(entity[idKey])); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3N0YXRlLW9wZXJhdG9ycy91cGRhdGluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsT0FBTyxFQUFjLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUdqRSxPQUFPLEVBQUUsY0FBYyxFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBSWpGOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxNQUFNLENBQ3BCLE9BQXdCLEVBQ3hCLEtBQWEsRUFDYixRQUFxQjtJQUVyQixPQUFPLENBQUMsS0FBMEIsRUFBRSxFQUFFO1FBQ3BDLElBQUksUUFBUSxxQkFBUSxLQUFLLENBQUMsUUFBUSxDQUFFLENBQUMsQ0FBQyxjQUFjO1FBRXBELE1BQU0sUUFBUSxHQUFHLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsT0FBTyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUVyRixJQUFJLE9BQU8sT0FBTyxDQUFDLElBQUksS0FBSyxVQUFVLEVBQUU7WUFDdEMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDeEIsUUFBUSxHQUFHLGdCQUFnQixDQUN6QixRQUFRLEVBQ0csT0FBTyxDQUFDLElBQUssQ0FBQyxNQUFNLENBQUMsRUFDaEMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUNiLFFBQVEsQ0FDVCxDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQUM7U0FDSjthQUFNO1lBQ0wsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDeEIsUUFBUSxHQUFHLGdCQUFnQixDQUN6QixRQUFRLEVBQ1IsT0FBTyxDQUFDLElBQWtCLEVBQzFCLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFDYixRQUFRLENBQ1QsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDO1NBQ0o7UUFFRCx1Q0FDSyxLQUFLLEtBQ1IsUUFBUSxFQUNSLFdBQVcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLElBQ3ZCO0lBQ0osQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0sVUFBVSxZQUFZLENBQUksT0FBbUIsRUFBRSxLQUFhLEVBQUUsUUFBcUI7SUFDdkYsT0FBTyxDQUFDLEtBQTBCLEVBQUUsRUFBRTtRQUNwQyxNQUFNLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEQsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLEtBQUssQ0FBQztRQUUzQixJQUFJLE9BQU8sT0FBTyxLQUFLLFVBQVUsRUFBRTtZQUNqQyx1Q0FDSyxLQUFLLEtBQ1IsUUFBUSxFQUFFLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxFQUN6RSxXQUFXLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUN2QjtTQUNIO2FBQU07WUFDTCx1Q0FDSyxLQUFLLEtBQ1IsUUFBUSxFQUFFLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxFQUNqRSxXQUFXLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUN2QjtTQUNIO0lBQ0gsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0sVUFBVSxnQkFBZ0IsQ0FDOUIsUUFBdUIsRUFDdkIsTUFBa0IsRUFDbEIsRUFBVSxFQUNWLFFBQXFCO0lBRXJCLElBQUksRUFBRSxLQUFLLFNBQVMsRUFBRTtRQUNwQixNQUFNLElBQUksaUJBQWlCLENBQUMsSUFBSSxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztLQUNyRDtJQUNELE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM3QixJQUFJLE9BQU8sS0FBSyxTQUFTLEVBQUU7UUFDekIsTUFBTSxJQUFJLGlCQUFpQixDQUFDLElBQUksaUJBQWlCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztLQUN4RDtJQUNELE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDMUMsdUNBQVksUUFBUSxLQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsT0FBTyxJQUFHO0FBQ3hDLENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUFJLFFBQWEsRUFBRSxRQUEyQixFQUFFLEtBQWE7SUFDckYsSUFBSSxRQUFRLEtBQUssSUFBSSxFQUFFO1FBQ3JCLE9BQU8sUUFBUSxDQUFDO0tBQ2pCO1NBQU0sSUFBSSxPQUFPLFFBQVEsS0FBSyxVQUFVLEVBQUU7UUFDekMsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQVksUUFBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7S0FDaEU7U0FBTTtRQUNMLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM5QixPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDL0Q7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3RhdGVPcGVyYXRvciB9IGZyb20gJ0BuZ3hzL3N0b3JlJztcclxuaW1wb3J0IHsgYXNBcnJheSwgRGljdGlvbmFyeSwgbXVzdEdldEFjdGl2ZSB9IGZyb20gJy4uL2ludGVybmFsJztcclxuaW1wb3J0IHsgRW50aXR5U3RhdGVNb2RlbCB9IGZyb20gJy4uL21vZGVscyc7XHJcbmltcG9ydCB7IEVudGl0eVNlbGVjdG9yLCBFbnRpdHlVcGRhdGUsIFVwZGF0ZXIgfSBmcm9tICcuLi9hY3Rpb25zJztcclxuaW1wb3J0IHsgSW52YWxpZElkRXJyb3IsIE5vU3VjaEVudGl0eUVycm9yLCBVcGRhdGVGYWlsZWRFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XHJcblxyXG5leHBvcnQgdHlwZSBPblVwZGF0ZTxUPiA9IChjdXJyZW50OiBSZWFkb25seTxUPiwgdXBkYXRlZDogUGFydGlhbDxUPikgPT4gVDtcclxuXHJcbi8qKlxyXG4gKiBVcGRhdGVzIHRoZSBnaXZlbiBlbnRpdGllcyBpbiB0aGUgc3RhdGUuXHJcbiAqIEVudGl0aWVzIHdpbGwgYmUgbWVyZ2VkIHdpdGggdGhlIGdpdmVuIGBvblVwZGF0ZWAgZnVuY3Rpb24uXHJcbiAqIEBwYXJhbSBwYXlsb2FkIHRoZSB1cGRhdGVkIGVudGl0aWVzXHJcbiAqIEBwYXJhbSBpZEtleSBrZXkgb2YgdGhlIGlkLWZpZWxkIG9mIGFuIGVudGl0eVxyXG4gKiBAcGFyYW0gb25VcGRhdGUgdXBkYXRlIGZ1bmN0aW9uIHRvIGNhbGwgb24gZWFjaCBlbnRpdHlcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGU8VD4oXHJcbiAgcGF5bG9hZDogRW50aXR5VXBkYXRlPFQ+LFxyXG4gIGlkS2V5OiBzdHJpbmcsXHJcbiAgb25VcGRhdGU6IE9uVXBkYXRlPFQ+XHJcbik6IFN0YXRlT3BlcmF0b3I8RW50aXR5U3RhdGVNb2RlbDxUPj4ge1xyXG4gIHJldHVybiAoc3RhdGU6IEVudGl0eVN0YXRlTW9kZWw8VD4pID0+IHtcclxuICAgIGxldCBlbnRpdGllcyA9IHsgLi4uc3RhdGUuZW50aXRpZXMgfTsgLy8gY3JlYXRlIGNvcHlcclxuXHJcbiAgICBjb25zdCBhZmZlY3RlZCA9IGdldEFmZmVjdGVkVmFsdWVzKE9iamVjdC52YWx1ZXMoZW50aXRpZXMpLCBwYXlsb2FkLnNlbGVjdG9yLCBpZEtleSk7XHJcblxyXG4gICAgaWYgKHR5cGVvZiBwYXlsb2FkLmRhdGEgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgYWZmZWN0ZWQuZm9yRWFjaChlbnRpdHkgPT4ge1xyXG4gICAgICAgIGVudGl0aWVzID0gdXBkYXRlRGljdGlvbmFyeShcclxuICAgICAgICAgIGVudGl0aWVzLFxyXG4gICAgICAgICAgKDxGdW5jdGlvbj5wYXlsb2FkLmRhdGEpKGVudGl0eSksXHJcbiAgICAgICAgICBlbnRpdHlbaWRLZXldLFxyXG4gICAgICAgICAgb25VcGRhdGVcclxuICAgICAgICApO1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGFmZmVjdGVkLmZvckVhY2goZW50aXR5ID0+IHtcclxuICAgICAgICBlbnRpdGllcyA9IHVwZGF0ZURpY3Rpb25hcnkoXHJcbiAgICAgICAgICBlbnRpdGllcyxcclxuICAgICAgICAgIHBheWxvYWQuZGF0YSBhcyBQYXJ0aWFsPFQ+LFxyXG4gICAgICAgICAgZW50aXR5W2lkS2V5XSxcclxuICAgICAgICAgIG9uVXBkYXRlXHJcbiAgICAgICAgKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgLi4uc3RhdGUsXHJcbiAgICAgIGVudGl0aWVzLFxyXG4gICAgICBsYXN0VXBkYXRlZDogRGF0ZS5ub3coKVxyXG4gICAgfTtcclxuICB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlQWN0aXZlPFQ+KHBheWxvYWQ6IFVwZGF0ZXI8VD4sIGlkS2V5OiBzdHJpbmcsIG9uVXBkYXRlOiBPblVwZGF0ZTxUPikge1xyXG4gIHJldHVybiAoc3RhdGU6IEVudGl0eVN0YXRlTW9kZWw8VD4pID0+IHtcclxuICAgIGNvbnN0IHsgaWQ6IGFjdGl2ZUlkLCBhY3RpdmUgfSA9IG11c3RHZXRBY3RpdmUoc3RhdGUpO1xyXG4gICAgY29uc3QgeyBlbnRpdGllcyB9ID0gc3RhdGU7XHJcblxyXG4gICAgaWYgKHR5cGVvZiBwYXlsb2FkID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgLi4uc3RhdGUsXHJcbiAgICAgICAgZW50aXRpZXM6IHVwZGF0ZURpY3Rpb25hcnkoZW50aXRpZXMsIHBheWxvYWQoYWN0aXZlKSwgYWN0aXZlSWQsIG9uVXBkYXRlKSxcclxuICAgICAgICBsYXN0VXBkYXRlZDogRGF0ZS5ub3coKVxyXG4gICAgICB9O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICAuLi5zdGF0ZSxcclxuICAgICAgICBlbnRpdGllczogdXBkYXRlRGljdGlvbmFyeShlbnRpdGllcywgcGF5bG9hZCwgYWN0aXZlSWQsIG9uVXBkYXRlKSxcclxuICAgICAgICBsYXN0VXBkYXRlZDogRGF0ZS5ub3coKVxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVEaWN0aW9uYXJ5PFQ+KFxyXG4gIGVudGl0aWVzOiBEaWN0aW9uYXJ5PFQ+LFxyXG4gIGVudGl0eTogUGFydGlhbDxUPixcclxuICBpZDogc3RyaW5nLFxyXG4gIG9uVXBkYXRlOiBPblVwZGF0ZTxUPlxyXG4pOiBEaWN0aW9uYXJ5PFQ+IHtcclxuICBpZiAoaWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgdGhyb3cgbmV3IFVwZGF0ZUZhaWxlZEVycm9yKG5ldyBJbnZhbGlkSWRFcnJvcihpZCkpO1xyXG4gIH1cclxuICBjb25zdCBjdXJyZW50ID0gZW50aXRpZXNbaWRdO1xyXG4gIGlmIChjdXJyZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgIHRocm93IG5ldyBVcGRhdGVGYWlsZWRFcnJvcihuZXcgTm9TdWNoRW50aXR5RXJyb3IoaWQpKTtcclxuICB9XHJcbiAgY29uc3QgdXBkYXRlZCA9IG9uVXBkYXRlKGN1cnJlbnQsIGVudGl0eSk7XHJcbiAgcmV0dXJuIHsgLi4uZW50aXRpZXMsIFtpZF06IHVwZGF0ZWQgfTtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0QWZmZWN0ZWRWYWx1ZXM8VD4oZW50aXRpZXM6IFRbXSwgc2VsZWN0b3I6IEVudGl0eVNlbGVjdG9yPFQ+LCBpZEtleTogc3RyaW5nKTogVFtdIHtcclxuICBpZiAoc2VsZWN0b3IgPT09IG51bGwpIHtcclxuICAgIHJldHVybiBlbnRpdGllcztcclxuICB9IGVsc2UgaWYgKHR5cGVvZiBzZWxlY3RvciA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgcmV0dXJuIGVudGl0aWVzLmZpbHRlcihlbnRpdHkgPT4gKDxGdW5jdGlvbj5zZWxlY3RvcikoZW50aXR5KSk7XHJcbiAgfSBlbHNlIHtcclxuICAgIGNvbnN0IGlkcyA9IGFzQXJyYXkoc2VsZWN0b3IpO1xyXG4gICAgcmV0dXJuIGVudGl0aWVzLmZpbHRlcihlbnRpdHkgPT4gaWRzLmluY2x1ZGVzKGVudGl0eVtpZEtleV0pKTtcclxuICB9XHJcbn1cclxuIl19