Files
skills/plugins/document-navigator/docs/networking/events/event-sourcing/README.md
admin 9bf56a806b Move docs/ package mirror into document-navigator plugin
Relocate the ~6k-file docs tree from the repo root into
plugins/document-navigator/docs/ so the plugin is self-contained and
portable. docs/superpowers/ (specs and plans) stays at the repo root.

Moved via cp+rm rather than git mv because directory rename() fails with
EPERM on this WSL /mnt DrvFs mount; git rename-detection pairs the
identical-content files at commit time.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-30 01:10:00 +01:00

9.3 KiB

@suaveplan/event-sourcing - Event sourcing patterns: aggregate root, typed event store, snapshot support, projections, upcasting, and OTel instrumentation

Summary

Event sourcing patterns for Suaveplan: typed aggregate root, in-memory event store with optimistic concurrency, snapshot support, projections, upcasting, and OTel instrumentation.

Documentation tree

- [aggregate](./src/core/aggregate/aggregate.md) — _(no submodules)_- [aggregate-repository](./src/core/aggregate-repository/aggregate-repository.md) — _(no submodules)_- [aggregate-repository](./src/core/aggregate-repository/aggregate-repository.md) — _(no submodules)_- [event-store](./src/core/event-store/memory-event-store.md) — _(no submodules)_- [memory-event-store](./src/core/event-store/memory-event-store.md) — _(no submodules)_- [errors](./src/errors/event-sourcing-error.md) — _(no submodules)_- [event-sourcing-error](./src/errors/event-sourcing-error.md) — _(no submodules)_- [builder](./src/projection/builder/builder.md) — _(no submodules)_- [builder](./src/projection/builder/builder.md) — _(no submodules)_- [schemas](./src/schemas/event-sourcing.schemas.md) — _(no submodules)_- [event-sourcing.schemas](./src/schemas/event-sourcing.schemas.md) — _(no submodules)_- [upcaster](./src/upcasting/upcaster/upcaster.md) — _(no submodules)_- [upcaster](./src/upcasting/upcaster/upcaster.md) — _(no submodules)_- [aggregate](./src/core/aggregate/aggregate.md) — _(no submodules)_- [aggregate-repository](./src/core/aggregate-repository/aggregate-repository.md) — _(no submodules)_- [aggregate-repository](./src/core/aggregate-repository/aggregate-repository.md) — _(no submodules)_- [event-store](./src/core/event-store/memory-event-store.md) — _(no submodules)_- [memory-event-store](./src/core/event-store/memory-event-store.md) — _(no submodules)_- [errors](./src/errors/event-sourcing-error.md) — _(no submodules)_- [event-sourcing-error](./src/errors/event-sourcing-error.md) — _(no submodules)_- [builder](./src/projection/builder/builder.md) — _(no submodules)_- [builder](./src/projection/builder/builder.md) — _(no submodules)_- [schemas](./src/schemas/event-sourcing.schemas.md) — _(no submodules)_- [event-sourcing.schemas](./src/schemas/event-sourcing.schemas.md) — _(no submodules)_- [upcaster](./src/upcasting/upcaster/upcaster.md) — _(no submodules)_- [upcaster](./src/upcasting/upcaster/upcaster.md) — _(no submodules)_- [aggregate](./src/core/aggregate/aggregate.md) — _(no submodules)_- [aggregate-repository](./src/core/aggregate-repository/aggregate-repository.md) — _(no submodules)_- [aggregate-repository](./src/core/aggregate-repository/aggregate-repository.md) — _(no submodules)_- [event-store](./src/core/event-store/memory-event-store.md) — _(no submodules)_- [memory-event-store](./src/core/event-store/memory-event-store.md) — _(no submodules)_- [errors](./src/errors/event-sourcing-error.md) — _(no submodules)_- [event-sourcing-error](./src/errors/event-sourcing-error.md) — _(no submodules)_- [builder](./src/projection/builder/builder.md) — _(no submodules)_- [builder](./src/projection/builder/builder.md) — _(no submodules)_- [schemas](./src/schemas/event-sourcing.schemas.md) — _(no submodules)_- [event-sourcing.schemas](./src/schemas/event-sourcing.schemas.md) — _(no submodules)_- [upcaster](./src/upcasting/upcaster/upcaster.md) — _(no submodules)_- [upcaster](./src/upcasting/upcaster/upcaster.md) — _(no submodules)_- [aggregate](./src/core/aggregate/aggregate.md) — _(no submodules)_- [aggregate-repository](./src/core/aggregate-repository/aggregate-repository.md) — _(no submodules)_ - [aggregate-repository](./src/core/aggregate-repository/aggregate-repository.md) — _(no submodules)_- [event-store](./src/core/event-store/memory-event-store.md) — _(no submodules)_ - [memory-event-store](./src/core/event-store/memory-event-store.md) — _(no submodules)_- [errors](./src/errors/event-sourcing-error.md) — _(no submodules)_ - [event-sourcing-error](./src/errors/event-sourcing-error.md) — _(no submodules)_- [builder](./src/projection/builder/builder.md) — _(no submodules)_ - [builder](./src/projection/builder/builder.md) — _(no submodules)_- [schemas](./src/schemas/event-sourcing.schemas.md) — _(no submodules)_ - [event-sourcing.schemas](./src/schemas/event-sourcing.schemas.md) — _(no submodules)_- [upcaster](./src/upcasting/upcaster/upcaster.md) — _(no submodules)_ - [upcaster](./src/upcasting/upcaster/upcaster.md) — _(no submodules)_

Modules

Quick Start

import {
  Aggregate,
  createMemoryEventStore,
  createAggregateRepository,
  createProjection,
} from "@suaveplan/event-sourcing";
import type { DomainEvent } from "@suaveplan/event-sourcing";

class OrderAggregate extends Aggregate<{ total: number }> {
  constructor(id: string) { super(id, { total: 0 }); }
  place(total: number) { this.raise("OrderPlaced", { total }); }
  protected applyEvent(e: DomainEvent) {
    if (e.type === "OrderPlaced") {
      this.state = { total: (e.payload as { total: number }).total };
    }
  }
  get total() { return this.state.total; }
}

const store = createMemoryEventStore();
const repo = createAggregateRepository({ store, factory: (id) => new OrderAggregate(id) });

const order = new OrderAggregate("order-1");
order.place(250);
await repo.save(order);

const loaded = await repo.load("order-1");
console.log(loaded.total); // 250