clean_arch_lint 1.0.0
clean_arch_lint: ^1.0.0 copied to clipboard
Custom lint rules for enforcing Clean Architecture boundaries in Flutter/Dart projects.
clean_arch_lint #
Lint customizado para Flutter Clean Architecture, focado em enforce de camadas usando análise estática (AST) com custom_lint.
Este package atua como um guardião da arquitetura: se uma camada depender de quem não deve, o erro aparece na hora.
🎯 Objetivo #
Garantir que a estrutura abaixo seja respeitada automaticamente:
lib/
├─ core/
├─ data/
└─ presentation/
Sem discussão em PR. Sem “foi sem querer”. O lint resolve.
🧱 Conceito das camadas #
core #
Camada pura, sem Flutter e sem infraestrutura.
Contém:
- entidades
- usecases
- contratos (interfaces)
- regras de negócio
data #
Implementações técnicas.
Contém:
- datasources
- models / DTOs
- mappers
- implementações de repositórios (
Impl)
presentation #
Interface do usuário.
Contém:
- widgets
- pages
- bloc / cubit
- viewmodels / controllers
🚨 Regras de lint #
1️⃣ core_no_flutter (ERROR) #
❌ Proíbe imports de Flutter no core.
Bloqueia:
package:flutter/*dart:uipackage:flutter_test/*
Motivo: Core precisa ser totalmente independente de UI.
2️⃣ core_no_data_or_presentation (ERROR) #
❌ Proíbe o core de depender de data ou presentation.
Regra de ouro da Clean Architecture:
Dependências sempre apontam para dentro.
3️⃣ data_no_presentation (ERROR) #
❌ data não pode importar nada de presentation.
Motivo:
- Evita acoplamento de infraestrutura com UI
- Garante testabilidade
4️⃣ presentation_no_data (WARNING configurável) #
⚠️ Por padrão, presentation não deve depender diretamente de data.
✔️ Usecases e contratos devem vir do core.
Essa regra pode ser configurada para ERROR.
📦 Instalação #
1) Adicione as dependências no app Flutter #
dev_dependencies:
custom_lint: ^0.8.1
clean_arch_lint:
path: ../clean_arch_lint
# Ou, quando publicado:
# clean_arch_lint: ^1.0.0
Ajuste o
pathconforme sua estrutura de repositórios.
2) Habilite o plugin no analysis_options.yaml #
analyzer:
plugins:
- custom_lint
▶️ Como rodar #
# Execução única
dart run custom_lint
# Modo watch (re-executa ao salvar arquivos)
dart run custom_lint --watch
No VSCode / Android Studio:
- Os erros aparecem automaticamente no editor
- Funciona em tempo real enquanto você digita
⚙️ Configuração #
Tornar presentation_no_data um ERROR #
custom_lint:
rules:
- presentation_no_data:
severity: error
Ignorar paths específicos (exemplo) #
custom_lint:
rules:
- core_no_flutter:
ignore:
- lib/core/di/**
Útil para casos muito específicos como bootstrap de DI.
✅ Exemplos #
Import permitido #
import 'package:my_app/core/usecases/get_user.dart';
Import proibido (core → flutter) #
import 'package:flutter/material.dart'; // ❌ erro
Import proibido (presentation → data) #
import 'package:my_app/data/user_repository_impl.dart'; // ⚠️ ou ❌
🧠 Boas práticas recomendadas #
- Interfaces sempre no
core - Implementações sempre no
data - UI depende apenas de abstrações
- Injeção de dependência resolve o resto
❌ O que este lint NÃO faz #
- Não gera código
- Não corrige automaticamente
- Não substitui code review
Ele apenas aponta o erro antes de virar dívida técnica.
🧩 Stack técnica #
- Dart SDK >= 3.0
- analyzer
- custom_lint_builder
- path
Sem build_runner. Sem source_gen.
🏁 Resumo rápido #
| Camada | Pode depender de |
|---|---|
| core | core apenas |
| data | core, data |
| presentation | core, presentation |
Se passar disso, o lint apita.
Arquitetura limpa não é opinião. É contrato.