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 contracts@haskou/ddd-kernel/contracts/kernelKernelConsumer, KernelRoute, KernelLogger, middleware and shutdown contracts.

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.