scripts/update-fingerprints.ts (view raw)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
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<T>(url: string): Promise<T | undefined> {
try {
return await got(url, { timeout: { request: 20000 } }).json<T>();
} catch (erro) {
console.warn(` aviso: falha em ${url} — ${(erro as Error).message}`);
return undefined;
}
}
async function main(): Promise<void> {
console.log('Baixando fingerprints do enthec/webappanalyzer…');
mkdirSync(DESTINO, { recursive: true });
const categorias = await baixarJson<Record<string, unknown>>(`${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<string, unknown> = {};
for (const letra of LETRAS) {
const parte = await baixarJson<Record<string, unknown>>(`${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;
});
|