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