Files
ERitors-Scribe-Desktop/scripts/remove-inline-scripts.js
natreex b4eafca3bc Add comprehensive models and script for handling inline scripts and structured data
- Implement `remove-inline-scripts.js` to externalize Next.js inline scripts, enhancing CSP compliance.
- Add models for `Book`, `Character`, `Story`, `Editor`, `System`, and `BookSerie` with relevant properties and utilities.
- Include macOS entitlements plist for app development with advanced permissions.
- Add utility functions to handle script hashing, cookie management, and content formatting.
2025-11-16 19:56:14 -05:00

73 lines
2.7 KiB
JavaScript

// scripts/remove-inline-scripts.js
const {resolve} = require('path');
const {createHash} = require('crypto');
const {readFileSync, writeFileSync} = require('fs');
const glob = require('glob');
// Configuration - ajuste selon ton setup
const OUTPUT_DIR = 'out'; // Pour Next.js static export
const BASE_PATH = ''; // Ton basePath si tu en as un
const MAGIC_STRING = '__this_is_a_placeholder_for_the_inline_scripts__';
console.log('🔍 Recherche des fichiers HTML...');
const baseDir = resolve(OUTPUT_DIR);
const htmlFiles = glob.sync(`${baseDir}/**/*.html`);
console.log(`📄 Traitement de ${htmlFiles.length} fichiers HTML`);
htmlFiles.forEach((file) => {
console.log(`\n🔧 Traitement de ${file}`);
// Lire le fichier HTML
const contents = readFileSync(file).toString();
const scripts = [];
// Extraire tous les scripts inline (spécialement ceux avec self.__next_f)
const newFile = contents.replace(/<script>(.+?)<\/script>/gs, (match, scriptContent) => {
// Ne traiter que les scripts Next.js (self.__next_f)
if (scriptContent.includes('self.__next_f')) {
const addMagicString = scripts.length === 0;
scripts.push(`${scriptContent}${scriptContent.endsWith(';') ? '' : ';'}`);
return addMagicString ? MAGIC_STRING : '';
}
// Garder les autres scripts tels quels
return match;
});
// Si aucun script inline Next.js trouvé, passer au suivant
if (!scripts.length) {
console.log(' ✅ Aucun script inline Next.js trouvé');
return;
}
console.log(` 📦 ${scripts.length} scripts inline extraits`);
// Combiner tous les scripts et créer un hash
const combinedScript = scripts.join('\n');
const hash = createHash('md5').update(combinedScript).digest('hex').substring(0, 8);
// Créer le fichier JS externe
const jsFileName = `_next/static/chunks/inline-scripts.${hash}.js`;
const jsFilePath = resolve(baseDir, jsFileName);
// Créer le dossier si nécessaire
const {dirname} = require('path');
const {mkdirSync} = require('fs');
mkdirSync(dirname(jsFilePath), {recursive: true});
writeFileSync(jsFilePath, combinedScript);
console.log(` 💾 Script externe créé: ${jsFileName}`);
// Réécrire le fichier HTML avec la référence au script externe
const finalHtml = newFile.replace(
MAGIC_STRING,
`<script src="${BASE_PATH}${BASE_PATH.endsWith('/') ? '' : '/'}${jsFileName}" crossorigin=""></script>`
);
writeFileSync(file, finalHtml);
console.log(' ✅ HTML réécrit avec succès');
});
console.log('\n🎉 Traitement terminé ! Tous les scripts inline ont été externalisés.');
console.log('💡 Tu peux maintenant utiliser une CSP stricte sans \'unsafe-inline\'');