Пометьте контроллеры через @WithDocs()
Отметьте, у каких контроллеров есть companion-файл, и запустите generate.
Самый быстрый путь: один раз запустите nestjs-docfy init, и всё описанное ниже сделается за один заход. Подробности в разделе CLI: init.
Пометьте контроллеры
// users.controller.ts
import { Controller, Get, Post, Body } from "@nestjs/common";
import { WithDocs } from "nestjs-docfy";
@WithDocs()
@Controller("users")
export class UsersController {
// route handlers only: no Swagger decorators here
}Либо пусть generate --link-controller сам добавит импорт и декоратор. Флаг включается вручную и правит файл контроллера. Подробности в разделе CLI: generate.
Сгенерируйте companion-файлы
Запустите CLI, чтобы он прошёл по проекту и создал заготовку *.controller.docs.ts для каждого контроллера:
npx nestjs-docfy generateCLI работает только статическим анализом, без выполнения кода, и сам определяет структуру проекта: монорепозитории, воркспейсы Nx и монорепозитории Nest CLI поддерживаются.
Посмотреть результат, не трогая файловую систему:
npx nestjs-docfy generate --dry-runЗаполните docs-файл
В сгенерированном файле уже проставлены выведенные summary, типы ответов и типовые ответы с ошибками:
// Generated by nestjs-docfy: edit freely, use --force to merge new methods
import { docs } from "nestjs-docfy";
import { ApiTags, ApiOperation, ApiResponse, ApiBody } from "@nestjs/swagger";
import { UsersController } from "./users.controller";
import { CreateUserDto } from "./dto/create-user.dto";
import { UserEntity } from "./entities/user.entity";
docs(UsersController, {
classDecorators: [ApiTags("users")],
methods: {
// GET / → async findAll(): Promise<UserEntity[]>
findAll: [
ApiOperation({ summary: "Find all" }),
ApiResponse({ status: 200, description: "OK", type: [UserEntity] }),
],
// POST / → async create(dto: CreateUserDto): Promise<UserEntity>
create: [
ApiOperation({ summary: "Create" }),
ApiBody({ type: CreateUserDto }),
ApiResponse({ status: 201, description: "Created", type: UserEntity }),
ApiResponse({ status: 400, description: "Bad Request" }),
],
},
});Правьте файл как угодно, изменения не потеряются. Повторный запуск generate пропускает существующие файлы. Флаг --force добавит только новые методы, не трогая уже описанные.