- .env.example: полный шаблон, защита секретов - .gitignore: явное исключение .env.* и секретов - layout.tsx: XSS — заменён dangerouslySetInnerHTML на next/script для SW - ESLint: no-console error (allow warn/error), ignore scripts/ - scripts/remove-console-logs.js: очистка console.log без glob - backend/routes/modules: README с планом рефакторинга крупных файлов - SECURITY.md: гид по секретам, XSS, CORS, auth, линту - .husky/pre-commit: запуск npm run lint + прочие правки приложения и бэкенда Co-authored-by: Cursor <cursoragent@cursor.com>
38 lines
1.2 KiB
JavaScript
38 lines
1.2 KiB
JavaScript
#!/usr/bin/env node
|
||
/**
|
||
* Удаляет console.log и console.info из исходников (не трогает console.warn/error).
|
||
* Использование: node scripts/remove-console-logs.js
|
||
*/
|
||
const fs = require('fs');
|
||
const path = require('path');
|
||
|
||
function walkDir(dir, ext, callback) {
|
||
if (!fs.existsSync(dir)) return;
|
||
const list = fs.readdirSync(dir);
|
||
for (const name of list) {
|
||
const full = path.join(dir, name);
|
||
const stat = fs.statSync(full);
|
||
if (stat.isDirectory()) {
|
||
if (name !== 'node_modules' && name !== '.next' && name !== 'out') walkDir(full, ext, callback);
|
||
} else if (ext.some((e) => name.endsWith(e))) {
|
||
callback(full);
|
||
}
|
||
}
|
||
}
|
||
|
||
const exts = ['.js', '.jsx', '.ts', '.tsx'];
|
||
let total = 0;
|
||
|
||
walkDir(path.join(__dirname, '..'), exts, (file) => {
|
||
let content = fs.readFileSync(file, 'utf8');
|
||
const before = content;
|
||
// Удаляем строки с console.log( ... ); и console.info( ... );
|
||
content = content.replace(/^\s*console\.(log|info)\s*\([^)]*\)\s*;?\s*$/gm, '');
|
||
if (content !== before) {
|
||
fs.writeFileSync(file, content.trimEnd() + '\n');
|
||
total++;
|
||
}
|
||
});
|
||
|
||
console.log('Cleaned %d files', total);
|