@watchable/store
TypeScript icon, indicating that this package has built-in type declarations

1.0.2 • Public • Published

Minimal watchable state for your app

Install

npm install @watchable/store

# for optional features
npm install @watchable/store-react # React binding
npm install @watchable/store-follow # Business-logic binding
npm install @watchable/store-edit # Immer drafts

Summary

A @watchable/store Store maintains a immutably-typed reference to an (array or object) state with intuitive utilities for wiring up ui components and business logic.

See the Medium article

Import OR Require

import { createStore } from "@watchable/store"; // esm
const { createStore } = require("@watchable/store"); //commonjs

Create a Store (Javascript)

const store = createStore({ counter: 0 });

See below for runtime Immutable state in Typescript!

Track State

In React...

import { useSelected } from "@watchable/store-react";
const counter = useSelected(store, (state) => state.counter);

// get and set keyed property, like React useState
const [counter, setCounter] = useStateProperty(store, "counter");

In pure business logic...

// watching the store
store.watch((state) => console.log(`Counter is ${state.counter}`));

// follow a selector (called back any time the selected value changes)
import { followSelector } from "@watchable/store-follow";
followSelector(
  store,
  (state) => state.counter,
  (counter) => {
    console.log(`Counter is ${counter}`);
  }
);

Read and Write State

Using a draft...

// create the next immutable state by editing a draft
import { edit } from "@watchable/store-edit";
edit(store, (draft) => (draft.counter += 1));

Using pure immutable patterns...

// read state
const state = store.read();

// write state using immutable patterns
store.write({
  ...state,
  counter: state.counter + 1,
});

Create an Immutable Store (Typescript)

import { createStore, type Immutable } from "@watchable/store";

// `Immutable` is recommended to block inadvertent edits of state
type CounterState = Immutable<{
  counter: number;
}>;

const INITIAL_STATE: CounterState = {
  counter: 0,
} as const;

const store = createStore(INITIAL_STATE);

Description

472 gzipped bytes of powerful state-management!

When a new state is passed to store.write(), user interfaces and business logic are notified of changes to state matching their Selectors.

@watchable/store is incredibly simple, lightweight and framework-independent, and therefore suited to manage state within almost any server-side or client-side Typescript or Javascript project.

Read the API Reference, examine the example code below, or browse the source on Github.

Demonstration Apps

The Example Counter Apps offer minimal demonstrations of @watchable/store

Package Sidebar

Install

npm i @watchable/store

Weekly Downloads

37

Version

1.0.2

License

MIT

Unpacked Size

38.2 kB

Total Files

32

Last publish

Collaborators

  • cefn