3.9 KiB
3.9 KiB
Tasks: enterprise-event-sourcing
- Change ID: enterprise-event-sourcing
- Package:
@suaveplan/event-sourcing - Date: 2026-04-24
Prerequisites (must be published to Verdaccio first)
@suaveplan/events@suaveplan/diff@suaveplan/error@suaveplan/types
Tasks
1. Scaffold package
- Create
universal/events/event-sourcing/directory tree per file layout inproposal.md - Write
package.json(name@suaveplan/event-sourcing, version0.1.0,sideEffects: false, correct workspace deps and catalog externals) - Write
tsconfig.jsonextending@suaveplan/typescript-config/library.json - Write
vitest.config.tsusingcreateTestConfig()from@suaveplan/testing/config
2. Error codes (src/error-codes.ts)
- Define
EventSourcingErrorCodeunion type - Call
defineCodesto register allES.*codes - Export
registerEventSourcingErrorCodes()andEventSourcingError
3. Types (src/types/common.ts)
- Define and export
DomainEvent<T>,EventMetadata,Snapshot,EventStore,AggregateRepositoryOptions - Write
common.md
4. Aggregate base class (src/core/aggregate/)
- Implement abstract
Aggregate<TState>withraise,apply(abstract),replayFrom,clearPendingEvents,pendingEvents,version,id - Write
.md,.types.ts,.test.ts,index.ts
5. EventStore interface (src/core/event-store/)
- Define and export
EventStoreinterface withappend,load,loadSnapshot,saveSnapshot,getStream - Write
.md,.types.ts,index.ts
6. In-memory event store (src/core/memory-event-store/)
- Implement
createMemoryEventStorewith:- Per-aggregate stream storage (Map of arrays)
- Optimistic concurrency:
appendchecksexpectedVersionand throwsES_CONCURRENCY_CONFLICTon mismatch - Snapshot storage alongside event streams
- Publish committed events to
@suaveplan/eventsbus after successfulappend - Optional delta-payload compression via
@suaveplan/diffwhendeltaPayloads: true - OTel spans, counters, histograms per
proposal.md§5
- Write
.md,.types.ts,.test.ts,index.ts
7. Aggregate repository (src/core/aggregate-repository/)
- Implement
createAggregateRepository<T>with snapshot-based reconstruction - Optimistic concurrency retry loop (configurable
maxRetries) - Auto-snapshot at configurable
snapshotThreshold - Write
.md,.types.ts,.test.ts,index.ts
8. Projection builder (src/projection/projection-builder/)
- Implement
createProjection<TState>withproject(events)andprojectStream(stream)methods - Write
.md,.types.ts,.test.ts,index.ts
9. Upcaster registry (src/upcasting/upcaster/)
- Implement
registerUpcasterandupcastEventswith version-ordered upcaster chain - Write
.md,.types.ts,.test.ts,index.ts
10. Tests
- Unit tests co-located (100% coverage target)
tests/integration.test.ts— full aggregate lifecycle: create, load, save with snapshot, reload from snapshot + trailing eventstests/property.test.ts— fast-check properties perproposal.md§6
11. Benchmarks (src/__benchmarks__/event-sourcing.bench.ts)
- Implement benchmark cases per
proposal.md§7
12. Docs
- Every
.tsimplementation file has a sibling.md - Root
README.md
13. Pre-publish gate
bunx turbo lint typecheck test --filter=@suaveplan/event-sourcinggreenbunx turbo test:coverage --filter=@suaveplan/event-sourcing≥ 100% on touched modules
14. Publish
bun scripts/publish.ts --package @suaveplan/event-sourcing
15. Archive
- Fold spec delta into
openspec/specs/events/spec.md mv openspec/changes/enterprise-event-sourcing openspec/archive/2026-04-24-enterprise-event-sourcing