--- description: Otimizar código e documentar padrões de qualidade (estrutura, limites, JSDoc e tipagem) --- # Workflow: Qualidade e Documentação de Código ## 🎯 Objetivo Unificar as regras de **estrutura de arquivos**, **otimização** e **documentação** em um único fluxo de referência para o projeto `eli-vue`. --- ## 1️⃣ Limite de Linhas por Arquivo Nenhum arquivo `*.vue`, `*.ts` ou `*.tsx` pode ultrapassar **250 linhas**. Essa regra existe para facilitar a leitura humana, a revisão de código e a manutenção a longo prazo. > O script `scripts/check-vue-linhas.sh` valida automaticamente os arquivos `.vue` no `prebuild`. **Estratégias quando o limite se aproxima:** | Situação | Ação | |---|---| | Template longo | Extrair seções como subcomponentes | | CSS extenso | Mover para `.css` co-localizado | | `setup()` extenso | Extrair subcomponentes, CSS ou Dispatch Table | | Modal/Dialog embutido | Sempre em componente separado (`*Modal.vue`) | | Handlers e dispatch | Extrair para `handlers.ts` ou `dispatch.ts` | --- ## 2️⃣ Estrutura de Componentes Vue ### `defineComponent` obrigatório Todo componente Vue deve usar `defineComponent` para garantir inferência de tipos correta e consistência. ```vue ``` **Por que é importante:** - Inferência de tipos TypeScript correta dentro do componente - Reconhecimento por ferramentas de análise estática e IDEs - Compatível com Options API e Composition API com `setup()` - Padronização entre todos os componentes do projeto --- ### `setup()` não pode ser externo O `setup()` deve estar sempre dentro do componente `.vue`. Não é permitido extrair ou delegar o `setup` para nenhum arquivo externo. ```ts // ❌ Proibido — setup delegado inteiramente para arquivo externo // useEliTabela.ts export function useEliTabela(props, emit) { ... } // EliTabela.vue export default defineComponent({ setup(props, { emit }) { return useEliTabela(props, emit) // setup é apenas um proxy vazio } }) ``` ```ts // ✅ Correto — setup com lógica própria dentro do componente // EliTabela.vue export default defineComponent({ setup(props, { emit }) { const estado = ref(null) const carregar = async () => { ... } return { estado, carregar } } }) ``` > Composables `use*.ts` podem encapsular lógica reutilizável pontual (ex: `useFormatador`, `usePermissao`), mas nunca substituir ou esvaziar o `setup()` do componente. Se o componente ultrapassar 250 linhas, a solução é extrair subcomponentes, mover CSS ou usar Dispatch Table — não esvaziar o `setup`. --- ### Desassociação de CSS A separação de estilos em arquivo externo é permitida e recomendada quando o CSS contribui significativamente para o total de linhas. **Padrão de nomenclatura:** ``` MeuComponente.vue MeuComponente.css ``` O `.vue` importa o arquivo CSS no script: ```ts import './MeuComponente.css' ``` Ou via tag `