@glowhop/observables
v1.3.3
Published
Lightweight observable primitives for stateful logic in TypeScript.
Downloads
113
Maintainers
Readme
@glowhop/observables
Lightweight primitives for modelling observable values, lists, and maps in TypeScript. Keep your business logic framework-agnostic while still composing reactive flows easily.
Features
- Tiny, framework-agnostic
Observable,ObservableList, andObservableMapclasses. - Ergonomic helpers for entry-level subscriptions, iteration, and async mapping.
- Fully typed ESM and CommonJS builds with sourcemaps.
Installation
npm install @glowhop/observables
# or
yarn add @glowhop/observables
# or
pnpm add @glowhop/observablesThe library is independent of any UI framework; use it directly or build thin adapters for your favourite renderer.
Quick start
import { Observable } from "@glowhop/observables";
const counter = new Observable(0);
const unsubscribe = counter.subscribe((value) => {
console.log("value changed:", value);
});
counter.set((previous) => previous + 1); // logs: value changed: 1
console.log(counter.get()); // 1
unsubscribe();Working with collections
import { ObservableList, ObservableMap } from "@glowhop/observables";
const todos = new ObservableList(["add docs"]);
todos.subscribeEntry(0, (value) => {
console.log("first todo:", value);
});
todos.addEntry("ship release"); // first todo: add docs
todos.setEntry(0, "write README"); // first todo: write README
const settings = new ObservableMap([["theme", "dark"]]);
settings.subscribeEntry("theme", console.log);
settings.setEntry("theme", "light"); // light
settings.removeEntry("theme"); // undefinedRefer to the TypeScript definitions in dist/ or the source files in src/ for the complete API surface. Since the API stays framework-neutral you can pair it with React, Vue, Solid, Svelte, or any custom renderer by wiring subscriptions into your own hooks/effects.
Development
bun install
bun test
bun run buildThe build produces ESM and CommonJS bundles with .d.ts declarations that are ready for publication to npm.
To publish a new version use semantic-release (conventional commit messages drive the version bump):
bun run release