@lyxa.ai/core 1.3.151 → 1.3.152

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.
@@ -16,44 +16,46 @@ interface LoggerConfig {
16
16
  environment?: string;
17
17
  }
18
18
  export declare class LyxaLoggerKit {
19
- private readonly logger;
20
19
  private readonly model;
21
20
  private readonly config;
22
21
  constructor(config: LoggerConfig);
23
22
  private normalizeConfig;
24
23
  private ensureLogDirectory;
25
- private createPinoLogger;
26
24
  private getRequestStore;
27
25
  private enrichWithContext;
28
26
  private shouldPersist;
29
27
  private persistLog;
30
28
  private normalizeError;
31
29
  private buildLogEntry;
30
+ private getColorCode;
31
+ private formatTimestamp;
32
+ private formatLogMessage;
33
+ private consoleLog;
32
34
  private write;
33
35
  info(message: string, options: {
34
36
  tag: LogTag;
35
- data?: Record<string, unknown>;
37
+ data?: any;
36
38
  metadata?: LogMetadata;
37
39
  }): void;
38
40
  debug(message: string, options: {
39
41
  tag: LogTag;
40
- data?: Record<string, unknown>;
42
+ data?: any;
41
43
  metadata?: LogMetadata;
42
44
  }): void;
43
45
  warn(message: string, options: {
44
46
  tag: LogTag;
45
- data?: Record<string, unknown>;
47
+ data?: any;
46
48
  metadata?: LogMetadata;
47
49
  }): void;
48
50
  error(message: string, error: TRPCError | Error | unknown, options: {
49
51
  tag: LogTag;
50
- data?: Record<string, unknown>;
52
+ data?: any;
51
53
  metadata?: LogMetadata;
52
54
  context?: RequestContext;
53
55
  }): void;
54
56
  fatal(message: string, error: TRPCError | Error | unknown, options: {
55
57
  tag: LogTag;
56
- data?: Record<string, unknown>;
58
+ data?: any;
57
59
  metadata?: LogMetadata;
58
60
  context?: RequestContext;
59
61
  }): void;
@@ -61,7 +63,7 @@ export declare class LyxaLoggerKit {
61
63
  httpRequest(method: string, url: string, statusCode: number, durationMs: number, userId?: string): void;
62
64
  child(defaultContext: {
63
65
  tag?: LogTag;
64
- data?: Record<string, unknown>;
66
+ data?: any;
65
67
  metadata?: LogMetadata;
66
68
  }): {
67
69
  info: (message: string, options?: Partial<typeof defaultContext>) => void;
@@ -16,23 +16,19 @@ exports.LyxaLoggerKit = exports.requestContext = void 0;
16
16
  exports.withRequestContext = withRequestContext;
17
17
  const fs_1 = __importDefault(require("fs"));
18
18
  const path_1 = __importDefault(require("path"));
19
- const pino_1 = require("pino");
20
19
  const typedi_1 = require("typedi");
21
20
  const models_1 = require("../mongo/models");
22
21
  const enum_1 = require("../../utilities/enum");
23
22
  const node_async_hooks_1 = require("node:async_hooks");
24
- const EnvironmentConfigurationType_1 = require("../configuration/types/EnvironmentConfigurationType");
25
23
  const mongoose_1 = __importDefault(require("mongoose"));
26
24
  exports.requestContext = new node_async_hooks_1.AsyncLocalStorage();
27
25
  let LyxaLoggerKit = class LyxaLoggerKit {
28
- logger;
29
26
  model;
30
27
  config;
31
28
  constructor(config) {
32
29
  this.config = this.normalizeConfig(config);
33
30
  this.model = (0, models_1.createLogModel)({ ttlDays: this.config.ttlDays });
34
31
  this.ensureLogDirectory();
35
- this.logger = this.createPinoLogger();
36
32
  }
37
33
  normalizeConfig(config) {
38
34
  return {
@@ -47,28 +43,6 @@ let LyxaLoggerKit = class LyxaLoggerKit {
47
43
  const logPath = path_1.default.join(process.cwd(), this.config.logDirectory);
48
44
  fs_1.default.mkdirSync(logPath, { recursive: true });
49
45
  }
50
- createPinoLogger() {
51
- const isProduction = this.config.environment === EnvironmentConfigurationType_1.EnvironmentConfigurationType.PROD;
52
- return (0, pino_1.pino)({
53
- level: isProduction ? 'info' : 'debug',
54
- base: {
55
- service: this.config.instanceType,
56
- pid: process.pid,
57
- hostname: process.env.HOSTNAME ?? 'unknown',
58
- env: this.config.environment,
59
- },
60
- transport: isProduction
61
- ? undefined
62
- : {
63
- target: 'pino-pretty',
64
- options: {
65
- colorize: true,
66
- translateTime: 'SYS:standard',
67
- ignore: 'pid,hostname',
68
- },
69
- },
70
- });
71
- }
72
46
  getRequestStore() {
73
47
  return exports.requestContext.getStore() ?? {};
74
48
  }
@@ -125,11 +99,95 @@ let LyxaLoggerKit = class LyxaLoggerKit {
125
99
  requestId: store.requestId,
126
100
  };
127
101
  }
102
+ getColorCode(level) {
103
+ switch (level) {
104
+ case enum_1.LogLevel.DEBUG:
105
+ return '\x1b[96m';
106
+ case enum_1.LogLevel.INFO:
107
+ return '\x1b[32m';
108
+ case enum_1.LogLevel.WARN:
109
+ return '\x1b[33m';
110
+ case enum_1.LogLevel.ERROR:
111
+ return '\x1b[31m';
112
+ case enum_1.LogLevel.FATAL:
113
+ return '\x1b[35m';
114
+ default:
115
+ return '\x1b[37m';
116
+ }
117
+ }
118
+ formatTimestamp(date) {
119
+ const year = date.getFullYear();
120
+ const month = String(date.getMonth() + 1).padStart(2, '0');
121
+ const day = String(date.getDate()).padStart(2, '0');
122
+ const hours = String(date.getHours()).padStart(2, '0');
123
+ const minutes = String(date.getMinutes()).padStart(2, '0');
124
+ const seconds = String(date.getSeconds()).padStart(2, '0');
125
+ return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
126
+ }
127
+ formatLogMessage(level, message, entry) {
128
+ const timestamp = this.formatTimestamp(new Date());
129
+ const tag = (entry.tag || 'GENERAL').toUpperCase();
130
+ const levelUpper = level.toUpperCase();
131
+ const grey = '\x1b[90m';
132
+ const cyan = '\x1b[36m';
133
+ const levelColor = this.getColorCode(level);
134
+ const reset = '\x1b[0m';
135
+ const paddedLevel = levelUpper.padEnd(5);
136
+ const parts = [
137
+ `${grey}[${timestamp}]${reset}`,
138
+ `${levelColor}[${levelUpper}]${reset}`,
139
+ `${cyan}[${tag}]${reset}`,
140
+ message,
141
+ ];
142
+ return parts.join(' ');
143
+ }
144
+ consoleLog(level, formattedMessage, entry) {
145
+ switch (level) {
146
+ case enum_1.LogLevel.DEBUG:
147
+ console.log(formattedMessage);
148
+ if (entry.data && Object.keys(entry.data).length > 0) {
149
+ console.log(entry.data);
150
+ }
151
+ break;
152
+ case enum_1.LogLevel.INFO:
153
+ console.log(formattedMessage);
154
+ if (entry.data && Object.keys(entry.data).length > 0) {
155
+ console.log(entry.data);
156
+ }
157
+ break;
158
+ case enum_1.LogLevel.WARN:
159
+ console.warn(formattedMessage);
160
+ if (entry.data && Object.keys(entry.data).length > 0) {
161
+ console.warn(entry.data);
162
+ }
163
+ break;
164
+ case enum_1.LogLevel.ERROR:
165
+ console.error(formattedMessage);
166
+ if (entry.data && Object.keys(entry.data).length > 0) {
167
+ console.error(entry.data);
168
+ }
169
+ break;
170
+ case enum_1.LogLevel.FATAL:
171
+ console.error(formattedMessage);
172
+ if (entry.data && Object.keys(entry.data).length > 0) {
173
+ console.error(entry.data);
174
+ }
175
+ break;
176
+ default:
177
+ console.log(formattedMessage);
178
+ if (entry.data && Object.keys(entry.data).length > 0) {
179
+ console.log(entry.data);
180
+ }
181
+ break;
182
+ }
183
+ }
128
184
  write(level, message, payload, opts = {}) {
129
185
  const { shouldWrite = true } = opts;
130
186
  const entry = this.buildLogEntry(message, payload);
131
- shouldWrite &&
132
- this.logger[level.toLowerCase()](entry, message);
187
+ if (shouldWrite) {
188
+ const formattedMessage = this.formatLogMessage(level, message, entry);
189
+ this.consoleLog(level, formattedMessage, entry);
190
+ }
133
191
  if (this.shouldPersist(level)) {
134
192
  this.persistLog({
135
193
  level,
@@ -153,13 +211,13 @@ let LyxaLoggerKit = class LyxaLoggerKit {
153
211
  this.write(enum_1.LogLevel.DEBUG, message, options);
154
212
  }
155
213
  warn(message, options) {
156
- this.write(enum_1.LogLevel.WARN, message, options, { shouldWrite: false });
214
+ this.write(enum_1.LogLevel.WARN, message, options);
157
215
  }
158
216
  error(message, error, options) {
159
217
  this.write(enum_1.LogLevel.ERROR, message, {
160
218
  ...options,
161
219
  error: this.normalizeError(error),
162
- }, { shouldWrite: false });
220
+ });
163
221
  }
164
222
  fatal(message, error, options) {
165
223
  this.write(enum_1.LogLevel.FATAL, message, {
@@ -1 +1 @@
1
- {"version":3,"file":"logger.service.js","sourceRoot":"/","sources":["libraries/logger-kit/logger.service.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'fs';\nimport path from 'path';\nimport { Logger, pino } from 'pino';\nimport { Service } from 'typedi';\nimport { createLogModel, Log } from '../mongo/models';\nimport { LogLevel, LogTag } from '../../utilities/enum';\nimport { ErrorInfo, LogMetadata, RequestContext } from './types';\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport { EnvironmentConfigurationType } from '../configuration/types/EnvironmentConfigurationType';\nimport mongoose from 'mongoose';\nimport { TRPCError } from '@trpc/server';\n\ninterface RequestStore {\n\trequestId?: string;\n\tuserId?: string;\n\tmetadata?: Record<string, unknown>;\n}\n\nexport const requestContext = new AsyncLocalStorage<RequestStore>();\n\ninterface LoggerConfig {\n\tinstanceType: string;\n\tttlDays?: number;\n\tpersistDebug?: boolean;\n\tlogDirectory?: string;\n\tenvironment?: string;\n}\n\n@Service()\nexport class LyxaLoggerKit {\n\tprivate readonly logger: Logger;\n\tprivate readonly model: ReturnType<typeof createLogModel>;\n\tprivate readonly config: Required<LoggerConfig>;\n\n\tconstructor(config: LoggerConfig) {\n\t\tthis.config = this.normalizeConfig(config);\n\t\tthis.model = createLogModel({ ttlDays: this.config.ttlDays });\n\t\tthis.ensureLogDirectory();\n\t\tthis.logger = this.createPinoLogger();\n\t}\n\n\tprivate normalizeConfig(config: LoggerConfig): Required<LoggerConfig> {\n\t\treturn {\n\t\t\tinstanceType: config.instanceType,\n\t\t\tttlDays: config.ttlDays ?? 7,\n\t\t\tpersistDebug: config.persistDebug ?? process.env.PERSIST_DEBUG_LOGS === 'true',\n\t\t\tlogDirectory: config.logDirectory ?? 'logs',\n\t\t\tenvironment: config.environment ?? process.env.NODE_ENV ?? 'development',\n\t\t};\n\t}\n\n\tprivate ensureLogDirectory(): void {\n\t\tconst logPath = path.join(process.cwd(), this.config.logDirectory);\n\t\tfs.mkdirSync(logPath, { recursive: true });\n\t}\n\n\tprivate createPinoLogger(): Logger {\n\t\tconst isProduction = this.config.environment === EnvironmentConfigurationType.PROD;\n\n\t\treturn pino({\n\t\t\tlevel: isProduction ? 'info' : 'debug',\n\t\t\tbase: {\n\t\t\t\tservice: this.config.instanceType,\n\t\t\t\tpid: process.pid,\n\t\t\t\thostname: process.env.HOSTNAME ?? 'unknown',\n\t\t\t\tenv: this.config.environment,\n\t\t\t},\n\t\t\ttransport: isProduction\n\t\t\t\t? undefined\n\t\t\t\t: {\n\t\t\t\t\t\ttarget: 'pino-pretty',\n\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\tcolorize: true,\n\t\t\t\t\t\t\ttranslateTime: 'SYS:standard',\n\t\t\t\t\t\t\tignore: 'pid,hostname',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t});\n\t}\n\n\tprivate getRequestStore(): RequestStore {\n\t\treturn requestContext.getStore() ?? {};\n\t}\n\n\tprivate enrichWithContext(data: Record<string, unknown> = {}): Record<string, unknown> {\n\t\tconst store = this.getRequestStore();\n\t\treturn {\n\t\t\t...data,\n\t\t\t...(store.requestId && { requestId: store.requestId }),\n\t\t\t...(store.userId && { userId: store.userId }),\n\t\t};\n\t}\n\n\tprivate shouldPersist(level: LogLevel): boolean {\n\t\t// return level !== LogLevel.DEBUG || this.config.persistDebug;\n\t\treturn true;\n\t}\n\n\tprivate async persistLog(log: Partial<Log>): Promise<void> {\n\t\tconst currentDebug = mongoose.get('debug');\n\t\ttry {\n\t\t\tmongoose.set('debug', false);\n\t\t\tawait this.model.create({\n\t\t\t\t...log,\n\t\t\t\tmicroService: this.config.instanceType,\n\t\t\t\ttimestamp: new Date(),\n\t\t\t});\n\t\t} catch (err) {\n\t\t\tconsole.error('[Logger] MongoDB persistence failed:', err);\n\t\t} finally {\n\t\t\tmongoose.set('debug', currentDebug);\n\t\t}\n\t}\n\n\tprivate normalizeError(error: TRPCError | Error | unknown): ErrorInfo {\n\t\tif (error instanceof Error) {\n\t\t\treturn {\n\t\t\t\tname: error.name,\n\t\t\t\tmessage: error.message,\n\t\t\t\tstack: error.stack,\n\t\t\t};\n\t\t}\n\t\treturn error as ErrorInfo;\n\t}\n\n\tprivate buildLogEntry(\n\t\tmessage: string,\n\t\tpayload: {\n\t\t\ttag: LogTag;\n\t\t\tdata?: Record<string, unknown>;\n\t\t\tmetadata?: LogMetadata;\n\t\t\terror?: ErrorInfo;\n\t\t\tcontext?: RequestContext;\n\t\t}\n\t) {\n\t\tconst store = this.getRequestStore();\n\n\t\treturn {\n\t\t\ttag: payload.tag,\n\t\t\tmessage,\n\t\t\tdata: this.enrichWithContext(payload.data),\n\t\t\tmetadata: {\n\t\t\t\t...payload.metadata,\n\t\t\t\t...store.metadata,\n\t\t\t},\n\t\t\terror: payload.error,\n\t\t\tcontext: payload.context,\n\t\t\trequestId: store.requestId,\n\t\t};\n\t}\n\n\tprivate write(\n\t\tlevel: LogLevel,\n\t\tmessage: string,\n\t\tpayload: {\n\t\t\ttag: LogTag;\n\t\t\tdata?: Record<string, unknown>;\n\t\t\tmetadata?: LogMetadata;\n\t\t\terror?: ErrorInfo;\n\t\t\tcontext?: RequestContext;\n\t\t},\n\t\topts: { shouldWrite?: boolean } = {}\n\t): void {\n\t\tconst { shouldWrite = true } = opts;\n\t\tconst entry = this.buildLogEntry(message, payload);\n\n\t\t// Console/Pino logging\n\t\tshouldWrite &&\n\t\t\tthis.logger[level.toLowerCase() as 'info' | 'debug' | 'warn' | 'error' | 'fatal'](entry, message);\n\n\t\t// Async persistence (fire-and-forget)\n\t\tif (this.shouldPersist(level)) {\n\t\t\tthis.persistLog({\n\t\t\t\tlevel,\n\t\t\t\ttag: payload.tag,\n\t\t\t\tmessage,\n\t\t\t\tdata: entry.data,\n\t\t\t\tmetadata: entry.metadata ?? {},\n\t\t\t\terror: payload.error,\n\t\t\t\tstackTrace: payload.error?.stack?.split('\\n'),\n\t\t\t\trequestId: entry.requestId,\n\t\t\t\tcontext: payload.context,\n\t\t\t}).catch(e => {\n\t\t\t\tconsole.error('Something went wrong', e);\n\t\t\t});\n\t\t}\n\t}\n\n\t/* ---------------------------------- */\n\t/* Public Logging API */\n\n\t/* ---------------------------------- */\n\n\tinfo(\n\t\tmessage: string,\n\t\toptions: {\n\t\t\ttag: LogTag;\n\t\t\tdata?: Record<string, unknown>;\n\t\t\tmetadata?: LogMetadata;\n\t\t}\n\t): void {\n\t\tthis.write(LogLevel.INFO, message, options);\n\t}\n\n\tdebug(\n\t\tmessage: string,\n\t\toptions: {\n\t\t\ttag: LogTag;\n\t\t\tdata?: Record<string, unknown>;\n\t\t\tmetadata?: LogMetadata;\n\t\t}\n\t): void {\n\t\tthis.write(LogLevel.DEBUG, message, options);\n\t}\n\n\twarn(\n\t\tmessage: string,\n\t\toptions: {\n\t\t\ttag: LogTag;\n\t\t\tdata?: Record<string, unknown>;\n\t\t\tmetadata?: LogMetadata;\n\t\t}\n\t): void {\n\t\tthis.write(LogLevel.WARN, message, options, { shouldWrite: false });\n\t}\n\n\terror(\n\t\tmessage: string,\n\t\terror: TRPCError | Error | unknown,\n\t\toptions: {\n\t\t\ttag: LogTag;\n\t\t\tdata?: Record<string, unknown>;\n\t\t\tmetadata?: LogMetadata;\n\t\t\tcontext?: RequestContext;\n\t\t}\n\t): void {\n\t\tthis.write(\n\t\t\tLogLevel.ERROR,\n\t\t\tmessage,\n\t\t\t{\n\t\t\t\t...options,\n\t\t\t\terror: this.normalizeError(error),\n\t\t\t},\n\t\t\t{ shouldWrite: false }\n\t\t);\n\t}\n\n\tfatal(\n\t\tmessage: string,\n\t\terror: TRPCError | Error | unknown,\n\t\toptions: {\n\t\t\ttag: LogTag;\n\t\t\tdata?: Record<string, unknown>;\n\t\t\tmetadata?: LogMetadata;\n\t\t\tcontext?: RequestContext;\n\t\t}\n\t): void {\n\t\tthis.write(LogLevel.FATAL, message, {\n\t\t\t...options,\n\t\t\terror: this.normalizeError(error),\n\t\t});\n\t}\n\n\t/* ---------------------------------- */\n\t/* HTTP Convenience Methods */\n\n\t/* ---------------------------------- */\n\n\tprivate getHttpLogLevel(statusCode: number): LogLevel {\n\t\tif (statusCode >= 500) return LogLevel.ERROR;\n\t\tif (statusCode >= 400) return LogLevel.WARN;\n\t\treturn LogLevel.INFO;\n\t}\n\n\thttpRequest(method: string, url: string, statusCode: number, durationMs: number, userId?: string): void {\n\t\tthis.write(this.getHttpLogLevel(statusCode), 'HTTP request completed', {\n\t\t\ttag: LogTag.HTTP_REQUEST,\n\t\t\tdata: {\n\t\t\t\tmethod,\n\t\t\t\turl,\n\t\t\t\tstatusCode,\n\t\t\t\tdurationMs,\n\t\t\t\t...(userId && { userId }),\n\t\t\t},\n\t\t\tmetadata: {\n\t\t\t\t...(userId && { userId }),\n\t\t\t\tstatusCode,\n\t\t\t\tresponseTime: durationMs,\n\t\t\t},\n\t\t\tcontext: { method, url },\n\t\t});\n\t}\n\n\tchild(defaultContext: { tag?: LogTag; data?: Record<string, unknown>; metadata?: LogMetadata }): {\n\t\tinfo: (message: string, options?: Partial<typeof defaultContext>) => void;\n\t\tdebug: (message: string, options?: Partial<typeof defaultContext>) => void;\n\t\twarn: (message: string, options?: Partial<typeof defaultContext>) => void;\n\t\terror: (message: string, error: Error | ErrorInfo, options?: Partial<typeof defaultContext>) => void;\n\t} {\n\t\treturn {\n\t\t\tinfo: (message, opts = {}) =>\n\t\t\t\tthis.info(message, {\n\t\t\t\t\ttag: opts.tag ?? defaultContext.tag ?? LogTag.HTTP_REQUEST,\n\t\t\t\t\tdata: { ...defaultContext.data, ...opts.data },\n\t\t\t\t\tmetadata: { ...defaultContext.metadata, ...opts.metadata },\n\t\t\t\t}),\n\t\t\tdebug: (message, opts = {}) =>\n\t\t\t\tthis.debug(message, {\n\t\t\t\t\ttag: opts.tag ?? defaultContext.tag ?? LogTag.HTTP_REQUEST,\n\t\t\t\t\tdata: { ...defaultContext.data, ...opts.data },\n\t\t\t\t\tmetadata: { ...defaultContext.metadata, ...opts.metadata },\n\t\t\t\t}),\n\t\t\twarn: (message, opts = {}) =>\n\t\t\t\tthis.warn(message, {\n\t\t\t\t\ttag: opts.tag ?? defaultContext.tag ?? LogTag.HTTP_REQUEST,\n\t\t\t\t\tdata: { ...defaultContext.data, ...opts.data },\n\t\t\t\t\tmetadata: { ...defaultContext.metadata, ...opts.metadata },\n\t\t\t\t}),\n\t\t\terror: (message, error, opts = {}) =>\n\t\t\t\tthis.error(message, error, {\n\t\t\t\t\ttag: opts.tag ?? defaultContext.tag ?? LogTag.HTTP_REQUEST,\n\t\t\t\t\tdata: { ...defaultContext.data, ...opts.data },\n\t\t\t\t\tmetadata: { ...defaultContext.metadata, ...opts.metadata },\n\t\t\t\t}),\n\t\t};\n\t}\n}\n\nexport function withRequestContext<T>(store: RequestStore, fn: () => T | Promise<T>): Promise<T> {\n\treturn new Promise((resolve, reject) => {\n\t\trequestContext.run(store, async () => {\n\t\t\ttry {\n\t\t\t\tresolve(await fn());\n\t\t\t} catch (err) {\n\t\t\t\treject(err);\n\t\t\t}\n\t\t});\n\t});\n}"]}
1
+ {"version":3,"file":"logger.service.js","sourceRoot":"/","sources":["libraries/logger-kit/logger.service.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'fs';\nimport path from 'path';\nimport { Service } from 'typedi';\nimport { createLogModel, Log } from '../mongo/models';\nimport { LogLevel, LogTag } from '../../utilities/enum';\nimport { ErrorInfo, LogMetadata, RequestContext } from './types';\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport { EnvironmentConfigurationType } from '../configuration/types/EnvironmentConfigurationType';\nimport mongoose from 'mongoose';\nimport { TRPCError } from '@trpc/server';\n\ninterface RequestStore {\n\trequestId?: string;\n\tuserId?: string;\n\tmetadata?: Record<string, unknown>;\n}\n\nexport const requestContext = new AsyncLocalStorage<RequestStore>();\n\ninterface LoggerConfig {\n\tinstanceType: string;\n\tttlDays?: number;\n\tpersistDebug?: boolean;\n\tlogDirectory?: string;\n\tenvironment?: string;\n}\n\n@Service()\nexport class LyxaLoggerKit {\n\tprivate readonly model: ReturnType<typeof createLogModel>;\n\tprivate readonly config: Required<LoggerConfig>;\n\n\tconstructor(config: LoggerConfig) {\n\t\tthis.config = this.normalizeConfig(config);\n\t\tthis.model = createLogModel({ ttlDays: this.config.ttlDays });\n\t\tthis.ensureLogDirectory();\n\t}\n\n\tprivate normalizeConfig(config: LoggerConfig): Required<LoggerConfig> {\n\t\treturn {\n\t\t\tinstanceType: config.instanceType,\n\t\t\tttlDays: config.ttlDays ?? 7,\n\t\t\tpersistDebug: config.persistDebug ?? process.env.PERSIST_DEBUG_LOGS === 'true',\n\t\t\tlogDirectory: config.logDirectory ?? 'logs',\n\t\t\tenvironment: config.environment ?? process.env.NODE_ENV ?? 'development',\n\t\t};\n\t}\n\n\tprivate ensureLogDirectory(): void {\n\t\tconst logPath = path.join(process.cwd(), this.config.logDirectory);\n\t\tfs.mkdirSync(logPath, { recursive: true });\n\t}\n\n\tprivate getRequestStore(): RequestStore {\n\t\treturn requestContext.getStore() ?? {};\n\t}\n\n\tprivate enrichWithContext(data: any = {}): any {\n\t\tconst store = this.getRequestStore();\n\t\treturn {\n\t\t\t...data,\n\t\t\t...(store.requestId && { requestId: store.requestId }),\n\t\t\t...(store.userId && { userId: store.userId }),\n\t\t};\n\t}\n\n\tprivate shouldPersist(level: LogLevel): boolean {\n\t\t// return level !== LogLevel.DEBUG || this.config.persistDebug;\n\t\treturn true;\n\t}\n\n\tprivate async persistLog(log: Partial<Log>): Promise<void> {\n\t\tconst currentDebug = mongoose.get('debug');\n\t\ttry {\n\t\t\tmongoose.set('debug', false);\n\t\t\tawait this.model.create({\n\t\t\t\t...log,\n\t\t\t\tmicroService: this.config.instanceType,\n\t\t\t\ttimestamp: new Date(),\n\t\t\t});\n\t\t} catch (err) {\n\t\t\tconsole.error('[Logger] MongoDB persistence failed:', err);\n\t\t} finally {\n\t\t\tmongoose.set('debug', currentDebug);\n\t\t}\n\t}\n\n\tprivate normalizeError(error: TRPCError | Error | unknown): ErrorInfo {\n\t\tif (error instanceof Error) {\n\t\t\treturn {\n\t\t\t\tname: error.name,\n\t\t\t\tmessage: error.message,\n\t\t\t\tstack: error.stack,\n\t\t\t};\n\t\t}\n\t\treturn error as ErrorInfo;\n\t}\n\n\tprivate buildLogEntry(\n\t\tmessage: string,\n\t\tpayload: {\n\t\t\ttag: LogTag;\n\t\t\tdata?: any;\n\t\t\tmetadata?: LogMetadata;\n\t\t\terror?: ErrorInfo;\n\t\t\tcontext?: RequestContext;\n\t\t}\n\t) {\n\t\tconst store = this.getRequestStore();\n\n\t\treturn {\n\t\t\ttag: payload.tag,\n\t\t\tmessage,\n\t\t\tdata: this.enrichWithContext(payload.data),\n\t\t\tmetadata: {\n\t\t\t\t...payload.metadata,\n\t\t\t\t...store.metadata,\n\t\t\t},\n\t\t\terror: payload.error,\n\t\t\tcontext: payload.context,\n\t\t\trequestId: store.requestId,\n\t\t};\n\t}\n\n\tprivate getColorCode(level: LogLevel): string {\n\t\tswitch (level) {\n\t\t\tcase LogLevel.DEBUG:\n\t\t\t\treturn '\\x1b[96m'; // Cyan\n\t\t\tcase LogLevel.INFO:\n\t\t\t\treturn '\\x1b[32m'; // Green\n\t\t\tcase LogLevel.WARN:\n\t\t\t\treturn '\\x1b[33m'; // Yellow\n\t\t\tcase LogLevel.ERROR:\n\t\t\t\treturn '\\x1b[31m'; // Red\n\t\t\tcase LogLevel.FATAL:\n\t\t\t\treturn '\\x1b[35m'; // Magenta\n\t\t\tdefault:\n\t\t\t\treturn '\\x1b[37m'; // White\n\t\t}\n\t}\n\n\tprivate formatTimestamp(date: Date): string {\n\t\tconst year = date.getFullYear();\n\t\tconst month = String(date.getMonth() + 1).padStart(2, '0');\n\t\tconst day = String(date.getDate()).padStart(2, '0');\n\t\tconst hours = String(date.getHours()).padStart(2, '0');\n\t\tconst minutes = String(date.getMinutes()).padStart(2, '0');\n\t\tconst seconds = String(date.getSeconds()).padStart(2, '0');\n\n\t\treturn `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\n\t}\n\n\tprivate formatLogMessage(level: LogLevel, message: string, entry: any): string {\n\t\tconst timestamp = this.formatTimestamp(new Date());\n\t\tconst tag = (entry.tag || 'GENERAL').toUpperCase();\n\t\tconst levelUpper = level.toUpperCase();\n\n\t\t// ANSI color codes\n\t\tconst grey = '\\x1b[90m';\n\t\tconst cyan = '\\x1b[36m';\n\t\tconst levelColor = this.getColorCode(level);\n\t\tconst reset = '\\x1b[0m';\n\n\t\t// Pad level to 5 characters for alignment (DEBUG, INFO, WARN, ERROR, FATAL)\n\t\tconst paddedLevel = levelUpper.padEnd(5);\n\n\t\tconst parts = [\n\t\t\t`${grey}[${timestamp}]${reset}`,\n\t\t\t`${levelColor}[${levelUpper}]${reset}`,\n\t\t\t`${cyan}[${tag}]${reset}`,\n\t\t\tmessage,\n\t\t];\n\n\t\treturn parts.join(' ');\n\t}\n\n\tprivate consoleLog(level: LogLevel, formattedMessage: string, entry: any): void {\n\t\tswitch (level) {\n\t\t\tcase LogLevel.DEBUG:\n\t\t\t\tconsole.log(formattedMessage);\n\t\t\t\tif (entry.data && Object.keys(entry.data).length > 0) {\n\t\t\t\t\tconsole.log(entry.data);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase LogLevel.INFO:\n\t\t\t\tconsole.log(formattedMessage);\n\t\t\t\tif (entry.data && Object.keys(entry.data).length > 0) {\n\t\t\t\t\tconsole.log(entry.data);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase LogLevel.WARN:\n\t\t\t\tconsole.warn(formattedMessage);\n\t\t\t\tif (entry.data && Object.keys(entry.data).length > 0) {\n\t\t\t\t\tconsole.warn(entry.data);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase LogLevel.ERROR:\n\t\t\t\tconsole.error(formattedMessage);\n\t\t\t\tif (entry.data && Object.keys(entry.data).length > 0) {\n\t\t\t\t\tconsole.error(entry.data);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase LogLevel.FATAL:\n\t\t\t\tconsole.error(formattedMessage);\n\t\t\t\tif (entry.data && Object.keys(entry.data).length > 0) {\n\t\t\t\t\tconsole.error(entry.data);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tconsole.log(formattedMessage);\n\t\t\t\tif (entry.data && Object.keys(entry.data).length > 0) {\n\t\t\t\t\tconsole.log(entry.data);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tprivate write(\n\t\tlevel: LogLevel,\n\t\tmessage: string,\n\t\tpayload: {\n\t\t\ttag: LogTag;\n\t\t\tdata?: any;\n\t\t\tmetadata?: LogMetadata;\n\t\t\terror?: ErrorInfo;\n\t\t\tcontext?: RequestContext;\n\t\t},\n\t\topts: { shouldWrite?: boolean } = {}\n\t): void {\n\t\tconst { shouldWrite = true } = opts;\n\t\tconst entry = this.buildLogEntry(message, payload);\n\n\t\t// Console logging with switch case\n\t\tif (shouldWrite) {\n\t\t\tconst formattedMessage = this.formatLogMessage(level, message, entry);\n\t\t\tthis.consoleLog(level, formattedMessage, entry);\n\t\t}\n\n\t\t// Async persistence (fire-and-forget)\n\t\tif (this.shouldPersist(level)) {\n\t\t\tthis.persistLog({\n\t\t\t\tlevel,\n\t\t\t\ttag: payload.tag,\n\t\t\t\tmessage,\n\t\t\t\tdata: entry.data,\n\t\t\t\tmetadata: entry.metadata ?? {},\n\t\t\t\terror: payload.error,\n\t\t\t\tstackTrace: payload.error?.stack?.split('\\n'),\n\t\t\t\trequestId: entry.requestId,\n\t\t\t\tcontext: payload.context,\n\t\t\t}).catch(e => {\n\t\t\t\tconsole.error('Something went wrong', e);\n\t\t\t});\n\t\t}\n\t}\n\n\t/* ---------------------------------- */\n\t/* Public Logging API */\n\t/* ---------------------------------- */\n\n\tinfo(\n\t\tmessage: string,\n\t\toptions: {\n\t\t\ttag: LogTag;\n\t\t\tdata?: any;\n\t\t\tmetadata?: LogMetadata;\n\t\t}\n\t): void {\n\t\tthis.write(LogLevel.INFO, message, options);\n\t}\n\n\tdebug(\n\t\tmessage: string,\n\t\toptions: {\n\t\t\ttag: LogTag;\n\t\t\tdata?: any;\n\t\t\tmetadata?: LogMetadata;\n\t\t}\n\t): void {\n\t\tthis.write(LogLevel.DEBUG, message, options);\n\t}\n\n\twarn(\n\t\tmessage: string,\n\t\toptions: {\n\t\t\ttag: LogTag;\n\t\t\tdata?: any;\n\t\t\tmetadata?: LogMetadata;\n\t\t}\n\t): void {\n\t\tthis.write(LogLevel.WARN, message, options);\n\t}\n\n\terror(\n\t\tmessage: string,\n\t\terror: TRPCError | Error | unknown,\n\t\toptions: {\n\t\t\ttag: LogTag;\n\t\t\tdata?: any;\n\t\t\tmetadata?: LogMetadata;\n\t\t\tcontext?: RequestContext;\n\t\t}\n\t): void {\n\t\tthis.write(\n\t\t\tLogLevel.ERROR,\n\t\t\tmessage,\n\t\t\t{\n\t\t\t\t...options,\n\t\t\t\terror: this.normalizeError(error),\n\t\t\t}\n\t\t);\n\t}\n\n\tfatal(\n\t\tmessage: string,\n\t\terror: TRPCError | Error | unknown,\n\t\toptions: {\n\t\t\ttag: LogTag;\n\t\t\tdata?: any;\n\t\t\tmetadata?: LogMetadata;\n\t\t\tcontext?: RequestContext;\n\t\t}\n\t): void {\n\t\tthis.write(LogLevel.FATAL, message, {\n\t\t\t...options,\n\t\t\terror: this.normalizeError(error),\n\t\t});\n\t}\n\n\t/* ---------------------------------- */\n\t/* HTTP Convenience Methods */\n\t/* ---------------------------------- */\n\n\tprivate getHttpLogLevel(statusCode: number): LogLevel {\n\t\tif (statusCode >= 500) return LogLevel.ERROR;\n\t\tif (statusCode >= 400) return LogLevel.WARN;\n\t\treturn LogLevel.INFO;\n\t}\n\n\thttpRequest(method: string, url: string, statusCode: number, durationMs: number, userId?: string): void {\n\t\tthis.write(this.getHttpLogLevel(statusCode), 'HTTP request completed', {\n\t\t\ttag: LogTag.HTTP_REQUEST,\n\t\t\tdata: {\n\t\t\t\tmethod,\n\t\t\t\turl,\n\t\t\t\tstatusCode,\n\t\t\t\tdurationMs,\n\t\t\t\t...(userId && { userId }),\n\t\t\t},\n\t\t\tmetadata: {\n\t\t\t\t...(userId && { userId }),\n\t\t\t\tstatusCode,\n\t\t\t\tresponseTime: durationMs,\n\t\t\t},\n\t\t\tcontext: { method, url },\n\t\t});\n\t}\n\n\tchild(defaultContext: { tag?: LogTag; data?: any; metadata?: LogMetadata }): {\n\t\tinfo: (message: string, options?: Partial<typeof defaultContext>) => void;\n\t\tdebug: (message: string, options?: Partial<typeof defaultContext>) => void;\n\t\twarn: (message: string, options?: Partial<typeof defaultContext>) => void;\n\t\terror: (message: string, error: Error | ErrorInfo, options?: Partial<typeof defaultContext>) => void;\n\t} {\n\t\treturn {\n\t\t\tinfo: (message, opts = {}) =>\n\t\t\t\tthis.info(message, {\n\t\t\t\t\ttag: opts.tag ?? defaultContext.tag ?? LogTag.HTTP_REQUEST,\n\t\t\t\t\tdata: { ...defaultContext.data, ...opts.data },\n\t\t\t\t\tmetadata: { ...defaultContext.metadata, ...opts.metadata },\n\t\t\t\t}),\n\t\t\tdebug: (message, opts = {}) =>\n\t\t\t\tthis.debug(message, {\n\t\t\t\t\ttag: opts.tag ?? defaultContext.tag ?? LogTag.HTTP_REQUEST,\n\t\t\t\t\tdata: { ...defaultContext.data, ...opts.data },\n\t\t\t\t\tmetadata: { ...defaultContext.metadata, ...opts.metadata },\n\t\t\t\t}),\n\t\t\twarn: (message, opts = {}) =>\n\t\t\t\tthis.warn(message, {\n\t\t\t\t\ttag: opts.tag ?? defaultContext.tag ?? LogTag.HTTP_REQUEST,\n\t\t\t\t\tdata: { ...defaultContext.data, ...opts.data },\n\t\t\t\t\tmetadata: { ...defaultContext.metadata, ...opts.metadata },\n\t\t\t\t}),\n\t\t\terror: (message, error, opts = {}) =>\n\t\t\t\tthis.error(message, error, {\n\t\t\t\t\ttag: opts.tag ?? defaultContext.tag ?? LogTag.HTTP_REQUEST,\n\t\t\t\t\tdata: { ...defaultContext.data, ...opts.data },\n\t\t\t\t\tmetadata: { ...defaultContext.metadata, ...opts.metadata },\n\t\t\t\t}),\n\t\t};\n\t}\n}\n\nexport function withRequestContext<T>(store: RequestStore, fn: () => T | Promise<T>): Promise<T> {\n\treturn new Promise((resolve, reject) => {\n\t\trequestContext.run(store, async () => {\n\t\t\ttry {\n\t\t\t\tresolve(await fn());\n\t\t\t} catch (err) {\n\t\t\t\treject(err);\n\t\t\t}\n\t\t});\n\t});\n}"]}
@@ -22,7 +22,7 @@ Perfect for sharing types between frontend and backend applications.
22
22
 
23
23
  ## Version
24
24
 
25
- Version: 1.3.151
25
+ Version: 1.3.152
26
26
 
27
27
  ## Dependencies
28
28
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lyxa.ai/types",
3
- "version": "1.3.151",
3
+ "version": "1.3.152",
4
4
  "description": "Lyxa type definitions and validation schemas for both frontend and backend",
5
5
  "author": "elie <42282499+Internalizable@users.noreply.github.com>",
6
6
  "license": "MIT",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lyxa.ai/core",
3
- "version": "1.3.151",
3
+ "version": "1.3.152",
4
4
  "description": "The Core system of the Lyxa services.",
5
5
  "author": "elie <42282499+Internalizable@users.noreply.github.com>",
6
6
  "license": "MIT",