Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Creates and configures NestJS modules, controllers, services, DTOs, guards, and interceptors for enterprise-grade TypeScript backend applications. Use when building NestJS REST APIs or GraphQL services, implementing dependency injection, scaffolding modular architecture, adding JWT/Passport authentication, integrating TypeORM or Prisma, or working with .module.ts, .controller.ts, and .service.ts files. Invoke for guards, interceptors, pipes, validation, Swagger documentation, and unit/E2E testin
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-03 | ✗→✓ | ▲ Improved | 21% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 62% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 320% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 90% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 251% | 0% |
Senior NestJS specialist with deep expertise in enterprise-grade, scalable TypeScript backend applications.
npm run lint, npm run test, and confirm DI graph with nest infoLoad detailed guidance based on context:
| Topic | Reference | Load When | |-------|-----------|-----------| | Controllers | references/controllers-routing.md | Creating controllers, routing, Swagger docs | | Services | references/services-di.md | Services, dependency injection, providers | | DTOs | references/dtos-validation.md | Validation, class-validator, DTOs | | Authentication | references/authentication.md | JWT, Passport, guards, authorization | | Testing | references/testing-patterns.md | Unit tests, E2E tests, mocking | | Express Migration | references/migration-from-express.md | Migrating from Express.js to NestJS |
typescript// create-user.dto.ts import { IsEmail, IsString, MinLength } from 'class-validator'; import { ApiProperty } from '@nestjs/swagger'; export class CreateUserDto { @ApiProperty({ example: 'user@example.com' }) @IsEmail() email: string; @ApiProperty({ example: 'strongPassword123', minLength: 8 }) @IsString() @MinLength(8) password: string; } // users.controller.ts import { Body, Controller, Post, HttpCode, HttpStatus } from '@nestjs/common'; import { ApiCreatedResponse, ApiTags } from '@nestjs/swagger'; import { UsersService } from './users.service'; import { CreateUserDto } from './dto/create-user.dto'; @ApiTags('users') @Controller('users') export class UsersController { constructor(private readonly usersService: UsersService) {} @Post() @HttpCode(HttpStatus.CREATED) @ApiCreatedResponse({ description: 'User created successfully.' }) create(@Body() createUserDto: CreateUserDto) { return this.usersService.create(createUserDto); } }
typescript// users.service.ts import { Injectable, ConflictException, NotFoundException } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { User } from './entities/user.entity'; import { CreateUserDto } from './dto/create-user.dto'; @Injectable() export class UsersService { constructor( @InjectRepository(User) private readonly usersRepository: Repository<User>, ) {} async create(createUserDto: CreateUserDto): Promise<User> { const existing = await this.usersRepository.findOneBy({ email: createUserDto.email }); if (existing) { throw new ConflictException('Email already registered'); } const user = this.usersRepository.create(createUserDto); return this.usersRepository.save(user); } async findOne(id: number): Promise<User> { const user = await this.usersRepository.findOneBy({ id }); if (!user) { throw new NotFoundException(`User #${id} not found`); } return user; } }
typescript// users.module.ts import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { UsersController } from './users.controller'; import { UsersService } from './users.service'; import { User } from './entities/user.entity'; @Module({ imports: [TypeOrmModule.forFeature([User])], controllers: [UsersController], providers: [UsersService], exports: [UsersService], // export only when other modules need this service }) export class UsersModule {}
typescript// users.service.spec.ts import { Test, TestingModule } from '@nestjs/testing'; import { getRepositoryToken } from '@nestjs/typeorm'; import { ConflictException } from '@nestjs/common'; import { UsersService } from './users.service'; import { User } from './entities/user.entity'; const mockRepo = { findOneBy: jest.fn(), create: jest.fn(), save: jest.fn(), }; describe('UsersService', () => { let service: UsersService; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ providers: [ UsersService, { provide: getRepositoryToken(User), useValue: mockRepo }, ], }).compile(); service = module.get<UsersService>(UsersService); jest.clearAllMocks(); }); it('throws ConflictException when email already exists', async () => { mockRepo.findOneBy.mockResolvedValue({ id: 1, email: 'user@example.com' }); await expect( service.create({ email: 'user@example.com', password: 'pass1234' }), ).rejects.toThrow(ConflictException); }); });
@Injectable() and constructor injection for all services — never instantiate services with newclass-validator decorators on DTOs and enable ValidationPipe globallyreq.body to servicesNotFoundException, ConflictException, etc.) in services@ApiTags, @ApiOperation, and response decoratorsTest.createTestingModuleConfigModule and process.env; never hardcode themValidationPipeany type unless absolutely necessary and documentedforwardRef() only as a last resortWhen implementing a NestJS feature, provide in this order:
.module.ts).controller.ts).service.ts)class-validator decorators (dto/*.dto.ts)*.service.spec.ts)NestJS, TypeScript, TypeORM, Prisma, Passport, JWT, class-validator, class-transformer, Swagger/OpenAPI, Jest, Supertest, Guards, Interceptors, Pipes, Filters
Other measured skills in the registry, with their headline benchmark lift.