logixia 1.3.0 → 1.4.0
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.
- package/README.md +848 -7
- package/dist/.tsbuildinfo +1 -0
- package/dist/{index-iDTW2-eY.d.mts → index-Ium497V3.d.mts} +180 -2
- package/dist/index-Ium497V3.d.mts.map +1 -0
- package/dist/{index-CHIsdA9n.d.ts → index-t-ActikQ.d.ts} +180 -2
- package/dist/index-t-ActikQ.d.ts.map +1 -0
- package/dist/index.d.mts +458 -3
- package/dist/index.d.mts.map +1 -1
- package/dist/index.d.ts +458 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +436 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +416 -3
- package/dist/index.mjs.map +1 -1
- package/dist/{logitron-logger.module-C0G8JGVf.d.ts → logitron-logger.module-9vOhKWDG.d.ts} +120 -6
- package/dist/logitron-logger.module-9vOhKWDG.d.ts.map +1 -0
- package/dist/{logitron-logger.module-2AzkadqZ.mjs → logitron-logger.module-C939PIEV.mjs} +331 -10
- package/dist/logitron-logger.module-C939PIEV.mjs.map +1 -0
- package/dist/{logitron-logger.module-BqNKp0Fs.js → logitron-logger.module-CCnX7GwK.js} +383 -8
- package/dist/logitron-logger.module-CCnX7GwK.js.map +1 -0
- package/dist/{logitron-logger.module-DQKaZTJL.d.mts → logitron-logger.module-SArymP6b.d.mts} +120 -6
- package/dist/logitron-logger.module-SArymP6b.d.mts.map +1 -0
- package/dist/middleware.d.mts +1 -1
- package/dist/middleware.d.ts +1 -1
- package/dist/nest.d.mts +2 -2
- package/dist/nest.d.ts +2 -2
- package/dist/nest.js +2 -2
- package/dist/nest.mjs +2 -2
- package/dist/{promise-DaiZ2BaH.js → promise-BI-3eI4n.js} +285 -128
- package/dist/promise-BI-3eI4n.js.map +1 -0
- package/dist/{promise-C4pQPcK4.mjs → promise-BrZcjavs.mjs} +285 -128
- package/dist/promise-BrZcjavs.mjs.map +1 -0
- package/dist/testing.d.mts +1 -1
- package/dist/testing.d.ts +1 -1
- package/dist/testing.js +7 -1
- package/dist/testing.js.map +1 -1
- package/dist/testing.mjs +7 -1
- package/dist/testing.mjs.map +1 -1
- package/dist/{transport.manager-5VVdqS3o.mjs → transport.manager-DR7TLXQT.mjs} +82 -4
- package/dist/transport.manager-DR7TLXQT.mjs.map +1 -0
- package/dist/{transport.manager-DCOm4uIQ.js → transport.manager-DVTM978M.js} +82 -4
- package/dist/transport.manager-DVTM978M.js.map +1 -0
- package/dist/transports.d.mts +61 -168
- package/dist/transports.d.mts.map +1 -1
- package/dist/transports.d.ts +61 -168
- package/dist/transports.d.ts.map +1 -1
- package/dist/transports.js +1 -1
- package/dist/transports.mjs +1 -1
- package/package.json +72 -9
- package/dist/index-CHIsdA9n.d.ts.map +0 -1
- package/dist/index-iDTW2-eY.d.mts.map +0 -1
- package/dist/logitron-logger.module-2AzkadqZ.mjs.map +0 -1
- package/dist/logitron-logger.module-BqNKp0Fs.js.map +0 -1
- package/dist/logitron-logger.module-C0G8JGVf.d.ts.map +0 -1
- package/dist/logitron-logger.module-DQKaZTJL.d.mts.map +0 -1
- package/dist/promise-C4pQPcK4.mjs.map +0 -1
- package/dist/promise-DaiZ2BaH.js.map +0 -1
- package/dist/transport.manager-5VVdqS3o.mjs.map +0 -1
- package/dist/transport.manager-DCOm4uIQ.js.map +0 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["formatted: Record<string, unknown>","serialized: Record<string, unknown>","parts: string[]","createLoggerFromCore"],"sources":["../src/formatters/json.formatter.ts","../src/formatters/text.formatter.ts","../src/index.ts"],"sourcesContent":["/**\n * JSON formatter for Logixia\n */\n\nimport type { ILogFormatter, LogEntry } from '../types';\nimport { serializeError } from '../utils/error.utils';\n\nexport class JsonFormatter implements ILogFormatter {\n private includeTimestamp: boolean;\n private includeLevel: boolean;\n private includeAppName: boolean;\n private includeTraceId: boolean;\n private includeContext: boolean;\n private prettyPrint: boolean;\n\n constructor(\n options: {\n includeTimestamp?: boolean;\n includeLevel?: boolean;\n includeAppName?: boolean;\n includeTraceId?: boolean;\n includeContext?: boolean;\n prettyPrint?: boolean;\n } = {}\n ) {\n this.includeTimestamp = options.includeTimestamp ?? true;\n this.includeLevel = options.includeLevel ?? true;\n this.includeAppName = options.includeAppName ?? true;\n this.includeTraceId = options.includeTraceId ?? true;\n this.includeContext = options.includeContext ?? true;\n this.prettyPrint = options.prettyPrint ?? false;\n }\n\n format(entry: LogEntry): string {\n const formatted: Record<string, unknown> = {};\n\n // Add timestamp\n if (this.includeTimestamp) {\n formatted.timestamp = entry.timestamp;\n }\n\n // Add log level\n if (this.includeLevel) {\n formatted.level = entry.level.toLowerCase();\n formatted.levelValue = entry.level;\n }\n\n // Add app name\n if (this.includeAppName) {\n formatted.appName = entry.appName;\n }\n\n // Add trace ID\n if (this.includeTraceId && entry.traceId) {\n formatted.traceId = entry.traceId;\n }\n\n // Add context\n if (this.includeContext && entry.context) {\n formatted.context = entry.context;\n }\n\n // Add message\n formatted.message = entry.message;\n\n // Add payload\n if (entry.payload && Object.keys(entry.payload).length > 0) {\n formatted.payload = this.serializePayload(entry.payload);\n }\n\n // Add error if present\n if (entry.error) {\n formatted.error = serializeError(entry.error);\n }\n\n // Add metadata\n formatted.meta = {\n pid: process.pid,\n hostname: process.env.HOSTNAME || 'unknown',\n version: process.version,\n };\n\n return this.prettyPrint ? JSON.stringify(formatted, null, 2) : JSON.stringify(formatted);\n }\n\n private serializePayload(payload: Record<string, unknown>): Record<string, unknown> {\n const serialized: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(payload)) {\n try {\n if (value instanceof Error) {\n serialized[key] = serializeError(value);\n } else if (value instanceof Date) {\n serialized[key] = value.toISOString();\n } else if (typeof value === 'function') {\n serialized[key] = '[Function]';\n } else if (typeof value === 'symbol') {\n serialized[key] = value.toString();\n } else if (value === undefined) {\n serialized[key] = null;\n } else {\n serialized[key] = value;\n }\n } catch {\n serialized[key] = '[Unserializable]';\n }\n }\n\n return serialized;\n }\n}\n","/**\n * Text formatter for Logixia\n */\n\nimport type { ILogFormatter, LogEntry } from '../types';\nimport { LogLevel } from '../types';\n\nexport class TextFormatter implements ILogFormatter {\n private colorize: boolean;\n private includeTimestamp: boolean;\n private includeAppName: boolean;\n private includeTraceId: boolean;\n private includeContext: boolean;\n private timestampFormat: 'iso' | 'locale' | 'short';\n private colors: Record<string, string>;\n\n constructor(\n options: {\n colorize?: boolean;\n includeTimestamp?: boolean;\n includeAppName?: boolean;\n includeTraceId?: boolean;\n includeContext?: boolean;\n timestampFormat?: 'iso' | 'locale' | 'short';\n colors?: Record<string, string>;\n } = {}\n ) {\n this.colorize = options.colorize ?? true;\n this.includeTimestamp = options.includeTimestamp ?? true;\n this.includeAppName = options.includeAppName ?? true;\n this.includeTraceId = options.includeTraceId ?? true;\n this.includeContext = options.includeContext ?? true;\n this.timestampFormat = options.timestampFormat ?? 'locale';\n this.colors = {\n error: '\\x1b[31m', // Red\n warn: '\\x1b[33m', // Yellow\n info: '\\x1b[32m', // Green\n debug: '\\x1b[34m', // Blue\n trace: '\\x1b[35m', // Magenta\n verbose: '\\x1b[36m', // Cyan\n reset: '\\x1b[0m', // Reset\n bold: '\\x1b[1m', // Bold\n dim: '\\x1b[2m', // Dim\n ...options.colors,\n };\n }\n\n format(entry: LogEntry): string {\n const parts: string[] = [];\n\n // Add timestamp\n if (this.includeTimestamp) {\n const timestamp = this.formatTimestamp(entry.timestamp);\n parts.push(this.colorize ? `${this.colors.dim}${timestamp}${this.colors.reset}` : timestamp);\n }\n\n // Add log level\n const levelName = entry.level.toLowerCase();\n const levelColor = this.colors[levelName] || this.colors.reset;\n const formattedLevel = this.colorize\n ? `${levelColor}${this.colors.bold}${levelName.toUpperCase().padEnd(5)}${this.colors.reset}`\n : levelName.toUpperCase().padEnd(5);\n parts.push(`[${formattedLevel}]`);\n\n // Add app name\n if (this.includeAppName) {\n const appName = this.colorize\n ? `${this.colors.bold}${entry.appName}${this.colors.reset}`\n : entry.appName;\n parts.push(`[${appName}]`);\n }\n\n // Add trace ID\n if (this.includeTraceId && entry.traceId) {\n const traceId = this.colorize\n ? `${this.colors.dim}${entry.traceId}${this.colors.reset}`\n : entry.traceId;\n parts.push(`[${traceId}]`);\n }\n\n // Add context\n if (this.includeContext && entry.context) {\n const context = this.colorize\n ? `${this.colors.cyan}${entry.context}${this.colors.reset}`\n : entry.context;\n parts.push(`[${context}]`);\n }\n\n // Add message\n const message =\n this.colorize && entry.level === LogLevel.ERROR\n ? `${this.colors.error}${entry.message}${this.colors.reset}`\n : entry.message;\n parts.push(message);\n\n // Add payload\n if (entry.payload && Object.keys(entry.payload).length > 0) {\n const payload = this.formatPayload(entry.payload);\n if (payload) {\n parts.push(this.colorize ? `${this.colors.dim}${payload}${this.colors.reset}` : payload);\n }\n }\n\n return parts.join(' ');\n }\n\n private formatTimestamp(timestamp: string): string {\n const date = new Date(timestamp);\n\n switch (this.timestampFormat) {\n case 'iso':\n return date.toISOString();\n case 'short':\n return date.toLocaleTimeString();\n case 'locale':\n default:\n return date.toLocaleString();\n }\n }\n\n private formatPayload(payload: Record<string, unknown>): string {\n try {\n // Handle simple objects\n if (Object.keys(payload).length === 1) {\n const entry = Object.entries(payload)[0];\n if (entry) {\n const [key, value] = entry;\n if (\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n ) {\n return `${key}=${value}`;\n }\n }\n }\n\n // Handle multiple properties or complex objects\n const formatted = Object.entries(payload)\n .map(([key, value]) => {\n if (value === null || value === undefined) {\n return `${key}=${value}`;\n }\n if (typeof value === 'string') {\n return `${key}=\"${value}\"`;\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return `${key}=${value}`;\n }\n if (value instanceof Date) {\n return `${key}=${value.toISOString()}`;\n }\n if (typeof value === 'object') {\n return `${key}=${JSON.stringify(value)}`;\n }\n return `${key}=${String(value)}`;\n })\n .join(' ');\n\n return formatted;\n } catch {\n return JSON.stringify(payload);\n }\n }\n\n /**\n * Create a formatter with preset configurations\n */\n static createSimple(): TextFormatter {\n return new TextFormatter({\n colorize: true,\n includeTimestamp: true,\n includeAppName: false,\n includeTraceId: false,\n includeContext: true,\n timestampFormat: 'short',\n });\n }\n\n static createDetailed(): TextFormatter {\n return new TextFormatter({\n colorize: true,\n includeTimestamp: true,\n includeAppName: true,\n includeTraceId: true,\n includeContext: true,\n timestampFormat: 'locale',\n });\n }\n\n static createMinimal(): TextFormatter {\n return new TextFormatter({\n colorize: false,\n includeTimestamp: false,\n includeAppName: false,\n includeTraceId: false,\n includeContext: false,\n });\n }\n}\n","/**\n * Logixia - Advanced TypeScript Logger\n *\n * A comprehensive logging library with support for:\n * - Multiple output formats (console, file, JSON)\n * - Trace ID tracking\n * - Performance monitoring\n * - NestJS integration\n * - Customizable log levels and colors\n * - Intelligent log search and aggregation\n * - Natural language query processing\n * - Pattern recognition and anomaly detection\n */\n\nimport { createLogger as createLoggerFromCore, LogixiaLogger } from './core/logitron-logger';\nimport { LogixiaLoggerService } from './core/logitron-nestjs.service';\nimport type { Environment, LogColor, LoggerConfig } from './types';\nimport { LogLevel } from './types';\n\n// Type exports\nexport * from './core/logitron-logger.module';\nexport * from './core/logitron-nestjs.service';\nexport * from './formatters';\nexport * from './types';\nexport * from './utils/error.utils';\nexport { applyRedaction, redactObject } from './utils/redact.utils';\nexport * from './utils/shutdown.utils';\nexport * from './utils/trace.utils';\n\n// Search module exports\nexport * from './search';\n\n// Context propagation (AsyncLocalStorage)\nexport type { LogContext } from './context/async-context';\nexport {\n createExpressContextMiddleware,\n createFastifyContextHook,\n LogixiaContext,\n} from './context/async-context';\n\n// Sampling stats (SamplingConfig is already exported via ./types)\nexport type { SamplingStats } from './utils/sampling.utils';\n\n// Core exports\nexport { DEFAULT_CONFIG, LogixiaLogger, LogixiaLoggerService };\n\n/**\n * Default configuration for Logixia logger\n */\nconst DEFAULT_CONFIG = {\n appName: 'App',\n environment: 'development' as Environment,\n traceId: true,\n format: {\n timestamp: true,\n colorize: true,\n json: false,\n },\n silent: false,\n levelOptions: {\n level: LogLevel.INFO,\n levels: {\n [LogLevel.ERROR]: 0,\n [LogLevel.WARN]: 1,\n [LogLevel.INFO]: 2,\n [LogLevel.DEBUG]: 3,\n [LogLevel.TRACE]: 4,\n [LogLevel.VERBOSE]: 5,\n },\n colors: {\n [LogLevel.ERROR]: 'red',\n [LogLevel.WARN]: 'yellow',\n [LogLevel.INFO]: 'blue',\n [LogLevel.DEBUG]: 'green',\n [LogLevel.TRACE]: 'gray',\n [LogLevel.VERBOSE]: 'cyan',\n } as Record<string, LogColor>,\n },\n fields: {\n timestamp: true,\n level: true,\n appName: true,\n traceId: true,\n message: true,\n payload: true,\n timeTaken: true,\n },\n outputs: ['console'],\n};\n\n/**\n * Create a new Logixia logger instance with TypeScript support for custom levels\n * @param config - Logger configuration\n * @returns Typed logger instance\n */\nexport const createLogger = createLoggerFromCore;\n\n/**\n * Create a new Logixia logger service for NestJS\n * @param config - Logger configuration\n * @returns LogixiaLoggerService instance\n */\nexport function createLoggerService(config?: Partial<LoggerConfig>): LogixiaLoggerService {\n return new LogixiaLoggerService({ ...DEFAULT_CONFIG, ...config });\n}\n\n/**\n * Default logger instance\n */\nexport const logger = new LogixiaLogger(DEFAULT_CONFIG);\n\n/**\n * Export default configuration for reference\n */\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["logger","entry: Record<string, unknown>","exit: Record<string, unknown>","LogixiaExceptionFilter","logger?: LogixiaLoggerService","message: string","formatted: Record<string, unknown>","serialized: Record<string, unknown>","parts: string[]","warnings: string[]","logger","DEFAULT_BUCKETS: readonly number[]","pairs: Record<string, string>","lines: string[]","createLoggerFromCore"],"sources":["../src/core/nestjs-extras.ts","../src/formatters/json.formatter.ts","../src/formatters/text.formatter.ts","../src/utils/typed-logger.ts","../src/metrics.ts","../src/index.ts"],"sourcesContent":["/**\n * logixia — NestJS extras: @InjectLogger, @LogMethod, LogixiaExceptionFilter\n *\n * Completes the NestJS deep integration story:\n * - @InjectLogger() — inject the logger via NestJS DI without typing LOGIXIA_TOKEN manually\n * - @LogMethod() — auto-log method entry / exit with args and return value\n * - LogixiaExceptionFilter — catch-all exception filter that logs unhandled errors\n * with full request context before re-throwing\n *\n * @example Full setup\n * ```ts\n * // app.module.ts\n * import { LogixiaModule } from 'logixia';\n * @Module({ imports: [LogixiaModule.forRoot({ appName: 'api' })] })\n * export class AppModule {}\n *\n * // order.service.ts\n * import { Injectable } from '@nestjs/common';\n * import { InjectLogger, LogMethod, LogixiaLoggerService } from 'logixia';\n *\n * @Injectable()\n * export class OrderService {\n * constructor(@InjectLogger() private readonly logger: LogixiaLoggerService) {}\n *\n * @LogMethod()\n * async createOrder(dto: CreateOrderDto) { … }\n * }\n *\n * // main.ts\n * import { LogixiaExceptionFilter } from 'logixia';\n * app.useGlobalFilters(new LogixiaExceptionFilter(logger));\n * ```\n */\n\nimport type { ArgumentsHost, ExceptionFilter } from '@nestjs/common';\nimport { Catch, HttpException, Inject, Optional } from '@nestjs/common';\n\nimport { LOGIXIA_LOGGER_PREFIX } from './logitron-logger.module';\nimport type { LogixiaLoggerService } from './logitron-nestjs.service';\n\n// ── @InjectLogger() ──────────────────────────────────────────────────────────\n\n/**\n * Inject the Logixia logger registered in the current NestJS DI container.\n *\n * Equivalent to `@Inject(LOGIXIA_LOGGER_TOKEN)` but without needing to import\n * the internal token constant yourself.\n *\n * @example\n * ```ts\n * constructor(@InjectLogger() private readonly logger: LogixiaLoggerService) {}\n * ```\n */\nexport const InjectLogger = (): ParameterDecorator => Inject(`${LOGIXIA_LOGGER_PREFIX}SERVICE`);\n\n// ── @LogMethod() ─────────────────────────────────────────────────────────────\n\nexport interface LogMethodOptions {\n /**\n * Log level to use for entry / exit messages.\n * @default 'debug'\n */\n level?: 'debug' | 'info' | 'verbose';\n /**\n * Whether to log the arguments passed to the method.\n * Disable for high-throughput hot paths.\n * @default true\n */\n logArgs?: boolean;\n /**\n * Whether to log the return value of the method.\n * @default false\n */\n logResult?: boolean;\n /**\n * Whether to log error stack traces for thrown errors.\n * @default true\n */\n logErrors?: boolean;\n /**\n * Custom label used in log messages instead of the auto-detected class.method name.\n */\n label?: string;\n}\n\n/**\n * Method decorator that auto-logs entry, exit, duration, and errors.\n *\n * Works on both async and sync methods. Attaches to the logger found on the\n * class instance via a `logger` property (the conventional NestJS name).\n *\n * @example\n * ```ts\n * @LogMethod({ level: 'info', logArgs: true })\n * async processPayment(orderId: string): Promise<void> { … }\n * ```\n */\nexport function LogMethod(options: LogMethodOptions = {}): MethodDecorator {\n const { level = 'debug', logArgs = true, logResult = false, logErrors = true } = options;\n\n // Use PropertyDescriptor (not generic TypedPropertyDescriptor<T>) to avoid\n // strict generic inference issues with exactOptionalPropertyTypes.\n return function (\n target: object,\n propertyKey: string | symbol,\n descriptor: PropertyDescriptor\n ): PropertyDescriptor {\n const originalMethod = descriptor.value as ((...args: unknown[]) => unknown) | undefined;\n if (typeof originalMethod !== 'function') return descriptor;\n\n const methodName = String(propertyKey);\n const className =\n (target as { constructor?: { name?: string } }).constructor?.name ?? 'Unknown';\n const label = options.label ?? `${className}.${methodName}`;\n\n descriptor.value = async function (\n this: { logger?: LogixiaLoggerService },\n ...args: unknown[]\n ) {\n const logger = this.logger;\n const start = Date.now();\n\n const entry: Record<string, unknown> = { method: label };\n if (logArgs && args.length > 0) {\n entry['args'] = args;\n }\n\n if (logger) {\n // Use logLevel (extended method) rather than the NestJS interface debug/info\n // which only accepts (message: unknown, context?: string)\n const logFn =\n (\n logger as unknown as Record<\n string,\n (msg: string, data?: Record<string, unknown>) => Promise<void>\n >\n )[level] ?? logger.debug.bind(logger);\n if (typeof logFn === 'function') {\n await (logFn as (msg: string, data?: Record<string, unknown>) => Promise<void>)(\n `→ ${label}`,\n entry\n ).catch(() => void 0);\n }\n }\n\n try {\n const result = await (originalMethod.apply(this, args) as Promise<unknown>);\n\n const exit: Record<string, unknown> = {\n method: label,\n durationMs: Date.now() - start,\n };\n if (logResult) exit['result'] = result;\n\n if (logger) {\n const logFn =\n (\n logger as unknown as Record<\n string,\n (msg: string, data?: Record<string, unknown>) => Promise<void>\n >\n )[level] ?? logger.debug.bind(logger);\n if (typeof logFn === 'function') {\n await (logFn as (msg: string, data?: Record<string, unknown>) => Promise<void>)(\n `← ${label}`,\n exit\n ).catch(() => void 0);\n }\n }\n\n return result;\n } catch (error) {\n if (logger && logErrors) {\n const err = error instanceof Error ? error : new Error(String(error));\n logger.error(err, `${label} durationMs=${Date.now() - start}`);\n }\n throw error;\n }\n };\n\n return descriptor;\n };\n}\n\n// ── LogixiaExceptionFilter ───────────────────────────────────────────────────\n\n/**\n * Global NestJS exception filter that logs every unhandled exception with full\n * request context (method, URL, status) before delegating the response.\n *\n * Register in `main.ts`:\n * ```ts\n * const logger = app.get(LogixiaLoggerService);\n * app.useGlobalFilters(new LogixiaExceptionFilter(logger));\n * ```\n */\n@Catch()\nexport class LogixiaExceptionFilter implements ExceptionFilter {\n constructor(\n @Optional()\n @Inject(`${LOGIXIA_LOGGER_PREFIX}SERVICE`)\n private readonly logger?: LogixiaLoggerService\n ) {}\n\n catch(exception: unknown, host: ArgumentsHost): void {\n const ctx = host.switchToHttp();\n const response = ctx.getResponse<{\n status(code: number): { json(body: unknown): void };\n }>();\n const request = ctx.getRequest<{\n method?: string;\n url?: string;\n }>();\n\n const isHttp = exception instanceof HttpException;\n const status = isHttp ? exception.getStatus() : 500;\n\n let message: string;\n if (isHttp) {\n message = exception.message;\n } else if (exception instanceof Error) {\n message = exception.message;\n } else {\n message = 'Internal server error';\n }\n\n const contextStr = `method=${String(request.method ?? '')} url=${String(request.url ?? '')} status=${status}`;\n\n if (this.logger) {\n if (status >= 500) {\n const err = exception instanceof Error ? exception : new Error(String(exception));\n // NestJS LoggerService error signature: (message, trace?, context?)\n // fire-and-forget — cannot await in a synchronous catch filter\n this.logger.error(err, undefined, contextStr);\n } else {\n this.logger.warn(`[${status}] ${message}`, contextStr);\n }\n }\n\n response.status(status).json({\n statusCode: status,\n message,\n timestamp: new Date().toISOString(),\n path: request.url,\n });\n }\n}\n","/**\n * JSON formatter for Logixia\n */\n\nimport type { ILogFormatter, LogEntry } from '../types';\nimport { serializeError } from '../utils/error.utils';\n\nexport class JsonFormatter implements ILogFormatter {\n private includeTimestamp: boolean;\n private includeLevel: boolean;\n private includeAppName: boolean;\n private includeTraceId: boolean;\n private includeContext: boolean;\n private prettyPrint: boolean;\n\n constructor(\n options: {\n includeTimestamp?: boolean;\n includeLevel?: boolean;\n includeAppName?: boolean;\n includeTraceId?: boolean;\n includeContext?: boolean;\n prettyPrint?: boolean;\n } = {}\n ) {\n this.includeTimestamp = options.includeTimestamp ?? true;\n this.includeLevel = options.includeLevel ?? true;\n this.includeAppName = options.includeAppName ?? true;\n this.includeTraceId = options.includeTraceId ?? true;\n this.includeContext = options.includeContext ?? true;\n this.prettyPrint = options.prettyPrint ?? false;\n }\n\n format(entry: LogEntry): string {\n const formatted: Record<string, unknown> = {};\n\n // Add timestamp\n if (this.includeTimestamp) {\n formatted.timestamp = entry.timestamp;\n }\n\n // Add log level\n if (this.includeLevel) {\n formatted.level = entry.level.toLowerCase();\n formatted.levelValue = entry.level;\n }\n\n // Add app name\n if (this.includeAppName) {\n formatted.appName = entry.appName;\n }\n\n // Add trace ID\n if (this.includeTraceId && entry.traceId) {\n formatted.traceId = entry.traceId;\n }\n\n // Add context\n if (this.includeContext && entry.context) {\n formatted.context = entry.context;\n }\n\n // Add message\n formatted.message = entry.message;\n\n // Add payload\n if (entry.payload && Object.keys(entry.payload).length > 0) {\n formatted.payload = this.serializePayload(entry.payload);\n }\n\n // Add error if present\n if (entry.error) {\n formatted.error = serializeError(entry.error);\n }\n\n // Add metadata\n formatted.meta = {\n pid: process.pid,\n hostname: process.env.HOSTNAME || 'unknown',\n version: process.version,\n };\n\n return this.prettyPrint ? JSON.stringify(formatted, null, 2) : JSON.stringify(formatted);\n }\n\n private serializePayload(payload: Record<string, unknown>): Record<string, unknown> {\n const serialized: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(payload)) {\n try {\n if (value instanceof Error) {\n serialized[key] = serializeError(value);\n } else if (value instanceof Date) {\n serialized[key] = value.toISOString();\n } else if (typeof value === 'function') {\n serialized[key] = '[Function]';\n } else if (typeof value === 'symbol') {\n serialized[key] = value.toString();\n } else if (value === undefined) {\n serialized[key] = null;\n } else {\n serialized[key] = value;\n }\n } catch {\n serialized[key] = '[Unserializable]';\n }\n }\n\n return serialized;\n }\n}\n","/**\n * Text formatter for Logixia\n */\n\nimport type { ILogFormatter, LogEntry } from '../types';\nimport { LogLevel } from '../types';\n\nexport class TextFormatter implements ILogFormatter {\n private colorize: boolean;\n private includeTimestamp: boolean;\n private includeAppName: boolean;\n private includeTraceId: boolean;\n private includeContext: boolean;\n private timestampFormat: 'iso' | 'locale' | 'short';\n private colors: Record<string, string>;\n\n constructor(\n options: {\n colorize?: boolean;\n includeTimestamp?: boolean;\n includeAppName?: boolean;\n includeTraceId?: boolean;\n includeContext?: boolean;\n timestampFormat?: 'iso' | 'locale' | 'short';\n colors?: Record<string, string>;\n } = {}\n ) {\n this.colorize = options.colorize ?? true;\n this.includeTimestamp = options.includeTimestamp ?? true;\n this.includeAppName = options.includeAppName ?? true;\n this.includeTraceId = options.includeTraceId ?? true;\n this.includeContext = options.includeContext ?? true;\n this.timestampFormat = options.timestampFormat ?? 'locale';\n this.colors = {\n error: '\\x1b[31m', // Red\n warn: '\\x1b[33m', // Yellow\n info: '\\x1b[32m', // Green\n debug: '\\x1b[34m', // Blue\n trace: '\\x1b[35m', // Magenta\n verbose: '\\x1b[36m', // Cyan\n reset: '\\x1b[0m', // Reset\n bold: '\\x1b[1m', // Bold\n dim: '\\x1b[2m', // Dim\n ...options.colors,\n };\n }\n\n format(entry: LogEntry): string {\n const parts: string[] = [];\n\n // Add timestamp\n if (this.includeTimestamp) {\n const timestamp = this.formatTimestamp(entry.timestamp);\n parts.push(this.colorize ? `${this.colors.dim}${timestamp}${this.colors.reset}` : timestamp);\n }\n\n // Add log level\n const levelName = entry.level.toLowerCase();\n const levelColor = this.colors[levelName] || this.colors.reset;\n const formattedLevel = this.colorize\n ? `${levelColor}${this.colors.bold}${levelName.toUpperCase().padEnd(5)}${this.colors.reset}`\n : levelName.toUpperCase().padEnd(5);\n parts.push(`[${formattedLevel}]`);\n\n // Add app name\n if (this.includeAppName) {\n const appName = this.colorize\n ? `${this.colors.bold}${entry.appName}${this.colors.reset}`\n : entry.appName;\n parts.push(`[${appName}]`);\n }\n\n // Add trace ID\n if (this.includeTraceId && entry.traceId) {\n const traceId = this.colorize\n ? `${this.colors.dim}${entry.traceId}${this.colors.reset}`\n : entry.traceId;\n parts.push(`[${traceId}]`);\n }\n\n // Add context\n if (this.includeContext && entry.context) {\n const context = this.colorize\n ? `${this.colors.cyan}${entry.context}${this.colors.reset}`\n : entry.context;\n parts.push(`[${context}]`);\n }\n\n // Add message\n const message =\n this.colorize && entry.level === LogLevel.ERROR\n ? `${this.colors.error}${entry.message}${this.colors.reset}`\n : entry.message;\n parts.push(message);\n\n // Add payload\n if (entry.payload && Object.keys(entry.payload).length > 0) {\n const payload = this.formatPayload(entry.payload);\n if (payload) {\n parts.push(this.colorize ? `${this.colors.dim}${payload}${this.colors.reset}` : payload);\n }\n }\n\n return parts.join(' ');\n }\n\n private formatTimestamp(timestamp: string): string {\n const date = new Date(timestamp);\n\n switch (this.timestampFormat) {\n case 'iso':\n return date.toISOString();\n case 'short':\n return date.toLocaleTimeString();\n case 'locale':\n default:\n return date.toLocaleString();\n }\n }\n\n private formatPayload(payload: Record<string, unknown>): string {\n try {\n // Handle simple objects\n if (Object.keys(payload).length === 1) {\n const entry = Object.entries(payload)[0];\n if (entry) {\n const [key, value] = entry;\n if (\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n ) {\n return `${key}=${value}`;\n }\n }\n }\n\n // Handle multiple properties or complex objects\n const formatted = Object.entries(payload)\n .map(([key, value]) => {\n if (value === null || value === undefined) {\n return `${key}=${value}`;\n }\n if (typeof value === 'string') {\n return `${key}=\"${value}\"`;\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return `${key}=${value}`;\n }\n if (value instanceof Date) {\n return `${key}=${value.toISOString()}`;\n }\n if (typeof value === 'object') {\n return `${key}=${JSON.stringify(value)}`;\n }\n return `${key}=${String(value)}`;\n })\n .join(' ');\n\n return formatted;\n } catch {\n return JSON.stringify(payload);\n }\n }\n\n /**\n * Create a formatter with preset configurations\n */\n static createSimple(): TextFormatter {\n return new TextFormatter({\n colorize: true,\n includeTimestamp: true,\n includeAppName: false,\n includeTraceId: false,\n includeContext: true,\n timestampFormat: 'short',\n });\n }\n\n static createDetailed(): TextFormatter {\n return new TextFormatter({\n colorize: true,\n includeTimestamp: true,\n includeAppName: true,\n includeTraceId: true,\n includeContext: true,\n timestampFormat: 'locale',\n });\n }\n\n static createMinimal(): TextFormatter {\n return new TextFormatter({\n colorize: false,\n includeTimestamp: false,\n includeAppName: false,\n includeTraceId: false,\n includeContext: false,\n });\n }\n}\n","/**\n * logixia — TypeScript typed log fields\n *\n * Solves the type-safety gap: standard `Record<string, unknown>` metadata gives\n * zero IDE autocomplete and lets typos slip silently into production logs.\n *\n * Two complementary utilities:\n *\n * 1. `createTypedLogger<TFields>()` — wraps any IBaseLogger so that the second\n * argument of every log method is constrained to `TFields` (a typed object).\n * Compile-time safety, zero runtime overhead.\n *\n * 2. `defineLogSchema<TFields>(schema)` — declares expected fields with optional\n * validators. In development (NODE_ENV !== 'production') every log call is\n * validated against the schema and a warning is emitted for missing required\n * fields or type mismatches.\n *\n * @example\n * ```ts\n * import { createTypedLogger, defineLogSchema } from 'logixia';\n *\n * interface OrderFields {\n * orderId: string;\n * userId: string;\n * amount?: number;\n * currency?: string;\n * }\n *\n * const schema = defineLogSchema<OrderFields>({\n * orderId: { type: 'string', required: true },\n * userId: { type: 'string', required: true },\n * amount: { type: 'number' },\n * currency: { type: 'string' },\n * });\n *\n * const orderLogger = createTypedLogger<OrderFields>(baseLogger, schema);\n * await orderLogger.info('Order created', { orderId: 'ord_123', userId: 'usr_456', amount: 99.99 });\n * // ^^^^ fully typed autocomplete ^^^^\n * ```\n */\n\nimport { internalWarn } from './internal-log';\n\n// ── Schema types ─────────────────────────────────────────────────────────────\n\nexport type LogFieldType = 'string' | 'number' | 'boolean' | 'object' | 'array';\n\nexport interface LogFieldDef {\n type: LogFieldType;\n /** Emit a warning when this field is missing from the log call. Default: false */\n required?: boolean;\n /** Custom validator — return a string to emit it as a warning message. */\n validate?: (value: unknown) => string | undefined;\n}\n\nexport type LogSchema<TFields extends Record<string, unknown>> = {\n [K in keyof TFields]: LogFieldDef;\n};\n\nexport interface CompiledSchema<TFields extends Record<string, unknown>> {\n readonly fields: LogSchema<TFields>;\n /**\n * Validate a payload against the schema.\n * Returns an array of warning strings (empty = pass).\n * Only runs in non-production environments.\n */\n validate(payload: Partial<TFields>): string[];\n}\n\n// ── defineLogSchema ──────────────────────────────────────────────────────────\n\n/**\n * Define a typed schema for a category of log entries.\n *\n * Call this once at module initialisation and pass it to `createTypedLogger`.\n * In development, every log call is validated against the schema.\n */\nexport function defineLogSchema<TFields extends Record<string, unknown>>(\n fields: LogSchema<TFields>\n): CompiledSchema<TFields> {\n return {\n fields,\n validate(payload: Partial<TFields>): string[] {\n if (process.env['NODE_ENV'] === 'production') return [];\n\n const warnings: string[] = [];\n\n for (const [key, def] of Object.entries(fields) as [keyof TFields & string, LogFieldDef][]) {\n const value = payload[key];\n\n if (def.required && (value === undefined || value === null)) {\n warnings.push(`Required field \"${key}\" is missing`);\n continue;\n }\n\n if (value !== undefined && value !== null) {\n const actualType = Array.isArray(value) ? 'array' : typeof value;\n if (actualType !== def.type) {\n warnings.push(`Field \"${key}\" expected type \"${def.type}\" but got \"${actualType}\"`);\n }\n\n if (def.validate) {\n const msg = def.validate(value);\n if (msg) warnings.push(`Field \"${key}\": ${msg}`);\n }\n }\n }\n\n return warnings;\n },\n };\n}\n\n// ── TypedLogger ──────────────────────────────────────────────────────────────\n\n/** IBaseLogger-compatible subset used by TypedLogger */\nexport interface LoggerLike {\n error(message: string | Error, data?: Record<string, unknown>): Promise<void>;\n warn(message: string, data?: Record<string, unknown>): Promise<void>;\n info(message: string, data?: Record<string, unknown>): Promise<void>;\n debug(message: string, data?: Record<string, unknown>): Promise<void>;\n verbose?(message: string, data?: Record<string, unknown>): Promise<void>;\n trace?(message: string, data?: Record<string, unknown>): Promise<void>;\n}\n\n/**\n * A logger whose metadata is typed to `TFields`.\n *\n * The `error` overload still accepts a plain `Error` object as the first arg\n * (with optional `TFields` data) so the typed logger remains a drop-in replacement.\n */\nexport interface TypedLogger<TFields extends Record<string, unknown>> {\n error(error: Error, data?: Partial<TFields>): Promise<void>;\n error(message: string, data?: Partial<TFields>): Promise<void>;\n warn(message: string, data?: Partial<TFields>): Promise<void>;\n info(message: string, data?: Partial<TFields>): Promise<void>;\n debug(message: string, data?: Partial<TFields>): Promise<void>;\n verbose(message: string, data?: Partial<TFields>): Promise<void>;\n trace(message: string, data?: Partial<TFields>): Promise<void>;\n /** Access the underlying untyped logger if needed. */\n readonly raw: LoggerLike;\n}\n\n/**\n * Wrap any logixia logger with a type-safe field interface.\n *\n * @param logger Any object that implements `IBaseLogger` (e.g. the result of `createLogger()`)\n * @param schema Optional schema for dev-time validation. Created with `defineLogSchema()`.\n */\nexport function createTypedLogger<TFields extends Record<string, unknown>>(\n logger: LoggerLike,\n schema?: CompiledSchema<TFields>\n): TypedLogger<TFields> {\n function withValidation(\n level: string,\n fn: (msg: string, data?: Record<string, unknown>) => Promise<void>,\n message: string,\n data?: Partial<TFields>\n ): Promise<void> {\n if (schema && data) {\n const warnings = schema.validate(data);\n for (const w of warnings) {\n internalWarn(`[logixia/schema] ${w} — level=${level} message=\"${message}\"`);\n }\n }\n return fn(message, data as Record<string, unknown> | undefined);\n }\n\n return {\n raw: logger,\n error(messageOrError: string | Error, data?: Partial<TFields>): Promise<void> {\n return logger.error(messageOrError as string, data as Record<string, unknown> | undefined);\n },\n warn: (m, d) => withValidation('warn', logger.warn.bind(logger), m, d),\n info: (m, d) => withValidation('info', logger.info.bind(logger), m, d),\n debug: (m, d) => withValidation('debug', logger.debug.bind(logger), m, d),\n verbose: (m, d) =>\n withValidation('verbose', (logger.verbose ?? logger.debug).bind(logger), m, d),\n trace: (m, d) => withValidation('trace', (logger.trace ?? logger.debug).bind(logger), m, d),\n };\n}\n","/**\n * logixia — Metrics extraction → Prometheus\n *\n * Automatically extracts metrics from structured log fields and exposes them\n * in the Prometheus text exposition format (version 0.0.4).\n * No external dependency — the format is fully self-contained.\n *\n * Supported metric types:\n * - `counter` — incremented on each matching log entry\n * - `histogram` — observes a numeric payload field per entry\n * - `gauge` — tracks the most recent numeric value of a payload field\n *\n * Usage:\n * ```ts\n * import { createMetricsPlugin } from 'logixia';\n *\n * const metrics = createMetricsPlugin({\n * http_request_duration: {\n * type: 'histogram',\n * field: 'duration',\n * labels: ['method', 'statusCode'],\n * help: 'HTTP request duration in milliseconds',\n * },\n * error_count: {\n * type: 'counter',\n * levelFilter: 'error',\n * labels: ['context'],\n * help: 'Total error log entries',\n * },\n * active_connections: {\n * type: 'gauge',\n * field: 'connections',\n * help: 'Current active connection count',\n * },\n * });\n *\n * logger.use(metrics); // start collecting\n * app.get('/metrics', metrics.expressHandler()); // expose for Prometheus scrape\n * ```\n *\n * All metric names are automatically prefixed with `logixia_`.\n * Output follows https://prometheus.io/docs/instrumenting/exposition_formats/\n */\n\nimport type { IncomingMessage, ServerResponse } from 'node:http';\n\nimport type { LogixiaPlugin } from './plugin';\nimport type { LogEntry } from './types/index';\n\n// ── Metric config types ───────────────────────────────────────────────────────\n\n/**\n * Increment a counter on each matching log entry.\n *\n * @example Count every error entry, labelled by context:\n * ```ts\n * error_count: { type: 'counter', levelFilter: 'error', labels: ['context'] }\n * ```\n *\n * @example Count entries where payload.event === 'checkout':\n * ```ts\n * checkout_events: { type: 'counter', field: 'event', value: 'checkout' }\n * ```\n */\nexport interface CounterConfig {\n type: 'counter';\n /** Only increment when `entry.level` equals this value. Omit to count all entries. */\n levelFilter?: string;\n /**\n * Only increment when `entry.payload[field] === value`.\n * If omitted, every entry (matching `levelFilter`) is counted.\n */\n field?: string;\n value?: unknown;\n /** `entry.payload` fields used as Prometheus label dimensions. `'level'` is also valid. */\n labels?: string[];\n help?: string;\n}\n\n/**\n * Observe a numeric payload field and bucket it into a Prometheus histogram.\n *\n * @example Duration histogram labelled by HTTP method and status code:\n * ```ts\n * http_request_duration: {\n * type: 'histogram',\n * field: 'duration',\n * labels: ['method', 'statusCode'],\n * buckets: [10, 25, 50, 100, 250, 500, 1000],\n * }\n * ```\n */\nexport interface HistogramConfig {\n type: 'histogram';\n /** The `entry.payload` field containing the numeric value to observe. */\n field: string;\n /** `entry.payload` fields used as Prometheus label dimensions. */\n labels?: string[];\n help?: string;\n /**\n * Bucket upper bounds (inclusive). Sorted automatically.\n * Default: [1, 5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000, 10000]\n */\n buckets?: number[];\n}\n\n/**\n * Track the most recent numeric value of a payload field as a gauge.\n *\n * @example Track live connection count:\n * ```ts\n * active_connections: { type: 'gauge', field: 'connections' }\n * ```\n */\nexport interface GaugeConfig {\n type: 'gauge';\n /** The `entry.payload` field containing the numeric value. */\n field: string;\n /** `entry.payload` fields used as Prometheus label dimensions. */\n labels?: string[];\n help?: string;\n}\n\nexport type MetricConfig = CounterConfig | HistogramConfig | GaugeConfig;\nexport type MetricsMap = Record<string, MetricConfig>;\n\n// ── Internal metric state ─────────────────────────────────────────────────────\n\ninterface CounterState {\n type: 'counter';\n values: Map<string, number>;\n}\n\ninterface HistogramState {\n type: 'histogram';\n buckets: number[];\n /** Parallel arrays; index = bucket index; last entry = +Inf cumulative count */\n counts: Map<string, number[]>;\n sums: Map<string, number>;\n observations: Map<string, number>;\n}\n\ninterface GaugeState {\n type: 'gauge';\n values: Map<string, number>;\n}\n\ntype MetricState = CounterState | HistogramState | GaugeState;\n\n// ── Defaults ──────────────────────────────────────────────────────────────────\n\nconst DEFAULT_BUCKETS: readonly number[] = [\n 1, 5, 10, 25, 50, 100, 250, 500, 1_000, 2_500, 5_000, 10_000,\n];\n\n// ── Label helpers ─────────────────────────────────────────────────────────────\n\nfunction buildLabelKey(config: MetricConfig, entry: LogEntry): string {\n const labelNames = config.labels ?? [];\n if (labelNames.length === 0) return '{}';\n const pairs: Record<string, string> = {};\n const payload = entry.payload ?? {};\n for (const name of labelNames) {\n const raw = name === 'level' ? entry.level : payload[name];\n pairs[name] = raw !== undefined && raw !== null ? String(raw) : '';\n }\n return JSON.stringify(pairs);\n}\n\nfunction renderLabels(labelKey: string): string {\n if (labelKey === '{}') return '';\n const obj = JSON.parse(labelKey) as Record<string, string>;\n const parts = Object.entries(obj).map(([k, v]) => `${k}=\"${escapeLabel(v)}\"`);\n return `{${parts.join(',')}}`;\n}\n\nfunction escapeLabel(value: string): string {\n return value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"').replace(/\\n/g, '\\\\n');\n}\n\n// ── MetricsPlugin ─────────────────────────────────────────────────────────────\n\n/**\n * A logixia plugin that extracts Prometheus-compatible metrics from log entries.\n *\n * Implements `LogixiaPlugin` — pass directly to `logger.use()`:\n * ```ts\n * const metrics = new MetricsPlugin({ ... });\n * logger.use(metrics);\n * ```\n *\n * Or use the `createMetricsPlugin()` factory (preferred):\n * ```ts\n * const metrics = createMetricsPlugin({ ... });\n * logger.use(metrics);\n * ```\n */\nexport class MetricsPlugin implements LogixiaPlugin {\n public readonly name = 'logixia-metrics';\n\n private readonly map: MetricsMap;\n private readonly metricState = new Map<string, MetricState>();\n\n constructor(map: MetricsMap) {\n this.map = map;\n this.initAllState();\n }\n\n // ── LogixiaPlugin lifecycle ────────────────────────────────────────────────\n\n onInit(): void {\n // State is initialised in the constructor; nothing extra needed here.\n }\n\n onLog(entry: LogEntry): LogEntry {\n const payload = entry.payload ?? {};\n\n for (const [rawName, config] of Object.entries(this.map)) {\n const state = this.metricState.get(rawName);\n if (!state) continue;\n\n const labelKey = buildLabelKey(config, entry);\n\n if (config.type === 'counter' && state.type === 'counter') {\n // Level filter\n if (config.levelFilter && entry.level !== config.levelFilter) continue;\n // Field/value filter\n if (config.field !== undefined && payload[config.field] !== config.value) continue;\n state.values.set(labelKey, (state.values.get(labelKey) ?? 0) + 1);\n } else if (config.type === 'histogram' && state.type === 'histogram') {\n const raw = payload[config.field];\n if (raw === undefined || raw === null) continue;\n const val = Number(raw);\n if (Number.isNaN(val)) continue;\n\n // Initialise per-label arrays on first observation\n if (!state.counts.has(labelKey)) {\n state.counts.set(\n labelKey,\n Array.from<number>({ length: state.buckets.length + 1 }).fill(0)\n );\n state.sums.set(labelKey, 0);\n state.observations.set(labelKey, 0);\n }\n\n const bucketArr = state.counts.get(labelKey)!;\n for (let i = 0; i < state.buckets.length; i++) {\n if (val <= state.buckets[i]!) bucketArr[i]!++;\n }\n // The +Inf bucket (last slot) always increments\n bucketArr[state.buckets.length]!++;\n state.sums.set(labelKey, (state.sums.get(labelKey) ?? 0) + val);\n state.observations.set(labelKey, (state.observations.get(labelKey) ?? 0) + 1);\n } else if (config.type === 'gauge' && state.type === 'gauge') {\n const raw = payload[config.field];\n if (raw === undefined || raw === null) continue;\n const val = Number(raw);\n if (Number.isNaN(val)) continue;\n state.values.set(labelKey, val);\n }\n }\n\n // Always pass the entry through unchanged\n return entry;\n }\n\n // ── Output ─────────────────────────────────────────────────────────────────\n\n /**\n * Render all registered metrics in the Prometheus text exposition format\n * (version 0.0.4).\n *\n * All metric names are prefixed with `logixia_`.\n *\n * @example\n * ```\n * # HELP logixia_error_count Total error log entries\n * # TYPE logixia_error_count counter\n * logixia_error_count{context=\"OrderService\"} 7\n * ```\n */\n render(): string {\n const lines: string[] = [];\n\n for (const [rawName, config] of Object.entries(this.map)) {\n const metricName = `logixia_${rawName}`;\n const state = this.metricState.get(rawName);\n if (!state) continue;\n\n const helpText = config.help ?? rawName.replace(/_/g, ' ');\n lines.push(`# HELP ${metricName} ${helpText}`);\n lines.push(`# TYPE ${metricName} ${config.type}`);\n\n if (state.type === 'counter') {\n if (state.values.size === 0) {\n lines.push(`${metricName} 0`);\n } else {\n for (const [labelKey, count] of state.values) {\n lines.push(`${metricName}${renderLabels(labelKey)} ${count}`);\n }\n }\n } else if (state.type === 'histogram') {\n for (const [labelKey, bucketCounts] of state.counts) {\n const labelSuffix = renderLabels(labelKey);\n const baseObj = labelKey === '{}' ? {} : (JSON.parse(labelKey) as Record<string, string>);\n\n // One line per finite bucket\n for (let i = 0; i < state.buckets.length; i++) {\n const leKey = JSON.stringify({ ...baseObj, le: String(state.buckets[i]) });\n lines.push(`${metricName}_bucket${renderLabels(leKey)} ${bucketCounts[i] ?? 0}`);\n }\n // +Inf bucket\n const infKey = JSON.stringify({ ...baseObj, le: '+Inf' });\n lines.push(\n `${metricName}_bucket${renderLabels(infKey)} ${bucketCounts[state.buckets.length] ?? 0}`\n );\n lines.push(`${metricName}_sum${labelSuffix} ${state.sums.get(labelKey) ?? 0}`);\n lines.push(`${metricName}_count${labelSuffix} ${state.observations.get(labelKey) ?? 0}`);\n }\n } else if (state.type === 'gauge') {\n if (state.values.size === 0) {\n lines.push(`${metricName} 0`);\n } else {\n for (const [labelKey, val] of state.values) {\n lines.push(`${metricName}${renderLabels(labelKey)} ${val}`);\n }\n }\n }\n }\n\n return `${lines.join('\\n')}\\n`;\n }\n\n /**\n * Reset all metric counters and observations back to zero.\n * Useful between test runs or on a scheduled reset interval.\n */\n reset(): void {\n this.metricState.clear();\n this.initAllState();\n }\n\n /**\n * Express route handler — call `app.get('/metrics', metrics.expressHandler())`.\n *\n * @example\n * ```ts\n * import express from 'express';\n * const app = express();\n * app.get('/metrics', metrics.expressHandler());\n * ```\n */\n expressHandler(): (\n req: unknown,\n res: { set(k: string, v: string): unknown; end(body: string): void }\n ) => void {\n return (_req, res) => {\n res.set('Content-Type', 'text/plain; version=0.0.4; charset=utf-8');\n res.end(this.render());\n };\n }\n\n /**\n * Raw Node.js `http` server handler.\n * Responds to `GET /metrics` with the Prometheus text payload.\n *\n * @example Start a dedicated metrics server on the standard port:\n * ```ts\n * import http from 'node:http';\n * const server = http.createServer(metrics.httpHandler());\n * server.listen(9464); // Prometheus default port for custom exporters\n * ```\n */\n httpHandler(): (req: IncomingMessage, res: ServerResponse) => void {\n return (req, res) => {\n const isMetricsPath = req.url === '/metrics' || req.url === '/metrics/';\n if (!isMetricsPath) {\n res.writeHead(404).end('Not found');\n return;\n }\n const body = this.render();\n res.writeHead(200, {\n 'Content-Type': 'text/plain; version=0.0.4; charset=utf-8',\n 'Content-Length': Buffer.byteLength(body),\n });\n res.end(body);\n };\n }\n\n // ── Private helpers ────────────────────────────────────────────────────────\n\n private initAllState(): void {\n for (const [rawName, config] of Object.entries(this.map)) {\n this.initSingleState(rawName, config);\n }\n }\n\n private initSingleState(rawName: string, config: MetricConfig): void {\n if (config.type === 'counter') {\n this.metricState.set(rawName, { type: 'counter', values: new Map() });\n } else if (config.type === 'histogram') {\n const buckets = [...(config.buckets ?? DEFAULT_BUCKETS)].sort((a, b) => a - b);\n this.metricState.set(rawName, {\n type: 'histogram',\n buckets,\n counts: new Map(),\n sums: new Map(),\n observations: new Map(),\n });\n } else {\n this.metricState.set(rawName, { type: 'gauge', values: new Map() });\n }\n }\n}\n\n// ── Factory ───────────────────────────────────────────────────────────────────\n\n/**\n * Create a `MetricsPlugin` from a metrics map and return it ready for\n * `logger.use()`.\n *\n * @example\n * ```ts\n * import { createMetricsPlugin } from 'logixia';\n *\n * const metrics = createMetricsPlugin({\n * http_request_duration: {\n * type: 'histogram',\n * field: 'duration',\n * labels: ['method', 'statusCode'],\n * help: 'HTTP request duration in milliseconds',\n * },\n * error_count: {\n * type: 'counter',\n * levelFilter: 'error',\n * labels: ['context'],\n * help: 'Total error log entries',\n * },\n * });\n *\n * logger.use(metrics);\n * app.get('/metrics', metrics.expressHandler());\n * ```\n */\nexport function createMetricsPlugin(map: MetricsMap): MetricsPlugin {\n return new MetricsPlugin(map);\n}\n","/**\n * Logixia - Advanced TypeScript Logger\n *\n * A comprehensive logging library with support for:\n * - Multiple output formats (console, file, JSON)\n * - Trace ID tracking\n * - Performance monitoring\n * - NestJS integration\n * - Customizable log levels and colors\n * - Intelligent log search and aggregation\n * - Natural language query processing\n * - Pattern recognition and anomaly detection\n */\n\nimport { createLogger as createLoggerFromCore, LogixiaLogger } from './core/logitron-logger';\nimport { LogixiaLoggerService } from './core/logitron-nestjs.service';\nimport type { Environment, LogColor, LoggerConfig } from './types';\nimport { LogLevel } from './types';\n\n// Type exports\nexport * from './core/logitron-logger.module';\nexport * from './core/logitron-nestjs.service';\nexport type { LogMethodOptions } from './core/nestjs-extras';\nexport { InjectLogger, LogixiaExceptionFilter, LogMethod } from './core/nestjs-extras';\nexport * from './formatters';\nexport * from './types';\nexport * from './utils/error.utils';\nexport type { OtelBridgeOptions, OtelSpanContext } from './utils/otel';\nexport {\n disableOtelBridge,\n getActiveOtelContext,\n getOtelMetaFields,\n initOtelBridge,\n} from './utils/otel';\nexport { applyRedaction, redactObject } from './utils/redact.utils';\nexport * from './utils/shutdown.utils';\nexport * from './utils/trace.utils';\nexport type {\n CompiledSchema,\n LogFieldDef,\n LogFieldType,\n LoggerLike,\n LogSchema,\n TypedLogger,\n} from './utils/typed-logger';\nexport { createTypedLogger, defineLogSchema } from './utils/typed-logger';\n\n// Search module exports\nexport * from './search';\n\n// Context propagation (AsyncLocalStorage)\nexport type { LogContext } from './context/async-context';\nexport {\n createExpressContextMiddleware,\n createFastifyContextHook,\n LogixiaContext,\n} from './context/async-context';\n\n// Sampling stats (SamplingConfig is already exported via ./types)\nexport type { SamplingStats } from './utils/sampling.utils';\n\n// Plugin API (Feature 20)\nexport type { LogixiaPlugin } from './plugin';\nexport { globalPluginRegistry, PluginRegistry, usePlugin } from './plugin';\n\n// Metrics extraction → Prometheus (Feature 21)\nexport type {\n CounterConfig,\n GaugeConfig,\n HistogramConfig,\n MetricConfig,\n MetricsMap,\n} from './metrics';\nexport { createMetricsPlugin, MetricsPlugin } from './metrics';\n\n// Core exports\nexport { DEFAULT_CONFIG, LogixiaLogger, LogixiaLoggerService };\n\n/**\n * Default configuration for Logixia logger\n */\nconst DEFAULT_CONFIG = {\n appName: 'App',\n environment: 'development' as Environment,\n traceId: true,\n format: {\n timestamp: true,\n colorize: true,\n json: false,\n },\n silent: false,\n levelOptions: {\n level: LogLevel.INFO,\n levels: {\n [LogLevel.ERROR]: 0,\n [LogLevel.WARN]: 1,\n [LogLevel.INFO]: 2,\n [LogLevel.DEBUG]: 3,\n [LogLevel.TRACE]: 4,\n [LogLevel.VERBOSE]: 5,\n },\n colors: {\n [LogLevel.ERROR]: 'red',\n [LogLevel.WARN]: 'yellow',\n [LogLevel.INFO]: 'blue',\n [LogLevel.DEBUG]: 'green',\n [LogLevel.TRACE]: 'gray',\n [LogLevel.VERBOSE]: 'cyan',\n } as Record<string, LogColor>,\n },\n fields: {\n timestamp: true,\n level: true,\n appName: true,\n traceId: true,\n message: true,\n payload: true,\n timeTaken: true,\n },\n outputs: ['console'],\n};\n\n/**\n * Create a new Logixia logger instance with TypeScript support for custom levels\n * @param config - Logger configuration\n * @returns Typed logger instance\n */\nexport const createLogger = createLoggerFromCore;\n\n/**\n * Create a new Logixia logger service for NestJS\n * @param config - Logger configuration\n * @returns LogixiaLoggerService instance\n */\nexport function createLoggerService(config?: Partial<LoggerConfig>): LogixiaLoggerService {\n return new LogixiaLoggerService({ ...DEFAULT_CONFIG, ...config });\n}\n\n/**\n * Default logger instance\n */\nexport const logger = new LogixiaLogger(DEFAULT_CONFIG);\n\n/**\n * Export default configuration for reference\n */\n"],"mappings":"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"}
|
|
@@ -1,10 +1,105 @@
|
|
|
1
|
-
import { T as TraceIdConfig, _ as LogLevelString, d as ILogger, f as ILoggerDefault, v as LoggerConfig, y as LoggerWithLevels } from "./index-
|
|
1
|
+
import { T as TraceIdConfig, _ as LogLevelString, d as ILogger, f as ILoggerDefault, m as LogEntry, v as LoggerConfig, y as LoggerWithLevels } from "./index-t-ActikQ.js";
|
|
2
2
|
import * as _nestjs_common0 from "@nestjs/common";
|
|
3
3
|
import { CallHandler, ExecutionContext, InjectionToken, LoggerService, MiddlewareConsumer, ModuleMetadata, NestInterceptor, NestModule, OptionalFactoryDependency, Type } from "@nestjs/common";
|
|
4
4
|
import { Observable } from "rxjs";
|
|
5
5
|
|
|
6
|
-
//#region src/
|
|
6
|
+
//#region src/plugin.d.ts
|
|
7
7
|
|
|
8
|
+
interface LogixiaPlugin {
|
|
9
|
+
/**
|
|
10
|
+
* Unique plugin name.
|
|
11
|
+
* logixia uses this to prevent duplicate registration of the same plugin
|
|
12
|
+
* on the same logger instance.
|
|
13
|
+
*/
|
|
14
|
+
name: string;
|
|
15
|
+
/**
|
|
16
|
+
* Called once immediately after `logger.use(plugin)` is called.
|
|
17
|
+
* Use for one-time setup (open connections, allocate buffers, etc.).
|
|
18
|
+
* Async `onInit` errors are silently swallowed to avoid blocking the logger.
|
|
19
|
+
*/
|
|
20
|
+
onInit?(): void | Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Called for every log entry **after** PII redaction and **before** transport
|
|
23
|
+
* dispatch. Plugins run in registration order; each receives the (possibly
|
|
24
|
+
* modified) output of the previous plugin.
|
|
25
|
+
*
|
|
26
|
+
* - Return the entry (modified or unchanged) to continue processing.
|
|
27
|
+
* - Return `null` to **drop** the entry — no transport will receive it.
|
|
28
|
+
*/
|
|
29
|
+
onLog?(entry: LogEntry): LogEntry | null | Promise<LogEntry | null>;
|
|
30
|
+
/**
|
|
31
|
+
* Called when a transport write fails (after any configured retries).
|
|
32
|
+
* Useful for routing transport errors to an alerting or metrics system.
|
|
33
|
+
* Errors thrown inside `onError` are silently swallowed.
|
|
34
|
+
*/
|
|
35
|
+
onError?(error: Error, entry?: LogEntry): void | Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* Called when the logger is closed via `logger.close()` or the process
|
|
38
|
+
* receives a shutdown signal (when `gracefulShutdown` is enabled).
|
|
39
|
+
* Errors thrown inside `onShutdown` are silently swallowed.
|
|
40
|
+
*/
|
|
41
|
+
onShutdown?(): void | Promise<void>;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Holds an ordered list of `LogixiaPlugin` instances and dispatches lifecycle
|
|
45
|
+
* events to them. One registry is created per logger instance; a global
|
|
46
|
+
* singleton is also exported for process-wide registration.
|
|
47
|
+
*/
|
|
48
|
+
declare class PluginRegistry {
|
|
49
|
+
private readonly _plugins;
|
|
50
|
+
/**
|
|
51
|
+
* Register a plugin. Silently skips if a plugin with the same `name` is
|
|
52
|
+
* already registered on this registry.
|
|
53
|
+
*/
|
|
54
|
+
register(plugin: LogixiaPlugin): void;
|
|
55
|
+
/** Remove a previously registered plugin by name. No-op if not found. */
|
|
56
|
+
unregister(name: string): void;
|
|
57
|
+
/** Returns `true` if a plugin with the given name is registered. */
|
|
58
|
+
has(name: string): boolean;
|
|
59
|
+
/** Number of currently registered plugins. */
|
|
60
|
+
get size(): number;
|
|
61
|
+
/**
|
|
62
|
+
* Run all `onLog` hooks in order.
|
|
63
|
+
* Returns `null` if any plugin cancels the entry; otherwise returns the
|
|
64
|
+
* (possibly transformed) entry.
|
|
65
|
+
*/
|
|
66
|
+
runOnLog(entry: LogEntry): Promise<LogEntry | null>;
|
|
67
|
+
/**
|
|
68
|
+
* Notify all `onError` hooks.
|
|
69
|
+
* Errors thrown inside hooks are swallowed to prevent error cascades.
|
|
70
|
+
*/
|
|
71
|
+
runOnError(error: Error, entry?: LogEntry): Promise<void>;
|
|
72
|
+
/** Run all `onShutdown` hooks concurrently. Hook errors are swallowed. */
|
|
73
|
+
runOnShutdown(): Promise<void>;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Module-level singleton registry.
|
|
77
|
+
*
|
|
78
|
+
* Plugins registered here are automatically copied into every **new** logger
|
|
79
|
+
* instance created after the registration. Already-created loggers are not
|
|
80
|
+
* retroactively affected — use `logger.use(plugin)` for per-instance control.
|
|
81
|
+
*/
|
|
82
|
+
declare const globalPluginRegistry: PluginRegistry;
|
|
83
|
+
/**
|
|
84
|
+
* Register a plugin in the global registry so it applies to every future
|
|
85
|
+
* logger instance.
|
|
86
|
+
*
|
|
87
|
+
* @example
|
|
88
|
+
* ```ts
|
|
89
|
+
* import { usePlugin } from 'logixia';
|
|
90
|
+
*
|
|
91
|
+
* usePlugin({
|
|
92
|
+
* name: 'audit-sink',
|
|
93
|
+
* onLog(entry) {
|
|
94
|
+
* if (entry.level === 'error') auditQueue.push(entry);
|
|
95
|
+
* return entry;
|
|
96
|
+
* },
|
|
97
|
+
* });
|
|
98
|
+
* ```
|
|
99
|
+
*/
|
|
100
|
+
declare function usePlugin(plugin: LogixiaPlugin): void;
|
|
101
|
+
//#endregion
|
|
102
|
+
//#region src/core/logitron-logger.d.ts
|
|
8
103
|
declare class LogixiaLogger<TConfig extends LoggerConfig<Record<string, number>> = LoggerConfig> implements ILoggerDefault {
|
|
9
104
|
[K: string]: any;
|
|
10
105
|
private config;
|
|
@@ -36,6 +131,8 @@ declare class LogixiaLogger<TConfig extends LoggerConfig<Record<string, number>>
|
|
|
36
131
|
private _hasRedact;
|
|
37
132
|
/** Sampling engine — only created when sampling config is present. */
|
|
38
133
|
private _sampler?;
|
|
134
|
+
/** Per-instance plugin registry — also inherits from the global registry at creation time. */
|
|
135
|
+
private readonly _pluginRegistry;
|
|
39
136
|
constructor(config: TConfig, context?: string);
|
|
40
137
|
private setupGracefulShutdown;
|
|
41
138
|
private createCustomLevelMethods;
|
|
@@ -70,6 +167,23 @@ declare class LogixiaLogger<TConfig extends LoggerConfig<Record<string, number>>
|
|
|
70
167
|
clearTransportLevelPreferences(): void;
|
|
71
168
|
getAvailableTransports(): string[];
|
|
72
169
|
child(context: string, data?: Record<string, unknown>): ILogger;
|
|
170
|
+
/**
|
|
171
|
+
* Register a plugin on this logger instance.
|
|
172
|
+
*
|
|
173
|
+
* @example
|
|
174
|
+
* ```ts
|
|
175
|
+
* logger.use({
|
|
176
|
+
* name: 'audit',
|
|
177
|
+
* onLog(entry) { auditQueue.push(entry); return entry; },
|
|
178
|
+
* });
|
|
179
|
+
* ```
|
|
180
|
+
*/
|
|
181
|
+
use(plugin: LogixiaPlugin): this;
|
|
182
|
+
/**
|
|
183
|
+
* Remove a previously registered plugin by name.
|
|
184
|
+
* No-op if the plugin is not registered on this instance.
|
|
185
|
+
*/
|
|
186
|
+
unuse(pluginName: string): this;
|
|
73
187
|
flush(): Promise<void>;
|
|
74
188
|
healthCheck(): Promise<{
|
|
75
189
|
healthy: boolean;
|
|
@@ -221,7 +335,7 @@ declare class LogixiaLoggerModule implements NestModule {
|
|
|
221
335
|
inject: string[];
|
|
222
336
|
useValue?: never;
|
|
223
337
|
})[];
|
|
224
|
-
exports: (string | typeof
|
|
338
|
+
exports: (string | typeof LogixiaLoggerService | typeof KafkaTraceInterceptor | typeof WebSocketTraceInterceptor)[];
|
|
225
339
|
global: boolean;
|
|
226
340
|
};
|
|
227
341
|
/**
|
|
@@ -258,7 +372,7 @@ declare class LogixiaLoggerModule implements NestModule {
|
|
|
258
372
|
useFactory: (traceConfig: any) => WebSocketTraceInterceptor;
|
|
259
373
|
inject: string[];
|
|
260
374
|
})[];
|
|
261
|
-
exports: (string | typeof
|
|
375
|
+
exports: (string | typeof LogixiaLoggerService | typeof KafkaTraceInterceptor | typeof WebSocketTraceInterceptor)[];
|
|
262
376
|
global: boolean;
|
|
263
377
|
};
|
|
264
378
|
/**
|
|
@@ -277,5 +391,5 @@ declare class LogixiaLoggerModule implements NestModule {
|
|
|
277
391
|
private static createAsyncOptionsProvider;
|
|
278
392
|
}
|
|
279
393
|
//#endregion
|
|
280
|
-
export { LogixiaOptionsFactory as a, LogixiaLoggerService as c, LogixiaLoggerModule as i, LogixiaLogger as l, LOGIXIA_LOGGER_PREFIX as n, WebSocketTraceInterceptor as o, LogixiaAsyncOptions as r, KafkaTraceInterceptor as s, LOGIXIA_LOGGER_CONFIG as t, createLogger as u };
|
|
281
|
-
//# sourceMappingURL=logitron-logger.module-
|
|
394
|
+
export { LogixiaOptionsFactory as a, LogixiaLoggerService as c, LogixiaPlugin as d, PluginRegistry as f, LogixiaLoggerModule as i, LogixiaLogger as l, usePlugin as m, LOGIXIA_LOGGER_PREFIX as n, WebSocketTraceInterceptor as o, globalPluginRegistry as p, LogixiaAsyncOptions as r, KafkaTraceInterceptor as s, LOGIXIA_LOGGER_CONFIG as t, createLogger as u };
|
|
395
|
+
//# sourceMappingURL=logitron-logger.module-9vOhKWDG.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logitron-logger.module-9vOhKWDG.d.ts","names":[],"sources":["../src/plugin.ts","../src/core/logitron-logger.ts","../src/core/logitron-nestjs.service.ts","../src/core/kafka-trace.interceptor.ts","../src/core/websocket-trace.interceptor.ts","../src/core/logitron-logger.module.ts"],"sourcesContent":[],"mappings":"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"}
|