Compare commits

...

6 Commits

Author SHA1 Message Date
Juergen Kunz
aa6766ef36 2.0.21 2025-07-01 06:50:35 +00:00
Juergen Kunz
b0442e1227 update readme 2025-07-01 06:50:15 +00:00
Juergen Kunz
0f1eb6eb27 2.0.20 2025-06-19 23:57:56 +00:00
Juergen Kunz
dd18ef94bd fix(smartstate): Update build scripts and dependency versions; replace isohash with smarthashWeb for state hash generation 2025-06-19 23:57:56 +00:00
a0189921a5 2.0.19 2024-10-02 17:49:56 +02:00
b409f1aa55 fix(dependencies): Update dependencies to latest versions 2024-10-02 17:49:56 +02:00
7 changed files with 8716 additions and 4090 deletions

View File

@@ -1,5 +1,28 @@
# Changelog
## 2025-06-19 - 2.0.20 - fix(smartstate)
Update build scripts and dependency versions; replace isohash with smarthashWeb for state hash generation
- Adjusted package.json scripts to include verbose testing and modified build command
- Bumped development dependencies (tsbuild, tsbundle, tsrun, tstest, tapbundle) to newer versions
- Updated production dependencies (lik, smarthash, smartpromise, smartrx) with minor version bumps
- Replaced import of isohash with smarthashWeb in state hash generation, ensuring consistency across modules
## 2024-10-02 - 2.0.19 - fix(dependencies)
Update dependencies to latest versions
- Updated @git.zone/tsbuild to version ^2.1.84
- Updated @git.zone/tsbundle to version ^2.0.15
- Updated @git.zone/tsrun to version ^1.2.49
- Updated @git.zone/tstest to version ^1.0.90
- Updated @push.rocks/tapbundle to version ^5.3.0
- Updated @types/node to version ^22.7.4
- Updated @push.rocks/lik to version ^6.0.15
- Updated @push.rocks/smartjson to version ^5.0.20
- Updated @push.rocks/smartpromise to version ^4.0.4
- Updated @push.rocks/smartrx to version ^3.0.7
- Updated @push.rocks/webstore to version ^2.0.20
## 2024-10-02 - 2.0.18 - fix(core)
Fix type errors and typos in Smartstate class

View File

@@ -1,6 +1,6 @@
{
"name": "@push.rocks/smartstate",
"version": "2.0.18",
"version": "2.0.21",
"private": false,
"description": "A package for handling and managing state in applications.",
"main": "dist_ts/index.js",
@@ -9,25 +9,25 @@
"author": "Lossless GmbH",
"license": "MIT",
"scripts": {
"test": "(tstest test/)",
"build": "(tsbuild --web --allowimplicitany && tsbundle npm)",
"test": "(tstest test/ --verbose)",
"build": "(tsbuild tsfolders --allowimplicitany && tsbundle npm)",
"buildDocs": "tsdoc"
},
"devDependencies": {
"@git.zone/tsbuild": "^2.1.70",
"@git.zone/tsbundle": "^2.0.8",
"@git.zone/tsrun": "^1.2.46",
"@git.zone/tstest": "^1.0.81",
"@push.rocks/tapbundle": "^5.0.15",
"@types/node": "^20.8.0"
"@git.zone/tsbuild": "^2.6.4",
"@git.zone/tsbundle": "^2.4.0",
"@git.zone/tsrun": "^1.3.3",
"@git.zone/tstest": "^2.3.1",
"@push.rocks/tapbundle": "^6.0.3",
"@types/node": "^22.7.4"
},
"dependencies": {
"@push.rocks/isohash": "^2.0.1",
"@push.rocks/lik": "^6.0.5",
"@push.rocks/smartjson": "^5.0.10",
"@push.rocks/smartpromise": "^4.0.3",
"@push.rocks/smartrx": "^3.0.6",
"@push.rocks/webstore": "^2.0.13"
"@push.rocks/lik": "^6.2.2",
"@push.rocks/smarthash": "^3.2.0",
"@push.rocks/smartjson": "^5.0.20",
"@push.rocks/smartpromise": "^4.2.3",
"@push.rocks/smartrx": "^3.0.10",
"@push.rocks/webstore": "^2.0.20"
},
"files": [
"ts/**/*",
@@ -60,5 +60,6 @@
"repository": {
"type": "git",
"url": "https://code.foss.global/push.rocks/smartstate.git"
}
},
"packageManager": "pnpm@10.11.0+sha512.6540583f41cc5f628eb3d9773ecee802f4f9ef9923cc45b69890fb47991d4b092964694ec3a4f738a420c918a333062c8b925d312f42e4f0c263eb603551f977"
}

12630
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

106
readme.md
View File

@@ -3,10 +3,10 @@ a package that handles state in a good way
## Install
To install `@push.rocks/smartstate`, you can use npm (Node Package Manager). Run the following command in your terminal:
To install `@push.rocks/smartstate`, you can use pnpm (Performant Node Package Manager). Run the following command in your terminal:
```bash
npm install @push.rocks/smartstate --save
pnpm install @push.rocks/smartstate --save
```
This will add `@push.rocks/smartstate` to your project's dependencies.
@@ -31,6 +31,15 @@ import { Smartstate, StatePart, StateAction } from '@push.rocks/smartstate';
const myAppSmartState = new Smartstate<YourStatePartNamesEnum>();
```
### Understanding Init Modes
When creating state parts, you can specify different initialization modes:
- **`'soft'`** - Allows existing state parts to remain (default behavior)
- **`'mandatory'`** - Fails if there's an existing state part with the same name
- **`'force'`** - Overwrites any existing state part
- **`'persistent'`** - Enables WebStore persistence using IndexedDB
### Defining State Parts
State parts represent separable sections of your state, making it easier to manage and modularize. For example, you may have a state part for user data and another for application settings.
@@ -54,8 +63,14 @@ interface IUserState {
const userStatePart = await myAppSmartState.getStatePart<IUserState>(
AppStateParts.UserState,
{ isLoggedIn: false } // Initial state
{ isLoggedIn: false }, // Initial state
'soft' // Init mode (optional, defaults to 'soft')
);
// For persistent state parts, you must call init()
if (mode === 'persistent') {
await userStatePart.init();
}
```
### Subscribing to State Changes
@@ -92,28 +107,93 @@ const loginUserAction = userStatePart.createAction<ILoginPayload>(async (statePa
});
// Dispatch the action to update the state
loginUserAction.trigger({ username: 'johnDoe' });
await loginUserAction.trigger({ username: 'johnDoe' });
```
### Persistent State
### Additional State Methods
`Smartstate` supports the concept of persistent states, where you can maintain state across sessions. To utilize this, specify a persistent mode when getting a state part:
`StatePart` provides several useful methods for state management:
```typescript
const settingsStatePart = await myAppSmartState.getStatePart<AppStateParts, ISettingsState>(
// Wait for a specific state condition
await userStatePart.waitUntilPresent();
// Setup initial state with async operations
await userStatePart.stateSetup(async (state) => {
// Perform async initialization
const userData = await fetchUserData();
return { ...state, ...userData };
});
// Batch multiple state changes for cumulative notification
userStatePart.notifyChangeCumulative(() => {
// Multiple state changes here will result in a single notification
});
```
### Persistent State with WebStore
`Smartstate` supports persistent states using WebStore (IndexedDB-based storage), allowing you to maintain state across sessions:
```typescript
const settingsStatePart = await myAppSmartState.getStatePart<ISettingsState>(
AppStateParts.SettingsState,
{ theme: 'light' }, // Initial state
'persistent' // Mode
);
// Initialize the persistent state (required for persistent mode)
await settingsStatePart.init();
```
This mode ensures that the state is saved and can be reloaded even after the application restarts, providing a seamless user experience.
Persistent state automatically:
- Saves state changes to IndexedDB
- Restores state on application restart
- Manages storage with configurable database and store names
### Performance Optimization
`Smartstate` includes built-in performance optimizations:
- **State Hash Detection**: Uses SHA256 hashing to detect actual state changes, preventing unnecessary notifications when state values haven't truly changed
- **Cumulative Notifications**: Batch multiple state changes into a single notification using `notifyChangeCumulative()`
- **Selective Subscriptions**: Use selectors to subscribe only to specific state properties
### RxJS Integration
`Smartstate` leverages RxJS for reactive state management:
```typescript
// State is exposed as an RxJS Subject
const stateObservable = userStatePart.select();
// Automatically starts with current state value
stateObservable.subscribe((state) => {
console.log('Current state:', state);
});
// Use selectors for specific properties
userStatePart.select(state => state.username)
.pipe(
distinctUntilChanged(),
filter(username => username !== undefined)
)
.subscribe(username => {
console.log('Username changed:', username);
});
```
### Comprehensive Usage
Putting it all together, `@push.rocks/smartstate` offers a flexible and powerful pattern for managing application state. By modularizing state parts, subscribing to state changes, and controlling state modifications through actions, developers can maintain a clean and scalable architecture. Combining these strategies with persistent states unlocks the full potential for creating dynamic and user-friendly applications.
Remember to leverage TypeScript for its excellent support for types and interfaces, enhancing your development experience with type checking and IntelliSense, ensuring a more reliable and maintainable codebase.
Key features:
- **Type-safe state management** with full TypeScript support
- **Reactive state updates** using RxJS observables
- **Persistent state** with IndexedDB storage
- **Performance optimized** with state hash detection
- **Modular architecture** with separate state parts
- **Action-based updates** for predictable state modifications
For more complex scenarios, consider combining multiple state parts, creating hierarchical state structures, and integrating with other state management solutions as needed. With `@push.rocks/smartstate`, the possibilities are vast, empowering you to tailor the state management approach to fit the unique requirements of your project.
@@ -125,13 +205,13 @@ This repository contains open-source code that is licensed under the MIT License
### Trademarks
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
This project is owned and maintained by Lossless GmbH. The names and logos associated with Lossless GmbH and any related products or services are trademarks of Lossless GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Lossless GmbH's Trademark Guidelines, and any usage must be approved in writing by Lossless GmbH.
### Company Information
Task Venture Capital GmbH
Lossless GmbH
Registered at District court Bremen HRB 35230 HB, Germany
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
For any legal inquiries or if you require further information, please contact us via email at hello@lossless.com.
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Lossless GmbH of any derivative works.

View File

@@ -3,6 +3,6 @@
*/
export const commitinfo = {
name: '@push.rocks/smartstate',
version: '2.0.18',
version: '2.0.20',
description: 'A package for handling and managing state in applications.'
}

View File

@@ -61,7 +61,7 @@ export class StatePart<TStatePartName, TStatePayload> {
*/
public notifyChange() {
const createStateHash = (stateArg: any) => {
return plugins.isohash.sha256FromString(plugins.smartjson.stringify(stateArg));
return plugins.smarthashWeb.sha256FromString(plugins.smartjson.stringify(stateArg));
};
if (
this.stateStore &&

View File

@@ -1,7 +1,7 @@
import * as isohash from '@push.rocks/isohash';
import * as smarthashWeb from '@push.rocks/smarthash/web';
import * as smartjson from '@push.rocks/smartjson';
import * as smartpromise from '@push.rocks/smartpromise';
import * as smartrx from '@push.rocks/smartrx';
import * as webstore from '@push.rocks/webstore';
export { isohash, smartjson, smartpromise, smartrx, webstore };
export { smarthashWeb, smartjson, smartpromise, smartrx, webstore };