Loading...
Loading...
Provides comprehensive NestJS best practices including modular architecture, dependency injection scoping, exception filters, DTO validation with class-validator, and Drizzle ORM integration. Use when designing NestJS modules, implementing providers, creating exception filters, validating DTOs, or integrating Drizzle ORM within NestJS applications.
npx skill4agent add giuseppe-trisciuoglio/developer-kit nestjs-best-practicesclass-validatorValidationPipe@Module()forwardRef()SharedModulereferences/arch-module-boundaries.md| Scope | Lifecycle | Use Case |
|---|---|---|
| Singleton (shared) | Stateless services, repositories |
| Per-request instance | Request-scoped data (tenant, user context) |
| New instance per injection | Stateful utilities, per-consumer caches |
DEFAULTREQUESTTRANSIENTuseClassuseValueuseFactoryuseExistingreferences/di-provider-scoping.mdMiddleware → Guards → Interceptors (before) → Pipes → Route Handler → Interceptors (after) → Exception FilterstruefalseHttpExceptionOrderNotFoundExceptionExceptionFilterreferences/error-exception-filters.mdValidationPipetransform: truewhitelist: trueclass-validatorclass-transformer@Type()@Transform()references/api-validation-dto.mdreferences/db-drizzle-patterns.md| Area | Do | Don't |
|---|---|---|
| Modules | One module per domain feature | Dump everything in |
| DI Scoping | Default to singleton scope | Use |
| Error Handling | Custom exception filters + domain errors | Bare |
| Validation | Global | Manual |
| Database | Repository pattern with injected client | Direct DB queries in controllers |
| Testing | Unit test services, e2e test controllers | Skip tests or test implementation details |
| Configuration | | Hardcode values or use |
// product/product.module.ts
@Module({
imports: [DatabaseModule],
controllers: [ProductController],
providers: [ProductService, ProductRepository],
exports: [ProductService],
})
export class ProductModule {}// product/dto/create-product.dto.ts
import { IsString, IsNumber, IsPositive, MaxLength } from 'class-validator';
export class CreateProductDto {
@IsString()
@MaxLength(255)
readonly name: string;
@IsNumber()
@IsPositive()
readonly price: number;
}@Injectable()
export class ProductService {
constructor(private readonly productRepository: ProductRepository) {}
async findById(id: string): Promise<Product> {
const product = await this.productRepository.findById(id);
if (product === null) {
throw new ProductNotFoundException(id);
}
return product;
}
}REQUESTforwardRef()ValidationPipe@nestjs/configreferences/architecture.mdreferences/assets/templates/