Repository navigation
Kernel + module registration API #28
Description
Parent
What to build
Define and implement the feature-agnostic kernel and the module registration contract. This is the architectural centrepiece of v1: a small, stateful core that owns the event collection, viewport, and date-range projection, extended by opt-in modules whose unused code tree-shakes away.
The kernel owns: event collection, viewport (current period + view mode), navigation, the date-range projection (events → occurrences mapped to the visible range), and plain create/edit/remove. Nothing domain-specific (no availability, recurrence, dependencies, drag, or undo) lives in the kernel itself.
Modules attach via two ordered pipelines with kernel-defined stages and per-module priority within a stage:
- Read pipeline: `recurrence-expand → clip-to-viewport → layout`
- Write pipeline: `recurrence-materialize → dependency-transform → availability-validate → commit → undo-snapshot/emit`
Stage order is fixed and kernel-defined. A module declares which stage(s) it participates in and a numeric priority — it does not run in registration order. Writes are committed as atomic batches so undo/redo and devtools observe one logical action.
The Calendar product is a convenience factory that wires the kernel with the recurrence, drag-resize, and availability modules pre-registered.
Acceptance criteria
- `createCalendar({ modules: [...], strategy: 'client' })` constructs a kernel instance
- A module is a plain object declaring `{ stage, priority, ... handlers }` — no class required
- Unused modules do not appear in the production bundle (verified via bundle analysis or import tracing)
- The kernel exposes `getRequiredRange(write)` returning the date range needed to validate the write; it does not fetch
- The kernel exposes `rollback(batch)` to reverse an atomic write batch
- `getDaysWithEvents()` returns `Day[]` with `Day.date` as `YYYY-MM-DD` (per Fix civil-date public types: Day.date, currentPeriod, activeDate → YYYY-MM-DD strings #27)
- Navigation (`goToNext`, `goToPrevious`, `goToToday`, `goToSpecificPeriod`) updates the viewport and recomputes the projection
- The Calendar product factory (`createCalendar`) is exported and produces a kernel pre-configured with core Calendar modules
- TypeScript: module registration is fully typed; a module with wrong stage/priority shape is a compile error
Activity