// Assicurati di avere "type": "module" nel package.json // oppure salva il file come .mjs import fs from "fs"; import path from "path"; const root = "./home/sites"; // cartella principale const outputFile = "./home/sites.json"; // file di output const iconsDir = "./home/icons"; // cartella dove salvare le icone const baseDir = "./home"; /** * Cancella un'icona dato il path relativo (es. "icons/composerize.ico") * @param {string} iconPath - Percorso relativo dell'icona rispetto a baseDir */ function deleteIconSync(iconPath) { try { const fullPath = path.join(baseDir, iconPath); fs.unlinkSync(fullPath); console.log(`Cancellato: ${fullPath}`); } catch (err) { if (err.code === "ENOENT") { console.error("File non trovato:", iconPath); } else { console.error("Errore durante la cancellazione:", err); } } } function parseSite(folder) { const sitePath = path.join(root, folder); let shortName = folder; // fallback let iconPath = null; // 1. Cerca manifest.json const manifestPath = path.join(sitePath, "manifest.json"); if (fs.existsSync(manifestPath)) { try { const manifest = JSON.parse(fs.readFileSync(manifestPath, "utf8")); if (manifest.short_name) shortName = manifest.short_name; if (manifest.icons && manifest.icons.length > 0) { iconPath = path.join(sitePath, manifest.icons[0].src); } } catch (e) {} } // 2. Se non c’è manifest, prova index.html const indexPath = path.join(sitePath, "index.html"); if (!iconPath && fs.existsSync(indexPath)) { const html = fs.readFileSync(indexPath, "utf8"); const titleMatch = html.match(/(.*?)<\/title>/i); if (titleMatch) shortName = titleMatch[1]; const iconMatch = html.match(/<link[^>]+rel=["']icon["'][^>]+href=["']([^"']+)["']/i); if (iconMatch) { iconPath = path.join(sitePath, iconMatch[1]); } } // 3. Fallback su favicon.ico const faviconPath = path.join(sitePath, "favicon.ico"); if (!iconPath && fs.existsSync(faviconPath)) { iconPath = faviconPath; } // 4. Copia l’icona nella cartella comune let finalIcon = "icons/default.png"; // path pulito if (iconPath && fs.existsSync(iconPath)) { const ext = path.extname(iconPath) || ".png"; const dest = path.join(iconsDir, `${folder}${ext}`); try { fs.copyFileSync(iconPath, dest); finalIcon = `icons/${folder}${ext}`; // solo riferimento relativo } catch (e) { console.error(`Errore copia icona per ${folder}:`, e); } } return { dir: folder, name: shortName, icon: finalIcon }; } export function generateSitesJson() { // crea la cartella icons se non esiste if (!fs.existsSync(iconsDir)) { fs.mkdirSync(iconsDir, { recursive: true }); } // Scansiona tutte le sottocartelle (escludendo home e icons) const sites = fs.readdirSync(root).filter(f => fs.statSync(path.join(root, f)).isDirectory() && f !== "home" && f !== "icons" ); console.log("leggo i siti:", sites); //console.log("primo sito", parseSite(sites[0])); // Estrarre info const results = sites.map(parseSite); // Salva in JSON fs.writeFileSync(outputFile, JSON.stringify(results, null, 2), "utf8"); results.unshift({ dir: 'home', name: 'Home', icon: 'home.ico' }); console.log(`✅ File JSON salvato in ${outputFile}`); return results; } // elimina dal file sites.json gli oggetti con dir = "a" export function delFieldDir(dir) { if (!fs.existsSync(outputFile)) { console.error("❌ File non trovato:", outputFile); return; } try { const data = fs.readFileSync(outputFile, "utf8"); const results = JSON.parse(data); const filt = results.filter(item => item.dir == dir); //console.log("icona da canc: ",filt); console.log("icona da canc: ",filt[0].icon); deleteIconSync(filt[0].icon); // filtra via gli elementi con directory = dir const filtered = results.filter(item => item.dir !== dir); //console.log("nuovo sites.json", filtered); fs.writeFileSync(outputFile, JSON.stringify(filtered, null, 2), "utf8"); console.log(`✅ File aggiornato: rimossi i campi con dir = ${dir}`); filtered.unshift({ dir: 'home', name: 'Home', icon: 'home.ico' }); return filtered; } catch (e) { console.error("Errore durante la modifica del file:", e); } } export function addFieldDir(dir) { if (!fs.existsSync(outputFile)) { console.error("❌ File non trovato:", outputFile); return; } try { const data = fs.readFileSync(outputFile, "utf8"); const results = JSON.parse(data); //console.log("sito agg",parseSite(dir)); // aggiungi elemonto elementi con directory = dir results.push(parseSite(dir)); //console.log("add site nuovo sites.json", results); //const filtered = results.filter(item => item.dir !== dir); //console.log("nuovo sites.json", filtered); fs.writeFileSync(outputFile, JSON.stringify(results, null, 2), "utf8"); results.unshift({ dir: 'home', name: 'Home', icon: 'home.ico' }); console.log(`✅ File aggiornato: rimossi i campi con dir = ${dir}`); return results; } catch (e) { console.error("Errore durante la modifica del file:", e); } }