Ready for Foundry 14 + release mode
This commit is contained in:
@@ -0,0 +1,93 @@
|
||||
// convert-all-entries.js
|
||||
// Traite tous les fichiers JSON du répertoire compendiums/
|
||||
// - Convertit entries[] en entries{}
|
||||
// - Ignore les fichiers déjà au bon format
|
||||
// - Sauvegarde l'ancien fichier en .OLD
|
||||
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const convertEntriesToObject = require('./convert-entries');
|
||||
|
||||
const COMPENDIUMS_DIR = path.join(__dirname, '..', 'compendiums');
|
||||
|
||||
function isAlreadyConverted(data) {
|
||||
// Vérifie si entries est déjà un objet (et non un tableau)
|
||||
return data.entries && typeof data.entries === 'object' && !Array.isArray(data.entries);
|
||||
}
|
||||
|
||||
function processFile(filePath) {
|
||||
const filename = path.basename(filePath);
|
||||
|
||||
try {
|
||||
// Lire le fichier
|
||||
const content = fs.readFileSync(filePath, 'utf8');
|
||||
const data = JSON.parse(content);
|
||||
|
||||
// Vérifier si déjà converti
|
||||
if (isAlreadyConverted(data)) {
|
||||
console.log(`⏭️ ${filename} - déjà au bon format, ignoré`);
|
||||
return false;
|
||||
}
|
||||
|
||||
// Vérifier qu'il y a bien un tableau entries
|
||||
if (!data.entries || !Array.isArray(data.entries)) {
|
||||
console.log(`⚠️ ${filename} - pas de tableau entries, ignoré`);
|
||||
return false;
|
||||
}
|
||||
|
||||
// Effectuer la conversion
|
||||
const converted = convertEntriesToObject(data);
|
||||
|
||||
// Sauvegarder l'ancien fichier en .OLD
|
||||
const backupPath = filePath + '.OLD';
|
||||
fs.renameSync(filePath, backupPath);
|
||||
|
||||
// Écrire le nouveau fichier
|
||||
fs.writeFileSync(filePath, JSON.stringify(converted, null, 2) + '\n', 'utf8');
|
||||
|
||||
console.log(`✅ ${filename} - converti`);
|
||||
return true;
|
||||
|
||||
} catch (error) {
|
||||
console.error(`❌ ${filename} - ERREUR: ${error.message}`);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
function main() {
|
||||
// Lister tous les fichiers JSON dans compendiums/
|
||||
const files = fs.readdirSync(COMPENDIUMS_DIR)
|
||||
.filter(f => f.endsWith('.json') && !f.endsWith('.OLD'))
|
||||
.map(f => path.join(COMPENDIUMS_DIR, f));
|
||||
|
||||
console.log(`Fichiers JSON trouvés: ${files.length}`);
|
||||
console.log('');
|
||||
|
||||
let convertedCount = 0;
|
||||
let ignoredCount = 0;
|
||||
let errorCount = 0;
|
||||
|
||||
for (const filePath of files) {
|
||||
const result = processFile(filePath);
|
||||
if (result === true) {
|
||||
convertedCount++;
|
||||
} else if (result === false) {
|
||||
ignoredCount++;
|
||||
} else {
|
||||
errorCount++;
|
||||
}
|
||||
}
|
||||
|
||||
console.log('');
|
||||
console.log(`Résumé:`);
|
||||
console.log(` - Convertis: ${convertedCount}`);
|
||||
console.log(` - Ignorés: ${ignoredCount}`);
|
||||
console.log(` - Erreurs: ${errorCount}`);
|
||||
}
|
||||
|
||||
// Exécuter si lancé directement
|
||||
if (require.main === module) {
|
||||
main();
|
||||
}
|
||||
|
||||
module.exports = { processFile, isAlreadyConverted, main };
|
||||
@@ -0,0 +1,72 @@
|
||||
// convert-entries.js
|
||||
// Script générique pour convertir un tableau "entries" en objet indexé par id
|
||||
|
||||
function convertEntriesToObject(jsonInput) {
|
||||
// Parse si c'est une string, sinon utiliser directement
|
||||
const data = typeof jsonInput === 'string' ? JSON.parse(jsonInput) : jsonInput;
|
||||
|
||||
if (!data || typeof data !== 'object') {
|
||||
throw new Error('Entrée invalide : doit être un objet ou un JSON valide');
|
||||
}
|
||||
|
||||
if (!data.entries || !Array.isArray(data.entries)) {
|
||||
throw new Error('L\'objet doit contenir une propriété "entries" qui est un tableau');
|
||||
}
|
||||
|
||||
// Conversion du tableau entries en objet
|
||||
const entriesObject = {};
|
||||
|
||||
for (const entry of data.entries) {
|
||||
if (!entry || typeof entry !== 'object') {
|
||||
console.warn('Entrée invalide dans le tableau, ignorée :', entry);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (entry.id === undefined || entry.id === null) {
|
||||
console.warn('Entrée sans ID, ignorée :', entry);
|
||||
continue;
|
||||
}
|
||||
|
||||
// Créer une copie sans le champ id
|
||||
const { id, ...rest } = entry;
|
||||
entriesObject[entry.id] = { ...rest };
|
||||
}
|
||||
|
||||
// Retourner un nouvel objet avec entries converti
|
||||
return {
|
||||
...data,
|
||||
entries: entriesObject
|
||||
};
|
||||
}
|
||||
|
||||
// Gestion des arguments en ligne de commande
|
||||
if (require.main === module) {
|
||||
const fs = require('fs');
|
||||
|
||||
// Lire depuis stdin ou argument
|
||||
let input;
|
||||
if (process.argv[2]) {
|
||||
// Premier argument = fichier ou JSON direct
|
||||
try {
|
||||
// Essayer de lire comme fichier
|
||||
input = fs.readFileSync(process.argv[2], 'utf8');
|
||||
} catch (e) {
|
||||
// Sinon traiter comme JSON string
|
||||
input = process.argv[2];
|
||||
}
|
||||
} else {
|
||||
// Lire depuis stdin
|
||||
input = fs.readFileSync(process.stdin.fd, 'utf8');
|
||||
}
|
||||
|
||||
try {
|
||||
const result = convertEntriesToObject(input);
|
||||
console.log(JSON.stringify(result, null, 2));
|
||||
} catch (error) {
|
||||
console.error('Erreur:', error.message);
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
// Exporter pour utilisation comme module
|
||||
module.exports = convertEntriesToObject;
|
||||
Reference in New Issue
Block a user