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 +38 -42
- package/fesm2022/ng-simple-state.mjs +109 -74
- package/fesm2022/ng-simple-state.mjs.map +1 -1
- package/lib/ng-simple-state-common.d.ts +24 -2
- package/lib/ng-simple-state-utils.d.ts +28 -0
- package/lib/rxjs/ng-simple-state-base-store.d.ts +9 -1
- package/lib/signal/ng-simple-state-base-store.d.ts +9 -1
- package/lib/storage/ng-simple-state-browser-storage.d.ts +0 -6
- package/lib/tool/ng-simple-state-dev-tool.d.ts +1 -3
- package/package.json +1 -1
- package/public-api.d.ts +1 -0
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
|
|
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
|
-
|
|
422
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
866
|
-
|
|
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
|
|
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,
|
|
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(
|
|
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
|
-
|
|
41
|
+
inject(NgZone).runOutsideAngular(() => {
|
|
43
42
|
this.localDevTool = this.globalDevtools.connect({
|
|
44
43
|
name: 'NgSimpleState',
|
|
45
44
|
instanceId: instanceId
|
|
46
45
|
});
|
|
47
|
-
|
|
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.
|
|
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.
|
|
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: [
|
|
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: () => [
|
|
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
|
-
|
|
105
|
-
|
|
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
|
-
|
|
117
|
-
|
|
118
|
-
|
|
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
|
-
|
|
131
|
-
|
|
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
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
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
|
|
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 =
|
|
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 =
|
|
171
|
+
this.devToolIsEnabled = this.localStoreConfig.enableDevTool ?? false;
|
|
194
172
|
if (this.devToolIsEnabled) {
|
|
195
173
|
this.devTool = inject(NgSimpleStateDevTool);
|
|
196
174
|
}
|
|
197
|
-
this.storeName =
|
|
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,
|
|
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
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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":";;;;;AAsCA;;AAEG;MACU,sBAAsB,GAAG,IAAI,cAAc,CACpD,wBAAwB;;MCtCf,mBAAmB,CAAA;IAC5B,OAAO,OAAO,CACV,mBAAyC,EAAA;QAEzC,OAAO;AACH,YAAA,QAAQ,EAAE,mBAAmB;AAC7B,YAAA,SAAS,EAAE;AACP,gBAAA;AACI,oBAAA,OAAO,EAAE,sBAAsB;AAC/B,oBAAA,QAAQ,EAAE,mBAAmB;AAChC,iBAAA;AACJ,aAAA;SACJ;;8GAZI,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;+GAAnB,mBAAmB,EAAA,CAAA,CAAA;+GAAnB,mBAAmB,EAAA,CAAA,CAAA;;2FAAnB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAD/B;;;ACeD,MAAM,UAAU,GAAG,CAAmB,gBAAA,EAAA,IAAI,CAAC,GAAG,EAAE,CAAA,CAAA,EAAI,IAAI,CAAC,MAAM,EAAE,EAAE;MAGtD,oBAAoB,CAAA;AAM7B,IAAA,WAAA,GAAA;QAJQ,IAAc,CAAA,cAAA,GAAa,MAAM,CAAC,4BAA4B,IAAI,MAAM,CAAC,iBAAiB;QAE1F,IAAS,CAAA,SAAA,GAA2B,EAAE;AAG1C,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;;;;;AAKrB,YAAA,MAAM,CAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,MAAK;gBAClC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;AAC5C,oBAAA,IAAI,EAAE,eAAe;AACrB,oBAAA,UAAU,EAAE;AACf,iBAAA,CAAC;AACF,gBAAA,IAAI,IAAI,CAAC,YAAY,EAAE;oBACnB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;;AAE9C,aAAC,CAAC;;;AAIV;;;AAGG;IACH,QAAQ,GAAA;AACJ,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC,YAAY;;AAG9B;;;;;;AAMG;AACH,IAAA,IAAI,CAAI,SAAiB,EAAE,UAAkB,EAAE,KAAQ,EAAA;AACnD,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACnB,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAI,CAAG,EAAA,SAAS,CAAI,CAAA,EAAA,UAAU,CAAE,CAAA,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,GAAG,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC;AACjI,YAAA,OAAO,IAAI;;AAEf,QAAA,OAAO,KAAK;;8GA5CP,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAApB,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,oBAAoB,cADP,MAAM,EAAA,CAAA,CAAA;;2FACnB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBADhC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACpB3B,MAAM,QAAQ,GAAG,iBAAiB;MAEnB,2BAA2B,CAAA;AAE7C,IAAA,WAAA,CAAoB,OAAgB,EAAA;QAAhB,IAAO,CAAA,OAAA,GAAP,OAAO;;AAE3B;;;;;AAKG;IACH,OAAO,CAAI,GAAW,EAAE,KAAQ,EAAA;AAC5B,QAAA,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,GAAG,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC3D,QAAA,OAAO,IAAI;;AAGf;;;;AAIG;AACH,IAAA,OAAO,CAAI,GAAW,EAAA;AAClB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,GAAG,GAAG,CAAC;QAClD,IAAI,KAAK,EAAE;AACP,YAAA,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;;AAE5B,QAAA,OAAO,IAAI;;AAGf;;;;AAIG;AACH,IAAA,UAAU,CAAC,GAAW,EAAA;QAClB,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,GAAG,GAAG,CAAC;AACvC,QAAA,OAAO,IAAI;;AAGf;;;AAGG;IACH,KAAK,GAAA;AACD,QAAA,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;YAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;YAC/B,IAAI,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;AACjC,gBAAA,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;;;AAGpC,QAAA,OAAO,IAAI;;AAElB;;ACjDK,MAAO,yBAA0B,SAAQ,2BAA2B,CAAA;AACtE,IAAA,WAAA,GAAA;QACI,KAAK,CAAC,YAAY,CAAC;;8GAFd,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAzB,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,yBAAyB,cADZ,MAAM,EAAA,CAAA,CAAA;;2FACnB,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBADrC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACC5B,MAAO,2BAA4B,SAAQ,2BAA2B,CAAA;AACxE,IAAA,WAAA,GAAA;QACI,KAAK,CAAC,cAAc,CAAC;;8GAFhB,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAA3B,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,2BAA2B,cADd,MAAM,EAAA,CAAA,CAAA;;2FACnB,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBADvC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MCQZ,4BAA4B,CAAA;AAe9C,IAAA,WAAA,GAAA;QAJU,IAAO,CAAA,OAAA,GAAY,SAAS,EAAE;QAE9B,IAAY,CAAA,YAAA,GAAG,MAAM,CAAC,sBAAsB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAIvE,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE;AAC5C,QAAA,IAAI,CAAC,gBAAgB,GAAG,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE,GAAG,WAAW,EAAE;QAEhE,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,IAAI,KAAK;AAE9E,QAAA,IAAI,IAAI,CAAC,qBAAqB,EAAE;YAC5B,IAAI,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,KAAK,OAAO,EAAE;AACrD,gBAAA,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,yBAAyB,CAAC;;iBACvD,IAAI,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,KAAK,SAAS,EAAE;AAC9D,gBAAA,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,2BAA2B,CAAC;;;QAIpE,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,aAAa,IAAI,KAAK;AACpE,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;AACvB,YAAA,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,oBAAoB,CAAC;;AAG/C,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI;QACzE,IAAI,OAAO,IAAI,CAAC,gBAAgB,CAAC,UAAU,KAAK,UAAU,EAAE;YACxD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,UAAU;;QAGtD,IAAI,IAAI,CAAC,qBAAqB,IAAI,IAAI,CAAC,iBAAiB,EAAE;AACtD,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAI,IAAI,CAAC,SAAS,CAAC;YACpE,IAAI,UAAU,EAAE;AACZ,gBAAA,IAAI,CAAC,UAAU,GAAG,UAAU;;;AAGpC,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;AAClB,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE;;QAGzC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC;QAEjD,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;;AAGjD;;AAEG;IACH,WAAW,GAAA;AACP,QAAA,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,aAAa,CAAC;;AA8C9C;;;;;AAKG;IACH,aAAa,GAAA;QACT,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC;;AAG3C;;;;AAIG;IACH,UAAU,GAAA;AACN,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC;;AAG7D;;AAEG;IACH,YAAY,GAAA;AACR,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,EAAE,cAAc,CAAC;;AAwBzD,IAAA,UAAU,CAAC,SAAY,EAAE,iBAAuC,EAAE,UAAmB,EAAA;AAC3F,QAAA,IAAI,QAAoB;AACxB,QAAA,IAAI,OAAO,iBAAiB,KAAK,UAAU,EAAE;AACzC,YAAA,QAAQ,GAAG,iBAAiB,CAAC,SAAS,CAAC;;aACpC;YACH,QAAQ,GAAG,iBAAiB;;AAEhC,QAAA,IAAI,KAAQ;AACZ,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE;YACd,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,EAAO,EAAE,QAAQ,CAAC;;aACrC;YACH,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC;;AAElD,QAAA,IAAI,SAAS,KAAK,QAAQ,EAAE;AACxB,YAAA,OAAO,SAAS;;AAEpB,QAAA,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,UAAU,CAAC;AACnC,QAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;AACxB,QAAA,OAAO,KAAK;;AAGN,IAAA,QAAQ,CAAI,QAAqB,EAAA;AACvC,QAAA,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,GAAG,EAAE,EAAE,QAAQ,CAAM;;AAG/D;;;;;AAKG;IACO,WAAW,CAAC,QAAuB,EAAE,UAAmB,EAAA;QAC9D,IAAI,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;AACzC,YAAA,OAAO,KAAK;;QAEhB,IAAI,CAAC,UAAU,EAAE;;AAEb,YAAA,IAAI;AACA,gBAAA,UAAU,GAAG,IAAI,KAAK,EAAE,CAAC;sBACnB,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU;AAC7B,sBAAE,IAAI;AACN,sBAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;sBACZ,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,SAAS;;YAClC,OAAO,CAAC,EAAE;gBACR,UAAU,GAAG,SAAS;;;AAG9B,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE;AAC1D,YAAA,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,GAAG,GAAG,UAAU,EAAE,QAAQ,CAAC;;AAE5D,QAAA,OAAO,IAAI;;AAGf;;;;AAIG;AACO,IAAA,UAAU,CAAC,MAAS,EAAA;;QAE1B,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,EAAE;AAC1B,YAAA,OAAO,MAAqB;;;;;;;;AAShC,QAAA,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AACzB,YAAA,OAAO,MAAqB;;;;AAKhC,QAAA,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;;QAErB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,UAAU,CAAE,MAAc,CAAC,GAAG,CAAC,CAAC,CAAC;AAEzE,QAAA,OAAO,MAAqB;;AAGhC;;AAEG;AACO,IAAA,YAAY,CAAC,KAAQ,EAAA;QAC3B,IAAI,IAAI,CAAC,qBAAqB,IAAI,IAAI,CAAC,iBAAiB,EAAE;YACtD,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAI,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC;;;8GAhP9C,4BAA4B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAA5B,4BAA4B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;kHAA5B,4BAA4B,EAAA,CAAA,CAAA;;2FAA5B,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBAFjD;;kBACA;;;ACFD;AACM,MAAgB,0BAA0D,SAAQ,4BAA+B,CAAA;AAOnH;;;AAGG;AACH,IAAA,IAAW,KAAK,GAAA;QACZ,OAAO,IAAI,CAAC,QAAQ;;AAGxB,IAAA,WAAA,GAAA;AACI,QAAA,KAAK,EAAE;QAdD,IAAU,CAAA,UAAA,GAAW,CAAC;QAGf,IAAW,CAAA,WAAA,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;AAYnD,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,eAAe,CAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACpE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE;;AAG9C;;AAEG;IACM,WAAW,GAAA;QAChB,KAAK,CAAC,WAAW,EAAE;AACnB,QAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;;AAG1B;;;;;AAKG;IACH,WAAW,CAAiB,QAAyC,EAAE,UAAuC,EAAA;AAC1G,QAAA,QAAQ,KAAK,IAAI,CAAC,WAAW;AAC7B,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CACnB,GAAG,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAoB,CAAC,CAAC,EAC5C,oBAAoB,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,EACnD,SAAS,CAAC,cAAc,CAAC,CAC5B;;AAGL;;;AAGG;IACH,eAAe,GAAA;QACX,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;;IAiBlD,QAAQ,CAAC,iBAAuC,EAAE,UAAmB,EAAA;AACjE,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,iBAAiB,EAAE,UAAU,CAAC;AACpF,QAAA,IAAI,OAAO,KAAK,KAAK,WAAW,EAAE;AAC9B,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;AACvB,YAAA,OAAO,IAAI;;AAEf,QAAA,OAAO,KAAK;;8GAxEE,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAA1B,0BAA0B,EAAA,YAAA,EAAA,IAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;kHAA1B,0BAA0B,EAAA,CAAA,CAAA;;2FAA1B,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBAH/C;;kBACA;;AAgFD;;AAEG;AACH;AACM,MAAgB,sBAAsD,SAAQ,0BAA6B,CAAA;AAC7G,IAAA,WAAA,GAAA;AACI,QAAA,KAAK,EAAE;AACP,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE;AACd,YAAA,OAAO,CAAC,IAAI,CAAC,6EAA6E,CAAC;;;8GAJjF,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAtB,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;kHAAtB,sBAAsB,EAAA,CAAA,CAAA;;2FAAtB,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAN3C;;kBACA;;;AChFD;AACM,MAAgB,4BAA4D,SAAQ,4BAA+B,CAAA;AAOrH;;;AAGG;AACH,IAAA,IAAW,KAAK,GAAA;QACZ,OAAO,IAAI,CAAC,UAAU;;AAG1B,IAAA,WAAA,GAAA;AACI,QAAA,KAAK,EAAE;QAdD,IAAU,CAAA,UAAA,GAAW,CAAC;QAGf,IAAW,CAAA,WAAA,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;AAYnD,QAAA,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACzD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE;;AAGhD;;;;;AAKG;IACH,WAAW,CAAiB,QAAyC,EAAE,UAAuC,EAAA;AAC1G,QAAA,QAAQ,KAAK,IAAI,CAAC,WAAW;QAC7B,OAAO,QAAQ,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAiB,CAAC,EAAE,EAAE,KAAK,EAAE,UAAU,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;;AAG7G;;;AAGG;IACH,eAAe,GAAA;QACX,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;;IAiB3C,QAAQ,CAAC,iBAAuC,EAAE,UAAmB,EAAA;AACjE,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,iBAAiB,EAAE,UAAU,CAAC;AACpF,QAAA,IAAI,OAAO,KAAK,KAAK,WAAW,EAAE;AAC9B,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;AACxB,YAAA,OAAO,IAAI;;AAEf,QAAA,OAAO,KAAK;;8GA5DE,4BAA4B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAA5B,4BAA4B,EAAA,YAAA,EAAA,IAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;kHAA5B,4BAA4B,EAAA,CAAA,CAAA;;2FAA5B,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBAHjD;;kBACA;;;ACFK,SAAU,oBAAoB,CAAC,mBAAyC,EAAA;IAC1E,MAAM,SAAS,GAA2B,EAAE;IAC5C,IAAI,mBAAmB,EAAE;AACrB,QAAA,SAAS,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;AACrC,gBAAA,OAAO,EAAE,sBAAsB;AAC/B,gBAAA,QAAQ,EAAE,mBAAmB;aAChC,CAAC,CAAC,CAAC;;AAER,IAAA,OAAO,SAAS;AACpB;;ACZA;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BG;AACa,SAAA,mBAAmB,CAAI,CAAI,EAAE,CAAI,EAAA;IAC7C,IAAI,CAAC,KAAK,CAAC;AAAE,QAAA,OAAO,IAAI;AAExB,IAAA,IAAI,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,QAAQ,IAAI,OAAO,CAAC,IAAI,QAAQ,EAAE;AACxD,QAAA,IAAI,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,WAAW;AAAE,YAAA,OAAO,KAAK;AAEjD,QAAA,IAAI,MAAc;AAClB,QAAA,IAAI,CAAS;AACb,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;AACtC,YAAA,MAAM,GAAG,CAAC,CAAC,MAAM;AACjB,YAAA,IAAI,MAAM,KAAK,CAAC,CAAC,MAAM;AAAE,gBAAA,OAAO,KAAK;AACrC,YAAA,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC;AACtB,gBAAA,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAAE,oBAAA,OAAO,KAAK;AACtD,YAAA,OAAO,IAAI;;QAGf,IAAI,CAAC,CAAC,WAAW,KAAK,MAAM,IAAI,CAAC,CAAC,WAAW,KAAK,MAAM;AAAE,YAAA,OAAQ,CAAY,CAAC,MAAM,KAAM,CAAY,CAAC,MAAM,IAAK,CAAY,CAAC,KAAK,KAAM,CAAY,CAAC,KAAK;QAC7J,IAAI,CAAC,CAAC,OAAO,KAAK,MAAM,CAAC,SAAS,CAAC,OAAO;YAAE,OAAO,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE;QAC9E,IAAI,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,SAAS,CAAC,QAAQ;YAAE,OAAO,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,QAAQ,EAAE;QAElF,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AAC3B,QAAA,MAAM,GAAG,IAAI,CAAC,MAAM;QACpB,IAAI,MAAM,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM;AAAE,YAAA,OAAO,KAAK;AAElD,QAAA,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC;AACtB,YAAA,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;AAAE,gBAAA,OAAO,KAAK;QAEvE,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,GAAG;AACzB,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;AACnB,YAAA,IAAI,CAAC,mBAAmB,CAAE,CAAS,CAAC,GAAG,CAAC,EAAG,CAAS,CAAC,GAAG,CAAC,CAAC;AAAE,gBAAA,OAAO,KAAK;;AAG5E,QAAA,OAAO,IAAI;;AAGf,IAAA,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;AAC7B;AAAC;;AC/DD;;AAEG;;ACFH;;AAEG;;;;"}
|
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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(
|
|
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
package/public-api.d.ts
CHANGED