@oxog/log 1.0.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/transports/index.ts","../../src/constants.ts","../../src/utils/format.ts","../../src/utils/env.ts","../../src/transports/console.ts","../../src/errors.ts","../../src/transports/file.ts","../../src/transports/stream.ts","../../src/transports/http.ts","../../src/transports/localStorage.ts"],"sourcesContent":["/**\n * @oxog/log - Transports\n *\n * Log output transports for various destinations.\n *\n * @packageDocumentation\n */\n\nexport { consoleTransport } from './console.js';\nexport { fileTransport } from './file.js';\nexport { streamTransport } from './stream.js';\nexport { httpTransport } from './http.js';\nexport { localStorageTransport, readLogs, clearLogs, getStorageUsage } from './localStorage.js';\n","/**\n * @oxog/log - Constants\n *\n * Log levels, default values, and configuration constants.\n *\n * @packageDocumentation\n */\n\nimport { LogLevel, type LogLevelName, type Format, type BufferOptions } from './types.js';\n\n// ============================================================================\n// Log Levels\n// ============================================================================\n\n/**\n * Mapping of log level names to numeric values.\n *\n * @example\n * ```typescript\n * const level = LOG_LEVELS.info; // 30\n * ```\n */\nexport const LOG_LEVELS: Record<LogLevelName, LogLevel> = {\n trace: LogLevel.Trace,\n debug: LogLevel.Debug,\n info: LogLevel.Info,\n warn: LogLevel.Warn,\n error: LogLevel.Error,\n fatal: LogLevel.Fatal,\n} as const;\n\n/**\n * Mapping of numeric values to log level names.\n *\n * @example\n * ```typescript\n * const name = LEVEL_NAMES[30]; // 'info'\n * ```\n */\nexport const LEVEL_NAMES: Record<LogLevel, LogLevelName> = {\n [LogLevel.Trace]: 'trace',\n [LogLevel.Debug]: 'debug',\n [LogLevel.Info]: 'info',\n [LogLevel.Warn]: 'warn',\n [LogLevel.Error]: 'error',\n [LogLevel.Fatal]: 'fatal',\n} as const;\n\n/**\n * Array of all log level names in order of severity.\n */\nexport const LEVEL_ORDER: LogLevelName[] = [\n 'trace',\n 'debug',\n 'info',\n 'warn',\n 'error',\n 'fatal',\n] as const;\n\n// ============================================================================\n// Default Configuration\n// ============================================================================\n\n/**\n * Default logger name.\n */\nexport const DEFAULT_NAME = 'app';\n\n/**\n * Default log level.\n */\nexport const DEFAULT_LEVEL: LogLevelName = 'info';\n\n/**\n * Default output format.\n */\nexport const DEFAULT_FORMAT: Format = 'auto';\n\n/**\n * Default colors setting.\n */\nexport const DEFAULT_COLORS = true;\n\n/**\n * Default timestamp setting.\n */\nexport const DEFAULT_TIMESTAMP = true;\n\n/**\n * Default source tracking setting.\n */\nexport const DEFAULT_SOURCE = false;\n\n/**\n * Default sync levels (fatal and error are sync by default).\n */\nexport const DEFAULT_SYNC_LEVELS: Record<LogLevelName, boolean> = {\n trace: false,\n debug: false,\n info: false,\n warn: false,\n error: true,\n fatal: true,\n} as const;\n\n/**\n * Default buffer options.\n */\nexport const DEFAULT_BUFFER_OPTIONS: Required<BufferOptions> = {\n size: 100,\n flushInterval: 1000,\n} as const;\n\n// ============================================================================\n// Level Colors\n// ============================================================================\n\n/**\n * Default colors for each log level (used with @oxog/pigment).\n */\nexport const LEVEL_COLORS: Record<LogLevelName, string> = {\n trace: 'gray',\n debug: 'cyan',\n info: 'blue',\n warn: 'yellow',\n error: 'red',\n fatal: 'magenta',\n} as const;\n\n/**\n * Level label display strings (padded for alignment).\n */\nexport const LEVEL_LABELS: Record<LogLevelName, string> = {\n trace: 'TRACE',\n debug: 'DEBUG',\n info: 'INFO ',\n warn: 'WARN ',\n error: 'ERROR',\n fatal: 'FATAL',\n} as const;\n\n// ============================================================================\n// Redaction\n// ============================================================================\n\n/**\n * Default redaction placeholder.\n */\nexport const REDACTED_VALUE = '[REDACTED]';\n\n/**\n * Common sensitive field names.\n */\nexport const COMMON_SENSITIVE_FIELDS = [\n 'password',\n 'token',\n 'secret',\n 'apiKey',\n 'api_key',\n 'apikey',\n 'authorization',\n 'auth',\n 'credential',\n 'credentials',\n 'ssn',\n 'creditCard',\n 'credit_card',\n 'creditcard',\n 'cvv',\n 'pin',\n] as const;\n\n// ============================================================================\n// Size Constants\n// ============================================================================\n\n/**\n * Parse size string to bytes.\n *\n * @example\n * ```typescript\n * parseSize('10MB'); // 10485760\n * parseSize('1GB'); // 1073741824\n * ```\n */\nexport function parseSize(size: string): number {\n const match = size.match(/^(\\d+(?:\\.\\d+)?)\\s*(B|KB|MB|GB|TB)?$/i);\n if (!match) {\n throw new Error(`Invalid size format: ${size}`);\n }\n\n const value = parseFloat(match[1]!);\n const unit = (match[2] || 'B').toUpperCase();\n\n const units: Record<string, number> = {\n B: 1,\n KB: 1024,\n MB: 1024 * 1024,\n GB: 1024 * 1024 * 1024,\n TB: 1024 * 1024 * 1024 * 1024,\n };\n\n return Math.floor(value * (units[unit] ?? 1));\n}\n\n/**\n * Parse rotation interval string to milliseconds.\n *\n * @example\n * ```typescript\n * parseRotation('1d'); // 86400000\n * parseRotation('1h'); // 3600000\n * ```\n */\nexport function parseRotation(rotation: string): number {\n const match = rotation.match(/^(\\d+)\\s*(s|m|h|d|w)?$/i);\n if (!match) {\n throw new Error(`Invalid rotation format: ${rotation}`);\n }\n\n const value = parseInt(match[1]!, 10);\n const unit = (match[2] || 's').toLowerCase();\n\n const units: Record<string, number> = {\n s: 1000,\n m: 60 * 1000,\n h: 60 * 60 * 1000,\n d: 24 * 60 * 60 * 1000,\n w: 7 * 24 * 60 * 60 * 1000,\n };\n\n return value * (units[unit] ?? 1000);\n}\n\n// ============================================================================\n// Environment\n// ============================================================================\n\n/**\n * Check if running in Node.js.\n */\nexport const IS_NODE =\n typeof process !== 'undefined' &&\n process.versions != null &&\n process.versions.node != null;\n\n/**\n * Check if running in browser.\n */\nexport const IS_BROWSER =\n typeof window !== 'undefined' && typeof window.document !== 'undefined';\n\n/**\n * Check if running in development mode.\n */\nexport const IS_DEV =\n IS_NODE && process.env['NODE_ENV'] !== 'production';\n\n/**\n * Check if stdout is a TTY (terminal).\n */\nexport const IS_TTY = IS_NODE && process.stdout?.isTTY === true;\n","/**\n * @oxog/log - Formatting Utilities\n *\n * JSON and pretty formatting for log entries.\n *\n * @packageDocumentation\n */\n\nimport type { LogEntry, LogLevelName } from '../types.js';\nimport { LEVEL_LABELS, LEVEL_COLORS } from '../constants.js';\nimport type { Pigment } from '@oxog/pigment';\n\n/**\n * Format a log entry as JSON string.\n *\n * @example\n * ```typescript\n * const json = formatJson(entry);\n * // {\"level\":30,\"time\":1234567890,\"msg\":\"Hello\"}\n * ```\n */\nexport function formatJson(entry: LogEntry): string {\n return JSON.stringify(entry, jsonReplacer);\n}\n\n/**\n * JSON replacer function to handle special values.\n */\nfunction jsonReplacer(_key: string, value: unknown): unknown {\n // Handle BigInt\n if (typeof value === 'bigint') {\n return value.toString();\n }\n\n // Handle Error objects\n if (value instanceof Error) {\n const errorObj = value as Error & Record<string, unknown>;\n const result: Record<string, unknown> = {\n name: value.name,\n message: value.message,\n stack: value.stack,\n };\n // Copy any additional enumerable properties\n for (const key of Object.keys(errorObj)) {\n if (!(key in result)) {\n result[key] = errorObj[key];\n }\n }\n return result;\n }\n\n // Handle circular references and special objects\n if (typeof value === 'object' && value !== null) {\n // Handle RegExp\n if (value instanceof RegExp) {\n return value.toString();\n }\n\n // Handle Date (already handled by JSON.stringify, but explicit for clarity)\n if (value instanceof Date) {\n return value.toISOString();\n }\n\n // Handle Map\n if (value instanceof Map) {\n return Object.fromEntries(value);\n }\n\n // Handle Set\n if (value instanceof Set) {\n return Array.from(value);\n }\n }\n\n return value;\n}\n\n/**\n * Safe JSON stringify with circular reference handling.\n *\n * @example\n * ```typescript\n * const obj = { a: 1 };\n * obj.self = obj; // circular\n * safeStringify(obj); // {\"a\":1,\"self\":\"[Circular]\"}\n * ```\n */\nexport function safeStringify(value: unknown, indent?: number): string {\n const seen = new WeakSet<object>();\n\n return JSON.stringify(\n value,\n (_key, val) => {\n // First apply the standard replacer\n const replaced = jsonReplacer(_key, val);\n\n // Then check for circular references\n if (typeof replaced === 'object' && replaced !== null) {\n if (seen.has(replaced)) {\n return '[Circular]';\n }\n seen.add(replaced);\n }\n\n return replaced;\n },\n indent\n );\n}\n\n/**\n * Format a log entry as pretty string with colors.\n *\n * @example\n * ```typescript\n * const pretty = formatPretty(entry, pigment);\n * // [14:30:22] INFO Hello world\n * ```\n */\nexport function formatPretty(\n entry: LogEntry,\n pigment?: Pigment,\n options: { timestamp?: boolean; source?: boolean } = {}\n): string {\n const parts: string[] = [];\n const { timestamp = true, source = true } = options;\n\n // Timestamp\n if (timestamp && entry.time) {\n const time = formatTime(entry.time);\n parts.push(pigment ? pigment.gray(`[${time}]`) : `[${time}]`);\n }\n\n // Level\n const levelLabel = LEVEL_LABELS[entry.levelName] || entry.levelName.toUpperCase();\n const levelColor = LEVEL_COLORS[entry.levelName] || 'white';\n\n if (pigment) {\n const colorFn = (pigment as unknown as Record<string, (s: string) => string>)[levelColor];\n parts.push(colorFn ? colorFn(levelLabel) : levelLabel);\n } else {\n parts.push(levelLabel);\n }\n\n // Source location\n if (source && entry.file) {\n const location = entry.line ? `${entry.file}:${entry.line}` : entry.file;\n parts.push(pigment ? pigment.dim(`(${location})`) : `(${location})`);\n }\n\n // Message\n if (entry.msg) {\n parts.push(entry.msg);\n }\n\n // Extra data (excluding standard fields)\n const extra = getExtraFields(entry);\n if (Object.keys(extra).length > 0) {\n const extraStr = safeStringify(extra);\n parts.push(pigment ? pigment.dim(extraStr) : extraStr);\n }\n\n // Error stack\n if (entry.err?.stack) {\n parts.push('\\n' + (pigment ? pigment.red(entry.err.stack) : entry.err.stack));\n }\n\n return parts.join(' ');\n}\n\n/**\n * Get extra fields from entry (excluding standard fields).\n */\nfunction getExtraFields(entry: LogEntry): Record<string, unknown> {\n const standardFields = new Set([\n 'level',\n 'levelName',\n 'time',\n 'msg',\n 'file',\n 'line',\n 'column',\n 'correlationId',\n 'duration',\n 'err',\n 'name',\n ]);\n\n const extra: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(entry)) {\n if (!standardFields.has(key)) {\n extra[key] = value;\n }\n }\n return extra;\n}\n\n/**\n * Format timestamp as HH:MM:SS.\n */\nexport function formatTime(timestamp: number): string {\n const date = new Date(timestamp);\n const hours = date.getHours().toString().padStart(2, '0');\n const minutes = date.getMinutes().toString().padStart(2, '0');\n const seconds = date.getSeconds().toString().padStart(2, '0');\n return `${hours}:${minutes}:${seconds}`;\n}\n\n/**\n * Format timestamp as ISO 8601 string.\n */\nexport function formatIso(timestamp: number): string {\n return new Date(timestamp).toISOString();\n}\n\n/**\n * Format duration in human-readable format.\n *\n * @example\n * ```typescript\n * formatDuration(45); // '45ms'\n * formatDuration(1500); // '1.50s'\n * formatDuration(90000); // '1m 30s'\n * ```\n */\nexport function formatDuration(ms: number): string {\n if (ms < 1000) {\n return `${ms}ms`;\n }\n\n if (ms < 60000) {\n return `${(ms / 1000).toFixed(2)}s`;\n }\n\n const minutes = Math.floor(ms / 60000);\n const seconds = Math.round((ms % 60000) / 1000);\n return `${minutes}m ${seconds}s`;\n}\n\n/**\n * Format bytes in human-readable format.\n *\n * @example\n * ```typescript\n * formatBytes(1024); // '1 KB'\n * formatBytes(1048576); // '1 MB'\n * ```\n */\nexport function formatBytes(bytes: number): string {\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n let unitIndex = 0;\n let value = bytes;\n\n while (value >= 1024 && unitIndex < units.length - 1) {\n value /= 1024;\n unitIndex++;\n }\n\n return `${value.toFixed(unitIndex > 0 ? 2 : 0)} ${units[unitIndex]}`;\n}\n\n/**\n * Truncate a string to a maximum length.\n *\n * @example\n * ```typescript\n * truncate('Hello world', 8); // 'Hello...'\n * ```\n */\nexport function truncate(str: string, maxLength: number, suffix = '...'): string {\n if (str.length <= maxLength) return str;\n return str.slice(0, maxLength - suffix.length) + suffix;\n}\n\n/**\n * Indent a multi-line string.\n */\nexport function indent(str: string, spaces = 2): string {\n const pad = ' '.repeat(spaces);\n return str\n .split('\\n')\n .map((line) => pad + line)\n .join('\\n');\n}\n","/**\n * @oxog/log - Environment Detection Utilities\n *\n * Detect runtime environment and capabilities.\n *\n * @packageDocumentation\n */\n\n/**\n * Check if running in Node.js environment.\n *\n * @example\n * ```typescript\n * if (isNode()) {\n * // Use Node.js APIs\n * }\n * ```\n */\nexport function isNode(): boolean {\n return (\n typeof process !== 'undefined' &&\n process.versions != null &&\n process.versions.node != null\n );\n}\n\n/**\n * Check if running in browser environment.\n *\n * @example\n * ```typescript\n * if (isBrowser()) {\n * // Use browser APIs\n * }\n * ```\n */\nexport function isBrowser(): boolean {\n return typeof window !== 'undefined' && typeof window.document !== 'undefined';\n}\n\n/**\n * Check if running in development mode.\n * Returns true if NODE_ENV is not 'production'.\n *\n * @example\n * ```typescript\n * if (isDev()) {\n * log.setLevel('debug');\n * }\n * ```\n */\nexport function isDev(): boolean {\n if (!isNode()) return false;\n return process.env['NODE_ENV'] !== 'production';\n}\n\n/**\n * Check if stdout is a TTY (terminal).\n *\n * @example\n * ```typescript\n * if (isTTY()) {\n * // Use colors\n * }\n * ```\n */\nexport function isTTY(): boolean {\n if (!isNode()) return false;\n return process.stdout?.isTTY === true;\n}\n\n/**\n * Check if colors should be enabled by default.\n * Returns true if running in TTY or browser.\n *\n * @example\n * ```typescript\n * const colors = shouldUseColors();\n * ```\n */\nexport function shouldUseColors(): boolean {\n if (isBrowser()) return true;\n if (!isNode()) return false;\n\n // Check for NO_COLOR environment variable\n if (process.env['NO_COLOR'] !== undefined) return false;\n\n // Check for FORCE_COLOR environment variable\n if (process.env['FORCE_COLOR'] !== undefined) return true;\n\n // Check if running in CI\n if (process.env['CI'] !== undefined) return true;\n\n // Default to TTY detection\n return isTTY();\n}\n\n/**\n * Get the current environment name.\n *\n * @example\n * ```typescript\n * const env = getEnvironment(); // 'development' | 'production' | 'test'\n * ```\n */\nexport function getEnvironment(): string {\n if (!isNode()) return 'browser';\n return process.env['NODE_ENV'] || 'development';\n}\n\n/**\n * Get the current working directory.\n * Returns undefined in browser.\n *\n * @example\n * ```typescript\n * const cwd = getCwd(); // '/path/to/project'\n * ```\n */\nexport function getCwd(): string | undefined {\n if (!isNode()) return undefined;\n return process.cwd();\n}\n\n/**\n * Get a safe reference to globalThis.\n */\nexport function getGlobalThis(): typeof globalThis {\n if (typeof globalThis !== 'undefined') return globalThis;\n if (typeof window !== 'undefined') return window as unknown as typeof globalThis;\n if (typeof global !== 'undefined') return global as unknown as typeof globalThis;\n if (typeof self !== 'undefined') return self as unknown as typeof globalThis;\n return {} as typeof globalThis;\n}\n","/**\n * @oxog/log - Console Transport\n *\n * Output logs to console with optional colors.\n *\n * @packageDocumentation\n */\n\nimport type { Transport, LogEntry, ConsoleTransportOptions, LogLevelName } from '../types.js';\nimport { formatJson, formatPretty } from '../utils/format.js';\nimport { isBrowser, isTTY, shouldUseColors } from '../utils/env.js';\nimport type { Pigment } from '@oxog/pigment';\n\n/**\n * Default level colors for console output.\n */\nconst DEFAULT_LEVEL_COLORS: Record<LogLevelName, string> = {\n trace: 'gray',\n debug: 'cyan',\n info: 'blue',\n warn: 'yellow',\n error: 'red',\n fatal: 'magenta',\n};\n\n/**\n * Create a console transport.\n *\n * @example\n * ```typescript\n * import { consoleTransport } from '@oxog/log/transports';\n *\n * const transport = consoleTransport({ colors: true });\n * ```\n */\nexport function consoleTransport(options: ConsoleTransportOptions = {}): Transport {\n const {\n colors = shouldUseColors(),\n timestamp = true,\n levelColors = {},\n } = options;\n\n // Merge level colors\n const mergedColors = { ...DEFAULT_LEVEL_COLORS, ...levelColors };\n\n // Store pigment instance (set by logger)\n let pigment: Pigment | undefined;\n\n return {\n name: 'console',\n\n write(entry: LogEntry): void {\n // Format the entry\n let output: string;\n\n if (isBrowser()) {\n // In browser, use console methods directly\n writeToBrowserConsole(entry, colors);\n return;\n }\n\n // In Node.js, format and write to stdout/stderr\n if (colors && pigment) {\n output = formatPretty(entry, pigment, { timestamp, source: true });\n } else if (colors) {\n // Simple colored output without pigment\n output = formatWithAnsi(entry, mergedColors, timestamp);\n } else {\n output = formatJson(entry);\n }\n\n // Write to appropriate stream\n if (entry.level >= 50) {\n // Error and Fatal to stderr\n process.stderr.write(output + '\\n');\n } else {\n process.stdout.write(output + '\\n');\n }\n },\n\n flush(): void {\n // Console doesn't need flushing\n },\n\n close(): void {\n // Console doesn't need closing\n },\n\n supports(env: 'node' | 'browser'): boolean {\n return true; // Works in both environments\n },\n };\n}\n\n/**\n * Format entry with ANSI colors (without pigment).\n */\nfunction formatWithAnsi(\n entry: LogEntry,\n levelColors: Record<LogLevelName, string>,\n showTimestamp: boolean\n): string {\n const parts: string[] = [];\n\n // Timestamp\n if (showTimestamp && entry.time) {\n const time = formatTime(entry.time);\n parts.push(`\\x1b[90m[${time}]\\x1b[0m`);\n }\n\n // Level with color\n const color = getAnsiColor(levelColors[entry.levelName] || 'white');\n const levelLabel = entry.levelName.toUpperCase().padEnd(5);\n parts.push(`${color}${levelLabel}\\x1b[0m`);\n\n // Source location\n if (entry.file) {\n const location = entry.line ? `${entry.file}:${entry.line}` : entry.file;\n parts.push(`\\x1b[90m(${location})\\x1b[0m`);\n }\n\n // Message\n if (entry.msg) {\n parts.push(entry.msg);\n }\n\n // Extra data\n const extra = getExtraFields(entry);\n if (Object.keys(extra).length > 0) {\n parts.push(`\\x1b[90m${JSON.stringify(extra)}\\x1b[0m`);\n }\n\n // Error stack\n if (entry.err?.stack) {\n parts.push('\\n\\x1b[31m' + entry.err.stack + '\\x1b[0m');\n }\n\n return parts.join(' ');\n}\n\n/**\n * Get ANSI color code for a color name.\n */\nfunction getAnsiColor(colorName: string): string {\n const colors: Record<string, string> = {\n black: '\\x1b[30m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m',\n white: '\\x1b[37m',\n gray: '\\x1b[90m',\n grey: '\\x1b[90m',\n };\n return colors[colorName] || '\\x1b[0m';\n}\n\n/**\n * Format timestamp as HH:MM:SS.\n */\nfunction formatTime(timestamp: number): string {\n const date = new Date(timestamp);\n return date.toTimeString().slice(0, 8);\n}\n\n/**\n * Get extra fields from entry (excluding standard fields).\n */\nfunction getExtraFields(entry: LogEntry): Record<string, unknown> {\n const standardFields = new Set([\n 'level',\n 'levelName',\n 'time',\n 'msg',\n 'file',\n 'line',\n 'column',\n 'correlationId',\n 'duration',\n 'err',\n 'name',\n ]);\n\n const extra: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(entry)) {\n if (!standardFields.has(key)) {\n extra[key] = value;\n }\n }\n return extra;\n}\n\n/**\n * Write to browser console with styling.\n */\nfunction writeToBrowserConsole(entry: LogEntry, styled: boolean): void {\n const method = getConsoleMethod(entry.levelName);\n const consoleObj = console as unknown as Record<string, (...args: unknown[]) => void>;\n\n if (styled) {\n const styles = getBrowserStyles(entry.levelName);\n const label = `%c[${entry.levelName.toUpperCase()}]`;\n\n const extra = getExtraFields(entry);\n if (Object.keys(extra).length > 0) {\n consoleObj[method](label, styles, entry.msg, extra);\n } else {\n consoleObj[method](label, styles, entry.msg);\n }\n } else {\n consoleObj[method](`[${entry.levelName.toUpperCase()}]`, entry.msg, entry);\n }\n}\n\n/**\n * Get console method for level.\n */\nfunction getConsoleMethod(levelName: LogLevelName): string {\n switch (levelName) {\n case 'trace':\n case 'debug':\n return 'debug';\n case 'info':\n return 'info';\n case 'warn':\n return 'warn';\n case 'error':\n case 'fatal':\n return 'error';\n default:\n return 'log';\n }\n}\n\n/**\n * Get browser CSS styles for level.\n */\nfunction getBrowserStyles(levelName: LogLevelName): string {\n const colors: Record<LogLevelName, string> = {\n trace: '#888888',\n debug: '#00bcd4',\n info: '#2196f3',\n warn: '#ff9800',\n error: '#f44336',\n fatal: '#9c27b0',\n };\n return `color: ${colors[levelName]}; font-weight: bold;`;\n}\n\nexport default consoleTransport;\n","/**\n * @oxog/log - Error Classes\n *\n * Custom error classes for the logging library.\n *\n * @packageDocumentation\n */\n\n/**\n * Base error class for @oxog/log.\n *\n * @example\n * ```typescript\n * try {\n * log.info({ nested: circular });\n * } catch (err) {\n * if (err instanceof LogError) {\n * console.error('Log error:', err.code);\n * }\n * }\n * ```\n */\nexport class LogError extends Error {\n /** Error code for programmatic handling */\n readonly code: string;\n\n /** Original error if wrapping another error */\n override readonly cause?: Error;\n\n constructor(message: string, code: string, cause?: Error) {\n super(message);\n this.name = 'LogError';\n this.code = code;\n this.cause = cause;\n\n // Maintain proper stack trace in V8\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n}\n\n/**\n * Error thrown when a plugin fails to install or operate.\n *\n * @example\n * ```typescript\n * throw new PluginError('Failed to initialize plugin', 'my-plugin');\n * ```\n */\nexport class PluginError extends LogError {\n /** Name of the plugin that caused the error */\n readonly pluginName: string;\n\n constructor(message: string, pluginName: string, cause?: Error) {\n super(`[Plugin: ${pluginName}] ${message}`, 'PLUGIN_ERROR', cause);\n this.name = 'PluginError';\n this.pluginName = pluginName;\n }\n}\n\n/**\n * Error thrown when a transport fails to write or operate.\n *\n * @example\n * ```typescript\n * throw new TransportError('Failed to write to file', 'file-transport');\n * ```\n */\nexport class TransportError extends LogError {\n /** Name of the transport that caused the error */\n readonly transportName: string;\n\n constructor(message: string, transportName: string, cause?: Error) {\n super(`[Transport: ${transportName}] ${message}`, 'TRANSPORT_ERROR', cause);\n this.name = 'TransportError';\n this.transportName = transportName;\n }\n}\n\n/**\n * Error thrown when configuration is invalid.\n *\n * @example\n * ```typescript\n * throw new ConfigError('Invalid log level: verbose');\n * ```\n */\nexport class ConfigError extends LogError {\n /** Configuration option that caused the error */\n readonly option?: string;\n\n constructor(message: string, option?: string, cause?: Error) {\n super(message, 'CONFIG_ERROR', cause);\n this.name = 'ConfigError';\n this.option = option;\n }\n}\n\n/**\n * Error thrown when serialization fails (e.g., circular references).\n *\n * @example\n * ```typescript\n * throw new SerializationError('Circular reference detected');\n * ```\n */\nexport class SerializationError extends LogError {\n constructor(message: string, cause?: Error) {\n super(message, 'SERIALIZATION_ERROR', cause);\n this.name = 'SerializationError';\n }\n}\n\n/**\n * Error thrown when a required feature is not available in the current environment.\n *\n * @example\n * ```typescript\n * throw new EnvironmentError('File transport is not available in browser');\n * ```\n */\nexport class EnvironmentError extends LogError {\n /** Required environment */\n readonly requiredEnv: 'node' | 'browser';\n\n constructor(message: string, requiredEnv: 'node' | 'browser', cause?: Error) {\n super(message, 'ENVIRONMENT_ERROR', cause);\n this.name = 'EnvironmentError';\n this.requiredEnv = requiredEnv;\n }\n}\n\n/**\n * Error thrown when buffer operations fail.\n *\n * @example\n * ```typescript\n * throw new BufferError('Buffer overflow: max size exceeded');\n * ```\n */\nexport class BufferError extends LogError {\n constructor(message: string, cause?: Error) {\n super(message, 'BUFFER_ERROR', cause);\n this.name = 'BufferError';\n }\n}\n\n/**\n * Create an error from an unknown caught value.\n * Ensures we always have a proper Error object.\n *\n * @example\n * ```typescript\n * try {\n * riskyOperation();\n * } catch (err) {\n * throw ensureError(err);\n * }\n * ```\n */\nexport function ensureError(value: unknown): Error {\n if (value instanceof Error) {\n return value;\n }\n\n if (typeof value === 'string') {\n return new Error(value);\n }\n\n if (typeof value === 'object' && value !== null) {\n const obj = value as Record<string, unknown>;\n if (typeof obj['message'] === 'string') {\n const err = new Error(obj['message']);\n if (typeof obj['name'] === 'string') {\n err.name = obj['name'];\n }\n return err;\n }\n }\n\n return new Error(String(value));\n}\n\n/**\n * Wrap an error with additional context.\n *\n * @example\n * ```typescript\n * try {\n * writeToFile(data);\n * } catch (err) {\n * throw wrapError(err, 'Failed to write log file');\n * }\n * ```\n */\nexport function wrapError(error: unknown, message: string): LogError {\n const cause = ensureError(error);\n return new LogError(`${message}: ${cause.message}`, 'WRAPPED_ERROR', cause);\n}\n","/**\n * @oxog/log - File Transport\n *\n * Output logs to files with optional rotation.\n * Node.js only.\n *\n * @packageDocumentation\n */\n\nimport type { Transport, LogEntry, FileTransportOptions } from '../types.js';\nimport { formatJson } from '../utils/format.js';\nimport { isNode } from '../utils/env.js';\nimport { parseSize, parseRotation } from '../constants.js';\nimport { TransportError, EnvironmentError } from '../errors.js';\n\n/**\n * Create a file transport.\n *\n * @example\n * ```typescript\n * import { fileTransport } from '@oxog/log/transports';\n *\n * const transport = fileTransport({\n * path: './logs/app.log',\n * rotate: '1d',\n * maxSize: '10MB',\n * maxFiles: 7,\n * });\n * ```\n */\nexport function fileTransport(options: FileTransportOptions): Transport {\n if (!isNode()) {\n throw new EnvironmentError('File transport is only available in Node.js', 'node');\n }\n\n const {\n path: filePath,\n rotate,\n maxSize,\n maxFiles = 5,\n compress = false,\n } = options;\n\n // Parse size and rotation settings\n const maxSizeBytes = maxSize ? parseSize(maxSize) : undefined;\n const rotationMs = rotate ? parseRotation(rotate) : undefined;\n\n // Track current file state\n let currentSize = 0;\n let lastRotation = Date.now();\n let writeStream: NodeJS.WritableStream | null = null;\n let fs: typeof import('fs') | null = null;\n let path: typeof import('path') | null = null;\n let zlib: typeof import('zlib') | null = null;\n\n // Lazy load Node.js modules\n async function ensureModules(): Promise<void> {\n if (!fs) {\n fs = await import('fs');\n path = await import('path');\n if (compress) {\n zlib = await import('zlib');\n }\n }\n }\n\n // Open write stream\n async function ensureStream(): Promise<NodeJS.WritableStream> {\n await ensureModules();\n\n if (!writeStream) {\n // Ensure directory exists\n const dir = path!.dirname(filePath);\n if (!fs!.existsSync(dir)) {\n fs!.mkdirSync(dir, { recursive: true });\n }\n\n // Get current file size if exists\n if (fs!.existsSync(filePath)) {\n const stats = fs!.statSync(filePath);\n currentSize = stats.size;\n }\n\n writeStream = fs!.createWriteStream(filePath, { flags: 'a' });\n }\n\n return writeStream;\n }\n\n // Check if rotation is needed\n function shouldRotate(): boolean {\n // Size-based rotation\n if (maxSizeBytes && currentSize >= maxSizeBytes) {\n return true;\n }\n\n // Time-based rotation\n if (rotationMs && Date.now() - lastRotation >= rotationMs) {\n return true;\n }\n\n return false;\n }\n\n // Perform rotation\n async function performRotation(): Promise<void> {\n await ensureModules();\n\n if (!writeStream) return;\n\n // Close current stream\n await new Promise<void>((resolve, reject) => {\n writeStream!.once('finish', resolve);\n writeStream!.once('error', reject);\n writeStream!.end();\n });\n writeStream = null;\n\n // Generate rotation timestamp\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const ext = path!.extname(filePath);\n const base = filePath.slice(0, -ext.length);\n const rotatedPath = `${base}.${timestamp}${ext}`;\n\n // Rename current file\n fs!.renameSync(filePath, rotatedPath);\n\n // Compress if enabled\n if (compress && zlib) {\n const gzPath = `${rotatedPath}.gz`;\n const input = fs!.createReadStream(rotatedPath);\n const output = fs!.createWriteStream(gzPath);\n const gzip = zlib.createGzip();\n\n await new Promise<void>((resolve, reject) => {\n input.pipe(gzip).pipe(output);\n output.on('finish', () => {\n fs!.unlinkSync(rotatedPath);\n resolve();\n });\n output.on('error', reject);\n });\n }\n\n // Cleanup old files\n await cleanupOldFiles();\n\n // Reset state\n currentSize = 0;\n lastRotation = Date.now();\n }\n\n // Cleanup old rotated files\n async function cleanupOldFiles(): Promise<void> {\n await ensureModules();\n\n const dir = path!.dirname(filePath);\n const baseName = path!.basename(filePath);\n const ext = path!.extname(filePath);\n const prefix = baseName.slice(0, -ext.length);\n\n const files = fs!.readdirSync(dir)\n .filter((f) => f.startsWith(prefix) && f !== baseName)\n .map((f) => ({\n name: f,\n path: path!.join(dir, f),\n mtime: fs!.statSync(path!.join(dir, f)).mtime.getTime(),\n }))\n .sort((a, b) => b.mtime - a.mtime);\n\n // Remove excess files\n while (files.length > maxFiles) {\n const file = files.pop()!;\n fs!.unlinkSync(file.path);\n }\n }\n\n return {\n name: 'file',\n\n async write(entry: LogEntry): Promise<void> {\n // Check rotation\n if (shouldRotate()) {\n await performRotation();\n }\n\n // Get stream\n const stream = await ensureStream();\n\n // Format entry\n const line = formatJson(entry) + '\\n';\n const bytes = Buffer.byteLength(line, 'utf8');\n\n // Write\n return new Promise((resolve, reject) => {\n stream.write(line, (err) => {\n if (err) {\n reject(new TransportError(`Failed to write to file: ${err.message}`, 'file', err));\n } else {\n currentSize += bytes;\n resolve();\n }\n });\n });\n },\n\n async flush(): Promise<void> {\n if (writeStream && 'flush' in writeStream) {\n return new Promise<void>((resolve) => {\n (writeStream as NodeJS.WritableStream & { flush: (cb: () => void) => void }).flush(resolve);\n });\n }\n },\n\n async close(): Promise<void> {\n if (writeStream) {\n await new Promise<void>((resolve, reject) => {\n writeStream!.once('finish', resolve);\n writeStream!.once('error', reject);\n writeStream!.end();\n });\n writeStream = null;\n }\n },\n\n supports(env: 'node' | 'browser'): boolean {\n return env === 'node';\n },\n };\n}\n\nexport default fileTransport;\n","/**\n * @oxog/log - Stream Transport\n *\n * Output logs to Node.js writable streams.\n * Node.js only.\n *\n * @packageDocumentation\n */\n\nimport type { Transport, LogEntry, StreamTransportOptions } from '../types.js';\nimport { formatJson } from '../utils/format.js';\nimport { isNode } from '../utils/env.js';\nimport { TransportError, EnvironmentError } from '../errors.js';\n\n/**\n * Create a stream transport.\n *\n * @example\n * ```typescript\n * import { streamTransport } from '@oxog/log/transports';\n * import { createWriteStream } from 'fs';\n *\n * const transport = streamTransport({\n * stream: createWriteStream('./app.log'),\n * });\n * ```\n */\nexport function streamTransport(options: StreamTransportOptions): Transport {\n if (!isNode()) {\n throw new EnvironmentError('Stream transport is only available in Node.js', 'node');\n }\n\n const { stream } = options;\n\n if (!stream) {\n throw new TransportError('Stream is required', 'stream');\n }\n\n let closed = false;\n\n return {\n name: 'stream',\n\n write(entry: LogEntry): Promise<void> {\n if (closed) {\n return Promise.reject(new TransportError('Stream is closed', 'stream'));\n }\n\n const line = formatJson(entry) + '\\n';\n\n return new Promise((resolve, reject) => {\n const canWrite = stream.write(line, (err) => {\n if (err) {\n reject(new TransportError(`Failed to write to stream: ${err.message}`, 'stream', err));\n } else {\n resolve();\n }\n });\n\n // Handle backpressure\n if (!canWrite) {\n stream.once('drain', () => {\n resolve();\n });\n }\n });\n },\n\n flush(): Promise<void> {\n // Most streams don't have explicit flush\n return Promise.resolve();\n },\n\n async close(): Promise<void> {\n if (closed) return;\n closed = true;\n\n return new Promise((resolve, reject) => {\n stream.once('finish', resolve);\n stream.once('error', (err) => {\n reject(new TransportError(`Failed to close stream: ${err.message}`, 'stream', err));\n });\n stream.end();\n });\n },\n\n supports(env: 'node' | 'browser'): boolean {\n return env === 'node';\n },\n };\n}\n\nexport default streamTransport;\n","/**\n * @oxog/log - HTTP Transport\n *\n * Send logs to HTTP endpoints with batching and retry.\n *\n * @packageDocumentation\n */\n\nimport type { Transport, LogEntry, HttpTransportOptions } from '../types.js';\nimport { TransportError } from '../errors.js';\n\n/**\n * Create an HTTP transport.\n *\n * @example\n * ```typescript\n * import { httpTransport } from '@oxog/log/transports';\n *\n * const transport = httpTransport({\n * url: 'https://logs.example.com/ingest',\n * batch: 100,\n * interval: 5000,\n * headers: { 'X-API-Key': 'xxx' },\n * });\n * ```\n */\nexport function httpTransport(options: HttpTransportOptions): Transport {\n const {\n url,\n method = 'POST',\n headers = {},\n batch = 100,\n interval = 5000,\n retry = 3,\n } = options;\n\n if (!url) {\n throw new TransportError('URL is required', 'http');\n }\n\n // Buffer for batching\n let buffer: LogEntry[] = [];\n let flushTimer: ReturnType<typeof setInterval> | null = null;\n let isFlushing = false;\n let closed = false;\n\n // Start flush interval\n function startFlushInterval(): void {\n if (flushTimer) return;\n if (interval > 0) {\n flushTimer = setInterval(() => {\n flushBuffer().catch(() => {\n // Silently ignore interval flush errors\n });\n }, interval);\n }\n }\n\n // Stop flush interval\n function stopFlushInterval(): void {\n if (flushTimer) {\n clearInterval(flushTimer);\n flushTimer = null;\n }\n }\n\n // Flush the buffer\n async function flushBuffer(): Promise<void> {\n if (isFlushing || buffer.length === 0) return;\n isFlushing = true;\n\n // Take current buffer\n const entries = buffer;\n buffer = [];\n\n try {\n await sendWithRetry(entries);\n } catch (err) {\n // Put entries back in buffer if send fails\n buffer = [...entries, ...buffer].slice(0, batch * 2); // Limit buffer size\n throw err;\n } finally {\n isFlushing = false;\n }\n }\n\n // Send entries with retry\n async function sendWithRetry(entries: LogEntry[]): Promise<void> {\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= retry; attempt++) {\n try {\n await sendEntries(entries);\n return;\n } catch (err) {\n lastError = err instanceof Error ? err : new Error(String(err));\n\n // Exponential backoff\n if (attempt < retry) {\n const delay = Math.min(1000 * Math.pow(2, attempt), 30000);\n await sleep(delay);\n }\n }\n }\n\n throw new TransportError(\n `Failed to send logs after ${retry + 1} attempts: ${lastError?.message}`,\n 'http',\n lastError || undefined\n );\n }\n\n // Send entries to endpoint\n async function sendEntries(entries: LogEntry[]): Promise<void> {\n const body = JSON.stringify(entries);\n\n const response = await fetch(url, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n body,\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n }\n\n // Sleep utility\n function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n // Start interval on first write\n let started = false;\n\n return {\n name: 'http',\n\n async write(entry: LogEntry): Promise<void> {\n if (closed) {\n throw new TransportError('Transport is closed', 'http');\n }\n\n // Start interval on first write\n if (!started) {\n started = true;\n startFlushInterval();\n }\n\n // Add to buffer\n buffer.push(entry);\n\n // Flush if buffer is full\n if (buffer.length >= batch) {\n await flushBuffer();\n }\n },\n\n async flush(): Promise<void> {\n await flushBuffer();\n },\n\n async close(): Promise<void> {\n if (closed) return;\n closed = true;\n\n stopFlushInterval();\n\n // Final flush\n if (buffer.length > 0) {\n try {\n await flushBuffer();\n } catch {\n // Ignore errors on close\n }\n }\n },\n\n supports(_env: 'node' | 'browser'): boolean {\n // Works in both environments with fetch\n return typeof fetch !== 'undefined';\n },\n };\n}\n\nexport default httpTransport;\n","/**\n * @oxog/log - LocalStorage Transport\n *\n * Persist logs to browser localStorage.\n * Browser only.\n *\n * @packageDocumentation\n */\n\nimport type { Transport, LogEntry, LocalStorageTransportOptions, LogLevelName } from '../types.js';\nimport { isBrowser } from '../utils/env.js';\nimport { parseSize } from '../constants.js';\nimport { TransportError, EnvironmentError } from '../errors.js';\nimport { LOG_LEVELS } from '../constants.js';\n\n/**\n * Create a localStorage transport.\n *\n * @example\n * ```typescript\n * import { localStorageTransport } from '@oxog/log/transports';\n *\n * const transport = localStorageTransport({\n * key: 'app-logs',\n * maxSize: '1MB',\n * levels: ['error', 'fatal'],\n * });\n * ```\n */\nexport function localStorageTransport(options: LocalStorageTransportOptions): Transport {\n if (!isBrowser()) {\n throw new EnvironmentError('LocalStorage transport is only available in browser', 'browser');\n }\n\n const {\n key,\n maxSize = '1MB',\n levels,\n } = options;\n\n if (!key) {\n throw new TransportError('Key is required', 'localStorage');\n }\n\n const maxBytes = parseSize(maxSize);\n const allowedLevels = levels\n ? new Set(levels.map((l) => LOG_LEVELS[l]))\n : null;\n\n // Get storage\n function getStorage(): Storage {\n return window.localStorage;\n }\n\n // Load existing logs\n function loadLogs(): LogEntry[] {\n try {\n const data = getStorage().getItem(key);\n if (!data) return [];\n return JSON.parse(data) as LogEntry[];\n } catch {\n return [];\n }\n }\n\n // Save logs\n function saveLogs(logs: LogEntry[]): void {\n const data = JSON.stringify(logs);\n\n // Check size\n while (data.length > maxBytes && logs.length > 0) {\n logs.shift(); // Remove oldest\n }\n\n try {\n getStorage().setItem(key, JSON.stringify(logs));\n } catch (err) {\n // Storage full - try to clear some space\n if (logs.length > 10) {\n logs.splice(0, Math.floor(logs.length / 2));\n saveLogs(logs);\n }\n }\n }\n\n // Check if level is allowed\n function isLevelAllowed(level: number): boolean {\n if (!allowedLevels) return true;\n return allowedLevels.has(level);\n }\n\n return {\n name: 'localStorage',\n\n write(entry: LogEntry): void {\n // Check level filter\n if (!isLevelAllowed(entry.level)) {\n return;\n }\n\n // Load, add, save\n const logs = loadLogs();\n logs.push(entry);\n saveLogs(logs);\n },\n\n flush(): void {\n // Nothing to flush - writes are immediate\n },\n\n close(): void {\n // Nothing to close\n },\n\n supports(env: 'node' | 'browser'): boolean {\n return env === 'browser';\n },\n };\n}\n\n/**\n * Read logs from localStorage.\n *\n * @example\n * ```typescript\n * const logs = readLogs('app-logs');\n * ```\n */\nexport function readLogs(key: string): LogEntry[] {\n if (!isBrowser()) return [];\n\n try {\n const data = window.localStorage.getItem(key);\n if (!data) return [];\n return JSON.parse(data) as LogEntry[];\n } catch {\n return [];\n }\n}\n\n/**\n * Clear logs from localStorage.\n *\n * @example\n * ```typescript\n * clearLogs('app-logs');\n * ```\n */\nexport function clearLogs(key: string): void {\n if (!isBrowser()) return;\n window.localStorage.removeItem(key);\n}\n\n/**\n * Get storage usage for logs.\n *\n * @example\n * ```typescript\n * const bytes = getStorageUsage('app-logs');\n * ```\n */\nexport function getStorageUsage(key: string): number {\n if (!isBrowser()) return 0;\n\n const data = window.localStorage.getItem(key);\n if (!data) return 0;\n return data.length * 2; // UTF-16 encoding\n}\n\nexport default localStorageTransport;\n"],"mappings":"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","names":["formatTime","getExtraFields"]}