🌼 @fleur/fleur 🌼

An Fully-typed Flux framework inspired by Fluxible.
Runs on Node / Web.
(No dependence to React. see this if you want to use with React.)
Feature
- Fully typed. Friendly to type inference.
- Comfortable to write code
- Default async operations (side effector) support
- immer.js builtin Store
- Support Redux DevTools
Example
import { actions, action } from '@fleur/fleur'
export const CounterActions = actions('Counter', {
increase: action<{ amount: number }>(),
decrease: action<{ amount: number }>(),
}
import { reducerStore } from '@fleur/fleur'
import { CounterActions } from './actions.ts'
interface State {
count: number
}
export const CounterStore = reducerStore<State>('CounterStore', () => ({
count: 0
}))
.listen(CounterActions.increase, (draft, payload) => {
draft.count += payload.amount
})
.listen(CounterActions.decrease, (draft, payload) => {
draft.count -= payload.amount
})
}
import { operations } from '@fleur/fleur'
import { CounterActions } from './actions.ts'
export const CounterOps = operations({
increase(ctx, amount: number) {
ctx.dispatch(CounterActions.increase, { amount })
},
decrease(ctx, amount: number) {
ctx.dispatch(CounterActions.decrease, { amount })
},
})
import { selector } from '@fleur/fleur'
import { CounterStore } from './store.ts'
export const selectCount = selector(getState => getState(CounterStore).count)
import Fleur, { withReduxDevTools } from '@fleur/fleur'
import { CounterStore } from './store.ts'
import { CounterOps } from './operations.ts'
import { selectCount } from './selectors.ts'
const app = new Fleur({
stores: [CounterStore],
})
;(async () => {
const ctx = app.createContext()
withReduxDevTools(ctx)
await ctx.executeOperation(CounterOps.increase, 10)
console.log(selectCount(ctx.getStore))
await ctx.executeOperation(CounterOps.decrease, 20)
console.log(selectCount(ctx.getStore))
})()
How to use with React?
See @fleur/react.