Security News
Node.js EOL Versions CVE Dubbed the "Worst CVE of the Year" by Security Experts
Critics call the Node.js EOL CVE a misuse of the system, sparking debate over CVE standards and the growing noise in vulnerability databases.
💥 ⭐️ 💥 ✨
✨ ✨
███████╗████████╗ █████╗ ████████╗███████╗██████╗ ██╗ ██╗██╗ ✨
██╔════╝╚══██╔══╝██╔══██╗╚══██╔══╝██╔════╝██╔══██╗╚██╗ ██╔╝██║
███████╗ ██║ ███████║ ██║ █████╗ ██████╔╝ ╚████╔╝ ██║ ⭐️ ✨
╚════██║ ██║ ██╔══██║ ██║ ██╔══╝ ██╔══██╗ ╚██╔╝ ╚═╝
███████║ ██║ ██║ ██║ ██║ ███████╗██║ ██║ ██║ ██╗ ✨ 💥
╚══════╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚══════╝╚═╝ ╚═╝ ╚═╝ ╚═╝ ✨
✨ ✨ ⭐️
SURPRISE-FREE STATE MANAGEMENT! 💥
✨
set
function for updating a store and not much else (have you checked out the demo yet?) If you want to use reducers or libraries like Immer, these can easily sit on top of your Statery store.useStore
hook makes use of proxies, the store contents themselves are never wrapped in proxy objects. (If you're looking for a fully proxy-based solution, I recommend Valtio.)import * as React from "react"
import { makeStore, useStore } from "statery"
/* Make a store */
const store = makeStore({ counter: 0 })
/* Write some code that updates it */
const increment = () =>
store.set((state) => ({
counter: state.counter + 1
}))
const Counter = () => {
/* Fetch data from the store (and automatically re-render
when it changes!) */
const { counter } = useStore(store)
return (
<div>
<p>Counter: {counter}</p>
<button onClick={increment}>Increment</button>
</div>
)
}
npm install statery
or
yarn add statery
Statery stores wrap around plain old JavaScript objects that are free to contain any kind of data:
import { makeStore } from "statery"
const store = makeStore({
player: {
id: 1,
name: "John Doe",
email: "john@doe.com"
},
gold: 100,
wood: 0,
houses: 0
})
Update the store contents using its set
function:
const collectWood = () =>
store.set((state) => ({
wood: state.wood + 1
}))
const buildHouse = () =>
store.set((state) => ({
wood: state.wood - 10,
houses: state.houses + 1
}))
const Buttons = () => {
return (
<p>
<button onClick={collectWood}>Collect Wood</button>
<button onClick={buildHouse}>Build House</button>
</p>
)
}
Updates will be shallow-merged with the current state, meaning that top-level properties will be replaced, and properties you don't update will not be touched.
Within a React component, use the useStore
hook to read data from the store:
import { useStore } from "statery"
const Wood = () => {
const { wood } = useStore(store)
return <p>Wood: {wood}</p>
}
When any of the data your components access changes in the store, they will automatically re-render.
A Statery store provides access to its current state through its state
property:
const store = makeStore({ count: 0 })
console.log(store.state.count)
You can also imperatively subscribe to updates.
Just like mutations, functions that derive values from the store's state can be written as standalone functions:
const canBuyHouse = ({ wood, gold }) => wood >= 5 && gold >= 5
These will work from within plain imperative JavaScript code...
if (canBuyHouse(store.state)) {
console.log("Let's buy a house!")
}
...mutation code...
const buyHouse = () =>
store.set((state) =>
canBuyHouse(state)
? {
wood: state.wood - 5,
gold: state.gold - 5,
houses: state.houses + 1
}
: {}
)
...as well as React components, which will automatically be rerendered if any of the underlying data changes:
const BuyHouseButton = () => {
const proxy = useStore(store)
return (
<button onClick={buyHouse} disabled={!canBuyHouse(proxy)}>
Buy House (5g, 5w)
</button>
)
}
Use a store's subscribe
function to register a callback that will be executed every time the store is changed.
The callback will receive both an object containing of the changes, as well as the store's current state.
const store = makeStore({ count: 0 })
const listener = (changes, state) => {
console.log("Applying changes:", changes)
}
store.subscribe(console.log)
store.set((state) => ({ count: state.count + 1 }))
store.unsubscribe(console.log)
Your Statery store doesn't know or care about asynchronicity -- simply call set
whenever your data is ready:
const fetchPosts = async () => {
const posts = await loadPosts()
store.set({ posts })
}
Statery is written in TypeScript, and its stores are fully typed. useStore
knows about the structure of your store, and if you're about to update a store with a property that it doesn't know about, TypeScript will warn you.
If the state structure makeStore
infers from its initial state argument is not what you want, you can explicitly pass a store type to makeStore
:
const store = makeStore<{ name?: string }>({})
store.set({ name: "Statery" }) // ✅ All good
store.set({ foo: 123 }) // 😭 TypeScript warning
Statery was born after spending a lot of time with the excellent state management libraries provided by the Poimandres collective, Zustand and Valtio. Statery started out as an almost-clone of Zustand, but with the aim of providing an even simpler API. The useStore
hook API was inspired by Valtio's very nice useProxy
.
Statery is written and maintained by Hendrik Mans. Get in touch on Twitter!
FAQs
A happy little state management library for React and friends.
The npm package statery receives a total of 42 weekly downloads. As such, statery popularity was classified as not popular.
We found that statery demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Critics call the Node.js EOL CVE a misuse of the system, sparking debate over CVE standards and the growing noise in vulnerability databases.
Security News
cURL and Go security teams are publicly rejecting CVSS as flawed for assessing vulnerabilities and are calling for more accurate, context-aware approaches.
Security News
Bun 1.2 enhances its JavaScript runtime with 90% Node.js compatibility, built-in S3 and Postgres support, HTML Imports, and faster, cloud-first performance.