UNPKG

ngx-store

Version:

Angular decorators to automagically keep variables in HTML5 LocalStorage, SessionStorage, cookies; injectable services for managing and listening to data changes and a bit more.

157 lines 14.2 kB
import { Config } from '../config/config'; const _get = require('lodash.get'); const _set = require('lodash.set'); const _merge = require('lodash.merge'); export class Resource { constructor(service, key) { this.service = service; this.key = key; this._defaultValue = null; this._path = []; this._prefix = Config.prefix; } /** * Returns default value * @returns {T} */ get defaultValue() { return this._defaultValue; } /** * Returns current path as a string * @returns {string} */ get path() { return this.pathString; } /** * Returns currently set prefix * @returns {string} */ get prefix() { return this._prefix || ''; } /** * Returns value taking path into account * @returns {T} */ get value() { return this.considerDefault(this.readValue()); } get fullValue() { return this.considerDefault(this.service.utility.get(this.key, { prefix: this._prefix })); } get pathString() { return this._path.join('.'); } /** * Sets path of object property * @param {string} path * @returns {this} */ setPath(path) { this._path = path.split('.'); return this; } /** * Appends current path * e.g. if path('key') and appendPath('nested'), the path will be "key.nested" * @param {string} path * @returns {this} */ appendPath(path) { this._path.push(path); return this; } /** * Removes last item of path * e.g. if path('key.nested') and truncatePath(), the path will be "key" * @returns {this} */ truncatePath() { this._path.pop(); return this; } /** * Resets set path * @returns {this} */ resetPath() { this._path = []; return this; } /** * Sets prefix * @param {string} prefix * @returns {this} */ setPrefix(prefix) { this._prefix = prefix; return this; } /** * Moves storage item to new key using given prefix * @param {string} prefix * @returns {this} */ changePrefix(prefix) { this.service.utility.set(this.key, this.fullValue, { prefix }); this.service.utility.remove(this.key, { prefix: this._prefix }); return this.setPrefix(prefix); } /** * Sets default value for both reading and saving operations * @param defaultValue * @returns {this} */ setDefaultValue(defaultValue) { this._defaultValue = defaultValue; const value = this.readValue(); if (this.isNullOrUndefined(value)) { this.save(defaultValue); } return this; } /** * Creates or overrides value as a new entry or existing object property depending on path * @param value * @returns {this} */ save(value) { if (this.pathString) { value = _set(this.fullValue, this.pathString, this.considerDefault(value)); } this.service.utility.set(this.key, this.considerDefault(value), { prefix: this._prefix }); return this; } /** * Updates existing object property using current path * @param {T} value * @returns {this} */ update(value) { return this.save(_merge(this.readValue(), value)); } /** * Removes item stored under current key * @returns {this} */ remove() { this.service.utility.remove(this.key); return this; } considerDefault(value) { return this.isNullOrUndefined(value) ? this._defaultValue : value; } isNullOrUndefined(value) { return (value === null || value === undefined); } readValue() { const value = this.service.utility.get(this.key, { prefix: this._prefix }); if (this.pathString) { return _get(value, this.pathString); } return value; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc3RvcmUvc3JjL2xpYi9zZXJ2aWNlL3Jlc291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUUxQyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDbkMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQ25DLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUV2QyxNQUFNLE9BQU8sUUFBUTtJQUNuQixZQUFzQixPQUEwQixFQUFxQixHQUFXO1FBQTFELFlBQU8sR0FBUCxPQUFPLENBQW1CO1FBQXFCLFFBQUcsR0FBSCxHQUFHLENBQVE7UUFHdEUsa0JBQWEsR0FBUSxJQUFJLENBQUM7UUFVMUIsVUFBSyxHQUFrQixFQUFFLENBQUM7UUFVMUIsWUFBTyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUF0QmxDLENBQUM7SUFJRDs7O09BR0c7SUFDSCxJQUFXLFlBQVk7UUFDckIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzVCLENBQUM7SUFJRDs7O09BR0c7SUFDSCxJQUFXLElBQUk7UUFDYixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztJQUlEOzs7T0FHRztJQUNILElBQVcsTUFBTTtRQUNmLE9BQU8sSUFBSSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQVcsS0FBSztRQUNkLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQsSUFBYyxTQUFTO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENB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QyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFUyxlQUFlLENBQUksS0FBUTtRQUNuQyxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ3BFLENBQUM7SUFFUyxpQkFBaUIsQ0FBQyxLQUFVO1FBQ3BDLE9BQU8sQ0FBQyxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRVMsU0FBUztRQUNqQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFDLENBQUMsQ0FBQztRQUN6RSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDbkIsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUNyQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV2ViU3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuL3dlYnN0b3JhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBDb25maWcgfSBmcm9tICcuLi9jb25maWcvY29uZmlnJztcblxuY29uc3QgX2dldCA9IHJlcXVpcmUoJ2xvZGFzaC5nZXQnKTtcbmNvbnN0IF9zZXQgPSByZXF1aXJlKCdsb2Rhc2guc2V0Jyk7XG5jb25zdCBfbWVyZ2UgPSByZXF1aXJlKCdsb2Rhc2gubWVyZ2UnKTtcblxuZXhwb3J0IGNsYXNzIFJlc291cmNlPFQ+IHtcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIHNlcnZpY2U6IFdlYlN0b3JhZ2VTZXJ2aWNlLCBwcm90ZWN0ZWQgcmVhZG9ubHkga2V5OiBzdHJpbmcpIHtcbiAgfVxuXG4gIHByb3RlY3RlZCBfZGVmYXVsdFZhbHVlOiBhbnkgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGRlZmF1bHQgdmFsdWVcbiAgICogQHJldHVybnMge1R9XG4gICAqL1xuICBwdWJsaWMgZ2V0IGRlZmF1bHRWYWx1ZSgpOiBUIHtcbiAgICByZXR1cm4gdGhpcy5fZGVmYXVsdFZhbHVlO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9wYXRoOiBBcnJheTxzdHJpbmc+ID0gW107XG5cbiAgLyoqXG4gICAqIFJldHVybnMgY3VycmVudCBwYXRoIGFzIGEgc3RyaW5nXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYXRoU3RyaW5nO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9wcmVmaXggPSBDb25maWcucHJlZml4O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGN1cnJlbnRseSBzZXQgcHJlZml4XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBwdWJsaWMgZ2V0IHByZWZpeCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9wcmVmaXggfHwgJyc7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB2YWx1ZSB0YWtpbmcgcGF0aCBpbnRvIGFjY291bnRcbiAgICogQHJldHVybnMge1R9XG4gICAqL1xuICBwdWJsaWMgZ2V0IHZhbHVlKCk6IFQge1xuICAgIHJldHVybiB0aGlzLmNvbnNpZGVyRGVmYXVsdCh0aGlzLnJlYWRWYWx1ZSgpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgZnVsbFZhbHVlKCk6IFQge1xuICAgIHJldHVybiB0aGlzLmNvbnNpZGVyRGVmYXVsdCh0aGlzLnNlcnZpY2UudXRpbGl0eS5nZXQodGhpcy5rZXksIHtwcmVmaXg6IHRoaXMuX3ByZWZpeH0pKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgcGF0aFN0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9wYXRoLmpvaW4oJy4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHBhdGggb2Ygb2JqZWN0IHByb3BlcnR5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEByZXR1cm5zIHt0aGlzfVxuICAgKi9cbiAgcHVibGljIHNldFBhdGgocGF0aDogc3RyaW5nKTogdGhpcyB7XG4gICAgdGhpcy5fcGF0aCA9IHBhdGguc3BsaXQoJy4nKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBlbmRzIGN1cnJlbnQgcGF0aFxuICAgKiBlLmcuIGlmIHBhdGgoJ2tleScpIGFuZCBhcHBlbmRQYXRoKCduZXN0ZWQnKSwgdGhlIHBhdGggd2lsbCBiZSBcImtleS5uZXN0ZWRcIlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcmV0dXJucyB7dGhpc31cbiAgICovXG4gIHB1YmxpYyBhcHBlbmRQYXRoKHBhdGg6IHN0cmluZyk6IHRoaXMge1xuICAgIHRoaXMuX3BhdGgucHVzaChwYXRoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGxhc3QgaXRlbSBvZiBwYXRoXG4gICAqIGUuZy4gaWYgcGF0aCgna2V5Lm5lc3RlZCcpIGFuZCB0cnVuY2F0ZVBhdGgoKSwgdGhlIHBhdGggd2lsbCBiZSBcImtleVwiXG4gICAqIEByZXR1cm5zIHt0aGlzfVxuICAgKi9cbiAgcHVibGljIHRydW5jYXRlUGF0aCgpOiB0aGlzIHtcbiAgICB0aGlzLl9wYXRoLnBvcCgpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0cyBzZXQgcGF0aFxuICAgKiBAcmV0dXJucyB7dGhpc31cbiAgICovXG4gIHB1YmxpYyByZXNldFBhdGgoKTogdGhpcyB7XG4gICAgdGhpcy5fcGF0aCA9IFtdO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgcHJlZml4XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXhcbiAgICogQHJldHVybnMge3RoaXN9XG4gICAqL1xuICBwdWJsaWMgc2V0UHJlZml4KHByZWZpeDogc3RyaW5nKTogdGhpcyB7XG4gICAgdGhpcy5fcHJlZml4ID0gcHJlZml4O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdmVzIHN0b3JhZ2UgaXRlbSB0byBuZXcga2V5IHVzaW5nIGdpdmVuIHByZWZpeFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4XG4gICAqIEByZXR1cm5zIHt0aGlzfVxuICAgKi9cbiAgcHVibGljIGNoYW5nZVByZWZpeChwcmVmaXg6IHN0cmluZyk6IHRoaXMge1xuICAgIHRoaXMuc2VydmljZS51dGlsaXR5LnNldCh0aGlzLmtleSwgdGhpcy5mdWxsVmFsdWUsIHtwcmVmaXh9KTtcbiAgICB0aGlzLnNlcnZpY2UudXRpbGl0eS5yZW1vdmUodGhpcy5rZXksIHtwcmVmaXg6IHRoaXMuX3ByZWZpeH0pO1xuICAgIHJldHVybiB0aGlzLnNldFByZWZpeChwcmVmaXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgZGVmYXVsdCB2YWx1ZSBmb3IgYm90aCByZWFkaW5nIGFuZCBzYXZpbmcgb3BlcmF0aW9uc1xuICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlXG4gICAqIEByZXR1cm5zIHt0aGlzfVxuICAgKi9cbiAgcHVibGljIHNldERlZmF1bHRWYWx1ZShkZWZhdWx0VmFsdWU6IFQpOiB0aGlzIHtcbiAgICB0aGlzLl9kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLnJlYWRWYWx1ZSgpO1xuICAgIGlmICh0aGlzLmlzTnVsbE9yVW5kZWZpbmVkKHZhbHVlKSkge1xuICAgICAgdGhpcy5zYXZlKGRlZmF1bHRWYWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgb3Igb3ZlcnJpZGVzIHZhbHVlIGFzIGEgbmV3IGVudHJ5IG9yIGV4aXN0aW5nIG9iamVjdCBwcm9wZXJ0eSBkZXBlbmRpbmcgb24gcGF0aFxuICAgKiBAcGFyYW0gdmFsdWVcbiAgICogQHJldHVybnMge3RoaXN9XG4gICAqL1xuICBwdWJsaWMgc2F2ZSh2YWx1ZTogVCk6IHRoaXMge1xuICAgIGlmICh0aGlzLnBhdGhTdHJpbmcpIHtcbiAgICAgIHZhbHVlID0gX3NldCh0aGlzLmZ1bGxWYWx1ZSBhcyBhbnkgYXMgb2JqZWN0LCB0aGlzLnBhdGhTdHJpbmcsIHRoaXMuY29uc2lkZXJEZWZhdWx0KHZhbHVlKSkgYXMgYW55IGFzIFQ7XG4gICAgfVxuICAgIHRoaXMuc2VydmljZS51dGlsaXR5LnNldCh0aGlzLmtleSwgdGhpcy5jb25zaWRlckRlZmF1bHQodmFsdWUpLCB7cHJlZml4OiB0aGlzLl9wcmVmaXh9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIGV4aXN0aW5nIG9iamVjdCBwcm9wZXJ0eSB1c2luZyBjdXJyZW50IHBhdGhcbiAgICogQHBhcmFtIHtUfSB2YWx1ZVxuICAgKiBAcmV0dXJucyB7dGhpc31cbiAgICovXG4gIHB1YmxpYyB1cGRhdGUodmFsdWU6IFQpOiB0aGlzIHtcbiAgICByZXR1cm4gdGhpcy5zYXZlKF9tZXJnZSh0aGlzLnJlYWRWYWx1ZSgpLCB2YWx1ZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgaXRlbSBzdG9yZWQgdW5kZXIgY3VycmVudCBrZXlcbiAgICogQHJldHVybnMge3RoaXN9XG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlKCk6IHRoaXMge1xuICAgIHRoaXMuc2VydmljZS51dGlsaXR5LnJlbW92ZSh0aGlzLmtleSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwcm90ZWN0ZWQgY29uc2lkZXJEZWZhdWx0PFM+KHZhbHVlOiBTKTogUyB7XG4gICAgcmV0dXJuIHRoaXMuaXNOdWxsT3JVbmRlZmluZWQodmFsdWUpID8gdGhpcy5fZGVmYXVsdFZhbHVlIDogdmFsdWU7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNOdWxsT3JVbmRlZmluZWQodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVhZFZhbHVlKCk6IFQge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5zZXJ2aWNlLnV0aWxpdHkuZ2V0KHRoaXMua2V5LCB7cHJlZml4OiB0aGlzLl9wcmVmaXh9KTtcbiAgICBpZiAodGhpcy5wYXRoU3RyaW5nKSB7XG4gICAgICByZXR1cm4gX2dldCh2YWx1ZSwgdGhpcy5wYXRoU3RyaW5nKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG4iXX0=