import type { Modo, Observations, Report } from './types.js'; import { montarRelatorio } from '../report/model.js'; import { coletarHttp } from '../collectors/http.js'; import { coletarHtml } from '../collectors/html.js'; import { coletarAnatomia } from '../collectors/assets.js'; import { coletarDns } from '../collectors/dns.js'; import { coletarTls } from '../collectors/tls.js'; import { coletarProtocolo } from '../collectors/protocol.js'; import { coletarRobots } from '../collectors/robots.js'; export interface OpcoesAnalise { modo: Modo; lighthouse?: boolean; aoProgredir?: (etapa: string) => void; } function novaObservacao(url: string, modo: Modo): Observations { return { urlSolicitada: url, urlFinal: url, modo, redirecionamentos: [], headers: {}, cookies: [], html: '', meta: {}, scriptSrc: [], linksAssets: [], globaisJs: [], avisos: [], }; } export function normalizarUrl(entrada: string): string { const t = entrada.trim(); if (/^https?:\/\//i.test(t)) return t; return `https://${t}`; } export async function analisarSite(entrada: string, opcoes: OpcoesAnalise): Promise { const url = normalizarUrl(entrada); const obs = novaObservacao(url, opcoes.modo); const progresso = opcoes.aoProgredir ?? (() => {}); progresso('buscando a página'); const http = await coletarHttp(url, obs); if (http) { coletarHtml(obs); coletarAnatomia(obs); } progresso('inspecionando infraestrutura'); await Promise.all([coletarDns(obs), coletarTls(obs), coletarRobots(obs)]); coletarProtocolo(obs); if (opcoes.modo === 'completo') { progresso('abrindo em navegador headless'); try { const { coletarBrowser } = await import('../collectors/browser.js'); await coletarBrowser(obs, { lighthouse: opcoes.lighthouse ?? false, progresso }); coletarAnatomia(obs); } catch (erro) { obs.avisos.push(`Modo completo indisponível: ${(erro as Error).message}`); } } progresso('montando o relatório'); return montarRelatorio(obs); }