NestJS Development Skill
Quick Reference
# Scaffold a new module with CRUD
python scripts/scaffold.py user --crud
# Generate specific component
python scripts/generate.py controller user
python scripts/generate.py service user --repository
# Run tests with coverage
python scripts/test.py --coverage --threshold 80
Load Additional Resources
| Scenario |
Reference |
Description |
| Architecture decisions |
references/architecture.md |
Clean arch, DDD, CQRS |
| Auth/Authorization |
references/security.md |
JWT, Passport, RBAC |
| Database integration |
references/database.md |
TypeORM, Prisma |
| Testing strategies |
references/testing.md |
Unit, E2E, mocking |
| Performance |
references/performance.md |
Caching, queues |
Core Patterns
Module Structure
// REQ-XXX: Feature module
@Module({
imports: [TypeOrmModule.forFeature([User]), ConfigModule],
controllers: [UserController],
providers: [UserService, UserRepository],
exports: [UserService],
})
export class UserModule {}
Service Pattern
@Injectable()
export class UserService {
constructor(
private readonly userRepository: UserRepository,
private readonly eventEmitter: EventEmitter2,
) {}
async create(dto: CreateUserDto): Promise<User> {
const user = await this.userRepository.create(dto);
this.eventEmitter.emit('user.created', user);
return user;
}
}
Controller Pattern
@ApiTags('users')
@Controller('users')
@UseGuards(JwtAuthGuard, RolesGuard)
export class UserController {
constructor(private readonly userService: UserService) {}
@Post()
@Roles(Role.ADMIN)
@ApiOperation({ summary: 'Create user' })
@ApiResponse({ status: 201, type: UserResponseDto })
async create(@Body() dto: CreateUserDto): Promise<UserResponseDto> {
return this.userService.create(dto);
}
}
DTO with Validation
export class CreateUserDto {
@ApiProperty({ example: 'john@example.com' })
@IsEmail()
@IsNotEmpty()
email: string;
@ApiProperty({ minLength: 8 })
@IsString()
@MinLength(8)
@Matches(/^(?=.*[A-Za-z])(?=.*\d)/)
password: string;
}
Guard Pattern
@Injectable()
export class RolesGuard implements CanActivate {
constructor(private reflector: Reflector) {}
canActivate(context: ExecutionContext): boolean {
const requiredRoles = this.reflector.getAllAndOverride<Role[]>(
ROLES_KEY, [context.getHandler(), context.getClass()],
);
if (!requiredRoles) return true;
const { user } = context.switchToHttp().getRequest();
return requiredRoles.some((role) => user.roles?.includes(role));
}
}
Project Structure
src/
├── main.ts # Bootstrap
├── app.module.ts # Root module
├── common/ # Shared utilities
│ ├── decorators/ # @Roles, @User, @Public
│ ├── dto/ # PaginationDto, ResponseDto
│ ├── filters/ # HttpExceptionFilter
│ ├── guards/ # JwtAuthGuard, RolesGuard
│ ├── interceptors/ # TransformInterceptor
│ └── pipes/ # ValidationPipe extensions
├── config/ # Configuration
└── modules/ # Feature modules
└── {feature}/
├── {feature}.module.ts
├── {feature}.controller.ts
├── {feature}.service.ts
├── {feature}.repository.ts
├── dto/
├── entities/
└── __tests__/
F5 Quality Gates
| Gate |
Requirement |
Implementation |
| D3 |
Architecture |
Module structure documented |
| D4 |
Detailed Design |
DTOs, entities defined |
| G2.5 |
Code Review |
NestJS best practices |
| G3 |
80% Coverage |
Jest + supertest |
Scripts
| Script |
Usage |
Gate |
scaffold.py |
scaffold.py <name> --crud |
D4 |
generate.py |
generate.py <type> <name> |
G2.5 |
test.py |
test.py --coverage |
G3 |
Common Packages
{
"@nestjs/core": "^10.0.0",
"@nestjs/common": "^10.0.0",
"@nestjs/config": "^3.0.0",
"@nestjs/typeorm": "^10.0.0",
"@nestjs/passport": "^10.0.0",
"@nestjs/jwt": "^10.0.0",
"@nestjs/swagger": "^7.0.0",
"class-validator": "^0.14.0"
}
1---2name: nestjs3description: NestJS TypeScript backend development with enterprise patterns, dependency injection, modular architecture, and comprehensive testing support. Use when: (1) Project has @nestjs/core in package.json or nest-cli.json exists, (2) Creating modules, controllers, services, guards, pipes, interceptors, or filters, (3) Implementing JWT authentication or role-based authorization (RBAC/ABAC), (4) Integrating TypeORM, Prisma, or MikroORM for database operations, (5) Writing unit tests with Jest or E2E tests with supertest, (6) Setting up Swagger/OpenAPI documentation, (7) Implementing CQRS, event sourcing, or microservices patterns. Auto-detects: nest-cli.json, *.module.ts, *.controller.ts, *.service.ts, *.guard.ts, @nestjs/* packages in package.json, src/modules/ directory structure. NOT for: Pure Express.js without NestJS, frontend React/Vue/Angular code, non-TypeScript Node.js projects, Fastify without NestJS wrapper.4---56# NestJS Development Skill78## Quick Reference910```bash11# Scaffold a new module with CRUD12python scripts/scaffold.py user --crud1314# Generate specific component15python scripts/generate.py controller user16python scripts/generate.py service user --repository1718# Run tests with coverage19python scripts/test.py --coverage --threshold 8020```2122## Load Additional Resources2324| Scenario | Reference | Description |25|----------|-----------|-------------|26| Architecture decisions | `references/architecture.md` | Clean arch, DDD, CQRS |27| Auth/Authorization | `references/security.md` | JWT, Passport, RBAC |28| Database integration | `references/database.md` | TypeORM, Prisma |29| Testing strategies | `references/testing.md` | Unit, E2E, mocking |30| Performance | `references/performance.md` | Caching, queues |3132## Core Patterns3334### Module Structure35```typescript36// REQ-XXX: Feature module37@Module({38 imports: [TypeOrmModule.forFeature([User]), ConfigModule],39 controllers: [UserController],40 providers: [UserService, UserRepository],41 exports: [UserService],42})43export class UserModule {}44```4546### Service Pattern47```typescript48@Injectable()49export class UserService {50 constructor(51 private readonly userRepository: UserRepository,52 private readonly eventEmitter: EventEmitter2,53 ) {}5455 async create(dto: CreateUserDto): Promise<User> {56 const user = await this.userRepository.create(dto);57 this.eventEmitter.emit('user.created', user);58 return user;59 }60}61```6263### Controller Pattern64```typescript65@ApiTags('users')66@Controller('users')67@UseGuards(JwtAuthGuard, RolesGuard)68export class UserController {69 constructor(private readonly userService: UserService) {}7071 @Post()72 @Roles(Role.ADMIN)73 @ApiOperation({ summary: 'Create user' })74 @ApiResponse({ status: 201, type: UserResponseDto })75 async create(@Body() dto: CreateUserDto): Promise<UserResponseDto> {76 return this.userService.create(dto);77 }78}79```8081### DTO with Validation82```typescript83export class CreateUserDto {84 @ApiProperty({ example: 'john@example.com' })85 @IsEmail()86 @IsNotEmpty()87 email: string;8889 @ApiProperty({ minLength: 8 })90 @IsString()91 @MinLength(8)92 @Matches(/^(?=.*[A-Za-z])(?=.*\d)/)93 password: string;94}95```9697### Guard Pattern98```typescript99@Injectable()100export class RolesGuard implements CanActivate {101 constructor(private reflector: Reflector) {}102103 canActivate(context: ExecutionContext): boolean {104 const requiredRoles = this.reflector.getAllAndOverride<Role[]>(105 ROLES_KEY, [context.getHandler(), context.getClass()],106 );107 if (!requiredRoles) return true;108 const { user } = context.switchToHttp().getRequest();109 return requiredRoles.some((role) => user.roles?.includes(role));110 }111}112```113114## Project Structure115116```117src/118├── main.ts # Bootstrap119├── app.module.ts # Root module120├── common/ # Shared utilities121│ ├── decorators/ # @Roles, @User, @Public122│ ├── dto/ # PaginationDto, ResponseDto123│ ├── filters/ # HttpExceptionFilter124│ ├── guards/ # JwtAuthGuard, RolesGuard125│ ├── interceptors/ # TransformInterceptor126│ └── pipes/ # ValidationPipe extensions127├── config/ # Configuration128└── modules/ # Feature modules129 └── {feature}/130 ├── {feature}.module.ts131 ├── {feature}.controller.ts132 ├── {feature}.service.ts133 ├── {feature}.repository.ts134 ├── dto/135 ├── entities/136 └── __tests__/137```138139## F5 Quality Gates140141| Gate | Requirement | Implementation |142|------|-------------|----------------|143| D3 | Architecture | Module structure documented |144| D4 | Detailed Design | DTOs, entities defined |145| G2.5 | Code Review | NestJS best practices |146| G3 | 80% Coverage | Jest + supertest |147148## Scripts149150| Script | Usage | Gate |151|--------|-------|------|152| `scaffold.py` | `scaffold.py <name> --crud` | D4 |153| `generate.py` | `generate.py <type> <name>` | G2.5 |154| `test.py` | `test.py --coverage` | G3 |155156## Common Packages157158```json159{160 "@nestjs/core": "^10.0.0",161 "@nestjs/common": "^10.0.0",162 "@nestjs/config": "^3.0.0",163 "@nestjs/typeorm": "^10.0.0",164 "@nestjs/passport": "^10.0.0",165 "@nestjs/jwt": "^10.0.0",166 "@nestjs/swagger": "^7.0.0",167 "class-validator": "^0.14.0"168}169```