@mini-rx/signal-store
Version:
Signal Store for Angular
55 lines • 10.5 kB
JavaScript
import { DestroyRef, inject, signal, untracked } from '@angular/core';
import { calculateExtensions, componentStoreConfig, componentStoreFeatureKey, createActionsOnQueue, createComponentStoreReducer, createMiniRxActionType, createUpdateFn, miniRxError, undo, } from '@mini-rx/common';
import { createSelectableWritableSignal } from './create-selectable-signal';
import { createRxEffectFn } from './create-rx-effect-fn';
import { createConnectFn } from './create-connect-fn';
import { createSignalStoreSubSink } from './signal-store-sub-sink';
export const globalCsConfig = componentStoreConfig();
export class ComponentStore {
get state() {
return untracked(() => this._state.get());
}
constructor(initialState, config) {
this.initialState = initialState;
this.config = config;
this.extensions = calculateExtensions(this.config, globalCsConfig.get());
this.hasUndoExtension = this.extensions.some((ext) => ext.id === 1 /* ExtensionId.UNDO */);
this.actionsOnQueue = createActionsOnQueue();
this._state = createSelectableWritableSignal(signal(this.initialState));
this.updateState = (stateOrCallback, operationType, name) => {
return this.actionsOnQueue.dispatch({
type: createMiniRxActionType(operationType, componentStoreFeatureKey, name),
stateOrCallback,
});
};
this.setState = createUpdateFn(this.updateState);
this.connect = createConnectFn(this.updateState);
this.rxEffect = createRxEffectFn();
this.select = this._state.select;
inject(DestroyRef).onDestroy(() => this.destroy());
const reducer = createComponentStoreReducer(initialState, this.extensions);
const subSink = createSignalStoreSubSink();
subSink.sink = this.actionsOnQueue.actions$.subscribe((action) => {
const newState = reducer(this.state, action);
this._state.set(newState);
});
this.actionsOnQueue.dispatch({
type: createMiniRxActionType("init" /* OperationType.INIT */, componentStoreFeatureKey),
});
}
undo(action) {
this.hasUndoExtension
? this.actionsOnQueue.dispatch(undo(action))
: miniRxError(`${this.constructor.name} has no UndoExtension yet.`);
}
destroy() {
// Dispatch an action really just for logging via LoggerExtension
this.actionsOnQueue.dispatch({
type: createMiniRxActionType("destroy" /* OperationType.DESTROY */, componentStoreFeatureKey),
});
}
}
export function createComponentStore(initialState, config) {
return new ComponentStore(initialState, config);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LXN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9zaWduYWwtc3RvcmUvc3JjL2xpYi9jb21wb25lbnQtc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0RSxPQUFPLEVBRUgsbUJBQW1CLEVBQ25CLG9CQUFvQixFQUdwQix3QkFBd0IsRUFDeEIsb0JBQW9CLEVBQ3BCLDJCQUEyQixFQUMzQixzQkFBc0IsRUFDdEIsY0FBYyxFQUdkLFdBQVcsRUFHWCxJQUFJLEdBRVAsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUU1RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFbkUsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLG9CQUFvQixFQUFFLENBQUM7QUFFckQsTUFBTSxPQUFPLGNBQWM7SUFZdkIsSUFBSSxLQUFLO1FBQ0wsT0FBTyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFhRCxZQUFvQixZQUF1QixFQUFVLE1BQTZCO1FBQTlELGlCQUFZLEdBQVosWUFBWSxDQUFXO1FBQVUsV0FBTSxHQUFOLE1BQU0sQ0FBdUI7UUExQmpFLGVBQVUsR0FBOEIsbUJBQW1CLENBQ3hFLElBQUksQ0FBQyxNQUFNLEVBQ1gsY0FBYyxDQUFDLEdBQUcsRUFBRSxDQUN2QixDQUFDO1FBQ2UscUJBQWdCLEdBQVksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQzdELENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSw2QkFBcUIsQ0FDdkMsQ0FBQztRQUVNLG1CQUFjLEdBQUcsb0JBQW9CLEVBQUUsQ0FBQztRQUV4QyxXQUFNLEdBQUcsOEJBQThCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBS25FLGdCQUFXLEdBQW1DLENBQ2xELGVBQTJDLEVBQzNDLGFBQTRCLEVBQzVCLElBQXdCLEVBQ0QsRUFBRTtZQUN6QixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDO2dCQUNoQyxJQUFJLEVBQUUsc0JBQXNCLENBQUMsYUFBYSxFQUFFLHdCQUF3QixFQUFFLElBQUksQ0FBQztnQkFDM0UsZUFBZTthQUNsQixDQUFDLENBQUM7UUFDUCxDQUFDLENBQUM7UUF3QkYsYUFBUSxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDNUMsWUFBTyxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDNUMsYUFBUSxHQUFHLGdCQUFnQixFQUFFLENBQUM7UUFDOUIsV0FBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBeEJ4QixNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBRW5ELE1BQU0sT0FBTyxHQUFHLDJCQUEyQixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFM0UsTUFBTSxPQUFPLEdBQUcsd0JBQXdCLEVBQUUsQ0FBQztRQUMzQyxPQUFPLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQzdELE1BQU0sUUFBUSxHQUFjLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ3hELElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzlCLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUM7WUFDekIsSUFBSSxFQUFFLHNCQUFzQixrQ0FBcUIsd0JBQXdCLENBQUM7U0FDN0UsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELElBQUksQ0FBQyxNQUFjO1FBQ2YsSUFBSSxDQUFDLGdCQUFnQjtZQUNqQixDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzVDLENBQUMsQ0FBQyxXQUFXLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksNEJBQTRCLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBT08sT0FBTztRQUNYLGlFQUFpRTtRQUNqRSxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQztZQUN6QixJQUFJLEVBQUUsc0JBQXNCLHdDQUF3Qix3QkFBd0IsQ0FBQztTQUNoRixDQUFDLENBQUM7SUFDUCxDQUFDO0NBQ0o7QUFFRCxNQUFNLFVBQVUsb0JBQW9CLENBQ2hDLFlBQWUsRUFDZixNQUE2QjtJQUU3QixPQUFPLElBQUksY0FBYyxDQUFJLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQztBQUN2RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVzdHJveVJlZiwgaW5qZWN0LCBzaWduYWwsIHVudHJhY2tlZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBBY3Rpb24sXG4gICAgY2FsY3VsYXRlRXh0ZW5zaW9ucyxcbiAgICBjb21wb25lbnRTdG9yZUNvbmZpZyxcbiAgICBDb21wb25lbnRTdG9yZUNvbmZpZyxcbiAgICBDb21wb25lbnRTdG9yZUV4dGVuc2lvbixcbiAgICBjb21wb25lbnRTdG9yZUZlYXR1cmVLZXksXG4gICAgY3JlYXRlQWN0aW9uc09uUXVldWUsXG4gICAgY3JlYXRlQ29tcG9uZW50U3RvcmVSZWR1Y2VyLFxuICAgIGNyZWF0ZU1pbmlSeEFjdGlvblR5cGUsXG4gICAgY3JlYXRlVXBkYXRlRm4sXG4gICAgRXh0ZW5zaW9uSWQsXG4gICAgTWluaVJ4QWN0aW9uLFxuICAgIG1pbmlSeEVycm9yLFxuICAgIE9wZXJhdGlvblR5cGUsXG4gICAgU3RhdGVPckNhbGxiYWNrLFxuICAgIHVuZG8sXG4gICAgVXBkYXRlU3RhdGVDYWxsYmFjayxcbn0gZnJvbSAnQG1pbmktcngvY29tbW9uJztcbmltcG9ydCB7IGNyZWF0ZVNlbGVjdGFibGVXcml0YWJsZVNpZ25hbCB9IGZyb20gJy4vY3JlYXRlLXNlbGVjdGFibGUtc2lnbmFsJztcbmltcG9ydCB7IENvbXBvbmVudFN0b3JlTGlrZSB9IGZyb20gJy4vbW9kZWxzJztcbmltcG9ydCB7IGNyZWF0ZVJ4RWZmZWN0Rm4gfSBmcm9tICcuL2NyZWF0ZS1yeC1lZmZlY3QtZm4nO1xuaW1wb3J0IHsgY3JlYXRlQ29ubmVjdEZuIH0gZnJvbSAnLi9jcmVhdGUtY29ubmVjdC1mbic7XG5pbXBvcnQgeyBjcmVhdGVTaWduYWxTdG9yZVN1YlNpbmsgfSBmcm9tICcuL3NpZ25hbC1zdG9yZS1zdWItc2luayc7XG5cbmV4cG9ydCBjb25zdCBnbG9iYWxDc0NvbmZpZyA9IGNvbXBvbmVudFN0b3JlQ29uZmlnKCk7XG5cbmV4cG9ydCBjbGFzcyBDb21wb25lbnRTdG9yZTxTdGF0ZVR5cGUgZXh0ZW5kcyBvYmplY3Q+IGltcGxlbWVudHMgQ29tcG9uZW50U3RvcmVMaWtlPFN0YXRlVHlwZT4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZXh0ZW5zaW9uczogQ29tcG9uZW50U3RvcmVFeHRlbnNpb25bXSA9IGNhbGN1bGF0ZUV4dGVuc2lvbnMoXG4gICAgICAgIHRoaXMuY29uZmlnLFxuICAgICAgICBnbG9iYWxDc0NvbmZpZy5nZXQoKVxuICAgICk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBoYXNVbmRvRXh0ZW5zaW9uOiBib29sZWFuID0gdGhpcy5leHRlbnNpb25zLnNvbWUoXG4gICAgICAgIChleHQpID0+IGV4dC5pZCA9PT0gRXh0ZW5zaW9uSWQuVU5ET1xuICAgICk7XG5cbiAgICBwcml2YXRlIGFjdGlvbnNPblF1ZXVlID0gY3JlYXRlQWN0aW9uc09uUXVldWUoKTtcblxuICAgIHByaXZhdGUgX3N0YXRlID0gY3JlYXRlU2VsZWN0YWJsZVdyaXRhYmxlU2lnbmFsKHNpZ25hbCh0aGlzLmluaXRpYWxTdGF0ZSkpO1xuICAgIGdldCBzdGF0ZSgpOiBTdGF0ZVR5cGUge1xuICAgICAgICByZXR1cm4gdW50cmFja2VkKCgpID0+IHRoaXMuX3N0YXRlLmdldCgpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVN0YXRlOiBVcGRhdGVTdGF0ZUNhbGxiYWNrPFN0YXRlVHlwZT4gPSAoXG4gICAgICAgIHN0YXRlT3JDYWxsYmFjazogU3RhdGVPckNhbGxiYWNrPFN0YXRlVHlwZT4sXG4gICAgICAgIG9wZXJhdGlvblR5cGU6IE9wZXJhdGlvblR5cGUsXG4gICAgICAgIG5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZFxuICAgICk6IE1pbmlSeEFjdGlvbjxTdGF0ZVR5cGU+ID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aW9uc09uUXVldWUuZGlzcGF0Y2goe1xuICAgICAgICAgICAgdHlwZTogY3JlYXRlTWluaVJ4QWN0aW9uVHlwZShvcGVyYXRpb25UeXBlLCBjb21wb25lbnRTdG9yZUZlYXR1cmVLZXksIG5hbWUpLFxuICAgICAgICAgICAgc3RhdGVPckNhbGxiYWNrLFxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBpbml0aWFsU3RhdGU6IFN0YXRlVHlwZSwgcHJpdmF0ZSBjb25maWc/OiBDb21wb25lbnRTdG9yZUNvbmZpZykge1xuICAgICAgICBpbmplY3QoRGVzdHJveVJlZikub25EZXN0cm95KCgpID0+IHRoaXMuZGVzdHJveSgpKTtcblxuICAgICAgICBjb25zdCByZWR1Y2VyID0gY3JlYXRlQ29tcG9uZW50U3RvcmVSZWR1Y2VyKGluaXRpYWxTdGF0ZSwgdGhpcy5leHRlbnNpb25zKTtcblxuICAgICAgICBjb25zdCBzdWJTaW5rID0gY3JlYXRlU2lnbmFsU3RvcmVTdWJTaW5rKCk7XG4gICAgICAgIHN1YlNpbmsuc2luayA9IHRoaXMuYWN0aW9uc09uUXVldWUuYWN0aW9ucyQuc3Vic2NyaWJlKChhY3Rpb24pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5ld1N0YXRlOiBTdGF0ZVR5cGUgPSByZWR1Y2VyKHRoaXMuc3RhdGUsIGFjdGlvbik7XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZS5zZXQobmV3U3RhdGUpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmFjdGlvbnNPblF1ZXVlLmRpc3BhdGNoKHtcbiAgICAgICAgICAgIHR5cGU6IGNyZWF0ZU1pbmlSeEFjdGlvblR5cGUoT3BlcmF0aW9uVHlwZS5JTklULCBjb21wb25lbnRTdG9yZUZlYXR1cmVLZXkpLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB1bmRvKGFjdGlvbjogQWN0aW9uKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaGFzVW5kb0V4dGVuc2lvblxuICAgICAgICAgICAgPyB0aGlzLmFjdGlvbnNPblF1ZXVlLmRpc3BhdGNoKHVuZG8oYWN0aW9uKSlcbiAgICAgICAgICAgIDogbWluaVJ4RXJyb3IoYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfSBoYXMgbm8gVW5kb0V4dGVuc2lvbiB5ZXQuYCk7XG4gICAgfVxuXG4gICAgc2V0U3RhdGUgPSBjcmVhdGVVcGRhdGVGbih0aGlzLnVwZGF0ZVN0YXRlKTtcbiAgICBjb25uZWN0ID0gY3JlYXRlQ29ubmVjdEZuKHRoaXMudXBkYXRlU3RhdGUpO1xuICAgIHJ4RWZmZWN0ID0gY3JlYXRlUnhFZmZlY3RGbigpO1xuICAgIHNlbGVjdCA9IHRoaXMuX3N0YXRlLnNlbGVjdDtcblxuICAgIHByaXZhdGUgZGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgLy8gRGlzcGF0Y2ggYW4gYWN0aW9uIHJlYWxseSBqdXN0IGZvciBsb2dnaW5nIHZpYSBMb2dnZXJFeHRlbnNpb25cbiAgICAgICAgdGhpcy5hY3Rpb25zT25RdWV1ZS5kaXNwYXRjaCh7XG4gICAgICAgICAgICB0eXBlOiBjcmVhdGVNaW5pUnhBY3Rpb25UeXBlKE9wZXJhdGlvblR5cGUuREVTVFJPWSwgY29tcG9uZW50U3RvcmVGZWF0dXJlS2V5KSxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29tcG9uZW50U3RvcmU8VCBleHRlbmRzIG9iamVjdD4oXG4gICAgaW5pdGlhbFN0YXRlOiBULFxuICAgIGNvbmZpZz86IENvbXBvbmVudFN0b3JlQ29uZmlnXG4pOiBDb21wb25lbnRTdG9yZTxUPiB7XG4gICAgcmV0dXJuIG5ldyBDb21wb25lbnRTdG9yZTxUPihpbml0aWFsU3RhdGUsIGNvbmZpZyk7XG59XG4iXX0=