UNPKG

@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
/** * @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==