/
ivanby
/
Compote
Обзор
Документация
Войти
/
ivanby
/
Compote
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
1
CI/CD
Аналитика
Безопасность
master
yaga/minify.js
238 строк
8 KB
Иван Быков
Initial commit
19 июн 2026, 08:50
19 июн 2026, 08:50
b4391e5
Код
Авторство
О чём код?
/* */ const toolName = 'minify -> '; //*** начало общий код для всех утилит const fs = require('node:fs'); const path = require('node:path'); const process = require('node:process'); const yaml = require('yaml'); let indicatorCurPos = 0; function indicator() { const indicatorChars = ['|', '/', '–', '\\']; if(indicatorCurPos < indicatorChars.length) indicatorCurPos++; if(indicatorCurPos >= indicatorChars.length) indicatorCurPos = 0; return indicatorChars[indicatorCurPos]; } const projectDir = process.cwd(); // доступен ли yaga.config.yaml const yagaConfigYamlPath = path.join( projectDir, 'yaga.config.yaml'); if (!fs.existsSync(yagaConfigYamlPath)) { console.log(toolName + '\x1b[31mПродолжение невозможно: отсутсвует yaga.config.yaml - ' + yagaConfigYamlPath + '\x1b[0m'); process.exit(1); } // читаем yaga.config.yaml let yagaConfigYaml = ''; try { yagaConfigYaml = fs.readFileSync( yagaConfigYamlPath , 'utf8'); } catch (err) { console.log(toolName + '\x1b[31mПродолжение невозможно: не могу прочитать yaga.config.yaml - ' + yagaConfigYamlPath + '\x1b[0m'); process.exit(1); } // парсим yaga.config.yaml let yagaConfig = ''; try { yagaConfig = yaml.parse(yagaConfigYaml); } catch (err) { console.log(toolName + '\x1b[31mПродолжение невозможно: не могу разобрать yaga.config.yaml - ' + yagaConfigYamlPath + '\x1b[0m'); console.log(err); process.exit(1); } // проверяем yagaConfig.target_dir if(!yagaConfig.target_dir || typeof yagaConfig.target_dir != 'string') { console.log(toolName + '\x1b[31mПродолжение невозможно: неверно указана целевая директория yagaConfig.target_dir - ' + yagaConfig.target_dir + '\x1b[0m'); process.exit(1); } const targetDirPath = path.join(projectDir, yagaConfig.target_dir); // проверяем yagaConfig.target_dir if(!fs.existsSync(targetDirPath)) { console.log(toolName + '\x1b[31mПродолжение невозможно: отсутсвует целевая директория yagaConfig.target_dir - ' + targetDirPath + '\x1b[0m'); process.exit(1); } //*** конец общий код для всех утилит // собственно код minify.js // проверяем yagaConfig.minify if( !yagaConfig.minify || !yagaConfig.minify.filter || !Array.isArray(yagaConfig.minify.filter) || !yagaConfig.minify.ignore || !Array.isArray(yagaConfig.minify.ignore) || !yagaConfig.minify.options || !yagaConfig.minify.options.js || !yagaConfig.minify.options.html ) { console.log(toolName + '\x1b[31mПродолжение невозможно: в ' + yagaConfigYamlPath + ' некорректно настроен ключ minify\x1b[0m'); process.exit(1); } let result; const BMN = {}; BMN.minify = require("babel-minify"); const babelMinify = { minify: (data)=>{ result = BMN.minify(data, yagaConfig.minify.options.js); if(result.error) throw result.error; else // тупорылая херня в бабеле, без спроса экранит не латиницу utf-8, // причем, чтобы это отключить или в сырцы лезть, или пресеты всего // бабеля конфить. // какому идиоту это надо по дефолту в 2025 году? // с другой стороны, кроме минификации полезна и какая-никакая обфускация return result.code.replace(/\\u([0-9a-fA-F]{4})/g, (match, hex) => { return String.fromCharCode(parseInt(hex, 16)); }); } }; const CCSS = new (require('clean-css'))({ inline: ['none'] // disables all inlining }); const cleanCSS = { minify: (data)=>{ result = CCSS.minify(data); if(result.errors && result.errors.length) throw result.errors; else return result.styles; } }; const HTMLM = require("html-minifier"); const htmlMinifier = { minify: (data)=>{ let opts = yagaConfig.minify.options.html; if(opts.minifyJS) minifyJS = babelMinify.minify; result = HTMLM.minify(data, opts); return result; } }; const jsonMinifier = { minify: (data)=>{ return JSON.stringify(JSON.parse(data)); } }; let srcFiles = []; function scanDir(dir) { fs.readdirSync(dir).forEach(file => { const absPath = path.join(dir, file); if (fs.statSync(absPath).isDirectory()) return scanDir(absPath); else { let cndf; for(let ref of yagaConfig.minify.filter) { try { cndf = (new RegExp(ref)).test(absPath); if(cndf) break; } catch (err) { console.log(toolName + '\x1b[31mПродолжение невозможно: в ' + yagaConfigYamlPath + ' неккоректно настроен ключ minify.filter\x1b[0m'); process.exit(1); } } if(cndf) { let cndi; for(let rei of yagaConfig.minify.ignore) { try { cndi = (new RegExp(rei)).test(absPath); if(cndi) break; } catch (err) { console.log(toolName + '\x1b[31mПродолжение невозможно: в ' + yagaConfigYamlPath + ' неккоректно настроен ключ minify.ignore\x1b[0m'); process.exit(1); } } if(!cndi) srcFiles.push(absPath); } } }); } scanDir(targetDirPath); let minifyNoti = toolName + 'Выполняю минификацию в ./' + yagaConfig.target_dir + ': '; process.stdout.write(minifyNoti); for(let file of srcFiles) { let fileArr = file.split('.'); let ext = fileArr[fileArr.length-1]; let method; switch (ext) { case 'js': method = babelMinify; break; case 'css': method = cleanCSS; break; case 'html': case 'tpl': case 'htm': method = htmlMinifier; break; case 'json': method = jsonMinifier; break; } if(!method) { console.log(); console.log(toolName + '\x1b[31mПродолжение невозможно: в ' + yagaConfigYamlPath + ' некорректно настроен ключ minify, неизвестный формат файла ' + ext + '\x1b[0m'); process.exit(1); } let rawFile; try { rawFile = fs.readFileSync( file , 'utf8'); } catch (err) { console.log(); console.log(toolName + '\x1b[31mПродолжение невозможно: не могу прочитать ' + file + '\x1b[0m'); console.log(err); process.exit(1); } let minFile; try { minFile = method.minify(rawFile); process.stdout.write('\b'); process.stdout.write(indicator()); } catch (err) { console.log(); console.log(toolName + '\x1b[31mПродолжение невозможно: ошибка во время попытки минификации ' + file + '\x1b[0m'); console.log(err); process.exit(1); } try { fs.writeFileSync( file , minFile, 'utf8'); } catch (err) { console.log(); console.log(toolName + '\x1b[31mПродолжение невозможно: не могу записать ' + file + '\x1b[0m'); console.log(err); process.exit(1); } } process.stdout.write('\b'); process.stdout.write('\x1b[32mготово\x1b[0m'); console.log();