UNPKG

@mmuscat/angular-actions

Version:
102 lines 13.4 kB
import { ErrorHandler, Inject, InjectionToken, isDevMode, NgModule, Self, } from "@angular/core"; import { inject, Service, subscribe, use, } from "@mmuscat/angular-composition-api"; import { merge, Notification } from "rxjs"; import * as i0 from "@angular/core"; class ActionObserver { constructor(state, reduce) { this.state = state; this.reduce = reduce; } next(action) { this.state(this.reduce(this.state.value, action)); } } class EffectObserver { constructor(name, errorHandler) { this.name = name; this.errorHandler = errorHandler; } next(value) { if (value instanceof Notification && value.kind === "E") { this.error(value.error); } } error(error) { isDevMode() && console.warn(`Unhandled error in effect "${this.name}"`); this.errorHandler.handleError(error); } } function createStore(name, { reducers, effects, state }) { const sink = subscribe(); const initialState = state(); const errorHandler = inject(ErrorHandler); const injector = new Map(); for (const reducer of reducers) { for (const [action, reduce] of inject(reducer).reducers) { let actions = []; const actionTypes = (Array.isArray(action) ? action : [action]); for (const action of actionTypes) { if (!injector.has(action)) { const emitter = use(inject(action)); injector.set(action, emitter); actions.push(emitter); } } const state = use(initialState[reducer.overriddenName]); injector.set(reducer, state); sink.add(merge(...actions).subscribe(new ActionObserver(state, reduce))); } } for (const effect of effects !== null && effects !== void 0 ? effects : []) { const source = effect(store); if (source) { sink.add(source.subscribe(new EffectObserver(effect.name, errorHandler))); } } function store(token) { if (injector.has(token)) { return injector.get(token); } throw new Error(`No provider found for ${token} in store ${name}`); } return store; } const STORE = new InjectionToken("STORE"); function createStoreProvider(name, options) { function Store() { return createStore(name, options); } Store.overriddenName = name; Store.Provider = [ { provide: Store, useClass: new Service(Store) }, options.reducers.map((reducer) => reducer.Provider), ]; return Store; } export const Store = createStoreProvider; export class StoreModule { constructor(store) { this.store = store; } static config(store) { return { ngModule: StoreModule, providers: [ store.Provider, { provide: STORE, useExisting: store }, ], }; } } StoreModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.4", ngImport: i0, type: StoreModule, deps: [{ token: STORE, self: true }], target: i0.ɵɵFactoryTarget.NgModule }); StoreModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.0.4", ngImport: i0, type: StoreModule }); StoreModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.0.4", ngImport: i0, type: StoreModule }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.4", ngImport: i0, type: StoreModule, decorators: [{ type: NgModule }], ctorParameters: function () { return [{ type: Store, decorators: [{ type: Self }, { type: Inject, args: [STORE] }] }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wYWNrYWdlcy9zdG9yZS9zcmMvc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNKLFlBQVksRUFDWixNQUFNLEVBQ04sY0FBYyxFQUNkLFNBQVMsRUFFVCxRQUFRLEVBQ1IsSUFBSSxHQUVOLE1BQU0sZUFBZSxDQUFBO0FBQ3RCLE9BQU8sRUFDSixNQUFNLEVBQ04sT0FBTyxFQUNQLFNBQVMsRUFDVCxHQUFHLEdBR0wsTUFBTSxrQ0FBa0MsQ0FBQTtBQUV6QyxPQUFPLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBYyxNQUFNLE1BQU0sQ0FBQTs7QUFjdEQsTUFBTSxjQUFjO0lBSWpCLFlBQ1csS0FBaUIsRUFDakIsTUFBd0M7UUFEeEMsVUFBSyxHQUFMLEtBQUssQ0FBWTtRQUNqQixXQUFNLEdBQU4sTUFBTSxDQUFrQztJQUNoRCxDQUFDO0lBTkosSUFBSSxDQUFDLE1BQVM7UUFDWCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQTtJQUNwRCxDQUFDO0NBS0g7QUFFRCxNQUFNLGNBQWM7SUFVakIsWUFBb0IsSUFBWSxFQUFVLFlBQTBCO1FBQWhELFNBQUksR0FBSixJQUFJLENBQVE7UUFBVSxpQkFBWSxHQUFaLFlBQVksQ0FBYztJQUFHLENBQUM7SUFUeEUsSUFBSSxDQUFDLEtBQVU7UUFDWixJQUFJLEtBQUssWUFBWSxZQUFZLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxHQUFHLEVBQUU7WUFDdEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUE7U0FDekI7SUFDSixDQUFDO0lBQ0QsS0FBSyxDQUFDLEtBQWM7UUFDakIsU0FBUyxFQUFFLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyw4QkFBOEIsSUFB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TyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDaEQsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7S0FDckQsQ0FBQTtJQUNELE9BQU8sS0FBSyxDQUFBO0FBQ2YsQ0FBQztBQVVELE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBZ0IsbUJBQTBCLENBQUE7QUFHNUQsTUFBTSxPQUFPLFdBQVc7SUFXckIsWUFBMkMsS0FBWTtRQUFaLFVBQUssR0FBTCxLQUFLLENBQU87SUFBRyxDQUFDO0lBVjNELE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBbUI7UUFDOUIsT0FBTztZQUNKLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLFNBQVMsRUFBRTtnQkFDRixLQUFNLENBQUMsUUFBUTtnQkFDckIsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUU7YUFDeEM7U0FDSCxDQUFBO0lBQ0osQ0FBQzs7d0dBVFMsV0FBVyxrQkFXTyxLQUFLO3lHQVh2QixXQUFXO3lHQUFYLFdBQVc7MkZBQVgsV0FBVztrQkFEdkIsUUFBUTswREFZNEMsS0FBSzswQkFBMUMsSUFBSTs7MEJBQUksTUFBTTsyQkFBQyxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgIEVycm9ySGFuZGxlcixcbiAgIEluamVjdCxcbiAgIEluamVjdGlvblRva2VuLFxuICAgaXNEZXZNb2RlLFxuICAgTW9kdWxlV2l0aFByb3ZpZGVycyxcbiAgIE5nTW9kdWxlLFxuICAgU2VsZixcbiAgIFR5cGUsXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCJcbmltcG9ydCB7XG4gICBpbmplY3QsXG4gICBTZXJ2aWNlLFxuICAgc3Vic2NyaWJlLFxuICAgdXNlLFxuICAgVmFsdWUsXG4gICBWYWx1ZVRva2VuLFxufSBmcm9tIFwiQG1tdXNjYXQvYW5ndWxhci1jb21wb3NpdGlvbi1hcGlcIlxuaW1wb3J0IHsgQWN0aW9uLCBBY3Rpb25EaXNwYXRjaGVyIH0gZnJvbSBcIi4vYWN0aW9uXCJcbmltcG9ydCB7IG1lcmdlLCBOb3RpZmljYXRpb24sIE9ic2VydmFibGUgfSBmcm9tIFwicnhqc1wiXG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RvcmUge1xuICAgPFQ+KHRva2VuOiBWYWx1ZVRva2VuPFQ+KTogVFxufVxuXG5leHBvcnQgdHlwZSBFZmZlY3RGYWN0b3J5ID0gKHN0b3JlOiBTdG9yZSkgPT4gT2JzZXJ2YWJsZTxhbnk+IHwgdm9pZFxuXG5leHBvcnQgaW50ZXJmYWNlIFN0b3JlT3B0aW9ucyB7XG4gICBzdGF0ZTogU3RhdGVGYWN0b3J5XG4gICByZWR1Y2VyczogVmFsdWVUb2tlbjxhbnk+W11cbiAgIGVmZmVjdHM/OiBFZmZlY3RGYWN0b3J5W11cbn1cblxuY2xhc3MgQWN0aW9uT2JzZXJ2ZXI8VCBleHRlbmRzIEFjdGlvbjxhbnk+PiB7XG4gICBuZXh0KGFjdGlvbjogVCkge1xuICAgICAgdGhpcy5zdGF0ZSh0aGlzLnJlZHVjZSh0aGlzLnN0YXRlLnZhbHVlLCBhY3Rpb24pKVxuICAgfVxuICAgY29uc3RydWN0b3IoXG4gICAgICBwcml2YXRlIHN0YXRlOiBWYWx1ZTxhbnk+LFxuICAgICAgcHJpdmF0ZSByZWR1Y2U6IChzdGF0ZTogYW55LCBhY3Rpb246IGFueSkgPT4gYW55LFxuICAgKSB7fVxufVxuXG5jbGFzcyBFZmZlY3RPYnNlcnZlciB7XG4gICBuZXh0KHZhbHVlOiBhbnkpIHtcbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE5vdGlmaWNhdGlvbiAmJiB2YWx1ZS5raW5kID09PSBcIkVcIikge1xuICAgICAgICAgdGhpcy5lcnJvcih2YWx1ZS5lcnJvcilcbiAgICAgIH1cbiAgIH1cbiAgIGVycm9yKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBpc0Rldk1vZGUoKSAmJiBjb25zb2xlLndhcm4oYFVuaGFuZGxlZCBlcnJvciBpbiBlZmZlY3QgXCIke3RoaXMubmFtZX1cImApXG4gICAgICB0aGlzLmVycm9ySGFuZGxlci5oYW5kbGVFcnJvcihlcnJvcilcbiAgIH1cbiAgIGNvbnN0cnVjdG9yKHByaXZhdGUgbmFtZTogc3RyaW5nLCBwcml2YXRlIGVycm9ySGFuZGxlcjogRXJyb3JIYW5kbGVyKSB7fVxufVxuXG5mdW5jdGlvbiBjcmVhdGVTdG9yZShcbiAgIG5hbWU6IHN0cmluZyxcbiAgIHsgcmVkdWNlcnMsIGVmZmVjdHMsIHN0YXRlIH06IFN0b3JlT3B0aW9ucyxcbik6IFN0b3JlIHtcbiAgIGNvbnN0IHNpbmsgPSBzdWJzY3JpYmUoKVxuICAgY29uc3QgaW5pdGlhbFN0YXRlID0gc3RhdGUoKVxuICAgY29uc3QgZXJyb3JIYW5kbGVyID0gaW5qZWN0KEVycm9ySGFuZGxlcilcbiAgIGNvbnN0IGluamVjdG9yID0gbmV3IE1hcCgpXG4gICBmb3IgKGNvbnN0IHJlZHVjZXIgb2YgPGFueT5yZWR1Y2Vycykge1xuICAgICAgZm9yIChjb25zdCBbYWN0aW9uLCByZWR1Y2VdIG9mICg8YW55PmluamVjdChyZWR1Y2VyKSkucmVkdWNlcnMpIHtcbiAgICAgICAgIGxldCBhY3Rpb25zOiBhbnlbXSA9IFtdXG4gICAgICAgICBjb25zdCBhY3Rpb25UeXBlcyA9IChcbiAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoYWN0aW9uKSA/IGFjdGlvbiA6IFthY3Rpb25dXG4gICAgICAgICApIGFzIFR5cGU8QWN0aW9uRGlzcGF0Y2hlcjxhbnksIGFueT4+W11cbiAgICAgICAgIGZvciAoY29uc3QgYWN0aW9uIG9mIGFjdGlvblR5cGVzKSB7XG4gICAgICAgICAgICBpZiAoIWluamVjdG9yLmhhcyhhY3Rpb24pKSB7XG4gICAgICAgICAgICAgICBjb25zdCBlbWl0dGVyID0gdXNlKGluamVjdChhY3Rpb24pKVxuICAgICAgICAgICAgICAgaW5qZWN0b3Iuc2V0KGFjdGlvbiwgZW1pdHRlcilcbiAgICAgICAgICAgICAgIGFjdGlvbnMucHVzaChlbWl0dGVyKVxuICAgICAgICAgICAgfVxuICAgICAgICAgfVxuICAgICAgICAgY29uc3Qgc3RhdGUgPSB1c2UoaW5pdGlhbFN0YXRlW3JlZHVjZXIub3ZlcnJpZGRlbk5hbWVdKVxuICAgICAgICAgaW5qZWN0b3Iuc2V0KHJlZHVjZXIsIHN0YXRlKVxuICAgICAgICAgc2luay5hZGQoXG4gICAgICAgICAgICBtZXJnZSguLi5hY3Rpb25zKS5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgICBuZXcgQWN0aW9uT2JzZXJ2ZXIoc3RhdGUsIHJlZHVjZSkgYXMgYW55LFxuICAgICAgICAgICAgKSxcbiAgICAgICAgIClcbiAgICAgIH1cbiAgIH1cblxuICAgZm9yIChjb25zdCBlZmZlY3Qgb2YgZWZmZWN0cyA/PyBbXSkge1xuICAgICAgY29uc3Qgc291cmNlID0gZWZmZWN0KHN0b3JlKVxuICAgICAgaWYgKHNvdXJjZSkge1xuICAgICAgICAgc2luay5hZGQoXG4gICAgICAgICAgICBzb3VyY2Uuc3Vic2NyaWJlKG5ldyBFZmZlY3RPYnNlcnZlcihlZmZlY3QubmFtZSwgZXJyb3JIYW5kbGVyKSksXG4gICAgICAgICApXG4gICAgICB9XG4gICB9XG5cbiAgIGZ1bmN0aW9uIHN0b3JlKHRva2VuOiBWYWx1ZVRva2VuPGFueT4pIHtcbiAgICAgIGlmIChpbmplY3Rvci5oYXModG9rZW4pKSB7XG4gICAgICAgICByZXR1cm4gaW5qZWN0b3IuZ2V0KHRva2VuKVxuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBwcm92aWRlciBmb3VuZCBmb3IgJHt0b2tlbn0gaW4gc3RvcmUgJHtuYW1lfWApXG4gICB9XG5cbiAgIHJldHVybiBzdG9yZVxufVxuXG5jb25zdCBTVE9SRSA9IG5ldyBJbmplY3Rpb25Ub2tlbihcIlNUT1JFXCIpXG5cbmZ1bmN0aW9uIGNyZWF0ZVN0b3JlUHJvdmlkZXIobmFtZTogc3RyaW5nLCBvcHRpb25zOiBTdG9yZU9wdGlvbnMpIHtcbiAgIGZ1bmN0aW9uIFN0b3JlKCkge1xuICAgICAgcmV0dXJuIGNyZWF0ZVN0b3JlKG5hbWUsIG9wdGlvbnMpXG4gICB9XG4gICBTdG9yZS5vdmVycmlkZGVuTmFtZSA9IG5hbWVcbiAgIFN0b3JlLlByb3ZpZGVyID0gW1xuICAgICAgeyBwcm92aWRlOiBTdG9yZSwgdXNlQ2xhc3M6IG5ldyBTZXJ2aWNlKFN0b3JlKSB9LFxuICAgICAgb3B0aW9ucy5yZWR1Y2Vycy5tYXAoKHJlZHVjZXIpID0+IHJlZHVjZXIuUHJvdmlkZXIpLFxuICAgXVxuICAgcmV0dXJuIFN0b3JlXG59XG5cbmV4cG9ydCB0eXBlIFN0YXRlRmFjdG9yeSA9ICgpID0+IHsgW2tleTogc3RyaW5nXTogYW55IH1cblxuZXhwb3J0IHR5cGUgU3RvcmVGYWN0b3J5ID0gVmFsdWVUb2tlbjxTdG9yZT5cblxuaW50ZXJmYWNlIFN0b3JlU3RhdGljIHtcbiAgIG5ldyAobmFtZTogc3RyaW5nLCBvcHRpb25zOiBTdG9yZU9wdGlvbnMpOiBWYWx1ZVRva2VuPFN0b3JlPlxufVxuXG5leHBvcnQgY29uc3QgU3RvcmU6IFN0b3JlU3RhdGljID0gY3JlYXRlU3RvcmVQcm92aWRlciBhcyBhbnlcblxuQE5nTW9kdWxlKClcbmV4cG9ydCBjbGFzcyBTdG9yZU1vZHVsZSB7XG4gICBzdGF0aWMgY29uZmlnKHN0b3JlOiBTdG9yZUZhY3RvcnkpOiBNb2R1bGVXaXRoUHJvdmlkZXJzPFN0b3JlTW9kdWxlPiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAgbmdNb2R1bGU6IFN0b3JlTW9kdWxlLFxuICAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAgICAoPGFueT5zdG9yZSkuUHJvdmlkZXIsXG4gICAgICAgICAgICB7IHByb3ZpZGU6IFNUT1JFLCB1c2VFeGlzdGluZzogc3RvcmUgfSxcbiAgICAgICAgIF0sXG4gICAgICB9XG4gICB9XG5cbiAgIGNvbnN0cnVjdG9yKEBTZWxmKCkgQEluamVjdChTVE9SRSkgcHJpdmF0ZSBzdG9yZTogU3RvcmUpIHt9XG59XG4iXX0=