ngx-easy-state-manager 0.0.3 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -10,11 +10,22 @@
10
10
  npm install ngx-easy-state-manager
11
11
  ```
12
12
 
13
+ ## Versions
14
+
15
+ | Version | Option |
16
+ | ------- | --------------------------------------------- |
17
+ | ^0.0.4 | Angular 19. |
18
+ | ^1.0.0 | Added angular support from ^18.0.0 to ^21.0.0,|
19
+ | | and converted to use signals. |
13
20
  ## Usage
14
21
 
22
+ EasyStateManagerService (Signals Version)
23
+ A lightweight and resilient state management service for Angular using Signals. It supports dynamic keys, immutable updates, and persistent subscriptions.
24
+
15
25
  1. **Import the EasyStateManagerService**
26
+ This library now supports Angular Signals for better performance. However, the classic Observable-based version is still available for backward compatibility.
16
27
 
17
- First, import the EasyStateManagerService into your component or service where you want to manage the state.
28
+ Signals Version (Recommended for Angular 16+)
18
29
 
19
30
  app.module.ts
20
31
 
@@ -22,111 +33,173 @@ app.module.ts
22
33
  import { EasyStateManagerService } from "ngx-easy-state-manage";
23
34
 
24
35
  @NgModule({
25
- providers: [{ provide: EasyStateManagerService }],
36
+ providers: [EasyStateManagerService], // Simplified registration
26
37
  })
27
38
  export class AppModule {}
28
39
  ```
40
+ Observable Version (Classic)
41
+ If you prefer using RxJS Observables, use the original service:
29
42
 
30
- 2. **Inject the Service**
43
+ ```typescript
44
+ import { EasyStateManagerService } from "ngx-easy-state-manage";
31
45
 
32
- Inject EasyStateManagerService in the constructor of your component or service.
46
+ @NgModule({
47
+ providers: [EasyStateManagerService],
48
+ })
49
+ export class AppModule {}
50
+ ```
51
+
52
+ 2. **Inject the Service**
53
+ Inject the service into your component or another service:
33
54
 
34
55
  ```typescript
35
56
  constructor(private easyStateManager: EasyStateManagerService) {}
36
57
  ```
37
58
 
38
59
  3. **Assign State**
39
-
40
- You can assign a new state using the assignState method. Optionally, you can also associate the state with a specific component name.
60
+ Create or update state using assignState. It automatically handles Immutable updates for objects and arrays (creating new references to trigger change detection).
41
61
 
42
62
  ```typescript
43
- this.easyStateManager.assignState("exampleKey", "exampleValue", "ExampleComponentName");
44
- ```
63
+ // Assign a primitive
64
+ this.easyStateManager.assignState("title", "My App");
45
65
 
46
- 4. **Retrieve State**
66
+ // Assign/Update an object (performs a shallow merge)
67
+ this.easyStateManager.assignState("user", { id: 1, name: "John" });
68
+ ```
47
69
 
48
- To get the current state associated with a specific key, use the getState method.
70
+ 4. **Retrieve State (Snapshot)**
71
+ To get the current value of a state key once (without subscription), use getState:
49
72
 
50
73
  ```typescript
51
- const currentState = this.easyStateManager.getState("exampleKey");
52
- console.log(currentState); // Output: 'exampleValue'
74
+ const currentTitle = this.easyStateManager.getState<string>("title");
75
+ console.log(currentTitle); // Output: 'My App'
53
76
  ```
54
77
 
55
- 5. **Subscribe to State Changes**
56
-
57
- You can subscribe to state changes using the selectStateChange method, which returns an Observable.
78
+ 5. **Subscribe to State Changes (Signals)**
79
+ The selectStateChange method returns a Read-only Signal. It is "resilient": if you delete the key and recreate it later, the signal will automatically reconnect and provide the new values.
58
80
 
59
81
  ```typescript
60
- this.easyStateManager.selectStateChange("exampleKey").subscribe((newValue) => {
61
- console.log("State has changed:", newValue);
62
- });
82
+ // In your component
83
+ public title = this.easyStateManager.selectStateChange<string>("title");
84
+
85
+ constructor() {
86
+ effect(() => {
87
+ console.log("Title updated:", this.title());
88
+ });
89
+ }
90
+ ```
91
+
92
+ In your HTML template:
93
+
94
+ ```html
95
+ <h1>{{ title() || 'Loading...' }}</h1>
63
96
  ```
64
97
 
65
98
  6. **Delete State**
66
99
 
67
- To delete a state associated with a specific key, use the deleteState method.
100
+ To remove a state key. All active subscribers to this key will immediately receive null.
68
101
 
69
102
  ```typescript
70
- this.easyStateManager.deleteState("exampleKey");
103
+ this.easyStateManager.deleteState("title");
71
104
  ```
72
105
 
73
- ## API
106
+ 7. **Clear All**
107
+ To reset the entire store and notify all active subscribers.
74
108
 
75
- assignState(key: string, value: any, componentName?: string): void
76
- Assigns a value to the state with an optional component name.
77
-
78
- getState(key?: string): any
79
- Retrieves the current value of the state associated with the specified key.
109
+ ```typescript
110
+ this.easyStateManager.clearAll();
111
+ ```
80
112
 
81
- selectStateChange(key: string): Observable<any>
82
- Returns an Observable that emits whenever the state associated with the specified key changes.
113
+ ## API
83
114
 
115
+ assignState<T>(key: string, value: T): void
116
+ Assigns a value to the state.
117
+ Immutable updates: If the value is an object or an array, the service creates a new reference (shallow copy) to ensure Angular's change detection is triggered.
118
+ Dynamic: If the key doesn't exist, it will be created.
119
+ selectStateChange<T>(key: string): Signal<T | null>
120
+ Returns a Read-only Signal for the specified key.
121
+ Resilient: If the state is deleted and then recreated with the same key, this signal will automatically "reconnect" to the new value.
122
+ Reactive: Perfect for use in templates or effect(). Returns null if the key does not exist or was deleted.
123
+ getState<T>(key: string): T | null
124
+ Retrieves a snapshot of the current value associated with the specified key.
125
+ Does not create a subscription.
126
+ Returns null if the key is not found.
84
127
  deleteState(key: string): void
85
- Deletes the state associated with the specified key.
128
+ Removes the state associated with the specified key.
129
+ All active signals created via selectStateChange for this key will be updated to null.
130
+ clearAll(): void
131
+ Completely resets the store.
132
+ All keys are removed, and all active subscribers are notified with null.
133
+
134
+ | Feature | EasyStateManagerServiceSignal | EasyStateManagerService |
135
+ |----------------------------------------------------------------------------|
136
+ |Reactive Type | Signal<T> | Observable<T> |
137
+ |Update Logic |Immutable (Shallow Copy) | Direct / Manual |
138
+ |Resilience |Reconnects after deleteState | Subscription ends on delete*|
139
+ |Template Usage| {{ state() }} | `${{state}}` |
140
+
141
+ Note: The new EasyStateManagerServiceSignal is specifically designed to work with Angular's new reactivity model.
142
+ It provides "resilient" connections, meaning if a key is deleted and recreated, your UI components will automatically pick up the new value without needing to re-subscribe.
86
143
 
87
144
  ## Example
88
145
 
89
- stateTypes
146
+ stateTypes.ts
90
147
 
91
148
  ```typescript
92
149
  export const SELECTED_EMOJI = "selectedEmoji";
150
+
151
+ export interface EmojiState {
152
+ emoji: string;
153
+ }
93
154
  ```
94
155
 
95
156
  app.compoinent
96
157
 
97
158
  ```typescript
98
- import { Component, OnInit } from "@angular/core";
159
+ import { Component, effect, Signal } from "@angular/core";
99
160
  import { EmojiPicker } from "ngx-easy-emoji-picker";
100
- import { EasyStateManagerService } from "ngx-easy-state-manager";
101
-
102
- import { SELECTED_EMOJI } from "./stateTypes";
161
+ import { EasyStateManagerService } from "ngx-easy-state-manage";
162
+ import { SELECTED_EMOJI, EmojiState } from "./stateTypes";
103
163
 
104
164
  @Component({
105
165
  selector: "app-root",
106
166
  standalone: true,
107
167
  imports: [EmojiPicker],
108
- templateUrl: "./app.component.html",
109
- styleUrl: "./app.component.css",
110
- providers: [EasyStateManagerService],
168
+ template: `
169
+ <!-- Direct usage of signal in template -->
170
+ <div class="display">Selected: {{ emojiState()?.emoji || "None" }}</div>
171
+
172
+ <ngx-easy-emoji-picker (onEmojiSelected)="onEmojiSelected($event)">
173
+ </ngx-easy-emoji-picker>
174
+ `,
175
+ // Service is providedIn: 'root', but can be added to providers if needed locally
111
176
  })
112
- export class AppComponent implements OnInit {
113
- title = "my-project";
114
-
115
- selectedEmoji = "";
116
-
117
- constructor(private _stateManager: EasyStateManagerService) {}
118
-
119
- ngOnInit() {
120
- this._stateManager.selectStateChange(SELECTED_EMOJI).subscribe((state) => {
121
- if (state) this.selectedEmoji = state.emoji;
122
-
123
- console.log("Selected emoji:", this.selectedEmoji);
177
+ export class AppComponent {
178
+ // 1. Get a Read-only Signal for the state
179
+ public emojiState: Signal<EmojiState | null>;
180
+
181
+ constructor(private _stateManager: EasyStateManagerService) {
182
+ this.emojiState =
183
+ this._stateManager.selectStateChange<EmojiState>(SELECTED_EMOJI);
184
+
185
+ // 2. React to changes in logic (optional)
186
+ effect(() => {
187
+ const current = this.emojiState();
188
+ if (current) {
189
+ console.log("Emoji updated in state:", current.emoji);
190
+ }
124
191
  });
125
192
  }
126
193
 
127
194
  onEmojiSelected(emoji: string) {
195
+ // 3. Assign new state (it will trigger the signal above)
128
196
  this._stateManager.assignState(SELECTED_EMOJI, { emoji: emoji });
129
197
  }
198
+
199
+ removeEmoji() {
200
+ // 4. Delete state - emojiState() will automatically become 'null'
201
+ this._stateManager.deleteState(SELECTED_EMOJI);
202
+ }
130
203
  }
131
204
  ```
132
205
 
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Injectable } from '@angular/core';
2
+ import { Injectable, signal, computed } from '@angular/core';
3
3
  import { BehaviorSubject } from 'rxjs';
4
4
 
5
5
  class EasyStateManagerService {
@@ -37,16 +37,103 @@ class EasyStateManagerService {
37
37
  delete this._store[key];
38
38
  }
39
39
  }
40
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: EasyStateManagerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
41
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: EasyStateManagerService, providedIn: "root" }); }
40
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: EasyStateManagerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
41
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: EasyStateManagerService, providedIn: "root" }); }
42
42
  }
43
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: EasyStateManagerService, decorators: [{
43
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: EasyStateManagerService, decorators: [{
44
44
  type: Injectable,
45
45
  args: [{
46
46
  providedIn: "root",
47
47
  }]
48
48
  }] });
49
49
 
50
+ class EasyStateManagerServiceSignal {
51
+ constructor() {
52
+ /**
53
+ * Main store holding signals for each state key.
54
+ * Wrapped in a signal to track adding/removing keys dynamically.
55
+ */
56
+ this._store = signal({}, ...(ngDevMode ? [{ debugName: "_store" }] : []));
57
+ }
58
+ /**
59
+ * Sets or updates state for a specific key.
60
+ * Implements immutable update logic for objects and arrays to ensure change detection.
61
+ * @param key Unique identifier for the state slice.
62
+ * @param value New value to assign or merge.
63
+ */
64
+ assignState(key, value) {
65
+ const currentStore = this._store();
66
+ const existingSignal = currentStore[key];
67
+ if (existingSignal) {
68
+ // If signal exists, update its value using immutable patterns
69
+ existingSignal.update(oldValue => {
70
+ if (Array.isArray(value))
71
+ return [...value];
72
+ if (value !== null && typeof value === 'object') {
73
+ return { ...oldValue, ...value };
74
+ }
75
+ return value;
76
+ });
77
+ }
78
+ else {
79
+ // Create a new signal and trigger store structure update
80
+ const newSignal = signal(value, ...(ngDevMode ? [{ debugName: "newSignal" }] : []));
81
+ this._store.update(store => ({
82
+ ...store,
83
+ [key]: newSignal
84
+ }));
85
+ }
86
+ }
87
+ /**
88
+ * Returns a "resilient" Read-only signal for a specific key.
89
+ * It tracks the store structure: if a key is deleted and recreated,
90
+ * the subscriber automatically reconnects to the new signal.
91
+ * @param key Key to watch.
92
+ */
93
+ selectStateChange(key) {
94
+ return computed(() => {
95
+ // Subscribes to the store's dictionary changes
96
+ const s = this._store()[key];
97
+ // Returns signal value if key exists, otherwise null
98
+ return s ? s() : null;
99
+ });
100
+ }
101
+ /**
102
+ * Returns a current snapshot of the state without subscription.
103
+ */
104
+ getState(key) {
105
+ const s = this._store()[key];
106
+ return s ? s() : null;
107
+ }
108
+ /**
109
+ * Removes a key from the store.
110
+ * All subscribers to this key will immediately receive 'null'.
111
+ */
112
+ deleteState(key) {
113
+ if (this._store()[key]) {
114
+ this._store.update(store => {
115
+ const newStore = { ...store };
116
+ delete newStore[key];
117
+ return newStore;
118
+ });
119
+ }
120
+ }
121
+ /**
122
+ * Resets the entire store to an empty state.
123
+ */
124
+ clearAll() {
125
+ this._store.set({});
126
+ }
127
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: EasyStateManagerServiceSignal, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
128
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: EasyStateManagerServiceSignal, providedIn: 'root' }); }
129
+ }
130
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: EasyStateManagerServiceSignal, decorators: [{
131
+ type: Injectable,
132
+ args: [{
133
+ providedIn: 'root'
134
+ }]
135
+ }] });
136
+
50
137
  /*
51
138
  * Public API Surface of ngx-easy-state-manager
52
139
  */
@@ -55,5 +142,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.3", ngImpor
55
142
  * Generated bundle index. Do not edit.
56
143
  */
57
144
 
58
- export { EasyStateManagerService };
145
+ export { EasyStateManagerService, EasyStateManagerServiceSignal };
59
146
  //# sourceMappingURL=ngx-easy-state-manager.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-easy-state-manager.mjs","sources":["../../../projects/ngx-easy-state-manager/src/lib/ngx-easy-state-manager.service.ts","../../../projects/ngx-easy-state-manager/src/public-api.ts","../../../projects/ngx-easy-state-manager/src/ngx-easy-state-manager.ts"],"sourcesContent":["import { Injectable } from \"@angular/core\";\r\nimport { BehaviorSubject, Observable } from \"rxjs\";\r\n\r\n@Injectable({\r\n providedIn: \"root\",\r\n})\r\nexport class EasyStateManagerService {\r\n private _store: Store = {};\r\n\r\n public assignState<T>(key: string, value: T): void {\r\n if ((key as string) in this._store) {\r\n const storeValue = this._store[key].value;\r\n // check type mismatch\r\n if (storeValue && typeof storeValue !== typeof value) {\r\n throw new Error(\r\n `Type mismatch: ${typeof this._store[key].value} !== ${typeof value}`\r\n );\r\n }\r\n\r\n this._store[key].next(value);\r\n } else {\r\n this._store[key] = new BehaviorSubject<T>(value);\r\n }\r\n }\r\n\r\n public getState<T>(key?: string): T | undefined {\r\n if (key && (key as string) in this._store) {\r\n return this._store[key].value;\r\n }\r\n return undefined;\r\n }\r\n\r\n public selectStateChange<T>(key: string): BehaviorSubject<any> {\r\n if (key in this._store) {\r\n return this._store[key] as BehaviorSubject<T>;\r\n }\r\n\r\n this._store[key] = new BehaviorSubject<T>(null as T);\r\n\r\n return this._store[key];\r\n }\r\n\r\n public deleteState(key: string): void {\r\n if (key in this._store) {\r\n delete this._store[key];\r\n }\r\n }\r\n}\r\n\r\ntype Store = {\r\n [key: string]: BehaviorSubject<any>;\r\n};\r\n","/*\r\n * Public API Surface of ngx-easy-state-manager\r\n */\r\n\r\nexport * from './lib/ngx-easy-state-manager.service';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;MAMa,uBAAuB,CAAA;AAHpC,IAAA,WAAA,GAAA;QAIU,IAAM,CAAA,MAAA,GAAU,EAAE,CAAC;AAwC5B,KAAA;IAtCQ,WAAW,CAAI,GAAW,EAAE,KAAQ,EAAA;AACzC,QAAA,IAAK,GAAc,IAAI,IAAI,CAAC,MAAM,EAAE;YAClC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;;YAE1C,IAAI,UAAU,IAAI,OAAO,UAAU,KAAK,OAAO,KAAK,EAAE;AACpD,gBAAA,MAAM,IAAI,KAAK,CACb,kBAAkB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAA,KAAA,EAAQ,OAAO,KAAK,CAAA,CAAE,CACtE,CAAC;aACH;YAED,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SAC9B;aAAM;YACL,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,eAAe,CAAI,KAAK,CAAC,CAAC;SAClD;KACF;AAEM,IAAA,QAAQ,CAAI,GAAY,EAAA;QAC7B,IAAI,GAAG,IAAK,GAAc,IAAI,IAAI,CAAC,MAAM,EAAE;YACzC,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;SAC/B;AACD,QAAA,OAAO,SAAS,CAAC;KAClB;AAEM,IAAA,iBAAiB,CAAI,GAAW,EAAA;AACrC,QAAA,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE;AACtB,YAAA,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAuB,CAAC;SAC/C;QAED,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,eAAe,CAAI,IAAS,CAAC,CAAC;AAErD,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;KACzB;AAEM,IAAA,WAAW,CAAC,GAAW,EAAA;AAC5B,QAAA,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE;AACtB,YAAA,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;SACzB;KACF;8GAxCU,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAAvB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,uBAAuB,cAFtB,MAAM,EAAA,CAAA,CAAA,EAAA;;2FAEP,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAHnC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;;ACLD;;AAEG;;ACFH;;AAEG;;;;"}
1
+ {"version":3,"file":"ngx-easy-state-manager.mjs","sources":["../../../projects/ngx-easy-state-manager/src/lib/ngx-easy-state-manager.service.ts","../../../projects/ngx-easy-state-manager/src/lib/ngx-easy-state-manager-signal.service.ts","../../../projects/ngx-easy-state-manager/src/public-api.ts","../../../projects/ngx-easy-state-manager/src/ngx-easy-state-manager.ts"],"sourcesContent":["import { Injectable } from \"@angular/core\";\r\nimport { BehaviorSubject } from \"rxjs\";\r\n\r\n@Injectable({\r\n providedIn: \"root\",\r\n})\r\nexport class EasyStateManagerService {\r\n private _store: Store = {};\r\n\r\n public assignState<T>(key: string, value: T): void {\r\n if (key in this._store) {\r\n const storeValue = this._store[key].value;\r\n // check type mismatch\r\n if (storeValue && typeof storeValue !== typeof value) {\r\n throw new Error(\r\n `Type mismatch: ${typeof this._store[key].value} !== ${typeof value}`\r\n );\r\n }\r\n\r\n this._store[key].next(value);\r\n } else {\r\n this._store[key] = new BehaviorSubject<T>(value);\r\n }\r\n }\r\n\r\n public getState<T>(key?: string): T | undefined {\r\n if (key && key in this._store) {\r\n return this._store[key].value;\r\n }\r\n return undefined;\r\n }\r\n\r\n public selectStateChange<T>(key: string): BehaviorSubject<any> {\r\n if (key in this._store) {\r\n return this._store[key] as BehaviorSubject<T>;\r\n }\r\n\r\n this._store[key] = new BehaviorSubject<T>(null as T);\r\n\r\n return this._store[key];\r\n }\r\n\r\n public deleteState(key: string): void {\r\n if (key in this._store) {\r\n delete this._store[key];\r\n }\r\n }\r\n}\r\n\r\ntype Store = {\r\n [key: string]: BehaviorSubject<any>;\r\n};\r\n","import { Injectable, signal, computed, Signal, WritableSignal } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class EasyStateManagerServiceSignal {\r\n /**\r\n * Main store holding signals for each state key.\r\n * Wrapped in a signal to track adding/removing keys dynamically.\r\n */\r\n private readonly _store = signal<Record<string, WritableSignal<any>>>({});\r\n\r\n /**\r\n * Sets or updates state for a specific key.\r\n * Implements immutable update logic for objects and arrays to ensure change detection.\r\n * @param key Unique identifier for the state slice.\r\n * @param value New value to assign or merge.\r\n */\r\n public assignState<T>(key: string, value: T): void {\r\n const currentStore = this._store();\r\n const existingSignal = currentStore[key];\r\n\r\n if (existingSignal) {\r\n // If signal exists, update its value using immutable patterns\r\n existingSignal.update(oldValue => {\r\n if (Array.isArray(value)) return [...value];\r\n if (value !== null && typeof value === 'object') {\r\n return { ...oldValue, ...value };\r\n }\r\n return value;\r\n });\r\n } else {\r\n // Create a new signal and trigger store structure update\r\n const newSignal = signal(value);\r\n this._store.update(store => ({\r\n ...store,\r\n [key]: newSignal\r\n }));\r\n }\r\n }\r\n\r\n /**\r\n * Returns a \"resilient\" Read-only signal for a specific key.\r\n * It tracks the store structure: if a key is deleted and recreated, \r\n * the subscriber automatically reconnects to the new signal.\r\n * @param key Key to watch.\r\n */\r\n public selectStateChange<T>(key: string): Signal<T | null> {\r\n return computed(() => {\r\n // Subscribes to the store's dictionary changes\r\n const s = this._store()[key];\r\n // Returns signal value if key exists, otherwise null\r\n return s ? s() : null;\r\n });\r\n }\r\n\r\n /**\r\n * Returns a current snapshot of the state without subscription.\r\n */\r\n public getState<T>(key: string): T | null {\r\n const s = this._store()[key];\r\n return s ? s() : null;\r\n }\r\n\r\n /**\r\n * Removes a key from the store.\r\n * All subscribers to this key will immediately receive 'null'.\r\n */\r\n public deleteState(key: string): void {\r\n if (this._store()[key]) {\r\n this._store.update(store => {\r\n const newStore = { ...store };\r\n delete newStore[key];\r\n return newStore;\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Resets the entire store to an empty state.\r\n */\r\n public clearAll(): void {\r\n this._store.set({});\r\n }\r\n}\r\n","/*\r\n * Public API Surface of ngx-easy-state-manager\r\n */\r\n\r\nexport * from './lib/ngx-easy-state-manager.service';\r\nexport * from './lib/ngx-easy-state-manager-signal.service';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
package/index.d.ts CHANGED
@@ -1,5 +1,52 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- /// <amd-module name="ngx-easy-state-manager" />
5
- export * from './public-api';
1
+ import { BehaviorSubject } from 'rxjs';
2
+ import * as i0 from '@angular/core';
3
+ import { Signal } from '@angular/core';
4
+
5
+ declare class EasyStateManagerService {
6
+ private _store;
7
+ assignState<T>(key: string, value: T): void;
8
+ getState<T>(key?: string): T | undefined;
9
+ selectStateChange<T>(key: string): BehaviorSubject<any>;
10
+ deleteState(key: string): void;
11
+ static ɵfac: i0.ɵɵFactoryDeclaration<EasyStateManagerService, never>;
12
+ static ɵprov: i0.ɵɵInjectableDeclaration<EasyStateManagerService>;
13
+ }
14
+
15
+ declare class EasyStateManagerServiceSignal {
16
+ /**
17
+ * Main store holding signals for each state key.
18
+ * Wrapped in a signal to track adding/removing keys dynamically.
19
+ */
20
+ private readonly _store;
21
+ /**
22
+ * Sets or updates state for a specific key.
23
+ * Implements immutable update logic for objects and arrays to ensure change detection.
24
+ * @param key Unique identifier for the state slice.
25
+ * @param value New value to assign or merge.
26
+ */
27
+ assignState<T>(key: string, value: T): void;
28
+ /**
29
+ * Returns a "resilient" Read-only signal for a specific key.
30
+ * It tracks the store structure: if a key is deleted and recreated,
31
+ * the subscriber automatically reconnects to the new signal.
32
+ * @param key Key to watch.
33
+ */
34
+ selectStateChange<T>(key: string): Signal<T | null>;
35
+ /**
36
+ * Returns a current snapshot of the state without subscription.
37
+ */
38
+ getState<T>(key: string): T | null;
39
+ /**
40
+ * Removes a key from the store.
41
+ * All subscribers to this key will immediately receive 'null'.
42
+ */
43
+ deleteState(key: string): void;
44
+ /**
45
+ * Resets the entire store to an empty state.
46
+ */
47
+ clearAll(): void;
48
+ static ɵfac: i0.ɵɵFactoryDeclaration<EasyStateManagerServiceSignal, never>;
49
+ static ɵprov: i0.ɵɵInjectableDeclaration<EasyStateManagerServiceSignal>;
50
+ }
51
+
52
+ export { EasyStateManagerService, EasyStateManagerServiceSignal };
package/package.json CHANGED
@@ -1,17 +1,29 @@
1
1
  {
2
2
  "name": "ngx-easy-state-manager",
3
- "version": "0.0.3",
3
+ "version": "1.0.0",
4
4
  "author": "Alex Voronin <alex.varonin@gmail.com>",
5
5
  "license": "MIT",
6
6
  "peerDependencies": {
7
- "@angular/common": "^18.1.0",
8
- "@angular/core": "^18.1.0"
7
+ "@angular/common": "^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0",
8
+ "@angular/core": "^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0",
9
+ "rxjs": "^7.8.0",
10
+ "zone.js": "~0.14.0 || ~0.15.0"
9
11
  },
10
12
  "description": "ngx-easy-state-manager is a lightweight, intuitive library for managing state in Angular applications. It simplifies state management by providing a straightforward API for creating, updating, and accessing state, without the complexity of traditional approaches.",
11
13
  "dependencies": {
12
14
  "tslib": "^2.3.0"
13
15
  },
14
16
  "sideEffects": false,
17
+ "exports": {
18
+ ".": {
19
+ "types": "./index.d.ts",
20
+ "esm2022": "./fesm2022/ngx-easy-state-manager.mjs",
21
+ "default": "./fesm2022/ngx-easy-state-manager.mjs"
22
+ },
23
+ "./package.json": {
24
+ "default": "./package.json"
25
+ }
26
+ },
15
27
  "module": "fesm2022/ngx-easy-state-manager.mjs",
16
28
  "typings": "index.d.ts",
17
29
  "repository": {
@@ -23,16 +35,5 @@
23
35
  "state management",
24
36
  "angular",
25
37
  "ngx"
26
- ],
27
- "exports": {
28
- "./package.json": {
29
- "default": "./package.json"
30
- },
31
- ".": {
32
- "types": "./index.d.ts",
33
- "esm2022": "./esm2022/ngx-easy-state-manager.mjs",
34
- "esm": "./esm2022/ngx-easy-state-manager.mjs",
35
- "default": "./fesm2022/ngx-easy-state-manager.mjs"
36
- }
37
- }
38
+ ]
38
39
  }
@@ -1,48 +0,0 @@
1
- import { Injectable } from "@angular/core";
2
- import { BehaviorSubject } from "rxjs";
3
- import * as i0 from "@angular/core";
4
- export class EasyStateManagerService {
5
- constructor() {
6
- this._store = {};
7
- }
8
- assignState(key, value) {
9
- if (key in this._store) {
10
- const storeValue = this._store[key].value;
11
- // check type mismatch
12
- if (storeValue && typeof storeValue !== typeof value) {
13
- throw new Error(`Type mismatch: ${typeof this._store[key].value} !== ${typeof value}`);
14
- }
15
- this._store[key].next(value);
16
- }
17
- else {
18
- this._store[key] = new BehaviorSubject(value);
19
- }
20
- }
21
- getState(key) {
22
- if (key && key in this._store) {
23
- return this._store[key].value;
24
- }
25
- return undefined;
26
- }
27
- selectStateChange(key) {
28
- if (key in this._store) {
29
- return this._store[key];
30
- }
31
- this._store[key] = new BehaviorSubject(null);
32
- return this._store[key];
33
- }
34
- deleteState(key) {
35
- if (key in this._store) {
36
- delete this._store[key];
37
- }
38
- }
39
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: EasyStateManagerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
40
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: EasyStateManagerService, providedIn: "root" }); }
41
- }
42
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: EasyStateManagerService, decorators: [{
43
- type: Injectable,
44
- args: [{
45
- providedIn: "root",
46
- }]
47
- }] });
48
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWVhc3ktc3RhdGUtbWFuYWdlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWVhc3ktc3RhdGUtbWFuYWdlci9zcmMvbGliL25neC1lYXN5LXN0YXRlLW1hbmFnZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxlQUFlLEVBQWMsTUFBTSxNQUFNLENBQUM7O0FBS25ELE1BQU0sT0FBTyx1QkFBdUI7SUFIcEM7UUFJVSxXQUFNLEdBQVUsRUFBRSxDQUFDO0tBd0M1QjtJQXRDUSxXQUFXLENBQUksR0FBVyxFQUFFLEtBQVE7UUFDekMsSUFBSyxHQUFjLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ25DLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQzFDLHNCQUFzQjtZQUN0QixJQUFJLFVBQVUsSUFBSSxPQUFPLFVBQVUsS0FBSyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNyRCxNQUFNLElBQUksS0FBSyxDQUNiLGtCQUFrQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxRQUFRLE9BQU8sS0FBSyxFQUFFLENBQ3RFLENBQUM7WUFDSixDQUFDO1lBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksZUFBZSxDQUFJLEtBQUssQ0FBQyxDQUFDO1FBQ25ELENBQUM7SUFDSCxDQUFDO0lBRU0sUUFBUSxDQUFJLEdBQVk7UUFDN0IsSUFBSSxHQUFHLElBQUssR0FBYyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMxQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQ2hDLENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRU0saUJBQWlCLENBQUksR0FBVztRQUNyQyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDdkIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBdUIsQ0FBQztRQUNoRCxDQUFDO1FBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLGVBQWUsQ0FBSSxJQUFTLENBQUMsQ0FBQztRQUVyRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVNLFdBQVcsQ0FBQyxHQUFXO1FBQzVCLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN2QixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUIsQ0FBQztJQUNILENBQUM7OEdBeENVLHVCQUF1QjtrSEFBdkIsdUJBQXVCLGNBRnRCLE1BQU07OzJGQUVQLHVCQUF1QjtrQkFIbkMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSBcInJ4anNcIjtcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiBcInJvb3RcIixcclxufSlcclxuZXhwb3J0IGNsYXNzIEVhc3lTdGF0ZU1hbmFnZXJTZXJ2aWNlIHtcclxuICBwcml2YXRlIF9zdG9yZTogU3RvcmUgPSB7fTtcclxuXHJcbiAgcHVibGljIGFzc2lnblN0YXRlPFQ+KGtleTogc3RyaW5nLCB2YWx1ZTogVCk6IHZvaWQge1xyXG4gICAgaWYgKChrZXkgYXMgc3RyaW5nKSBpbiB0aGlzLl9zdG9yZSkge1xyXG4gICAgICBjb25zdCBzdG9yZVZhbHVlID0gdGhpcy5fc3RvcmVba2V5XS52YWx1ZTtcclxuICAgICAgLy8gY2hlY2sgdHlwZSBtaXNtYXRjaFxyXG4gICAgICBpZiAoc3RvcmVWYWx1ZSAmJiB0eXBlb2Ygc3RvcmVWYWx1ZSAhPT0gdHlwZW9mIHZhbHVlKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICAgYFR5cGUgbWlzbWF0Y2g6ICR7dHlwZW9mIHRoaXMuX3N0b3JlW2tleV0udmFsdWV9ICE9PSAke3R5cGVvZiB2YWx1ZX1gXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5fc3RvcmVba2V5XS5uZXh0KHZhbHVlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX3N0b3JlW2tleV0gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFQ+KHZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRTdGF0ZTxUPihrZXk/OiBzdHJpbmcpOiBUIHwgdW5kZWZpbmVkIHtcclxuICAgIGlmIChrZXkgJiYgKGtleSBhcyBzdHJpbmcpIGluIHRoaXMuX3N0b3JlKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9zdG9yZVtrZXldLnZhbHVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZWxlY3RTdGF0ZUNoYW5nZTxUPihrZXk6IHN0cmluZyk6IEJlaGF2aW9yU3ViamVjdDxhbnk+IHtcclxuICAgIGlmIChrZXkgaW4gdGhpcy5fc3RvcmUpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX3N0b3JlW2tleV0gYXMgQmVoYXZpb3JTdWJqZWN0PFQ+O1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX3N0b3JlW2tleV0gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFQ+KG51bGwgYXMgVCk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX3N0b3JlW2tleV07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGVsZXRlU3RhdGUoa2V5OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmIChrZXkgaW4gdGhpcy5fc3RvcmUpIHtcclxuICAgICAgZGVsZXRlIHRoaXMuX3N0b3JlW2tleV07XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG50eXBlIFN0b3JlID0ge1xyXG4gIFtrZXk6IHN0cmluZ106IEJlaGF2aW9yU3ViamVjdDxhbnk+O1xyXG59O1xyXG4iXX0=
@@ -1,5 +0,0 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- export * from './public-api';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWVhc3ktc3RhdGUtbWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL25neC1lYXN5LXN0YXRlLW1hbmFnZXIvc3JjL25neC1lYXN5LXN0YXRlLW1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
@@ -1,5 +0,0 @@
1
- /*
2
- * Public API Surface of ngx-easy-state-manager
3
- */
4
- export * from './lib/ngx-easy-state-manager.service';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL25neC1lYXN5LXN0YXRlLW1hbmFnZXIvc3JjL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLHNDQUFzQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogUHVibGljIEFQSSBTdXJmYWNlIG9mIG5neC1lYXN5LXN0YXRlLW1hbmFnZXJcclxuICovXHJcblxyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9uZ3gtZWFzeS1zdGF0ZS1tYW5hZ2VyLnNlcnZpY2UnO1xyXG4iXX0=
@@ -1,11 +0,0 @@
1
- import { BehaviorSubject } from "rxjs";
2
- import * as i0 from "@angular/core";
3
- export declare class EasyStateManagerService {
4
- private _store;
5
- assignState<T>(key: string, value: T): void;
6
- getState<T>(key?: string): T | undefined;
7
- selectStateChange<T>(key: string): BehaviorSubject<any>;
8
- deleteState(key: string): void;
9
- static ɵfac: i0.ɵɵFactoryDeclaration<EasyStateManagerService, never>;
10
- static ɵprov: i0.ɵɵInjectableDeclaration<EasyStateManagerService>;
11
- }
package/public-api.d.ts DELETED
@@ -1 +0,0 @@
1
- export * from './lib/ngx-easy-state-manager.service';