UNPKG

xaco-store

Version:

A lightweight state management library for Angular using Signals

66 lines 8.86 kB
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