@x-oasis/log 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.cjs.production.min.js","sources":["../src/types.ts","../src/utils.ts","../src/logger.ts","../src/index.ts"],"sourcesContent":["/**\n * Log levels in order of severity\n */\nexport enum LogLevel {\n TRACE = 0,\n DEBUG = 1,\n INFO = 2,\n WARN = 3,\n ERROR = 4,\n SILENT = 5,\n}\n\n/**\n * Log entry data structure\n */\nexport interface LogEntry {\n level: LogLevel;\n message: string;\n timestamp: number;\n context?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n error?: Error;\n prefix?: string;\n}\n\n/**\n * Output handler function type\n */\nexport type OutputHandler = (entry: LogEntry) => void;\n\n/**\n * Logger configuration options\n */\nexport interface LoggerOptions {\n /**\n * Minimum log level to output (default: LogLevel.INFO)\n */\n level?: LogLevel | keyof typeof LogLevel;\n\n /**\n * Custom output handler (default: console)\n */\n handler?: OutputHandler;\n\n /**\n * Enable timestamps in log entries (default: true)\n */\n enableTimestamp?: boolean;\n\n /**\n * Default context that will be included in all logs\n */\n defaultContext?: Record<string, unknown>;\n\n /**\n * Default prefix for all log messages\n */\n defaultPrefix?: string;\n}\n\n/**\n * Chainable logger interface\n */\nexport interface LoggerChain {\n /**\n * Add context data that will be included in this log entry\n */\n withContext(context: Record<string, unknown>): LoggerChain;\n\n /**\n * Add metadata that will be included in this log entry\n */\n withMetadata(metadata: Record<string, unknown>): LoggerChain;\n\n /**\n * Add an error object to this log entry\n */\n withError(error: Error): LoggerChain;\n\n /**\n * Add a prefix to this log message\n */\n withPrefix(prefix: string): LoggerChain;\n\n /**\n * Log at trace level\n */\n trace(message: string): void;\n\n /**\n * Log at debug level\n */\n debug(message: string): void;\n\n /**\n * Log at info level\n */\n info(message: string): void;\n\n /**\n * Log at warn level\n */\n warn(message: string): void;\n\n /**\n * Log at error level\n */\n error(message: string): void;\n}\n","import { LogLevel, LogEntry } from './types';\n\n/**\n * Convert log level string to LogLevel enum\n */\nexport function parseLogLevel(\n level: LogLevel | keyof typeof LogLevel\n): LogLevel {\n if (typeof level === 'number') {\n return level;\n }\n return LogLevel[level] ?? LogLevel.INFO;\n}\n\n/**\n * Get log level name\n */\nexport function getLogLevelName(level: LogLevel): string {\n return LogLevel[level] ?? 'UNKNOWN';\n}\n\n/**\n * Default console output handler\n */\nexport function createConsoleHandler(): (entry: LogEntry) => void {\n const consoleMethods: Record<number, typeof console.log> = {\n [LogLevel.TRACE]: console.trace || console.debug,\n [LogLevel.DEBUG]: console.debug,\n [LogLevel.INFO]: console.info,\n [LogLevel.WARN]: console.warn,\n [LogLevel.ERROR]: console.error,\n };\n\n return (entry) => {\n const method = consoleMethods[entry.level] || console.log;\n const parts: unknown[] = [];\n\n // Add prefix if present\n if (entry.prefix) {\n parts.push(entry.prefix);\n }\n\n // Add message\n parts.push(entry.message);\n\n // Add context if present\n if (entry.context && Object.keys(entry.context).length > 0) {\n parts.push('\\nContext:', entry.context);\n }\n\n // Add metadata if present\n if (entry.metadata && Object.keys(entry.metadata).length > 0) {\n parts.push('\\nMetadata:', entry.metadata);\n }\n\n // Add error if present\n if (entry.error) {\n parts.push('\\nError:', entry.error);\n }\n\n method(...parts);\n };\n}\n","import {\n LogLevel,\n LogEntry,\n LoggerOptions,\n LoggerChain,\n OutputHandler,\n} from './types';\nimport { parseLogLevel, createConsoleHandler } from './utils';\n\n/**\n * Main Logger class\n */\nexport class Logger {\n private level: LogLevel;\n private handler: OutputHandler;\n private enableTimestamp: boolean;\n private defaultContext?: Record<string, unknown>;\n private defaultPrefix?: string;\n\n constructor(options: LoggerOptions = {}) {\n this.level = options.level ? parseLogLevel(options.level) : LogLevel.INFO;\n this.handler = options.handler || createConsoleHandler();\n this.enableTimestamp =\n options.enableTimestamp !== undefined ? options.enableTimestamp : true;\n this.defaultContext = options.defaultContext;\n this.defaultPrefix = options.defaultPrefix;\n }\n\n /**\n * Set the minimum log level\n */\n setLevel(level: LogLevel | keyof typeof LogLevel): void {\n this.level = parseLogLevel(level);\n }\n\n /**\n * Get the current log level\n */\n getLevel(): LogLevel {\n return this.level;\n }\n\n /**\n * Set a custom output handler\n */\n setHandler(handler: OutputHandler): void {\n this.handler = handler;\n }\n\n /**\n * Set default context that will be included in all logs\n */\n setDefaultContext(context: Record<string, unknown>): void {\n this.defaultContext = context;\n }\n\n /**\n * Set default prefix for all log messages\n */\n setDefaultPrefix(prefix: string): void {\n this.defaultPrefix = prefix;\n }\n\n /**\n * Create a chainable logger instance\n */\n chain(): LoggerChain {\n return new LoggerChainBuilder(this);\n }\n\n /**\n * Log at trace level\n */\n trace(message: string, context?: Record<string, unknown>): void {\n this.log(LogLevel.TRACE, message, context);\n }\n\n /**\n * Log at debug level\n */\n debug(message: string, context?: Record<string, unknown>): void {\n this.log(LogLevel.DEBUG, message, context);\n }\n\n /**\n * Log at info level\n */\n info(message: string, context?: Record<string, unknown>): void {\n this.log(LogLevel.INFO, message, context);\n }\n\n /**\n * Log at warn level\n */\n warn(message: string, context?: Record<string, unknown>): void {\n this.log(LogLevel.WARN, message, context);\n }\n\n /**\n * Log at error level\n */\n error(message: string, context?: Record<string, unknown>): void {\n this.log(LogLevel.ERROR, message, context);\n }\n\n /**\n * Internal log method\n */\n private log(\n level: LogLevel,\n message: string,\n context?: Record<string, unknown>\n ): void {\n if (level < this.level) {\n return;\n }\n\n const entry: LogEntry = {\n level,\n message,\n timestamp: this.enableTimestamp ? Date.now() : 0,\n prefix: this.defaultPrefix,\n };\n\n // Merge default context with provided context\n if (this.defaultContext || context) {\n entry.context = {\n ...this.defaultContext,\n ...context,\n };\n }\n\n this.handler(entry);\n }\n\n /**\n * Create a chainable logger with initial context\n */\n withContext(context: Record<string, unknown>): LoggerChain {\n return new LoggerChainBuilder(this).withContext(context);\n }\n\n /**\n * Create a chainable logger with initial prefix\n */\n withPrefix(prefix: string): LoggerChain {\n return new LoggerChainBuilder(this).withPrefix(prefix);\n }\n}\n\n/**\n * Chainable logger builder\n */\nclass LoggerChainBuilder implements LoggerChain {\n private logger: Logger;\n private context?: Record<string, unknown>;\n private metadata?: Record<string, unknown>;\n private errorObj?: Error;\n private prefix?: string;\n\n constructor(logger: Logger) {\n this.logger = logger;\n }\n\n withContext(context: Record<string, unknown>): LoggerChain {\n this.context = {\n ...this.context,\n ...context,\n };\n return this;\n }\n\n withMetadata(metadata: Record<string, unknown>): LoggerChain {\n this.metadata = {\n ...this.metadata,\n ...metadata,\n };\n return this;\n }\n\n withError(error: Error): LoggerChain {\n this.errorObj = error;\n return this;\n }\n\n withPrefix(prefix: string): LoggerChain {\n this.prefix = prefix;\n return this;\n }\n\n private createEntry(level: LogLevel, message: string): LogEntry {\n const entry: LogEntry = {\n level,\n message,\n timestamp: this.logger['enableTimestamp'] ? Date.now() : 0,\n prefix: this.prefix || this.logger['defaultPrefix'],\n };\n\n // Merge contexts\n const defaultContext = this.logger['defaultContext'];\n if (defaultContext || this.context) {\n entry.context = {\n ...defaultContext,\n ...this.context,\n };\n }\n\n if (this.metadata) {\n entry.metadata = this.metadata;\n }\n\n if (this.errorObj) {\n entry.error = this.errorObj;\n }\n\n return entry;\n }\n\n private log(level: LogLevel, message: string): void {\n if (level < this.logger.getLevel()) {\n return;\n }\n\n const entry = this.createEntry(level, message);\n this.logger['handler'](entry);\n }\n\n trace(message: string): void {\n this.log(LogLevel.TRACE, message);\n }\n\n debug(message: string): void {\n this.log(LogLevel.DEBUG, message);\n }\n\n info(message: string): void {\n this.log(LogLevel.INFO, message);\n }\n\n warn(message: string): void {\n this.log(LogLevel.WARN, message);\n }\n\n error(message: string): void {\n this.log(LogLevel.ERROR, message);\n }\n}\n","import { Logger } from './logger';\nimport { LogLevel } from './types';\n\nexport { Logger, LogLevel };\nexport type {\n LogEntry,\n LoggerOptions,\n LoggerChain,\n OutputHandler,\n} from './types';\n\n/**\n * Default logger instance\n */\nexport const defaultLogger = new Logger();\n\n/**\n * Convenience methods using the default logger\n */\nexport const log = {\n trace: (message: string, context?: Record<string, unknown>) =>\n defaultLogger.trace(message, context),\n debug: (message: string, context?: Record<string, unknown>) =>\n defaultLogger.debug(message, context),\n info: (message: string, context?: Record<string, unknown>) =>\n defaultLogger.info(message, context),\n warn: (message: string, context?: Record<string, unknown>) =>\n defaultLogger.warn(message, context),\n error: (message: string, context?: Record<string, unknown>) =>\n defaultLogger.error(message, context),\n setLevel: (level: LogLevel | keyof typeof LogLevel) =>\n defaultLogger.setLevel(level),\n withContext: (context: Record<string, unknown>) =>\n defaultLogger.withContext(context),\n withPrefix: (prefix: string) => defaultLogger.withPrefix(prefix),\n chain: () => defaultLogger.chain(),\n};\n\nexport default Logger;\n"],"names":["LogLevel","parseLogLevel","level","_LogLevel$level","INFO","Logger","options","consoleMethods","this","handler","_consoleMethods","TRACE","console","trace","debug","DEBUG","info","WARN","warn","ERROR","error","entry","method","log","parts","prefix","push","message","context","Object","keys","length","metadata","apply","enableTimestamp","undefined","defaultContext","defaultPrefix","_proto","prototype","setLevel","getLevel","setHandler","setDefaultContext","setDefaultPrefix","chain","LoggerChainBuilder","timestamp","Date","now","_extends","withContext","withPrefix","logger","_proto2","withMetadata","withError","errorObj","createEntry","defaultLogger"],"mappings":"gPAGA,IAAYA,WCEIC,EACdC,SAEA,MAAqB,iBAAVA,EACFA,SAETC,EAAOH,iBAASE,IAAMC,EAAIH,iBAASI,6DDRzBJ,EAAAA,mBAAAA,yCAEVA,qBACAA,mBACAA,mBACAA,qBACAA,2BEGWK,aAOX,SAAAA,EAAYC,GDFd,MAQQC,WCNMD,IAAAA,EAAyB,IACnCE,KAAKN,MAAQI,EAAQJ,MAAQD,EAAcK,EAAQJ,OAASF,iBAASI,KACrEI,KAAKC,QAAUH,EAAQG,WDILC,MACjBV,iBAASW,OAAQC,QAAQC,OAASD,QAAQE,MAAKJ,EAC/CV,iBAASe,OAAQH,QAAQE,MAAKJ,EAC9BV,iBAASI,MAAOQ,QAAQI,KAAIN,EAC5BV,iBAASiB,MAAOL,QAAQM,KAAIR,EAC5BV,iBAASmB,OAAQP,QAAQQ,MALtBb,EAK2BG,EAG1B,SAACW,GACN,IAAMC,EAASf,EAAec,EAAMnB,QAAUU,QAAQW,IAChDC,EAAmB,GAGrBH,EAAMI,QACRD,EAAME,KAAKL,EAAMI,QAInBD,EAAME,KAAKL,EAAMM,SAGbN,EAAMO,SAAWC,OAAOC,KAAKT,EAAMO,SAASG,OAAS,GACvDP,EAAME,KAAK,aAAcL,EAAMO,SAI7BP,EAAMW,UAAYH,OAAOC,KAAKT,EAAMW,UAAUD,OAAS,GACzDP,EAAME,KAAK,cAAeL,EAAMW,UAI9BX,EAAMD,OACRI,EAAME,KAAK,WAAYL,EAAMD,OAG/BE,EAAMW,aAAIT,KCtCVhB,KAAK0B,qBACyBC,IAA5B7B,EAAQ4B,iBAAgC5B,EAAQ4B,gBAClD1B,KAAK4B,eAAiB9B,EAAQ8B,eAC9B5B,KAAK6B,cAAgB/B,EAAQ+B,cAC9B,IAAAC,EAAAjC,EAAAkC,UAyHA,OAzHAD,EAKDE,SAAA,SAAStC,GACPM,KAAKN,MAAQD,EAAcC,IAC5BoC,EAKDG,SAAA,WACE,OAAOjC,KAAKN,OACboC,EAKDI,WAAA,SAAWjC,GACTD,KAAKC,QAAUA,GAChB6B,EAKDK,kBAAA,SAAkBf,GAChBpB,KAAK4B,eAAiBR,GACvBU,EAKDM,iBAAA,SAAiBnB,GACfjB,KAAK6B,cAAgBZ,GACtBa,EAKDO,MAAA,WACE,OAAO,IAAIC,EAAmBtC,OAC/B8B,EAKDzB,MAAA,SAAMc,EAAiBC,GACrBpB,KAAKe,IAAIvB,iBAASW,MAAOgB,EAASC,IACnCU,EAKDxB,MAAA,SAAMa,EAAiBC,GACrBpB,KAAKe,IAAIvB,iBAASe,MAAOY,EAASC,IACnCU,EAKDtB,KAAA,SAAKW,EAAiBC,GACpBpB,KAAKe,IAAIvB,iBAASI,KAAMuB,EAASC,IAClCU,EAKDpB,KAAA,SAAKS,EAAiBC,GACpBpB,KAAKe,IAAIvB,iBAASiB,KAAMU,EAASC,IAClCU,EAKDlB,MAAA,SAAMO,EAAiBC,GACrBpB,KAAKe,IAAIvB,iBAASmB,MAAOQ,EAASC,IACnCU,EAKOf,IAAA,SACNrB,EACAyB,EACAC,GAEA,KAAI1B,EAAQM,KAAKN,OAAjB,CAIA,IAAMmB,EAAkB,CACtBnB,MAAAA,EACAyB,QAAAA,EACAoB,UAAWvC,KAAK0B,gBAAkBc,KAAKC,MAAQ,EAC/CxB,OAAQjB,KAAK6B,gBAIX7B,KAAK4B,gBAAkBR,KACzBP,EAAMO,QAAOsB,KACR1C,KAAK4B,eACLR,IAIPpB,KAAKC,QAAQY,KACdiB,EAKDa,YAAA,SAAYvB,GACV,OAAO,IAAIkB,EAAmBtC,MAAM2C,YAAYvB,IACjDU,EAKDc,WAAA,SAAW3B,GACT,OAAO,IAAIqB,EAAmBtC,MAAM4C,WAAW3B,IAChDpB,KAMGyC,aAOJ,SAAAA,EAAYO,GACV7C,KAAK6C,OAASA,EACf,IAAAC,EAAAR,EAAAP,UAmFA,OAnFAe,EAEDH,YAAA,SAAYvB,GAKV,OAJApB,KAAKoB,QAAOsB,KACP1C,KAAKoB,QACLA,GAEEpB,MACR8C,EAEDC,aAAA,SAAavB,GAKX,OAJAxB,KAAKwB,SAAQkB,KACR1C,KAAKwB,SACLA,GAEExB,MACR8C,EAEDE,UAAA,SAAUpC,GAER,OADAZ,KAAKiD,SAAWrC,EACTZ,MACR8C,EAEDF,WAAA,SAAW3B,GAET,OADAjB,KAAKiB,OAASA,EACPjB,MACR8C,EAEOI,YAAA,SAAYxD,EAAiByB,GACnC,IAAMN,EAAkB,CACtBnB,MAAAA,EACAyB,QAAAA,EACAoB,UAAWvC,KAAK6C,OAAwB,gBAAIL,KAAKC,MAAQ,EACzDxB,OAAQjB,KAAKiB,QAAUjB,KAAK6C,OAAsB,eAI9CjB,EAAiB5B,KAAK6C,OAAuB,eAgBnD,OAfIjB,GAAkB5B,KAAKoB,WACzBP,EAAMO,QAAOsB,KACRd,EACA5B,KAAKoB,UAIRpB,KAAKwB,WACPX,EAAMW,SAAWxB,KAAKwB,UAGpBxB,KAAKiD,WACPpC,EAAMD,MAAQZ,KAAKiD,UAGdpC,GACRiC,EAEO/B,IAAA,SAAIrB,EAAiByB,GAC3B,KAAIzB,EAAQM,KAAK6C,OAAOZ,YAAxB,CAIA,IAAMpB,EAAQb,KAAKkD,YAAYxD,EAAOyB,GACtCnB,KAAK6C,OAAgB,QAAEhC,KACxBiC,EAEDzC,MAAA,SAAMc,GACJnB,KAAKe,IAAIvB,iBAASW,MAAOgB,IAC1B2B,EAEDxC,MAAA,SAAMa,GACJnB,KAAKe,IAAIvB,iBAASe,MAAOY,IAC1B2B,EAEDtC,KAAA,SAAKW,GACHnB,KAAKe,IAAIvB,iBAASI,KAAMuB,IACzB2B,EAEDpC,KAAA,SAAKS,GACHnB,KAAKe,IAAIvB,iBAASiB,KAAMU,IACzB2B,EAEDlC,MAAA,SAAMO,GACJnB,KAAKe,IAAIvB,iBAASmB,MAAOQ,IAC1BmB,KCvOUa,EAAgB,IAAItD,EAKpBkB,EAAM,CACjBV,MAAO,SAACc,EAAiBC,GAAiC,OACxD+B,EAAc9C,MAAMc,EAASC,IAC/Bd,MAAO,SAACa,EAAiBC,GAAiC,OACxD+B,EAAc7C,MAAMa,EAASC,IAC/BZ,KAAM,SAACW,EAAiBC,GAAiC,OACvD+B,EAAc3C,KAAKW,EAASC,IAC9BV,KAAM,SAACS,EAAiBC,GAAiC,OACvD+B,EAAczC,KAAKS,EAASC,IAC9BR,MAAO,SAACO,EAAiBC,GAAiC,OACxD+B,EAAcvC,MAAMO,EAASC,IAC/BY,SAAU,SAACtC,GAAuC,OAChDyD,EAAcnB,SAAStC,IACzBiD,YAAa,SAACvB,GAAgC,OAC5C+B,EAAcR,YAAYvB,IAC5BwB,WAAY,SAAC3B,GAAc,OAAKkC,EAAcP,WAAW3B,IACzDoB,MAAO,WAAA,OAAMc,EAAcd"}
@@ -0,0 +1,222 @@
1
+ function _extends() {
2
+ _extends = Object.assign ? Object.assign.bind() : function (target) {
3
+ for (var i = 1; i < arguments.length; i++) {
4
+ var source = arguments[i];
5
+ for (var key in source) {
6
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
7
+ target[key] = source[key];
8
+ }
9
+ }
10
+ }
11
+ return target;
12
+ };
13
+ return _extends.apply(this, arguments);
14
+ }
15
+
16
+ var LogLevel;
17
+ (function (LogLevel) {
18
+ LogLevel[LogLevel["TRACE"] = 0] = "TRACE";
19
+ LogLevel[LogLevel["DEBUG"] = 1] = "DEBUG";
20
+ LogLevel[LogLevel["INFO"] = 2] = "INFO";
21
+ LogLevel[LogLevel["WARN"] = 3] = "WARN";
22
+ LogLevel[LogLevel["ERROR"] = 4] = "ERROR";
23
+ LogLevel[LogLevel["SILENT"] = 5] = "SILENT";
24
+ })(LogLevel || (LogLevel = {}));
25
+
26
+ function parseLogLevel(level) {
27
+ var _LogLevel$level;
28
+ if (typeof level === 'number') {
29
+ return level;
30
+ }
31
+ return (_LogLevel$level = LogLevel[level]) != null ? _LogLevel$level : LogLevel.INFO;
32
+ }
33
+ function createConsoleHandler() {
34
+ var _consoleMethods;
35
+ var consoleMethods = (_consoleMethods = {}, _consoleMethods[LogLevel.TRACE] = console.trace || console.debug, _consoleMethods[LogLevel.DEBUG] = console.debug, _consoleMethods[LogLevel.INFO] = console.info, _consoleMethods[LogLevel.WARN] = console.warn, _consoleMethods[LogLevel.ERROR] = console.error, _consoleMethods);
36
+ return function (entry) {
37
+ var method = consoleMethods[entry.level] || console.log;
38
+ var parts = [];
39
+ if (entry.prefix) {
40
+ parts.push(entry.prefix);
41
+ }
42
+ parts.push(entry.message);
43
+ if (entry.context && Object.keys(entry.context).length > 0) {
44
+ parts.push('\nContext:', entry.context);
45
+ }
46
+ if (entry.metadata && Object.keys(entry.metadata).length > 0) {
47
+ parts.push('\nMetadata:', entry.metadata);
48
+ }
49
+ if (entry.error) {
50
+ parts.push('\nError:', entry.error);
51
+ }
52
+ method.apply(void 0, parts);
53
+ };
54
+ }
55
+
56
+ var Logger = /*#__PURE__*/function () {
57
+ function Logger(options) {
58
+ if (options === void 0) {
59
+ options = {};
60
+ }
61
+ this.level = options.level ? parseLogLevel(options.level) : LogLevel.INFO;
62
+ this.handler = options.handler || createConsoleHandler();
63
+ this.enableTimestamp = options.enableTimestamp !== undefined ? options.enableTimestamp : true;
64
+ this.defaultContext = options.defaultContext;
65
+ this.defaultPrefix = options.defaultPrefix;
66
+ }
67
+ var _proto = Logger.prototype;
68
+ _proto.setLevel = function setLevel(level) {
69
+ this.level = parseLogLevel(level);
70
+ };
71
+ _proto.getLevel = function getLevel() {
72
+ return this.level;
73
+ };
74
+ _proto.setHandler = function setHandler(handler) {
75
+ this.handler = handler;
76
+ };
77
+ _proto.setDefaultContext = function setDefaultContext(context) {
78
+ this.defaultContext = context;
79
+ };
80
+ _proto.setDefaultPrefix = function setDefaultPrefix(prefix) {
81
+ this.defaultPrefix = prefix;
82
+ };
83
+ _proto.chain = function chain() {
84
+ return new LoggerChainBuilder(this);
85
+ };
86
+ _proto.trace = function trace(message, context) {
87
+ this.log(LogLevel.TRACE, message, context);
88
+ };
89
+ _proto.debug = function debug(message, context) {
90
+ this.log(LogLevel.DEBUG, message, context);
91
+ };
92
+ _proto.info = function info(message, context) {
93
+ this.log(LogLevel.INFO, message, context);
94
+ };
95
+ _proto.warn = function warn(message, context) {
96
+ this.log(LogLevel.WARN, message, context);
97
+ };
98
+ _proto.error = function error(message, context) {
99
+ this.log(LogLevel.ERROR, message, context);
100
+ };
101
+ _proto.log = function log(level, message, context) {
102
+ if (level < this.level) {
103
+ return;
104
+ }
105
+ var entry = {
106
+ level: level,
107
+ message: message,
108
+ timestamp: this.enableTimestamp ? Date.now() : 0,
109
+ prefix: this.defaultPrefix
110
+ };
111
+ if (this.defaultContext || context) {
112
+ entry.context = _extends({}, this.defaultContext, context);
113
+ }
114
+ this.handler(entry);
115
+ };
116
+ _proto.withContext = function withContext(context) {
117
+ return new LoggerChainBuilder(this).withContext(context);
118
+ };
119
+ _proto.withPrefix = function withPrefix(prefix) {
120
+ return new LoggerChainBuilder(this).withPrefix(prefix);
121
+ };
122
+ return Logger;
123
+ }();
124
+ var LoggerChainBuilder = /*#__PURE__*/function () {
125
+ function LoggerChainBuilder(logger) {
126
+ this.logger = logger;
127
+ }
128
+ var _proto2 = LoggerChainBuilder.prototype;
129
+ _proto2.withContext = function withContext(context) {
130
+ this.context = _extends({}, this.context, context);
131
+ return this;
132
+ };
133
+ _proto2.withMetadata = function withMetadata(metadata) {
134
+ this.metadata = _extends({}, this.metadata, metadata);
135
+ return this;
136
+ };
137
+ _proto2.withError = function withError(error) {
138
+ this.errorObj = error;
139
+ return this;
140
+ };
141
+ _proto2.withPrefix = function withPrefix(prefix) {
142
+ this.prefix = prefix;
143
+ return this;
144
+ };
145
+ _proto2.createEntry = function createEntry(level, message) {
146
+ var entry = {
147
+ level: level,
148
+ message: message,
149
+ timestamp: this.logger['enableTimestamp'] ? Date.now() : 0,
150
+ prefix: this.prefix || this.logger['defaultPrefix']
151
+ };
152
+ var defaultContext = this.logger['defaultContext'];
153
+ if (defaultContext || this.context) {
154
+ entry.context = _extends({}, defaultContext, this.context);
155
+ }
156
+ if (this.metadata) {
157
+ entry.metadata = this.metadata;
158
+ }
159
+ if (this.errorObj) {
160
+ entry.error = this.errorObj;
161
+ }
162
+ return entry;
163
+ };
164
+ _proto2.log = function log(level, message) {
165
+ if (level < this.logger.getLevel()) {
166
+ return;
167
+ }
168
+ var entry = this.createEntry(level, message);
169
+ this.logger['handler'](entry);
170
+ };
171
+ _proto2.trace = function trace(message) {
172
+ this.log(LogLevel.TRACE, message);
173
+ };
174
+ _proto2.debug = function debug(message) {
175
+ this.log(LogLevel.DEBUG, message);
176
+ };
177
+ _proto2.info = function info(message) {
178
+ this.log(LogLevel.INFO, message);
179
+ };
180
+ _proto2.warn = function warn(message) {
181
+ this.log(LogLevel.WARN, message);
182
+ };
183
+ _proto2.error = function error(message) {
184
+ this.log(LogLevel.ERROR, message);
185
+ };
186
+ return LoggerChainBuilder;
187
+ }();
188
+
189
+ var defaultLogger = /*#__PURE__*/new Logger();
190
+ var log = {
191
+ trace: function trace(message, context) {
192
+ return defaultLogger.trace(message, context);
193
+ },
194
+ debug: function debug(message, context) {
195
+ return defaultLogger.debug(message, context);
196
+ },
197
+ info: function info(message, context) {
198
+ return defaultLogger.info(message, context);
199
+ },
200
+ warn: function warn(message, context) {
201
+ return defaultLogger.warn(message, context);
202
+ },
203
+ error: function error(message, context) {
204
+ return defaultLogger.error(message, context);
205
+ },
206
+ setLevel: function setLevel(level) {
207
+ return defaultLogger.setLevel(level);
208
+ },
209
+ withContext: function withContext(context) {
210
+ return defaultLogger.withContext(context);
211
+ },
212
+ withPrefix: function withPrefix(prefix) {
213
+ return defaultLogger.withPrefix(prefix);
214
+ },
215
+ chain: function chain() {
216
+ return defaultLogger.chain();
217
+ }
218
+ };
219
+
220
+ export default Logger;
221
+ export { LogLevel, Logger, defaultLogger, log };
222
+ //# sourceMappingURL=log.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.esm.js","sources":["../src/types.ts","../src/utils.ts","../src/logger.ts","../src/index.ts"],"sourcesContent":["/**\n * Log levels in order of severity\n */\nexport enum LogLevel {\n TRACE = 0,\n DEBUG = 1,\n INFO = 2,\n WARN = 3,\n ERROR = 4,\n SILENT = 5,\n}\n\n/**\n * Log entry data structure\n */\nexport interface LogEntry {\n level: LogLevel;\n message: string;\n timestamp: number;\n context?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n error?: Error;\n prefix?: string;\n}\n\n/**\n * Output handler function type\n */\nexport type OutputHandler = (entry: LogEntry) => void;\n\n/**\n * Logger configuration options\n */\nexport interface LoggerOptions {\n /**\n * Minimum log level to output (default: LogLevel.INFO)\n */\n level?: LogLevel | keyof typeof LogLevel;\n\n /**\n * Custom output handler (default: console)\n */\n handler?: OutputHandler;\n\n /**\n * Enable timestamps in log entries (default: true)\n */\n enableTimestamp?: boolean;\n\n /**\n * Default context that will be included in all logs\n */\n defaultContext?: Record<string, unknown>;\n\n /**\n * Default prefix for all log messages\n */\n defaultPrefix?: string;\n}\n\n/**\n * Chainable logger interface\n */\nexport interface LoggerChain {\n /**\n * Add context data that will be included in this log entry\n */\n withContext(context: Record<string, unknown>): LoggerChain;\n\n /**\n * Add metadata that will be included in this log entry\n */\n withMetadata(metadata: Record<string, unknown>): LoggerChain;\n\n /**\n * Add an error object to this log entry\n */\n withError(error: Error): LoggerChain;\n\n /**\n * Add a prefix to this log message\n */\n withPrefix(prefix: string): LoggerChain;\n\n /**\n * Log at trace level\n */\n trace(message: string): void;\n\n /**\n * Log at debug level\n */\n debug(message: string): void;\n\n /**\n * Log at info level\n */\n info(message: string): void;\n\n /**\n * Log at warn level\n */\n warn(message: string): void;\n\n /**\n * Log at error level\n */\n error(message: string): void;\n}\n","import { LogLevel, LogEntry } from './types';\n\n/**\n * Convert log level string to LogLevel enum\n */\nexport function parseLogLevel(\n level: LogLevel | keyof typeof LogLevel\n): LogLevel {\n if (typeof level === 'number') {\n return level;\n }\n return LogLevel[level] ?? LogLevel.INFO;\n}\n\n/**\n * Get log level name\n */\nexport function getLogLevelName(level: LogLevel): string {\n return LogLevel[level] ?? 'UNKNOWN';\n}\n\n/**\n * Default console output handler\n */\nexport function createConsoleHandler(): (entry: LogEntry) => void {\n const consoleMethods: Record<number, typeof console.log> = {\n [LogLevel.TRACE]: console.trace || console.debug,\n [LogLevel.DEBUG]: console.debug,\n [LogLevel.INFO]: console.info,\n [LogLevel.WARN]: console.warn,\n [LogLevel.ERROR]: console.error,\n };\n\n return (entry) => {\n const method = consoleMethods[entry.level] || console.log;\n const parts: unknown[] = [];\n\n // Add prefix if present\n if (entry.prefix) {\n parts.push(entry.prefix);\n }\n\n // Add message\n parts.push(entry.message);\n\n // Add context if present\n if (entry.context && Object.keys(entry.context).length > 0) {\n parts.push('\\nContext:', entry.context);\n }\n\n // Add metadata if present\n if (entry.metadata && Object.keys(entry.metadata).length > 0) {\n parts.push('\\nMetadata:', entry.metadata);\n }\n\n // Add error if present\n if (entry.error) {\n parts.push('\\nError:', entry.error);\n }\n\n method(...parts);\n };\n}\n","import {\n LogLevel,\n LogEntry,\n LoggerOptions,\n LoggerChain,\n OutputHandler,\n} from './types';\nimport { parseLogLevel, createConsoleHandler } from './utils';\n\n/**\n * Main Logger class\n */\nexport class Logger {\n private level: LogLevel;\n private handler: OutputHandler;\n private enableTimestamp: boolean;\n private defaultContext?: Record<string, unknown>;\n private defaultPrefix?: string;\n\n constructor(options: LoggerOptions = {}) {\n this.level = options.level ? parseLogLevel(options.level) : LogLevel.INFO;\n this.handler = options.handler || createConsoleHandler();\n this.enableTimestamp =\n options.enableTimestamp !== undefined ? options.enableTimestamp : true;\n this.defaultContext = options.defaultContext;\n this.defaultPrefix = options.defaultPrefix;\n }\n\n /**\n * Set the minimum log level\n */\n setLevel(level: LogLevel | keyof typeof LogLevel): void {\n this.level = parseLogLevel(level);\n }\n\n /**\n * Get the current log level\n */\n getLevel(): LogLevel {\n return this.level;\n }\n\n /**\n * Set a custom output handler\n */\n setHandler(handler: OutputHandler): void {\n this.handler = handler;\n }\n\n /**\n * Set default context that will be included in all logs\n */\n setDefaultContext(context: Record<string, unknown>): void {\n this.defaultContext = context;\n }\n\n /**\n * Set default prefix for all log messages\n */\n setDefaultPrefix(prefix: string): void {\n this.defaultPrefix = prefix;\n }\n\n /**\n * Create a chainable logger instance\n */\n chain(): LoggerChain {\n return new LoggerChainBuilder(this);\n }\n\n /**\n * Log at trace level\n */\n trace(message: string, context?: Record<string, unknown>): void {\n this.log(LogLevel.TRACE, message, context);\n }\n\n /**\n * Log at debug level\n */\n debug(message: string, context?: Record<string, unknown>): void {\n this.log(LogLevel.DEBUG, message, context);\n }\n\n /**\n * Log at info level\n */\n info(message: string, context?: Record<string, unknown>): void {\n this.log(LogLevel.INFO, message, context);\n }\n\n /**\n * Log at warn level\n */\n warn(message: string, context?: Record<string, unknown>): void {\n this.log(LogLevel.WARN, message, context);\n }\n\n /**\n * Log at error level\n */\n error(message: string, context?: Record<string, unknown>): void {\n this.log(LogLevel.ERROR, message, context);\n }\n\n /**\n * Internal log method\n */\n private log(\n level: LogLevel,\n message: string,\n context?: Record<string, unknown>\n ): void {\n if (level < this.level) {\n return;\n }\n\n const entry: LogEntry = {\n level,\n message,\n timestamp: this.enableTimestamp ? Date.now() : 0,\n prefix: this.defaultPrefix,\n };\n\n // Merge default context with provided context\n if (this.defaultContext || context) {\n entry.context = {\n ...this.defaultContext,\n ...context,\n };\n }\n\n this.handler(entry);\n }\n\n /**\n * Create a chainable logger with initial context\n */\n withContext(context: Record<string, unknown>): LoggerChain {\n return new LoggerChainBuilder(this).withContext(context);\n }\n\n /**\n * Create a chainable logger with initial prefix\n */\n withPrefix(prefix: string): LoggerChain {\n return new LoggerChainBuilder(this).withPrefix(prefix);\n }\n}\n\n/**\n * Chainable logger builder\n */\nclass LoggerChainBuilder implements LoggerChain {\n private logger: Logger;\n private context?: Record<string, unknown>;\n private metadata?: Record<string, unknown>;\n private errorObj?: Error;\n private prefix?: string;\n\n constructor(logger: Logger) {\n this.logger = logger;\n }\n\n withContext(context: Record<string, unknown>): LoggerChain {\n this.context = {\n ...this.context,\n ...context,\n };\n return this;\n }\n\n withMetadata(metadata: Record<string, unknown>): LoggerChain {\n this.metadata = {\n ...this.metadata,\n ...metadata,\n };\n return this;\n }\n\n withError(error: Error): LoggerChain {\n this.errorObj = error;\n return this;\n }\n\n withPrefix(prefix: string): LoggerChain {\n this.prefix = prefix;\n return this;\n }\n\n private createEntry(level: LogLevel, message: string): LogEntry {\n const entry: LogEntry = {\n level,\n message,\n timestamp: this.logger['enableTimestamp'] ? Date.now() : 0,\n prefix: this.prefix || this.logger['defaultPrefix'],\n };\n\n // Merge contexts\n const defaultContext = this.logger['defaultContext'];\n if (defaultContext || this.context) {\n entry.context = {\n ...defaultContext,\n ...this.context,\n };\n }\n\n if (this.metadata) {\n entry.metadata = this.metadata;\n }\n\n if (this.errorObj) {\n entry.error = this.errorObj;\n }\n\n return entry;\n }\n\n private log(level: LogLevel, message: string): void {\n if (level < this.logger.getLevel()) {\n return;\n }\n\n const entry = this.createEntry(level, message);\n this.logger['handler'](entry);\n }\n\n trace(message: string): void {\n this.log(LogLevel.TRACE, message);\n }\n\n debug(message: string): void {\n this.log(LogLevel.DEBUG, message);\n }\n\n info(message: string): void {\n this.log(LogLevel.INFO, message);\n }\n\n warn(message: string): void {\n this.log(LogLevel.WARN, message);\n }\n\n error(message: string): void {\n this.log(LogLevel.ERROR, message);\n }\n}\n","import { Logger } from './logger';\nimport { LogLevel } from './types';\n\nexport { Logger, LogLevel };\nexport type {\n LogEntry,\n LoggerOptions,\n LoggerChain,\n OutputHandler,\n} from './types';\n\n/**\n * Default logger instance\n */\nexport const defaultLogger = new Logger();\n\n/**\n * Convenience methods using the default logger\n */\nexport const log = {\n trace: (message: string, context?: Record<string, unknown>) =>\n defaultLogger.trace(message, context),\n debug: (message: string, context?: Record<string, unknown>) =>\n defaultLogger.debug(message, context),\n info: (message: string, context?: Record<string, unknown>) =>\n defaultLogger.info(message, context),\n warn: (message: string, context?: Record<string, unknown>) =>\n defaultLogger.warn(message, context),\n error: (message: string, context?: Record<string, unknown>) =>\n defaultLogger.error(message, context),\n setLevel: (level: LogLevel | keyof typeof LogLevel) =>\n defaultLogger.setLevel(level),\n withContext: (context: Record<string, unknown>) =>\n defaultLogger.withContext(context),\n withPrefix: (prefix: string) => defaultLogger.withPrefix(prefix),\n chain: () => defaultLogger.chain(),\n};\n\nexport default Logger;\n"],"names":["LogLevel","parseLogLevel","level","_LogLevel$level","INFO","createConsoleHandler","consoleMethods","_consoleMethods","TRACE","console","trace","debug","DEBUG","info","WARN","warn","ERROR","error","entry","method","log","parts","prefix","push","message","context","Object","keys","length","metadata","apply","Logger","options","handler","enableTimestamp","undefined","defaultContext","defaultPrefix","_proto","prototype","setLevel","getLevel","setHandler","setDefaultContext","setDefaultPrefix","chain","LoggerChainBuilder","timestamp","Date","now","_extends","withContext","withPrefix","logger","_proto2","withMetadata","withError","errorObj","createEntry","defaultLogger"],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { LogLevel, LoggerOptions, LoggerChain, OutputHandler } from './types';
2
+ export declare class Logger {
3
+ private level;
4
+ private handler;
5
+ private enableTimestamp;
6
+ private defaultContext?;
7
+ private defaultPrefix?;
8
+ constructor(options?: LoggerOptions);
9
+ setLevel(level: LogLevel | keyof typeof LogLevel): void;
10
+ getLevel(): LogLevel;
11
+ setHandler(handler: OutputHandler): void;
12
+ setDefaultContext(context: Record<string, unknown>): void;
13
+ setDefaultPrefix(prefix: string): void;
14
+ chain(): LoggerChain;
15
+ trace(message: string, context?: Record<string, unknown>): void;
16
+ debug(message: string, context?: Record<string, unknown>): void;
17
+ info(message: string, context?: Record<string, unknown>): void;
18
+ warn(message: string, context?: Record<string, unknown>): void;
19
+ error(message: string, context?: Record<string, unknown>): void;
20
+ private log;
21
+ withContext(context: Record<string, unknown>): LoggerChain;
22
+ withPrefix(prefix: string): LoggerChain;
23
+ }
@@ -0,0 +1,36 @@
1
+ export declare enum LogLevel {
2
+ TRACE = 0,
3
+ DEBUG = 1,
4
+ INFO = 2,
5
+ WARN = 3,
6
+ ERROR = 4,
7
+ SILENT = 5
8
+ }
9
+ export interface LogEntry {
10
+ level: LogLevel;
11
+ message: string;
12
+ timestamp: number;
13
+ context?: Record<string, unknown>;
14
+ metadata?: Record<string, unknown>;
15
+ error?: Error;
16
+ prefix?: string;
17
+ }
18
+ export declare type OutputHandler = (entry: LogEntry) => void;
19
+ export interface LoggerOptions {
20
+ level?: LogLevel | keyof typeof LogLevel;
21
+ handler?: OutputHandler;
22
+ enableTimestamp?: boolean;
23
+ defaultContext?: Record<string, unknown>;
24
+ defaultPrefix?: string;
25
+ }
26
+ export interface LoggerChain {
27
+ withContext(context: Record<string, unknown>): LoggerChain;
28
+ withMetadata(metadata: Record<string, unknown>): LoggerChain;
29
+ withError(error: Error): LoggerChain;
30
+ withPrefix(prefix: string): LoggerChain;
31
+ trace(message: string): void;
32
+ debug(message: string): void;
33
+ info(message: string): void;
34
+ warn(message: string): void;
35
+ error(message: string): void;
36
+ }
@@ -0,0 +1,4 @@
1
+ import { LogLevel, LogEntry } from './types';
2
+ export declare function parseLogLevel(level: LogLevel | keyof typeof LogLevel): LogLevel;
3
+ export declare function getLogLevelName(level: LogLevel): string;
4
+ export declare function createConsoleHandler(): (entry: LogEntry) => void;
package/package.json ADDED
@@ -0,0 +1,22 @@
1
+ {
2
+ "name": "@x-oasis/log",
3
+ "version": "0.1.1",
4
+ "description": "A friendly logging library for browser environments",
5
+ "main": "dist/index.js",
6
+ "typings": "dist/index.d.ts",
7
+ "module": "dist/log.esm.js",
8
+ "publishConfig": {
9
+ "access": "public"
10
+ },
11
+ "author": "",
12
+ "license": "ISC",
13
+ "devDependencies": {
14
+ "tsdx": "^0.14.1"
15
+ },
16
+ "scripts": {
17
+ "build": "tsdx build --tsconfig tsconfig.build.json",
18
+ "clean": "rimraf ./dist",
19
+ "test": "vitest",
20
+ "compile": "tsc -p tsconfig.build.json"
21
+ }
22
+ }
package/src/index.ts ADDED
@@ -0,0 +1,39 @@
1
+ import { Logger } from './logger';
2
+ import { LogLevel } from './types';
3
+
4
+ export { Logger, LogLevel };
5
+ export type {
6
+ LogEntry,
7
+ LoggerOptions,
8
+ LoggerChain,
9
+ OutputHandler,
10
+ } from './types';
11
+
12
+ /**
13
+ * Default logger instance
14
+ */
15
+ export const defaultLogger = new Logger();
16
+
17
+ /**
18
+ * Convenience methods using the default logger
19
+ */
20
+ export const log = {
21
+ trace: (message: string, context?: Record<string, unknown>) =>
22
+ defaultLogger.trace(message, context),
23
+ debug: (message: string, context?: Record<string, unknown>) =>
24
+ defaultLogger.debug(message, context),
25
+ info: (message: string, context?: Record<string, unknown>) =>
26
+ defaultLogger.info(message, context),
27
+ warn: (message: string, context?: Record<string, unknown>) =>
28
+ defaultLogger.warn(message, context),
29
+ error: (message: string, context?: Record<string, unknown>) =>
30
+ defaultLogger.error(message, context),
31
+ setLevel: (level: LogLevel | keyof typeof LogLevel) =>
32
+ defaultLogger.setLevel(level),
33
+ withContext: (context: Record<string, unknown>) =>
34
+ defaultLogger.withContext(context),
35
+ withPrefix: (prefix: string) => defaultLogger.withPrefix(prefix),
36
+ chain: () => defaultLogger.chain(),
37
+ };
38
+
39
+ export default Logger;
package/src/logger.ts ADDED
@@ -0,0 +1,247 @@
1
+ import {
2
+ LogLevel,
3
+ LogEntry,
4
+ LoggerOptions,
5
+ LoggerChain,
6
+ OutputHandler,
7
+ } from './types';
8
+ import { parseLogLevel, createConsoleHandler } from './utils';
9
+
10
+ /**
11
+ * Main Logger class
12
+ */
13
+ export class Logger {
14
+ private level: LogLevel;
15
+ private handler: OutputHandler;
16
+ private enableTimestamp: boolean;
17
+ private defaultContext?: Record<string, unknown>;
18
+ private defaultPrefix?: string;
19
+
20
+ constructor(options: LoggerOptions = {}) {
21
+ this.level = options.level ? parseLogLevel(options.level) : LogLevel.INFO;
22
+ this.handler = options.handler || createConsoleHandler();
23
+ this.enableTimestamp =
24
+ options.enableTimestamp !== undefined ? options.enableTimestamp : true;
25
+ this.defaultContext = options.defaultContext;
26
+ this.defaultPrefix = options.defaultPrefix;
27
+ }
28
+
29
+ /**
30
+ * Set the minimum log level
31
+ */
32
+ setLevel(level: LogLevel | keyof typeof LogLevel): void {
33
+ this.level = parseLogLevel(level);
34
+ }
35
+
36
+ /**
37
+ * Get the current log level
38
+ */
39
+ getLevel(): LogLevel {
40
+ return this.level;
41
+ }
42
+
43
+ /**
44
+ * Set a custom output handler
45
+ */
46
+ setHandler(handler: OutputHandler): void {
47
+ this.handler = handler;
48
+ }
49
+
50
+ /**
51
+ * Set default context that will be included in all logs
52
+ */
53
+ setDefaultContext(context: Record<string, unknown>): void {
54
+ this.defaultContext = context;
55
+ }
56
+
57
+ /**
58
+ * Set default prefix for all log messages
59
+ */
60
+ setDefaultPrefix(prefix: string): void {
61
+ this.defaultPrefix = prefix;
62
+ }
63
+
64
+ /**
65
+ * Create a chainable logger instance
66
+ */
67
+ chain(): LoggerChain {
68
+ return new LoggerChainBuilder(this);
69
+ }
70
+
71
+ /**
72
+ * Log at trace level
73
+ */
74
+ trace(message: string, context?: Record<string, unknown>): void {
75
+ this.log(LogLevel.TRACE, message, context);
76
+ }
77
+
78
+ /**
79
+ * Log at debug level
80
+ */
81
+ debug(message: string, context?: Record<string, unknown>): void {
82
+ this.log(LogLevel.DEBUG, message, context);
83
+ }
84
+
85
+ /**
86
+ * Log at info level
87
+ */
88
+ info(message: string, context?: Record<string, unknown>): void {
89
+ this.log(LogLevel.INFO, message, context);
90
+ }
91
+
92
+ /**
93
+ * Log at warn level
94
+ */
95
+ warn(message: string, context?: Record<string, unknown>): void {
96
+ this.log(LogLevel.WARN, message, context);
97
+ }
98
+
99
+ /**
100
+ * Log at error level
101
+ */
102
+ error(message: string, context?: Record<string, unknown>): void {
103
+ this.log(LogLevel.ERROR, message, context);
104
+ }
105
+
106
+ /**
107
+ * Internal log method
108
+ */
109
+ private log(
110
+ level: LogLevel,
111
+ message: string,
112
+ context?: Record<string, unknown>
113
+ ): void {
114
+ if (level < this.level) {
115
+ return;
116
+ }
117
+
118
+ const entry: LogEntry = {
119
+ level,
120
+ message,
121
+ timestamp: this.enableTimestamp ? Date.now() : 0,
122
+ prefix: this.defaultPrefix,
123
+ };
124
+
125
+ // Merge default context with provided context
126
+ if (this.defaultContext || context) {
127
+ entry.context = {
128
+ ...this.defaultContext,
129
+ ...context,
130
+ };
131
+ }
132
+
133
+ this.handler(entry);
134
+ }
135
+
136
+ /**
137
+ * Create a chainable logger with initial context
138
+ */
139
+ withContext(context: Record<string, unknown>): LoggerChain {
140
+ return new LoggerChainBuilder(this).withContext(context);
141
+ }
142
+
143
+ /**
144
+ * Create a chainable logger with initial prefix
145
+ */
146
+ withPrefix(prefix: string): LoggerChain {
147
+ return new LoggerChainBuilder(this).withPrefix(prefix);
148
+ }
149
+ }
150
+
151
+ /**
152
+ * Chainable logger builder
153
+ */
154
+ class LoggerChainBuilder implements LoggerChain {
155
+ private logger: Logger;
156
+ private context?: Record<string, unknown>;
157
+ private metadata?: Record<string, unknown>;
158
+ private errorObj?: Error;
159
+ private prefix?: string;
160
+
161
+ constructor(logger: Logger) {
162
+ this.logger = logger;
163
+ }
164
+
165
+ withContext(context: Record<string, unknown>): LoggerChain {
166
+ this.context = {
167
+ ...this.context,
168
+ ...context,
169
+ };
170
+ return this;
171
+ }
172
+
173
+ withMetadata(metadata: Record<string, unknown>): LoggerChain {
174
+ this.metadata = {
175
+ ...this.metadata,
176
+ ...metadata,
177
+ };
178
+ return this;
179
+ }
180
+
181
+ withError(error: Error): LoggerChain {
182
+ this.errorObj = error;
183
+ return this;
184
+ }
185
+
186
+ withPrefix(prefix: string): LoggerChain {
187
+ this.prefix = prefix;
188
+ return this;
189
+ }
190
+
191
+ private createEntry(level: LogLevel, message: string): LogEntry {
192
+ const entry: LogEntry = {
193
+ level,
194
+ message,
195
+ timestamp: this.logger['enableTimestamp'] ? Date.now() : 0,
196
+ prefix: this.prefix || this.logger['defaultPrefix'],
197
+ };
198
+
199
+ // Merge contexts
200
+ const defaultContext = this.logger['defaultContext'];
201
+ if (defaultContext || this.context) {
202
+ entry.context = {
203
+ ...defaultContext,
204
+ ...this.context,
205
+ };
206
+ }
207
+
208
+ if (this.metadata) {
209
+ entry.metadata = this.metadata;
210
+ }
211
+
212
+ if (this.errorObj) {
213
+ entry.error = this.errorObj;
214
+ }
215
+
216
+ return entry;
217
+ }
218
+
219
+ private log(level: LogLevel, message: string): void {
220
+ if (level < this.logger.getLevel()) {
221
+ return;
222
+ }
223
+
224
+ const entry = this.createEntry(level, message);
225
+ this.logger['handler'](entry);
226
+ }
227
+
228
+ trace(message: string): void {
229
+ this.log(LogLevel.TRACE, message);
230
+ }
231
+
232
+ debug(message: string): void {
233
+ this.log(LogLevel.DEBUG, message);
234
+ }
235
+
236
+ info(message: string): void {
237
+ this.log(LogLevel.INFO, message);
238
+ }
239
+
240
+ warn(message: string): void {
241
+ this.log(LogLevel.WARN, message);
242
+ }
243
+
244
+ error(message: string): void {
245
+ this.log(LogLevel.ERROR, message);
246
+ }
247
+ }