blanc-logger
Version:
Advanced Winston logger for NestJS & TypeORM with structured logging.
79 lines (78 loc) • 2.73 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.addQueryAnalysis = exports.formatParameters = exports.sqlHighlighter = exports.indent = void 0;
const chalk = require("chalk");
/** 주어진 텍스트의 각 줄에 지정된 공백 수만큼 들여쓰기를 적용 */
const indent = (text, spaces = 4) => text
.split('\n')
.map((line) => ' '.repeat(spaces) + line)
.join('\n');
exports.indent = indent;
/** SQL 쿼리 문자열의 키워드, 숫자, 문자열 및 식별자에 색상 포맷을 적용하여 하이라이트 */
const sqlHighlighter = (sql) => {
const keywords = [
'SELECT',
'FROM',
'WHERE',
'JOIN',
'INNER JOIN',
'LEFT JOIN',
'RIGHT JOIN',
'FULL JOIN',
'INSERT',
'INTO',
'UPDATE',
'DELETE',
'CREATE',
'TABLE',
'INDEX',
'DROP',
'ORDER BY',
'GROUP BY',
'LIMIT',
'OFFSET',
'HAVING',
'VALUES',
'SET',
'EXPLAIN',
'AND',
'OR',
'AS',
'IN',
];
return sql
.split(/\b/)
.map((token) => {
const upperToken = token.toUpperCase();
if (keywords.includes(upperToken))
return chalk.blueBright.bold(token);
if (/^\d+(\.\d+)?$/.test(token))
return chalk.yellow(token);
if (/^'.*'$/.test(token) || /^".*"$/.test(token))
return chalk.green(token);
if (/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(token))
return chalk.hex('#4682B4')(token);
return token;
})
.join('');
};
exports.sqlHighlighter = sqlHighlighter;
/** SQL 쿼리의 파라미터 배열을 JSON 문자열로 변환하여 색상 포맷을 적용 */
const formatParameters = (params) => params.length > 0 ? chalk.hex('#2E8B57')(JSON.stringify(params)) : '';
exports.formatParameters = formatParameters;
/** SQL 쿼리를 분석하여 성능 이슈가 발생할 수 있는 부분에 대한 경고 메시지를 반환 */
const addQueryAnalysis = (query) => {
const warnings = [];
const simplified = query.toLowerCase().replace(/\s+/g, ' ');
if (simplified.includes('select *')) {
warnings.push(chalk.yellowBright('⚠️ Avoid SELECT * - specify columns explicitly'));
}
if (simplified.includes('join') && !simplified.includes(' on ')) {
warnings.push(chalk.redBright('❗ JOIN without ON clause detected'));
}
if (simplified.includes("like '%")) {
warnings.push(chalk.magentaBright('🚨 Leading % in LIKE can cause full table scan'));
}
return warnings.join('\n');
};
exports.addQueryAnalysis = addQueryAnalysis;