Introdução
English version: React and typescript components lib, part 2: code standardization with typescript-eslint and prettier
No mês passado comecei a parte 1 da criação de uma biblioteca de componentes React com Typescript, focando na parte de configuração inicial e publicação. Agora nesse artigo, será incrementada a lib, com a definição de regras de padronização de código usando typescript-eslint e prettier. A ideia é colocar mais a parte prática de adição nesse artigo, para quem quiser entender mais a fundo como funciona de forma geral escrevi o artigo Typescript-eslint + prettier para padronização de código em React com Typescript no meio do mês.
Libs
typescript-eslint: responsável por analisar o código na busca e solução de problemas
prettier: responsável pela formatação de código
Setup libs
Adição do typescript-eslint, prettier e plugins que serão utilizados:
yarn add typescript-eslint eslint @eslint/js prettier eslint-plugin-react --dev
- typescript-eslint: permite o eslint fazer parse de sintaxe typescript, traz regras de linting para typescript
- eslint: dependência que o typescript-eslint necessita
- @eslint/js: traz regras do eslint
- prettier: adiciona a lib responsável pela formatação do código
- eslint-plugin-react: traz regras de linting para React
No momento desse artigo gerou as seguintes versões:
"@eslint/js": "^9.19.0",
"eslint": "^9.19.0",
"eslint-plugin-react": "^7.37.4",
"prettier": "^3.4.2",
"typescript-eslint": "^8.23.0"
Arquivo de configuração
Para o prettier será adicionado um arquivo na raiz da app de configuração vazio .prettierrc
, por seguir as regras default dele.
Para o typescript-eslint será criado o arquivo de configuração na raiz do projeto, que vai permitir rodar a verificação do código e definir as regras que serão utilizadas para a análise. A princípio serão usadas as regras recomendadas do eslint, typescript-eslint e react:
- eslint.config.mjs
import eslint from "@eslint/js";
import reactPlugin from "eslint-plugin-react";
import tseslint from "typescript-eslint";
export default tseslint.config(
eslint.configs.recommended,
tseslint.configs.recommendedTypeChecked,
{
languageOptions: {
parserOptions: {
projectService: true,
tsconfigRootDir: import.meta.dirname,
},
},
},
reactPlugin.configs.flat.recommended,
reactPlugin.configs.flat['jsx-runtime'],
{
settings: {
react: {
version: "detect",
},
}
}
);
- tseslint.config: onde é passada as configurações do typescript-eslint
- eslint.configs.recommended: aplica as regras recomendadas do eslint na análise do código
- tseslint.configs.recommendedTypeChecked: aplica as regras recomendadas do typescript na análise do código, permitindo linting com informação de types
- projectService: melhora a performance ao compartilhar um único serviço de análise de tipos para múltiplos arquivos
- import.meta.dirname: indica a raiz do projeto para o parser
- reactPlugin.configs.flat.recommended: aplica as regras recomendadas do React na análise do código
- reactPlugin.configs.flat['jsx-runtime']: necessário para React 17+, para funcionar com o novo jsx runtime que veio a partir dessa versão
- settings: está definido para detectar a versão de React que está sendo usada no projeto
Regras customizáveis
Tem algumas regras que acredito ser interessante modificar ou adicionar em relação as recomendadas. Para isso será necessário modificar o arquivo de configuração do typescript-eslint com a adição de rules
:
- eslint.config.mjs
import eslint from "@eslint/js";
import reactPlugin from "eslint-plugin-react";
import tseslint from "typescript-eslint";
export default tseslint.config(
eslint.configs.recommended,
tseslint.configs.recommendedTypeChecked,
{
languageOptions: {
parserOptions: {
projectService: true,
tsconfigRootDir: import.meta.dirname,
},
},
},
reactPlugin.configs.flat.recommended,
reactPlugin.configs.flat['jsx-runtime'],
{
settings: {
react: {
version: "detect",
},
},
rules: {
"no-console": "warn",
"no-duplicate-imports": "error",
"react/destructuring-assignment": "error",
"react/jsx-no-useless-fragment": "error",
"@typescript-eslint/no-unused-vars": "off",
}
}
);
Procedência | Regra | Default (usando a recomendada) | Com a customização |
---|---|---|---|
eslint | no-console | desabilitada | habilitada, retorna aviso se tiver console.log no código |
eslint | no-duplicate-imports | desabilitada | habilitada, retorna erro se tiver imports duplicados |
plugin react | react/destructuring-assignment | desabilitada | habilitada, retorna erro se a props não estiverem desestruturadas |
plugin react | react/jsx-no-useless-fragment | desabilitada | habilitada, retorna erro se tiver fragmento desnecessário |
typescript-eslint | @typescript-eslint/no-unused-vars | habilitada | desabilitada, não retornando erro para variavéis ou parâmetros não usados |
A razão para desabilitar a regra @typescript-eslint/no-unused-vars
, é pela lib de componentes que está sendo criada estar acima da versão 17 do React. Com a regra habilitada retorna erro, pois na definição dos componentes da lib está definido: import React from "react";
No caso do desenvolvimento na lib, não precisaria desse import, mas se está colocando ele pois a aplicação que adicionar a lib pode estar em uma versão de React abaixo da 17, o que demanda o import estar presente. Por esse motivo foi desabilitada a regra.
package.json
No momento o package.json
está da forma abaixo:
{
"name": "react-example-lib",
"version": "0.1.0",
"main": "dist/cjs/index.js",
"module": "dist/esm/index.js",
"types": "dist/index.d.ts",
"files": [
"dist"
],
"license": "MIT",
"repository": {
"type": "git",
"url": "https://github.com/griseduardo/react-example-lib.git"
},
"scripts": {
"build": "rollup -c --bundleConfigAsCjs",
},
"devDependencies": {
"@eslint/js": "^9.19.0",
"@rollup/plugin-commonjs": "^28.0.2",
"@rollup/plugin-node-resolve": "^16.0.0",
"@rollup/plugin-terser": "^0.4.4",
"@rollup/plugin-typescript": "11.1.6",
"@types/react": "^19.0.8",
"eslint": "^9.19.0",
"eslint-plugin-react": "^7.37.4",
"prettier": "^3.4.2",
"react": "^19.0.0",
"react-dom": "^19.0.0",
"rollup": "^4.30.1",
"rollup-plugin-dts": "^6.1.1",
"rollup-plugin-peer-deps-external": "^2.2.4",
"styled-components": "^6.1.14",
"typescript": "^5.7.3",
"typescript-eslint": "^8.23.0"
},
"peerDependencies": {
"react": "^19.0.0",
"react-dom": "^19.0.0",
"styled-components": "^6.1.14"
}
}
Será adicionado scripts para garantir a padronização de código usando as regras definidas no arquivo de configuração do typescript-eslint, além disso vai ser mudada a versão para 0.2.0, uma vez que uma nova versão da lib será disponibilizada:
{
"name": "react-example-lib",
"version": "0.2.0",
"main": "dist/cjs/index.js",
"module": "dist/esm/index.js",
"types": "dist/index.d.ts",
"files": [
"dist"
],
"license": "MIT",
"repository": {
"type": "git",
"url": "https://github.com/griseduardo/react-example-lib.git"
},
"scripts": {
"build": "rollup -c --bundleConfigAsCjs",
"lint-src": "eslint src",
"lint-src-fix": "eslint src --fix",
"format-src": "prettier src --check",
"format-src-fix": "prettier src --write"
},
"devDependencies": {
"@eslint/js": "^9.19.0",
"@rollup/plugin-commonjs": "^28.0.2",
"@rollup/plugin-node-resolve": "^16.0.0",
"@rollup/plugin-terser": "^0.4.4",
"@rollup/plugin-typescript": "11.1.6",
"@types/react": "^19.0.8",
"eslint": "^9.19.0",
"eslint-plugin-react": "^7.37.4",
"prettier": "^3.4.2",
"react": "^19.0.0",
"react-dom": "^19.0.0",
"rollup": "^4.30.1",
"rollup-plugin-dts": "^6.1.1",
"rollup-plugin-peer-deps-external": "^2.2.4",
"styled-components": "^6.1.14",
"typescript": "^5.7.3",
"typescript-eslint": "^8.23.0"
},
"peerDependencies": {
"react": "^19.0.0",
"react-dom": "^19.0.0",
"styled-components": "^6.1.14"
}
}
- lint-src: vai verificar todos os arquivos dentro da pasta src (pois é onde está a definição dos componentes), seguindo as regras definidas no arquivo de configuração do typescript-eslint
- lint-src-fix: vai autocorrigir todos os arquivos dentro da pasta src, seguindo as regras definidas no arquivo de configuração do typescript-eslint
- format-src: vai verificar a formatação de todos os arquivos dentro da pasta src, seguindo as regras do prettier
- format-src-fix: vai autocorrigir a formatação de todos os arquivos dentro da pasta src, seguindo as regras do prettier
Arquivo CHANGELOG
No momento o CHANGELOG.md
está da forma abaixo:
## 0.1.0
_Jan. 29, 2025_
- initial config
Como uma nova versão será disponibilizada, será adicionado sobre o que foi modificado no arquivo:
## 0.2.0
_Fev. 24, 2025_
- setup typescript-eslint and prettier
- add custom rules
## 0.1.0
_Jan. 29, 2025_
- initial config
Estrutura de pastas
A estrutura de pastas está da seguinte forma, sendo que além da modificação de alguns arquivos, foi só adicionado dois arquivos de configuração na raiz:
Publicação nova versão
Primeiro passo a ser realizado é ver se a execução do rollup ocorre com sucesso. Para isso será executado o yarn build
no terminal, que foi definido em package.json
.
Executando com sucesso, é realizar a publicação da nova versão da lib: npm publish --access public
Conclusão
A ideia desse artigo foi adicionar regras de padronização de código para a lib de componentes que está sendo criada, usando typescript-eslint e prettier.
Segue o repositório no github e a lib no npmjs com as novas modificações.
Top comments (0)