import { splitLines } from '../../../shared/helpers/index.js';
import { criarOcorrencia } from '../../../types/index.js';
export const detectorReactBestPractices = {
    nome: 'detector-react-best-practices',
    categoria: 'framework',
    descricao: 'Detecta más práticas em componentes React',
    test: (relPath) => /\.(jsx|tsx)$/i.test(relPath),
    aplicar: (src, relPath, _ast) => {
        if (!src)
            return [];
        const ocorrencias = [];
        const linhas = splitLines(src);
        linhas.forEach((linha, index) => {
            const numeroLinha = index + 1;
            if (/dangerouslySetInnerHTML/.test(linha)) {
                ocorrencias.push(criarOcorrencia({
                    tipo: 'react-dangerous-html',
                    nivel: 'erro',
                    mensagem: 'dangerouslySetInnerHTML detectado - risco de XSS',
                    relPath,
                    linha: numeroLinha,
                    sugestao: 'Use DOMPurify ou sanitize-html para sanitizar o conteúdo'
                }));
            }
            if (/onClick=|onSubmit=|onChange=|onMouseOver=/.test(linha) && /{[^}]*=>/.test(linha)) {
                ocorrencias.push(criarOcorrencia({
                    tipo: 'react-inline-handler',
                    nivel: 'info',
                    mensagem: 'Handler inline detectado - pode causar re-renders',
                    relPath,
                    linha: numeroLinha,
                    sugestao: 'Extraia o handler para uma função nomeada ou useCallback'
                }));
            }
            if (/key=\{.*(?:index|i|idx)\}/.test(linha)) {
                ocorrencias.push(criarOcorrencia({
                    tipo: 'react-index-as-key',
                    nivel: 'aviso',
                    mensagem: 'Índice usado como key - pode causar problemas de renderização',
                    relPath,
                    linha: numeroLinha,
                    sugestao: 'Use um ID único do item como key'
                }));
            }
            if (/componentWillMount|componentWillReceiveProps|componentWillUpdate/.test(linha)) {
                ocorrencias.push(criarOcorrencia({
                    tipo: 'react-deprecated-lifecycle',
                    nivel: 'aviso',
                    mensagem: 'Lifecycle method deprecated detectado',
                    relPath,
                    linha: numeroLinha,
                    sugestao: 'Use getDerivedStateFromProps ou componentDidUpdate'
                }));
            }
            if (/<img[^>]*>(?!.*alt=)/.test(linha) && !/aria-hidden/.test(linha)) {
                ocorrencias.push(criarOcorrencia({
                    tipo: 'react-img-without-alt',
                    nivel: 'aviso',
                    mensagem: 'Imagem sem atributo alt - problema de acessibilidade',
                    relPath,
                    linha: numeroLinha,
                    sugestao: 'Adicione alt descritivo ou aria-hidden="true" para imagens decorativas'
                }));
            }
        });
        return ocorrencias;
    }
};
//# sourceMappingURL=detector-react-best-practices.js.map