@mmuscat/angular-actions
Version:
A tiny (1kb) state management library for Angular Composition API.
102 lines • 13.4 kB
JavaScript
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=