Skip to main content

Sample Architecture

The samples deliberately use ordinary Nest building blocks.

00-showcase is the full reference app. The focused samples then isolate each piece of the same architecture.

Root Modules Own Connections

The app module registers database clients with DrizzleModule.forRoot() or DrizzleModule.forRootAsync(). Driver lifecycle stays close to the connection:

  • create the Drizzle client in the root module
  • pass the schema object as-is
  • close owned drivers with shutdown
  • use connectionName for multi-database apps

See 00-showcase, 03-for-root-async, and 04-named-connections.

Feature Modules Own Repositories

Repositories are normal Nest providers. Register them with DrizzleModule.forFeature() inside the feature module that owns the use case. This keeps dependency injection familiar while leaving Drizzle queries explicit.

See 02-repositories.

Services Own Workflows

Services coordinate multi-step behavior. Repositories stay focused on query shape, while services decide transaction boundaries and orchestration.

See 05-transactions-cls.

Escape Hatches Stay Explicit

Direct transaction injection is available, but it should remain an escape hatch for low-level providers that truly need the active transaction object.

See 06-manual-transaction.

Tests Prove Real Behavior

Focused samples use smoke tests against real local libSQL clients. Mocks are reserved for unit tests where SQL behavior is intentionally out of scope.