@activejs/core
Version:
Pragmatic, Reactive State Management for JavaScript Apps
96 lines • 10.1 kB
JavaScript
import { Observable } from 'rxjs';
import { Base } from './abstract-base';
import { UnitBase } from './abstract-unit-base';
import { Configuration } from './configuration';
import { isFunction, IteratorSymbol, makeNonEnumerable } from '../utils/funcs';
/**
* StringUnit is a reactive storage Unit that emulates `string`.
*
* It only accepts `string` data type as its value.
* It ensures that at any point of time the value would always be `string`.
*
* StringUnit implements all the `String.prototype` methods that are available
* in the environment/browser its running, including polyfills.
* e.g.: `trim`, `match`, `includes`, etc.
*
* Learn more about Units [here](https://docs.activejs.dev/fundamentals/units). \
* Learn more about StringUnit [here](https://docs.activejs.dev/fundamentals/units/stringunit).
*
* Just like every other ActiveJS Unit:
* - StringUnit extends {@link UnitBase}
* - Which further extends {@link Base} and `Observable`
*
* @category 1. Units
*/
export class StringUnit extends UnitBase {
constructor(config) {
super(Object.assign(Object.assign({}, Configuration.STRING_UNIT), config));
makeNonEnumerable(this);
}
/**
* Length of the string {@link value}.
*/
get length() {
return this.rawValue().length;
}
/**
* Current value of the Unit.
* @default `''` (empty string)
*
* @category Access Value
*/
value() {
return this.rawValue();
}
/**
* @internal please do not use.
*/
defaultValue() {
return '';
}
/**
* Extends {@link UnitBase.wouldDispatch} and adds additional check for type string,
* which cannot be bypassed even by using {@link force}.
*
* @param value The value to be dispatched.
* @param force Whether dispatch-checks should be bypassed or not.
* @returns A boolean indicating whether the param `value` would pass the dispatch-checks if dispatched.
*
* @category Common Units
*/
wouldDispatch(value, force) {
return this.isValidValue(value) && super.wouldDispatch(value, force);
}
/**
* @internal please do not use.
*/
isValidValue(value) {
return typeof value === 'string';
}
/**
* @internal please do not use.
*/
[IteratorSymbol]() {
return String.prototype[IteratorSymbol].call(this.value());
}
}
/**
* @internal please do not use.
*/
const MethodsNotToImplement = [
...Object.getOwnPropertyNames(Observable.prototype),
...Object.getOwnPropertyNames(Base.prototype),
...Object.getOwnPropertyNames(UnitBase.prototype),
...Object.getOwnPropertyNames(StringUnit.prototype),
];
Object.getOwnPropertyNames(String.prototype).forEach(method => {
if (!isFunction(String.prototype[method]) || MethodsNotToImplement.includes(method)) {
return;
}
Object.defineProperty(StringUnit.prototype, method, {
value(...args) {
return String.prototype[method].apply(this.value(), args);
},
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5nLXVuaXQuanMiLCJzb3VyY2VSb290IjoiL2hvbWUvcnVubmVyL3dvcmsvYWN0aXZlanMvYWN0aXZlanMvcGFja2FnZXMvY29yZS9zcmMvIiwic291cmNlcyI6WyJsaWIvc3RyaW5nLXVuaXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUVoQyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDckMsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQzlDLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQUMsVUFBVSxFQUFFLGNBQWMsRUFBRSxpQkFBaUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBSzdFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCxNQUFNLE9BQU8sVUFBVyxTQUFRLFFBQWdCO0lBeUI5QyxZQUFZLE1BQTJCO1FBQ3JDLEtBQUssaUNBQ0EsYUFBYSxDQUFDLFdBQVcsR0FDekIsTUFBTSxFQUNULENBQUM7UUFFSCxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBL0JEOztPQUVHO0lBQ0gsSUFBSSxNQUFNO1FBQ1IsT0FBTyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUs7UUFDSCxPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQ7O09BRUc7SUFDTyxZQUFZO1FBQ3BCLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQVdEOzs7Ozs7Ozs7T0FTRztJQUNILGFBQWEsQ0FBQyxLQUFhLEVBQUUsS0FBZTtRQUMxQyxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVEOztPQUVHO0lBQ08sWUFBWSxDQUFDLEtBQVU7UUFDL0IsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUM7SUFDbkMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsQ0FBQyxjQUFjLENBQUM7UUFDZCxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQzdELENBQUM7Q0FRRjtBQUVEOztHQUVHO0FBQ0gsTUFBTSxxQkFBcUIsR0FBRztJQUM1QixHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDO0lBQ25ELEdBQUcsTUFBTSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDN0MsR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztJQUNqRCxHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDO0NBQ3BELENBQUM7QUFDRixNQUFNLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtJQUM1RCxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUU7UUFDbkYsT0FBTztLQUNSO0lBRUQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRTtRQUNsRCxLQUFLLENBQUMsR0FBRyxJQUFJO1lBQ1gsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDNUQsQ0FBQztLQUNGLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtPYnNlcnZhYmxlfSBmcm9tICdyeGpzJztcbmltcG9ydCB7VW5pdENvbmZpZ30gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7QmFzZX0gZnJvbSAnLi9hYnN0cmFjdC1iYXNlJztcbmltcG9ydCB7VW5pdEJhc2V9IGZyb20gJy4vYWJzdHJhY3QtdW5pdC1iYXNlJztcbmltcG9ydCB7Q29uZmlndXJhdGlvbn0gZnJvbSAnLi9jb25maWd1cmF0aW9uJztcbmltcG9ydCB7aXNGdW5jdGlvbiwgSXRlcmF0b3JTeW1ib2wsIG1ha2VOb25FbnVtZXJhYmxlfSBmcm9tICcuLi91dGlscy9mdW5jcyc7XG5cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tZW1wdHktaW50ZXJmYWNlXG5leHBvcnQgaW50ZXJmYWNlIFN0cmluZ1VuaXQgZXh0ZW5kcyBTdHJpbmcge31cblxuLyoqXG4gKiBTdHJpbmdVbml0IGlzIGEgcmVhY3RpdmUgc3RvcmFnZSBVbml0IHRoYXQgZW11bGF0ZXMgYHN0cmluZ2AuXG4gKlxuICogSXQgb25seSBhY2NlcHRzIGBzdHJpbmdgIGRhdGEgdHlwZSBhcyBpdHMgdmFsdWUuXG4gKiBJdCBlbnN1cmVzIHRoYXQgYXQgYW55IHBvaW50IG9mIHRpbWUgdGhlIHZhbHVlIHdvdWxkIGFsd2F5cyBiZSBgc3RyaW5nYC5cbiAqXG4gKiBTdHJpbmdVbml0IGltcGxlbWVudHMgYWxsIHRoZSBgU3RyaW5nLnByb3RvdHlwZWAgbWV0aG9kcyB0aGF0IGFyZSBhdmFpbGFibGVcbiAqIGluIHRoZSBlbnZpcm9ubWVudC9icm93c2VyIGl0cyBydW5uaW5nLCBpbmNsdWRpbmcgcG9seWZpbGxzLlxuICogZS5nLjogYHRyaW1gLCBgbWF0Y2hgLCBgaW5jbHVkZXNgLCBldGMuXG4gKlxuICogTGVhcm4gbW9yZSBhYm91dCBVbml0cyBbaGVyZV0oaHR0cHM6Ly9kb2NzLmFjdGl2ZWpzLmRldi9mdW5kYW1lbnRhbHMvdW5pdHMpLiBcXFxuICogTGVhcm4gbW9yZSBhYm91dCBTdHJpbmdVbml0IFtoZXJlXShodHRwczovL2RvY3MuYWN0aXZlanMuZGV2L2Z1bmRhbWVudGFscy91bml0cy9zdHJpbmd1bml0KS5cbiAqXG4gKiBKdXN0IGxpa2UgZXZlcnkgb3RoZXIgQWN0aXZlSlMgVW5pdDpcbiAqIC0gU3RyaW5nVW5pdCBleHRlbmRzIHtAbGluayBVbml0QmFzZX1cbiAqIC0gV2hpY2ggZnVydGhlciBleHRlbmRzIHtAbGluayBCYXNlfSBhbmQgYE9ic2VydmFibGVgXG4gKlxuICogQGNhdGVnb3J5IDEuIFVuaXRzXG4gKi9cbmV4cG9ydCBjbGFzcyBTdHJpbmdVbml0IGV4dGVuZHMgVW5pdEJhc2U8c3RyaW5nPiB7XG4gIC8qKlxuICAgKiBMZW5ndGggb2YgdGhlIHN0cmluZyB7QGxpbmsgdmFsdWV9LlxuICAgKi9cbiAgZ2V0IGxlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnJhd1ZhbHVlKCkubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIEN1cnJlbnQgdmFsdWUgb2YgdGhlIFVuaXQuXG4gICAqIEBkZWZhdWx0IGAnJ2AgKGVtcHR5IHN0cmluZylcbiAgICpcbiAgICogQGNhdGVnb3J5IEFjY2VzcyBWYWx1ZVxuICAgKi9cbiAgdmFsdWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yYXdWYWx1ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbCBwbGVhc2UgZG8gbm90IHVzZS5cbiAgICovXG4gIHByb3RlY3RlZCBkZWZhdWx0VmFsdWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihjb25maWc/OiBVbml0Q29uZmlnPHN0cmluZz4pIHtcbiAgICBzdXBlcih7XG4gICAgICAuLi5Db25maWd1cmF0aW9uLlNUUklOR19VTklULFxuICAgICAgLi4uY29uZmlnLFxuICAgIH0pO1xuXG4gICAgbWFrZU5vbkVudW1lcmFibGUodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogRXh0ZW5kcyB7QGxpbmsgVW5pdEJhc2Uud291bGREaXNwYXRjaH0gYW5kIGFkZHMgYWRkaXRpb25hbCBjaGVjayBmb3IgdHlwZSBzdHJpbmcsXG4gICAqIHdoaWNoIGNhbm5vdCBiZSBieXBhc3NlZCBldmVuIGJ5IHVzaW5nIHtAbGluayBmb3JjZX0uXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gYmUgZGlzcGF0Y2hlZC5cbiAgICogQHBhcmFtIGZvcmNlIFdoZXRoZXIgZGlzcGF0Y2gtY2hlY2tzIHNob3VsZCBiZSBieXBhc3NlZCBvciBub3QuXG4gICAqIEByZXR1cm5zIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHBhcmFtIGB2YWx1ZWAgd291bGQgcGFzcyB0aGUgZGlzcGF0Y2gtY2hlY2tzIGlmIGRpc3BhdGNoZWQuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBDb21tb24gVW5pdHNcbiAgICovXG4gIHdvdWxkRGlzcGF0Y2godmFsdWU6IHN0cmluZywgZm9yY2U/OiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZFZhbHVlKHZhbHVlKSAmJiBzdXBlci53b3VsZERpc3BhdGNoKHZhbHVlLCBmb3JjZSk7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsIHBsZWFzZSBkbyBub3QgdXNlLlxuICAgKi9cbiAgcHJvdGVjdGVkIGlzVmFsaWRWYWx1ZSh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZyc7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsIHBsZWFzZSBkbyBub3QgdXNlLlxuICAgKi9cbiAgW0l0ZXJhdG9yU3ltYm9sXSgpOiBJdGVyYWJsZUl0ZXJhdG9yPHN0cmluZz4ge1xuICAgIHJldHVybiBTdHJpbmcucHJvdG90eXBlW0l0ZXJhdG9yU3ltYm9sXS5jYWxsKHRoaXMudmFsdWUoKSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWRcbiAgICogQGlnbm9yZVxuICAgKiBAaW50ZXJuYWwgcGxlYXNlIGRvIG5vdCB1c2UuXG4gICAqL1xuICBzdGF0aWMgU3RyaW5nOiBhbnk7XG59XG5cbi8qKlxuICogQGludGVybmFsIHBsZWFzZSBkbyBub3QgdXNlLlxuICovXG5jb25zdCBNZXRob2RzTm90VG9JbXBsZW1lbnQgPSBbXG4gIC4uLk9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKE9ic2VydmFibGUucHJvdG90eXBlKSxcbiAgLi4uT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoQmFzZS5wcm90b3R5cGUpLFxuICAuLi5PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhVbml0QmFzZS5wcm90b3R5cGUpLFxuICAuLi5PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhTdHJpbmdVbml0LnByb3RvdHlwZSksXG5dO1xuT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoU3RyaW5nLnByb3RvdHlwZSkuZm9yRWFjaChtZXRob2QgPT4ge1xuICBpZiAoIWlzRnVuY3Rpb24oU3RyaW5nLnByb3RvdHlwZVttZXRob2RdKSB8fCBNZXRob2RzTm90VG9JbXBsZW1lbnQuaW5jbHVkZXMobWV0aG9kKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTdHJpbmdVbml0LnByb3RvdHlwZSwgbWV0aG9kLCB7XG4gICAgdmFsdWUoLi4uYXJncykge1xuICAgICAgcmV0dXJuIFN0cmluZy5wcm90b3R5cGVbbWV0aG9kXS5hcHBseSh0aGlzLnZhbHVlKCksIGFyZ3MpO1xuICAgIH0sXG4gIH0pO1xufSk7XG4iXX0=