@activejs/core
Version:
Pragmatic, Reactive State Management for JavaScript Apps
95 lines • 11.2 kB
JavaScript
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=