@harmowatch/ngx-redux-core
Version:
[](https://gitter.im/harmowatch/ngx-redux-core?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
120 lines (119 loc) • 14 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { distinctUntilChanged } from 'rxjs/operators';
import { Inject, NgZone } from '@angular/core';
import { ReduxActionDispatcher, ReduxReducerDecorator, ReduxStateDecorator } from '@harmowatch/redux-decorators';
import { ReduxStateDefinitionToken } from '../tokens/redux-state-definition.token';
import { ReduxSelector } from '../redux-selector';
import { ReduxRegistry } from './redux-registry';
/**
* @abstract
* @template S
*/
export class ReduxStateProvider {
/**
* @param {?=} stateDefs
* @param {?=} zone
*/
constructor(stateDefs = [], zone) {
this.zone = zone;
this.selectorCache = {};
const { name = null } = ReduxStateDecorator.get(this.constructor) || {};
if (!name) {
throw new Error('Unable to resolve state name! Make sure you\'ve decorated the provider by "@ReduxState"!');
}
this.name = ReduxStateDecorator.get(this.constructor).name;
this.stateDef = stateDefs.find(def => ReduxStateDecorator.get(def.provider).name === name);
if (!this.stateDef) {
throw new Error('Unable to resolve state definition! Make sure you\'ve registered the provider to ReduxModule!');
}
this.reducerMethodsByType = (this.stateDef.reducers || [])
.map(clazz => this.getReducerMethods(new clazz()))
.reduce((all, curr) => [].concat(curr, all), []) // [].concat keeps the order, all.concat(curr) destroys the order
// .reduce((all, curr) => [curr, ...all], []) // [].concat keeps the order, all.concat(curr) destroys the order
.reduce((methodsByType, reducer) => {
/** @type {?} */
const type = ReduxActionDispatcher.getType(reducer.type);
return Object.assign({}, methodsByType, { [type]: [reducer.method].concat(methodsByType[type] || []) });
}, {});
ReduxStateProvider.instancesByName[this.name] = this;
}
/**
* @return {?}
*/
getInitialState() {
throw new Error('Method "getInitialState" not implemented.');
}
/**
* @template T
* @param {?=} selector
* @return {?}
*/
select(selector = '') {
/** @type {?} */
const stateType = /** @type {?} */ (this.constructor);
selector = ReduxSelector.normalize(selector, stateType);
if (!this.selectorCache[selector]) {
this.selectorCache[selector] = new ReduxSelector(this.zone, selector, stateType).pipe(distinctUntilChanged());
}
return /** @type {?} */ (this.selectorCache[selector]);
}
/**
* @return {?}
*/
getState() {
return ReduxRegistry.getStore().then(store => {
return ReduxSelector.getValueByState(store.getState(), '/' + this.name);
});
}
/**
* @template P
* @param {?} state
* @param {?} action
* @return {?}
*/
reduce(state, action) {
/** @type {?} */
const reducerMethods = this.reducerMethodsByType[action.type] || [];
return reducerMethods.reduce((stateToReduce, method) => method(stateToReduce, action), state);
}
/**
* @param {?} reducerClassInstance
* @return {?}
*/
getReducerMethods(reducerClassInstance) {
return Object.values(Object.getPrototypeOf(reducerClassInstance))
.map(method => {
return {
method: (/** @type {?} */ (method)).bind(reducerClassInstance),
type: ReduxReducerDecorator.get(method),
};
})
.filter(reducer => reducer && reducer.type)
// convert array of types to multiple method entries
.reduce((all, curr) => all.concat([].concat(curr.type).map(type => (Object.assign({}, curr, { type })))), []);
}
}
ReduxStateProvider.instancesByName = {};
/** @nocollapse */
ReduxStateProvider.ctorParameters = () => [
{ type: Array, decorators: [{ type: Inject, args: [ReduxStateDefinitionToken,] }] },
{ type: NgZone }
];
if (false) {
/** @type {?} */
ReduxStateProvider.instancesByName;
/** @type {?} */
ReduxStateProvider.prototype.name;
/** @type {?} */
ReduxStateProvider.prototype.stateDef;
/** @type {?} */
ReduxStateProvider.prototype.selectorCache;
/** @type {?} */
ReduxStateProvider.prototype.reducerMethodsByType;
/** @type {?} */
ReduxStateProvider.prototype.zone;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkdXgtc3RhdGUucHJvdmlkZXIuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AaGFybW93YXRjaC9uZ3gtcmVkdXgtY29yZS8iLCJzb3VyY2VzIjpbInByb3ZpZGVycy9yZWR1eC1zdGF0ZS5wcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQ0EsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQVEsTUFBTSxlQUFlLENBQUM7QUFDckQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLHFCQUFxQixFQUFFLG1CQUFtQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFJakgsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFFbkYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQzs7Ozs7QUFFakQsTUFBTTs7Ozs7SUFVSixZQUErQyxZQUFvQyxFQUFFLEVBQ2pFO1FBQUEsU0FBSSxHQUFKLElBQUk7NkJBSjBDLEVBQUU7UUFNbEUsTUFBTSxFQUFDLElBQUksR0FBRyxJQUFJLEVBQUMsR0FBRyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUV0RSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1QsTUFBTSxJQUFJLEtBQUssQ0FDYiwwRkFBMEYsQ0FDM0YsQ0FBQztTQUNIO1FBRUQsSUFBSSxDQUFDLElBQUksR0FBRyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUMzRCxJQUFJLENBQUMsUUFBUSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEs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SSxFQUFFLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUM7YUFDeEMsQ0FBQztTQUNILENBQUM7YUFDRCxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQztZQUMzQyxvREFBb0Q7YUFDbkQsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxtQkFBSyxJQUFJLElBQUUsSUFBSSxJQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDOzs7cUNBakZuQixFQUFFOzs7d0NBUWxFLE1BQU0sU0FBQyx5QkFBeUI7WUFwQjlCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEluamVjdCwgTmdab25lLCBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSZWR1eEFjdGlvbkRpc3BhdGNoZXIsIFJlZHV4UmVkdWNlckRlY29yYXRvciwgUmVkdXhTdGF0ZURlY29yYXRvciB9IGZyb20gJ0BoYXJtb3dhdGNoL3JlZHV4LWRlY29yYXRvcnMnO1xuXG5pbXBvcnQgeyBSZWR1eFN0YXRlRGVmaW5pdGlvbiB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVkdXgtc3RhdGUtZGVmaW5pdGlvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVkdXhBY3Rpb25XaXRoUGF5bG9hZCB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVkdXgtYWN0aW9uLXdpdGgtcGF5bG9hZC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVkdXhTdGF0ZURlZmluaXRpb25Ub2tlbiB9IGZyb20gJy4uL3Rva2Vucy9yZWR1eC1zdGF0ZS1kZWZpbml0aW9uLnRva2VuJztcblxuaW1wb3J0IHsgUmVkdXhTZWxlY3RvciB9IGZyb20gJy4uL3JlZHV4LXNlbGVjdG9yJztcbmltcG9ydCB7IFJlZHV4UmVnaXN0cnkgfSBmcm9tICcuL3JlZHV4LXJlZ2lzdHJ5JztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFJlZHV4U3RhdGVQcm92aWRlcjxTID0ge30+IHtcblxuICBwdWJsaWMgc3RhdGljIGluc3RhbmNlc0J5TmFtZTogeyBbc3RhdGVOYW1lOiBzdHJpbmddOiBSZWR1eFN0YXRlUHJvdmlkZXIgfSA9IHt9O1xuXG4gIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBzdGF0ZURlZjogUmVkdXhTdGF0ZURlZmluaXRpb247XG5cbiAgcHJvdGVjdGVkIHNlbGVjdG9yQ2FjaGU6IHsgW3NlbGVjdG9yOiBzdHJpbmddOiBPYnNlcnZhYmxlPHt9PiB9ID0ge307XG4gIHByb3RlY3RlZCByZWR1Y2VyTWV0aG9kc0J5VHlwZTogeyBbYWN0aW9uVHlwZTogc3RyaW5nXTogRnVuY3Rpb25bXSB9O1xuXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoUmVkdXhTdGF0ZURlZmluaXRpb25Ub2tlbikgc3RhdGVEZWZzOiBSZWR1eFN0YXRlRGVmaW5pdGlvbltdID0gW10sXG4gICAgICAgICAgICAgIHByaXZhdGUgem9uZTogTmdab25lKSB7XG5cbiAgICBjb25zdCB7bmFtZSA9IG51bGx9ID0gUmVkdXhTdGF0ZURlY29yYXRvci5nZXQodGhpcy5jb25zdHJ1Y3RvcikgfHwge307XG5cbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1VuYWJsZSB0byByZXNvbHZlIHN0YXRlIG5hbWUhIE1ha2Ugc3VyZSB5b3VcXCd2ZSBkZWNvcmF0ZWQgdGhlIHByb3ZpZGVyIGJ5IFwiQFJlZHV4U3RhdGVcIiEnXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMubmFtZSA9IFJlZHV4U3RhdGVEZWNvcmF0b3IuZ2V0KHRoaXMuY29uc3RydWN0b3IpLm5hbWU7XG4gICAgdGhpcy5zdGF0ZURlZiA9IHN0YXRlRGVmcy5maW5kKGRlZiA9PiBSZWR1eFN0YXRlRGVjb3JhdG9yLmdldChkZWYucHJvdmlkZXIpLm5hbWUgPT09IG5hbWUpO1xuXG4gICAgaWYgKCF0aGlzLnN0YXRlRGVmKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdVbmFibGUgdG8gcmVzb2x2ZSBzdGF0ZSBkZWZpbml0aW9uISBNYWtlIHN1cmUgeW91XFwndmUgcmVnaXN0ZXJlZCB0aGUgcHJvdmlkZXIgdG8gUmVkdXhNb2R1bGUhJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLnJlZHVjZXJNZXRob2RzQnlUeXBlID0gKHRoaXMuc3RhdGVEZWYucmVkdWNlcnMgfHwgW10pXG4gICAgICAubWFwKGNsYXp6ID0+IHRoaXMuZ2V0UmVkdWNlck1ldGhvZHMobmV3IGNsYXp6KCkpKVxuICAgICAgLnJlZHVjZSgoYWxsLCBjdXJyKSA9PiBbXS5jb25jYXQoY3VyciwgYWxsKSwgW10pIC8vIFtdLmNvbmNhdCBrZWVwcyB0aGUgb3JkZXIsIGFsbC5jb25jYXQoY3VycikgZGVzdHJveXMgdGhlIG9yZGVyXG4gICAgICAvLyAucmVkdWNlKChhbGwsIGN1cnIpID0+IFtjdXJyLCAuLi5hbGxdLCBbXSkgLy8gW10uY29uY2F0IGtlZXBzIHRoZSBvcmRlciwgYWxsLmNvbmNhdChjdXJyKSBkZXN0cm95cyB0aGUgb3JkZXJcbiAgICAgIC5yZWR1Y2UoKG1ldGhvZHNCeVR5cGUsIHJlZHVjZXIpID0+IHtcbiAgICAgICAgY29uc3QgdHlwZSA9IFJlZHV4QWN0aW9uRGlzcGF0Y2hlci5nZXRUeXBlKHJlZHVjZXIudHlwZSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5tZXRob2RzQnlUeXBlLFxuICAgICAgICAgIFsgdHlwZSBdOiBbIHJlZHVjZXIubWV0aG9kIF0uY29uY2F0KG1ldGhvZHNCeVR5cGVbIHR5cGUgXSB8fCBbXSlcbiAgICAgICAgfTtcbiAgICAgIH0sIHt9KTtcblxuICAgIFJlZHV4U3RhdGVQcm92aWRlci5pbnN0YW5jZXNCeU5hbWVbIHRoaXMubmFtZSBdID0gdGhpcztcbiAgfVxuXG4gIGdldEluaXRpYWxTdGF0ZSgpOiBTIHwgUHJvbWlzZTxTPiB8IE9ic2VydmFibGU8Uz4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIFwiZ2V0SW5pdGlhbFN0YXRlXCIgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG5cbiAgc2VsZWN0PFQ+KHNlbGVjdG9yID0gJycpOiBPYnNlcnZhYmxlPFQ+IHtcblxuICAgIGNvbnN0IHN0YXRlVHlwZSA9IHRoaXMuY29uc3RydWN0b3IgYXMgVHlwZTxSZWR1eFN0YXRlUHJvdmlkZXI8Uz4+O1xuICAgIHNlbGVjdG9yID0gUmVkdXhTZWxlY3Rvci5ub3JtYWxpemUoc2VsZWN0b3IsIHN0YXRlVHlwZSk7XG5cbiAgICBpZiAoIXRoaXMuc2VsZWN0b3JDYWNoZVsgc2VsZWN0b3IgXSkge1xuICAgICAgdGhpcy5zZWxlY3RvckNhY2hlWyBzZWxlY3RvciBdID0gbmV3IFJlZHV4U2VsZWN0b3I8VD4odGhpcy56b25lLCBzZWxlY3Rvciwgc3RhdGVUeXBlKS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNlbGVjdG9yQ2FjaGVbIHNlbGVjdG9yIF0gYXMgUmVkdXhTZWxlY3RvcjxUPjtcbiAgfVxuXG4gIGdldFN0YXRlKCk6IFByb21pc2U8Uz4ge1xuICAgIHJldHVybiBSZWR1eFJlZ2lzdHJ5LmdldFN0b3JlKCkudGhlbihzdG9yZSA9PiB7XG4gICAgICByZXR1cm4gUmVkdXhTZWxlY3Rvci5nZXRWYWx1ZUJ5U3RhdGU8Uz4oc3RvcmUuZ2V0U3RhdGUoKSwgJy8nICsgdGhpcy5uYW1lKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJlZHVjZTxQPihzdGF0ZTogUywgYWN0aW9uOiBSZWR1eEFjdGlvbldpdGhQYXlsb2FkPFA+KTogUyB7XG4gICAgY29uc3QgcmVkdWNlck1ldGhvZHMgPSB0aGlzLnJlZHVjZXJNZXRob2RzQnlUeXBlWyBhY3Rpb24udHlwZSBdIHx8IFtdO1xuICAgIHJldHVybiByZWR1Y2VyTWV0aG9kcy5yZWR1Y2UoKHN0YXRlVG9SZWR1Y2UsIG1ldGhvZCkgPT4gbWV0aG9kKHN0YXRlVG9SZWR1Y2UsIGFjdGlvbiksIHN0YXRlKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UmVkdWNlck1ldGhvZHMocmVkdWNlckNsYXNzSW5zdGFuY2U6IGFueSkge1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKE9iamVjdC5nZXRQcm90b3R5cGVPZihyZWR1Y2VyQ2xhc3NJbnN0YW5jZSkpXG4gICAgICAubWFwKG1ldGhvZCA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbWV0aG9kOiAobWV0aG9kIGFzIEZ1bmN0aW9uKS5iaW5kKHJlZHVjZXJDbGFzc0luc3RhbmNlKSxcbiAgICAgICAgICB0eXBlOiBSZWR1eFJlZHVjZXJEZWNvcmF0b3IuZ2V0KG1ldGhvZCksXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICAgLmZpbHRlcihyZWR1Y2VyID0+IHJlZHVjZXIgJiYgcmVkdWNlci50eXBlKVxuICAgICAgLy8gY29udmVydCBhcnJheSBvZiB0eXBlcyB0byBtdWx0aXBsZSBtZXRob2QgZW50cmllc1xuICAgICAgLnJlZHVjZSgoYWxsLCBjdXJyKSA9PiBhbGwuY29uY2F0KFtdLmNvbmNhdChjdXJyLnR5cGUpLm1hcCh0eXBlID0+ICh7Li4uY3VyciwgdHlwZX0pKSksIFtdKTtcbiAgfVxuXG59XG4iXX0=