Skip to content
ledger logoLedgerUtilities
Serialized reversible command history with cancellation ownership and atomic reactive snapshots.
Version
v2.2.1
Size
3.8 KB gzip
BrowserNode ≥22SSRDeno
composecreateLedger

Why Ledger?

Undo and redo require more than array manipulation when operations are asynchronous, cancellable, and visible in a UI. Ledger serializes only reversible commands, owns queue lifecycle, and publishes one atomic state snapshot.

ts
// Before
const undo = () => changes.pop()?.revert();

// After
import { createLedger } from '@vielzeug/ledger';

const ledger = createLedger();
await ledger.do({ apply: saveNext, revert: restorePrevious });
await ledger.undo();
FeatureRoll your ownLedger
Bundle size0 B3.8 KB
Reversible historyManual arrays
Serialized async workManual queue
Queue cancellationManual ownershipAbort-aware lifecycle
Reactive stateManual eventsReadable<LedgerState>
CompositionCustom transaction codecompose()

Use Ledger when you own reversible asynchronous state transitions and need undo, redo, or history UI.

Consider direct application code when work is irreversible, fire-and-forget, or does not need history.

Installation

sh
pnpm add @vielzeug/ledger
sh
npm install @vielzeug/ledger
sh
yarn add @vielzeug/ledger

Quick Start

Submit a reversible command, read state, then dispose its owner.

ts
import { createLedger } from '@vielzeug/ledger';

let value = 'before';
const ledger = createLedger();

await ledger.do({
  apply: () => { value = 'after'; },
  label: 'Rename value',
  revert: () => { value = 'before'; },
});

await ledger.undo();
console.log(ledger.state.value.undo.length); // 0
ledger.dispose();

Features

  • createLedger() — Create serialized reversible command history
  • state — Read atomic queue, undo, redo, and acceptance state
  • compose() — Combine reversible commands into one reversible command
  • whenIdle() — Await queued and active operation settlement
  • LedgerCancelledError — Distinguish cancellation from execution failure
  • maxHistory — Keep a non-negative safe-integer undo depth
  • [Symbol.dispose]() — Seal, abort, and clear a ledger owner

Documentation

See Also

  • Ripple — Consume Ledger state through effects or framework bindings.
  • Keymap — Route undo and redo shortcuts to a Ledger error boundary.
  • Forge — Record reversible form transitions.
  • Vault — Persist application snapshots outside transient undo history.