@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)
145 lines (144 loc) • 15.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
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
*/
var ReduxStateProvider = /** @class */ (function () {
function ReduxStateProvider(stateDefs, zone) {
if (stateDefs === void 0) { stateDefs = []; }
var _this = this;
this.zone = zone;
this.selectorCache = {};
var _a = (ReduxStateDecorator.get(this.constructor) || {}).name, name = _a === void 0 ? null : _a;
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(function (def) { return 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(function (clazz) { return _this.getReducerMethods(new clazz()); })
.reduce(function (all, curr) { return [].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(function (methodsByType, reducer) {
var _a;
/** @type {?} */
var type = ReduxActionDispatcher.getType(reducer.type);
return tslib_1.__assign({}, methodsByType, (_a = {}, _a[type] = [reducer.method].concat(methodsByType[type] || []), _a));
}, {});
ReduxStateProvider.instancesByName[this.name] = this;
}
/**
* @return {?}
*/
ReduxStateProvider.prototype.getInitialState = /**
* @return {?}
*/
function () {
throw new Error('Method "getInitialState" not implemented.');
};
/**
* @template T
* @param {?=} selector
* @return {?}
*/
ReduxStateProvider.prototype.select = /**
* @template T
* @param {?=} selector
* @return {?}
*/
function (selector) {
if (selector === void 0) { selector = ''; }
/** @type {?} */
var 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 {?}
*/
ReduxStateProvider.prototype.getState = /**
* @return {?}
*/
function () {
var _this = this;
return ReduxRegistry.getStore().then(function (store) {
return ReduxSelector.getValueByState(store.getState(), '/' + _this.name);
});
};
/**
* @template P
* @param {?} state
* @param {?} action
* @return {?}
*/
ReduxStateProvider.prototype.reduce = /**
* @template P
* @param {?} state
* @param {?} action
* @return {?}
*/
function (state, action) {
/** @type {?} */
var reducerMethods = this.reducerMethodsByType[action.type] || [];
return reducerMethods.reduce(function (stateToReduce, method) { return method(stateToReduce, action); }, state);
};
/**
* @param {?} reducerClassInstance
* @return {?}
*/
ReduxStateProvider.prototype.getReducerMethods = /**
* @param {?} reducerClassInstance
* @return {?}
*/
function (reducerClassInstance) {
return Object.values(Object.getPrototypeOf(reducerClassInstance))
.map(function (method) {
return {
method: (/** @type {?} */ (method)).bind(reducerClassInstance),
type: ReduxReducerDecorator.get(method),
};
})
.filter(function (reducer) { return reducer && reducer.type; })
// convert array of types to multiple method entries
.reduce(function (all, curr) { return all.concat([].concat(curr.type).map(function (type) { return (tslib_1.__assign({}, curr, { type: type })); })); }, []);
};
ReduxStateProvider.instancesByName = {};
/** @nocollapse */
ReduxStateProvider.ctorParameters = function () { return [
{ type: Array, decorators: [{ type: Inject, args: [ReduxStateDefinitionToken,] }] },
{ type: NgZone }
]; };
return ReduxStateProvider;
}());
export { ReduxStateProvider };
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkdXgtc3RhdGUucHJvdmlkZXIuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AaGFybW93YXRjaC9uZ3gtcmVkdXgtY29yZS8iLCJzb3VyY2VzIjpbInByb3ZpZGVycy9yZWR1eC1zdGF0ZS5wcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUNBLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFRLE1BQU0sZUFBZSxDQUFDO0FBQ3JELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxxQkFBcUIsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBSWpILE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBRW5GLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7Ozs7OztJQVkvQyw0QkFBK0MsU0FBc0MsRUFDakU7UUFEUiwwQkFBQSxFQUFBLGNBQXlFO1FBQXJGLGlCQWtDQztRQWpDbUIsU0FBSSxHQUFKLElBQUk7NkJBSjBDLEVBQUU7UUFNM0QsSUFBQSwyREFBVyxFQUFYLGdDQUFXLENBQW9EO1FBRXRFLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDVCxNQUFNLElBQUksS0FBSyxDQUNiLDBGQUEwRixDQUMzRixDQUFDO1NBQ0g7UUFFRCxJQUFJLENBQUMsSUFBSSxHQUFHLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQzNELElBQUksQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksRUFBbkQsQ0FBbUQsQ0FBQyxD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Q0FBQyxvQkFBb0IsQ0FBQztnQkFDdkQsSUFBSSxFQUFFLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUM7YUFDeEMsQ0FBQztTQUNILENBQUM7YUFDRCxNQUFNLENBQUMsVUFBQSxPQUFPLElBQUksT0FBQSxPQUFPLElBQUksT0FBTyxDQUFDLElBQUksRUFBdkIsQ0FBdUIsQ0FBQztZQUMzQyxvREFBb0Q7YUFDbkQsTUFBTSxDQUFDLFVBQUMsR0FBRyxFQUFFLElBQUksSUFBSyxPQUFBLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQUEsSUFBSSxJQUFJLE9BQUEsc0JBQUssSUFBSSxJQUFFLElBQUksTUFBQSxJQUFFLEVBQWpCLENBQWlCLENBQUMsQ0FBQyxFQUEvRCxDQUErRCxFQUFFLEVBQUUsQ0FBQyxDQUFDOzt5Q0FqRm5CLEVBQUU7Ozs0Q0FRbEUsTUFBTSxTQUFDLHlCQUF5QjtnQkFwQjlCLE1BQU07OzZCQUZ2Qjs7U0FZc0Isa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBJbmplY3QsIE5nWm9uZSwgVHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUmVkdXhBY3Rpb25EaXNwYXRjaGVyLCBSZWR1eFJlZHVjZXJEZWNvcmF0b3IsIFJlZHV4U3RhdGVEZWNvcmF0b3IgfSBmcm9tICdAaGFybW93YXRjaC9yZWR1eC1kZWNvcmF0b3JzJztcblxuaW1wb3J0IHsgUmVkdXhTdGF0ZURlZmluaXRpb24gfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlZHV4LXN0YXRlLWRlZmluaXRpb24uaW50ZXJmYWNlJztcbmltcG9ydCB7IFJlZHV4QWN0aW9uV2l0aFBheWxvYWQgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlZHV4LWFjdGlvbi13aXRoLXBheWxvYWQuaW50ZXJmYWNlJztcbmltcG9ydCB7IFJlZHV4U3RhdGVEZWZpbml0aW9uVG9rZW4gfSBmcm9tICcuLi90b2tlbnMvcmVkdXgtc3RhdGUtZGVmaW5pdGlvbi50b2tlbic7XG5cbmltcG9ydCB7IFJlZHV4U2VsZWN0b3IgfSBmcm9tICcuLi9yZWR1eC1zZWxlY3Rvcic7XG5pbXBvcnQgeyBSZWR1eFJlZ2lzdHJ5IH0gZnJvbSAnLi9yZWR1eC1yZWdpc3RyeSc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBSZWR1eFN0YXRlUHJvdmlkZXI8UyA9IHt9PiB7XG5cbiAgcHVibGljIHN0YXRpYyBpbnN0YW5jZXNCeU5hbWU6IHsgW3N0YXRlTmFtZTogc3RyaW5nXTogUmVkdXhTdGF0ZVByb3ZpZGVyIH0gPSB7fTtcblxuICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgc3RhdGVEZWY6IFJlZHV4U3RhdGVEZWZpbml0aW9uO1xuXG4gIHByb3RlY3RlZCBzZWxlY3RvckNhY2hlOiB7IFtzZWxlY3Rvcjogc3RyaW5nXTogT2JzZXJ2YWJsZTx7fT4gfSA9IHt9O1xuICBwcm90ZWN0ZWQgcmVkdWNlck1ldGhvZHNCeVR5cGU6IHsgW2FjdGlvblR5cGU6IHN0cmluZ106IEZ1bmN0aW9uW10gfTtcblxuICBjb25zdHJ1Y3RvcihASW5qZWN0KFJlZHV4U3RhdGVEZWZpbml0aW9uVG9rZW4pIHN0YXRlRGVmczogUmVkdXhTdGF0ZURlZmluaXRpb25bXSA9IFtdLFxuICAgICAgICAgICAgICBwcml2YXRlIHpvbmU6IE5nWm9uZSkge1xuXG4gICAgY29uc3Qge25hbWUgPSBudWxsfSA9IFJlZHV4U3RhdGVEZWNvcmF0b3IuZ2V0KHRoaXMuY29uc3RydWN0b3IpIHx8IHt9O1xuXG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdVbmFibGUgdG8gcmVzb2x2ZSBzdGF0ZSBuYW1lISBNYWtlIHN1cmUgeW91XFwndmUgZGVjb3JhdGVkIHRoZSBwcm92aWRlciBieSBcIkBSZWR1eFN0YXRlXCIhJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLm5hbWUgPSBSZWR1eFN0YXRlRGVjb3JhdG9yLmdldCh0aGlzLmNvbnN0cnVjdG9yKS5uYW1lO1xuICAgIHRoaXMuc3RhdGVEZWYgPSBzdGF0ZURlZnMuZmluZChkZWYgPT4gUmVkdXhTdGF0ZURlY29yYXRvci5nZXQoZGVmLnByb3ZpZGVyKS5uYW1lID09PSBuYW1lKTtcblxuICAgIGlmICghdGhpcy5zdGF0ZURlZikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnVW5hYmxlIHRvIHJlc29sdmUgc3RhdGUgZGVmaW5pdGlvbiEgTWFrZSBzdXJlIHlvdVxcJ3ZlIHJlZ2lzdGVyZWQgdGhlIHByb3ZpZGVyIHRvIFJlZHV4TW9kdWxlISdcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5yZWR1Y2VyTWV0aG9kc0J5VHlwZSA9ICh0aGlzLnN0YXRlRGVmLnJlZHVjZXJzIHx8IFtdKVxuICAgICAgLm1hcChjbGF6eiA9PiB0aGlzLmdldFJlZHVjZXJNZXRob2RzKG5ldyBjbGF6eigpKSlcbiAgICAgIC5yZWR1Y2UoKGFsbCwgY3VycikgPT4gW10uY29uY2F0KGN1cnIsIGFsbCksIFtdKSAvLyBbXS5jb25jYXQga2VlcHMgdGhlIG9yZGVyLCBhbGwuY29uY2F0KGN1cnIpIGRlc3Ryb3lzIHRoZSBvcmRlclxuICAgICAgLy8gLnJlZHVjZSgoYWxsLCBjdXJyKSA9PiBbY3VyciwgLi4uYWxsXSwgW10pIC8vIFtdLmNvbmNhdCBrZWVwcyB0aGUgb3JkZXIsIGFsbC5jb25jYXQoY3VycikgZGVzdHJveXMgdGhlIG9yZGVyXG4gICAgICAucmVkdWNlKChtZXRob2RzQnlUeXBlLCByZWR1Y2VyKSA9PiB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBSZWR1eEFjdGlvbkRpc3BhdGNoZXIuZ2V0VHlwZShyZWR1Y2VyLnR5cGUpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4ubWV0aG9kc0J5VHlwZSxcbiAgICAgICAgICBbIHR5cGUgXTogWyByZWR1Y2VyLm1ldGhvZCBdLmNvbmNhdChtZXRob2RzQnlUeXBlWyB0eXBlIF0gfHwgW10pXG4gICAgICAgIH07XG4gICAgICB9LCB7fSk7XG5cbiAgICBSZWR1eFN0YXRlUHJvdmlkZXIuaW5zdGFuY2VzQnlOYW1lWyB0aGlzLm5hbWUgXSA9IHRoaXM7XG4gIH1cblxuICBnZXRJbml0aWFsU3RhdGUoKTogUyB8IFByb21pc2U8Uz4gfCBPYnNlcnZhYmxlPFM+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBcImdldEluaXRpYWxTdGF0ZVwiIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIHNlbGVjdDxUPihzZWxlY3RvciA9ICcnKTogT2JzZXJ2YWJsZTxUPiB7XG5cbiAgICBjb25zdCBzdGF0ZVR5cGUgPSB0aGlzLmNvbnN0cnVjdG9yIGFzIFR5cGU8UmVkdXhTdGF0ZVByb3ZpZGVyPFM+PjtcbiAgICBzZWxlY3RvciA9IFJlZHV4U2VsZWN0b3Iubm9ybWFsaXplKHNlbGVjdG9yLCBzdGF0ZVR5cGUpO1xuXG4gICAgaWYgKCF0aGlzLnNlbGVjdG9yQ2FjaGVbIHNlbGVjdG9yIF0pIHtcbiAgICAgIHRoaXMuc2VsZWN0b3JDYWNoZVsgc2VsZWN0b3IgXSA9IG5ldyBSZWR1eFNlbGVjdG9yPFQ+KHRoaXMuem9uZSwgc2VsZWN0b3IsIHN0YXRlVHlwZSkucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zZWxlY3RvckNhY2hlWyBzZWxlY3RvciBdIGFzIFJlZHV4U2VsZWN0b3I8VD47XG4gIH1cblxuICBnZXRTdGF0ZSgpOiBQcm9taXNlPFM+IHtcbiAgICByZXR1cm4gUmVkdXhSZWdpc3RyeS5nZXRTdG9yZSgpLnRoZW4oc3RvcmUgPT4ge1xuICAgICAgcmV0dXJuIFJlZHV4U2VsZWN0b3IuZ2V0VmFsdWVCeVN0YXRlPFM+KHN0b3JlLmdldFN0YXRlKCksICcvJyArIHRoaXMubmFtZSk7XG4gICAgfSk7XG4gIH1cblxuICByZWR1Y2U8UD4oc3RhdGU6IFMsIGFjdGlvbjogUmVkdXhBY3Rpb25XaXRoUGF5bG9hZDxQPik6IFMge1xuICAgIGNvbnN0IHJlZHVjZXJNZXRob2RzID0gdGhpcy5yZWR1Y2VyTWV0aG9kc0J5VHlwZVsgYWN0aW9uLnR5cGUgXSB8fCBbXTtcbiAgICByZXR1cm4gcmVkdWNlck1ldGhvZHMucmVkdWNlKChzdGF0ZVRvUmVkdWNlLCBtZXRob2QpID0+IG1ldGhvZChzdGF0ZVRvUmVkdWNlLCBhY3Rpb24pLCBzdGF0ZSk7XG4gIH1cblxuICBwcml2YXRlIGdldFJlZHVjZXJNZXRob2RzKHJlZHVjZXJDbGFzc0luc3RhbmNlOiBhbnkpIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhPYmplY3QuZ2V0UHJvdG90eXBlT2YocmVkdWNlckNsYXNzSW5zdGFuY2UpKVxuICAgICAgLm1hcChtZXRob2QgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG1ldGhvZDogKG1ldGhvZCBhcyBGdW5jdGlvbikuYmluZChyZWR1Y2VyQ2xhc3NJbnN0YW5jZSksXG4gICAgICAgICAgdHlwZTogUmVkdXhSZWR1Y2VyRGVjb3JhdG9yLmdldChtZXRob2QpLFxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIocmVkdWNlciA9PiByZWR1Y2VyICYmIHJlZHVjZXIudHlwZSlcbiAgICAgIC8vIGNvbnZlcnQgYXJyYXkgb2YgdHlwZXMgdG8gbXVsdGlwbGUgbWV0aG9kIGVudHJpZXNcbiAgICAgIC5yZWR1Y2UoKGFsbCwgY3VycikgPT4gYWxsLmNvbmNhdChbXS5jb25jYXQoY3Vyci50eXBlKS5tYXAodHlwZSA9PiAoey4uLmN1cnIsIHR5cGV9KSkpLCBbXSk7XG4gIH1cblxufVxuIl19