import type { Detection, Observations } from '../core/types.js'; export function inferirArquitetura(deteccoes: Detection[], obs: Observations): string[] { const tem = (nome: string) => deteccoes.some((d) => d.nome === nome); const temCategoria = (cat: string) => deteccoes.some((d) => d.categorias.includes(cat)); const reais = deteccoes.filter((d) => d.evidencias.some((e) => e.fonte !== 'heuristica')); const cadeia: string[] = ['Navegador']; const nomesUsados = new Set(); const cdn = reais.find((d) => d.categorias.includes('CDN')); if (cdn) { cadeia.push(cdn.nome); nomesUsados.add(cdn.nome); } else if (obs.cdnAparente) { cadeia.push(obs.cdnAparente); nomesUsados.add(obs.cdnAparente); } const serverless = reais.find((d) => d.categorias.includes('PaaS')); const servidor = reais.find((d) => d.categorias.includes('Web servers')); if (servidor && !serverless) cadeia.push(`servidor web (${servidor.nome})`); else if (serverless && !nomesUsados.has(serverless.nome)) { cadeia.push(`plataforma serverless (${serverless.nome})`); } else if (obs.servidorAparente && !cdn) cadeia.push(`servidor (${obs.servidorAparente})`); const app = reais.find((d) => d.categorias.includes('CMS')) ?? reais.find((d) => d.categorias.includes('Ecommerce')) ?? reais.find((d) => d.categorias.includes('Web frameworks')); if (app) cadeia.push(app.nome); if (temCategoria('Databases') || tem('MySQL')) cadeia.push('banco de dados'); if (cadeia.length <= 2 && temCategoria('JavaScript frameworks')) { const fw = deteccoes.find((d) => d.categorias.includes('JavaScript frameworks')); if (fw) cadeia.push(`aplicação de página única (${fw.nome})`); } return cadeia; }