A tiny event-based store utility for lightweight state and message flow.
pnpm add @ak2021/store
import Store from "@ak2021/store";
const store = new Store({ id: "app-store" });
store.on("user:login", (payload) => {
console.log("login event", payload);
});
store.emit("user:login", { id: 1, name: "Alice" });
interface StoreOptions {
id?: string;
}
type EventListener<T = any> = (data: T) => void;
Creates a new store instance.
const store = new Store({ id: "my-store" });
Subscribe to an event.
store.on("count:change", (value: number) => {
console.log(value);
});
Subscribe to an event for a single trigger.
store.once("ready", () => {
console.log("ready only once");
});
Unsubscribe listener(s).
const onChange = (value: number) => console.log(value);
store.on("count:change", onChange);
store.off("count:change", onChange); // remove one listener
store.off("count:change"); // remove all listeners of this event type
Emit an event with optional payload.
store.emit("count:change", 10);
All event methods return the current store instance, so chaining is supported.
store
.on("start", () => {})
.once("finish", () => {})
.emit("start")
.emit("finish");
type User = { id: number; name: string };
const store = new Store();
store.on<User>("user:update", (user) => {
console.log(user.name);
});
store.emit<User>("user:update", { id: 1, name: "Bob" });
pnpm --filter @ak2021/store dev
pnpm --filter @ak2021/store build