@mini-rx/signal-store
Version:
Signal Store for Angular
44 lines • 8.22 kB
JavaScript
import { DestroyRef, inject, untracked } from '@angular/core';
import { createFeatureStoreReducer, createMiniRxActionType, createUpdateFn, generateFeatureKey, generateId, miniRxError, undo, } from '@mini-rx/common';
import { storeCore } from './store-core';
import { createSelectableSignal } from './create-selectable-signal';
import { createRxEffectFn } from './create-rx-effect-fn';
import { createConnectFn } from './create-connect-fn';
export class FeatureStore {
get featureKey() {
return this._featureKey;
}
get state() {
return untracked(() => this._state());
}
constructor(featureKey, initialState, config = {}) {
this._state = storeCore.appState.select((state) => state[this.featureKey]);
this.updateState = (stateOrCallback, operationType, name) => {
return storeCore.dispatch({
type: createMiniRxActionType(operationType, this.featureKey, name),
stateOrCallback,
featureId: this.featureId,
});
};
this.setState = createUpdateFn(this.updateState);
this.connect = createConnectFn(this.updateState);
this.rxEffect = createRxEffectFn();
this.select = createSelectableSignal(this._state).select;
this.featureId = generateId();
this._featureKey = generateFeatureKey(featureKey, config.multi);
storeCore.addFeature(this._featureKey, createFeatureStoreReducer(this.featureId, initialState));
inject(DestroyRef).onDestroy(() => this.destroy());
}
undo(action) {
storeCore.hasUndoExtension
? storeCore.dispatch(undo(action))
: miniRxError('UndoExtension is not initialized.');
}
destroy() {
storeCore.removeFeature(this._featureKey);
}
}
export function createFeatureStore(featureKey, initialState, config = {}) {
return new FeatureStore(featureKey, initialState, config);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmVhdHVyZS1zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvc2lnbmFsLXN0b3JlL3NyYy9saWIvZmVhdHVyZS1zdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBVSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEUsT0FBTyxFQUVILHlCQUF5QixFQUN6QixzQkFBc0IsRUFDdEIsY0FBYyxFQUVkLGtCQUFrQixFQUNsQixVQUFVLEVBRVYsV0FBVyxFQUdYLElBQUksR0FFUCxNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFcEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXRELE1BQU0sT0FBTyxZQUFZO0lBR3JCLElBQUksVUFBVTtRQUNWLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUM1QixDQUFDO0lBS0QsSUFBSSxLQUFLO1FBQ0wsT0FBTyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQWNELFlBQVksVUFBa0IsRUFBRSxZQUF1QixFQUFFLFNBQTZCLEVBQUU7UUFuQmhGLFdBQU0sR0FBc0IsU0FBUyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQ3pELENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUNwQyxDQUFDO1FBS00sZ0JBQVcsR0FBbUMsQ0FDbEQsZUFBMkMsRUFDM0MsYUFBNEIsRUFDNUIsSUFBd0IsRUFDRCxFQUFFO1lBQ3pCLE9BQU8sU0FBUyxDQUFDLFFBQVEsQ0FBQztnQkFDdEIsSUFBSSxFQUFFLHNCQUFzQixDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQztnQkFDbEUsZUFBZTtnQkFDZixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7YUFDNUIsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDO1FBb0JGLGFBQVEsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzVDLFlBQU8sR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzVDLGFBQVEsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzlCLFdBQU0sR0FBRyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDO1FBcEJoRCxJQUFJLENBQUMsU0FBUyxHQUFHLFVBQVUsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxXQUFXLEdBQUcsa0JBQWtCLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVoRSxTQUFTLENBQUMsVUFBVSxDQUNoQixJQUFJLENBQUMsV0FBVyxFQUNoQix5QkFBeUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUMxRCxDQUFDO1FBRUYsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsSUFBSSxDQUFDLE1BQWM7UUFDZixTQUFTLENBQUMsZ0JBQWdCO1lBQ3RCLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNsQyxDQUFDLENBQUMsV0FBVyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQU9PLE9BQU87UUFDWCxTQUFTLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUM5QyxDQUFDO0NBQ0o7QUFFRCxNQUFNLFVBQVUsa0JBQWtCLENBQzlCLFVBQWtCLEVBQ2xCLFlBQWUsRUFDZixTQUE2QixFQUFFO0lBRS9CLE9BQU8sSUFBSSxZQUFZLENBQUksVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNqRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVzdHJveVJlZiwgaW5qZWN0LCBTaWduYWwsIHVudHJhY2tlZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBBY3Rpb24sXG4gICAgY3JlYXRlRmVhdHVyZVN0b3JlUmVkdWNlcixcbiAgICBjcmVhdGVNaW5pUnhBY3Rpb25UeXBlLFxuICAgIGNyZWF0ZVVwZGF0ZUZuLFxuICAgIEZlYXR1cmVTdG9yZUNvbmZpZyxcbiAgICBnZW5lcmF0ZUZlYXR1cmVLZXksXG4gICAgZ2VuZXJhdGVJZCxcbiAgICBNaW5pUnhBY3Rpb24sXG4gICAgbWluaVJ4RXJyb3IsXG4gICAgT3BlcmF0aW9uVHlwZSxcbiAgICBTdGF0ZU9yQ2FsbGJhY2ssXG4gICAgdW5kbyxcbiAgICBVcGRhdGVTdGF0ZUNhbGxiYWNrLFxufSBmcm9tICdAbWluaS1yeC9jb21tb24nO1xuaW1wb3J0IHsgc3RvcmVDb3JlIH0gZnJvbSAnLi9zdG9yZS1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVNlbGVjdGFibGVTaWduYWwgfSBmcm9tICcuL2NyZWF0ZS1zZWxlY3RhYmxlLXNpZ25hbCc7XG5pbXBvcnQgeyBDb21wb25lbnRTdG9yZUxpa2UgfSBmcm9tICcuL21vZGVscyc7XG5pbXBvcnQgeyBjcmVhdGVSeEVmZmVjdEZuIH0gZnJvbSAnLi9jcmVhdGUtcngtZWZmZWN0LWZuJztcbmltcG9ydCB7IGNyZWF0ZUNvbm5lY3RGbiB9IGZyb20gJy4vY3JlYXRlLWNvbm5lY3QtZm4nO1xuXG5leHBvcnQgY2xhc3MgRmVhdHVyZVN0b3JlPFN0YXRlVHlwZSBleHRlbmRzIG9iamVjdD4gaW1wbGVtZW50cyBDb21wb25lbnRTdG9yZUxpa2U8U3RhdGVUeXBlPiB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBmZWF0dXJlSWQ6IHN0cmluZztcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9mZWF0dXJlS2V5OiBzdHJpbmc7XG4gICAgZ2V0IGZlYXR1cmVLZXkoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZlYXR1cmVLZXk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc3RhdGU6IFNpZ25hbDxTdGF0ZVR5cGU+ID0gc3RvcmVDb3JlLmFwcFN0YXRlLnNlbGVjdChcbiAgICAgICAgKHN0YXRlKSA9PiBzdGF0ZVt0aGlzLmZlYXR1cmVLZXldXG4gICAgKTtcbiAgICBnZXQgc3RhdGUoKTogU3RhdGVUeXBlIHtcbiAgICAgICAgcmV0dXJuIHVudHJhY2tlZCgoKSA9PiB0aGlzLl9zdGF0ZSgpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVN0YXRlOiBVcGRhdGVTdGF0ZUNhbGxiYWNrPFN0YXRlVHlwZT4gPSAoXG4gICAgICAgIHN0YXRlT3JDYWxsYmFjazogU3RhdGVPckNhbGxiYWNrPFN0YXRlVHlwZT4sXG4gICAgICAgIG9wZXJhdGlvblR5cGU6IE9wZXJhdGlvblR5cGUsXG4gICAgICAgIG5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZFxuICAgICk6IE1pbmlSeEFjdGlvbjxTdGF0ZVR5cGU+ID0+IHtcbiAgICAgICAgcmV0dXJuIHN0b3JlQ29yZS5kaXNwYXRjaCh7XG4gICAgICAgICAgICB0eXBlOiBjcmVhdGVNaW5pUnhBY3Rpb25UeXBlKG9wZXJhdGlvblR5cGUsIHRoaXMuZmVhdHVyZUtleSwgbmFtZSksXG4gICAgICAgICAgICBzdGF0ZU9yQ2FsbGJhY2ssXG4gICAgICAgICAgICBmZWF0dXJlSWQ6IHRoaXMuZmVhdHVyZUlkLFxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgY29uc3RydWN0b3IoZmVhdHVyZUtleTogc3RyaW5nLCBpbml0aWFsU3RhdGU6IFN0YXRlVHlwZSwgY29uZmlnOiBGZWF0dXJlU3RvcmVDb25maWcgPSB7fSkge1xuICAgICAgICB0aGlzLmZlYXR1cmVJZCA9IGdlbmVyYXRlSWQoKTtcbiAgICAgICAgdGhpcy5fZmVhdHVyZUtleSA9IGdlbmVyYXRlRmVhdHVyZUtleShmZWF0dXJlS2V5LCBjb25maWcubXVsdGkpO1xuXG4gICAgICAgIHN0b3JlQ29yZS5hZGRGZWF0dXJlPFN0YXRlVHlwZT4oXG4gICAgICAgICAgICB0aGlzLl9mZWF0dXJlS2V5LFxuICAgICAgICAgICAgY3JlYXRlRmVhdHVyZVN0b3JlUmVkdWNlcih0aGlzLmZlYXR1cmVJZCwgaW5pdGlhbFN0YXRlKVxuICAgICAgICApO1xuXG4gICAgICAgIGluamVjdChEZXN0cm95UmVmKS5vbkRlc3Ryb3koKCkgPT4gdGhpcy5kZXN0cm95KCkpO1xuICAgIH1cblxuICAgIHVuZG8oYWN0aW9uOiBBY3Rpb24pOiB2b2lkIHtcbiAgICAgICAgc3RvcmVDb3JlLmhhc1VuZG9FeHRlbnNpb25cbiAgICAgICAgICAgID8gc3RvcmVDb3JlLmRpc3BhdGNoKHVuZG8oYWN0aW9uKSlcbiAgICAgICAgICAgIDogbWluaVJ4RXJyb3IoJ1VuZG9FeHRlbnNpb24gaXMgbm90IGluaXRpYWxpemVkLicpO1xuICAgIH1cblxuICAgIHNldFN0YXRlID0gY3JlYXRlVXBkYXRlRm4odGhpcy51cGRhdGVTdGF0ZSk7XG4gICAgY29ubmVjdCA9IGNyZWF0ZUNvbm5lY3RGbih0aGlzLnVwZGF0ZVN0YXRlKTtcbiAgICByeEVmZmVjdCA9IGNyZWF0ZVJ4RWZmZWN0Rm4oKTtcbiAgICBzZWxlY3QgPSBjcmVhdGVTZWxlY3RhYmxlU2lnbmFsKHRoaXMuX3N0YXRlKS5zZWxlY3Q7XG5cbiAgICBwcml2YXRlIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHN0b3JlQ29yZS5yZW1vdmVGZWF0dXJlKHRoaXMuX2ZlYXR1cmVLZXkpO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZlYXR1cmVTdG9yZTxUIGV4dGVuZHMgb2JqZWN0PihcbiAgICBmZWF0dXJlS2V5OiBzdHJpbmcsXG4gICAgaW5pdGlhbFN0YXRlOiBULFxuICAgIGNvbmZpZzogRmVhdHVyZVN0b3JlQ29uZmlnID0ge31cbik6IEZlYXR1cmVTdG9yZTxUPiB7XG4gICAgcmV0dXJuIG5ldyBGZWF0dXJlU3RvcmU8VD4oZmVhdHVyZUtleSwgaW5pdGlhbFN0YXRlLCBjb25maWcpO1xufVxuIl19