xaco-store
Version:
A lightweight state management library for Angular using Signals
66 lines • 8.86 kB
JavaScript
import { Injectable, signal } from '@angular/core';
import * as i0 from "@angular/core";
export class StoreService {
constructor() {
this._stores = new Map();
}
createStore(key, initialState, actions, middlewares) {
if (!this._stores.has(key)) {
const state = signal(initialState);
this._stores.set(key, {
state,
readonlyState: state.asReadonly(),
initialState,
actions,
middlewares
});
}
return this.getStore(key);
}
getStore(key) {
const store = this._stores.get(key);
if (!store) {
throw new Error(`Store with key "${key}" not found. Create it first using createStore.`);
}
const actionCreators = Object.keys(store.actions).reduce((acc, actionIndex) => {
acc[actionIndex] = (payload) => {
const currentState = store.state();
const stateActionResult = store.actions[actionIndex](currentState, payload);
if (store.middlewares) {
store.middlewares.forEach((middleware) => {
middleware(currentState, stateActionResult, actionIndex, payload);
});
}
store.state.set(stateActionResult);
};
return acc;
}, {});
return {
state: store.readonlyState,
resetStore: () => store.state.set(store.initialState),
...actionCreators,
};
}
getStateSignal(key) {
const store = this._stores.get(key);
if (!store) {
throw new Error(`Store with key "${key}" not found`);
}
return store.readonlyState;
}
clearStore(key) {
this._stores.delete(key);
}
clearAllStores() {
this._stores.clear();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: StoreService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: StoreService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: StoreService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvc3RvcmUvc3RvcmUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFNM0QsTUFBTSxPQUFPLFlBQVk7SUFIekI7UUFJWSxZQUFPLEdBQWtCLElBQUksR0FBRyxFQUFFLENBQUM7S0FxRTlDO0lBbkVVLFdBQVcsQ0FBSSxHQUFXLEVBQUUsWUFBZSxFQUFFLE9BQXVCLEVBQUUsV0FBa0M7UUFDM0csSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDekIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ25DLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTtnQkFDbEIsS0FBSztnQkFDTCxhQUFhLEVBQUUsS0FBSyxDQUFDLFVBQVUsRUFBRTtnQkFDakMsWUFBWTtnQkFDWixPQUFPO2dCQUNQLFdBQVc7YUFDZCxDQUFDLENBQUM7UUFDUCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFTSxRQUFRLENBQUksR0FBVztRQUMxQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDVCxNQUFNLElBQUksS0FBSyxDQUNYLG1CQUFtQixHQUFHLGlEQUFpRCxDQUMxRSxDQUFDO1FBQ04sQ0FBQztRQUVELE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FDcEQsQ0FBQyxHQUFHLEVBQUUsV0FBVyxFQUFFLEVBQUU7WUFDakIsR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsT0FBaUIsRUFBUSxFQUFFO2dCQUMzQyxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFPLENBQUM7Z0JBRXhDLE1BQU0saUJBQWlCLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FDaEQsWUFBWSxFQUNaLE9BQU8sQ0FDTCxDQUFDO2dCQUVQLElBQUksS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO29CQUNwQixLQUFLLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFO3dCQUNyQyxVQUFVLENBQUMsWUFBWSxFQUFFLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQztvQkFDdEUsQ0FBQyxDQUFDLENBQUM7Z0JBQ1AsQ0FBQztnQkFFRCxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQ3ZDLENBQUMsQ0FBQztZQUNGLE9BQU8sR0FBRyxDQUFDO1FBQ2YsQ0FBQyxFQUNELEVBQThELENBQ2pFLENBQUM7UUFFRixPQUFPO1lBQ0gsS0FBSyxFQUFFLEtBQUssQ0FBQyxhQUFhO1lBQzFCLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDO1lBQ3JELEdBQUcsY0FBYztTQUNSLENBQUM7SUFDbEIsQ0FBQztJQUVNLGNBQWMsQ0FBSSxHQUFXO1FBQ2hDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNULE1BQU0sSUFBSSxLQUFLLENBQUMsbUJBQW1CLEdBQUcsYUFBYSxDQUFDLENBQUM7UUFDekQsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDLGFBQWEsQ0FBQztJQUMvQixDQUFDO0lBRU0sVUFBVSxDQUFDLEdBQVc7UUFDekIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVNLGNBQWM7UUFDakIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN6QixDQUFDOytHQXJFUSxZQUFZO21IQUFaLFlBQVksY0FGVCxNQUFNOzs0RkFFVCxZQUFZO2tCQUh4QixVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIFNpZ25hbCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1pZGRsZXdhcmUsIFN0b3JlLCBTdG9yZUFjdGlvbiwgU3RvcmVNYXAgfSBmcm9tICcuLi9tb2RlbHMvc3RvcmUnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgU3RvcmVTZXJ2aWNlIHtcclxuICAgIHByaXZhdGUgX3N0b3JlczogU3RvcmVNYXA8YW55PiA9IG5ldyBNYXAoKTtcclxuXHJcbiAgICBwdWJsaWMgY3JlYXRlU3RvcmU8VD4oa2V5OiBzdHJpbmcsIGluaXRpYWxTdGF0ZTogVCwgYWN0aW9uczogU3RvcmVBY3Rpb248VD4sIG1pZGRsZXdhcmVzPzogQXJyYXk8TWlkZGxld2FyZTxUPj4pOiBTdG9yZTxUPiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9zdG9yZXMuaGFzKGtleSkpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSBzaWduYWwoaW5pdGlhbFN0YXRlKTtcclxuICAgICAgICAgICAgdGhpcy5fc3RvcmVzLnNldChrZXksIHtcclxuICAgICAgICAgICAgICAgIHN0YXRlLFxyXG4gICAgICAgICAgICAgICAgcmVhZG9ubHlTdGF0ZTogc3RhdGUuYXNSZWFkb25seSgpLFxyXG4gICAgICAgICAgICAgICAgaW5pdGlhbFN0YXRlLFxyXG4gICAgICAgICAgICAgICAgYWN0aW9ucyxcclxuICAgICAgICAgICAgICAgIG1pZGRsZXdhcmVzXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRTdG9yZTxUPihrZXkpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRTdG9yZTxUPihrZXk6IHN0cmluZyk6IFN0b3JlPFQ+IHtcclxuICAgICAgICBjb25zdCBzdG9yZSA9IHRoaXMuX3N0b3Jlcy5nZXQoa2V5KTtcclxuICAgICAgICBpZiAoIXN0b3JlKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICAgICAgICAgIGBTdG9yZSB3aXRoIGtleSBcIiR7a2V5fVwiIG5vdCBmb3VuZC4gQ3JlYXRlIGl0IGZpcnN0IHVzaW5nIGNyZWF0ZVN0b3JlLmBcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGFjdGlvbkNyZWF0b3JzID0gT2JqZWN0LmtleXMoc3RvcmUuYWN0aW9ucykucmVkdWNlKFxyXG4gICAgICAgICAgICAoYWNjLCBhY3Rpb25JbmRleCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgYWNjW2FjdGlvbkluZGV4XSA9IChwYXlsb2FkPzogdW5rbm93bik6IHZvaWQgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IHN0b3JlLnN0YXRlKCkgYXMgVDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhdGVBY3Rpb25SZXN1bHQgPSBzdG9yZS5hY3Rpb25zW2FjdGlvbkluZGV4XShcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFN0YXRlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkXHJcbiAgICAgICAgICAgICAgICAgICAgKSBhcyBUO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RvcmUubWlkZGxld2FyZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmUubWlkZGxld2FyZXMuZm9yRWFjaCgobWlkZGxld2FyZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlkZGxld2FyZShjdXJyZW50U3RhdGUsIHN0YXRlQWN0aW9uUmVzdWx0LCBhY3Rpb25JbmRleCwgcGF5bG9hZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgc3RvcmUuc3RhdGUuc2V0KHN0YXRlQWN0aW9uUmVzdWx0KTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7fSBhcyB7IFtLIGluIGtleW9mIFN0b3JlQWN0aW9uPFQ+XTogKHBheWxvYWQ/OiBhbnkpID0+IHZvaWQgfVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHN0YXRlOiBzdG9yZS5yZWFkb25seVN0YXRlLFxyXG4gICAgICAgICAgICByZXNldFN0b3JlOiAoKSA9PiBzdG9yZS5zdGF0ZS5zZXQoc3RvcmUuaW5pdGlhbFN0YXRlKSxcclxuICAgICAgICAgICAgLi4uYWN0aW9uQ3JlYXRvcnMsXHJcbiAgICAgICAgfSBhcyBTdG9yZTxUPjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0U3RhdGVTaWduYWw8VD4oa2V5OiBzdHJpbmcpOiBTaWduYWw8VD4ge1xyXG4gICAgICAgIGNvbnN0IHN0b3JlID0gdGhpcy5fc3RvcmVzLmdldChrZXkpO1xyXG4gICAgICAgIGlmICghc3RvcmUpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTdG9yZSB3aXRoIGtleSBcIiR7a2V5fVwiIG5vdCBmb3VuZGApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc3RvcmUucmVhZG9ubHlTdGF0ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY2xlYXJTdG9yZShrZXk6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3N0b3Jlcy5kZWxldGUoa2V5KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY2xlYXJBbGxTdG9yZXMoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fc3RvcmVzLmNsZWFyKCk7XHJcbiAgICB9XHJcbn1cclxuIl19