Files
ESPDocs/scripts/verifica-pinos-restricoes.mjs
T
Lucas RayanandClaude Sonnet 5.5 fe1802f818
CI / Lint e auditorias (push) Successful in 48s
CI / Trivy (dependências e segredos) (push) Successful in 12s
CI / Imagem Docker (linux/arm64) (push) Successful in 3m41s
Release / Plano (reaproveitar a imagem?) (push) Successful in 6s
Release / ci (push) Skipped
Release / Publica a imagem (linux/arm64) (push) Successful in 16s
Release / Cria a release no Gitea (push) Successful in 6s
fix: book canonical, fr/de pin warnings, pin grouping per locale, SEO checks
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 23:58:11 -03:00

36 lines
2.2 KiB
JavaScript
Executable File

#!/usr/bin/env node
import fs from "node:fs";
const root=process.argv[2]||".";
// Confere que cada idioma agrupa os pinos restritos como o português (os padrões vêm do texto de cada idioma).
const src=fs.readFileSync(`${root}/components/PinRestrictions.jsx`,"utf8");
const LOCS={pt:"GRUPOS_PT",en:"GRUPOS_EN",es:"GRUPOS_ES",fr:"GRUPOS_FR",de:"GRUPOS_DE","zh-CN":"GRUPOS_ZH"};
function combinas(name){
const blk=src.match(new RegExp(`const ${name} = \\[([\\s\\S]*?)\\n\\];`))[1];
return blk.split(/\n\t\{\n/).slice(1).map(g=>{
const id=g.match(/id: "(\w+)"/)[1];
const m=g.match(/combina: ([\s\S]*?)\n\t\},?\s*$/)||g.match(/combina: ([\s\S]*?)\n\t\}/);
return {id,fn:eval(`(${m[1].replace(/,\s*$/,"")})`)};
});
}
const dir=(l)=>l==="pt"?`${root}/public/conexoes`:`${root}/data/${l}/conexoes`;
const chips=fs.readdirSync(dir("pt")).filter(f=>f.endsWith(".json")).map(f=>f.replace(".json",""));
const G={};for(const l in LOCS)G[l]=combinas(LOCS[l]);
function run(l,chip){
const pins=JSON.parse(fs.readFileSync(`${dir(l)}/${chip}.json`,"utf8"));
const res={};
for(const g of G[l]){res[g.id]=new Set();
pins.forEach((p,i)=>{ if(!["io","analog","dedicated"].includes(p.tipo))return;
const avisos=(p.avisos||[]).join(" ").toLowerCase(); const cats=p.categorias||[];
if(g.fn(avisos,cats)) res[g.id].add(i);});}
return {res,pins};
}
let bad=0;
for(const chip of chips){const ref=run("pt",chip).res;
for(const l in LOCS){ if(l==="pt")continue; const {res,pins}=run(l,chip);
for(const id in ref){const a=[...ref[id]].sort((x,y)=>x-y).join(),b=[...(res[id]||[])].sort((x,y)=>x-y).join();
if(a!==b){bad++;const falta=[...ref[id]].filter(i=>!res[id].has(i)),sobra=[...res[id]].filter(i=>!ref[id].has(i));
if(process.argv.includes("-v")) console.log(`${chip} ${l} ${id}: faltam ${falta.map(i=>pins[i].nome+":"+(pins[i].avisos||[]).join(" | ").slice(0,90))} | sobram ${sobra.map(i=>pins[i].nome)}`);
else console.log(`${chip} ${l} ${id}: faltam ${falta.length} sobram ${sobra.length}`);}}}}
console.log(bad===0?" ✔ Restrições de pinos: os 6 idiomas agrupam igual ao português.":` ✖ Restrições de pinos: ${bad} divergência(s) (rode com -v).`);
process.exit(bad?1:0);