Linter Rules

ESLint rules to enforce architecture constraints

Info:

Coming Soon - This feature is planned for a future release and is not yet available.

Rules

One-Way Module Dependencies

Modules can import from each other, but only one direction.

// ✅ OK: Module A imports from Module B
import { OrderReadModel } from '@modules/orders/shared';

// ❌ ERROR: Module B also imports from Module A (creates cycle)
import { UserReadModel } from '@modules/users/shared';

Layer Import Restrictions

FromCan Import
BCShared only
InfrastructureBC ports, domain, shared
OrchestrationsBC ports + use cases, shared
PresentationAll inner layers
// In bounded-contexts/user/
// ❌ ERROR: Cannot import from infrastructure
import { DrizzleUserRepository } from '@infra/repositories';

No implements in Persistence/External

// ❌ ERROR: Only implementations/ can use `implements`
class UserPersistence implements UserRepositoryOutboundPort { ... }

Configuration

eslint.config.js
import { onionLasagnaPlugin } from '@onion-lasagna/eslint-plugin';

export default [
  onionLasagnaPlugin.configs.recommended,
];