appolo-state

simple state managemnt for nodejs

Usage no npm install needed!

<script type="module">
  import appoloState from 'https://cdn.skypack.dev/appolo-state';
</script>

README

Appolo State

Build Status Dependencies status NPM version npm Downloads Known Vulnerabilities

simple state manager for nodejs built with typescript

Installation

npm install appolo-state --save

Usage

Store(initialState: T = {},options = {maxStates: 1})

initialState - any object options: - maxStates - max number of history states to hold default 1

import {Store} from "appolo-store"

let store = new Store<{ counter: number }>({counter: 0}, {maxStates: 10});

setState(value: Partial<T>,options={arrayMerge:"extend"})

change the current to new state event stateChanged if fired on state changed

import {Store} from "appolo-store"

let store = new Store<{ counter: number }>({counter: 0});

store.setState({counter: 1});

state():T

return copy of the current state

import {Store} from "appolo-store"

    let store = new Store<{ counter: number }>({counter: 0});

    store.setState({counter: 1});

    let state = store.state()


stateAt(index: number): T

return state copy at given index

import {Store} from "appolo-store"

let store = new Store<{ counter: number }>({counter: 0},{maxStates:10});

store.setState({counter: 1});
store.setState({counter: 2});

store.stateAt(1).counter; // 1


get prevState():T

return the previous state

get nextState():T

return the next state

goToState(index: number)

index - the state index to change to

import {Store} from "appolo-store"

let store = new Store<{ counter: number }>({counter: 0},{maxStates:10});

store.setState({counter: 1});
store.setState({counter: 2});
store.goToState(1);

store.state().counter // 1

goToPrevState()

go to previous state

goToNextState()

go to next state

Events

store extends appolo-event-dispatcher every to time the state is changed the stateChanged if fired

import {Store} from "appolo-store"

let store = new Store<{ counter: number }>({counter: 0});


store.on("stateChanged",(state)=>{
    console.log(state.counter) // 1
})

store.setState({counter: 1});

Actions

you can use the action decorator to define custom action events the store will fire event with the action name when the action is finished

import {Store,action} from "appolo-store"

class MyStore extend Store<{ counter: number }>{
    super({counter: 0})

    @action()
    set myCounter(value){
        this.setState({counter:value})
    }

    @action()
    async updateMyCounter(value){
        await doSomeThingAsync()
        this.setState({counter:value})
    }
}

(async function (){

let store = new MyStore<>();


store.on("myCounter",(state)=>{
    console.log(state.counter) // 1
})

store.myCounter = 1;

store.updateMyCounter(2);

let state = await store.once("updateMyCounter")
console.log(state.counter) // 2


})()

Iterator

you can loop over all the states from the beginning iterator

import {Store} from "appolo-store"

let store = new Store<{ counter: number }>({counter: 0});

store.setState({counter: 1});
store.setState({counter: 2});

for (let state of  store.states()) {
    console.log(state.counter) // 0 ,1 ,2
}

reset

import {Store} from "appolo-store"

let store = new Store<{ counter: number }>({counter: 0});

store.setState({counter: 1});
store.setState({counter: 2});

store.reset()

store.state().counter // 0

Tests

 npm run test

License

MIT