Loading source
Pulling the file list, source metadata, and syntax-aware rendering for this listing.
Source from repo
40 prioritized NestJS best practices across architecture, DI, security, performance, testing, and microservices.
Files
Skill
Size
Entrypoint
Format
Open file
Syntax-highlighted preview of this file as included in the skill package.
rules/arch-avoid-circular-deps.md
1---2title: Avoid Circular Dependencies3impact: CRITICAL4impactDescription: "#1 cause of runtime crashes"5tags: architecture, modules, dependencies6---78## Avoid Circular Dependencies910Circular dependencies occur when Module A imports Module B, and Module B imports Module A (directly or transitively). NestJS can sometimes resolve these through forward references, but they indicate architectural problems and should be avoided. This is the #1 cause of runtime crashes in NestJS applications.1112**Incorrect (circular module imports):**1314```typescript15// users.module.ts16@Module({17imports: [OrdersModule], // Orders needs Users, Users needs Orders = circular18providers: [UsersService],19exports: [UsersService],20})21export class UsersModule {}2223// orders.module.ts24@Module({25imports: [UsersModule], // Circular dependency!26providers: [OrdersService],27exports: [OrdersService],28})29export class OrdersModule {}30```3132**Correct (extract shared logic or use events):**3334```typescript35// Option 1: Extract shared logic to a third module36// shared.module.ts37@Module({38providers: [SharedService],39exports: [SharedService],40})41export class SharedModule {}4243// users.module.ts44@Module({45imports: [SharedModule],46providers: [UsersService],47})48export class UsersModule {}4950// orders.module.ts51@Module({52imports: [SharedModule],53providers: [OrdersService],54})55export class OrdersModule {}5657// Option 2: Use events for decoupled communication58// users.service.ts59@Injectable()60export class UsersService {61constructor(private eventEmitter: EventEmitter2) {}6263async createUser(data: CreateUserDto) {64const user = await this.userRepo.save(data);65this.eventEmitter.emit('user.created', user);66return user;67}68}6970// orders.service.ts71@Injectable()72export class OrdersService {73@OnEvent('user.created')74handleUserCreated(user: User) {75// React to user creation without direct dependency76}77}78```7980Reference: [NestJS Circular Dependency](https://docs.nestjs.com/fundamentals/circular-dependency)81