all repos — red-anatomia @ main

red-anatomia

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;
});