UNPKG

@angular-redux/store

Version:
94 lines 8.07 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { getInstanceSelection } from './helpers'; /** * Selects an observable from the store, and attaches it to the decorated * property. * * ```ts * import { select } from '\@angular-redux/store'; * * class SomeClass { * \@select(['foo','bar']) foo$: Observable<string> * } * ``` * * @template T * @param {?=} selector * A selector function, property name string, or property name path * (array of strings/array indices) that locates the store data to be * selected * * @param {?=} comparator Function used to determine if this selector has changed. * @return {?} */ export function select(selector, comparator) { return function (target, key) { /** @type {?} */ var adjustedSelector = selector ? selector : String(key).lastIndexOf('$') === String(key).length - 1 ? String(key).substring(0, String(key).length - 1) : key; decorate(adjustedSelector, undefined, comparator)(target, key); }; } /** * Selects an observable using the given path selector, and runs it through the * given transformer function. A transformer function takes the store * observable as an input and returns a derived observable from it. That derived * observable is run through distinctUntilChanges with the given optional * comparator and attached to the store property. * * Think of a Transformer as a FunctionSelector that operates on observables * instead of values. * * ```ts * import { select$ } from 'angular-redux/store'; * * export const debounceAndTriple = obs$ => obs$ * .debounce(300) * .map(x => 3 * x); * * class Foo { * \@select$(['foo', 'bar'], debounceAndTriple) * readonly debouncedFooBar$: Observable<number>; * } * ``` * @template T * @param {?} selector * @param {?} transformer * @param {?=} comparator * @return {?} */ export function select$(selector, transformer, comparator) { return decorate(selector, transformer, comparator); } /** * @param {?} selector * @param {?=} transformer * @param {?=} comparator * @return {?} */ function decorate(selector, transformer, comparator) { return function decorator(target, key) { /** * @this {?} * @return {?} */ function getter() { return getInstanceSelection(this, key, selector, transformer, comparator); } // Replace decorated property with a getter that returns the observable. if (delete target[key]) { Object.defineProperty(target, key, { get: getter, enumerable: true, configurable: true, }); } }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGFuZ3VsYXItcmVkdXgvc3RvcmUvIiwic291cmNlcyI6WyJkZWNvcmF0b3JzL3NlbGVjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQ0EsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sV0FBVyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBcUJqRCxNQUFNLFVBQVUsTUFBTSxDQUNwQixRQUEyQixFQUMzQixVQUF1QjtJQUV2QixPQUFPLFVBQUMsTUFBVyxFQUFFLEdBQW9COztZQUNqQyxnQkFBZ0IsR0FBRyxRQUFRO1lBQy9CLENBQUMsQ0FBQyxRQUFRO1lBQ1YsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEtBQUssTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDO2dCQUN6RCxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7Z0JBQ2xELENBQUMsQ0FBQyxHQUFHO1FBQ1AsUUFBUSxDQUFDLGdCQUFnQixFQUFFLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDakUsQ0FBQyxDQUFDO0FBQ0osQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF5QkQsTUFBTSxVQUFVLE9BQU8sQ0FDckIsUUFBMEIsRUFDMUIsV0FBZ0MsRUFDaEMsVUFBdUI7SUFFdkIsT0FBTyxRQUFRLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUNyRCxDQUFDOzs7Ozs7O0FBRUQsU0FBUyxRQUFRLENBQ2YsUUFBNEIsRUFDNUIsV0FBbUMsRUFDbkMsVUFBdUI7SUFFdkIsT0FBTyxTQUFTLFNBQVMsQ0FBQyxNQUFXLEVBQUUsR0FBRzs7Ozs7UUFDeEMsU0FBUyxNQUFNO1lBQ2IsT0FBTyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDNUUsQ0FBQztRQUVELHdFQUF3RTtRQUN4RSxJQUFJLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3RCLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRTtnQkFDakMsR0FBRyxFQUFFLE1BQU07Z0JBQ1gsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLFlBQVksRUFBRSxJQUFJO2FBQ25CLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBhcmF0b3IsIFNlbGVjdG9yLCBUcmFuc2Zvcm1lciB9IGZyb20gJy4uL2NvbXBvbmVudHMvc2VsZWN0b3JzJztcbmltcG9ydCB7IGdldEluc3RhbmNlU2VsZWN0aW9uIH0gZnJvbSAnLi9oZWxwZXJzJztcblxuLyoqXG4gKiBTZWxlY3RzIGFuIG9ic2VydmFibGUgZnJvbSB0aGUgc3RvcmUsIGFuZCBhdHRhY2hlcyBpdCB0byB0aGUgZGVjb3JhdGVkXG4gKiBwcm9wZXJ0eS5cbiAqXG4gKiBgYGB0c1xuICogIGltcG9ydCB7IHNlbGVjdCB9IGZyb20gJ0Bhbmd1bGFyLXJlZHV4L3N0b3JlJztcbiAqXG4gKiAgY2xhc3MgU29tZUNsYXNzIHtcbiAqICAgIEBzZWxlY3QoWydmb28nLCdiYXInXSkgZm9vJDogT2JzZXJ2YWJsZTxzdHJpbmc+XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gc2VsZWN0b3JcbiAqIEEgc2VsZWN0b3IgZnVuY3Rpb24sIHByb3BlcnR5IG5hbWUgc3RyaW5nLCBvciBwcm9wZXJ0eSBuYW1lIHBhdGhcbiAqIChhcnJheSBvZiBzdHJpbmdzL2FycmF5IGluZGljZXMpIHRoYXQgbG9jYXRlcyB0aGUgc3RvcmUgZGF0YSB0byBiZVxuICogc2VsZWN0ZWRcbiAqXG4gKiBAcGFyYW0gY29tcGFyYXRvciBGdW5jdGlvbiB1c2VkIHRvIGRldGVybWluZSBpZiB0aGlzIHNlbGVjdG9yIGhhcyBjaGFuZ2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0PFQ+KFxuICBzZWxlY3Rvcj86IFNlbGVjdG9yPGFueSwgVD4sXG4gIGNvbXBhcmF0b3I/OiBDb21wYXJhdG9yLFxuKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICByZXR1cm4gKHRhcmdldDogYW55LCBrZXk6IHN0cmluZyB8IHN5bWJvbCk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IGFkanVzdGVkU2VsZWN0b3IgPSBzZWxlY3RvclxuICAgICAgPyBzZWxlY3RvclxuICAgICAgOiBTdHJpbmcoa2V5KS5sYXN0SW5kZXhPZignJCcpID09PSBTdHJpbmcoa2V5KS5sZW5ndGggLSAxXG4gICAgICA/IFN0cmluZyhrZXkpLnN1YnN0cmluZygwLCBTdHJpbmcoa2V5KS5sZW5ndGggLSAxKVxuICAgICAgOiBrZXk7XG4gICAgZGVjb3JhdGUoYWRqdXN0ZWRTZWxlY3RvciwgdW5kZWZpbmVkLCBjb21wYXJhdG9yKSh0YXJnZXQsIGtleSk7XG4gIH07XG59XG5cbi8qKlxuICogU2VsZWN0cyBhbiBvYnNlcnZhYmxlIHVzaW5nIHRoZSBnaXZlbiBwYXRoIHNlbGVjdG9yLCBhbmQgcnVucyBpdCB0aHJvdWdoIHRoZVxuICogZ2l2ZW4gdHJhbnNmb3JtZXIgZnVuY3Rpb24uIEEgdHJhbnNmb3JtZXIgZnVuY3Rpb24gdGFrZXMgdGhlIHN0b3JlXG4gKiBvYnNlcnZhYmxlIGFzIGFuIGlucHV0IGFuZCByZXR1cm5zIGEgZGVyaXZlZCBvYnNlcnZhYmxlIGZyb20gaXQuIFRoYXQgZGVyaXZlZFxuICogIG9ic2VydmFibGUgaXMgcnVuIHRocm91Z2ggZGlzdGluY3RVbnRpbENoYW5nZXMgd2l0aCB0aGUgZ2l2ZW4gb3B0aW9uYWxcbiAqIGNvbXBhcmF0b3IgYW5kIGF0dGFjaGVkIHRvIHRoZSBzdG9yZSBwcm9wZXJ0eS5cbiAqXG4gKiBUaGluayBvZiBhIFRyYW5zZm9ybWVyIGFzIGEgRnVuY3Rpb25TZWxlY3RvciB0aGF0IG9wZXJhdGVzIG9uIG9ic2VydmFibGVzXG4gKiBpbnN0ZWFkIG9mIHZhbHVlcy5cbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgc2VsZWN0JCB9IGZyb20gJ2FuZ3VsYXItcmVkdXgvc3RvcmUnO1xuICpcbiAqIGV4cG9ydCBjb25zdCBkZWJvdW5jZUFuZFRyaXBsZSA9IG9icyQgPT4gb2JzJFxuICogIC5kZWJvdW5jZSgzMDApXG4gKiAgLm1hcCh4ID0+IDMgKiB4KTtcbiAqXG4gKiBjbGFzcyBGb28ge1xuICogIEBzZWxlY3QkKFsnZm9vJywgJ2JhciddLCBkZWJvdW5jZUFuZFRyaXBsZSlcbiAqICByZWFkb25seSBkZWJvdW5jZWRGb29CYXIkOiBPYnNlcnZhYmxlPG51bWJlcj47XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdCQ8VD4oXG4gIHNlbGVjdG9yOiBTZWxlY3RvcjxhbnksIFQ+LFxuICB0cmFuc2Zvcm1lcjogVHJhbnNmb3JtZXI8YW55LCBUPixcbiAgY29tcGFyYXRvcj86IENvbXBhcmF0b3IsXG4pOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIHJldHVybiBkZWNvcmF0ZShzZWxlY3RvciwgdHJhbnNmb3JtZXIsIGNvbXBhcmF0b3IpO1xufVxuXG5mdW5jdGlvbiBkZWNvcmF0ZShcbiAgc2VsZWN0b3I6IFNlbGVjdG9yPGFueSwgYW55PixcbiAgdHJhbnNmb3JtZXI/OiBUcmFuc2Zvcm1lcjxhbnksIGFueT4sXG4gIGNvbXBhcmF0b3I/OiBDb21wYXJhdG9yLFxuKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICByZXR1cm4gZnVuY3Rpb24gZGVjb3JhdG9yKHRhcmdldDogYW55LCBrZXkpOiB2b2lkIHtcbiAgICBmdW5jdGlvbiBnZXR0ZXIodGhpczogYW55KSB7XG4gICAgICByZXR1cm4gZ2V0SW5zdGFuY2VTZWxlY3Rpb24odGhpcywga2V5LCBzZWxlY3RvciwgdHJhbnNmb3JtZXIsIGNvbXBhcmF0b3IpO1xuICAgIH1cblxuICAgIC8vIFJlcGxhY2UgZGVjb3JhdGVkIHByb3BlcnR5IHdpdGggYSBnZXR0ZXIgdGhhdCByZXR1cm5zIHRoZSBvYnNlcnZhYmxlLlxuICAgIGlmIChkZWxldGUgdGFyZ2V0W2tleV0pIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwge1xuICAgICAgICBnZXQ6IGdldHRlcixcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xufVxuIl19