Validação de Commits & Hooks de CI
Para manter a qualidade do código, a consistência de estilo e a segurança de tipos em todo o monorepo Elo Orgânico, utilizamos um fluxo automatizado que valida todas as alterações antes que elas sejam salvas localmente e antes de sofrerem merge na nuvem.
1. Arquitetura de Validação Local (Pre-commit)
Ao executar o comando git commit, o Git intercepta a ação automaticamente e executa um pipeline de validação local. Se qualquer etapa deste pipeline falhar, o commit é impedido.
A validação local executa em duas fases sequenciais:
2. Validação Seletiva de Tipos por Workspace
Rodar a checagem completa de tipos em todas as aplicações (pnpm typecheck) a cada commit pode ser lento. Para otimizar esse fluxo, desenvolvemos um script inteligente em precommit-typecheck.ts.
Como Funciona
- O script inspeciona os arquivos preparados na staging area usando o comando
git diff --cached --name-only. - Identifica as extensões: se nenhum arquivo de código (JavaScript ou TypeScript) foi alterado, ele pula a checagem de tipos inteiramente.
- Mapeia os arquivos modificados para seus respectivos pacotes do monorepo:
- Alterações em
instance/$\rightarrow$ typecheck de@elo-instance/*. - Alterações em
studio/$\rightarrow$ typecheck de@elo-organico/studio. - Alterações em
tools/$\rightarrow$ typecheck de@elo-organico/tools. - Alterações em
docs/$\rightarrow$ typecheck de@elo-organico/docs. - Alterações em
portal/$\rightarrow$ typecheck de@elo-portal/*.
- Alterações em
- Se arquivos de configuração global ou de raiz (como
package.json,eslint.config.ts,pnpm-workspace.yaml) forem alterados, o script executa um typecheck completo (excluindoportaltemporariamente). - Executa as validações filtradas em paralelo utilizando o Turborepo (ex:
npx turbo run typecheck --filter=@elo-instance/*).
Se você alterar apenas arquivos do workspace tools, somente o projeto tools será checado (levando menos de 1,5 segundos). Se alterar apenas documentação (arquivos .md ou .mdx), a tipagem é ignorada por completo.
3. Linter e Formatação (lint-staged)
Após o typecheck passar com sucesso, o Husky chama o lint-staged para analisar e formatar apenas os arquivos preparados para o commit.
Configuração
As regras de filtros estão declaradas no arquivo package.json raiz:
"lint-staged": {
"**/*.{js,mjs,ts,tsx}": [
"eslint --fix"
],
"**/*.{json,yaml,md,mdx}": [
"prettier --write"
]
}
Para arquivos de código JavaScript e TypeScript, não rodamos o Prettier como ferramenta separada. Ele é executado de forma embutida como uma regra do ESLint (eslint-plugin-prettier). Assim, o comando eslint --fix formata o arquivo conforme o .prettierrc.json e valida as regras de código de uma só vez.
4. Validação Remota (GitHub Actions CI)
Como os ganchos locais de commit podem ser burlados (usando a flag --no-verify), mantemos um workflow de Integração Contínua (CI) na nuvem que valida todas as branches em Pull Requests e pushes diretos.
O workflow de validação está configurado em .github/workflows/ci.yaml:
- Instala as dependências utilizando o
pnpm install --frozen-lockfile. - Valida a tipagem completa do monorepo:
pnpm typecheck --filter=!@elo-portal/*. - Valida o linter e o estilo de formatação:
pnpm lint --filter=!@elo-portal/*.
Administradores do repositório devem ativar regras de Branch Protection no GitHub para as branches main e develop. Marque a opção Require status checks to pass before merging e adicione a verificação Validate Types & Lint para bloquear merges de PRs que falharem na build.