@dawans/promptshield
Version:
Secure your LLM stack with enterprise-grade RulePacks for AI safety scanning
127 lines (126 loc) • 3.98 kB
JavaScript
;
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;