@ngxs-labs/entity-state
Version:
<p align="center"> <img src="https://raw.githubusercontent.com/ngxs-labs/emitter/master/docs/assets/logo.png"> </p>
82 lines • 9.36 kB
JavaScript
import { NoActiveEntityError } from './errors';
export const NGXS_META_KEY = 'NGXS_META';
/**
* This function generates a new object for the ngxs Action with the given fn name
* @param fn The name of the Action to simulate, e.g. "Remove" or "Update"
* @param store The class of the targeted entity state, e.g. ZooState
* @param payload The payload for the created action object
*/
export function generateActionObject(fn, store, payload) {
const name = store[NGXS_META_KEY].path;
const ReflectedAction = function (data) {
this.payload = data;
};
const obj = new ReflectedAction(payload);
Reflect.getPrototypeOf(obj).constructor['type'] = `[${name}] ${fn}`;
return obj;
}
/**
* Utility function that returns the active entity of the given state
* @param state the state of an entity state
*/
export function getActive(state) {
return state.entities[state.active];
}
/**
* Returns the active entity. If none is present an error will be thrown.
* @param state The state to act on
*/
export function mustGetActive(state) {
const active = getActive(state);
if (active === undefined) {
throw new NoActiveEntityError();
}
return { id: state.active, active };
}
/**
* Undefined-safe function to access the property given by path parameter
* @param object The object to read from
* @param path The path to the property
*/
export function elvis(object, path) {
return path ? path.split('.').reduce((value, key) => value && value[key], object) : object;
}
/**
* Returns input as an array if it isn't one already
* @param input The input to make an array if necessary
*/
export function asArray(input) {
return Array.isArray(input) ? input : [input];
}
/**
* Limits a number to the given boundaries
* @param value The input value
* @param min The minimum value
* @param max The maximum value
*/
function clamp(value, min, max) {
return Math.min(max, Math.max(min, value));
}
/**
* Uses the clamp function is wrap is false.
* Else it wrap to the max or min value respectively.
* @param wrap Flag to indicate if value should be wrapped
* @param value The input value
* @param min The minimum value
* @param max The maximum value
*/
export function wrapOrClamp(wrap, value, min, max) {
if (!wrap) {
return clamp(value, min, max);
}
else if (value < min) {
return max;
}
else if (value > max) {
return min;
}
else {
return value;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJuYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2ludGVybmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQVcvQyxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsV0FBVyxDQUFDO0FBRXpDOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUNsQyxFQUFVLEVBQ1YsS0FBMkIsRUFDM0IsT0FBYTtJQUViLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDdkMsTUFBTSxlQUFlLEdBQUcsVUFBUyxJQUFPO1FBQ3RDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQ3RCLENBQUMsQ0FBQztJQUNGLE1BQU0sR0FBRyxHQUFHLElBQUksZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3pDLE9BQU8sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksSUFBSSxLQUFLLEVBQUUsRUFBRSxDQUFDO0lBQ3BFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUksS0FBMEI7SUFDckQsT0FBTyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUN0QyxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBSSxLQUEwQjtJQUN6RCxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEMsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFO1FBQ3hCLE1BQU0sSUFBSSxtQkFBbUIsRUFBRSxDQUFDO0tBQ2pDO0lBQ0QsT0FBTyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQ3RDLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLEtBQUssQ0FBQyxNQUFXLEVBQUUsSUFBWTtJQUM3QyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDN0YsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSxPQUFPLENBQUksS0FBYztJQUN2QyxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNoRCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLEtBQUssQ0FBQyxLQUFhLEVBQUUsR0FBVyxFQUFFLEdBQVc7SUFDcEQsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQzdDLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FBQyxJQUFhLEVBQUUsS0FBYSxFQUFFLEdBQVcsRUFBRSxHQUFXO0lBQ2hGLElBQUksQ0FBQyxJQUFJLEVBQUU7UUFDVCxPQUFPLEtBQUssQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0tBQy9CO1NBQU0sSUFBSSxLQUFLLEdBQUcsR0FBRyxFQUFFO1FBQ3RCLE9BQU8sR0FBRyxDQUFDO0tBQ1o7U0FBTSxJQUFJLEtBQUssR0FBRyxHQUFHLEVBQUU7UUFDdEIsT0FBTyxHQUFHLENBQUM7S0FDWjtTQUFNO1FBQ0wsT0FBTyxLQUFLLENBQUM7S0FDZDtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbnRpdHlTdGF0ZSB9IGZyb20gJy4vZW50aXR5LXN0YXRlJztcclxuaW1wb3J0IHsgVHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBOb0FjdGl2ZUVudGl0eUVycm9yIH0gZnJvbSAnLi9lcnJvcnMnO1xyXG5pbXBvcnQgeyBFbnRpdHlTdGF0ZU1vZGVsIH0gZnJvbSAnLi9tb2RlbHMnO1xyXG5cclxuLyoqXHJcbiAqIFR5cGUgYWxpYXMgZm9yIGFuIG9iamVjdCBsaXRlcmFsLlxyXG4gKiBPbmx5IGFsbG93cyBzdHJpbmdzIGFzIGtleXMuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIERpY3Rpb25hcnk8VD4ge1xyXG4gIFtrZXk6IHN0cmluZ106IFQ7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBOR1hTX01FVEFfS0VZID0gJ05HWFNfTUVUQSc7XHJcblxyXG4vKipcclxuICogVGhpcyBmdW5jdGlvbiBnZW5lcmF0ZXMgYSBuZXcgb2JqZWN0IGZvciB0aGUgbmd4cyBBY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gZm4gbmFtZVxyXG4gKiBAcGFyYW0gZm4gVGhlIG5hbWUgb2YgdGhlIEFjdGlvbiB0byBzaW11bGF0ZSwgZS5nLiBcIlJlbW92ZVwiIG9yIFwiVXBkYXRlXCJcclxuICogQHBhcmFtIHN0b3JlIFRoZSBjbGFzcyBvZiB0aGUgdGFyZ2V0ZWQgZW50aXR5IHN0YXRlLCBlLmcuIFpvb1N0YXRlXHJcbiAqIEBwYXJhbSBwYXlsb2FkIFRoZSBwYXlsb2FkIGZvciB0aGUgY3JlYXRlZCBhY3Rpb24gb2JqZWN0XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVBY3Rpb25PYmplY3Q8VD4oXHJcbiAgZm46IHN0cmluZyxcclxuICBzdG9yZTogVHlwZTxFbnRpdHlTdGF0ZTxUPj4sXHJcbiAgcGF5bG9hZD86IGFueVxyXG4pIHtcclxuICBjb25zdCBuYW1lID0gc3RvcmVbTkdYU19NRVRBX0tFWV0ucGF0aDtcclxuICBjb25zdCBSZWZsZWN0ZWRBY3Rpb24gPSBmdW5jdGlvbihkYXRhOiBUKSB7XHJcbiAgICB0aGlzLnBheWxvYWQgPSBkYXRhO1xyXG4gIH07XHJcbiAgY29uc3Qgb2JqID0gbmV3IFJlZmxlY3RlZEFjdGlvbihwYXlsb2FkKTtcclxuICBSZWZsZWN0LmdldFByb3RvdHlwZU9mKG9iaikuY29uc3RydWN0b3JbJ3R5cGUnXSA9IGBbJHtuYW1lfV0gJHtmbn1gO1xyXG4gIHJldHVybiBvYmo7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBVdGlsaXR5IGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgYWN0aXZlIGVudGl0eSBvZiB0aGUgZ2l2ZW4gc3RhdGVcclxuICogQHBhcmFtIHN0YXRlIHRoZSBzdGF0ZSBvZiBhbiBlbnRpdHkgc3RhdGVcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRBY3RpdmU8VD4oc3RhdGU6IEVudGl0eVN0YXRlTW9kZWw8VD4pOiBUIHtcclxuICByZXR1cm4gc3RhdGUuZW50aXRpZXNbc3RhdGUuYWN0aXZlXTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIGFjdGl2ZSBlbnRpdHkuIElmIG5vbmUgaXMgcHJlc2VudCBhbiBlcnJvciB3aWxsIGJlIHRocm93bi5cclxuICogQHBhcmFtIHN0YXRlIFRoZSBzdGF0ZSB0byBhY3Qgb25cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBtdXN0R2V0QWN0aXZlPFQ+KHN0YXRlOiBFbnRpdHlTdGF0ZU1vZGVsPFQ+KTogeyBpZDogc3RyaW5nOyBhY3RpdmU6IFQgfSB7XHJcbiAgY29uc3QgYWN0aXZlID0gZ2V0QWN0aXZlKHN0YXRlKTtcclxuICBpZiAoYWN0aXZlID09PSB1bmRlZmluZWQpIHtcclxuICAgIHRocm93IG5ldyBOb0FjdGl2ZUVudGl0eUVycm9yKCk7XHJcbiAgfVxyXG4gIHJldHVybiB7IGlkOiBzdGF0ZS5hY3RpdmUsIGFjdGl2ZSB9O1xyXG59XHJcblxyXG4vKipcclxuICogVW5kZWZpbmVkLXNhZmUgZnVuY3Rpb24gdG8gYWNjZXNzIHRoZSBwcm9wZXJ0eSBnaXZlbiBieSBwYXRoIHBhcmFtZXRlclxyXG4gKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcmVhZCBmcm9tXHJcbiAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIHRvIHRoZSBwcm9wZXJ0eVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGVsdmlzKG9iamVjdDogYW55LCBwYXRoOiBzdHJpbmcpOiBhbnkgfCB1bmRlZmluZWQge1xyXG4gIHJldHVybiBwYXRoID8gcGF0aC5zcGxpdCgnLicpLnJlZHVjZSgodmFsdWUsIGtleSkgPT4gdmFsdWUgJiYgdmFsdWVba2V5XSwgb2JqZWN0KSA6IG9iamVjdDtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgaW5wdXQgYXMgYW4gYXJyYXkgaWYgaXQgaXNuJ3Qgb25lIGFscmVhZHlcclxuICogQHBhcmFtIGlucHV0IFRoZSBpbnB1dCB0byBtYWtlIGFuIGFycmF5IGlmIG5lY2Vzc2FyeVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGFzQXJyYXk8VD4oaW5wdXQ6IFQgfCBUW10pOiBUW10ge1xyXG4gIHJldHVybiBBcnJheS5pc0FycmF5KGlucHV0KSA/IGlucHV0IDogW2lucHV0XTtcclxufVxyXG5cclxuLyoqXHJcbiAqIExpbWl0cyBhIG51bWJlciB0byB0aGUgZ2l2ZW4gYm91bmRhcmllc1xyXG4gKiBAcGFyYW0gdmFsdWUgVGhlIGlucHV0IHZhbHVlXHJcbiAqIEBwYXJhbSBtaW4gVGhlIG1pbmltdW0gdmFsdWVcclxuICogQHBhcmFtIG1heCBUaGUgbWF4aW11bSB2YWx1ZVxyXG4gKi9cclxuZnVuY3Rpb24gY2xhbXAodmFsdWU6IG51bWJlciwgbWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogbnVtYmVyIHtcclxuICByZXR1cm4gTWF0aC5taW4obWF4LCBNYXRoLm1heChtaW4sIHZhbHVlKSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBVc2VzIHRoZSBjbGFtcCBmdW5jdGlvbiBpcyB3cmFwIGlzIGZhbHNlLlxyXG4gKiBFbHNlIGl0IHdyYXAgdG8gdGhlIG1heCBvciBtaW4gdmFsdWUgcmVzcGVjdGl2ZWx5LlxyXG4gKiBAcGFyYW0gd3JhcCBGbGFnIHRvIGluZGljYXRlIGlmIHZhbHVlIHNob3VsZCBiZSB3cmFwcGVkXHJcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgaW5wdXQgdmFsdWVcclxuICogQHBhcmFtIG1pbiBUaGUgbWluaW11bSB2YWx1ZVxyXG4gKiBAcGFyYW0gbWF4IFRoZSBtYXhpbXVtIHZhbHVlXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gd3JhcE9yQ2xhbXAod3JhcDogYm9vbGVhbiwgdmFsdWU6IG51bWJlciwgbWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogbnVtYmVyIHtcclxuICBpZiAoIXdyYXApIHtcclxuICAgIHJldHVybiBjbGFtcCh2YWx1ZSwgbWluLCBtYXgpO1xyXG4gIH0gZWxzZSBpZiAodmFsdWUgPCBtaW4pIHtcclxuICAgIHJldHVybiBtYXg7XHJcbiAgfSBlbHNlIGlmICh2YWx1ZSA+IG1heCkge1xyXG4gICAgcmV0dXJuIG1pbjtcclxuICB9IGVsc2Uge1xyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG4gIH1cclxufVxyXG4iXX0=