import { writeFileSync, mkdirSync } from 'node:fs'; import { join } from 'node:path'; import got from 'got'; const BASE = 'https://raw.githubusercontent.com/enthec/webappanalyzer/main/src'; const LETRAS = ['_', ...'abcdefghijklmnopqrstuvwxyz'.split('')]; const DESTINO = join(process.cwd(), 'data', 'fingerprints'); async function baixarJson(url: string): Promise { try { return await got(url, { timeout: { request: 20000 } }).json(); } catch (erro) { console.warn(` aviso: falha em ${url} — ${(erro as Error).message}`); return undefined; } } async function main(): Promise { console.log('Baixando fingerprints do enthec/webappanalyzer…'); mkdirSync(DESTINO, { recursive: true }); const categorias = await baixarJson>(`${BASE}/categories.json`); if (categorias) { writeFileSync(join(DESTINO, 'categories.json'), JSON.stringify(categorias, null, 2)); console.log(` categorias: ${Object.keys(categorias).length}`); } const tecnologias: Record = {}; for (const letra of LETRAS) { const parte = await baixarJson>(`${BASE}/technologies/${letra}.json`); if (parte) Object.assign(tecnologias, parte); process.stdout.write(`\r tecnologias acumuladas: ${Object.keys(tecnologias).length} `); } process.stdout.write('\n'); if (Object.keys(tecnologias).length === 0) { console.error('Nenhuma tecnologia baixada — mantendo o dataset atual.'); process.exitCode = 1; return; } writeFileSync(join(DESTINO, 'technologies.json'), JSON.stringify(tecnologias, null, 2)); const meta = { fonte: 'enthec/webappanalyzer (MIT)', versao: 'atualizado via script', atualizadoEm: new Date().toISOString().slice(0, 10), totalTecnologias: Object.keys(tecnologias).length, }; writeFileSync(join(DESTINO, 'meta.json'), JSON.stringify(meta, null, 2)); console.log(`Concluído. ${meta.totalTecnologias} tecnologias gravadas em data/fingerprints.`); } main().catch((erro) => { console.error('Falha na atualização:', (erro as Error).message); process.exitCode = 1; });