MobX utilities: store management with createStore / createRootStore, serialization, LocalForage-based state persistence, and JWT helpers.
yarn add @js-toolkit/mobx-utils
# or
npm install @js-toolkit/mobx-utils
Requires mobx as a peer dependency.
import { createStore , createRootStore , attachSelectors } from '@js-toolkit/mobx-utils/store/object' ;
import { serialize } from '@js-toolkit/mobx-utils/serialization/serialize' ;
Store Management (store/object)
Export
Description
createStore
Create a MobX store with init, update, reset, getSnapshot
createRootStore
Create a root store that manages child stores
attachSelectors
Attach computed selectors to a root store
updateState
Update store state with a patch
getSnapshot
Get a plain JS snapshot of store state
isStore, isRootStore
Type guards
Serialization (serialization/serialize)
Export
Description
serialize
Recursively serialize objects (handles dates, Option, custom serializers)
Export
Description
saveStoreState
Save a single store state to LocalForage
saveRootState
Save multiple stores to LocalForage
getStoreState
Retrieve store state from LocalForage (returns Option)
Export
Description
decodeToken
Decode JWT token (returns Option)
isExpired
Check if JWT token is expired
Export
Description
hasIn
Type-safe wrapper around MobX has
isArray
Type guard for arrays (including MobX observable arrays)
import { observable } from 'mobx' ;
import { createStore , createRootStore , attachSelectors } from '@js-toolkit/mobx-utils/store/object' ;
const root = createRootStore ( {
auth : createStore ( {
token : '' ,
username : '' ,
} ) ,
ui : createStore (
{
theme : 'light' as 'light' | 'dark' ,
items : [ ] as string [ ] ,
} ,
{
items : observable . shallow ,
}
) ,
} ) ;
const store = attachSelectors ( root , {
get isLoggedIn ( ) : boolean {
return root . auth . token . length > 0 ;
} ,
} ) ;
store . auth . update ( { token : 'abc123' } ) ;
console . log ( store . isLoggedIn ) ; // true
store . auth . reset ( ) ;
import { serialize } from '@js-toolkit/mobx-utils/serialization/serialize' ;
const snapshot = serialize ( store . auth ) ;
Persist and restore state
import { saveStoreState , getStoreState } from '@js-toolkit/mobx-utils/storage' ;
await saveStoreState < typeof root > ( 'auth' , root . auth ) ;
const saved = await getStoreState < typeof root > ( 'auth' ) ;
if ( saved . nonEmpty ( ) ) {
root . auth . update ( saved . get ( ) ) ;
}
import { decodeToken } from '@js-toolkit/mobx-utils/auth/decodeToken' ;
import { isExpired } from '@js-toolkit/mobx-utils/auth/isExpired' ;
const decoded = decodeToken ( token ) ;
if ( decoded . nonEmpty ( ) && ! isExpired ( decoded . get ( ) ) ) {
// token is valid
}
https://github.com/vlazh/mobx-utils