@ngxs-labs/entity-state
Version:
This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 7.0.5.
180 lines • 13.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { InvalidIdOfError, UnableToGenerateIdError } from './errors';
export var IdStrategy;
(function (IdStrategy) {
/**
* @abstract
* @template T
*/
class IdGenerator {
/**
* @protected
* @param {?} idKey
*/
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
* @return {?}
*/
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.
* @see getIdOf / generateId
* @param {?} entity The entity to get the ID from
* @param {?} state The current state
* @return {?}
*/
getPresentIdOrGenerate(entity, state) {
/** @type {?} */
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.
* @see getIdOf / InvalidIdOfError
* @param {?} entity The entity to get the ID from
* @return {?}
*/
mustGetIdOf(entity) {
/** @type {?} */
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
* @return {?}
*/
getIdOf(entity) {
return entity[this.idKey];
}
}
IdStrategy.IdGenerator = IdGenerator;
if (false) {
/**
* @type {?}
* @protected
*/
IdGenerator.prototype.idKey;
/**
* Generates a completely new ID.
* The IdGenerator's implementation has to ensure that the generated ID does not exist in the current state.
* It can throw an UnableToGenerateIdError if it's unable to do so.
* @see getPresentIdOrGenerate / UnableToGenerateIdError
* @abstract
* @param {?} entity The entity to generate an ID for
* @param {?} state The current state
* @return {?}
*/
IdGenerator.prototype.generateId = function (entity, state) { };
}
/**
* @template T
*/
class IncrementingIdGenerator extends IdGenerator {
/**
* @param {?} idKey
*/
constructor(idKey) {
super(idKey);
}
/**
* @param {?} entity
* @param {?} state
* @return {?}
*/
generateId(entity, state) {
/** @type {?} */
const max = Math.max(-1, ...state.ids.map((/**
* @param {?} id
* @return {?}
*/
id => parseInt(id, 10))));
return (max + 1).toString(10);
}
}
IdStrategy.IncrementingIdGenerator = IncrementingIdGenerator;
/**
* @template T
*/
class UUIDGenerator extends IdGenerator {
/**
* @param {?} idKey
*/
constructor(idKey) {
super(idKey);
}
/**
* @param {?} entity
* @param {?} state
* @return {?}
*/
generateId(entity, state) {
/** @type {?} */
let nextId;
do {
nextId = this.uuidv4();
} while (this.isIdInState(nextId, state));
return nextId;
}
/**
* @private
* @return {?}
*/
uuidv4() {
// https://stackoverflow.com/a/2117523
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (/**
* @param {?} c
* @return {?}
*/
function (c) {
/** @type {?} */
const r = (Math.random() * 16) | 0;
// tslint:disable-line
/** @type {?} */
const v = c === 'x' ? r : (r & 0x3) | 0x8;
return v.toString(16);
}));
}
}
IdStrategy.UUIDGenerator = UUIDGenerator;
/**
* @template T
*/
class EntityIdGenerator extends IdGenerator {
/**
* @param {?} idKey
*/
constructor(idKey) {
super(idKey);
}
/**
* @param {?} entity
* @param {?} state
* @return {?}
*/
generateId(entity, state) {
/** @type {?} */
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWQtc3RyYXRlZ3kuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Abmd4cy1sYWJzL2VudGl0eS1zdGF0ZS8iLCJzb3VyY2VzIjpbImxpYi9pZC1zdHJhdGVneS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQ0EsT0FBTyxFQUFFLGdCQUFnQixFQUFFLHVCQUF1QixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRXJFLE1BQU0sS0FBVyxVQUFVLENBMkcxQjtBQTNHRCxXQUFpQixVQUFVOzs7OztJQUN6QixNQUFzQixXQUFXOzs7OztRQUMvQixZQUF5QyxLQUFjO1lBQWQsVUFBSyxHQUFMLEtBQUssQ0FBUztRQUFHLENBQUM7Ozs7Ozs7UUFrQjNELFdBQVcsQ0FBQyxFQUFVLEVBQUUsS0FBNEI7WUFDbEQsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNoQyxDQUFDOzs7Ozs7Ozs7UUFVRCxzQkFBc0IsQ0FBQyxNQUFrQixFQUFFLEtBQTRCOztrQkFDL0QsU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO1lBQ3RDLE9BQU8sU0FBUyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUM5RSxDQUFDOzs7Ozs7O1FBUUQsV0FBVyxDQUFDLE1BQVc7O2tCQUNmLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztZQUMvQixJQUFJLEVBQUUsS0FBSyxTQUFTLEVBQUU7Z0JBQ3BCLE1BQU0sSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO2FBQzlCO1lBQ0QsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDOzs7Ozs7UUFNRCxPQUFPLENBQUMsTUFBVztZQUNqQixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUIsQ0FBQztLQUNGO0lBekRxQixzQkFBVyxjQXlEaEMsQ0FBQTs7Ozs7O1FBeER1Qiw0QkFBaUM7Ozs7Ozs7Ozs7O1FBV3ZELGdFQUE4RTs7Ozs7SUErQ2hGLE1BQWEsdUJBQTJCLFNBQVEsV0FBYzs7OztRQUM1RCxZQUFZLEtBQWM7WUFDeEIsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2YsQ0FBQzs7Ozs7O1FBRUQsVUFBVSxDQUFDLE1BQWtCLEVBQUUsS0FBNEI7O2tCQUNuRCxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRzs7OztZQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBQyxDQUFDO1lBQ2xFLE9BQU8sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2hDLENBQUM7S0FDRjtJQVRZLGtDQUF1QiwwQkFTbkMsQ0FBQTs7OztJQUVELE1BQWEsYUFBaUIsU0FBUSxXQUFjOzs7O1FBQ2xELFlBQVksS0FBYztZQUN4QixLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDZixDQUFDOzs7Ozs7UUFFRCxVQUFVLENBQUMsTUFBa0IsRUFBRSxLQUE0Qjs7Z0JBQ3JELE1BQU07WUFDVixHQUFHO2dCQUNELE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7YUFDeEIsUUFBUSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBRTtZQUMxQyxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDOzs7OztRQUVPLE1BQU07WUFDWixzQ0FBc0M7WUFDdEMsT0FBTyxzQ0FBc0MsQ0FBQyxPQUFPLENBQUMsT0FBTzs7OztZQUFFLFVBQVMsQ0FBQzs7c0JBQ2pFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDOzs7c0JBQzVCLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUc7Z0JBQ3pDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN4QixDQUFDLEVBQUMsQ0FBQztRQUNMLENBQUM7S0FDRjtJQXJCWSx3QkFBYSxnQkFxQnpCLENBQUE7Ozs7SUFFRCxNQUFhLGlCQUFxQixTQUFRLFdBQWM7Ozs7UUFDdEQsWUFBWSxLQUFjO1lBQ3hCLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNmLENBQUM7Ozs7OztRQUVELFVBQVUsQ0FBQyxNQUFrQixFQUFFLEtBQTRCOztrQkFDbkQsRUFBRSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDO1lBQ25DLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUU7Z0JBQy9CLE1BQU0sSUFBSSx1QkFBdUIsQ0FBQyxtQ0FBbUMsRUFBRSxFQUFFLENBQUMsQ0FBQzthQUM1RTtZQUNELE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztLQUNGO0lBWlksNEJBQWlCLG9CQVk3QixDQUFBO0FBQ0gsQ0FBQyxFQTNHZ0IsVUFBVSxLQUFWLFVBQVUsUUEyRzFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW50aXR5U3RhdGVNb2RlbCB9IGZyb20gJy4vbW9kZWxzJztcbmltcG9ydCB7IEludmFsaWRJZE9mRXJyb3IsIFVuYWJsZVRvR2VuZXJhdGVJZEVycm9yIH0gZnJvbSAnLi9lcnJvcnMnO1xuXG5leHBvcnQgbmFtZXNwYWNlIElkU3RyYXRlZ3kge1xuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgSWRHZW5lcmF0b3I8VD4ge1xuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcmVhZG9ubHkgaWRLZXk6IGtleW9mIFQpIHt9XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgYSBjb21wbGV0ZWx5IG5ldyBJRC5cbiAgICAgKiBUaGUgSWRHZW5lcmF0b3IncyBpbXBsZW1lbnRhdGlvbiBoYXMgdG8gZW5zdXJlIHRoYXQgdGhlIGdlbmVyYXRlZCBJRCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgY3VycmVudCBzdGF0ZS5cbiAgICAgKiBJdCBjYW4gdGhyb3cgYW4gVW5hYmxlVG9HZW5lcmF0ZUlkRXJyb3IgaWYgaXQncyB1bmFibGUgdG8gZG8gc28uXG4gICAgICogQHBhcmFtIGVudGl0eSBUaGUgZW50aXR5IHRvIGdlbmVyYXRlIGFuIElEIGZvclxuICAgICAqIEBwYXJhbSBzdGF0ZSBUaGUgY3VycmVudCBzdGF0ZVxuICAgICAqIEBzZWUgZ2V0UHJlc2VudElkT3JHZW5lcmF0ZVxuICAgICAqIEBzZWUgVW5hYmxlVG9HZW5lcmF0ZUlkRXJyb3JcbiAgICAgKi9cbiAgICBhYnN0cmFjdCBnZW5lcmF0ZUlkKGVudGl0eTogUGFydGlhbDxUPiwgc3RhdGU6IEVudGl0eVN0YXRlTW9kZWw8YW55Pik6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gaWQgaXMgaW4gdGhlIHN0YXRlJ3MgSUQgYXJyYXlcbiAgICAgKiBAcGFyYW0gaWQgdGhlIElEIHRvIGNoZWNrXG4gICAgICogQHBhcmFtIHN0YXRlIHRoZSBjdXJyZW50IHN0YXRlXG4gICAgICovXG4gICAgaXNJZEluU3RhdGUoaWQ6IHN0cmluZywgc3RhdGU6IEVudGl0eVN0YXRlTW9kZWw8YW55Pik6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHN0YXRlLmlkcy5pbmNsdWRlcyhpZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiB0cmllcyB0byBnZXQgdGhlIHByZXNlbnQgSUQgb2YgdGhlIGdpdmVuIGVudGl0eSB3aXRoICNnZXRJZE9mLlxuICAgICAqIElmIGl0J3MgdW5kZWZpbmVkIHRoZSAjZ2VuZXJhdGVJZCBmdW5jdGlvbiB3aWxsIGJlIHVzZWQuXG4gICAgICogQHBhcmFtIGVudGl0eSBUaGUgZW50aXR5IHRvIGdldCB0aGUgSUQgZnJvbVxuICAgICAqIEBwYXJhbSBzdGF0ZSBUaGUgY3VycmVudCBzdGF0ZVxuICAgICAqIEBzZWUgZ2V0SWRPZlxuICAgICAqIEBzZWUgZ2VuZXJhdGVJZFxuICAgICAqL1xuICAgIGdldFByZXNlbnRJZE9yR2VuZXJhdGUoZW50aXR5OiBQYXJ0aWFsPFQ+LCBzdGF0ZTogRW50aXR5U3RhdGVNb2RlbDxhbnk+KTogc3RyaW5nIHtcbiAgICAgIGNvbnN0IHByZXNlbnRJZCA9IHRoaXMuZ2V0SWRPZihlbnRpdHkpO1xuICAgICAgcmV0dXJuIHByZXNlbnRJZCA9PT0gdW5kZWZpbmVkID8gdGhpcy5nZW5lcmF0ZUlkKGVudGl0eSwgc3RhdGUpIDogcHJlc2VudElkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgd3JhcHBlciBmb3IgI2dldElkT2YuIElmIHRoZSBmdW5jdGlvbiByZXR1cm5zIHVuZGVmaW5lZCBhbiBlcnJvciB3aWxsIGJlIHRocm93bi5cbiAgICAgKiBAcGFyYW0gZW50aXR5IFRoZSBlbnRpdHkgdG8gZ2V0IHRoZSBJRCBmcm9tXG4gICAgICogQHNlZSBnZXRJZE9mXG4gICAgICogQHNlZSBJbnZhbGlkSWRPZkVycm9yXG4gICAgICovXG4gICAgbXVzdEdldElkT2YoZW50aXR5OiBhbnkpOiBzdHJpbmcge1xuICAgICAgY29uc3QgaWQgPSB0aGlzLmdldElkT2YoZW50aXR5KTtcbiAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkSWRPZkVycm9yKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgSUQgZm9yIHRoZSBnaXZlbiBlbnRpdHkuIENhbiByZXR1cm4gdW5kZWZpbmVkLlxuICAgICAqIEBwYXJhbSBlbnRpdHkgVGhlIGVudGl0eSB0byBnZXQgdGhlIElEIGZyb21cbiAgICAgKi9cbiAgICBnZXRJZE9mKGVudGl0eTogYW55KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgIHJldHVybiBlbnRpdHlbdGhpcy5pZEtleV07XG4gICAgfVxuICB9XG5cbiAgZXhwb3J0IGNsYXNzIEluY3JlbWVudGluZ0lkR2VuZXJhdG9yPFQ+IGV4dGVuZHMgSWRHZW5lcmF0b3I8VD4ge1xuICAgIGNvbnN0cnVjdG9yKGlkS2V5OiBrZXlvZiBUKSB7XG4gICAgICBzdXBlcihpZEtleSk7XG4gICAgfVxuXG4gICAgZ2VuZXJhdGVJZChlbnRpdHk6IFBhcnRpYWw8VD4sIHN0YXRlOiBFbnRpdHlTdGF0ZU1vZGVsPGFueT4pOiBzdHJpbmcge1xuICAgICAgY29uc3QgbWF4ID0gTWF0aC5tYXgoLTEsIC4uLnN0YXRlLmlkcy5tYXAoaWQgPT4gcGFyc2VJbnQoaWQsIDEwKSkpO1xuICAgICAgcmV0dXJuIChtYXggKyAxKS50b1N0cmluZygxMCk7XG4gICAgfVxuICB9XG5cbiAgZXhwb3J0IGNsYXNzIFVVSURHZW5lcmF0b3I8VD4gZXh0ZW5kcyBJZEdlbmVyYXRvcjxUPiB7XG4gICAgY29uc3RydWN0b3IoaWRLZXk6IGtleW9mIFQpIHtcbiAgICAgIHN1cGVyKGlkS2V5KTtcbiAgICB9XG5cbiAgICBnZW5lcmF0ZUlkKGVudGl0eTogUGFydGlhbDxUPiwgc3RhdGU6IEVudGl0eVN0YXRlTW9kZWw8YW55Pik6IHN0cmluZyB7XG4gICAgICBsZXQgbmV4dElkO1xuICAgICAgZG8ge1xuICAgICAgICBuZXh0SWQgPSB0aGlzLnV1aWR2NCgpO1xuICAgICAgfSB3aGlsZSAodGhpcy5pc0lkSW5TdGF0ZShuZXh0SWQsIHN0YXRlKSk7XG4gICAgICByZXR1cm4gbmV4dElkO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXVpZHY0KCk6IHN0cmluZyB7XG4gICAgICAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjExNzUyM1xuICAgICAgcmV0dXJuICd4eHh4eHh4eC14eHh4LTR4eHgteXh4eC14eHh4eHh4eHh4eHgnLnJlcGxhY2UoL1t4eV0vZywgZnVuY3Rpb24oYykge1xuICAgICAgICBjb25zdCByID0gKE1hdGgucmFuZG9tKCkgKiAxNikgfCAwOyAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lXG4gICAgICAgIGNvbnN0IHYgPSBjID09PSAneCcgPyByIDogKHIgJiAweDMpIHwgMHg4OyAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lXG4gICAgICAgIHJldHVybiB2LnRvU3RyaW5nKDE2KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGV4cG9ydCBjbGFzcyBFbnRpdHlJZEdlbmVyYXRvcjxUPiBleHRlbmRzIElkR2VuZXJhdG9yPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihpZEtleToga2V5b2YgVCkge1xuICAgICAgc3VwZXIoaWRLZXkpO1xuICAgIH1cblxuICAgIGdlbmVyYXRlSWQoZW50aXR5OiBQYXJ0aWFsPFQ+LCBzdGF0ZTogRW50aXR5U3RhdGVNb2RlbDxhbnk+KTogc3RyaW5nIHtcbiAgICAgIGNvbnN0IGlkID0gdGhpcy5tdXN0R2V0SWRPZihlbnRpdHkpO1xuICAgICAgaWYgKHRoaXMuaXNJZEluU3RhdGUoaWQsIHN0YXRlKSkge1xuICAgICAgICB0aHJvdyBuZXcgVW5hYmxlVG9HZW5lcmF0ZUlkRXJyb3IoYFRoZSBwcm92aWRlZCBJRCBhbHJlYWR5IGV4aXN0czogJHtpZH1gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpZDtcbiAgICB9XG4gIH1cbn1cbiJdfQ==