ng-simple-state 20.0.1 → 20.1.1
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 +23 -17
- package/fesm2022/ng-simple-state.mjs +11 -21
- package/fesm2022/ng-simple-state.mjs.map +1 -1
- package/index.d.ts +25 -13
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -23,11 +23,13 @@ npm i ng-simple-state
|
|
|
23
23
|
|
|
24
24
|
`provideNgSimpleState` has some global optional config defined by `NgSimpleStateConfig` interface:
|
|
25
25
|
|
|
26
|
-
| Option | Description | Default
|
|
27
|
-
| -------------------- | ----------------------------------------------------------------------------------------------- |
|
|
28
|
-
| *enableDevTool* | if `true` enable `Redux DevTools` browser extension for inspect the state of the store. | `false`
|
|
29
|
-
| *persistentStorage* | Set the persistent storage `local` or `session`. | undefined
|
|
30
|
-
| *comparator* | A function used to compare the previous and current state for equality. | `a === b`
|
|
26
|
+
| Option | Description | Default |
|
|
27
|
+
| -------------------- | ----------------------------------------------------------------------------------------------- | ---------------- |
|
|
28
|
+
| *enableDevTool* | if `true` enable `Redux DevTools` browser extension for inspect the state of the store. | `false` |
|
|
29
|
+
| *persistentStorage* | Set the persistent storage `local` or `session`. | undefined |
|
|
30
|
+
| *comparator* | A function used to compare the previous and current state for equality. | `a === b` |
|
|
31
|
+
| *serializeState* | A function used to serialize the state to a string. | `JSON.stringify` |
|
|
32
|
+
| *deserializeState* | A function used to deserialize the state from a string. | `JSON.parse` |
|
|
31
33
|
|
|
32
34
|
_Side note: each store can be override the global configuration implementing `storeConfig()` method (see "Override global config")._
|
|
33
35
|
|
|
@@ -296,12 +298,14 @@ export class CounterStore extends NgSimpleStateBaseRxjsStore<CounterState> {
|
|
|
296
298
|
|
|
297
299
|
The options are defined by `NgSimpleStateStoreConfig` interface:
|
|
298
300
|
|
|
299
|
-
| Option | Description | Default
|
|
300
|
-
| -------------------- | ----------------------------------------------------------------------------------------------- |
|
|
301
|
-
| *enableDevTool* | if `true` enable `Redux DevTools` browser extension for inspect the state of the store. | `false`
|
|
302
|
-
| *storeName* | The store name. | undefined
|
|
303
|
-
| *persistentStorage* | Set the persistent storage `local` or `session` | undefined
|
|
304
|
-
| *comparator* | A function used to compare the previous and current state for equality. | `a === b`
|
|
301
|
+
| Option | Description | Default |
|
|
302
|
+
| -------------------- | ----------------------------------------------------------------------------------------------- | ---------------- |
|
|
303
|
+
| *enableDevTool* | if `true` enable `Redux DevTools` browser extension for inspect the state of the store. | `false` |
|
|
304
|
+
| *storeName* | The store name. | undefined |
|
|
305
|
+
| *persistentStorage* | Set the persistent storage `local` or `session` | undefined |
|
|
306
|
+
| *comparator* | A function used to compare the previous and current state for equality. | `a === b` |
|
|
307
|
+
| *serializeState* | A function used to serialize the state to a string. | `JSON.stringify` |
|
|
308
|
+
| *deserializeState* | A function used to deserialize the state from a string. | `JSON.parse` |
|
|
305
309
|
|
|
306
310
|
|
|
307
311
|
### Testing
|
|
@@ -747,12 +751,14 @@ export class CounterStore extends NgSimpleStateBaseSignalStore<CounterState> {
|
|
|
747
751
|
|
|
748
752
|
The options are defined by `NgSimpleStateStoreConfig` interface:
|
|
749
753
|
|
|
750
|
-
| Option | Description | Default
|
|
751
|
-
| -------------------- | ----------------------------------------------------------------------------------------------- |
|
|
752
|
-
| *enableDevTool* | if `true` enable `Redux DevTools` browser extension for inspect the state of the store. | `false`
|
|
753
|
-
| *storeName* | The store name. | undefined
|
|
754
|
-
| *persistentStorage* | Set the persistent storage `local` or `session` | undefined
|
|
755
|
-
| *comparator* | A function used to compare the previous and current state for equality. | `a === b`
|
|
754
|
+
| Option | Description | Default |
|
|
755
|
+
| -------------------- | ----------------------------------------------------------------------------------------------- | ---------------- |
|
|
756
|
+
| *enableDevTool* | if `true` enable `Redux DevTools` browser extension for inspect the state of the store. | `false` |
|
|
757
|
+
| *storeName* | The store name. | undefined |
|
|
758
|
+
| *persistentStorage* | Set the persistent storage `local` or `session` | undefined |
|
|
759
|
+
| *comparator* | A function used to compare the previous and current state for equality. | `a === b` |
|
|
760
|
+
| *serializeState* | A function used to serialize the state to a string. | `JSON.stringify` |
|
|
761
|
+
| *deserializeState* | A function used to deserialize the state from a string. | `JSON.parse` |
|
|
756
762
|
|
|
757
763
|
### Testing
|
|
758
764
|
|
|
@@ -80,8 +80,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.0", ngImpor
|
|
|
80
80
|
|
|
81
81
|
const BASE_KEY = 'NgSimpleState::';
|
|
82
82
|
class NgSimpleStateBrowserStorage {
|
|
83
|
-
constructor(storage) {
|
|
83
|
+
constructor(storage, config) {
|
|
84
84
|
this.storage = storage;
|
|
85
|
+
this.serializeState = config?.serializeState ? config.serializeState : JSON.stringify;
|
|
86
|
+
this.deserializeState = config?.deserializeState ? config.deserializeState : JSON.parse;
|
|
85
87
|
}
|
|
86
88
|
/**
|
|
87
89
|
* Set item into storage
|
|
@@ -90,7 +92,7 @@ class NgSimpleStateBrowserStorage {
|
|
|
90
92
|
* @returns True if item is stored into storage
|
|
91
93
|
*/
|
|
92
94
|
setItem(key, state) {
|
|
93
|
-
this.storage.setItem(BASE_KEY + key,
|
|
95
|
+
this.storage.setItem(BASE_KEY + key, this.serializeState(state));
|
|
94
96
|
return true;
|
|
95
97
|
}
|
|
96
98
|
/**
|
|
@@ -101,7 +103,7 @@ class NgSimpleStateBrowserStorage {
|
|
|
101
103
|
getItem(key) {
|
|
102
104
|
const state = this.storage.getItem(BASE_KEY + key);
|
|
103
105
|
if (state) {
|
|
104
|
-
return
|
|
106
|
+
return this.deserializeState(state);
|
|
105
107
|
}
|
|
106
108
|
return null;
|
|
107
109
|
}
|
|
@@ -130,28 +132,16 @@ class NgSimpleStateBrowserStorage {
|
|
|
130
132
|
}
|
|
131
133
|
|
|
132
134
|
class NgSimpleStateLocalStorage extends NgSimpleStateBrowserStorage {
|
|
133
|
-
constructor() {
|
|
134
|
-
super(localStorage);
|
|
135
|
+
constructor(config) {
|
|
136
|
+
super(localStorage, config);
|
|
135
137
|
}
|
|
136
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.0", ngImport: i0, type: NgSimpleStateLocalStorage, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
137
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.0", ngImport: i0, type: NgSimpleStateLocalStorage, providedIn: 'root' }); }
|
|
138
138
|
}
|
|
139
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.0", ngImport: i0, type: NgSimpleStateLocalStorage, decorators: [{
|
|
140
|
-
type: Injectable,
|
|
141
|
-
args: [{ providedIn: 'root' }]
|
|
142
|
-
}], ctorParameters: () => [] });
|
|
143
139
|
|
|
144
140
|
class NgSimpleStateSessionStorage extends NgSimpleStateBrowserStorage {
|
|
145
|
-
constructor() {
|
|
146
|
-
super(sessionStorage);
|
|
141
|
+
constructor(config) {
|
|
142
|
+
super(sessionStorage, config);
|
|
147
143
|
}
|
|
148
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.0", ngImport: i0, type: NgSimpleStateSessionStorage, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
149
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.0", ngImport: i0, type: NgSimpleStateSessionStorage, providedIn: 'root' }); }
|
|
150
144
|
}
|
|
151
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.0", ngImport: i0, type: NgSimpleStateSessionStorage, decorators: [{
|
|
152
|
-
type: Injectable,
|
|
153
|
-
args: [{ providedIn: 'root' }]
|
|
154
|
-
}], ctorParameters: () => [] });
|
|
155
145
|
|
|
156
146
|
class NgSimpleStateBaseCommonStore {
|
|
157
147
|
constructor() {
|
|
@@ -161,10 +151,10 @@ class NgSimpleStateBaseCommonStore {
|
|
|
161
151
|
const storeConfig = this.storeConfig();
|
|
162
152
|
const config = { ...globalConfig, ...storeConfig };
|
|
163
153
|
if (config.persistentStorage === 'local') {
|
|
164
|
-
this.storage =
|
|
154
|
+
this.storage = new NgSimpleStateLocalStorage(config);
|
|
165
155
|
}
|
|
166
156
|
else if (config.persistentStorage === 'session') {
|
|
167
|
-
this.storage =
|
|
157
|
+
this.storage = new NgSimpleStateSessionStorage(config);
|
|
168
158
|
}
|
|
169
159
|
if (config.enableDevTool) {
|
|
170
160
|
this.devTool = inject(NgSimpleStateDevTool);
|
|
@@ -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\n/* eslint-disable-next-line @typescript-eslint/no-explicit-any */\r\nexport type NgSimpleStateComparator<K = any> = (previous: K, current: K) => boolean;\r\n\r\n/**\r\n * NgSimpleState config option\r\n */\r\n/* eslint-disable-next-line @typescript-eslint/no-explicit-any */\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 * 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?: NgSimpleStateComparator<K>;\r\n}\r\n\r\n/**\r\n * NgSimpleState config option for store\r\n */\r\n/* eslint-disable-next-line @typescript-eslint/no-explicit-any */\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\r\nexport type StateFnOrNewState<S> = Partial<S> | NgSimpleStateSetState<S>;\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 readonly globalDevtools: Devtools = window.__REDUX_DEVTOOLS_EXTENSION__ || window.devToolsExtension;\r\n private localDevTool!: DevtoolsLocal;\r\n private readonly 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 { NgSimpleStateDevTool } from './tool/ng-simple-state-dev-tool';\r\nimport type { NgSimpleStateBrowserStorage } from './storage/ng-simple-state-browser-storage';\r\nimport { NgSimpleStateLocalStorage } from './storage/ng-simple-state-local-storage';\r\nimport { NgSimpleStateSessionStorage } from './storage/ng-simple-state-session-storage';\r\nimport { type NgSimpleStateStoreConfig, NG_SIMPLE_STORE_CONFIG, type NgSimpleStateSetState, type NgSimpleStateComparator, type NgSimpleStateSelectState, type StateFnOrNewState, NgSimpleStateConfig } from './ng-simple-state-models';\r\n\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 devTool!: NgSimpleStateDevTool;\r\n protected storage!: NgSimpleStateBrowserStorage;\r\n protected storeName: string;\r\n protected firstState!: S;\r\n protected initState!: S;\r\n protected isArray: boolean;\r\n protected devMode: boolean = isDevMode();\r\n protected comparator!: NgSimpleStateComparator<S>;\r\n protected readonly selectFnRef = this.selectFn.bind(this);\r\n\r\n constructor() {\r\n\r\n const globalConfig: NgSimpleStateConfig<S> | null = inject(NG_SIMPLE_STORE_CONFIG, { optional: true })\r\n const storeConfig = this.storeConfig();\r\n const config = { ...globalConfig, ...storeConfig };\r\n\r\n if (config.persistentStorage === 'local') {\r\n this.storage = inject(NgSimpleStateLocalStorage);\r\n } else if (config.persistentStorage === 'session') {\r\n this.storage = inject(NgSimpleStateSessionStorage);\r\n }\r\n\r\n if (config.enableDevTool) {\r\n this.devTool = inject(NgSimpleStateDevTool);\r\n }\r\n\r\n this.storeName = config.storeName;\r\n\r\n if (typeof config.comparator === 'function') {\r\n this.comparator = config.comparator;\r\n }\r\n\r\n if (this.storage) {\r\n const firstState = this.storage.getItem<S>(this.storeName);\r\n if (firstState) {\r\n this.firstState = firstState;\r\n }\r\n }\r\n\r\n this.initState = this.initialState();\r\n if (!this.firstState) {\r\n this.firstState = this.initState;\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\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\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.initState, '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(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(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(stateFnOrNewState: StateFnOrNewState<S>, actionName?: string): S | undefined;\r\n protected patchState(stateFnOrNewState: StateFnOrNewState<S>, actionName?: string): S | undefined {\r\n const currState = this.getCurrentState();\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 if (Object.is(currState, newState)) {\r\n return undefined;\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 (this.comparator && this.comparator(currState, state)) {\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.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 /* eslint-disable-next-line @typescript-eslint/no-unused-vars */\r\n } catch (_) {\r\n /* istanbul ignore next */\r\n actionName = 'unknown';\r\n }\r\n }\r\n if (!this.devTool.send(this.storeName, actionName, newState)) {\r\n /* istanbul ignore next */\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.storage) {\r\n this.storage.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 type { NgSimpleStateComparator, NgSimpleStateSelectState, NgSimpleStateSetState, StateFnOrNewState } 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> = new BehaviorSubject<S>(this.selectFn(this.firstState));\r\n private readonly stateObs: Observable<S> = this.state$.asObservable();\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 /**\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 as NgSimpleStateComparator),\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(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","import { Injectable, Directive, Signal, signal, computed, WritableSignal } from '@angular/core';\r\nimport { NgSimpleStateBaseCommonStore } from '../ng-simple-state-common';\r\nimport type { NgSimpleStateComparator, NgSimpleStateSelectState, NgSimpleStateSetState, StateFnOrNewState } 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> = signal<S>(this.selectFn(this.firstState));\r\n private readonly stateSigRo: Signal<S> = this.stateSig.asReadonly();\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 /**\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 as NgSimpleStateComparator });\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(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): EnvironmentProviders[] {\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';\r\n","/**\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/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\n/* eslint-disable-next-line @typescript-eslint/no-explicit-any */\r\nexport type NgSimpleStateComparator<K = any> = (previous: K, current: K) => boolean;\r\n\r\n/**\r\n * NgSimpleState config option\r\n */\r\n/* eslint-disable-next-line @typescript-eslint/no-explicit-any */\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 * 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?: NgSimpleStateComparator<K>;\r\n /**\r\n * A function used to serialize the state to a string.\r\n */\r\n serializeState?: (state: K) => string;\r\n /**\r\n * A function used to deserialize the state from a string. \r\n */\r\n deserializeState?: (state: string) => K;\r\n}\r\n\r\n/**\r\n * NgSimpleState config option for store\r\n */\r\n/* eslint-disable-next-line @typescript-eslint/no-explicit-any */\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\r\nexport type StateFnOrNewState<S> = Partial<S> | NgSimpleStateSetState<S>;\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 readonly globalDevtools: Devtools = window.__REDUX_DEVTOOLS_EXTENSION__ || window.devToolsExtension;\r\n private localDevTool!: DevtoolsLocal;\r\n private readonly 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","import { NgSimpleStateStoreConfig } from \"../ng-simple-state-models\";\n\nexport const BASE_KEY = 'NgSimpleState::';\n\nexport abstract class NgSimpleStateBrowserStorage<K = any> {\n\n /**\n * A function used to serialize the state to a string.\n */\n private serializeState: (state: K) => string;\n \n /**\n * A function used to deserialize the state from a string. \n */\n private deserializeState: (state: string) => K;\n\n constructor(private storage: Storage, config?: NgSimpleStateStoreConfig<K>) { \n this.serializeState = config?.serializeState ? config.serializeState : JSON.stringify;\n this.deserializeState = config?.deserializeState ? config.deserializeState : JSON.parse;\n }\n\n /**\n * Set item into storage\n * @param key key name\n * @param state state value\n * @returns True if item is stored into storage\n */\n setItem(key: string, state: K): boolean {\n this.storage.setItem(BASE_KEY + key, this.serializeState(state));\n return true;\n }\n\n /**\n * Return item from storage\n * @param key key name\n * @returns the item\n */\n getItem(key: string): K | null {\n const state = this.storage.getItem(BASE_KEY + key);\n if (state) {\n return this.deserializeState(state);\n }\n return null;\n }\n\n /**\n * Remove item from storage\n * @param key key name\n * @returns True if item is removed\n */\n removeItem(key: string): boolean {\n this.storage.removeItem(BASE_KEY + key);\n return true;\n }\n\n /**\n * Removes all key/value pairs, if there are any.\n * @returns True if storage is cleared\n */\n clear(): boolean {\n for (let i = this.storage.length; i >= 0; i--) {\n const key = this.storage.key(i);\n if (key && key.startsWith(BASE_KEY)) {\n this.storage.removeItem(key);\n }\n }\n return true;\n }\n}\n","import { NgSimpleStateStoreConfig } from '../ng-simple-state-models';\r\nimport { NgSimpleStateBrowserStorage } from './ng-simple-state-browser-storage';\r\n\r\nexport class NgSimpleStateLocalStorage<K = any> extends NgSimpleStateBrowserStorage<K> {\r\n constructor(config?: NgSimpleStateStoreConfig<K>) {\r\n super(localStorage, config);\r\n }\r\n}\r\n","\r\nimport { NgSimpleStateStoreConfig } from '../ng-simple-state-models';\r\nimport { NgSimpleStateBrowserStorage } from './ng-simple-state-browser-storage';\r\n\r\nexport class NgSimpleStateSessionStorage<K = any> extends NgSimpleStateBrowserStorage<K> {\r\n constructor(config?: NgSimpleStateStoreConfig<K>) {\r\n super(sessionStorage, config);\r\n }\r\n}\r\n","import { Injectable, OnDestroy, Directive, isDevMode, inject } from '@angular/core';\nimport { NgSimpleStateDevTool } from './tool/ng-simple-state-dev-tool';\nimport type { NgSimpleStateBrowserStorage } from './storage/ng-simple-state-browser-storage';\nimport { NgSimpleStateLocalStorage } from './storage/ng-simple-state-local-storage';\nimport { NgSimpleStateSessionStorage } from './storage/ng-simple-state-session-storage';\nimport { type NgSimpleStateStoreConfig, NG_SIMPLE_STORE_CONFIG, type NgSimpleStateSetState, type NgSimpleStateComparator, type NgSimpleStateSelectState, type StateFnOrNewState, NgSimpleStateConfig } from './ng-simple-state-models';\n\n\n@Injectable()\n@Directive()\nexport abstract class NgSimpleStateBaseCommonStore<S extends object | Array<unknown>> implements OnDestroy {\n\n protected abstract stackPoint: number;\n protected devTool!: NgSimpleStateDevTool;\n protected storage!: NgSimpleStateBrowserStorage<S>;\n protected storeName: string;\n protected firstState!: S;\n protected initState!: S;\n protected isArray: boolean;\n protected devMode: boolean = isDevMode();\n protected comparator!: NgSimpleStateComparator<S>;\n protected readonly selectFnRef = this.selectFn.bind(this);\n\n constructor() {\n\n const globalConfig: NgSimpleStateConfig<S> | null = inject(NG_SIMPLE_STORE_CONFIG, { optional: true })\n const storeConfig = this.storeConfig();\n const config = { ...globalConfig, ...storeConfig };\n\n if (config.persistentStorage === 'local') {\n this.storage = new NgSimpleStateLocalStorage(config);\n } else if (config.persistentStorage === 'session') {\n this.storage = new NgSimpleStateSessionStorage(config);\n }\n\n if (config.enableDevTool) {\n this.devTool = inject(NgSimpleStateDevTool);\n }\n\n this.storeName = config.storeName;\n\n if (typeof config.comparator === 'function') {\n this.comparator = config.comparator;\n }\n\n if (this.storage) {\n const firstState = this.storage.getItem(this.storeName);\n if (firstState) {\n this.firstState = firstState;\n }\n }\n\n this.initState = this.initialState();\n if (!this.firstState) {\n this.firstState = this.initState;\n }\n\n this.devToolSend(this.firstState, 'initialState');\n\n this.isArray = Array.isArray(this.firstState);\n }\n\n /**\n * When you override this method, you have to call the `super.ngOnDestroy()` method in your `ngOnDestroy()` method.\n */\n ngOnDestroy(): void {\n this.devToolSend(undefined, 'ngOnDestroy');\n }\n\n /**\n * Override this method for set a specific config for the store\n * @returns NgSimpleStateStoreConfig\n */\n protected abstract storeConfig(): NgSimpleStateStoreConfig;\n\n /**\n * Set into the store the initial state\n * @returns The state object\n */\n protected abstract initialState(): S;\n\n /**\n * Select a store state\n * @param selectFn State selector (if not provided return full state)\n * @param comparator A function used to compare the previous and current state for equality. Defaults to a `===` check.\n * @returns Observable of the selected state\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n abstract selectState<K = Partial<S>>(selectFn?: NgSimpleStateSelectState<S, K>, comparator?: NgSimpleStateComparator<K>): any;\n\n /**\n * Set a new state\n * @param newState New state\n * @param actionName The action label into Redux DevTools (default is parent function name)\n * @returns True if the state is changed\n */\n abstract setState(newState: Partial<S>, actionName?: string): boolean;\n\n /**\n * Set a new state\n * @param selectFn State reducer\n * @param actionName The action label into Redux DevTools (default is parent function name)\n * @returns True if the state is changed\n */\n abstract setState(stateFn: NgSimpleStateSetState<S>, actionName?: string): boolean;\n\n /**\n * Return the current store state (snapshot)\n * @returns The current state\n */\n abstract getCurrentState(): Readonly<S>;\n\n /**\n * Return the first loaded store state:\n * the last saved state\n * otherwise the initial state provided from `initialState()` method.\n * @returns The first state\n */\n getFirstState(): Readonly<S> | null {\n return this.deepFreeze(this.firstState);\n }\n\n /**\n * Reset store to first loaded store state:\n * - the last saved state\n * - otherwise the initial state provided from `initialState()` method.\n */\n resetState(): boolean {\n return this.setState(this.firstState, 'resetState');\n }\n\n /**\n * Restart the store to initial state provided from `initialState()` method\n */\n restartState(): boolean {\n return this.setState(this.initState, 'restartState');\n }\n\n /**\n * Set a new state\n * @param newState New state\n * @param actionName The action label into Redux DevTools (default is parent function name)\n * @returns state\n */\n protected patchState(newState: Partial<S>, actionName?: string): S | undefined;\n /**\n * Set a new state\n * @param selectFn State reducer\n * @param actionName The action label into Redux DevTools (default is parent function name)\n * @returns state\n */\n protected patchState(stateFn: NgSimpleStateSetState<S>, actionName?: string): S | undefined;\n /**\n * Set a new state\n * @param stateFnOrNewState State reducer or new state\n * @param actionName The action label into Redux DevTools (default is parent function name)\n * @returns state\n */\n protected patchState(stateFnOrNewState: StateFnOrNewState<S>, actionName?: string): S | undefined;\n protected patchState(stateFnOrNewState: StateFnOrNewState<S>, actionName?: string): S | undefined {\n const currState = this.getCurrentState();\n let newState: Partial<S>;\n if (typeof stateFnOrNewState === 'function') {\n newState = stateFnOrNewState(currState);\n } else {\n newState = stateFnOrNewState;\n }\n if (Object.is(currState, newState)) {\n return undefined;\n }\n let state: S;\n if (this.isArray) {\n state = Object.assign([] as S, newState);\n } else {\n state = Object.assign({}, currState, newState);\n }\n if (this.comparator && this.comparator(currState, state)) {\n return undefined;\n }\n this.devToolSend(state, actionName);\n this.statePersist(state);\n return state;\n }\n\n protected selectFn<K>(tmpState: Readonly<S>) {\n return Object.assign(this.isArray ? [] : {}, tmpState) as K;\n }\n\n /**\n * Send to dev tool a new state\n * @param newState new state\n * @param actionName The action name\n * @returns True if dev tools are enabled\n */\n protected devToolSend(newState: S | undefined, actionName?: string): boolean {\n if (!this.devTool) {\n return false;\n }\n if (!actionName) {\n // retrieve the parent (of parent) method into the stack trace\n try {\n actionName = new Error().stack\n ?.split('\\n')[this.stackPoint]\n ?.trim()\n ?.split(' ')[1]\n ?.split('.')[1] || 'unknown';\n /* eslint-disable-next-line @typescript-eslint/no-unused-vars */\n } catch (_) {\n /* istanbul ignore next */\n actionName = 'unknown';\n }\n }\n if (!this.devTool.send(this.storeName, actionName, newState)) {\n /* istanbul ignore next */\n console.log(this.storeName + '.' + actionName, newState);\n }\n return true;\n }\n\n /**\n * Recursively Object.freeze simple Javascript structures consisting of plain objects, arrays, and primitives.\n * Make the data immutable.\n * @returns immutable object\n */\n protected deepFreeze(object: S): Readonly<S> {\n // No freezing in production (for better performance).\n if (!this.devMode || !object) {\n return object as Readonly<S>;\n }\n\n // When already frozen, we assume its children are frozen (for better performance).\n // This should be true if you always use `deepFreeze` to freeze objects.\n //\n // Note that Object.isFrozen will also return `true` for primitives (numbers,\n // strings, booleans, undefined, null), so there is no need to check for\n // those explicitly.\n if (Object.isFrozen(object)) {\n return object as Readonly<S>;\n }\n\n // At this point we know that we're dealing with either an array or plain object, so\n // just freeze it and recurse on its values.\n Object.freeze(object);\n /* eslint-disable @typescript-eslint/no-explicit-any */\n Object.keys(object).forEach(key => this.deepFreeze((object as any)[key]));\n\n return object as Readonly<S>;\n }\n\n /**\n * Persist state to storage\n */\n protected statePersist(state: S) {\n if (this.storage) {\n this.storage.setItem(this.storeName, state);\n }\n }\n}\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 type { NgSimpleStateComparator, NgSimpleStateSelectState, NgSimpleStateSetState, StateFnOrNewState } 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> = new BehaviorSubject<S>(this.selectFn(this.firstState));\r\n private readonly stateObs: Observable<S> = this.state$.asObservable();\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 /**\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 as NgSimpleStateComparator),\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(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","import { Injectable, Directive, Signal, signal, computed, WritableSignal } from '@angular/core';\r\nimport { NgSimpleStateBaseCommonStore } from '../ng-simple-state-common';\r\nimport type { NgSimpleStateComparator, NgSimpleStateSelectState, NgSimpleStateSetState, StateFnOrNewState } 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> = signal<S>(this.selectFn(this.firstState));\r\n private readonly stateSigRo: Signal<S> = this.stateSig.asReadonly();\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 /**\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 as NgSimpleStateComparator });\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(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): EnvironmentProviders[] {\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';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/index.d.ts
CHANGED
|
@@ -21,6 +21,14 @@ interface NgSimpleStateConfig<K = any> {
|
|
|
21
21
|
* A function used to compare the previous and current state for equality.
|
|
22
22
|
*/
|
|
23
23
|
comparator?: NgSimpleStateComparator<K>;
|
|
24
|
+
/**
|
|
25
|
+
* A function used to serialize the state to a string.
|
|
26
|
+
*/
|
|
27
|
+
serializeState?: (state: K) => string;
|
|
28
|
+
/**
|
|
29
|
+
* A function used to deserialize the state from a string.
|
|
30
|
+
*/
|
|
31
|
+
deserializeState?: (state: string) => K;
|
|
24
32
|
}
|
|
25
33
|
/**
|
|
26
34
|
* NgSimpleState config option for store
|
|
@@ -82,22 +90,30 @@ declare class NgSimpleStateDevTool {
|
|
|
82
90
|
static ɵprov: i0.ɵɵInjectableDeclaration<NgSimpleStateDevTool>;
|
|
83
91
|
}
|
|
84
92
|
|
|
85
|
-
declare abstract class NgSimpleStateBrowserStorage {
|
|
93
|
+
declare abstract class NgSimpleStateBrowserStorage<K = any> {
|
|
86
94
|
private storage;
|
|
87
|
-
|
|
95
|
+
/**
|
|
96
|
+
* A function used to serialize the state to a string.
|
|
97
|
+
*/
|
|
98
|
+
private serializeState;
|
|
99
|
+
/**
|
|
100
|
+
* A function used to deserialize the state from a string.
|
|
101
|
+
*/
|
|
102
|
+
private deserializeState;
|
|
103
|
+
constructor(storage: Storage, config?: NgSimpleStateStoreConfig<K>);
|
|
88
104
|
/**
|
|
89
105
|
* Set item into storage
|
|
90
106
|
* @param key key name
|
|
91
107
|
* @param state state value
|
|
92
108
|
* @returns True if item is stored into storage
|
|
93
109
|
*/
|
|
94
|
-
setItem
|
|
110
|
+
setItem(key: string, state: K): boolean;
|
|
95
111
|
/**
|
|
96
112
|
* Return item from storage
|
|
97
113
|
* @param key key name
|
|
98
114
|
* @returns the item
|
|
99
115
|
*/
|
|
100
|
-
getItem
|
|
116
|
+
getItem(key: string): K | null;
|
|
101
117
|
/**
|
|
102
118
|
* Remove item from storage
|
|
103
119
|
* @param key key name
|
|
@@ -114,7 +130,7 @@ declare abstract class NgSimpleStateBrowserStorage {
|
|
|
114
130
|
declare abstract class NgSimpleStateBaseCommonStore<S extends object | Array<unknown>> implements OnDestroy {
|
|
115
131
|
protected abstract stackPoint: number;
|
|
116
132
|
protected devTool: NgSimpleStateDevTool;
|
|
117
|
-
protected storage: NgSimpleStateBrowserStorage
|
|
133
|
+
protected storage: NgSimpleStateBrowserStorage<S>;
|
|
118
134
|
protected storeName: string;
|
|
119
135
|
protected firstState: S;
|
|
120
136
|
protected initState: S;
|
|
@@ -308,16 +324,12 @@ declare abstract class NgSimpleStateBaseSignalStore<S extends object | Array<any
|
|
|
308
324
|
static ɵprov: i0.ɵɵInjectableDeclaration<NgSimpleStateBaseSignalStore<any>>;
|
|
309
325
|
}
|
|
310
326
|
|
|
311
|
-
declare class NgSimpleStateLocalStorage extends NgSimpleStateBrowserStorage {
|
|
312
|
-
constructor();
|
|
313
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<NgSimpleStateLocalStorage, never>;
|
|
314
|
-
static ɵprov: i0.ɵɵInjectableDeclaration<NgSimpleStateLocalStorage>;
|
|
327
|
+
declare class NgSimpleStateLocalStorage<K = any> extends NgSimpleStateBrowserStorage<K> {
|
|
328
|
+
constructor(config?: NgSimpleStateStoreConfig<K>);
|
|
315
329
|
}
|
|
316
330
|
|
|
317
|
-
declare class NgSimpleStateSessionStorage extends NgSimpleStateBrowserStorage {
|
|
318
|
-
constructor();
|
|
319
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<NgSimpleStateSessionStorage, never>;
|
|
320
|
-
static ɵprov: i0.ɵɵInjectableDeclaration<NgSimpleStateSessionStorage>;
|
|
331
|
+
declare class NgSimpleStateSessionStorage<K = any> extends NgSimpleStateBrowserStorage<K> {
|
|
332
|
+
constructor(config?: NgSimpleStateStoreConfig<K>);
|
|
321
333
|
}
|
|
322
334
|
|
|
323
335
|
declare function provideNgSimpleState(ngSimpleStateConfig?: NgSimpleStateConfig): EnvironmentProviders[];
|