From 1a38e0f3fbf6a425daf234022b4cde15c5ce0e3d Mon Sep 17 00:00:00 2001 From: Franco Date: Thu, 26 Feb 2026 13:29:53 -0300 Subject: [PATCH] refactor: update code style and improve ESLint rules for better consistency --- .prettierrc | 9 ++- eslint.config.mjs | 25 +++++++- src/app.controller.spec.ts | 35 +++++------ src/app.controller.ts | 14 ++--- src/app.module.ts | 16 ++--- src/app.service.ts | 8 +-- src/categories/categories.controller.spec.ts | 31 +++++----- src/categories/categories.controller.ts | 63 ++++++++++++-------- src/categories/categories.module.ts | 10 ++-- src/categories/categories.service.spec.ts | 27 +++++---- src/categories/categories.service.ts | 36 +++++------ src/categories/dto/update-category.dto.ts | 4 +- src/main.ts | 10 ++-- src/prisma/prisma.module.ts | 8 +-- src/prisma/prisma.service.ts | 10 ++-- test/app.e2e-spec.ts | 41 ++++++------- 16 files changed, 193 insertions(+), 154 deletions(-) diff --git a/.prettierrc b/.prettierrc index a20502b..4b62df4 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,4 +1,7 @@ { - "singleQuote": true, - "trailingComma": "all" -} + "singleQuote": false, + "trailingComma": "all", + "tabWidth": 4, + "useTabs": false, + "semi": true +} \ No newline at end of file diff --git a/eslint.config.mjs b/eslint.config.mjs index 4e9f827..61d4244 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -27,9 +27,30 @@ export default tseslint.config( { rules: { '@typescript-eslint/no-explicit-any': 'off', - '@typescript-eslint/no-floating-promises': 'warn', + '@typescript-eslint/no-floating-promises': 'error', // asegurar manejo de promesas '@typescript-eslint/no-unsafe-argument': 'warn', - "prettier/prettier": ["error", { endOfLine: "auto" }], + '@typescript-eslint/prefer-nullish-coalescing': 'warn', // usar ?? en lugar de || + '@typescript-eslint/prefer-optional-chain': 'warn', // usar ?. en lugar de && encadenados + '@typescript-eslint/no-unnecessary-condition': 'warn', // condiciones que siempre son true/false + '@typescript-eslint/switch-exhaustiveness-check': 'error', // switch sobre union types debe cubrir todos los casos + 'prettier/prettier': ['error', { endOfLine: 'auto' }], + '@typescript-eslint/await-thenable': 'error', // no hacer await de algo que no es Promise + '@typescript-eslint/no-misused-promises': 'error', // pasar promises donde no corresponde + '@typescript-eslint/explicit-function-return-type': ['off'], + '@typescript-eslint/no-unused-vars': ['warn', { argsIgnorePattern: '^_' }], // ignorar _variables + '@typescript-eslint/consistent-type-imports': 'error', // import type {} cuando corresponde + 'no-console': 'warn', // evitar console.log olvidados + + // NestJS específico + '@typescript-eslint/no-extraneous-class': 'off', // NestJS usa clases vacías (módulos) + '@typescript-eslint/no-unsafe-member-access': 'off', // decoradores de NestJS lo necesitan + '@typescript-eslint/no-unsafe-call': 'off', // ídem + + '@typescript-eslint/naming-convention': ['warn', + { selector: 'interface', format: ['PascalCase'] }, + { selector: 'typeAlias', format: ['PascalCase'] }, + { selector: 'enum', format: ['PascalCase'] }, + ], }, }, ); diff --git a/src/app.controller.spec.ts b/src/app.controller.spec.ts index d22f389..09eb3c1 100644 --- a/src/app.controller.spec.ts +++ b/src/app.controller.spec.ts @@ -1,22 +1,23 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { AppController } from './app.controller'; -import { AppService } from './app.service'; +import type { TestingModule } from "@nestjs/testing"; +import { Test } from "@nestjs/testing"; +import { AppController } from "./app.controller"; +import { AppService } from "./app.service"; -describe('AppController', () => { - let appController: AppController; +describe("AppController", () => { + let appController: AppController; - beforeEach(async () => { - const app: TestingModule = await Test.createTestingModule({ - controllers: [AppController], - providers: [AppService], - }).compile(); + beforeEach(async () => { + const app: TestingModule = await Test.createTestingModule({ + controllers: [AppController], + providers: [AppService], + }).compile(); - appController = app.get(AppController); - }); - - describe('root', () => { - it('should return "Hello World!"', () => { - expect(appController.getHello()).toBe('Hello World!'); + appController = app.get(AppController); + }); + + describe("root", () => { + it('should return "Hello World!"', () => { + expect(appController.getHello()).toBe("Hello World!"); + }); }); - }); }); diff --git a/src/app.controller.ts b/src/app.controller.ts index cce879e..00e6336 100644 --- a/src/app.controller.ts +++ b/src/app.controller.ts @@ -1,12 +1,12 @@ -import { Controller, Get } from '@nestjs/common'; -import { AppService } from './app.service'; +import { Controller, Get } from "@nestjs/common"; +import { AppService } from "./app.service"; @Controller() export class AppController { - constructor(private readonly appService: AppService) {} + constructor(private readonly appService: AppService) {} - @Get() - getHello(): string { - return this.appService.getHello(); - } + @Get() + getHello(): string { + return this.appService.getHello(); + } } diff --git a/src/app.module.ts b/src/app.module.ts index 0bec92a..4b20ce3 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -1,12 +1,12 @@ -import { Module } from '@nestjs/common'; -import { AppController } from './app.controller'; -import { AppService } from './app.service'; -import { CategoriesModule } from './categories/categories.module'; -import { PrismaModule } from './prisma/prisma.module'; +import { Module } from "@nestjs/common"; +import { AppController } from "./app.controller"; +import { AppService } from "./app.service"; +import { CategoriesModule } from "./categories/categories.module"; +import { PrismaModule } from "./prisma/prisma.module"; @Module({ - imports: [PrismaModule, CategoriesModule], - controllers: [AppController], - providers: [AppService], + imports: [PrismaModule, CategoriesModule], + controllers: [AppController], + providers: [AppService], }) export class AppModule {} diff --git a/src/app.service.ts b/src/app.service.ts index 927d7cc..07de6b4 100644 --- a/src/app.service.ts +++ b/src/app.service.ts @@ -1,8 +1,8 @@ -import { Injectable } from '@nestjs/common'; +import { Injectable } from "@nestjs/common"; @Injectable() export class AppService { - getHello(): string { - return 'Hello World!'; - } + getHello(): string { + return "Hello World!"; + } } diff --git a/src/categories/categories.controller.spec.ts b/src/categories/categories.controller.spec.ts index 66257de..847ee6d 100644 --- a/src/categories/categories.controller.spec.ts +++ b/src/categories/categories.controller.spec.ts @@ -1,20 +1,21 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { CategoriesController } from './categories.controller'; -import { CategoriesService } from './categories.service'; +import type { TestingModule } from "@nestjs/testing"; +import { Test } from "@nestjs/testing"; +import { CategoriesController } from "./categories.controller"; +import { CategoriesService } from "./categories.service"; -describe('CategoriesController', () => { - let controller: CategoriesController; +describe("CategoriesController", () => { + let controller: CategoriesController; - beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - controllers: [CategoriesController], - providers: [CategoriesService], - }).compile(); + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [CategoriesController], + providers: [CategoriesService], + }).compile(); - controller = module.get(CategoriesController); - }); + controller = module.get(CategoriesController); + }); - it('should be defined', () => { - expect(controller).toBeDefined(); - }); + it("should be defined", () => { + expect(controller).toBeDefined(); + }); }); diff --git a/src/categories/categories.controller.ts b/src/categories/categories.controller.ts index 8c865d6..f634077 100644 --- a/src/categories/categories.controller.ts +++ b/src/categories/categories.controller.ts @@ -1,34 +1,45 @@ -import { Controller, Get, Post, Body, Patch, Param, Delete } from '@nestjs/common'; -import { CategoriesService } from './categories.service'; -import { CreateCategoryDto } from './dto/create-category.dto'; -import { UpdateCategoryDto } from './dto/update-category.dto'; +import { + Controller, + Get, + Post, + Body, + Patch, + Param, + Delete, +} from "@nestjs/common"; +import { CategoriesService } from "./categories.service"; +import { CreateCategoryDto } from "./dto/create-category.dto"; +import { UpdateCategoryDto } from "./dto/update-category.dto"; -@Controller('categories') +@Controller("categories") export class CategoriesController { - constructor(private readonly categoriesService: CategoriesService) {} + constructor(private readonly categoriesService: CategoriesService) {} - @Post() - create(@Body() createCategoryDto: CreateCategoryDto) { - return this.categoriesService.create(createCategoryDto); - } + @Post() + create(@Body() createCategoryDto: CreateCategoryDto) { + return this.categoriesService.create(createCategoryDto); + } - @Get() - findAll() { - return this.categoriesService.findAll(); - } + @Get() + findAll() { + return this.categoriesService.findAll(); + } - @Get(':id') - findOne(@Param('id') id: string) { - return this.categoriesService.findOne(+id); - } + @Get(":id") + findOne(@Param("id") id: string) { + return this.categoriesService.findOne(+id); + } - @Patch(':id') - update(@Param('id') id: string, @Body() updateCategoryDto: UpdateCategoryDto) { - return this.categoriesService.update(+id, updateCategoryDto); - } + @Patch(":id") + update( + @Param("id") id: string, + @Body() updateCategoryDto: UpdateCategoryDto, + ) { + return this.categoriesService.update(+id, updateCategoryDto); + } - @Delete(':id') - remove(@Param('id') id: string) { - return this.categoriesService.remove(+id); - } + @Delete(":id") + remove(@Param("id") id: string) { + return this.categoriesService.remove(+id); + } } diff --git a/src/categories/categories.module.ts b/src/categories/categories.module.ts index 3499b76..4c87cd7 100644 --- a/src/categories/categories.module.ts +++ b/src/categories/categories.module.ts @@ -1,9 +1,9 @@ -import { Module } from '@nestjs/common'; -import { CategoriesService } from './categories.service'; -import { CategoriesController } from './categories.controller'; +import { Module } from "@nestjs/common"; +import { CategoriesService } from "./categories.service"; +import { CategoriesController } from "./categories.controller"; @Module({ - controllers: [CategoriesController], - providers: [CategoriesService], + controllers: [CategoriesController], + providers: [CategoriesService], }) export class CategoriesModule {} diff --git a/src/categories/categories.service.spec.ts b/src/categories/categories.service.spec.ts index 9095d78..ff024a4 100644 --- a/src/categories/categories.service.spec.ts +++ b/src/categories/categories.service.spec.ts @@ -1,18 +1,19 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { CategoriesService } from './categories.service'; +import type { TestingModule } from "@nestjs/testing"; +import { Test } from "@nestjs/testing"; +import { CategoriesService } from "./categories.service"; -describe('CategoriesService', () => { - let service: CategoriesService; +describe("CategoriesService", () => { + let service: CategoriesService; - beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - providers: [CategoriesService], - }).compile(); + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [CategoriesService], + }).compile(); - service = module.get(CategoriesService); - }); + service = module.get(CategoriesService); + }); - it('should be defined', () => { - expect(service).toBeDefined(); - }); + it("should be defined", () => { + expect(service).toBeDefined(); + }); }); diff --git a/src/categories/categories.service.ts b/src/categories/categories.service.ts index 04d4641..12f387d 100644 --- a/src/categories/categories.service.ts +++ b/src/categories/categories.service.ts @@ -1,26 +1,26 @@ -import { Injectable } from '@nestjs/common'; -import { CreateCategoryDto } from './dto/create-category.dto'; -import { UpdateCategoryDto } from './dto/update-category.dto'; +import { Injectable } from "@nestjs/common"; +import { CreateCategoryDto } from "./dto/create-category.dto"; +import { UpdateCategoryDto } from "./dto/update-category.dto"; @Injectable() export class CategoriesService { - create(createCategoryDto: CreateCategoryDto) { - return 'This action adds a new category'; - } + create(createCategoryDto: CreateCategoryDto) { + return "This action adds a new category"; + } - findAll() { - return `This action returns all categories`; - } + findAll() { + return `This action returns all categories`; + } - findOne(id: number) { - return `This action returns a #${id} category`; - } + findOne(id: number) { + return `This action returns a #${id} category`; + } - update(id: number, updateCategoryDto: UpdateCategoryDto) { - return `This action updates a #${id} category`; - } + update(id: number, updateCategoryDto: UpdateCategoryDto) { + return `This action updates a #${id} category`; + } - remove(id: number) { - return `This action removes a #${id} category`; - } + remove(id: number) { + return `This action removes a #${id} category`; + } } diff --git a/src/categories/dto/update-category.dto.ts b/src/categories/dto/update-category.dto.ts index 1ace9d9..066c87f 100644 --- a/src/categories/dto/update-category.dto.ts +++ b/src/categories/dto/update-category.dto.ts @@ -1,4 +1,4 @@ -import { PartialType } from '@nestjs/mapped-types'; -import { CreateCategoryDto } from './create-category.dto'; +import { PartialType } from "@nestjs/mapped-types"; +import { CreateCategoryDto } from "./create-category.dto"; export class UpdateCategoryDto extends PartialType(CreateCategoryDto) {} diff --git a/src/main.ts b/src/main.ts index f76bc8d..13a90c1 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,8 +1,8 @@ -import { NestFactory } from '@nestjs/core'; -import { AppModule } from './app.module'; +import { NestFactory } from "@nestjs/core"; +import { AppModule } from "./app.module"; async function bootstrap() { - const app = await NestFactory.create(AppModule); - await app.listen(process.env.PORT ?? 3000); + const app = await NestFactory.create(AppModule); + await app.listen(process.env.PORT ?? 3000); } -bootstrap(); +void bootstrap(); diff --git a/src/prisma/prisma.module.ts b/src/prisma/prisma.module.ts index 7207426..d2c035b 100644 --- a/src/prisma/prisma.module.ts +++ b/src/prisma/prisma.module.ts @@ -1,9 +1,9 @@ -import { Global, Module } from '@nestjs/common'; -import { PrismaService } from './prisma.service'; +import { Global, Module } from "@nestjs/common"; +import { PrismaService } from "./prisma.service"; @Global() @Module({ - providers: [PrismaService], - exports: [PrismaService], + providers: [PrismaService], + exports: [PrismaService], }) export class PrismaModule {} diff --git a/src/prisma/prisma.service.ts b/src/prisma/prisma.service.ts index 2eb7ee3..c59ced1 100644 --- a/src/prisma/prisma.service.ts +++ b/src/prisma/prisma.service.ts @@ -1,9 +1,9 @@ -import { Injectable, OnModuleInit } from '@nestjs/common'; -import { PrismaClient } from 'generated/prisma/client'; +import { Injectable, OnModuleInit } from "@nestjs/common"; +import { PrismaClient } from "generated/prisma/client"; @Injectable() export class PrismaService extends PrismaClient implements OnModuleInit { - async onModuleInit() { - await this.$connect(); - } + async onModuleInit() { + await this.$connect(); + } } diff --git a/test/app.e2e-spec.ts b/test/app.e2e-spec.ts index 36852c5..4f6d3df 100644 --- a/test/app.e2e-spec.ts +++ b/test/app.e2e-spec.ts @@ -1,25 +1,26 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { INestApplication } from '@nestjs/common'; -import request from 'supertest'; -import { App } from 'supertest/types'; -import { AppModule } from './../src/app.module'; +import type { TestingModule } from "@nestjs/testing"; +import { Test } from "@nestjs/testing"; +import type { INestApplication } from "@nestjs/common"; +import request from "supertest"; +import type { App } from "supertest/types"; +import { AppModule } from "./../src/app.module"; -describe('AppController (e2e)', () => { - let app: INestApplication; +describe("AppController (e2e)", () => { + let app: INestApplication; - beforeEach(async () => { - const moduleFixture: TestingModule = await Test.createTestingModule({ - imports: [AppModule], - }).compile(); + beforeEach(async () => { + const moduleFixture: TestingModule = await Test.createTestingModule({ + imports: [AppModule], + }).compile(); - app = moduleFixture.createNestApplication(); - await app.init(); - }); + app = moduleFixture.createNestApplication(); + await app.init(); + }); - it('/ (GET)', () => { - return request(app.getHttpServer()) - .get('/') - .expect(200) - .expect('Hello World!'); - }); + it("/ (GET)", () => { + return request(app.getHttpServer()) + .get("/") + .expect(200) + .expect("Hello World!"); + }); });