Skip to content

Concepts And Package Map

@haskou/ddd-kernel is split into three layers:

  • Core: lifecycle, dependency injection, kernel logging contracts and the Kernel runtime.
  • Contracts and domain primitives: stable interfaces and base classes that application code depends on.
  • Adapters: optional infrastructure implementations for a contract or runtime boundary.

Application code should usually depend on contracts and domain primitives. Bootstrap code chooses adapters.

Core

AreaImportPurpose
Kernel runtime@haskou/ddd-kernelRegisters consumers, routes, schedulers, runtimes and shutdown hooks.
Environment variables@haskou/ddd-kernelLoads .env.<environment> files and exposes typed kernel.environment when a schema is configured.
Dependency injection@haskou/ddd-kernel/dependency-injectionWraps node-dependency-injection and container YAML generation/loading.
Lifecycle@haskou/ddd-kernel/lifecycleRuntime and initializer contracts.
Kernel logger contract@haskou/ddd-kernel/contracts/kernelKernelLogger interface.

dotenv, node-dependency-injection and fs-extra are package dependencies because the core environment and DI implementations use them directly. Applications do not install them separately.

Contracts And Domain

AreaImportPurpose
Domain@haskou/ddd-kernel/domainAggregateRoot, DomainEvent, domain event bus contracts and consumer/publisher contracts.
Pub/sub contracts@haskou/ddd-kernel/contracts/pubsubGeneric message bus, consumer registration and handler contracts.
DB contracts@haskou/ddd-kernel/contracts/dbRepository-oriented persistence contracts.
UI contracts@haskou/ddd-kernel/contracts/uiRoute contracts and HTTP status constants.

Adapters

GroupAdapterImportExtra packages
Pub/subIn-memory@haskou/ddd-kernel/adapters/pubsub/in-memoryNone
Pub/subAMQP@haskou/ddd-kernel/adapters/pubsub/amqpamqplib
DBIn-memory repository@haskou/ddd-kernel/adapters/db/in-memoryNone
DBMongo repository@haskou/ddd-kernel/adapters/db/mongomongodb
UIExpress server and HTTP error handling@haskou/ddd-kernel/adapters/ui/expressexpress, routing-controllers, reflect-metadata, class-transformer, class-validator; cors only when routingControllersOptions.cors is enabled
UIRoute base class@haskou/ddd-kernel/adapters/ui/routesSame runtime as the HTTP server that executes routes
KernelConsole logger@haskou/ddd-kernel/adapters/kernel/consoleNone
LogsWinston logger@haskou/ddd-kernel/logswinston
SchedulerCron scheduler base@haskou/ddd-kernel/schedulernode-cron
WebSocketEvent hub and realtime server@haskou/ddd-kernel/websocketws

Adapters are optional. Importing the kernel or domain contracts does not require Express, AMQP, MongoDB, Winston or WebSocket packages.

Application Boundary

Use constructor injection inside consumers, schedulers, routes and services. Use bootstrap code to choose infrastructure:

ts
await kernel.dependencyInjection({
  overrides: [
    {
      token: UserRepository,
      useClass:
        process.env.NODE_ENV === 'test'
          ? InMemoryUserRepository
          : MongoUserRepository,
    },
  ],
});

That keeps domain/application code stable while adapters change per runtime.

Released under the MIT License.