Skip to content

Kernel + module registration API #28

Description

@bart-krakowski

Parent

#25

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

Blocked by

#27

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions