- 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.
73 lines
2.7 KiB
JavaScript
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\''); |