UNPKG

@activejs/core

Version:

Pragmatic, Reactive State Management for JavaScript Apps

95 lines 11.2 kB
import { UnitBase } from './abstract-unit-base'; import { makeNonEnumerable } from '../utils/funcs'; import { Selection } from './selection'; /** * Base for non-primitive Units. * * - NonPrimitiveUnitBase extends {@link UnitBase} * - Which further extends {@link Base} and `Observable` * * @category 2. Abstract */ export class NonPrimitiveUnitBase extends UnitBase { constructor(config) { super(config); makeNonEnumerable(this); } /** * Returns the names of the properties of the current {@link value} using `Object.keys`. \ * * In case of a GenericUnit, * if current {@link value} is null or undefined, it returns an empty `array`, \ * where `Object.keys` would have failed. * * @category Common List/Dict/Generic Units */ objectKeys() { return this.rawValue() == null ? [] : Object.keys(this.rawValue()); } /** * Returns an `array` of key/values of the properties of the current {@link value} using `Object.entries`. \ * * In case of a GenericUnit, * if current {@link value} is null or undefined, it returns an empty `array`, \ * where `Object.entries` would have failed. * * @category Common List/Dict/Generic Units */ objectEntries() { return this.rawValue() == null ? [] : Object.entries(this.value()); } /** * Returns an `array` of values of the properties of the current {@link value} using `Object.values`. \ * * In case of a GenericUnit, * if current {@link value} is null or undefined, it returns an empty `array`, \ * where `Object.values` would have failed. * * @category Common List/Dict/Generic Units */ objectValues() { return this.rawValue() == null ? [] : Object.values(this.value()); } // tslint:enable:max-line-length /** * Select a nested property at a certain path in the Unit's {@link value}. * It doesn't fail even if a value in middle of the path is undefined. * * It can be used to create an Observable to listen to changes in a nested property * using {@link Selection.asObservable} method. * * It provides static value access through the {@link Selection.value} method. * It can be helpful when the Unit is configured to be immutable, * as you only clone the nested property instead of the whole value. * * @example * ```typescript * // create a Unit * const unit = new DictUnit(); * * // create a selection * const selection = unit.select('a', 'b', 0); * // create an Observable * const selection$ = selection.asObservable(); * // subscribe to the selector * selection.subscribe(value => console.log(value)) // logs undefined immediately * * // dispatch a value * unit.dispatch({a: {b: ['hi', 'there']}}); * // 'hi' will get logged to the console * * // update a value on a different path * unit.set('c', 'other'); * // the selector won't be triggered by this * ``` * * @param path Property keys and indexes of the path you want to select. * @returns A {@link Selection} object of the selected property or path. * * @category Common List/Dict/Generic Units */ select(...path) { return new Selection(this, path); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3Qtbm9uLXByaW1pdGl2ZS11bml0LWJhc2UuanMiLCJzb3VyY2VSb290IjoiL2hvbWUvcnVubmVyL3dvcmsvYWN0aXZlanMvYWN0aXZlanMvcGFja2FnZXMvY29yZS9zcmMvIiwic291cmNlcyI6WyJsaWIvYWJzdHJhY3Qtbm9uLXByaW1pdGl2ZS11bml0LWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQzlDLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRWpELE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFdEM7Ozs7Ozs7R0FPRztBQUNILE1BQU0sT0FBZ0Isb0JBSXBCLFNBQVEsUUFBVztJQUNuQixZQUFzQixNQUFzQjtRQUMxQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFZCxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxVQUFVO1FBQ1IsT0FBTyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsYUFBYTtRQUNYLE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILFlBQVk7UUFDVixPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBZ0JELGdDQUFnQztJQUNoQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09Bb0NHO0lBQ0gsTUFBTSxDQUFDLEdBQUcsSUFBeUI7UUFDakMsT0FBTyxJQUFJLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDbkMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtVbml0QmFzZX0gZnJvbSAnLi9hYnN0cmFjdC11bml0LWJhc2UnO1xuaW1wb3J0IHttYWtlTm9uRW51bWVyYWJsZX0gZnJvbSAnLi4vdXRpbHMvZnVuY3MnO1xuaW1wb3J0IHtLT2YsIFVuaXRDb25maWd9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQge1NlbGVjdGlvbn0gZnJvbSAnLi9zZWxlY3Rpb24nO1xuXG4vKipcbiAqIEJhc2UgZm9yIG5vbi1wcmltaXRpdmUgVW5pdHMuXG4gKlxuICogLSBOb25QcmltaXRpdmVVbml0QmFzZSBleHRlbmRzIHtAbGluayBVbml0QmFzZX1cbiAqIC0gV2hpY2ggZnVydGhlciBleHRlbmRzIHtAbGluayBCYXNlfSBhbmQgYE9ic2VydmFibGVgXG4gKlxuICogQGNhdGVnb3J5IDIuIEFic3RyYWN0XG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBOb25QcmltaXRpdmVVbml0QmFzZTxcbiAgVCxcbiAgSyBleHRlbmRzIEtPZjxUPiA9IEtPZjxUPixcbiAgViBleHRlbmRzIFRbS10gPSBUW0tdXG4+IGV4dGVuZHMgVW5pdEJhc2U8VD4ge1xuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoY29uZmlnPzogVW5pdENvbmZpZzxUPikge1xuICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICBtYWtlTm9uRW51bWVyYWJsZSh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBuYW1lcyBvZiB0aGUgcHJvcGVydGllcyBvZiB0aGUgY3VycmVudCB7QGxpbmsgdmFsdWV9IHVzaW5nIGBPYmplY3Qua2V5c2AuIFxcXG4gICAqXG4gICAqIEluIGNhc2Ugb2YgYSBHZW5lcmljVW5pdCxcbiAgICogaWYgY3VycmVudCB7QGxpbmsgdmFsdWV9IGlzIG51bGwgb3IgdW5kZWZpbmVkLCBpdCByZXR1cm5zIGFuIGVtcHR5IGBhcnJheWAsIFxcXG4gICAqIHdoZXJlIGBPYmplY3Qua2V5c2Agd291bGQgaGF2ZSBmYWlsZWQuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBDb21tb24gTGlzdC9EaWN0L0dlbmVyaWMgVW5pdHNcbiAgICovXG4gIG9iamVjdEtleXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLnJhd1ZhbHVlKCkgPT0gbnVsbCA/IFtdIDogT2JqZWN0LmtleXModGhpcy5yYXdWYWx1ZSgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIGBhcnJheWAgb2Yga2V5L3ZhbHVlcyBvZiB0aGUgcHJvcGVydGllcyBvZiB0aGUgY3VycmVudCB7QGxpbmsgdmFsdWV9IHVzaW5nIGBPYmplY3QuZW50cmllc2AuIFxcXG4gICAqXG4gICAqIEluIGNhc2Ugb2YgYSBHZW5lcmljVW5pdCxcbiAgICogaWYgY3VycmVudCB7QGxpbmsgdmFsdWV9IGlzIG51bGwgb3IgdW5kZWZpbmVkLCBpdCByZXR1cm5zIGFuIGVtcHR5IGBhcnJheWAsIFxcXG4gICAqIHdoZXJlIGBPYmplY3QuZW50cmllc2Agd291bGQgaGF2ZSBmYWlsZWQuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBDb21tb24gTGlzdC9EaWN0L0dlbmVyaWMgVW5pdHNcbiAgICovXG4gIG9iamVjdEVudHJpZXMoKTogW3N0cmluZywgVl1bXSB7XG4gICAgcmV0dXJuIHRoaXMucmF3VmFsdWUoKSA9PSBudWxsID8gW10gOiBPYmplY3QuZW50cmllcyh0aGlzLnZhbHVlKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gYGFycmF5YCBvZiB2YWx1ZXMgb2YgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGN1cnJlbnQge0BsaW5rIHZhbHVlfSB1c2luZyBgT2JqZWN0LnZhbHVlc2AuIFxcXG4gICAqXG4gICAqIEluIGNhc2Ugb2YgYSBHZW5lcmljVW5pdCxcbiAgICogaWYgY3VycmVudCB7QGxpbmsgdmFsdWV9IGlzIG51bGwgb3IgdW5kZWZpbmVkLCBpdCByZXR1cm5zIGFuIGVtcHR5IGBhcnJheWAsIFxcXG4gICAqIHdoZXJlIGBPYmplY3QudmFsdWVzYCB3b3VsZCBoYXZlIGZhaWxlZC5cbiAgICpcbiAgICogQGNhdGVnb3J5IENvbW1vbiBMaXN0L0RpY3QvR2VuZXJpYyBVbml0c1xuICAgKi9cbiAgb2JqZWN0VmFsdWVzKCk6IFZbXSB7XG4gICAgcmV0dXJuIHRoaXMucmF3VmFsdWUoKSA9PSBudWxsID8gW10gOiBPYmplY3QudmFsdWVzKHRoaXMudmFsdWUoKSk7XG4gIH1cblxuICAvLyB0c2xpbnQ6ZGlzYWJsZTptYXgtbGluZS1sZW5ndGhcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIHNlbGVjdDxLMSBleHRlbmRzIEtPZjxUPj4oazE6IEsxKTogU2VsZWN0aW9uPFRbSzFdLCB0aGlzPjtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIHNlbGVjdDxLMSBleHRlbmRzIEtPZjxUPiwgSzIgZXh0ZW5kcyBLT2Y8VFtLMV0+PihrMTogSzEsIGsyOiBLMik6IFNlbGVjdGlvbjxUW0sxXVtLMl0sIHRoaXM+O1xuICAvLyBwcmV0dGllci1pZ25vcmVcbiAgc2VsZWN0PEsxIGV4dGVuZHMgS09mPFQ+LCBLMiBleHRlbmRzIEtPZjxUW0sxXT4sIEszIGV4dGVuZHMgS09mPFRbSzFdW0syXT4+KGsxOiBLMSwgazI6IEsyLCBrMzogSzMpOiBTZWxlY3Rpb248VFtLMV1bSzJdW0szXSwgdGhpcz47XG4gIC8vIHVzaW5nICdrZXlvZicgaW5zdGVhZCBvZiAnS09mJyBmb3IgSzQgb253YXJkcyBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzM0OTMzXG4gIC8vIHByZXR0aWVyLWlnbm9yZVxuICBzZWxlY3Q8SzEgZXh0ZW5kcyBLT2Y8VD4sIEsyIGV4dGVuZHMgS09mPFRbSzFdPiwgSzMgZXh0ZW5kcyBLT2Y8VFtLMV1bSzJdPiwgSzQgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdPihrMTogSzEsIGsyOiBLMiwgazM6IEszLCBrNDogSzQpOiBTZWxlY3Rpb248VFtLMV1bSzJdW0szXVtLNF0sIHRoaXM+O1xuICAvLyBwcmV0dGllci1pZ25vcmVcbiAgc2VsZWN0PEsxIGV4dGVuZHMgS09mPFQ+LCBLMiBleHRlbmRzIEtPZjxUW0sxXT4sIEszIGV4dGVuZHMgS09mPFRbSzFdW0syXT4sIEs0IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXSwgSzUgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XT4oazE6IEsxLCBrMjogSzIsIGszOiBLMywgazQ6IEs0LCBrNTogSzUpOiBTZWxlY3Rpb248VFtLMV1bSzJdW0szXVtLNF1bSzVdLCB0aGlzPjtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIHNlbGVjdDxLMSBleHRlbmRzIEtPZjxUPiwgSzIgZXh0ZW5kcyBLT2Y8VFtLMV0+LCBLMyBleHRlbmRzIEtPZjxUW0sxXVtLMl0+LCBLNCBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM10sIEs1IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF0+KGsxOiBLMSwgazI6IEsyLCBrMzogSzMsIGs0OiBLNCwgazU6IEs1LCAuLi5wYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogU2VsZWN0aW9uPGFueSwgdGhpcz47XG4gIC8vIHRzbGludDplbmFibGU6bWF4LWxpbmUtbGVuZ3RoXG4gIC8qKlxuICAgKiBTZWxlY3QgYSBuZXN0ZWQgcHJvcGVydHkgYXQgYSBjZXJ0YWluIHBhdGggaW4gdGhlIFVuaXQncyB7QGxpbmsgdmFsdWV9LlxuICAgKiBJdCBkb2Vzbid0IGZhaWwgZXZlbiBpZiBhIHZhbHVlIGluIG1pZGRsZSBvZiB0aGUgcGF0aCBpcyB1bmRlZmluZWQuXG4gICAqXG4gICAqIEl0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhbiBPYnNlcnZhYmxlIHRvIGxpc3RlbiB0byBjaGFuZ2VzIGluIGEgbmVzdGVkIHByb3BlcnR5XG4gICAqIHVzaW5nIHtAbGluayBTZWxlY3Rpb24uYXNPYnNlcnZhYmxlfSBtZXRob2QuXG4gICAqXG4gICAqIEl0IHByb3ZpZGVzIHN0YXRpYyB2YWx1ZSBhY2Nlc3MgdGhyb3VnaCB0aGUge0BsaW5rIFNlbGVjdGlvbi52YWx1ZX0gbWV0aG9kLlxuICAgKiBJdCBjYW4gYmUgaGVscGZ1bCB3aGVuIHRoZSBVbml0IGlzIGNvbmZpZ3VyZWQgdG8gYmUgaW1tdXRhYmxlLFxuICAgKiBhcyB5b3Ugb25seSBjbG9uZSB0aGUgbmVzdGVkIHByb3BlcnR5IGluc3RlYWQgb2YgdGhlIHdob2xlIHZhbHVlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIGNyZWF0ZSBhIFVuaXRcbiAgICogY29uc3QgdW5pdCA9IG5ldyBEaWN0VW5pdCgpO1xuICAgKlxuICAgKiAvLyBjcmVhdGUgYSBzZWxlY3Rpb25cbiAgICogY29uc3Qgc2VsZWN0aW9uID0gdW5pdC5zZWxlY3QoJ2EnLCAnYicsIDApO1xuICAgKiAvLyBjcmVhdGUgYW4gT2JzZXJ2YWJsZVxuICAgKiBjb25zdCBzZWxlY3Rpb24kID0gc2VsZWN0aW9uLmFzT2JzZXJ2YWJsZSgpO1xuICAgKiAvLyBzdWJzY3JpYmUgdG8gdGhlIHNlbGVjdG9yXG4gICAqIHNlbGVjdGlvbi5zdWJzY3JpYmUodmFsdWUgPT4gY29uc29sZS5sb2codmFsdWUpKSAvLyBsb2dzIHVuZGVmaW5lZCBpbW1lZGlhdGVseVxuICAgKlxuICAgKiAvLyBkaXNwYXRjaCBhIHZhbHVlXG4gICAqIHVuaXQuZGlzcGF0Y2goe2E6IHtiOiBbJ2hpJywgJ3RoZXJlJ119fSk7XG4gICAqIC8vICdoaScgd2lsbCBnZXQgbG9nZ2VkIHRvIHRoZSBjb25zb2xlXG4gICAqXG4gICAqIC8vIHVwZGF0ZSBhIHZhbHVlIG9uIGEgZGlmZmVyZW50IHBhdGhcbiAgICogdW5pdC5zZXQoJ2MnLCAnb3RoZXInKTtcbiAgICogLy8gdGhlIHNlbGVjdG9yIHdvbid0IGJlIHRyaWdnZXJlZCBieSB0aGlzXG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCBQcm9wZXJ0eSBrZXlzIGFuZCBpbmRleGVzIG9mIHRoZSBwYXRoIHlvdSB3YW50IHRvIHNlbGVjdC5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgU2VsZWN0aW9ufSBvYmplY3Qgb2YgdGhlIHNlbGVjdGVkIHByb3BlcnR5IG9yIHBhdGguXG4gICAqXG4gICAqIEBjYXRlZ29yeSBDb21tb24gTGlzdC9EaWN0L0dlbmVyaWMgVW5pdHNcbiAgICovXG4gIHNlbGVjdCguLi5wYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogU2VsZWN0aW9uPGFueSwgdGhpcz4ge1xuICAgIHJldHVybiBuZXcgU2VsZWN0aW9uKHRoaXMsIHBhdGgpO1xuICB9XG59XG4iXX0=