ng-simple-state 19.0.2 → 19.0.3

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
@@ -99,7 +99,7 @@ export interface CounterState {
99
99
  @Injectable()
100
100
  export class CounterStore extends NgSimpleStateBaseRxjsStore<CounterState> {
101
101
 
102
- storeConfig(): NgSimpleStateStoreConfig {
102
+ storeConfig(): NgSimpleStateStoreConfig<CounterState> {
103
103
  return {
104
104
  storeName: 'CounterStore'
105
105
  };
@@ -128,7 +128,7 @@ export interface CounterState {
128
128
  @Injectable()
129
129
  export class CounterStore extends NgSimpleStateBaseRxjsStore<CounterState> {
130
130
 
131
- storeConfig(): NgSimpleStateStoreConfig {
131
+ storeConfig(): NgSimpleStateStoreConfig<CounterState> {
132
132
  return {
133
133
  storeName: 'CounterStore'
134
134
  };
@@ -160,7 +160,7 @@ export interface CounterState {
160
160
  @Injectable()
161
161
  export class CounterStore extends NgSimpleStateBaseRxjsStore<CounterState> {
162
162
 
163
- storeConfig(): NgSimpleStateStoreConfig {
163
+ storeConfig(): NgSimpleStateStoreConfig<CounterState> {
164
164
  return {
165
165
  storeName: 'CounterStore'
166
166
  };
@@ -204,7 +204,7 @@ export class AppComponent {
204
204
  #### Step 4: Use your store into the components, eg.:
205
205
 
206
206
  ```ts
207
- import { Component } from '@angular/core';
207
+ import { Component, inject } from '@angular/core';
208
208
  import { Observable } from 'rxjs';
209
209
  import { CounterStore } from './counter-store';
210
210
 
@@ -219,11 +219,8 @@ import { CounterStore } from './counter-store';
219
219
  `,
220
220
  })
221
221
  export class AppComponent {
222
- public counter$: Observable<number>;
223
-
224
- constructor(public counterStore: CounterStore) {
225
- this.counter$ = this.counterStore.selectCount();
226
- }
222
+ public counterStore = inject(CounterStore);
223
+ public counter$: Observable<number> = this.counterStore.selectCount();
227
224
  }
228
225
  ```
229
226
 
@@ -256,7 +253,7 @@ export class CounterComponent extends NgSimpleStateBaseRxjsStore<CounterState> {
256
253
 
257
254
  public counter$: Observable<number> = this.selectState(state => state.count);
258
255
 
259
- storeConfig(): NgSimpleStateStoreConfig {
256
+ storeConfig(): NgSimpleStateStoreConfig<CounterState> {
260
257
  return {
261
258
  storeName: 'CounterComponent'
262
259
  };
@@ -290,7 +287,7 @@ import { NgSimpleStateStoreConfig } from 'ng-simple-state';
290
287
  @Injectable()
291
288
  export class CounterStore extends NgSimpleStateBaseRxjsStore<CounterState> {
292
289
 
293
- override storeConfig(): NgSimpleStateStoreConfig {
290
+ override storeConfig(): NgSimpleStateStoreConfig<CounterState> {
294
291
  return {
295
292
  enableLocalStorage: true, // enable local storage for this store
296
293
  persistentStorage: 'session', // persistentStorage can be 'session' or 'local' (default is localStorage)
@@ -382,7 +379,7 @@ export type TodoState = Array<Todo>;
382
379
  @Injectable()
383
380
  export class TodoStore extends NgSimpleStateBaseRxjsStore<TodoState> {
384
381
 
385
- storeConfig(): NgSimpleStateStoreConfig {
382
+ storeConfig(): NgSimpleStateStoreConfig<CounterState> {
386
383
  return {
387
384
  storeName: 'TodoStore'
388
385
  };
@@ -409,7 +406,7 @@ export class TodoStore extends NgSimpleStateBaseRxjsStore<TodoState> {
409
406
  usage:
410
407
 
411
408
  ```ts
412
- import { Component } from '@angular/core';
409
+ import { Component, inject } from '@angular/core';
413
410
  import { Observable } from 'rxjs';
414
411
  import { Todo, TodoStore } from './todo-store';
415
412
 
@@ -418,22 +415,23 @@ import { Todo, TodoStore } from './todo-store';
418
415
  template: `
419
416
  <input #newTodo> <button (click)="todoStore.add({name: newTodo.value, completed: false})">Add todo</button>
420
417
  <ol>
421
- <li *ngFor="let todo of todoList$ | async">
422
- <ng-container *ngIf="todo.completed">✅</ng-container>
418
+ @for(todo of todoList$ | async; track todo.id) {
419
+ <li>
420
+ @if(todo.completed) {
421
+
422
+ }
423
423
  {{ todo.name }}
424
424
  <button (click)="todoStore.setComplete(todo.id, !todo.completed)">Mark as {{ todo.completed ? 'Not completed' : 'Completed' }}</button>
425
425
  <button (click)="todoStore.delete(todo.id)">Delete</button>
426
426
  </li>
427
+ }
427
428
  </ol>
428
429
  `,
429
430
  providers: [TodoStore]
430
431
  })
431
432
  export class AppComponent {
432
- public todoList$: Observable<Todo[]>;
433
-
434
- constructor(public todoStore: TodoStore) {
435
- this.todoList$ = this.todoStore.selectState();
436
- }
433
+ public todoStore = inject(TodoStore);
434
+ public todoList$: Observable<Todo[]> = this.todoStore.selectState();
437
435
  }
438
436
  ```
439
437
 
@@ -472,7 +470,7 @@ export abstract class NgSimpleStateBaseRxjsStore<S extends object | Array<any>>
472
470
  * Override this method for set a specific config for the store
473
471
  * @returns NgSimpleStateStoreConfig
474
472
  */
475
- storeConfig(): NgSimpleStateStoreConfig;
473
+ storeConfig(): NgSimpleStateStoreConfig<S>;
476
474
 
477
475
  /**
478
476
  * Set into the store the initial state
@@ -553,7 +551,7 @@ export interface CounterState {
553
551
  @Injectable()
554
552
  export class CounterStore extends NgSimpleStateBaseSignalStore<CounterState> {
555
553
 
556
- storeConfig(): NgSimpleStateStoreConfig {
554
+ storeConfig(): NgSimpleStateStoreConfig<CounterState> {
557
555
  return {
558
556
  storeName: 'CounterStore'
559
557
  };
@@ -581,7 +579,7 @@ export interface CounterState {
581
579
  @Injectable()
582
580
  export class CounterStore extends NgSimpleStateBaseSignalStore<CounterState> {
583
581
 
584
- storeConfig(): NgSimpleStateStoreConfig {
582
+ storeConfig(): NgSimpleStateStoreConfig<CounterState> {
585
583
  return {
586
584
  storeName: 'CounterStore'
587
585
  };
@@ -612,7 +610,7 @@ export interface CounterState {
612
610
  @Injectable()
613
611
  export class CounterStore extends NgSimpleStateBaseSignalStore<CounterState> {
614
612
 
615
- storeConfig(): NgSimpleStateStoreConfig {
613
+ storeConfig(): NgSimpleStateStoreConfig<CounterState> {
616
614
  return {
617
615
  storeName: 'CounterStore'
618
616
  };
@@ -656,7 +654,7 @@ export class AppComponent {
656
654
  #### Step 4: Use your store into the components, eg.:
657
655
 
658
656
  ```ts
659
- import { Component, Signal } from '@angular/core';
657
+ import { Component, Signal, inject } from '@angular/core';
660
658
  import { CounterStore } from './counter-store';
661
659
 
662
660
  @Component({
@@ -669,11 +667,8 @@ import { CounterStore } from './counter-store';
669
667
  `,
670
668
  })
671
669
  export class AppComponent {
672
- public counterSig: Signal<number>;
673
-
674
- constructor(public counterStore: CounterStore) {
675
- this.counterSig = this.counterStore.selectCount();
676
- }
670
+ public counterStore = inject(CounterStore);
671
+ public counterSig: Signal<number> = this.counterStore.selectCount();
677
672
  }
678
673
  ```
679
674
 
@@ -705,7 +700,7 @@ export class CounterComponent extends NgSimpleStateBaseSignalStore<CounterState>
705
700
 
706
701
  public counterSig: Signal<number> = this.selectState(state => state.count);
707
702
 
708
- storeConfig(): NgSimpleStateStoreConfig {
703
+ storeConfig(): NgSimpleStateStoreConfig<CounterState> {
709
704
  return {
710
705
  storeName: 'CounterComponent'
711
706
  };
@@ -739,7 +734,7 @@ import { NgSimpleStateStoreConfig } from 'ng-simple-state';
739
734
  @Injectable()
740
735
  export class CounterStore extends NgSimpleStateBaseSignalStore<CounterState> {
741
736
 
742
- override storeConfig(): NgSimpleStateStoreConfig {
737
+ override storeConfig(): NgSimpleStateStoreConfig<CounterState> {
743
738
  return {
744
739
  enableLocalStorage: true, // enable local storage for this store
745
740
  persistentStorage: 'session', // persistentStorage can be 'session' or 'local' (default is localStorage)
@@ -827,7 +822,7 @@ export type TodoState = Array<Todo>;
827
822
  @Injectable()
828
823
  export class TodoStore extends NgSimpleStateBaseSignalStore<TodoState> {
829
824
 
830
- storeConfig(): NgSimpleStateStoreConfig {
825
+ storeConfig(): NgSimpleStateStoreConfig<CounterState> {
831
826
  return {
832
827
  storeName: 'TodoStore'
833
828
  };
@@ -854,7 +849,7 @@ export class TodoStore extends NgSimpleStateBaseSignalStore<TodoState> {
854
849
  usage:
855
850
 
856
851
  ```ts
857
- import { Component, Signal } from '@angular/core';
852
+ import { Component, Signal, inject } from '@angular/core';
858
853
  import { Todo, TodoStore } from './todo-store';
859
854
 
860
855
  @Component({
@@ -862,22 +857,23 @@ import { Todo, TodoStore } from './todo-store';
862
857
  template: `
863
858
  <input #newTodo> <button (click)="todoStore.add({name: newTodo.value, completed: false})">Add todo</button>
864
859
  <ol>
865
- <li *ngFor="let todo of todoListSig()">
866
- <ng-container *ngIf="todo.completed">✅</ng-container>
860
+ @for(todo of todoListSig() | async; track todo.id) {
861
+ <li>
862
+ @if(todo.completed) {
863
+
864
+ }
867
865
  {{ todo.name }}
868
866
  <button (click)="todoStore.setComplete(todo.id, !todo.completed)">Mark as {{ todo.completed ? 'Not completed' : 'Completed' }}</button>
869
867
  <button (click)="todoStore.delete(todo.id)">Delete</button>
870
868
  </li>
869
+ }
871
870
  </ol>
872
871
  `,
873
872
  providers: [TodoStore]
874
873
  })
875
874
  export class AppComponent {
876
- public todoListSig: Signal<Todo[]>;
877
-
878
- constructor(public todoStore: TodoStore) {
879
- this.todoListSig = this.todoStore.selectState();
880
- }
875
+ public todoStore = inject(TodoStore);
876
+ public todoListSig: Signal<Todo[]> = this.todoStore.selectState();
881
877
  }
882
878
  ```
883
879
 
@@ -916,7 +912,7 @@ export abstract class NgSimpleStateBaseSignalStore<S extends object | Array<any>
916
912
  * Override this method for set a specific config for the store
917
913
  * @returns NgSimpleStateStoreConfig
918
914
  */
919
- storeConfig(): NgSimpleStateStoreConfig;
915
+ storeConfig(): NgSimpleStateStoreConfig<S>;
920
916
 
921
917
  /**
922
918
  * Set into the store the initial state
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, NgModule, Injectable, isDevMode, inject, Directive, signal, computed, makeEnvironmentProviders } from '@angular/core';
2
+ import { InjectionToken, NgModule, inject, NgZone, Injectable, isDevMode, Directive, signal, computed, makeEnvironmentProviders } from '@angular/core';
3
3
  import { BehaviorSubject, asyncScheduler } from 'rxjs';
4
4
  import { map, distinctUntilChanged, observeOn } from 'rxjs/operators';
5
5
 
@@ -30,22 +30,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.1", ngImpor
30
30
 
31
31
  const instanceId = `ng-simple-state-${Date.now()}-${Math.random()}`;
32
32
  class NgSimpleStateDevTool {
33
- constructor(ngZone) {
33
+ constructor() {
34
34
  this.globalDevtools = window.__REDUX_DEVTOOLS_EXTENSION__ || window.devToolsExtension;
35
- this.isActiveDevtool = false;
36
35
  this.baseState = {};
37
36
  if (this.globalDevtools) {
38
37
  // The `connect` method adds `message` event listener since it communicates
39
38
  // with an extension through `window.postMessage` and message events.
40
39
  // We handle only 2 events; thus, we don't want to run many change detections
41
40
  // because the extension sends events that we don't have to handle.
42
- ngZone.runOutsideAngular(() => {
41
+ inject(NgZone).runOutsideAngular(() => {
43
42
  this.localDevTool = this.globalDevtools.connect({
44
43
  name: 'NgSimpleState',
45
44
  instanceId: instanceId
46
45
  });
47
- this.isActiveDevtool = !!this.localDevTool;
48
- if (this.isActiveDevtool) {
46
+ if (this.localDevTool) {
49
47
  this.localDevTool.init(this.baseState);
50
48
  }
51
49
  });
@@ -56,7 +54,7 @@ class NgSimpleStateDevTool {
56
54
  * @returns True if dev tool is active
57
55
  */
58
56
  isActive() {
59
- return this.isActiveDevtool;
57
+ return !!this.localDevTool;
60
58
  }
61
59
  /**
62
60
  * Send to dev tool a new state
@@ -66,33 +64,24 @@ class NgSimpleStateDevTool {
66
64
  * @returns True if dev tool is enabled and action is send
67
65
  */
68
66
  send(storeName, actionName, state) {
69
- if (this.isActiveDevtool && this.localDevTool) {
67
+ if (this.localDevTool) {
70
68
  this.localDevTool.send(`${storeName}.${actionName}`, Object.assign(this.baseState, { [storeName]: state }), false, instanceId);
71
69
  return true;
72
70
  }
73
71
  return false;
74
72
  }
75
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.1", ngImport: i0, type: NgSimpleStateDevTool, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable }); }
73
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.1", ngImport: i0, type: NgSimpleStateDevTool, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
76
74
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.1", ngImport: i0, type: NgSimpleStateDevTool, providedIn: 'root' }); }
77
75
  }
78
76
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.1", ngImport: i0, type: NgSimpleStateDevTool, decorators: [{
79
77
  type: Injectable,
80
78
  args: [{ providedIn: 'root' }]
81
- }], ctorParameters: () => [{ type: i0.NgZone }] });
79
+ }], ctorParameters: () => [] });
82
80
 
83
81
  const BASE_KEY = 'NgSimpleState::';
84
82
  class NgSimpleStateBrowserStorage {
85
83
  constructor(storage) {
86
84
  this.storage = storage;
87
- this.isStorageActive = false;
88
- this.isStorageActive = !!storage;
89
- }
90
- /**
91
- * Return true if storage is active
92
- * @returns True if storage is active
93
- */
94
- isActive() {
95
- return this.isStorageActive;
96
85
  }
97
86
  /**
98
87
  * Set item into storage
@@ -101,11 +90,8 @@ class NgSimpleStateBrowserStorage {
101
90
  * @returns True if item is stored into storage
102
91
  */
103
92
  setItem(key, state) {
104
- if (this.isStorageActive) {
105
- this.storage.setItem(BASE_KEY + key, JSON.stringify(state));
106
- return true;
107
- }
108
- return false;
93
+ this.storage.setItem(BASE_KEY + key, JSON.stringify(state));
94
+ return true;
109
95
  }
110
96
  /**
111
97
  * Return item from storage
@@ -113,11 +99,9 @@ class NgSimpleStateBrowserStorage {
113
99
  * @returns the item
114
100
  */
115
101
  getItem(key) {
116
- if (this.isStorageActive) {
117
- const state = this.storage.getItem(BASE_KEY + key);
118
- if (state) {
119
- return JSON.parse(state);
120
- }
102
+ const state = this.storage.getItem(BASE_KEY + key);
103
+ if (state) {
104
+ return JSON.parse(state);
121
105
  }
122
106
  return null;
123
107
  }
@@ -127,27 +111,21 @@ class NgSimpleStateBrowserStorage {
127
111
  * @returns True if item is removed
128
112
  */
129
113
  removeItem(key) {
130
- if (this.isStorageActive) {
131
- this.storage.removeItem(BASE_KEY + key);
132
- return true;
133
- }
134
- return false;
114
+ this.storage.removeItem(BASE_KEY + key);
115
+ return true;
135
116
  }
136
117
  /**
137
118
  * Removes all key/value pairs, if there are any.
138
119
  * @returns True if storage is cleared
139
120
  */
140
121
  clear() {
141
- if (this.isStorageActive) {
142
- for (let i = this.storage.length; i >= 0; i--) {
143
- const key = this.storage.key(i);
144
- if (key && key.startsWith(BASE_KEY)) {
145
- this.storage.removeItem(key);
146
- }
122
+ for (let i = this.storage.length; i >= 0; i--) {
123
+ const key = this.storage.key(i);
124
+ if (key && key.startsWith(BASE_KEY)) {
125
+ this.storage.removeItem(key);
147
126
  }
148
- return true;
149
127
  }
150
- return false;
128
+ return true;
151
129
  }
152
130
  }
153
131
 
@@ -181,7 +159,7 @@ class NgSimpleStateBaseCommonStore {
181
159
  this.globalConfig = inject(NG_SIMPLE_STORE_CONFIG, { optional: true });
182
160
  const storeConfig = this.storeConfig() || {};
183
161
  this.localStoreConfig = { ...this.globalConfig, ...storeConfig };
184
- this.localStorageIsEnabled = typeof this.localStoreConfig.enableLocalStorage === 'boolean' ? this.localStoreConfig.enableLocalStorage : false;
162
+ this.localStorageIsEnabled = this.localStoreConfig.enableLocalStorage ?? false;
185
163
  if (this.localStorageIsEnabled) {
186
164
  if (this.localStoreConfig.persistentStorage === 'local') {
187
165
  this.persistentStorage = inject(NgSimpleStateLocalStorage);
@@ -190,11 +168,11 @@ class NgSimpleStateBaseCommonStore {
190
168
  this.persistentStorage = inject(NgSimpleStateSessionStorage);
191
169
  }
192
170
  }
193
- this.devToolIsEnabled = typeof this.localStoreConfig.enableDevTool === 'boolean' ? this.localStoreConfig.enableDevTool : false;
171
+ this.devToolIsEnabled = this.localStoreConfig.enableDevTool ?? false;
194
172
  if (this.devToolIsEnabled) {
195
173
  this.devTool = inject(NgSimpleStateDevTool);
196
174
  }
197
- this.storeName = typeof this.localStoreConfig.storeName === 'string' ? this.localStoreConfig.storeName : this.constructor.name;
175
+ this.storeName = this.localStoreConfig.storeName ?? this.constructor.name;
198
176
  if (typeof this.localStoreConfig.comparator === 'function') {
199
177
  this.comparator = this.localStoreConfig.comparator;
200
178
  }
@@ -207,7 +185,7 @@ class NgSimpleStateBaseCommonStore {
207
185
  if (!this.firstState) {
208
186
  this.firstState = this.initialState();
209
187
  }
210
- this.devToolSend(this.firstState, `initialState`);
188
+ this.devToolSend(this.firstState, 'initialState');
211
189
  this.isArray = Array.isArray(this.firstState);
212
190
  }
213
191
  /**
@@ -239,13 +217,14 @@ class NgSimpleStateBaseCommonStore {
239
217
  restartState() {
240
218
  return this.setState(() => this.initialState(), 'restartState');
241
219
  }
242
- /**
243
- * Set a new state
244
- * @param selectFn State reducer
245
- * @param actionName The action label into Redux DevTools (default is parent function name)
246
- * @returns state
247
- */
248
- patchState(currState, newState, actionName) {
220
+ patchState(currState, stateFnOrNewState, actionName) {
221
+ let newState;
222
+ if (typeof stateFnOrNewState === 'function') {
223
+ newState = stateFnOrNewState(currState);
224
+ }
225
+ else {
226
+ newState = stateFnOrNewState;
227
+ }
249
228
  let state;
250
229
  if (this.isArray) {
251
230
  state = Object.assign([], newState);
@@ -347,6 +326,7 @@ class NgSimpleStateBaseRxjsStore extends NgSimpleStateBaseCommonStore {
347
326
  constructor() {
348
327
  super();
349
328
  this.stackPoint = 4;
329
+ this.selectFnRef = this.selectFn.bind(this);
350
330
  this.state$ = new BehaviorSubject(this.selectFn(this.firstState));
351
331
  this.stateObs = this.state$.asObservable();
352
332
  }
@@ -364,7 +344,7 @@ class NgSimpleStateBaseRxjsStore extends NgSimpleStateBaseCommonStore {
364
344
  * @returns Observable of the selected state
365
345
  */
366
346
  selectState(selectFn, comparator) {
367
- selectFn ??= this.selectFn.bind(this);
347
+ selectFn ??= this.selectFnRef;
368
348
  return this.state$.pipe(map(state => selectFn(state)), distinctUntilChanged(comparator ?? this.comparator), observeOn(asyncScheduler));
369
349
  }
370
350
  /**
@@ -374,15 +354,8 @@ class NgSimpleStateBaseRxjsStore extends NgSimpleStateBaseCommonStore {
374
354
  getCurrentState() {
375
355
  return this.deepFreeze(this.state$.getValue());
376
356
  }
377
- /**
378
- * Set a new state
379
- * @param selectFn State reducer
380
- * @param actionName The action label into Redux DevTools (default is parent function name)
381
- * @returns True if the state is changed
382
- */
383
- setState(stateFn, actionName) {
384
- const currState = this.getCurrentState();
385
- const state = this.patchState(currState, stateFn(currState), actionName);
357
+ setState(stateFnOrNewState, actionName) {
358
+ const state = this.patchState(this.getCurrentState(), stateFnOrNewState, actionName);
386
359
  if (typeof state !== 'undefined') {
387
360
  this.state$.next(state);
388
361
  return true;
@@ -431,6 +404,7 @@ class NgSimpleStateBaseSignalStore extends NgSimpleStateBaseCommonStore {
431
404
  constructor() {
432
405
  super();
433
406
  this.stackPoint = 4;
407
+ this.selectFnRef = this.selectFn.bind(this);
434
408
  this.stateSig = signal(this.selectFn(this.firstState));
435
409
  this.stateSigRo = this.stateSig.asReadonly();
436
410
  }
@@ -441,7 +415,7 @@ class NgSimpleStateBaseSignalStore extends NgSimpleStateBaseCommonStore {
441
415
  * @returns Signal of the selected state
442
416
  */
443
417
  selectState(selectFn, comparator) {
444
- selectFn ??= this.selectFn.bind(this);
418
+ selectFn ??= this.selectFnRef;
445
419
  return computed(() => selectFn(this.stateSig()), { equal: comparator ?? this.comparator });
446
420
  }
447
421
  /**
@@ -451,15 +425,8 @@ class NgSimpleStateBaseSignalStore extends NgSimpleStateBaseCommonStore {
451
425
  getCurrentState() {
452
426
  return this.deepFreeze(this.stateSig());
453
427
  }
454
- /**
455
- * Set a new state
456
- * @param selectFn State reducer
457
- * @param actionName The action label into Redux DevTools (default is parent function name)
458
- * @returns True if the state is changed
459
- */
460
- setState(stateFn, actionName) {
461
- const currState = this.getCurrentState();
462
- const state = this.patchState(currState, stateFn(currState), actionName);
428
+ setState(stateFnOrNewState, actionName) {
429
+ const state = this.patchState(this.getCurrentState(), stateFnOrNewState, actionName);
463
430
  if (typeof state !== 'undefined') {
464
431
  this.stateSig.set(state);
465
432
  return true;
@@ -487,6 +454,74 @@ function provideNgSimpleState(ngSimpleStateConfig) {
487
454
  return providers;
488
455
  }
489
456
 
457
+ /**
458
+ * Compares two values of type `K` to determine if they are equal.
459
+ *
460
+ * This function performs a deep comparison for objects and arrays, and a shallow comparison for primitive values.
461
+ *
462
+ * @template K - The type of the values being compared.
463
+ * @param {K} a - The first value to compare.
464
+ * @param {K} b - The second value to compare.
465
+ * @returns {boolean} - Returns `true` if the values are equal, otherwise `false`.
466
+ *
467
+ * @example
468
+ * // Primitive values
469
+ * stateComparator(1, 1); // true
470
+ * stateComparator(1, 2); // false
471
+ *
472
+ * // Objects
473
+ * stateComparator({ a: 1 }, { a: 1 }); // true
474
+ * stateComparator({ a: 1 }, { a: 2 }); // false
475
+ *
476
+ * // Arrays
477
+ * stateComparator([1, 2, 3], [1, 2, 3]); // true
478
+ * stateComparator([1, 2, 3], [4, 5, 6]); // false
479
+ *
480
+ * // Special cases
481
+ * stateComparator(NaN, NaN); // true
482
+ * stateComparator(/abc/i, /abc/i); // true
483
+ */
484
+ function ngstStateComparator(a, b) {
485
+ if (a === b)
486
+ return true;
487
+ if (a && b && typeof a == 'object' && typeof b == 'object') {
488
+ if (a.constructor !== b.constructor)
489
+ return false;
490
+ let length;
491
+ let i;
492
+ if (Array.isArray(a) && Array.isArray(b)) {
493
+ length = a.length;
494
+ if (length !== b.length)
495
+ return false;
496
+ for (i = length; i-- !== 0;)
497
+ if (!ngstStateComparator(a[i], b[i]))
498
+ return false;
499
+ return true;
500
+ }
501
+ if (a.constructor === RegExp && b.constructor === RegExp)
502
+ return a.source === b.source && a.flags === b.flags;
503
+ if (a.valueOf !== Object.prototype.valueOf)
504
+ return a.valueOf() === b.valueOf();
505
+ if (a.toString !== Object.prototype.toString)
506
+ return a.toString() === b.toString();
507
+ const keys = Object.keys(a);
508
+ length = keys.length;
509
+ if (length !== Object.keys(b).length)
510
+ return false;
511
+ for (i = length; i-- !== 0;)
512
+ if (!Object.prototype.hasOwnProperty.call(b, keys[i]))
513
+ return false;
514
+ for (i = length; i-- !== 0;) {
515
+ const key = keys[i];
516
+ if (!ngstStateComparator(a[key], b[key]))
517
+ return false;
518
+ }
519
+ return true;
520
+ }
521
+ return a !== a && b !== b;
522
+ }
523
+ ;
524
+
490
525
  /*
491
526
  * Public API Surface of ng-simple-state
492
527
  */
@@ -495,5 +530,5 @@ function provideNgSimpleState(ngSimpleStateConfig) {
495
530
  * Generated bundle index. Do not edit.
496
531
  */
497
532
 
498
- export { NG_SIMPLE_STORE_CONFIG, NgSimpleStateBaseCommonStore, NgSimpleStateBaseRxjsStore, NgSimpleStateBaseSignalStore, NgSimpleStateBaseStore, NgSimpleStateDevTool, NgSimpleStateLocalStorage, NgSimpleStateModule, NgSimpleStateSessionStorage, provideNgSimpleState };
533
+ export { NG_SIMPLE_STORE_CONFIG, NgSimpleStateBaseCommonStore, NgSimpleStateBaseRxjsStore, NgSimpleStateBaseSignalStore, NgSimpleStateBaseStore, NgSimpleStateDevTool, NgSimpleStateLocalStorage, NgSimpleStateModule, NgSimpleStateSessionStorage, ngstStateComparator, provideNgSimpleState };
499
534
  //# sourceMappingURL=ng-simple-state.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ng-simple-state.mjs","sources":["../../../projects/ng-simple-state/src/lib/ng-simple-state-models.ts","../../../projects/ng-simple-state/src/lib/ng-simple-state.module.ts","../../../projects/ng-simple-state/src/lib/tool/ng-simple-state-dev-tool.ts","../../../projects/ng-simple-state/src/lib/storage/ng-simple-state-browser-storage.ts","../../../projects/ng-simple-state/src/lib/storage/ng-simple-state-local-storage.ts","../../../projects/ng-simple-state/src/lib/storage/ng-simple-state-session-storage.ts","../../../projects/ng-simple-state/src/lib/ng-simple-state-common.ts","../../../projects/ng-simple-state/src/lib/rxjs/ng-simple-state-base-store.ts","../../../projects/ng-simple-state/src/lib/signal/ng-simple-state-base-store.ts","../../../projects/ng-simple-state/src/lib/ng-simple-state-provider.ts","../../../projects/ng-simple-state/src/public-api.ts","../../../projects/ng-simple-state/src/ng-simple-state.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\n\r\nexport type NgSimpleStateSetState<S> = (currentState: Readonly<S>) => Partial<S>;\r\nexport type NgSimpleStateSelectState<S, K> = (state: Readonly<S>) => K;\r\nexport type NgSimpleStateComparator<K> = (previous: K, current: K) => boolean;\r\n\r\n/**\r\n * NgSimpleState config option\r\n */\r\nexport interface NgSimpleStateConfig<K = any> {\r\n /**\r\n * if `true` enable `Redux DevTools` browser extension for inspect the state of the store.\r\n */\r\n enableDevTool?: boolean;\r\n /**\r\n * if `true` latest state of store is saved in local storage and reloaded on store initialization.\r\n */\r\n enableLocalStorage?: boolean;\r\n /**\r\n * Set the persistent storage `local` or `session`.\r\n */\r\n persistentStorage?: 'session' | 'local';\r\n /**\r\n * A function used to compare the previous and current state for equality. \r\n */\r\n comparator?: (previous: K, current: K) => boolean;\r\n}\r\n\r\n/**\r\n * NgSimpleState config option for store\r\n */\r\nexport interface NgSimpleStateStoreConfig<K = any> extends NgSimpleStateConfig<K> {\r\n /** \r\n * The store name \r\n */\r\n storeName: string;\r\n}\r\n\r\n/**\r\n * NgSimpleState config InjectionToken\r\n */\r\nexport const NG_SIMPLE_STORE_CONFIG = new InjectionToken<NgSimpleStateConfig>(\r\n 'ng-simple-state.config'\r\n);\r\n","import { ModuleWithProviders, NgModule } from '@angular/core';\r\nimport { NgSimpleStateConfig, NG_SIMPLE_STORE_CONFIG } from './ng-simple-state-models';\r\n\r\n@NgModule()\r\nexport class NgSimpleStateModule {\r\n static forRoot(\r\n ngSimpleStateConfig?: NgSimpleStateConfig\r\n ): ModuleWithProviders<NgSimpleStateModule> {\r\n return {\r\n ngModule: NgSimpleStateModule,\r\n providers: [\r\n {\r\n provide: NG_SIMPLE_STORE_CONFIG,\r\n useValue: ngSimpleStateConfig,\r\n },\r\n ],\r\n };\r\n }\r\n}\r\n","import { Injectable, NgZone } from '@angular/core';\r\n\r\ninterface DevtoolsLocal {\r\n init: (state: object) => void;\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n send: <T>(action: string, state: Record<string, T>, options: any, instanceId: string) => void;\r\n}\r\ninterface Devtools {\r\n connect(options: { name: string, instanceId: string }): DevtoolsLocal;\r\n}\r\n\r\ndeclare global {\r\n interface Window {\r\n __REDUX_DEVTOOLS_EXTENSION__: Devtools;\r\n devToolsExtension: Devtools;\r\n }\r\n}\r\n\r\nconst instanceId = `ng-simple-state-${Date.now()}-${Math.random()}`\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class NgSimpleStateDevTool {\r\n\r\n private globalDevtools: Devtools = window.__REDUX_DEVTOOLS_EXTENSION__ || window.devToolsExtension;\r\n private localDevTool!: DevtoolsLocal;\r\n private isActiveDevtool = false;\r\n private baseState: Record<string, object> = {};\r\n\r\n constructor(ngZone: NgZone) {\r\n if (this.globalDevtools) {\r\n // The `connect` method adds `message` event listener since it communicates\r\n // with an extension through `window.postMessage` and message events.\r\n // We handle only 2 events; thus, we don't want to run many change detections\r\n // because the extension sends events that we don't have to handle.\r\n ngZone.runOutsideAngular(() => {\r\n this.localDevTool = this.globalDevtools.connect({\r\n name: 'NgSimpleState',\r\n instanceId: instanceId\r\n });\r\n this.isActiveDevtool = !!this.localDevTool;\r\n if (this.isActiveDevtool) {\r\n this.localDevTool.init(this.baseState);\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Return true if dev tool is active\r\n * @returns True if dev tool is active\r\n */\r\n isActive(): boolean {\r\n return this.isActiveDevtool;\r\n }\r\n\r\n /**\r\n * Send to dev tool a new state\r\n * @param storeName The store name\r\n * @param actionName The action name\r\n * @param state the state\r\n * @returns True if dev tool is enabled and action is send\r\n */\r\n send<T>(storeName: string, actionName: string, state: T): boolean {\r\n if (this.isActiveDevtool && this.localDevTool) {\r\n this.localDevTool.send<T>(`${storeName}.${actionName}`, Object.assign(this.baseState, { [storeName]: state }), false, instanceId);\r\n return true;\r\n }\r\n return false;\r\n }\r\n}\r\n","export const BASE_KEY = 'NgSimpleState::';\r\n\r\nexport abstract class NgSimpleStateBrowserStorage {\r\n\r\n private isStorageActive = false;\r\n\r\n constructor(private storage: Storage) {\r\n this.isStorageActive = !!storage;\r\n }\r\n\r\n /**\r\n * Return true if storage is active\r\n * @returns True if storage is active\r\n */\r\n isActive(): boolean {\r\n return this.isStorageActive;\r\n }\r\n\r\n /**\r\n * Set item into storage\r\n * @param key key name\r\n * @param state state value\r\n * @returns True if item is stored into storage\r\n */\r\n setItem<K>(key: string, state: K): boolean {\r\n if (this.isStorageActive) {\r\n this.storage.setItem(BASE_KEY + key, JSON.stringify(state));\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Return item from storage\r\n * @param key key name\r\n * @returns the item\r\n */\r\n getItem<K>(key: string): K | null {\r\n if (this.isStorageActive) {\r\n const state = this.storage.getItem(BASE_KEY + key);\r\n if (state) {\r\n return JSON.parse(state);\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Remove item from storage\r\n * @param key key name\r\n * @returns True if item is removed\r\n */\r\n removeItem(key: string): boolean {\r\n if (this.isStorageActive) {\r\n this.storage.removeItem(BASE_KEY + key);\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Removes all key/value pairs, if there are any.\r\n * @returns True if storage is cleared\r\n */\r\n clear(): boolean {\r\n if (this.isStorageActive) {\r\n for (let i = this.storage.length; i >= 0; i--) {\r\n const key = this.storage.key(i);\r\n if (key && key.startsWith(BASE_KEY)) {\r\n this.storage.removeItem(key);\r\n }\r\n }\r\n return true;\r\n }\r\n return false;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { NgSimpleStateBrowserStorage } from './ng-simple-state-browser-storage';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class NgSimpleStateLocalStorage extends NgSimpleStateBrowserStorage {\r\n constructor() {\r\n super(localStorage);\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { NgSimpleStateBrowserStorage } from './ng-simple-state-browser-storage';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class NgSimpleStateSessionStorage extends NgSimpleStateBrowserStorage {\r\n constructor() {\r\n super(sessionStorage);\r\n }\r\n}\r\n","import { Injectable, OnDestroy, Directive, isDevMode, inject } from '@angular/core';\r\nimport { NgSimpleStateBrowserStorage } from './storage/ng-simple-state-browser-storage';\r\nimport { NgSimpleStateDevTool } from './tool/ng-simple-state-dev-tool';\r\nimport { NgSimpleStateLocalStorage } from './storage/ng-simple-state-local-storage';\r\nimport { NgSimpleStateStoreConfig, NG_SIMPLE_STORE_CONFIG, NgSimpleStateSetState, NgSimpleStateComparator, NgSimpleStateSelectState } from './ng-simple-state-models';\r\nimport { NgSimpleStateSessionStorage } from './storage/ng-simple-state-session-storage';\r\n\r\n@Injectable()\r\n@Directive()\r\nexport abstract class NgSimpleStateBaseCommonStore<S extends object | Array<unknown>> implements OnDestroy {\r\n\r\n protected abstract stackPoint: number;\r\n protected localStorageIsEnabled: boolean;\r\n protected devToolIsEnabled: boolean;\r\n protected devTool!: NgSimpleStateDevTool;\r\n protected persistentStorage!: NgSimpleStateBrowserStorage;\r\n protected localStoreConfig: NgSimpleStateStoreConfig;\r\n protected storeName: string;\r\n protected firstState!: S;\r\n protected isArray: boolean;\r\n protected devMode: boolean = isDevMode();\r\n protected comparator!: <S>(previous: S, current: S) => boolean;\r\n protected globalConfig = inject(NG_SIMPLE_STORE_CONFIG, { optional: true })\r\n\r\n constructor() {\r\n\r\n const storeConfig = this.storeConfig() || {};\r\n this.localStoreConfig = { ...this.globalConfig, ...storeConfig };\r\n\r\n this.localStorageIsEnabled = typeof this.localStoreConfig.enableLocalStorage === 'boolean' ? this.localStoreConfig.enableLocalStorage : false;\r\n\r\n if (this.localStorageIsEnabled) {\r\n if (this.localStoreConfig.persistentStorage === 'local') {\r\n this.persistentStorage = inject(NgSimpleStateLocalStorage);\r\n } else if (this.localStoreConfig.persistentStorage === 'session') {\r\n this.persistentStorage = inject(NgSimpleStateSessionStorage);\r\n }\r\n }\r\n\r\n this.devToolIsEnabled = typeof this.localStoreConfig.enableDevTool === 'boolean' ? this.localStoreConfig.enableDevTool : false;\r\n if (this.devToolIsEnabled) {\r\n this.devTool = inject(NgSimpleStateDevTool);\r\n }\r\n\r\n this.storeName = typeof this.localStoreConfig.storeName === 'string' ? this.localStoreConfig.storeName : this.constructor.name;\r\n if (typeof this.localStoreConfig.comparator === 'function') {\r\n this.comparator = this.localStoreConfig.comparator;\r\n }\r\n\r\n if (this.localStorageIsEnabled && this.persistentStorage) {\r\n const firstState = this.persistentStorage.getItem<S>(this.storeName);\r\n if (firstState) {\r\n this.firstState = firstState;\r\n }\r\n }\r\n if (!this.firstState) {\r\n this.firstState = this.initialState();\r\n }\r\n\r\n this.devToolSend(this.firstState, `initialState`);\r\n\r\n this.isArray = Array.isArray(this.firstState);\r\n }\r\n\r\n /**\r\n * When you override this method, you have to call the `super.ngOnDestroy()` method in your `ngOnDestroy()` method.\r\n */\r\n ngOnDestroy(): void {\r\n this.devToolSend(undefined, 'ngOnDestroy');\r\n }\r\n\r\n /**\r\n * Override this method for set a specific config for the store\r\n * @returns NgSimpleStateStoreConfig\r\n */\r\n protected abstract storeConfig(): NgSimpleStateStoreConfig;\r\n\r\n /**\r\n * Set into the store the initial state\r\n * @returns The state object\r\n */\r\n protected abstract initialState(): S;\r\n\r\n /**\r\n * Select a store state\r\n * @param selectFn State selector (if not provided return full state)\r\n * @param comparator A function used to compare the previous and current state for equality. Defaults to a `===` check.\r\n * @returns Observable of the selected state\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n abstract selectState<K>(selectFn?: NgSimpleStateSelectState<S, K>, comparator?: NgSimpleStateComparator<K>): any;\r\n\r\n /**\r\n * Set a new state\r\n * @param selectFn State reducer\r\n * @param actionName The action label into Redux DevTools (default is parent function name)\r\n * @returns True if the state is changed\r\n */\r\n abstract setState(stateFn: NgSimpleStateSetState<S>, actionName?: string): boolean;\r\n\r\n /**\r\n * Return the current store state (snapshot)\r\n * @returns The current state\r\n */\r\n abstract getCurrentState(): Readonly<S>;\r\n\r\n /**\r\n * Return the first loaded store state:\r\n * the last saved state, if `enableLocalStorage` config is `true`;\r\n * otherwise the initial state provided from `initialState()` method.\r\n * @returns The first state\r\n */\r\n getFirstState(): Readonly<S> | null {\r\n return this.deepFreeze(this.firstState);\r\n }\r\n\r\n /**\r\n * Reset store to first loaded store state:\r\n * - the last saved state, if `enableLocalStorage` config is `true`\r\n * - otherwise the initial state provided from `initialState()` method.\r\n */\r\n resetState(): boolean {\r\n return this.setState(() => this.firstState, 'resetState');\r\n }\r\n\r\n /**\r\n * Restart the store to initial state provided from `initialState()` method\r\n */\r\n restartState(): boolean {\r\n return this.setState(() => this.initialState(), 'restartState');\r\n }\r\n\r\n /**\r\n * Set a new state\r\n * @param selectFn State reducer\r\n * @param actionName The action label into Redux DevTools (default is parent function name)\r\n * @returns state\r\n */\r\n protected patchState(currState: S, newState: Partial<S>, actionName?: string): S | undefined {\r\n let state: S;\r\n if (this.isArray) {\r\n state = Object.assign([] as S, newState);\r\n } else {\r\n state = Object.assign({}, currState, newState);\r\n }\r\n if (currState === newState) {\r\n return undefined;\r\n }\r\n this.devToolSend(state, actionName);\r\n this.statePersist(state);\r\n return state;\r\n }\r\n\r\n protected selectFn<K>(tmpState: Readonly<S>) {\r\n return Object.assign(this.isArray ? [] : {}, tmpState) as K;\r\n }\r\n\r\n /**\r\n * Send to dev tool a new state\r\n * @param newState new state\r\n * @param actionName The action name\r\n * @returns True if dev tools are enabled\r\n */\r\n protected devToolSend(newState: S | undefined, actionName?: string): boolean {\r\n if (!this.devToolIsEnabled || !this.devTool) {\r\n return false;\r\n }\r\n if (!actionName) {\r\n // retrieve the parent (of parent) method into the stack trace\r\n try {\r\n actionName = new Error().stack\r\n ?.split('\\n')[this.stackPoint]\r\n ?.trim()\r\n ?.split(' ')[1]\r\n ?.split('.')[1] || 'unknown';\r\n } catch (_) {\r\n actionName = 'unknown';\r\n }\r\n }\r\n if (!this.devTool.send(this.storeName, actionName, newState)) {\r\n console.log(this.storeName + '.' + actionName, newState);\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Recursively Object.freeze simple Javascript structures consisting of plain objects, arrays, and primitives.\r\n * Make the data immutable.\r\n * @returns immutable object\r\n */\r\n protected deepFreeze(object: S): Readonly<S> {\r\n // No freezing in production (for better performance).\r\n if (!this.devMode || !object) {\r\n return object as Readonly<S>;\r\n }\r\n\r\n // When already frozen, we assume its children are frozen (for better performance).\r\n // This should be true if you always use `deepFreeze` to freeze objects.\r\n //\r\n // Note that Object.isFrozen will also return `true` for primitives (numbers,\r\n // strings, booleans, undefined, null), so there is no need to check for\r\n // those explicitly.\r\n if (Object.isFrozen(object)) {\r\n return object as Readonly<S>;\r\n }\r\n\r\n // At this point we know that we're dealing with either an array or plain object, so\r\n // just freeze it and recurse on its values.\r\n Object.freeze(object);\r\n /* eslint-disable @typescript-eslint/no-explicit-any */\r\n Object.keys(object).forEach(key => this.deepFreeze((object as any)[key]));\r\n\r\n return object as Readonly<S>;\r\n }\r\n\r\n /**\r\n * Persist state to storage\r\n */\r\n protected statePersist(state: S) {\r\n if (this.localStorageIsEnabled && this.persistentStorage) {\r\n this.persistentStorage.setItem<S>(this.storeName, state);\r\n }\r\n }\r\n}\r\n","import { Injectable, OnDestroy, Directive } from '@angular/core';\r\nimport { BehaviorSubject, Observable, asyncScheduler } from 'rxjs';\r\nimport { map, distinctUntilChanged, observeOn } from 'rxjs/operators';\r\nimport { NgSimpleStateBaseCommonStore } from '../ng-simple-state-common';\r\nimport { NgSimpleStateComparator, NgSimpleStateSelectState, NgSimpleStateSetState } from '../ng-simple-state-models';\r\n\r\n@Injectable()\r\n@Directive()\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nexport abstract class NgSimpleStateBaseRxjsStore<S extends object | Array<any>> extends NgSimpleStateBaseCommonStore<S> implements OnDestroy {\r\n\r\n protected stackPoint: number = 4;\r\n private readonly state$: BehaviorSubject<S>;\r\n private readonly stateObs: Observable<S>;\r\n\r\n /**\r\n * Return the observable of the state\r\n * @returns Observable of the state\r\n */\r\n public get state(): Observable<S> {\r\n return this.stateObs;\r\n }\r\n\r\n constructor() {\r\n super()\r\n this.state$ = new BehaviorSubject<S>(this.selectFn(this.firstState));\r\n this.stateObs = this.state$.asObservable();\r\n }\r\n\r\n /**\r\n * When you override this method, you have to call the `super.ngOnDestroy()` method in your `ngOnDestroy()` method.\r\n */\r\n override ngOnDestroy(): void {\r\n super.ngOnDestroy();\r\n this.state$.complete();\r\n }\r\n\r\n /**\r\n * Select a store state\r\n * @param selectFn State selector (if not provided return full state)\r\n * @param comparator A function used to compare the previous and current state for equality. Defaults to a `===` check.\r\n * @returns Observable of the selected state\r\n */\r\n selectState<K>(selectFn?: NgSimpleStateSelectState<S, K>, comparator?: NgSimpleStateComparator<K>): Observable<K> {\r\n selectFn ??= this.selectFn.bind(this);\r\n return this.state$.pipe(\r\n map(state => selectFn(state as Readonly<S>)),\r\n distinctUntilChanged(comparator ?? this.comparator),\r\n observeOn(asyncScheduler)\r\n );\r\n }\r\n\r\n /**\r\n * Return the current store state (snapshot)\r\n * @returns The current state\r\n */\r\n getCurrentState(): Readonly<S> {\r\n return this.deepFreeze(this.state$.getValue());\r\n }\r\n\r\n /**\r\n * Set a new state\r\n * @param selectFn State reducer\r\n * @param actionName The action label into Redux DevTools (default is parent function name)\r\n * @returns True if the state is changed\r\n */\r\n setState(stateFn: NgSimpleStateSetState<S>, actionName?: string): boolean {\r\n const currState = this.getCurrentState();\r\n const state = this.patchState(currState, stateFn(currState), actionName);\r\n if (typeof state !== 'undefined') {\r\n this.state$.next(state);\r\n return true;\r\n }\r\n return false;\r\n }\r\n}\r\n\r\n@Injectable()\r\n@Directive()\r\n/**\r\n * @deprecated use NgSimpleStateBaseRxjsStore\r\n */\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nexport abstract class NgSimpleStateBaseStore<S extends object | Array<any>> extends NgSimpleStateBaseRxjsStore<S> {\r\n constructor() {\r\n super();\r\n if (this.devMode) {\r\n console.warn('NgSimpleStateBaseStore is deprecated. Please use NgSimpleStateBaseRxjsStore')\r\n }\r\n }\r\n}","import { Injectable, Directive, Signal, signal, computed, WritableSignal } from '@angular/core';\r\nimport { NgSimpleStateBaseCommonStore } from '../ng-simple-state-common';\r\nimport { NgSimpleStateComparator, NgSimpleStateSelectState, NgSimpleStateSetState } from '../ng-simple-state-models';\r\n\r\n@Injectable()\r\n@Directive()\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nexport abstract class NgSimpleStateBaseSignalStore<S extends object | Array<any>> extends NgSimpleStateBaseCommonStore<S> {\r\n\r\n protected stackPoint: number = 4;\r\n private readonly stateSig: WritableSignal<S>;\r\n private readonly stateSigRo: Signal<S>\r\n\r\n /**\r\n * Return the Signal of the state\r\n * @returns Signal of the state\r\n */\r\n public get state(): Signal<S> {\r\n return this.stateSigRo;\r\n }\r\n\r\n constructor() {\r\n super();\r\n this.stateSig = signal<S>(this.selectFn(this.firstState));\r\n this.stateSigRo = this.stateSig.asReadonly();\r\n }\r\n\r\n /**\r\n * Select a store state\r\n * @param selectFn State selector (if not provided return full state)\r\n * @param comparator A function used to compare the previous and current state for equality. Defaults to a `===` check.\r\n * @returns Signal of the selected state\r\n */\r\n selectState<K>(selectFn?: NgSimpleStateSelectState<S, K>, comparator?: NgSimpleStateComparator<K>): Signal<K> {\r\n selectFn ??= this.selectFn.bind(this);\r\n return computed(() => selectFn(this.stateSig() as Readonly<S>), { equal: comparator ?? this.comparator });\r\n }\r\n\r\n /**\r\n * Return the current store state (snapshot)\r\n * @returns The current state\r\n */\r\n getCurrentState(): Readonly<S> {\r\n return this.deepFreeze(this.stateSig());\r\n }\r\n\r\n /**\r\n * Set a new state\r\n * @param selectFn State reducer\r\n * @param actionName The action label into Redux DevTools (default is parent function name)\r\n * @returns True if the state is changed\r\n */\r\n setState(stateFn: NgSimpleStateSetState<S>, actionName?: string): boolean {\r\n const currState = this.getCurrentState();\r\n const state = this.patchState(currState, stateFn(currState), actionName);\r\n if (typeof state !== 'undefined') {\r\n this.stateSig.set(state);\r\n return true;\r\n }\r\n return false;\r\n }\r\n}\r\n","import { EnvironmentProviders, makeEnvironmentProviders } from \"@angular/core\";\r\nimport { NG_SIMPLE_STORE_CONFIG, NgSimpleStateConfig } from \"./ng-simple-state-models\";\r\n\r\nexport function provideNgSimpleState(ngSimpleStateConfig?: NgSimpleStateConfig) {\r\n const providers: EnvironmentProviders[] = [];\r\n if (ngSimpleStateConfig) {\r\n providers.push(makeEnvironmentProviders([{\r\n provide: NG_SIMPLE_STORE_CONFIG,\r\n useValue: ngSimpleStateConfig,\r\n }]));\r\n }\r\n return providers;\r\n}\r\n","/*\r\n * Public API Surface of ng-simple-state\r\n */\r\nexport * from './lib/ng-simple-state.module';\r\nexport * from './lib/rxjs/ng-simple-state-base-store';\r\nexport * from './lib/signal/ng-simple-state-base-store';\r\nexport * from './lib/tool/ng-simple-state-dev-tool';\r\nexport * from './lib/storage/ng-simple-state-local-storage';\r\nexport * from './lib/storage/ng-simple-state-session-storage';\r\nexport * from './lib/ng-simple-state-models';\r\nexport * from './lib/ng-simple-state-common';\r\nexport * from './lib/ng-simple-state-provider';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ng-simple-state.mjs","sources":["../../../projects/ng-simple-state/src/lib/ng-simple-state-models.ts","../../../projects/ng-simple-state/src/lib/ng-simple-state.module.ts","../../../projects/ng-simple-state/src/lib/tool/ng-simple-state-dev-tool.ts","../../../projects/ng-simple-state/src/lib/storage/ng-simple-state-browser-storage.ts","../../../projects/ng-simple-state/src/lib/storage/ng-simple-state-local-storage.ts","../../../projects/ng-simple-state/src/lib/storage/ng-simple-state-session-storage.ts","../../../projects/ng-simple-state/src/lib/ng-simple-state-common.ts","../../../projects/ng-simple-state/src/lib/rxjs/ng-simple-state-base-store.ts","../../../projects/ng-simple-state/src/lib/signal/ng-simple-state-base-store.ts","../../../projects/ng-simple-state/src/lib/ng-simple-state-provider.ts","../../../projects/ng-simple-state/src/lib/ng-simple-state-utils.ts","../../../projects/ng-simple-state/src/public-api.ts","../../../projects/ng-simple-state/src/ng-simple-state.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\n\r\nexport type NgSimpleStateSetState<S> = (currentState: Readonly<S>) => Partial<S>;\r\nexport type NgSimpleStateSelectState<S, K> = (state: Readonly<S>) => K;\r\nexport type NgSimpleStateComparator<K> = (previous: K, current: K) => boolean;\r\n\r\n/**\r\n * NgSimpleState config option\r\n */\r\nexport interface NgSimpleStateConfig<K = any> {\r\n /**\r\n * if `true` enable `Redux DevTools` browser extension for inspect the state of the store.\r\n */\r\n enableDevTool?: boolean;\r\n /**\r\n * if `true` latest state of store is saved in local storage and reloaded on store initialization.\r\n */\r\n enableLocalStorage?: boolean;\r\n /**\r\n * Set the persistent storage `local` or `session`.\r\n */\r\n persistentStorage?: 'session' | 'local';\r\n /**\r\n * A function used to compare the previous and current state for equality. \r\n */\r\n comparator?: (previous: K, current: K) => boolean;\r\n}\r\n\r\n/**\r\n * NgSimpleState config option for store\r\n */\r\nexport interface NgSimpleStateStoreConfig<K = any> extends NgSimpleStateConfig<K> {\r\n /** \r\n * The store name \r\n */\r\n storeName: string;\r\n}\r\n\r\n/**\r\n * NgSimpleState config InjectionToken\r\n */\r\nexport const NG_SIMPLE_STORE_CONFIG = new InjectionToken<NgSimpleStateConfig>(\r\n 'ng-simple-state.config'\r\n);\r\n","import { ModuleWithProviders, NgModule } from '@angular/core';\r\nimport { NgSimpleStateConfig, NG_SIMPLE_STORE_CONFIG } from './ng-simple-state-models';\r\n\r\n@NgModule()\r\nexport class NgSimpleStateModule {\r\n static forRoot(\r\n ngSimpleStateConfig?: NgSimpleStateConfig\r\n ): ModuleWithProviders<NgSimpleStateModule> {\r\n return {\r\n ngModule: NgSimpleStateModule,\r\n providers: [\r\n {\r\n provide: NG_SIMPLE_STORE_CONFIG,\r\n useValue: ngSimpleStateConfig,\r\n },\r\n ],\r\n };\r\n }\r\n}\r\n","import { inject, Injectable, NgZone } from '@angular/core';\r\n\r\ninterface DevtoolsLocal {\r\n init: (state: object) => void;\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n send: <T>(action: string, state: Record<string, T>, options: any, instanceId: string) => void;\r\n}\r\ninterface Devtools {\r\n connect(options: { name: string, instanceId: string }): DevtoolsLocal;\r\n}\r\n\r\ndeclare global {\r\n interface Window {\r\n __REDUX_DEVTOOLS_EXTENSION__: Devtools;\r\n devToolsExtension: Devtools;\r\n }\r\n}\r\n\r\nconst instanceId = `ng-simple-state-${Date.now()}-${Math.random()}`\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class NgSimpleStateDevTool {\r\n\r\n private globalDevtools: Devtools = window.__REDUX_DEVTOOLS_EXTENSION__ || window.devToolsExtension;\r\n private localDevTool!: DevtoolsLocal;\r\n private baseState: Record<string, object> = {};\r\n\r\n constructor() {\r\n if (this.globalDevtools) {\r\n // The `connect` method adds `message` event listener since it communicates\r\n // with an extension through `window.postMessage` and message events.\r\n // We handle only 2 events; thus, we don't want to run many change detections\r\n // because the extension sends events that we don't have to handle.\r\n inject(NgZone).runOutsideAngular(() => {\r\n this.localDevTool = this.globalDevtools.connect({\r\n name: 'NgSimpleState',\r\n instanceId: instanceId\r\n });\r\n if (this.localDevTool) {\r\n this.localDevTool.init(this.baseState);\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Return true if dev tool is active\r\n * @returns True if dev tool is active\r\n */\r\n isActive(): boolean {\r\n return !!this.localDevTool;\r\n }\r\n\r\n /**\r\n * Send to dev tool a new state\r\n * @param storeName The store name\r\n * @param actionName The action name\r\n * @param state the state\r\n * @returns True if dev tool is enabled and action is send\r\n */\r\n send<T>(storeName: string, actionName: string, state: T): boolean {\r\n if (this.localDevTool) {\r\n this.localDevTool.send<T>(`${storeName}.${actionName}`, Object.assign(this.baseState, { [storeName]: state }), false, instanceId);\r\n return true;\r\n }\r\n return false;\r\n }\r\n}\r\n","export const BASE_KEY = 'NgSimpleState::';\r\n\r\nexport abstract class NgSimpleStateBrowserStorage {\r\n\r\n constructor(private storage: Storage) { }\r\n\r\n /**\r\n * Set item into storage\r\n * @param key key name\r\n * @param state state value\r\n * @returns True if item is stored into storage\r\n */\r\n setItem<K>(key: string, state: K): boolean {\r\n this.storage.setItem(BASE_KEY + key, JSON.stringify(state));\r\n return true;\r\n }\r\n\r\n /**\r\n * Return item from storage\r\n * @param key key name\r\n * @returns the item\r\n */\r\n getItem<K>(key: string): K | null {\r\n const state = this.storage.getItem(BASE_KEY + key);\r\n if (state) {\r\n return JSON.parse(state);\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Remove item from storage\r\n * @param key key name\r\n * @returns True if item is removed\r\n */\r\n removeItem(key: string): boolean {\r\n this.storage.removeItem(BASE_KEY + key);\r\n return true;\r\n }\r\n\r\n /**\r\n * Removes all key/value pairs, if there are any.\r\n * @returns True if storage is cleared\r\n */\r\n clear(): boolean {\r\n for (let i = this.storage.length; i >= 0; i--) {\r\n const key = this.storage.key(i);\r\n if (key && key.startsWith(BASE_KEY)) {\r\n this.storage.removeItem(key);\r\n }\r\n }\r\n return true;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { NgSimpleStateBrowserStorage } from './ng-simple-state-browser-storage';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class NgSimpleStateLocalStorage extends NgSimpleStateBrowserStorage {\r\n constructor() {\r\n super(localStorage);\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { NgSimpleStateBrowserStorage } from './ng-simple-state-browser-storage';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class NgSimpleStateSessionStorage extends NgSimpleStateBrowserStorage {\r\n constructor() {\r\n super(sessionStorage);\r\n }\r\n}\r\n","import { Injectable, OnDestroy, Directive, isDevMode, inject } from '@angular/core';\r\nimport { NgSimpleStateBrowserStorage } from './storage/ng-simple-state-browser-storage';\r\nimport { NgSimpleStateDevTool } from './tool/ng-simple-state-dev-tool';\r\nimport { NgSimpleStateLocalStorage } from './storage/ng-simple-state-local-storage';\r\nimport { NgSimpleStateStoreConfig, NG_SIMPLE_STORE_CONFIG, NgSimpleStateSetState, NgSimpleStateComparator, NgSimpleStateSelectState } from './ng-simple-state-models';\r\nimport { NgSimpleStateSessionStorage } from './storage/ng-simple-state-session-storage';\r\n\r\nexport type StateFnOrNewState<S> = Partial<S> | NgSimpleStateSetState<S>;\r\n\r\n@Injectable()\r\n@Directive()\r\nexport abstract class NgSimpleStateBaseCommonStore<S extends object | Array<unknown>> implements OnDestroy {\r\n\r\n protected abstract stackPoint: number;\r\n protected localStorageIsEnabled: boolean;\r\n protected devToolIsEnabled: boolean;\r\n protected devTool!: NgSimpleStateDevTool;\r\n protected persistentStorage!: NgSimpleStateBrowserStorage;\r\n protected localStoreConfig: NgSimpleStateStoreConfig;\r\n protected storeName: string;\r\n protected firstState!: S;\r\n protected isArray: boolean;\r\n protected devMode: boolean = isDevMode();\r\n protected comparator!: <S>(previous: S, current: S) => boolean;\r\n protected globalConfig = inject(NG_SIMPLE_STORE_CONFIG, { optional: true })\r\n\r\n constructor() {\r\n\r\n const storeConfig = this.storeConfig() || {};\r\n this.localStoreConfig = { ...this.globalConfig, ...storeConfig };\r\n\r\n this.localStorageIsEnabled = this.localStoreConfig.enableLocalStorage ?? false;\r\n\r\n if (this.localStorageIsEnabled) {\r\n if (this.localStoreConfig.persistentStorage === 'local') {\r\n this.persistentStorage = inject(NgSimpleStateLocalStorage);\r\n } else if (this.localStoreConfig.persistentStorage === 'session') {\r\n this.persistentStorage = inject(NgSimpleStateSessionStorage);\r\n }\r\n }\r\n\r\n this.devToolIsEnabled = this.localStoreConfig.enableDevTool ?? false;\r\n if (this.devToolIsEnabled) {\r\n this.devTool = inject(NgSimpleStateDevTool);\r\n }\r\n\r\n this.storeName = this.localStoreConfig.storeName ?? this.constructor.name;\r\n if (typeof this.localStoreConfig.comparator === 'function') {\r\n this.comparator = this.localStoreConfig.comparator;\r\n }\r\n\r\n if (this.localStorageIsEnabled && this.persistentStorage) {\r\n const firstState = this.persistentStorage.getItem<S>(this.storeName);\r\n if (firstState) {\r\n this.firstState = firstState;\r\n }\r\n }\r\n if (!this.firstState) {\r\n this.firstState = this.initialState();\r\n }\r\n\r\n this.devToolSend(this.firstState, 'initialState');\r\n\r\n this.isArray = Array.isArray(this.firstState);\r\n }\r\n\r\n /**\r\n * When you override this method, you have to call the `super.ngOnDestroy()` method in your `ngOnDestroy()` method.\r\n */\r\n ngOnDestroy(): void {\r\n this.devToolSend(undefined, 'ngOnDestroy');\r\n }\r\n\r\n /**\r\n * Override this method for set a specific config for the store\r\n * @returns NgSimpleStateStoreConfig\r\n */\r\n protected abstract storeConfig(): NgSimpleStateStoreConfig;\r\n\r\n /**\r\n * Set into the store the initial state\r\n * @returns The state object\r\n */\r\n protected abstract initialState(): S;\r\n\r\n /**\r\n * Select a store state\r\n * @param selectFn State selector (if not provided return full state)\r\n * @param comparator A function used to compare the previous and current state for equality. Defaults to a `===` check.\r\n * @returns Observable of the selected state\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n abstract selectState<K = Partial<S>>(selectFn?: NgSimpleStateSelectState<S, K>, comparator?: NgSimpleStateComparator<K>): any;\r\n\r\n /**\r\n * Set a new state\r\n * @param newState New state\r\n * @param actionName The action label into Redux DevTools (default is parent function name)\r\n * @returns True if the state is changed\r\n */\r\n abstract setState(newState: Partial<S>, actionName?: string): boolean;\r\n\r\n /**\r\n * Set a new state\r\n * @param selectFn State reducer\r\n * @param actionName The action label into Redux DevTools (default is parent function name)\r\n * @returns True if the state is changed\r\n */\r\n abstract setState(stateFn: NgSimpleStateSetState<S>, actionName?: string): boolean;\r\n\r\n /**\r\n * Return the current store state (snapshot)\r\n * @returns The current state\r\n */\r\n abstract getCurrentState(): Readonly<S>;\r\n\r\n /**\r\n * Return the first loaded store state:\r\n * the last saved state, if `enableLocalStorage` config is `true`;\r\n * otherwise the initial state provided from `initialState()` method.\r\n * @returns The first state\r\n */\r\n getFirstState(): Readonly<S> | null {\r\n return this.deepFreeze(this.firstState);\r\n }\r\n\r\n /**\r\n * Reset store to first loaded store state:\r\n * - the last saved state, if `enableLocalStorage` config is `true`\r\n * - otherwise the initial state provided from `initialState()` method.\r\n */\r\n resetState(): boolean {\r\n return this.setState(() => this.firstState, 'resetState');\r\n }\r\n\r\n /**\r\n * Restart the store to initial state provided from `initialState()` method\r\n */\r\n restartState(): boolean {\r\n return this.setState(() => this.initialState(), 'restartState');\r\n }\r\n\r\n /**\r\n * Set a new state\r\n * @param newState New state\r\n * @param actionName The action label into Redux DevTools (default is parent function name)\r\n * @returns state\r\n */\r\n protected patchState(currState: S, newState: Partial<S>, actionName?: string): S | undefined;\r\n /**\r\n * Set a new state\r\n * @param selectFn State reducer\r\n * @param actionName The action label into Redux DevTools (default is parent function name)\r\n * @returns state\r\n */\r\n protected patchState(currState: S, stateFn: NgSimpleStateSetState<S>, actionName?: string): S | undefined;\r\n /**\r\n * Set a new state\r\n * @param stateFnOrNewState State reducer or new state\r\n * @param actionName The action label into Redux DevTools (default is parent function name)\r\n * @returns state\r\n */\r\n protected patchState(currState: S, stateFnOrNewState: StateFnOrNewState<S>, actionName?: string): S | undefined;\r\n protected patchState(currState: S, stateFnOrNewState: StateFnOrNewState<S>, actionName?: string): S | undefined {\r\n let newState: Partial<S>;\r\n if (typeof stateFnOrNewState === 'function') {\r\n newState = stateFnOrNewState(currState);\r\n } else {\r\n newState = stateFnOrNewState;\r\n }\r\n let state: S;\r\n if (this.isArray) {\r\n state = Object.assign([] as S, newState);\r\n } else {\r\n state = Object.assign({}, currState, newState);\r\n }\r\n if (currState === newState) {\r\n return undefined;\r\n }\r\n this.devToolSend(state, actionName);\r\n this.statePersist(state);\r\n return state;\r\n }\r\n\r\n protected selectFn<K>(tmpState: Readonly<S>) {\r\n return Object.assign(this.isArray ? [] : {}, tmpState) as K;\r\n }\r\n\r\n /**\r\n * Send to dev tool a new state\r\n * @param newState new state\r\n * @param actionName The action name\r\n * @returns True if dev tools are enabled\r\n */\r\n protected devToolSend(newState: S | undefined, actionName?: string): boolean {\r\n if (!this.devToolIsEnabled || !this.devTool) {\r\n return false;\r\n }\r\n if (!actionName) {\r\n // retrieve the parent (of parent) method into the stack trace\r\n try {\r\n actionName = new Error().stack\r\n ?.split('\\n')[this.stackPoint]\r\n ?.trim()\r\n ?.split(' ')[1]\r\n ?.split('.')[1] || 'unknown';\r\n } catch (_) {\r\n actionName = 'unknown';\r\n }\r\n }\r\n if (!this.devTool.send(this.storeName, actionName, newState)) {\r\n console.log(this.storeName + '.' + actionName, newState);\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Recursively Object.freeze simple Javascript structures consisting of plain objects, arrays, and primitives.\r\n * Make the data immutable.\r\n * @returns immutable object\r\n */\r\n protected deepFreeze(object: S): Readonly<S> {\r\n // No freezing in production (for better performance).\r\n if (!this.devMode || !object) {\r\n return object as Readonly<S>;\r\n }\r\n\r\n // When already frozen, we assume its children are frozen (for better performance).\r\n // This should be true if you always use `deepFreeze` to freeze objects.\r\n //\r\n // Note that Object.isFrozen will also return `true` for primitives (numbers,\r\n // strings, booleans, undefined, null), so there is no need to check for\r\n // those explicitly.\r\n if (Object.isFrozen(object)) {\r\n return object as Readonly<S>;\r\n }\r\n\r\n // At this point we know that we're dealing with either an array or plain object, so\r\n // just freeze it and recurse on its values.\r\n Object.freeze(object);\r\n /* eslint-disable @typescript-eslint/no-explicit-any */\r\n Object.keys(object).forEach(key => this.deepFreeze((object as any)[key]));\r\n\r\n return object as Readonly<S>;\r\n }\r\n\r\n /**\r\n * Persist state to storage\r\n */\r\n protected statePersist(state: S) {\r\n if (this.localStorageIsEnabled && this.persistentStorage) {\r\n this.persistentStorage.setItem<S>(this.storeName, state);\r\n }\r\n }\r\n}\r\n","import { Injectable, OnDestroy, Directive } from '@angular/core';\r\nimport { BehaviorSubject, Observable, asyncScheduler } from 'rxjs';\r\nimport { map, distinctUntilChanged, observeOn } from 'rxjs/operators';\r\nimport { NgSimpleStateBaseCommonStore, StateFnOrNewState } from '../ng-simple-state-common';\r\nimport { NgSimpleStateComparator, NgSimpleStateSelectState, NgSimpleStateSetState } from '../ng-simple-state-models';\r\n\r\n@Injectable()\r\n@Directive()\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nexport abstract class NgSimpleStateBaseRxjsStore<S extends object | Array<any>> extends NgSimpleStateBaseCommonStore<S> implements OnDestroy {\r\n\r\n protected stackPoint: number = 4;\r\n private readonly state$: BehaviorSubject<S>;\r\n private readonly stateObs: Observable<S>;\r\n private readonly selectFnRef = this.selectFn.bind(this);\r\n\r\n /**\r\n * Return the observable of the state\r\n * @returns Observable of the state\r\n */\r\n public get state(): Observable<S> {\r\n return this.stateObs;\r\n }\r\n\r\n constructor() {\r\n super()\r\n this.state$ = new BehaviorSubject<S>(this.selectFn(this.firstState));\r\n this.stateObs = this.state$.asObservable();\r\n }\r\n\r\n /**\r\n * When you override this method, you have to call the `super.ngOnDestroy()` method in your `ngOnDestroy()` method.\r\n */\r\n override ngOnDestroy(): void {\r\n super.ngOnDestroy();\r\n this.state$.complete();\r\n }\r\n\r\n /**\r\n * Select a store state\r\n * @param selectFn State selector (if not provided return full state)\r\n * @param comparator A function used to compare the previous and current state for equality. Defaults to a `===` check.\r\n * @returns Observable of the selected state\r\n */\r\n selectState<K = Partial<S>>(selectFn?: NgSimpleStateSelectState<S, K>, comparator?: NgSimpleStateComparator<K>): Observable<K> {\r\n selectFn ??= this.selectFnRef;\r\n return this.state$.pipe(\r\n map(state => selectFn(state as Readonly<S>)),\r\n distinctUntilChanged(comparator ?? this.comparator),\r\n observeOn(asyncScheduler)\r\n );\r\n }\r\n\r\n /**\r\n * Return the current store state (snapshot)\r\n * @returns The current state\r\n */\r\n getCurrentState(): Readonly<S> {\r\n return this.deepFreeze(this.state$.getValue());\r\n }\r\n\r\n /**\r\n * Set a new state\r\n * @param newState New state\r\n * @param actionName The action label into Redux DevTools (default is parent function name)\r\n * @returns True if the state is changed\r\n */\r\n setState(newState: Partial<S>, actionName?: string): boolean;\r\n /**\r\n * Set a new state\r\n * @param selectFn State reducer\r\n * @param actionName The action label into Redux DevTools (default is parent function name)\r\n * @returns True if the state is changed\r\n */\r\n setState(stateFn: NgSimpleStateSetState<S>, actionName?: string): boolean;\r\n setState(stateFnOrNewState: StateFnOrNewState<S>, actionName?: string): boolean {\r\n const state = this.patchState(this.getCurrentState(), stateFnOrNewState, actionName);\r\n if (typeof state !== 'undefined') {\r\n this.state$.next(state);\r\n return true;\r\n }\r\n return false;\r\n }\r\n}\r\n\r\n@Injectable()\r\n@Directive()\r\n/**\r\n * @deprecated use NgSimpleStateBaseRxjsStore\r\n */\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nexport abstract class NgSimpleStateBaseStore<S extends object | Array<any>> extends NgSimpleStateBaseRxjsStore<S> {\r\n constructor() {\r\n super();\r\n if (this.devMode) {\r\n console.warn('NgSimpleStateBaseStore is deprecated. Please use NgSimpleStateBaseRxjsStore')\r\n }\r\n }\r\n}","import { Injectable, Directive, Signal, signal, computed, WritableSignal } from '@angular/core';\r\nimport { NgSimpleStateBaseCommonStore, StateFnOrNewState } from '../ng-simple-state-common';\r\nimport { NgSimpleStateComparator, NgSimpleStateSelectState, NgSimpleStateSetState } from '../ng-simple-state-models';\r\n\r\n@Injectable()\r\n@Directive()\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nexport abstract class NgSimpleStateBaseSignalStore<S extends object | Array<any>> extends NgSimpleStateBaseCommonStore<S> {\r\n\r\n protected stackPoint: number = 4;\r\n private readonly stateSig: WritableSignal<S>;\r\n private readonly stateSigRo: Signal<S>;\r\n private readonly selectFnRef = this.selectFn.bind(this);\r\n\r\n /**\r\n * Return the Signal of the state\r\n * @returns Signal of the state\r\n */\r\n public get state(): Signal<S> {\r\n return this.stateSigRo;\r\n }\r\n\r\n constructor() {\r\n super();\r\n this.stateSig = signal<S>(this.selectFn(this.firstState));\r\n this.stateSigRo = this.stateSig.asReadonly();\r\n }\r\n\r\n /**\r\n * Select a store state\r\n * @param selectFn State selector (if not provided return full state)\r\n * @param comparator A function used to compare the previous and current state for equality. Defaults to a `===` check.\r\n * @returns Signal of the selected state\r\n */\r\n selectState<K = Partial<S>>(selectFn?: NgSimpleStateSelectState<S, K>, comparator?: NgSimpleStateComparator<K>): Signal<K> {\r\n selectFn ??= this.selectFnRef;\r\n return computed(() => selectFn(this.stateSig() as Readonly<S>), { equal: comparator ?? this.comparator });\r\n }\r\n\r\n /**\r\n * Return the current store state (snapshot)\r\n * @returns The current state\r\n */\r\n getCurrentState(): Readonly<S> {\r\n return this.deepFreeze(this.stateSig());\r\n }\r\n\r\n /**\r\n * Set a new state\r\n * @param newState New state\r\n * @param actionName The action label into Redux DevTools (default is parent function name)\r\n * @returns True if the state is changed\r\n */\r\n setState(newState: Partial<S>, actionName?: string): boolean;\r\n /**\r\n * Set a new state\r\n * @param selectFn State reducer\r\n * @param actionName The action label into Redux DevTools (default is parent function name)\r\n * @returns True if the state is changed\r\n */\r\n setState(stateFn: NgSimpleStateSetState<S>, actionName?: string): boolean;\r\n setState(stateFnOrNewState: StateFnOrNewState<S>, actionName?: string): boolean {\r\n const state = this.patchState(this.getCurrentState(), stateFnOrNewState, actionName);\r\n if (typeof state !== 'undefined') {\r\n this.stateSig.set(state);\r\n return true;\r\n }\r\n return false;\r\n }\r\n}\r\n","import { EnvironmentProviders, makeEnvironmentProviders } from \"@angular/core\";\r\nimport { NG_SIMPLE_STORE_CONFIG, NgSimpleStateConfig } from \"./ng-simple-state-models\";\r\n\r\nexport function provideNgSimpleState(ngSimpleStateConfig?: NgSimpleStateConfig) {\r\n const providers: EnvironmentProviders[] = [];\r\n if (ngSimpleStateConfig) {\r\n providers.push(makeEnvironmentProviders([{\r\n provide: NG_SIMPLE_STORE_CONFIG,\r\n useValue: ngSimpleStateConfig,\r\n }]));\r\n }\r\n return providers;\r\n}\r\n","/**\r\n * Compares two values of type `K` to determine if they are equal.\r\n * \r\n * This function performs a deep comparison for objects and arrays, and a shallow comparison for primitive values.\r\n * \r\n * @template K - The type of the values being compared.\r\n * @param {K} a - The first value to compare.\r\n * @param {K} b - The second value to compare.\r\n * @returns {boolean} - Returns `true` if the values are equal, otherwise `false`.\r\n * \r\n * @example\r\n * // Primitive values\r\n * stateComparator(1, 1); // true\r\n * stateComparator(1, 2); // false\r\n * \r\n * // Objects\r\n * stateComparator({ a: 1 }, { a: 1 }); // true\r\n * stateComparator({ a: 1 }, { a: 2 }); // false\r\n * \r\n * // Arrays\r\n * stateComparator([1, 2, 3], [1, 2, 3]); // true\r\n * stateComparator([1, 2, 3], [4, 5, 6]); // false\r\n * \r\n * // Special cases\r\n * stateComparator(NaN, NaN); // true\r\n * stateComparator(/abc/i, /abc/i); // true\r\n */\r\nexport function ngstStateComparator<K>(a: K, b: K): boolean {\r\n if (a === b) return true;\r\n\r\n if (a && b && typeof a == 'object' && typeof b == 'object') {\r\n if (a.constructor !== b.constructor) return false;\r\n\r\n let length: number;\r\n let i: number;\r\n if (Array.isArray(a) && Array.isArray(b)) {\r\n length = a.length;\r\n if (length !== b.length) return false;\r\n for (i = length; i-- !== 0;)\r\n if (!ngstStateComparator(a[i], b[i])) return false;\r\n return true;\r\n }\r\n\r\n if (a.constructor === RegExp && b.constructor === RegExp) return (a as RegExp).source === (b as RegExp).source && (a as RegExp).flags === (b as RegExp).flags;\r\n if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();\r\n if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();\r\n\r\n const keys = Object.keys(a);\r\n length = keys.length;\r\n if (length !== Object.keys(b).length) return false;\r\n\r\n for (i = length; i-- !== 0;)\r\n if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;\r\n\r\n for (i = length; i-- !== 0;) {\r\n const key = keys[i];\r\n if (!ngstStateComparator((a as any)[key], (b as any)[key])) return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n return a !== a && b !== b;\r\n};","/*\r\n * Public API Surface of ng-simple-state\r\n */\r\nexport * from './lib/ng-simple-state.module';\r\nexport * from './lib/rxjs/ng-simple-state-base-store';\r\nexport * from './lib/signal/ng-simple-state-base-store';\r\nexport * from './lib/tool/ng-simple-state-dev-tool';\r\nexport * from './lib/storage/ng-simple-state-local-storage';\r\nexport * from './lib/storage/ng-simple-state-session-storage';\r\nexport * from './lib/ng-simple-state-models';\r\nexport * from './lib/ng-simple-state-common';\r\nexport * from './lib/ng-simple-state-provider';\r\nexport * from './lib/ng-simple-state-utils';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -3,6 +3,7 @@ import { NgSimpleStateBrowserStorage } from './storage/ng-simple-state-browser-s
3
3
  import { NgSimpleStateDevTool } from './tool/ng-simple-state-dev-tool';
4
4
  import { NgSimpleStateStoreConfig, NgSimpleStateSetState, NgSimpleStateComparator, NgSimpleStateSelectState } from './ng-simple-state-models';
5
5
  import * as i0 from "@angular/core";
6
+ export type StateFnOrNewState<S> = Partial<S> | NgSimpleStateSetState<S>;
6
7
  export declare abstract class NgSimpleStateBaseCommonStore<S extends object | Array<unknown>> implements OnDestroy {
7
8
  protected abstract stackPoint: number;
8
9
  protected localStorageIsEnabled: boolean;
@@ -37,7 +38,14 @@ export declare abstract class NgSimpleStateBaseCommonStore<S extends object | Ar
37
38
  * @param comparator A function used to compare the previous and current state for equality. Defaults to a `===` check.
38
39
  * @returns Observable of the selected state
39
40
  */
40
- abstract selectState<K>(selectFn?: NgSimpleStateSelectState<S, K>, comparator?: NgSimpleStateComparator<K>): any;
41
+ abstract selectState<K = Partial<S>>(selectFn?: NgSimpleStateSelectState<S, K>, comparator?: NgSimpleStateComparator<K>): any;
42
+ /**
43
+ * Set a new state
44
+ * @param newState New state
45
+ * @param actionName The action label into Redux DevTools (default is parent function name)
46
+ * @returns True if the state is changed
47
+ */
48
+ abstract setState(newState: Partial<S>, actionName?: string): boolean;
41
49
  /**
42
50
  * Set a new state
43
51
  * @param selectFn State reducer
@@ -69,11 +77,25 @@ export declare abstract class NgSimpleStateBaseCommonStore<S extends object | Ar
69
77
  restartState(): boolean;
70
78
  /**
71
79
  * Set a new state
72
- * @param selectFn State reducer
80
+ * @param newState New state
73
81
  * @param actionName The action label into Redux DevTools (default is parent function name)
74
82
  * @returns state
75
83
  */
76
84
  protected patchState(currState: S, newState: Partial<S>, actionName?: string): S | undefined;
85
+ /**
86
+ * Set a new state
87
+ * @param selectFn State reducer
88
+ * @param actionName The action label into Redux DevTools (default is parent function name)
89
+ * @returns state
90
+ */
91
+ protected patchState(currState: S, stateFn: NgSimpleStateSetState<S>, actionName?: string): S | undefined;
92
+ /**
93
+ * Set a new state
94
+ * @param stateFnOrNewState State reducer or new state
95
+ * @param actionName The action label into Redux DevTools (default is parent function name)
96
+ * @returns state
97
+ */
98
+ protected patchState(currState: S, stateFnOrNewState: StateFnOrNewState<S>, actionName?: string): S | undefined;
77
99
  protected selectFn<K>(tmpState: Readonly<S>): K;
78
100
  /**
79
101
  * Send to dev tool a new state
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Compares two values of type `K` to determine if they are equal.
3
+ *
4
+ * This function performs a deep comparison for objects and arrays, and a shallow comparison for primitive values.
5
+ *
6
+ * @template K - The type of the values being compared.
7
+ * @param {K} a - The first value to compare.
8
+ * @param {K} b - The second value to compare.
9
+ * @returns {boolean} - Returns `true` if the values are equal, otherwise `false`.
10
+ *
11
+ * @example
12
+ * // Primitive values
13
+ * stateComparator(1, 1); // true
14
+ * stateComparator(1, 2); // false
15
+ *
16
+ * // Objects
17
+ * stateComparator({ a: 1 }, { a: 1 }); // true
18
+ * stateComparator({ a: 1 }, { a: 2 }); // false
19
+ *
20
+ * // Arrays
21
+ * stateComparator([1, 2, 3], [1, 2, 3]); // true
22
+ * stateComparator([1, 2, 3], [4, 5, 6]); // false
23
+ *
24
+ * // Special cases
25
+ * stateComparator(NaN, NaN); // true
26
+ * stateComparator(/abc/i, /abc/i); // true
27
+ */
28
+ export declare function ngstStateComparator<K>(a: K, b: K): boolean;
@@ -7,6 +7,7 @@ export declare abstract class NgSimpleStateBaseRxjsStore<S extends object | Arra
7
7
  protected stackPoint: number;
8
8
  private readonly state$;
9
9
  private readonly stateObs;
10
+ private readonly selectFnRef;
10
11
  /**
11
12
  * Return the observable of the state
12
13
  * @returns Observable of the state
@@ -23,12 +24,19 @@ export declare abstract class NgSimpleStateBaseRxjsStore<S extends object | Arra
23
24
  * @param comparator A function used to compare the previous and current state for equality. Defaults to a `===` check.
24
25
  * @returns Observable of the selected state
25
26
  */
26
- selectState<K>(selectFn?: NgSimpleStateSelectState<S, K>, comparator?: NgSimpleStateComparator<K>): Observable<K>;
27
+ selectState<K = Partial<S>>(selectFn?: NgSimpleStateSelectState<S, K>, comparator?: NgSimpleStateComparator<K>): Observable<K>;
27
28
  /**
28
29
  * Return the current store state (snapshot)
29
30
  * @returns The current state
30
31
  */
31
32
  getCurrentState(): Readonly<S>;
33
+ /**
34
+ * Set a new state
35
+ * @param newState New state
36
+ * @param actionName The action label into Redux DevTools (default is parent function name)
37
+ * @returns True if the state is changed
38
+ */
39
+ setState(newState: Partial<S>, actionName?: string): boolean;
32
40
  /**
33
41
  * Set a new state
34
42
  * @param selectFn State reducer
@@ -6,6 +6,7 @@ export declare abstract class NgSimpleStateBaseSignalStore<S extends object | Ar
6
6
  protected stackPoint: number;
7
7
  private readonly stateSig;
8
8
  private readonly stateSigRo;
9
+ private readonly selectFnRef;
9
10
  /**
10
11
  * Return the Signal of the state
11
12
  * @returns Signal of the state
@@ -18,12 +19,19 @@ export declare abstract class NgSimpleStateBaseSignalStore<S extends object | Ar
18
19
  * @param comparator A function used to compare the previous and current state for equality. Defaults to a `===` check.
19
20
  * @returns Signal of the selected state
20
21
  */
21
- selectState<K>(selectFn?: NgSimpleStateSelectState<S, K>, comparator?: NgSimpleStateComparator<K>): Signal<K>;
22
+ selectState<K = Partial<S>>(selectFn?: NgSimpleStateSelectState<S, K>, comparator?: NgSimpleStateComparator<K>): Signal<K>;
22
23
  /**
23
24
  * Return the current store state (snapshot)
24
25
  * @returns The current state
25
26
  */
26
27
  getCurrentState(): Readonly<S>;
28
+ /**
29
+ * Set a new state
30
+ * @param newState New state
31
+ * @param actionName The action label into Redux DevTools (default is parent function name)
32
+ * @returns True if the state is changed
33
+ */
34
+ setState(newState: Partial<S>, actionName?: string): boolean;
27
35
  /**
28
36
  * Set a new state
29
37
  * @param selectFn State reducer
@@ -1,13 +1,7 @@
1
1
  export declare const BASE_KEY = "NgSimpleState::";
2
2
  export declare abstract class NgSimpleStateBrowserStorage {
3
3
  private storage;
4
- private isStorageActive;
5
4
  constructor(storage: Storage);
6
- /**
7
- * Return true if storage is active
8
- * @returns True if storage is active
9
- */
10
- isActive(): boolean;
11
5
  /**
12
6
  * Set item into storage
13
7
  * @param key key name
@@ -1,4 +1,3 @@
1
- import { NgZone } from '@angular/core';
2
1
  import * as i0 from "@angular/core";
3
2
  interface DevtoolsLocal {
4
3
  init: (state: object) => void;
@@ -19,9 +18,8 @@ declare global {
19
18
  export declare class NgSimpleStateDevTool {
20
19
  private globalDevtools;
21
20
  private localDevTool;
22
- private isActiveDevtool;
23
21
  private baseState;
24
- constructor(ngZone: NgZone);
22
+ constructor();
25
23
  /**
26
24
  * Return true if dev tool is active
27
25
  * @returns True if dev tool is active
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ng-simple-state",
3
- "version": "19.0.2",
3
+ "version": "19.0.3",
4
4
  "description": "Simple state management in Angular with only Services and RxJS or Signal.",
5
5
  "repository": {
6
6
  "type": "git",
package/public-api.d.ts CHANGED
@@ -7,3 +7,4 @@ export * from './lib/storage/ng-simple-state-session-storage';
7
7
  export * from './lib/ng-simple-state-models';
8
8
  export * from './lib/ng-simple-state-common';
9
9
  export * from './lib/ng-simple-state-provider';
10
+ export * from './lib/ng-simple-state-utils';