UNPKG

@ngxs-labs/entity-state

Version:

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

95 lines 11.8 kB
import { InvalidIdOfError, UnableToGenerateIdError } from './errors'; export var IdStrategy; (function (IdStrategy) { class IdGenerator { constructor(idKey) { this.idKey = idKey; } /** * Checks if the given id is in the state's ID array * @param id the ID to check * @param state the current state */ isIdInState(id, state) { return state.ids.includes(id); } /** * This function tries to get the present ID of the given entity with #getIdOf. * If it's undefined the #generateId function will be used. * @param entity The entity to get the ID from * @param state The current state * @see getIdOf * @see generateId */ getPresentIdOrGenerate(entity, state) { const presentId = this.getIdOf(entity); return presentId === undefined ? this.generateId(entity, state) : presentId; } /** * A wrapper for #getIdOf. If the function returns undefined an error will be thrown. * @param entity The entity to get the ID from * @see getIdOf * @see InvalidIdOfError */ mustGetIdOf(entity) { const id = this.getIdOf(entity); if (id === undefined) { throw new InvalidIdOfError(); } return id; } /** * Returns the ID for the given entity. Can return undefined. * @param entity The entity to get the ID from */ getIdOf(entity) { return entity[this.idKey]; } } IdStrategy.IdGenerator = IdGenerator; class IncrementingIdGenerator extends IdGenerator { constructor(idKey) { super(idKey); } generateId(entity, state) { const max = Math.max(-1, ...state.ids.map(id => parseInt(id, 10))); return (max + 1).toString(10); } } IdStrategy.IncrementingIdGenerator = IncrementingIdGenerator; class UUIDGenerator extends IdGenerator { constructor(idKey) { super(idKey); } generateId(entity, state) { let nextId; do { nextId = this.uuidv4(); } while (this.isIdInState(nextId, state)); return nextId; } uuidv4() { // https://stackoverflow.com/a/2117523 return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { const r = (Math.random() * 16) | 0; // tslint:disable-line const v = c === 'x' ? r : (r & 0x3) | 0x8; // tslint:disable-line return v.toString(16); }); } } IdStrategy.UUIDGenerator = UUIDGenerator; class EntityIdGenerator extends IdGenerator { constructor(idKey) { super(idKey); } generateId(entity, state) { const id = this.mustGetIdOf(entity); if (this.isIdInState(id, state)) { throw new UnableToGenerateIdError(`The provided ID already exists: ${id}`); } return id; } } IdStrategy.EntityIdGenerator = EntityIdGenerator; })(IdStrategy || (IdStrategy = {})); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWQtc3RyYXRlZ3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2lkLXN0cmF0ZWd5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUVyRSxNQUFNLEtBQVcsVUFBVSxDQTJHMUI7QUEzR0QsV0FBaUIsVUFBVTtJQUN6QixNQUFzQixXQUFXO1FBQy9CLFlBQXlDLEtBQWM7WUFBZCxVQUFLLEdBQUwsS0FBSyxDQUFTO1FBQUcsQ0FBQztRQWEzRDs7OztXQUlHO1FBQ0gsV0FBVyxDQUFDLEVBQVUsRUFBRSxLQUE0QjtZQUNsRCxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2hDLENBQUM7UUFFRDs7Ozs7OztXQU9HO1FBQ0gsc0JBQXNCLENBQUMsTUFBa0IsRUFBRSxLQUE0QjtZQUNyRSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3ZDLE9BQU8sU0FBUyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUM5RSxDQUFDO1FBRUQ7Ozs7O1dBS0c7UUFDSCxXQUFXLENBQUMsTUFBVztZQUNyQixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2hDLElBQUksRUFBRSxLQUFLLFNBQVMsRUFBRTtnQkFDcEIsTUFBTSxJQUFJLGdCQUFnQixFQUFFLENBQUM7YUFDOUI7WUFDRCxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7UUFFRDs7O1dBR0c7UUFDSCxPQUFPLENBQUMsTUFBVztZQUNqQixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUIsQ0FBQztLQUNGO0lBekRxQixzQkFBVyxjQXlEaEMsQ0FBQTtJQUVELE1BQWEsdUJBQTJCLFNBQVEsV0FBYztRQUM1RCxZQUFZLEtBQWM7WUFDeEIsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2YsQ0FBQztRQUVELFVBQVUsQ0FBQyxNQUFrQixFQUFFLEtBQTRCO1lBQ3pELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25FLE9BQU8sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2hDLENBQUM7S0FDRjtJQVRZLGtDQUF1QiwwQkFTbkMsQ0FBQTtJQUVELE1BQWEsYUFBaUIsU0FBUSxXQUFjO1FBQ2xELFlBQVksS0FBYztZQUN4QixLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDZixDQUFDO1FBRUQsVUFBVSxDQUFDLE1BQWtCLEVBQUUsS0FBNEI7WUFDekQsSUFBSSxNQUFNLENBQUM7WUFDWCxHQUFHO2dCQUNELE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7YUFDeEIsUUFBUSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBRTtZQUMxQyxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBRU8sTUFBTTtZQUNaLHNDQUFzQztZQUN0QyxPQUFPLHNDQUFzQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsVUFBUyxDQUFDO2dCQUN2RSxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxzQkFBc0I7Z0JBQzFELE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsc0JBQXNCO2dCQUNqRSxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDeEIsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO0tBQ0Y7SUFyQlksd0JBQWEsZ0JBcUJ6QixDQUFBO0lBRUQsTUFBYSxpQkFBcUIsU0FBUSxXQUFjO1FBQ3RELFlBQVksS0FBYztZQUN4QixLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDZixDQUFDO1FBRUQsVUFBVSxDQUFDLE1BQWtCLEVBQUUsS0FBNEI7WUFDekQsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNwQyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxFQUFFO2dCQUMvQixNQUFNLElBQUksdUJBQXVCLENBQUMsbUNBQW1DLEVBQUUsRUFBRSxDQUFDLENBQUM7YUFDNUU7WUFDRCxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7S0FDRjtJQVpZLDRCQUFpQixvQkFZN0IsQ0FBQTtBQUNILENBQUMsRUEzR2dCLFVBQVUsS0FBVixVQUFVLFFBMkcxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVudGl0eVN0YXRlTW9kZWwgfSBmcm9tICcuL21vZGVscyc7XHJcbmltcG9ydCB7IEludmFsaWRJZE9mRXJyb3IsIFVuYWJsZVRvR2VuZXJhdGVJZEVycm9yIH0gZnJvbSAnLi9lcnJvcnMnO1xyXG5cclxuZXhwb3J0IG5hbWVzcGFjZSBJZFN0cmF0ZWd5IHtcclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgSWRHZW5lcmF0b3I8VD4ge1xyXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHByb3RlY3RlZCByZWFkb25seSBpZEtleToga2V5b2YgVCkge31cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdlbmVyYXRlcyBhIGNvbXBsZXRlbHkgbmV3IElELlxyXG4gICAgICogVGhlIElkR2VuZXJhdG9yJ3MgaW1wbGVtZW50YXRpb24gaGFzIHRvIGVuc3VyZSB0aGF0IHRoZSBnZW5lcmF0ZWQgSUQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGN1cnJlbnQgc3RhdGUuXHJcbiAgICAgKiBJdCBjYW4gdGhyb3cgYW4gVW5hYmxlVG9HZW5lcmF0ZUlkRXJyb3IgaWYgaXQncyB1bmFibGUgdG8gZG8gc28uXHJcbiAgICAgKiBAcGFyYW0gZW50aXR5IFRoZSBlbnRpdHkgdG8gZ2VuZXJhdGUgYW4gSUQgZm9yXHJcbiAgICAgKiBAcGFyYW0gc3RhdGUgVGhlIGN1cnJlbnQgc3RhdGVcclxuICAgICAqIEBzZWUgZ2V0UHJlc2VudElkT3JHZW5lcmF0ZVxyXG4gICAgICogQHNlZSBVbmFibGVUb0dlbmVyYXRlSWRFcnJvclxyXG4gICAgICovXHJcbiAgICBhYnN0cmFjdCBnZW5lcmF0ZUlkKGVudGl0eTogUGFydGlhbDxUPiwgc3RhdGU6IEVudGl0eVN0YXRlTW9kZWw8YW55Pik6IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gaWQgaXMgaW4gdGhlIHN0YXRlJ3MgSUQgYXJyYXlcclxuICAgICAqIEBwYXJhbSBpZCB0aGUgSUQgdG8gY2hlY2tcclxuICAgICAqIEBwYXJhbSBzdGF0ZSB0aGUgY3VycmVudCBzdGF0ZVxyXG4gICAgICovXHJcbiAgICBpc0lkSW5TdGF0ZShpZDogc3RyaW5nLCBzdGF0ZTogRW50aXR5U3RhdGVNb2RlbDxhbnk+KTogYm9vbGVhbiB7XHJcbiAgICAgIHJldHVybiBzdGF0ZS5pZHMuaW5jbHVkZXMoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBmdW5jdGlvbiB0cmllcyB0byBnZXQgdGhlIHByZXNlbnQgSUQgb2YgdGhlIGdpdmVuIGVudGl0eSB3aXRoICNnZXRJZE9mLlxyXG4gICAgICogSWYgaXQncyB1bmRlZmluZWQgdGhlICNnZW5lcmF0ZUlkIGZ1bmN0aW9uIHdpbGwgYmUgdXNlZC5cclxuICAgICAqIEBwYXJhbSBlbnRpdHkgVGhlIGVudGl0eSB0byBnZXQgdGhlIElEIGZyb21cclxuICAgICAqIEBwYXJhbSBzdGF0ZSBUaGUgY3VycmVudCBzdGF0ZVxyXG4gICAgICogQHNlZSBnZXRJZE9mXHJcbiAgICAgKiBAc2VlIGdlbmVyYXRlSWRcclxuICAgICAqL1xyXG4gICAgZ2V0UHJlc2VudElkT3JHZW5lcmF0ZShlbnRpdHk6IFBhcnRpYWw8VD4sIHN0YXRlOiBFbnRpdHlTdGF0ZU1vZGVsPGFueT4pOiBzdHJpbmcge1xyXG4gICAgICBjb25zdCBwcmVzZW50SWQgPSB0aGlzLmdldElkT2YoZW50aXR5KTtcclxuICAgICAgcmV0dXJuIHByZXNlbnRJZCA9PT0gdW5kZWZpbmVkID8gdGhpcy5nZW5lcmF0ZUlkKGVudGl0eSwgc3RhdGUpIDogcHJlc2VudElkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSB3cmFwcGVyIGZvciAjZ2V0SWRPZi4gSWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgdW5kZWZpbmVkIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duLlxyXG4gICAgICogQHBhcmFtIGVudGl0eSBUaGUgZW50aXR5IHRvIGdldCB0aGUgSUQgZnJvbVxyXG4gICAgICogQHNlZSBnZXRJZE9mXHJcbiAgICAgKiBAc2VlIEludmFsaWRJZE9mRXJyb3JcclxuICAgICAqL1xyXG4gICAgbXVzdEdldElkT2YoZW50aXR5OiBhbnkpOiBzdHJpbmcge1xyXG4gICAgICBjb25zdCBpZCA9IHRoaXMuZ2V0SWRPZihlbnRpdHkpO1xyXG4gICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkSWRPZkVycm9yKCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGlkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgSUQgZm9yIHRoZSBnaXZlbiBlbnRpdHkuIENhbiByZXR1cm4gdW5kZWZpbmVkLlxyXG4gICAgICogQHBhcmFtIGVudGl0eSBUaGUgZW50aXR5IHRvIGdldCB0aGUgSUQgZnJvbVxyXG4gICAgICovXHJcbiAgICBnZXRJZE9mKGVudGl0eTogYW55KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcclxuICAgICAgcmV0dXJuIGVudGl0eVt0aGlzLmlkS2V5XTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGV4cG9ydCBjbGFzcyBJbmNyZW1lbnRpbmdJZEdlbmVyYXRvcjxUPiBleHRlbmRzIElkR2VuZXJhdG9yPFQ+IHtcclxuICAgIGNvbnN0cnVjdG9yKGlkS2V5OiBrZXlvZiBUKSB7XHJcbiAgICAgIHN1cGVyKGlkS2V5KTtcclxuICAgIH1cclxuXHJcbiAgICBnZW5lcmF0ZUlkKGVudGl0eTogUGFydGlhbDxUPiwgc3RhdGU6IEVudGl0eVN0YXRlTW9kZWw8YW55Pik6IHN0cmluZyB7XHJcbiAgICAgIGNvbnN0IG1heCA9IE1hdGgubWF4KC0xLCAuLi5zdGF0ZS5pZHMubWFwKGlkID0+IHBhcnNlSW50KGlkLCAxMCkpKTtcclxuICAgICAgcmV0dXJuIChtYXggKyAxKS50b1N0cmluZygxMCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBleHBvcnQgY2xhc3MgVVVJREdlbmVyYXRvcjxUPiBleHRlbmRzIElkR2VuZXJhdG9yPFQ+IHtcclxuICAgIGNvbnN0cnVjdG9yKGlkS2V5OiBrZXlvZiBUKSB7XHJcbiAgICAgIHN1cGVyKGlkS2V5KTtcclxuICAgIH1cclxuXHJcbiAgICBnZW5lcmF0ZUlkKGVudGl0eTogUGFydGlhbDxUPiwgc3RhdGU6IEVudGl0eVN0YXRlTW9kZWw8YW55Pik6IHN0cmluZyB7XHJcbiAgICAgIGxldCBuZXh0SWQ7XHJcbiAgICAgIGRvIHtcclxuICAgICAgICBuZXh0SWQgPSB0aGlzLnV1aWR2NCgpO1xyXG4gICAgICB9IHdoaWxlICh0aGlzLmlzSWRJblN0YXRlKG5leHRJZCwgc3RhdGUpKTtcclxuICAgICAgcmV0dXJuIG5leHRJZDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHV1aWR2NCgpOiBzdHJpbmcge1xyXG4gICAgICAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjExNzUyM1xyXG4gICAgICByZXR1cm4gJ3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCcucmVwbGFjZSgvW3h5XS9nLCBmdW5jdGlvbihjKSB7XHJcbiAgICAgICAgY29uc3QgciA9IChNYXRoLnJhbmRvbSgpICogMTYpIHwgMDsgLy8gdHNsaW50OmRpc2FibGUtbGluZVxyXG4gICAgICAgIGNvbnN0IHYgPSBjID09PSAneCcgPyByIDogKHIgJiAweDMpIHwgMHg4OyAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lXHJcbiAgICAgICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGV4cG9ydCBjbGFzcyBFbnRpdHlJZEdlbmVyYXRvcjxUPiBleHRlbmRzIElkR2VuZXJhdG9yPFQ+IHtcclxuICAgIGNvbnN0cnVjdG9yKGlkS2V5OiBrZXlvZiBUKSB7XHJcbiAgICAgIHN1cGVyKGlkS2V5KTtcclxuICAgIH1cclxuXHJcbiAgICBnZW5lcmF0ZUlkKGVudGl0eTogUGFydGlhbDxUPiwgc3RhdGU6IEVudGl0eVN0YXRlTW9kZWw8YW55Pik6IHN0cmluZyB7XHJcbiAgICAgIGNvbnN0IGlkID0gdGhpcy5tdXN0R2V0SWRPZihlbnRpdHkpO1xyXG4gICAgICBpZiAodGhpcy5pc0lkSW5TdGF0ZShpZCwgc3RhdGUpKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IFVuYWJsZVRvR2VuZXJhdGVJZEVycm9yKGBUaGUgcHJvdmlkZWQgSUQgYWxyZWFkeSBleGlzdHM6ICR7aWR9YCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGlkO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=