UNPKG

@dawans/promptshield

Version:

Secure your LLM stack with enterprise-grade RulePacks for AI safety scanning

127 lines (126 loc) 3.98 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.LoggerFactory = exports.NoOpLogger = exports.ConsoleLogger = exports.LogLevel = void 0; /** * Log levels */ var LogLevel; (function (LogLevel) { LogLevel[LogLevel["DEBUG"] = 0] = "DEBUG"; LogLevel[LogLevel["INFO"] = 1] = "INFO"; LogLevel[LogLevel["WARN"] = 2] = "WARN"; LogLevel[LogLevel["ERROR"] = 3] = "ERROR"; })(LogLevel || (exports.LogLevel = LogLevel = {})); /** * Console logger implementation */ class ConsoleLogger { constructor(level = LogLevel.INFO, options = {}) { this.level = level; this.options = options; } debug(message, context) { if (this.level <= LogLevel.DEBUG) { const formatted = this.format('DEBUG', message, context); console.debug(formatted); } } info(message, context) { if (this.level <= LogLevel.INFO) { const formatted = this.format('INFO', message, context); console.info(formatted); } } warn(message, context) { if (this.level <= LogLevel.WARN) { const formatted = this.format('WARN', message, context); console.warn(formatted); } } error(message, error, context) { if (this.level <= LogLevel.ERROR) { const formatted = this.format('ERROR', message, context); console.error(formatted); if (error && this.options.includeStackTrace) { console.error(error.stack); } } } format(level, message, context) { const timestamp = new Date().toISOString(); let formatted = `[${timestamp}] [${level}] ${message}`; if (context && Object.keys(context).length > 0) { formatted += ` ${JSON.stringify(context)}`; } return formatted; } } exports.ConsoleLogger = ConsoleLogger; /** * No-op logger for testing */ class NoOpLogger { debug(message, context) { // No-op implementation - format but don't output this.format('DEBUG', message, context); } info(message, context) { // No-op implementation - format but don't output this.format('INFO', message, context); } warn(message, context) { // No-op implementation - format but don't output this.format('WARN', message, context); } error(message, error, context) { // No-op implementation - format but don't output this.format('ERROR', message, context); // Also format error if provided if (error) { this.format('ERROR', error.message, { stack: error.stack }); } } format(level, message, context) { // Same formatting logic as ConsoleLogger but return instead of output const timestamp = new Date().toISOString(); let formatted = `[${timestamp}] [${level}] ${message}`; if (context && Object.keys(context).length > 0) { formatted += ` ${JSON.stringify(context)}`; } return formatted; } } exports.NoOpLogger = NoOpLogger; /** * Logger factory */ class LoggerFactory { static create(config) { if (!this.instance) { const level = this.parseLogLevel(config.level); this.instance = new ConsoleLogger(level, config.options); } return this.instance; } static getLogger() { if (!this.instance) { this.instance = new ConsoleLogger(); } return this.instance; } static parseLogLevel(level) { switch (level?.toUpperCase()) { case 'DEBUG': return LogLevel.DEBUG; case 'INFO': return LogLevel.INFO; case 'WARN': return LogLevel.WARN; case 'ERROR': return LogLevel.ERROR; default: return LogLevel.INFO; } } } exports.LoggerFactory = LoggerFactory;