@oxog/termstyle
Version:
A powerful, feature-rich CLI text formatting library with zero dependencies. Supports colors, gradients, animations, progress bars, and more.
1 lines • 237 kB
Source Map (JSON)
{"version":3,"sources":["../src/core/ansi.ts","../src/utils/terminal.ts","../src/core/validators.ts","../src/core/errors.ts","../src/core/lru-cache-optimized.ts","../src/core/cache-manager.ts","../src/core/color-processor.ts","../src/styles/style.ts","../src/formatter.ts","../src/core/string-builder.ts","../src/effects/gradient.ts","../src/core/resource-manager.ts","../src/core/safe-utils.ts","../src/core/cursor-manager.ts","../src/effects/animation.ts","../src/effects/box.ts","../src/effects/progress.ts","../src/template.ts","../src/themes/theme.ts","../src/conditional.ts","../src/index.ts"],"sourcesContent":["export const ESC = '\\u001B[';\nexport const RESET = ESC + '0m';\n\nexport const ansiCode = (code: number | string): string => ESC + code + 'm';\nexport const ansi = (code: number | string): string => String(code);\n\nexport const ansiCodes = {\n reset: 0,\n bold: 1,\n dim: 2,\n italic: 3,\n underline: 4,\n blink: 5,\n rapidBlink: 6,\n inverse: 7,\n hidden: 8,\n strikethrough: 9,\n \n resetBold: 22,\n resetDim: 22,\n resetItalic: 23,\n resetUnderline: 24,\n resetBlink: 25,\n resetInverse: 27,\n resetHidden: 28,\n resetStrikethrough: 29,\n \n black: 30,\n red: 31,\n green: 32,\n yellow: 33,\n blue: 34,\n magenta: 35,\n cyan: 36,\n white: 37,\n defaultColor: 39,\n \n bgBlack: 40,\n bgRed: 41,\n bgGreen: 42,\n bgYellow: 43,\n bgBlue: 44,\n bgMagenta: 45,\n bgCyan: 46,\n bgWhite: 47,\n bgDefaultColor: 49,\n \n brightBlack: 90,\n brightRed: 91,\n brightGreen: 92,\n brightYellow: 93,\n brightBlue: 94,\n brightMagenta: 95,\n brightCyan: 96,\n brightWhite: 97,\n \n bgBrightBlack: 100,\n bgBrightRed: 101,\n bgBrightGreen: 102,\n bgBrightYellow: 103,\n bgBrightBlue: 104,\n bgBrightMagenta: 105,\n bgBrightCyan: 106,\n bgBrightWhite: 107\n} as const;\n\nexport type AnsiCode = keyof typeof ansiCodes;\n\nexport const rgb = (r: number, g: number, b: number): string => {\n return `38;2;${r};${g};${b}`;\n};\n\nexport const bgRgb = (r: number, g: number, b: number): string => {\n return `48;2;${r};${g};${b}`;\n};\n\nexport const ansi256 = (code: number): string => {\n return `38;5;${code}`;\n};\n\nexport const bgAnsi256 = (code: number): string => {\n return `48;5;${code}`;\n};\n\nexport const hexToRgb = (hex: string): [number, number, number] => {\n if (!hex || typeof hex !== 'string') {\n return [0, 0, 0]; // Default to black for invalid input\n }\n let cleanHex = hex.replace('#', '');\n \n // Handle 3-character hex codes\n if (cleanHex.length === 3) {\n cleanHex = cleanHex.split('').map(char => char + char).join('');\n }\n \n const r = parseInt(cleanHex.slice(0, 2), 16);\n const g = parseInt(cleanHex.slice(2, 4), 16);\n const b = parseInt(cleanHex.slice(4, 6), 16);\n return [r, g, b];\n};\n\nexport const rgbToAnsi256 = (r: number, g: number, b: number): number => {\n // Check if it's a grayscale value (exact match)\n if (r === g && g === b) {\n if (r < 8) return 16;\n if (r > 238) return 231;\n // ANSI 256 grayscale: colors 232-255 represent rgb(8,8,8) to rgb(238,238,238)\n // incrementing by 10 for each level\n const index = Math.round((r - 8) / 10);\n return 232 + Math.min(index, 23);\n }\n \n const ansiR = Math.round(r / 51);\n const ansiG = Math.round(g / 51);\n const ansiB = Math.round(b / 51);\n \n return 16 + (36 * ansiR) + (6 * ansiG) + ansiB;\n};\n\nexport const stripAnsi = (str: string): string => {\n if (typeof str !== 'string') {\n return String(str);\n }\n \n // Safe regex patterns to prevent ReDoS attacks\n // Match ANSI codes including malformed ones with excessive semicolons\n // eslint-disable-next-line no-control-regex\n const ansiColorPattern = /\\u001B\\[(?:[0-9;]{0,30})?m/g;\n // eslint-disable-next-line no-control-regex\n const ansiControlPattern = /\\u001B\\[(?:[0-9;]{0,30})?[A-Za-z]/g;\n \n try {\n return str\n .replace(ansiColorPattern, '')\n .replace(ansiControlPattern, '');\n } catch {\n // Fallback: character-by-character processing if regex fails\n let result = '';\n let i = 0;\n while (i < str.length) {\n if (str[i] === '\\u001B' && str[i + 1] === '[') {\n // Skip ANSI sequence\n i += 2;\n while (i < str.length && (\n (str[i] >= '0' && str[i] <= '9') || \n str[i] === ';' || \n str[i] === 'm' ||\n (str[i] >= 'A' && str[i] <= 'Z') ||\n (str[i] >= 'a' && str[i] <= 'z')\n )) {\n if (str[i] === 'm' || (str[i] >= 'A' && str[i] <= 'Z') || (str[i] >= 'a' && str[i] <= 'z')) {\n i++;\n break;\n }\n i++;\n }\n } else {\n result += str[i];\n i++;\n }\n }\n return result;\n }\n};\n\nexport const cursorUp = (n: number = 1): string => ESC + n + 'A';\nexport const cursorDown = (n: number = 1): string => ESC + n + 'B';\nexport const cursorForward = (n: number = 1): string => ESC + n + 'C';\nexport const cursorBackward = (n: number = 1): string => ESC + n + 'D';\nexport const cursorPosition = (row: number, col: number): string => ESC + row + ';' + col + 'H';\nexport const eraseLine = (): string => ESC + '2K';\nexport const eraseScreen = (): string => ESC + '2J';\nexport const saveCursor = (): string => ESC + 's';\nexport const restoreCursor = (): string => ESC + 'u';\nexport const hideCursor = (): string => ESC + '?25l';\nexport const showCursor = (): string => ESC + '?25h';","import { release } from 'os';\n\nexport interface TerminalInfo {\n supportsColor: boolean;\n colorLevel: 0 | 1 | 2 | 3;\n isTTY: boolean;\n isCI: boolean;\n width: number;\n height: number;\n columns: number;\n rows: number;\n}\n\nconst getIsCI = (): boolean => Boolean(\n process.env.CI ||\n process.env.CONTINUOUS_INTEGRATION ||\n process.env.BUILD_NUMBER ||\n process.env.RUN_ID ||\n false\n);\n\nconst getColorLevel = (): 0 | 1 | 2 | 3 => {\n try {\n // Re-read env each time to ensure we get current values\n const currentEnv = process.env;\n \n if (currentEnv.NO_COLOR || currentEnv.NODE_DISABLE_COLORS) return 0;\n if (currentEnv.FORCE_COLOR === '0') return 0;\n if (currentEnv.FORCE_COLOR === '1') return 1;\n if (currentEnv.FORCE_COLOR === '2') return 2;\n if (currentEnv.FORCE_COLOR === '3') return 3;\n \n if (!process.stdout || !process.stdout.isTTY) return 0;\n \n if (process.platform === 'win32') {\n try {\n const osRelease = release().split('.');\n const majorVersion = parseInt(osRelease[0], 10);\n const buildVersion = parseInt(osRelease[2], 10);\n \n if (isNaN(majorVersion) || isNaN(buildVersion)) return 1;\n \n if (majorVersion >= 10 && buildVersion >= 10586) {\n return buildVersion >= 14931 ? 3 : 2;\n }\n return 1;\n } catch {\n return 1; // Safe fallback for Windows\n }\n }\n \n if (currentEnv.COLORTERM === 'truecolor' || currentEnv.TERM_PROGRAM === 'iTerm.app') {\n return 3;\n }\n \n if (currentEnv.TERM?.includes('256color')) return 2;\n if (currentEnv.TERM?.includes('color')) return 1;\n \n return 0;\n } catch {\n return 0; // Safe fallback\n }\n};\n\nexport const getTerminalInfo = (): TerminalInfo => {\n try {\n const colorLevel = getColorLevel();\n const columns = Math.max(1, process.stdout?.columns || 80);\n const rows = Math.max(1, process.stdout?.rows || 24);\n \n return {\n supportsColor: colorLevel > 0,\n colorLevel,\n isTTY: Boolean(process.stdout?.isTTY),\n isCI: getIsCI(),\n width: columns,\n height: rows,\n columns,\n rows\n };\n } catch {\n // Safe fallback terminal info\n return {\n supportsColor: false,\n colorLevel: 0,\n isTTY: false,\n isCI: false,\n width: 80,\n height: 24,\n columns: 80,\n rows: 24\n };\n }\n};\n\nlet terminalInfo: TerminalInfo | null = null;\nlet terminalInfoTimestamp = 0;\nlet resizeListener: (() => void) | null = null;\n\n// Cache TTL in milliseconds (5 minutes)\nconst TERMINAL_INFO_TTL = 5 * 60 * 1000;\n\nexport const terminal = (): TerminalInfo => {\n const now = Date.now();\n \n // Check if cache is expired or doesn't exist\n if (!terminalInfo || (now - terminalInfoTimestamp) > TERMINAL_INFO_TTL) {\n terminalInfo = getTerminalInfo();\n terminalInfoTimestamp = now;\n }\n \n return terminalInfo;\n};\n\nexport const updateTerminalInfo = (): void => {\n terminalInfo = getTerminalInfo();\n terminalInfoTimestamp = Date.now();\n};\n\nexport const cleanup = (): void => {\n if (resizeListener && typeof process !== 'undefined' && process.stdout && typeof process.stdout.removeListener === 'function') {\n try {\n process.stdout.removeListener('resize', resizeListener);\n resizeListener = null;\n } catch {\n // Ignore cleanup errors\n }\n }\n terminalInfo = null;\n};\n\n// Safe event listener registration - prevent duplicate listeners\nif (typeof process !== 'undefined' && process.stdout && typeof process.stdout.on === 'function') {\n try {\n // Only register if we haven't already\n if (!resizeListener) {\n resizeListener = updateTerminalInfo;\n process.stdout.on('resize', resizeListener);\n }\n } catch {\n // Ignore event listener registration errors\n }\n}","/**\n * Input Validation Framework\n * Provides comprehensive validation for all user inputs\n */\n\nimport { ColorInput, RGBTuple } from './color-processor';\n\nexport type ValidatedColor = {\n type: 'rgb' | 'hex' | 'name' | 'number';\n value: RGBTuple;\n original: ColorInput;\n};\n\nexport type AnimationType = 'dots' | 'line' | 'star' | 'flip' | 'grow' | 'balloon' | \n 'noise' | 'bounce' | 'boxing' | 'arc' | 'circle' | \n 'square' | 'triangle' | 'arrow' | 'bouncingBar' | \n 'toggle' | 'smiley' | 'monkey' | 'hearts' | 'clock' | \n 'earth' | 'moon' | 'weather' | 'christmas' | 'grenade' | \n 'point' | 'layer' | 'betaWave' | 'aesthetic';\n\nexport type ValidatedPercent = {\n value: number;\n clamped: boolean;\n original: number;\n};\n\nexport type ValidatedTextInput = {\n text: string;\n hasControlChars: boolean;\n hasAnsiCodes: boolean;\n isEmpty: boolean;\n};\n\nexport type ValidationResult<T> = {\n valid: boolean;\n value?: T;\n error?: string;\n warnings?: string[];\n};\n\nexport class InputValidator {\n private static readonly HEX_PATTERN = /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/;\n private static readonly RGB_PATTERN = /^rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)(?:,\\s*[\\d.]+)?\\)$/;\n private static readonly HSL_PATTERN = /^hsla?\\((\\d+),\\s*(\\d+)%,\\s*(\\d+)%(?:,\\s*[\\d.]+)?\\)$/;\n // eslint-disable-next-line no-control-regex\n private static readonly ANSI_PATTERN = /\\u001b\\[[0-9;]*m/g;\n // eslint-disable-next-line no-control-regex\n private static readonly CONTROL_CHAR_PATTERN = /[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]/g;\n\n /**\n * Validate color input\n */\n static validateColor(input: ColorInput): ValidationResult<ValidatedColor> {\n if (input == null) {\n return {\n valid: false,\n error: 'Color input cannot be null or undefined'\n };\n }\n\n // RGB tuple validation\n if (Array.isArray(input)) {\n const inputArray = input as unknown[];\n if (inputArray.length !== 3) {\n return {\n valid: false,\n error: `RGB array must have exactly 3 values, got ${inputArray.length}`\n };\n }\n\n const warnings: string[] = [];\n const validated: [number, number, number] = [0, 0, 0];\n\n for (let i = 0; i < 3; i++) {\n const value = inputArray[i];\n if (typeof value !== 'number') {\n return {\n valid: false,\n error: `RGB value at index ${i} must be a number, got ${typeof value}`\n };\n }\n\n if (!Number.isFinite(value)) {\n return {\n valid: false,\n error: `RGB value at index ${i} must be finite, got ${value}`\n };\n }\n\n // Clamp and warn\n if (value < 0 || value > 255) {\n warnings.push(`RGB value ${value} at index ${i} was clamped to 0-255 range`);\n }\n validated[i] = Math.max(0, Math.min(255, Math.round(value)));\n }\n\n return {\n valid: true,\n value: {\n type: 'rgb',\n value: validated,\n original: input\n },\n warnings: warnings.length > 0 ? warnings : undefined\n };\n }\n\n // Number validation\n if (typeof input === 'number') {\n if (!Number.isFinite(input)) {\n return {\n valid: false,\n error: `Color number must be finite, got ${input}`\n };\n }\n\n const warnings: string[] = [];\n let value = input;\n\n if (value < 0 || value > 0xffffff) {\n warnings.push(`Color number ${value} was clamped to 0x000000-0xFFFFFF range`);\n value = Math.max(0, Math.min(0xffffff, Math.floor(value)));\n }\n\n const r = (value >> 16) & 0xff;\n const g = (value >> 8) & 0xff;\n const b = value & 0xff;\n\n return {\n valid: true,\n value: {\n type: 'number',\n value: [r, g, b] as RGBTuple,\n original: input\n },\n warnings: warnings.length > 0 ? warnings : undefined\n };\n }\n\n // String validation\n if (typeof input === 'string') {\n const trimmed = input.trim();\n \n if (trimmed.length === 0) {\n return {\n valid: false,\n error: 'Color string cannot be empty'\n };\n }\n\n // Check hex\n if (this.HEX_PATTERN.test(trimmed)) {\n return {\n valid: true,\n value: {\n type: 'hex',\n value: [0, 0, 0] as RGBTuple, // Will be converted by color processor\n original: input\n }\n };\n }\n\n // Check rgb()\n const rgbMatch = trimmed.match(this.RGB_PATTERN);\n if (rgbMatch) {\n const r = parseInt(rgbMatch[1], 10);\n const g = parseInt(rgbMatch[2], 10);\n const b = parseInt(rgbMatch[3], 10);\n \n return this.validateColor([r, g, b]);\n }\n\n // Check hsl()\n if (this.HSL_PATTERN.test(trimmed)) {\n return {\n valid: true,\n value: {\n type: 'name', // Treat HSL as name for now\n value: [0, 0, 0] as RGBTuple, // Will be converted by color processor\n original: input\n }\n };\n }\n\n // Assume color name\n return {\n valid: true,\n value: {\n type: 'name',\n value: [0, 0, 0] as RGBTuple, // Will be converted by color processor\n original: input\n }\n };\n }\n\n return {\n valid: false,\n error: `Invalid color input type: ${typeof input}`\n };\n }\n\n /**\n * Validate percentage value\n */\n static validatePercent(value: number, allowNegative: boolean = false): ValidationResult<ValidatedPercent> {\n if (typeof value !== 'number') {\n return {\n valid: false,\n error: `Percent must be a number, got ${typeof value}`\n };\n }\n\n if (!Number.isFinite(value)) {\n return {\n valid: false,\n error: `Percent must be finite, got ${value}`\n };\n }\n\n const min = allowNegative ? -1 : 0;\n const clamped = Math.max(min, Math.min(1, value));\n const wasClamped = clamped !== value;\n\n return {\n valid: true,\n value: {\n value: clamped,\n clamped: wasClamped,\n original: value\n },\n warnings: wasClamped ? [`Percent value ${value} was clamped to ${min}-1 range`] : undefined\n };\n }\n\n /**\n * Validate animation type\n */\n static validateAnimationType(type: string): ValidationResult<AnimationType> {\n const validTypes: AnimationType[] = [\n 'dots', 'line', 'star', 'flip', 'grow', 'balloon', 'noise', 'bounce',\n 'boxing', 'arc', 'circle', 'square', 'triangle', 'arrow', 'bouncingBar',\n 'toggle', 'smiley', 'monkey', 'hearts', 'clock', 'earth', 'moon',\n 'weather', 'christmas', 'grenade', 'point', 'layer', 'betaWave', 'aesthetic'\n ];\n\n if (typeof type !== 'string') {\n return {\n valid: false,\n error: `Animation type must be a string, got ${typeof type}`\n };\n }\n\n const normalized = type.trim().toLowerCase();\n const found = validTypes.find(t => t.toLowerCase() === normalized);\n\n if (!found) {\n return {\n valid: false,\n error: `Invalid animation type '${type}'. Valid types: ${validTypes.join(', ')}`\n };\n }\n\n return {\n valid: true,\n value: found\n };\n }\n\n /**\n * Validate text input\n */\n static validateText(text: unknown): ValidationResult<ValidatedTextInput> {\n if (text == null) {\n return {\n valid: true,\n value: {\n text: '',\n hasControlChars: false,\n hasAnsiCodes: false,\n isEmpty: true\n }\n };\n }\n\n if (typeof text !== 'string') {\n // Try to convert to string\n try {\n const converted = String(text);\n return this.validateText(converted);\n } catch {\n return {\n valid: false,\n error: `Cannot convert ${typeof text} to string`\n };\n }\n }\n\n const hasControlChars = this.CONTROL_CHAR_PATTERN.test(text);\n const hasAnsiCodes = this.ANSI_PATTERN.test(text);\n const isEmpty = text.length === 0;\n\n const warnings: string[] = [];\n if (hasControlChars) {\n warnings.push('Text contains control characters that may affect output');\n }\n if (hasAnsiCodes) {\n warnings.push('Text contains ANSI escape codes that will be preserved');\n }\n\n return {\n valid: true,\n value: {\n text,\n hasControlChars,\n hasAnsiCodes,\n isEmpty\n },\n warnings: warnings.length > 0 ? warnings : undefined\n };\n }\n\n /**\n * Validate array of colors\n */\n static validateColorArray(colors: unknown[]): ValidationResult<ValidatedColor[]> {\n if (!Array.isArray(colors)) {\n return {\n valid: false,\n error: 'Colors must be an array'\n };\n }\n\n // Filter out null/undefined values\n const validColors = colors.filter(c => c != null);\n \n if (validColors.length === 0) {\n return {\n valid: false,\n error: 'Color array cannot be empty or contain only null/undefined values'\n };\n }\n\n const results: ValidatedColor[] = [];\n const errors: string[] = [];\n const warnings: string[] = [];\n \n // Track skipped null/undefined values\n const skippedCount = colors.length - validColors.length;\n if (skippedCount > 0) {\n warnings.push(`Skipped ${skippedCount} null/undefined color(s)`);\n }\n\n for (let i = 0; i < validColors.length; i++) {\n const result = this.validateColor(validColors[i] as ColorInput);\n \n if (!result.valid) {\n errors.push(`Color at index ${i}: ${result.error}`);\n } else {\n results.push(result.value!);\n if (result.warnings) {\n warnings.push(...result.warnings.map(w => `Color at index ${i}: ${w}`));\n }\n }\n }\n\n if (errors.length > 0) {\n return {\n valid: false,\n error: errors.join('; ')\n };\n }\n\n return {\n valid: true,\n value: results,\n warnings: warnings.length > 0 ? warnings : undefined\n };\n }\n\n /**\n * Validate number is positive\n */\n static validatePositiveNumber(value: number, name: string): ValidationResult<number> {\n if (typeof value !== 'number') {\n return {\n valid: false,\n error: `${name} must be a number, got ${typeof value}`\n };\n }\n\n if (!Number.isFinite(value)) {\n return {\n valid: false,\n error: `${name} must be finite, got ${value}`\n };\n }\n\n if (value <= 0) {\n return {\n valid: false,\n error: `${name} must be positive, got ${value}`\n };\n }\n\n return { valid: true, value };\n }\n\n /**\n * Validate integer\n */\n static validateInteger(value: number, name: string, min?: number, max?: number): ValidationResult<number> {\n const numberResult = this.validatePositiveNumber(value, name);\n if (!numberResult.valid) {\n return numberResult;\n }\n\n if (!Number.isInteger(value)) {\n return {\n valid: false,\n error: `${name} must be an integer, got ${value}`\n };\n }\n\n if (min !== undefined && value < min) {\n return {\n valid: false,\n error: `${name} must be at least ${min}, got ${value}`\n };\n }\n\n if (max !== undefined && value > max) {\n return {\n valid: false,\n error: `${name} must be at most ${max}, got ${value}`\n };\n }\n\n return { valid: true, value };\n }\n\n /**\n * Strip ANSI codes from text\n */\n static stripAnsiCodes(text: string): string {\n return text.replace(this.ANSI_PATTERN, '');\n }\n\n /**\n * Check if text has ANSI codes\n */\n static hasAnsiCodes(text: string): boolean {\n return this.ANSI_PATTERN.test(text);\n }\n\n /**\n * Sanitize text by removing control characters\n */\n static sanitizeText(text: string, preserveAnsi: boolean = true): string {\n let sanitized = text.replace(this.CONTROL_CHAR_PATTERN, '');\n \n if (!preserveAnsi) {\n sanitized = this.stripAnsiCodes(sanitized);\n }\n \n return sanitized;\n }\n}","/**\n * Custom Error Classes for TermStyle\n * Provides detailed error information with error codes\n */\n\nexport enum ErrorCode {\n // Input validation errors (1000-1999)\n INVALID_COLOR_INPUT = 1001,\n INVALID_PERCENT_VALUE = 1002,\n INVALID_ANIMATION_TYPE = 1003,\n INVALID_TEXT_INPUT = 1004,\n INVALID_NUMBER_INPUT = 1005,\n INVALID_ARRAY_INPUT = 1006,\n \n // Terminal errors (2000-2999)\n TERMINAL_NOT_SUPPORTED = 2001,\n TERMINAL_NO_COLOR = 2002,\n TERMINAL_DETECTION_FAILED = 2003,\n \n // Resource errors (3000-3999)\n RESOURCE_ALREADY_DISPOSED = 3001,\n RESOURCE_CLEANUP_FAILED = 3002,\n RESOURCE_NOT_FOUND = 3003,\n \n // Animation errors (4000-4999)\n ANIMATION_ALREADY_STARTED = 4001,\n ANIMATION_NOT_STARTED = 4002,\n ANIMATION_FRAME_ERROR = 4003,\n \n // Configuration errors (5000-5999)\n CONFIG_INVALID_OPTION = 5001,\n CONFIG_MISSING_REQUIRED = 5002,\n \n // System errors (9000-9999)\n INTERNAL_ERROR = 9001,\n OUT_OF_MEMORY = 9002,\n OPERATION_TIMEOUT = 9003\n}\n\nexport interface ErrorDetails {\n code: ErrorCode;\n message: string;\n details?: Record<string, unknown>;\n cause?: Error;\n suggestions?: string[];\n}\n\n/**\n * Base class for all TermStyle errors\n */\nexport class TermStyleError extends Error {\n public readonly code: ErrorCode;\n public readonly details?: Record<string, unknown>;\n public readonly cause?: Error;\n public readonly suggestions?: string[];\n public readonly timestamp: Date;\n\n constructor(errorDetails: ErrorDetails) {\n super(errorDetails.message);\n this.name = this.constructor.name;\n this.code = errorDetails.code;\n this.details = errorDetails.details;\n this.cause = errorDetails.cause;\n this.suggestions = errorDetails.suggestions;\n this.timestamp = new Date();\n\n // Maintain proper stack trace\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n\n // Include cause in stack trace if available\n if (this.cause && this.cause.stack) {\n this.stack = `${this.stack}\\nCaused by: ${this.cause.stack}`;\n }\n }\n\n /**\n * Get a formatted error message with all details\n */\n getFullMessage(): string {\n let message = `[${this.code}] ${this.message}`;\n \n if (this.details && Object.keys(this.details).length > 0) {\n message += `\\nDetails: ${JSON.stringify(this.details, null, 2)}`;\n }\n \n if (this.suggestions && this.suggestions.length > 0) {\n message += `\\nSuggestions:\\n${this.suggestions.map(s => ` - ${s}`).join('\\n')}`;\n }\n \n return message;\n }\n\n /**\n * Convert error to JSON\n */\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n details: this.details,\n suggestions: this.suggestions,\n timestamp: this.timestamp.toISOString(),\n stack: this.stack\n };\n }\n}\n\n/**\n * Input validation error\n */\nexport class ValidationError extends TermStyleError {\n constructor(message: string, code: ErrorCode, details?: Record<string, unknown>) {\n super({\n code,\n message,\n details,\n suggestions: [\n 'Check the input format and type',\n 'Refer to the documentation for valid input values',\n 'Use the validation methods before passing values'\n ]\n });\n }\n}\n\n/**\n * Terminal compatibility error\n */\nexport class TerminalError extends TermStyleError {\n constructor(message: string, code: ErrorCode = ErrorCode.TERMINAL_NOT_SUPPORTED) {\n const suggestions = [];\n \n if (code === ErrorCode.TERMINAL_NO_COLOR) {\n suggestions.push(\n 'Set FORCE_COLOR=1 environment variable to force color output',\n 'Use a terminal that supports colors',\n 'Check if NO_COLOR environment variable is set'\n );\n } else {\n suggestions.push(\n 'Try using a different terminal emulator',\n 'Update your terminal to the latest version',\n 'Check terminal compatibility in the documentation'\n );\n }\n\n super({\n code,\n message,\n suggestions\n });\n }\n}\n\n/**\n * Resource management error\n */\nexport class ResourceError extends TermStyleError {\n constructor(message: string, code: ErrorCode = ErrorCode.RESOURCE_CLEANUP_FAILED, cause?: Error) {\n super({\n code,\n message,\n cause,\n suggestions: [\n 'Ensure resources are disposed in the correct order',\n 'Check for circular dependencies in resources',\n 'Use try-finally blocks for resource cleanup'\n ]\n });\n }\n}\n\n/**\n * Animation error\n */\nexport class AnimationError extends TermStyleError {\n constructor(message: string, code: ErrorCode = ErrorCode.ANIMATION_FRAME_ERROR, details?: Record<string, unknown>) {\n super({\n code,\n message,\n details,\n suggestions: [\n 'Check if the animation is already running',\n 'Ensure the animation type is valid',\n 'Verify terminal supports cursor manipulation'\n ]\n });\n }\n}\n\n/**\n * Configuration error\n */\nexport class ConfigurationError extends TermStyleError {\n constructor(message: string, code: ErrorCode = ErrorCode.CONFIG_INVALID_OPTION, details?: Record<string, unknown>) {\n super({\n code,\n message,\n details,\n suggestions: [\n 'Review the configuration options',\n 'Check for typos in option names',\n 'Ensure all required options are provided'\n ]\n });\n }\n}\n\n/**\n * Error recovery strategies\n */\nexport class ErrorRecovery {\n /**\n * Attempt to recover from an error with a fallback\n */\n static recover<T>(\n operation: () => T,\n fallback: T | (() => T),\n logError: boolean = false\n ): T {\n try {\n return operation();\n } catch (error) {\n if (logError && process.env.DEBUG) {\n console.error('[TermStyle] Error recovered:', error);\n }\n return typeof fallback === 'function' ? (fallback as () => T)() : fallback;\n }\n }\n\n /**\n * Retry an operation with exponential backoff\n */\n static async retry<T>(\n operation: () => Promise<T>,\n maxAttempts: number = 3,\n initialDelay: number = 100\n ): Promise<T> {\n let lastError: Error | undefined;\n \n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n try {\n return await operation();\n } catch (error) {\n lastError = error as Error;\n \n if (attempt < maxAttempts - 1) {\n const delay = initialDelay * Math.pow(2, attempt);\n await new Promise(resolve => setTimeout(resolve, delay));\n }\n }\n }\n \n throw new TermStyleError({\n code: ErrorCode.OPERATION_TIMEOUT,\n message: `Operation failed after ${maxAttempts} attempts`,\n cause: lastError,\n details: { maxAttempts, initialDelay }\n });\n }\n\n /**\n * Wrap a function with error boundary\n */\n static withErrorBoundary<T extends (...args: any[]) => any>(\n fn: T,\n errorHandler: (error: Error) => ReturnType<T> | void\n ): T {\n return ((...args: Parameters<T>) => {\n try {\n return fn(...args);\n } catch (error) {\n const result = errorHandler(error as Error);\n if (result !== undefined) {\n return result;\n }\n throw error;\n }\n }) as T;\n }\n\n /**\n * Create a safe version of a function that never throws\n */\n static makeSafe<T extends (...args: any[]) => any>(\n fn: T,\n defaultValue: ReturnType<T>\n ): T {\n return ((...args: Parameters<T>) => {\n try {\n return fn(...args);\n } catch {\n return defaultValue;\n }\n }) as T;\n }\n}\n\n/**\n * Error context for better debugging\n */\nexport class ErrorContext {\n private static context: Map<string, unknown> = new Map();\n\n /**\n * Add context that will be included in errors\n */\n static add(key: string, value: unknown): void {\n this.context.set(key, value);\n }\n\n /**\n * Remove context\n */\n static remove(key: string): void {\n this.context.delete(key);\n }\n\n /**\n * Get all context\n */\n static getAll(): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of this.context) {\n result[key] = value;\n }\n return result;\n }\n\n /**\n * Clear all context\n */\n static clear(): void {\n this.context.clear();\n }\n\n /**\n * Run a function with temporary context\n */\n static withContext<T>(\n context: Record<string, unknown>,\n fn: () => T\n ): T {\n const keys = Object.keys(context);\n \n // Add temporary context\n for (const key of keys) {\n this.add(key, context[key]);\n }\n \n try {\n return fn();\n } finally {\n // Remove temporary context\n for (const key of keys) {\n this.remove(key);\n }\n }\n }\n}","/**\n * Optimized LRU Cache implementation using Map for O(1) operations\n */\n\nexport class LRUCacheOptimized<K, V> {\n private cache = new Map<K, V>();\n private readonly capacity: number;\n\n constructor(capacity: number) {\n if (capacity <= 0) {\n throw new Error('Cache capacity must be positive');\n }\n this.capacity = capacity;\n }\n\n get(key: K): V | undefined {\n if (!this.cache.has(key)) {\n return undefined;\n }\n \n // Move to end (most recently used)\n const value = this.cache.get(key)!;\n this.cache.delete(key);\n this.cache.set(key, value);\n return value;\n }\n\n set(key: K, value: V): void {\n // If key exists, delete it first to update position\n if (this.cache.has(key)) {\n this.cache.delete(key);\n } else if (this.cache.size >= this.capacity) {\n // Remove least recently used (first item)\n const firstKey = this.cache.keys().next().value;\n if (firstKey !== undefined) {\n this.cache.delete(firstKey);\n }\n }\n \n // Add to end (most recently used)\n this.cache.set(key, value);\n }\n\n has(key: K): boolean {\n return this.cache.has(key);\n }\n\n delete(key: K): boolean {\n return this.cache.delete(key);\n }\n\n clear(): void {\n this.cache.clear();\n }\n\n get size(): number {\n return this.cache.size;\n }\n\n getSize(): number {\n return this.cache.size;\n }\n\n keys(): K[] {\n return Array.from(this.cache.keys());\n }\n\n values(): V[] {\n return Array.from(this.cache.values());\n }\n\n entries(): Array<[K, V]> {\n return Array.from(this.cache.entries());\n }\n\n forEach(callback: (value: V, key: K, map: Map<K, V>) => void): void {\n this.cache.forEach(callback);\n }\n}\n\n/**\n * Create a memoized version of a function with optimized LRU caching\n */\nexport function memoizeOptimized<Args extends unknown[], Return>(\n fn: (...args: Args) => Return,\n options: {\n capacity?: number;\n keyGenerator?: (...args: Args) => string;\n } = {}\n): (...args: Args) => Return {\n const cache = new LRUCacheOptimized<string, Return>(options.capacity || 100);\n const keyGen = options.keyGenerator || ((...args) => JSON.stringify(args));\n\n return (...args: Args): Return => {\n const key = keyGen(...args);\n \n const cached = cache.get(key);\n if (cached !== undefined) {\n return cached;\n }\n\n const result = fn(...args);\n cache.set(key, result);\n return result;\n };\n}","/**\n * Cache Manager for Performance Optimization\n * Provides centralized caching for expensive operations\n */\n\nimport { LRUCacheOptimized } from './lru-cache-optimized';\nimport { RGBTuple } from './color-processor';\nimport { Style } from '../styles/style';\n\nexport interface CacheStats {\n hits: number;\n misses: number;\n size: number;\n maxSize: number;\n}\n\nexport class CacheManager {\n private static instance: CacheManager;\n \n // Color conversion caches\n private colorCache: LRUCacheOptimized<string, RGBTuple>;\n private hexCache: LRUCacheOptimized<string, RGBTuple>;\n private hslCache: LRUCacheOptimized<string, RGBTuple>;\n \n // Gradient cache\n private gradientCache: LRUCacheOptimized<string, string>;\n \n // Style cache (for commonly used styles)\n private styleCache: Map<string, Style>;\n \n // Cache statistics\n private stats = {\n color: { hits: 0, misses: 0 },\n gradient: { hits: 0, misses: 0 },\n style: { hits: 0, misses: 0 }\n };\n \n private constructor() {\n // Initialize caches with reasonable sizes\n this.colorCache = new LRUCacheOptimized<string, RGBTuple>(1000);\n this.hexCache = new LRUCacheOptimized<string, RGBTuple>(500);\n this.hslCache = new LRUCacheOptimized<string, RGBTuple>(500);\n this.gradientCache = new LRUCacheOptimized<string, string>(100);\n this.styleCache = new Map<string, Style>();\n }\n \n static getInstance(): CacheManager {\n if (!this.instance) {\n this.instance = new CacheManager();\n }\n return this.instance;\n }\n \n // Color caching methods\n getColor(key: string): RGBTuple | undefined {\n const cached = this.colorCache.get(key);\n if (cached) {\n this.stats.color.hits++;\n return cached;\n }\n this.stats.color.misses++;\n return undefined;\n }\n \n setColor(key: string, value: RGBTuple): void {\n this.colorCache.set(key, value);\n }\n \n getHexColor(hex: string): RGBTuple | undefined {\n const cached = this.hexCache.get(hex);\n if (cached) {\n this.stats.color.hits++;\n return cached;\n }\n this.stats.color.misses++;\n return undefined;\n }\n \n setHexColor(hex: string, value: RGBTuple): void {\n this.hexCache.set(hex, value);\n }\n \n getHslColor(key: string): RGBTuple | undefined {\n const cached = this.hslCache.get(key);\n if (cached) {\n this.stats.color.hits++;\n return cached;\n }\n this.stats.color.misses++;\n return undefined;\n }\n \n setHslColor(key: string, value: RGBTuple): void {\n this.hslCache.set(key, value);\n }\n \n // Gradient caching\n getGradient(key: string): string | undefined {\n const cached = this.gradientCache.get(key);\n if (cached) {\n this.stats.gradient.hits++;\n return cached;\n }\n this.stats.gradient.misses++;\n return undefined;\n }\n \n setGradient(key: string, value: string): void {\n this.gradientCache.set(key, value);\n }\n \n // Style caching for common styles\n getStyle(key: string): Style | undefined {\n const cached = this.styleCache.get(key);\n if (cached) {\n this.stats.style.hits++;\n return cached;\n }\n this.stats.style.misses++;\n return undefined;\n }\n \n setStyle(key: string, value: Style): void {\n // Limit style cache size to prevent memory issues\n if (this.styleCache.size >= 100) {\n const firstKey = this.styleCache.keys().next().value;\n if (firstKey) {\n this.styleCache.delete(firstKey);\n }\n }\n this.styleCache.set(key, value);\n }\n \n // Cache management\n clear(): void {\n this.colorCache.clear();\n this.hexCache.clear();\n this.hslCache.clear();\n this.gradientCache.clear();\n this.styleCache.clear();\n this.resetStats();\n }\n \n clearColors(): void {\n this.colorCache.clear();\n this.hexCache.clear();\n this.hslCache.clear();\n }\n \n clearGradients(): void {\n this.gradientCache.clear();\n }\n \n clearStyles(): void {\n this.styleCache.clear();\n }\n \n // Statistics\n getStats(): Record<string, CacheStats> {\n return {\n color: {\n hits: this.stats.color.hits,\n misses: this.stats.color.misses,\n size: this.colorCache.getSize() + this.hexCache.getSize() + this.hslCache.getSize(),\n maxSize: 2000\n },\n gradient: {\n hits: this.stats.gradient.hits,\n misses: this.stats.gradient.misses,\n size: this.gradientCache.getSize(),\n maxSize: 100\n },\n style: {\n hits: this.stats.style.hits,\n misses: this.stats.style.misses,\n size: this.styleCache.size,\n maxSize: 100\n }\n };\n }\n \n resetStats(): void {\n this.stats = {\n color: { hits: 0, misses: 0 },\n gradient: { hits: 0, misses: 0 },\n style: { hits: 0, misses: 0 }\n };\n }\n \n // Hit rate calculation\n getHitRate(type: 'color' | 'gradient' | 'style'): number {\n const stats = this.stats[type];\n const total = stats.hits + stats.misses;\n return total > 0 ? (stats.hits / total) * 100 : 0;\n }\n}\n\n// Export singleton instance\nexport const cacheManager = CacheManager.getInstance();","/**\n * Color Processing with Performance Optimization\n * Implements caching and efficient color conversion algorithms\n */\n\nimport { hexToRgb } from './ansi';\nimport { cacheManager } from './cache-manager';\n\nexport type ColorInput = string | [number, number, number] | number;\nexport type RGBTuple = readonly [number, number, number];\n\n// Enhanced color name mapping\nconst colorNames: Record<string, string> = {\n // Basic colors\n red: '#ff0000',\n green: '#00ff00',\n blue: '#0000ff',\n yellow: '#ffff00',\n magenta: '#ff00ff',\n cyan: '#00ffff',\n white: '#ffffff',\n black: '#000000',\n gray: '#808080',\n grey: '#808080',\n \n // Extended colors\n orange: '#ffa500',\n purple: '#800080',\n pink: '#ffc0cb',\n brown: '#a52a2a',\n violet: '#ee82ee',\n indigo: '#4b0082',\n lime: '#00ff00',\n olive: '#808000',\n navy: '#000080',\n teal: '#008080',\n silver: '#c0c0c0',\n maroon: '#800000',\n fuchsia: '#ff00ff',\n aqua: '#00ffff',\n \n // Web colors\n aliceblue: '#f0f8ff',\n antiquewhite: '#faebd7',\n aquamarine: '#7fffd4',\n azure: '#f0ffff',\n beige: '#f5f5dc',\n bisque: '#ffe4c4',\n blanchedalmond: '#ffebcd',\n blueviolet: '#8a2be2',\n burlywood: '#deb887',\n cadetblue: '#5f9ea0',\n chartreuse: '#7fff00',\n chocolate: '#d2691e',\n coral: '#ff7f50',\n cornflowerblue: '#6495ed',\n cornsilk: '#fff8dc',\n crimson: '#dc143c',\n darkblue: '#00008b',\n darkcyan: '#008b8b',\n darkgoldenrod: '#b8860b',\n darkgray: '#a9a9a9',\n darkgreen: '#006400',\n darkgrey: '#a9a9a9',\n darkkhaki: '#bdb76b',\n darkmagenta: '#8b008b',\n darkolivegreen: '#556b2f',\n darkorange: '#ff8c00',\n darkorchid: '#9932cc',\n darkred: '#8b0000',\n darksalmon: '#e9967a',\n darkseagreen: '#8fbc8f',\n darkslateblue: '#483d8b',\n darkslategray: '#2f4f4f',\n darkslategrey: '#2f4f4f',\n darkturquoise: '#00ced1',\n darkviolet: '#9400d3',\n deeppink: '#ff1493',\n deepskyblue: '#00bfff',\n dimgray: '#696969',\n dimgrey: '#696969',\n dodgerblue: '#1e90ff',\n firebrick: '#b22222',\n floralwhite: '#fffaf0',\n forestgreen: '#228b22',\n gainsboro: '#dcdcdc',\n ghostwhite: '#f8f8ff',\n gold: '#ffd700',\n goldenrod: '#daa520',\n greenyellow: '#adff2f',\n honeydew: '#f0fff0',\n hotpink: '#ff69b4',\n indianred: '#cd5c5c',\n ivory: '#fffff0',\n khaki: '#f0e68c',\n lavender: '#e6e6fa',\n lavenderblush: '#fff0f5',\n lawngreen: '#7cfc00',\n lemonchiffon: '#fffacd',\n lightblue: '#add8e6',\n lightcoral: '#f08080',\n lightcyan: '#e0ffff',\n lightgoldenrodyellow: '#fafad2',\n lightgray: '#d3d3d3',\n lightgreen: '#90ee90',\n lightgrey: '#d3d3d3',\n lightpink: '#ffb6c1',\n lightsalmon: '#ffa07a',\n lightseagreen: '#20b2aa',\n lightskyblue: '#87cefa',\n lightslategray: '#778899',\n lightslategrey: '#778899',\n lightsteelblue: '#b0c4de',\n lightyellow: '#ffffe0',\n limegreen: '#32cd32',\n linen: '#faf0e6',\n mediumaquamarine: '#66cdaa',\n mediumblue: '#0000cd',\n mediumorchid: '#ba55d3',\n mediumpurple: '#9370db',\n mediumseagreen: '#3cb371',\n mediumslateblue: '#7b68ee',\n mediumspringgreen: '#00fa9a',\n mediumturquoise: '#48d1cc',\n mediumvioletred: '#c71585',\n midnightblue: '#191970',\n mintcream: '#f5fffa',\n mistyrose: '#ffe4e1',\n moccasin: '#ffe4b5',\n navajowhite: '#ffdead',\n oldlace: '#fdf5e6',\n olivedrab: '#6b8e23',\n orangered: '#ff4500',\n orchid: '#da70d6',\n palegoldenrod: '#eee8aa',\n palegreen: '#98fb98',\n paleturquoise: '#afeeee',\n palevioletred: '#db7093',\n papayawhip: '#ffefd5',\n peachpuff: '#ffdab9',\n peru: '#cd853f',\n plum: '#dda0dd',\n powderblue: '#b0e0e6',\n rosybrown: '#bc8f8f',\n royalblue: '#4169e1',\n saddlebrown: '#8b4513',\n salmon: '#fa8072',\n sandybrown: '#f4a460',\n seagreen: '#2e8b57',\n seashell: '#fff5ee',\n sienna: '#a0522d',\n skyblue: '#87ceeb',\n slateblue: '#6a5acd',\n slategray: '#708090',\n slategrey: '#708090',\n snow: '#fffafa',\n springgreen: '#00ff7f',\n steelblue: '#4682b4',\n tan: '#d2b48c',\n thistle: '#d8bfd8',\n tomato: '#ff6347',\n turquoise: '#40e0d0',\n wheat: '#f5deb3',\n whitesmoke: '#f5f5f5',\n yellowgreen: '#9acd32'\n};\n\nexport class ColorProcessor {\n /**\n * Process any color input into RGB tuple with caching\n */\n static processColor(input: ColorInput): RGBTuple {\n const key = this.getCacheKey(input);\n \n // Check cache first\n const cached = cacheManager.getColor(key);\n if (cached) {\n return cached;\n }\n \n const result = this.convertColor(input);\n cacheManager.setColor(key, result);\n return result;\n }\n\n /**\n * Convert HSL to RGB with caching\n */\n static hslToRgb(h: number, s: number, l: number): RGBTuple {\n const key = `hsl(${h},${s},${l})`;\n \n const cached = cacheManager.getHslColor(key);\n if (cached) {\n return cached;\n }\n\n const result = this.computeHslToRgb(h, s, l);\n cacheManager.setHslColor(key, result);\n return result;\n }\n\n /**\n * Convert RGB to 256-color index without caching (caching handled at higher level)\n */\n static rgbTo256(r: number, g: number, b: number): number {\n return this.computeRgbTo256(r, g, b);\n }\n\n /**\n * Get color name suggestions for auto-completion\n */\n static getColorNames(): string[] {\n return Object.keys(colorNames);\n }\n\n /**\n * Check if a string is a valid color name\n */\n static isValidColorName(name: string): boolean {\n return name.toLowerCase() in colorNames;\n }\n\n /**\n * Check if a string is a valid hex color\n */\n static isValidHex(hex: string): boolean {\n return /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.test(hex);\n }\n\n /**\n * Clear all caches (useful for testing or memory management)\n */\n static clearCaches(): void {\n cacheManager.clearColors();\n }\n\n /**\n * Get cache statistics\n */\n static getCacheStats() {\n return cacheManager.getStats();\n }\n\n private static getCacheKey(input: ColorInput): string {\n if (Array.isArray(input)) {\n return `rgb(${input[0]},${input[1]},${input[2]})`;\n }\n if (typeof input === 'number') {\n return `num(${input})`;\n }\n return `str(${input})`;\n }\n\n private static convertColor(input: ColorInput): RGBTuple {\n if (Array.isArray(input)) {\n // Validate and clamp RGB values\n return [\n Math.max(0, Math.min(255, Math.round(input[0]))),\n Math.max(0, Math.min(255, Math.round(input[1]))),\n Math.max(0, Math.min(255, Math.round(input[2])))\n ] as RGBTuple;\n }\n\n if (typeof input === 'number') {\n // Convert number to RGB (assuming 24-bit color)\n const num = Math.max(0, Math.min(0xffffff, Math.floor(input)));\n return [\n (num >> 16) & 0xff,\n (num >> 8) & 0xff,\n num & 0xff\n ] as RGBTuple;\n }\n\n if (typeof input === 'string') {\n const trimmed = input.trim().toLowerCase();\n \n // Check if it's a color name\n if (trimmed in colorNames) {\n return hexToRgb(colorNames[trimmed]) as RGBTuple;\n }\n \n // Check if it's a hex color\n if (this.isValidHex(input)) {\n return hexToRgb(input) as RGBTuple;\n }\n \n // Handle rgb() and rgba() functions\n const rgbMatch = trimmed.match(/^rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)(?:,\\s*[\\d.]+)?\\)$/);\n if (rgbMatch) {\n return [\n Math.max(0, Math.min(255, parseInt(rgbMatch[1], 10))),\n Math.max(0, Math.min(255, parseInt(rgbMatch[2], 10))),\n Math.max(0, Math.min(255, parseInt(rgbMatch[3], 10)))\n ] as RGBTuple;\n }\n\n // Handle hsl() and hsla() functions\n const hslMatch = trimmed.match(/^hsla?\\((\\d+),\\s*(\\d+)%,\\s*(\\d+)%(?:,\\s*[\\d.]+)?\\)$/);\n if (hslMatch) {\n return this.hslToRgb(\n parseInt(hslMatch[1], 10),\n parseInt(hslMatch[2], 10),\n parseInt(hslMatch[3], 10)\n );\n }\n }\n\n // Fallback to white for invalid input\n return [255, 255, 255] as RGBTuple;\n }\n\n private static computeHslToRgb(h: number, s: number, l: number): RGBTuple {\n // Normalize inputs\n h = ((h % 360) + 360) % 360; // Ensure h is 0-359\n s = Math.max(0, Math.min(100, s)) / 100; // Convert to 0-1\n l = Math.max(0, Math.min(100, l)) / 100; // Convert to 0-1\n\n const c = (1 - Math.abs(2 * l - 1)) * s;\n const x = c * (1 - Math.abs((h / 60) % 2 - 1));\n const m = l - c / 2;\n\n let r: number, g: number, b: number;\n\n if (h < 60) {\n [r, g, b] = [c, x, 0];\n } else if (h < 120) {\n [r, g, b] = [x, c, 0];\n } else if (h < 180) {\n [r, g, b] = [0, c, x];\n } else if (h < 240) {\n [r, g, b] = [0, x, c];\n } else if (h < 300) {\n [r, g, b] = [x, 0, c];\n } else {\n [r, g, b] = [c, 0, x];\n }\n\n return [\n Math.round((r + m) * 255),\n Math.round((g + m) * 255),\n Math.round((b + m) * 255)\n ] as RGBTuple;\n }\n\n private static computeRgbTo256(r: number, g: number, b: number): number {\n // Clamp values\n r = Math.max(0, Math.min(255, Math.round(r)));\n g = Math.max(0, Math.min(255, Math.round(g)));\n b = Math.max(0, Math.min(255, Math.round(b)));\n\n // Check if it's a grayscale color\n if (r === g && g === b) {\n if (r < 8) return 16;\n if (r > 248) return 231;\n return Math.round(((r - 8) / 247) * 24) + 232;\n }\n\n // Convert to 6x6x6 color cube\n const rIndex = Math.round((r / 255) * 5);\n const gIndex = Math.round((g / 255) * 5);\n const bIndex = Math.round((b / 255) * 5);\n\n return 16 + (36 * rIndex) + (6 * gIndex) + bIndex;\n }\n}","import { ansiCode, ansiCodes, rgb, bgRgb, ansi256, bgAnsi256, rgbToAnsi256 } from '../core/ansi';\nimport { terminal } from '../utils/terminal';\nimport { InputValidator } from '../core/validators';\nimport { ValidationError, ErrorCode } from '../core/errors';\nimport { ColorProcessor } from '../core/color-processor';\n\nexport type ColorInput = string | number | [number, number, number];\n\nexport interface StyleOptions {\n force?: boolean;\n level?: 0 | 1 | 2 | 3;\n}\n\nexport class Style {\n private codes: string[] = [];\n private resetCodes: string[] = [];\n private options: StyleOptions;\n\n constructor(codes: string[] = [], resetCodes: string[] = [], options: StyleOptions = {}) {\n this.codes = codes;\n this.resetCodes = resetCodes;\n this.options = options;\n }\n\n private shouldApplyStyle(): boolean {\n if (this.options.force) return true;\n const level = this.options.level ?? terminal().colorLevel;\n return level > 0;\n }\n\n private addStyle(code: string, resetCode: string): Style {\n if (typeof code !== 'string' || typeof resetCode !== 'string') {\n return this; // Invalid input, return unchanged\n }\n \n // Check if this is a color code that should override previous colors\n const newCodes = [...this.codes];\n const newResetCodes = [...this.resetCodes];\n \n try {\n // Safely parse the code number\n const codeNum = parseInt(code.split(';')[0], 10);\n if (isNaN(codeNum)) {\n // Invalid code, just add it without conflict resolution\n return new Style(\n [...newCodes, code],\n [resetCode, ...newResetCodes],\n this.options\n );\n }\n \n const isForegroundColor = (codeNum >= 30 && codeNum <= 37) || (codeNum >= 90 && codeNum <= 97) || code.startsWith('38;');\n const isBackgroundColor = (codeNum >= 40 && codeNum <= 47) || (codeNum >= 100 && codeNum <= 107) || code.startsWith('48;');\n \n if (isForegroundColor) {\n // Remove previous foreground colors\n const indicesToRemove: number[] = [];\n for (let i = newCodes.length - 1; i >= 0; i--) {\n const existingCode = newCodes[i];\n const existingCodeNum = parseInt(existingCode.split(';')[0], 10);\n if (!isNaN(existingCodeNum)) {\n const isExistingFgColor = (existingCodeNum >= 30 && existingCodeNum <= 37) || \n (existingCodeNum >= 90 && existingCodeNum <= 97) || \n existingCode.startsWith('38;');\n if (isExistingFgColor) {\n indicesToRemove.push(i);\n }\n }\n }\n \n // Remove in reverse order to maintain indices\n for (let i = indicesToRemove.length - 1; i >= 0; i--) {\n const index = indicesToRemove[i];\n if (index >= 0 && index < newCodes.length) {\n newCodes.splice(index, 1);\n // Calculate reset index safely with proper bounds checking\n const resetIndex = Math.min(newResetCodes.length - 1, Math.max(0, newResetCodes.length - 1 - i));\n if (resetIndex >= 0 && resetIndex < newResetCodes.length) {\n newResetCodes.splice(resetIndex, 1);\n }\n }\n }\n }\n \n if (isBackgroundColor) {\n // Remove previous background colors\n const indicesToRemove: number[] = [];\n for (let i = newCodes.length - 1; i >= 0; i--) {\n const existingCode = newCodes[i];\n const existingCodeNum = parseInt(existingCode.split(';')[0], 10);\n if (!isNaN(existingCodeNum)) {\n const isExistingBgColor = (existingCodeNum >= 40 && existingCodeNum <= 47) || \n (existingCodeNum >= 100 && existingCodeNum <= 107) || \n existingCode.startsWith('48;');\n if (isExistingBgColor) {\n indicesToRemove.push(i);\n }\n }\n }\n \n // Remove in reverse order to maintain indices\n for (let i = indicesToRemove.length - 1; i >= 0; i--) {\n const index = indicesToRemove[i];\n if (index >= 0 && index < newCodes.length) {\n newCodes.splice(index, 1);\n // Calculate reset index safely with proper bounds checking\n const resetIndex = Math.min(newResetCodes.length - 1, Math.max(0, newResetCodes.length - 1 - i));\n if (resetIndex >= 0 && resetIndex < newResetCodes.length) {\n newResetCodes.splice(resetIndex, 1);\n }\n }\n }\n }\n \n return new Style(\n [...newCodes, code],\n [resetCode, ...newResetCodes],\n this.options\n );\n } catch {\n // If anything fails, safely add the style without conflict resolution\n return new Style(\n [...newCodes, code],\n [resetCode, ...newResetCodes],\n this.options\n );\n }\n }\n\n apply(text: string): string {\n // Validate text input\n const validation = InputValidator.validateText(text);\n if (!validation.valid) {\n return '';\n }\n \n const validatedText = validation.value!.text;\n \n if (!this.shouldApplyStyle() || this.codes.length === 0) {\n return validatedText;\n }\n\n const openCodes = this.codes.map(code => ansiCode(code)).join('');\n const closeCodes = this.resetCodes.map(code => ansiCode(code)).join('');\n \n return openCodes + validatedText + closeCodes;\n }\n\n get bold(): Style {\n return this.addStyle(String(ansiCodes.bold), String(ansiCodes.resetBold));\n }\n\n get dim(): Style {\n return this.addStyle(String(ansiCodes.dim), String(ansiCodes.resetDim));\n }\n\n get italic(): Style {\n return this.addStyle(String(ansiCodes.italic), String(ansiCodes.resetItalic));\n }\n\n get underline(): Style {\n return this.addStyle(String(ansiCodes.underline), String(ansiCodes.resetUnderline));\n }\n\n get inverse(): Style {\n return this.addStyle(String(ansiCodes.inverse), String(ansiCodes.resetInverse));\n }\n\n get hidden(): Style {\n return this.addStyle(String(ansiCodes.hidden), String(ansiCodes.resetHidden));\n }\n\n get strikethrough(): Style {\n return this.addStyle(String(ansiCodes.strikethrough), String(ansiCodes.resetStrikethrough));\n }\n\n get black(): Style {\n return this.addStyle(String(ansiCodes.black), String(ansiCodes.defaultColor));\n }\n\n get red(): Style {\n return this.addStyle(String(ansiCodes.red), String(ansiCodes.defaultColor));\n }\n\n get green(): Style {\n return this.addStyle(String(ansiCodes.green), String(ansiCodes.defaultColor));\n }\n\n get yellow(): Style {\n return this.addStyle(String(ansiCodes.yellow), String(ansiCodes.defaultColor));\n }\n\n get blue(): Style {\n return this.addStyle(String(ansiCodes.blue), String(ansiCodes.defaultColor));\n }\n\n get magenta(): Style {\n return this.addStyle(String(ansiCodes.magenta), String(ansiCodes.defaultColor));\n }\n\n get cyan(): Style {\n return this.addStyle(String(ansiCodes.cyan), String(ansiCodes.defaultColor));\n }\n\n get white(): Style {\n return this.addStyle(String(ansiCodes.white), String(ansiCodes.defaultColor));\n }\n\n get gray(): Style {\n return this.addStyle(String(ansiCodes.brightBlack), String(ansiCodes.defaultColor));\n }\n\n get grey(): Style {\n return this.gray;\n }\n\n get bgBlack(): Style {\n return this.addStyle(String(ansiCodes.bgBlack), String(ansiCodes.bgDefaultColor));\n }\n\n get bgRed(): Style {\n return this.addStyle(String(ansiCodes.bgRed), String(ansiCodes.bgDefaultColor));\n }\n\n get bgGreen(): Style {\n return this.addStyle(String(ansiCodes.bgGreen), String(ansiCodes.bgDefaultColor));\n }\n\n get bgYellow(): Style {\n return this.addStyle(String(ansiCodes.bgYellow), String(ansiCodes.bgDefaultColor));\n }\n\n get bgBlue(): Style {\n return this.addStyle(String(ansiCodes.bgBlue), String(ansiCodes.bgDefaultColor));\n }\n\n get bgMagenta(): Style {\n return this.addStyle(String(ansiCodes.bgMagenta), String(ansiCodes.bgDefaultColor));\n }\n\n get bgCyan(): Style {\n return this.addStyle(String(ansiCodes.bgCyan), String(ansiCodes.bgDefaultColor));\n }\n\n get bgWhite(): Style {\n return this.addStyle(String(ansiCodes.bgWhite), String(ansiCodes.bgDefaultColor));\n }\n\n get bgGray(): Style {\n return this.addStyle(String(ansiCodes.bgBrightBlack), String(ansiCodes.bgDefaultColor));\n }\n\n get bgGrey(): Style {\n return this.bgGray;\n }\n\n color(color: ColorInput): Style {\n const level = this.options.level ?? terminal().colorLevel;\n \n // Validate color input\n const validation = InputValidator.validateColor(color);\n if (!validation.valid) {\n if (process.env.NODE_ENV === 'development') {\n throw new ValidationError(\n validation.error!,\n ErrorCode.INVALID_COLOR_INPUT,\n { input: color }\n );\n }\n // In production, return unchanged style\n return this;\n }\n \n // Check if it's a basic named color first\n if (typeof color === 'string') {\n const basicColors: Record<string, number> = {\n black: ansiCodes.black,\n red: ansiCodes.red,\n green: ansiCodes.green,\n yellow: ansiCodes.yellow,\n blue: ansiCodes.blue,\n magenta: ansiCodes.magenta,\n cyan: ansiCodes.cyan,\n white: ansiCodes.white,\n gray: ansiCodes.brightBlack,\n grey: ansiCodes.brightBlack\n };\n \n const colorLower = color.toLowerCase();\n if (colorLower in basicColors && level >= 1) {\n return this.addStyle(String(basicColors[colorLower]), String(ansiCodes.defaultColor));\n }\n \n // Check if it's a hex color without # prefix\n if (/^[0-9a-fA-F]{6}$/.test(color)) {\n // Add # prefix and process as hex\n const [r, g, b] = ColorProcessor.processColor('#' + color);\n if (this.options.force || level >= 3) {\n return this.addStyle(rgb(r, g, b), String(ansiCodes.defaultColor));\n } else if (level >= 2) {\n const code = rgbToAnsi256(r, g, b);\n return this.addStyle(ansi256(code), String(ansiCodes.defaultColor));\n }\n }\n \n // Check if it's a valid color name or hex with #\n if (!ColorProcessor.isValidColorName(color) && !ColorProcessor.isValidHex(color)) {\n // Invalid color name - return unchanged\n return this;\n }\n }\n \n // Handle ANSI 256 color codes\n if (typeof color === 'number') {\n if (level >= 2) {\n return this.addStyle(ansi256(color), String(ansiCodes.defaultColor));\n } else {\n // No support for 256 colors at basic level\n return this;\n }\n }\n \n // Use ColorProcessor for RGB colors\n const [r, g, b] = ColorProcessor.processColor(color);\n \n if (this.options.force || level >= 3) {\n return this.addStyle(rgb(r, g, b), String(ansiCodes.defaultColor));\n } else if (level >= 2) {\n const code = rgbToAnsi256(r, g, b);\n return this.addStyle(ansi256(code), String(ansiCodes.defaultColor));\n } else if (level >= 1) {\n // Basic color level (1) doesn't support RGB arrays\n return this;\n }\n\n return this;\n }\n\n bgColor(color: ColorInput): Style {\n const level = this.options.level ?? terminal().colorLevel;\n \n // Validate color input\n const validation = InputValidator.validateColor(color);\n if (!validation.valid) {\n if (process.env.NODE_ENV === 'development') {\n throw new ValidationError(\n validation.error!,\n ErrorCode.INVALID_COLOR_INPUT,\n { input: color }\n );\n }\n // In production, return unchanged style\n return this;\n }\n \n // Check if it's a basic named color first\n if (typeof color === 'string') {\n const basicBgColors: Record<string, number> = {\n black: ansiCodes.bgBlack,\n red: ansiCodes.bgRed,\n green: ansiCodes.bgGreen,\n yellow: ansiCodes.bgYellow,\n blue: ansiCodes.bgBlue,\n magenta: ansiCodes.bgMagenta,\n cyan: ansiCodes.bgCyan,\n white: ansiCodes.bgWhite,\n gray: ansiCodes.bgBrightBlack,\n grey: ansiCodes.bgBrightBlack\n };\n \n const colorLower = color.toLowerCase();\n if (colorLower in basicBgColors && level >= 1) {\n return this.addStyle(String(basicBgColors[colorLower]), String(ansiCodes.bgDefaultColor));\n }\n }\n \n // Handle ANSI 256 color codes\n if (typeof color === 'number' && level >= 2) {\n return this.addStyle(bgAnsi256(color), String(ansiCodes.bgDefaultColor));\n }\n \n // Use ColorProcessor for RGB colors\n const [r, g, b] = ColorProcessor.processColor(color);\n \n if (this.options.force || level >= 3) {\n return this.addStyle(bgRgb(r, g, b), String(ansiCodes.bgDefaultColor));\n } else if (level >= 2) {\n const code = rgbToAnsi256(r, g, b);\n return this.addStyle(bgAnsi256(code), String(ansiCodes.bgDefaultColor));\n } else if (level >= 1) {\n // Fallback to basic background colors for RGB values\n const brightness = (r + g + b) / 3;\n let closestColor = 'white';\n if (brightness < 64) closestColor = 'black';\n else if (r > g && r > b) closestColor = 'red';\n else if (g > r && g > b) closestColor = 'green';\n else if (b > r && b > g) closestColor = 'blue';\n else if (r > 128 && g > 128) closestColor = 'yellow';\n else if (r > 128 && b > 128) closestColor = 'magenta';\n else if (g > 128 && b > 128) closestColor = 'cyan';\n \n const basicBgColors: Record<string, number> = {\n black: ansiCodes.bgBlack,\n red: ansiCodes.bgRed,\n green: ansiCodes.bgGreen,\n yellow: ansiCodes.bgYellow,\n blue: ansiCodes.bgBlue,\n magenta: ansiCodes.bgMagenta,\n cyan: ansiCodes.bgCyan,\n white: ansiCodes.bgWhite\n };\n \n return this.addStyle(String(basicBgColors[closestColor]), String(ansiCodes.bgDefaultColor));\n }\n\n return this;\n }\n\n rgb(r: number, g: number, b: number): Style {\n // Validate individual RGB values\n const validation = InputValidator.validateColor([r, g, b]);\n if (!validation.valid) {\n if (process.env.NODE_ENV === 'development') {\n throw new ValidationError(\n validation.error!,\n ErrorCode.INVALID_COLOR_INPUT,\n { r, g, b }\n );\n }\n return this;\n }\n return this.color([r, g, b]);\n }\n\n bgRgb(r: number, g: number, b: number): Style {\n // Validate individual RGB values\n const validation = InputValidator.validateColor([r, g, b]);\n if (!validation.valid) {\n if (process.env.NODE_ENV === 'development') {\n throw new ValidationError(\n validation.error!,\n ErrorCode.INVALID_COLOR_INPUT,\n { r, g, b }\n );\n }\n return this;\n }\n return this.bgColor([r, g, b]);\n }\n\n hex(hex: string): Style {\n return this.color(hex);\n }\n\n bgHex(hex: string): Style {\n return this.bgColor(hex);\n }\n}","import { Style, StyleOptions } from './styles/style';\nimport { stripAnsi } from './core/ansi';\n\ntype FormatterFunction = {\n (text: string): string;\n (...args: any[]): string;\n};\n\nexport type FormatterProxy = FormatterFunction & Record<string, any>;\n\nexport class Formatter {\n private style: Style;\n\n constructor(options: StyleOptions = {}) {\n this.style = new Style([], [], options);\n }\n\n private createProxy(style: Style): FormatterProxy {\n const formatter = (...args: any[]): string => {\n if (args.length === 0) return '';\n \n if (args.length === 1 && typeof args[0] === 'string') {\n return style.apply(args[0]);\n }\n \n if (Array.isArray(args[0]) && 'raw' in args[0]) {\n return this.template(style, args[0] as TemplateStringsArray, ...args.slice(1));\n }\n \n return style.apply(args.map(String).join(' '));\n };\n\n return new Proxy(formatter as FormatterProxy, {\n get: (target, prop: string) => {\n // Special methods from Formatter class\n if (prop === 'strip') {\n return this.strip.bind(this);\n }\n \n if (prop in style) {\n const styleObj = style as Style & Record<string, unknown>;\n const newStyle = styleObj[prop];\n if (newStyle instanceof Style) {\n return this.createProxy(newStyle);\n }\n if (typeof newStyle === 'function') {\n return (...args: unknown[]) => {\n const result = (newStyle as (...args: unknown[]) => unknown).apply(style, args);\n if (result instanceof Style) {\n return this.createProxy(result);\n }\n return result;\n };\n }\n }\n return target[prop as keyof FormatterProxy];\n }\n });\n }\n\n private template(style: Style, strings: TemplateStringsArray, ...values: any[]): string {\n let result = '';\n \n strings.forEach((str, i) => {\n result += str;\n if (i < values.length) {\n result += String(values[i]);\n }\n });\n \n return style.apply(result);\n }\n\n get proxy(): FormatterProxy {\n return this.createProxy(this.style);\n }\n\n strip(text: string): string {\n return stripAnsi(text);\n }\n\n static create(options: StyleOptions = {}): FormatterProxy {\n const formatter = new Formatter(options);\n return formatter.proxy;\n }\n}\n\n\nexport interface FormatterInstance extends FormatterProxy {\n (text: string): string;\n (...args: any[]): string;\n (strings: TemplateStringsArray, ...values: any[]): string;\n \n strip: (text: string) => string;\n \n color: (color: string | number | [number, number, number]) => FormatterProxy;\n bgColor: (color: string | number | [number, number, number]) => FormatterProxy;\n rgb: (r: number, g: number, b: number) => FormatterProxy;\n bgRgb: (r: number, g: number, b: number) => FormatterProxy;\n hex: (hex: string) => FormatterProxy;\n bgHex: (hex: string) => FormatterProxy;\n}\n\nexport interface FormatterAPI extends FormatterInstance {\n black: FormatterInstance;\n red: FormatterInstance;\n green: FormatterInstance;\n yellow: FormatterInstance;\n blue: FormatterInstance;\n magenta: FormatterInstance;\n cyan: FormatterInstance;\n white: FormatterInstance;\n gray: FormatterInstance;\n grey: FormatterInstance;\n \n bgBlack: FormatterInstance;\n bgRed: FormatterInstance;\n bgGreen: FormatterInstance;\n bgYellow: FormatterInstance;\n bgBlue: FormatterInstance;\n bgMagenta: FormatterInstance;\n bgCyan: FormatterInstance;\n bgWhite: FormatterInstance;\n bgGray: FormatterInstance;\n bgGrey: FormatterInstance;\n \n bold: FormatterInstance;\n dim: FormatterInstance;\n italic: FormatterInstance;\n underline: FormatterInstance;\n inverse: FormatterInstance;\n hidden: FormatterInstance;\n strikethrough: FormatterInstance;\n}","/**\n * High-performance StringBuilder for efficient string concatenation\n * Avoids the O(n²) complexity of repeated string concatenation\n */\n\nexport class StringBuilder {\n private chunks: string[] = [];\n private _length = 0;\n \n constructor(initial?: string) {\n if (initial) {\n this.append(initial);\n }\n }\n \n append(value: string | number): StringBuilder {\n if (typeof value === 'number') {\n const str = String(value);\n this.chunks.push(str);\n this._length += str.length;\n } else if (value.length > 0) {\n this.chunks.push(value);\n this._length += value.length;\n }\n return this;\n }\n \n appendLine(str: string = ''): StringBuilder {\n return this.append(str + '\\n');\n }\n \n prepend(str: string): StringBuilder {\n if (str.length > 0) {\n this.chunks.unshift(str);\n this._length += str.length;\n }\n return this;\n }\n \n insert(index: number, str: string): StringBuilder {\n if (index < 0 || index > this._length) {\n throw new RangeError('Index out of bounds');\n }\n \n if (index === 0) {\n return this.prepend(str);\n }\n \n if (index === this._length) {\n return this.append(str);\n }\n \n // For insertion in the middle, we need to rebuild\n const current = this.toString();\n this.clear();\n this.append(current.slice(0, index));\n this.append(str);\n this.append(current.slice(index));\n \n return this;\n }\n \n clear(): StringBuilder {\n this.chunks = [];\n this._length = 0;\n return this;\n }\n \n toString(): string {\n // Join is much faster than repeated concatenation\n return this.chunks.join('');\n }\n \n get length(): number {\n return this._length;\n }\n \n isEmpty(): boolean {\n return this._length === 0;\n }\n \n // Static factory method\n static create(initial?: string): StringBuilder {\n return new StringBuilder(initial);\n }\n \n // Utility method for building ANSI sequences\n static ansi(codes: (string | number)[]): string {\n return `\\u001b[${codes.join(';')}m`;\n }\n \n // Performance-optimized method for building styled text\n static styledText(text: string, openCodes: string[], closeCodes: string[]): string {\n if (openCodes.length === 0) return text;\n \n const builder = new StringBuilder();\n \n // Add opening codes\n for (const code of openCodes) {\n builder.append(`\\u001b[${code}m`);\n }\n \n // Add text\n builder.append(text);\n \n // Add closing codes in reverse order\n for (let i = closeCodes.length - 1; i >= 0; i--) {\n builder.append(`\\u001b[${closeCodes[i]}m`);\n }\n \n return builder.toString();\n }\n}\n\n/**\n * Pool of reusable StringBuilder instances to reduce GC pressure\n */\nexport class StringBuilderPool {\n private static pool: StringBuilder[] = [];\n private static maxPoolSize = 10;\n \n static acquire(initial?: string): StringBuilder {\n const builder = this.pool.pop() || new StringBuilder();\n if (initial) {\n builder.append(initial);\n }\n return builder;\n }\n \n static release(builder: StringBuilder): void {\n if (this.pool.length < this.maxPoolSize) {\n builder.clear();\n this.pool.push(builder);\n }\n }\n \n static withBuilder<T>(fn: (builder: StringBuilder) => T): T {\n const builder = this.acquire();\n try {\n return fn(builder);\n } finally {\n this.release(builder);\n }\n }\n}","import { Style } from '../styles/style';\nimport { terminal } from '../utils/terminal';\nimport { ColorProcessor, RGBTuple } from '../core/color-processor';\nimport { StringBuilder } from '../core/string-builder';\nimport { cacheManager } from '../core/cache-manager';\nimport { InputValidator } from '../core/validators';\nimport { ValidationError, ErrorCode, ErrorRecovery } from '../core/errors';\n\n\n\n// Convert RGB to basic color (30-37)\nfunction rgbToBasic(r: number, g: number, b: number): number {\n const brightness = (r + g + b) / 3;\n \n if (brightness < 64) return 30; // black\n if (r > g && r > b) return 31; // red\n if (g > r && g > b) return 32; // green\n if (r > 128 && g > 128 && b < 64) return 33; // yellow\n if (b > r && b > g) return 34; // blue\n if (r > 128 && b > 128 && g < 64) return 35; // magenta\n if (g > 128 && b > 128 && r < 64) return 36; // cyan\n return 37; // white\n}\n\nfunction convertColorInput(color: string | number | [number, number, number]): RGBTuple {\n return ColorProcessor.processColor(color);\n}\n\nexport interface GradientOptions {\n interpolation?: 'linear' | 'bezier';\n hsvSpin?: 'short' | 'long';\n}\n\nfunction interpolateLinear(start: number, end: number, factor: number): number {\n return Math.round(start + (end - start) * factor);\n}\n\nfunction rgbToHsv(r: number, g: number, b: number): [number, number, number] {\n r /= 255;\n g /= 255;\n b /= 255;\n\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const delta = max - min;\n\n let h = 0;\n const s = max === 0 ? 0 : delta / max;\n const v = max;\n\n if (delta !== 0) {\n if (max === r) {\n h = ((g - b) / delta + (g < b ? 6 : 0)) / 6;\n } else if (max === g) {\n h = ((b - r) / delta + 2) / 6;\n } else {\n h = ((r - g) / delta + 4) / 6;\n }\n }\n\n return [h * 360, s * 100, v * 100];\n}\n\nfunction hsvToRgb(h: number, s: number, v: number): [number, number, number] {\n h /= 360;\n s /= 100;\n v /= 100;\n\n const i = Math.floor(h * 6);\n const f = h * 6 - i;\n const p = v * (1 - s);\n const q = v * (1 - f * s);\n const t = v * (1 - (1 - f) * s);\n\n let r: number, g: number, b: number;\n\n switch (i % 6) {\n case 0: [r, g, b] = [v, t, p]; break;\n case 1: [r, g, b] = [q, v, p]; break;\n case 2: [r, g, b] = [p, v, t]; break;\n case 3: [r, g, b] = [p, q, v]; break;\n case 4: [r, g, b] = [t, p, v]; break;\n case 5: [r, g, b] = [v, p, q]; break;\n default: [r, g, b] = [0, 0, 0];\n }\n\n return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)];\n}\n\nfunction interpolateHsv(\n start: RGBTuple,\n end: RGBTuple,\n factor: number,\n spin: 'short' | 'long' = 'short'\n): RGBTuple {\n const [h1Start, s1, v1] = rgbToHsv(start[0], start[1], start[2]);\n const [h2Start, s2, v2] = rgbToHsv(end[0], end[1], end[2]);\n let h1 = h1Start;\n let h2 = h2Start;\n\n if (spin === 'long') {\n if (h2 > h1 && h2 - h1 > 180) {\n h1 += 360;\n } else if (h1 > h2 && h1 - h2 > 180) {\n h2 += 360;\n }\n } else {\n if (h2 > h1 && h2 - h1 > 180) {\n h2 -= 360;\n } else if (h1 > h2 && h1 - h2 > 180) {\n h1 -= 360;\n }\n }\n\n const hRaw = interpolateLinear(h1, h2, factor);\n // Ensure h is in range [0, 360)\n const h = ((hRaw % 360) + 360) % 360;\n const s = Math.max(0, Math.min(100, interpolateLinear(s1, s2, factor)));\n const v = Math.max(0, Math.min(100, interpolateLinear(v1, v2, factor)));\n\n return hsvToRgb(h, s, v) as RGBTuple;\n}\n\n// Optimized function for cache key generation\nfunction getGradientCacheKey(text: string, colors: (string | number | [number, number, number])[], options: GradientOptions): string {\n // Use StringBuilder for efficient string concatenation\n const keyBuilder = new StringBuilder();\n \n // Add colors\n for (let i = 0; i < colors.length; i++) {\n if (i > 0) keyBuilder.append('|');\n const c = colors[i];\n if (Array.isArray(c)) {\n keyBuilder.append(c[0]).append(',').append(c[1]).append(',').append(c[2]);\n } else {\n keyBuilder.append(String(c));\n }\n }\n \n keyBuilder.append('-').append(text.length).append('-');\n \n // Better hash calculation with FNV-1a algorithm for better distribution\n let hash = 2166136261; // FNV offset basis\n for (let i = 0; i < text.length; i++) {\n hash ^= text.charCodeAt(i);\n hash = Math.imul(hash, 16777619); // FNV prime, using Math.imul for 32-bit arithmetic\n }\n // Ensure positive number\n hash = Math.abs(hash);\n keyBuilder.append(hash).append('-');\n \n // Add options\n keyBuilder.append(options.interpolation || 'linear')\n .append('-')\n .append(options.hsvSpin || 'short');\n \n return keyBuilder.toString();\n}\n\nfunction optimizedGradientBase(\n text: string,\n colors: (string | number | [number, number, number])[],\n options: GradientOptions = {}\n): string {\n // Validate text input\n const textValidation = InputValidator.validateText(text);\n if (!textValidation.valid) {\n return '';\n }\n const validatedText = textValidation.value!.text;\n \n // Check terminal color support\n const termInfo = terminal();\n if (!termInfo.supportsColor) {\n return validatedText; // Return plain text if no color support\n }\n\n // Validate color array\n const colorValidation = InputValidator.validateColorArray(colors);\n if (!colorValidation.valid) {\n if (process.env.NODE_ENV === 'development') {\n throw new ValidationError(\n colorValidation.error!,\n ErrorCode.INVALID_COLOR_INPUT,\n { colors }\n );\n }\n return validatedText;\n }\n \n const validColors = colorValidation.value!.map(vc => vc.original);\n \n if (validColors.length === 0) return validatedText;\n if (validColors.length === 1) {\n const color = validColors[0];\n const rgb = convertColorInput(color);\n return new Style([], [], {}).color([rgb[0], rgb[1], rgb[2]]).apply(validatedText);\n }\n\n const chars = [...validatedText];\n if (chars.length === 0) return validatedText;\n \n // Check cache for this gradient configuration\n const cacheKey = getGradientCacheKey(validatedText, validColors, options);\n const cached = cacheManager.getGradient(cacheKey);\n if (cached) {\n return cached;\n }\n \n // Pre-compute all colors for performance\n const colorStops = validColors.map(convertColorInput);\n const segments = Math.max(1, colorStops.length - 1);\n const charsPerSegment = chars.length / segments;\n \n // Use StringBuilder for better performance than array joining\n const builder = new StringBuilder();\n \n // Pre-calculate common ANSI sequences for reuse\n const colorReset = '\\u001b[39m';\n const colorLevel = termInfo.colorLevel;\n \n // Optimize interpolation function selection\n const useHsvInterpolation = options.interpolation === 'bezier' || options.hsvSpin;\n \n for (let i = 0; i < chars.length; i++) {\n const char = chars[i];\n \n // Fast path for whitespace\n if (char === ' ' || char === '\\n' || char === '\\t') {\n builder.append(char);\n continue;\n }\n\n const segment = Math.min(Math.floor(i / charsPerSegment), segments - 1);\n const segmentProgress = (i % charsPerSegment) / charsPerSegment;\n \n const startColor = colorStops[segment];\n // Ensure we don't go out of bounds for the last segment\n const endColor = colorStops[Math.min(segment + 1, colorStops.length - 1)];\n \n let r: number, g: number, b: number;\n \n if (useHsvInterpolation) {\n const color = interpolateHsv(startColor, endColor, segmentProgress, options.hsvSpin);\n [r, g, b] = color;\n } else {\n // Inline linear interpolation for performance\n r = Math.round(startColor[0] + (endColor[0] - startColor[0]) * segmentProgress);\n g = Math.round(startColor[1] + (endColor[1] - startColor[1]) * segmentProgress);\n b = Math.round(startColor[2] + (endColor[2] - startColor[2]) * segmentProgress);\n }\n \n // Build ANSI code based on terminal color support\n if (colorLevel >= 3) {\n // 24-bit true color\n builder.append('\\u001b[38;2;').append(r).append(';').append(g).append(';').append(b).append('m').append(char).append(colorReset);\n } else if (colorLevel >= 2) {\n // 256 color mode - use cached conversion\n const colorIndex = ColorProcessor.rgbTo256(r, g, b);\n builder.append('\\u001b[38;5;').append(colorIndex).append('m').append(char).append(colorReset);\n } else {\n // Basic colors only\n const basicColor = rgbToBasic(r, g, b);\n builder.append('\\u001b[').append(basicColor).append('m').append(char).append(colorReset);\n }\n }\n \n const result = builder.toString();\n \n // Cache the result\n cacheManager.setGradient(cacheKey, result);\n \n return result;\n}\n\nfunction gradientBase(\n text: string,\n colors: (string | number | [number, number, number])[],\n options: GradientOptions = {}\n): string {\n return optimizedGradientBase(text, colors, options);\n}\n\n// Export the basic gradient function\nexport function gradient(\n text: string,\n colors: (string | number | [number, number, number])[],\n options: GradientOptions = {}\n): string {\n return ErrorRecovery.recover(\n () => gradientBase(text, colors, options),\n text,\n process.env.DEBUG === 'true'\n );\n}\n\n// Add linear method for backward compatibility\nexport interface GradientAPI {\n (text: string, colors: (string | number | [number, number, number])[], options?: GradientOptions): string;\n (colors: (string | number | [number, number, number])[]): (text: string, options?: GradientOptions) => string;\n linear: (text: string, options: { from: string | number | [number, number, number]; to: string | number | [number, number, number] }) => string;\n}\n\n// Create gradient object with linear method for the main index\nconst gradientWithLinear = Object.assign(\n function gradient(...args: any[]) {\n // Support both gradient(text, colors) and gradient(colors)(text)\n if (args.length === 1 && Array.isArray(args[0])) {\n // Curried form: gradient(colors) returns a function\n const colors = args[0] as (string | number | [number, number, number])[];\n return (text: string, options?: GradientOptions) => gradientBase(text, colors, options);\n } else if (args.length >= 2) {\n // Direct form: gradient(text, colors, options?)\n const [text, colors, options] = args;\n return gradientBase(text, colors, options);\n } else if (args.length === 1 && typeof args[0] === 'string') {\n // Edge case: gradient(text) with no colors\n return args[0];\n }\n // Default case\n return '';\n },\n {\n linear: (text: string, options: { from: string | [number, number, number]; to: string | [number, number, number] }) => {\n return gradientBase(text, [options.from, options.to]);\n }\n }\n) as GradientAPI;\n\n// Export the enhanced gradient function for main index\nexport { gradientWithLinear as gradientEnhanced };\n\n// Export linear function for direct imports\nexport const linear = (text: string, options: { from: string | number | [number, number, number]; to: string | number | [number, number, number] }) => {\n if (!options || !options.from || !options.to) {\n if (process.env.NODE_ENV === 'development') {\n throw new ValidationError(\n 'Linear gradient requires both from and to colors',\n ErrorCode.INVALID_COLOR_INPUT,\n { options }\n );\n }\n return text;\n }\n return gradientBase(text, [options.from, options.to]);\n};\n\n// Export default for CommonJS compatibility\nexport default {\n linear,\n gradient,\n rainbow\n};\n\n// Rainbow function with optional currying support\nexport function rainbow(...args: any[]): string | ((text: string) => string) {\n const colors = [\n '#e81416', // Red\n '#ffa500', // Orange \n '#faeb36', // Yellow\n '#79c314', // Green\n '#487de7', // Blue\n '#4b369d', // Indigo\n '#70369d' // Violet\n ];\n \n if (args.length === 0) {\n // Curried form: rainbow() returns a function\n return (text: string, options: GradientOptions = {}) => {\n return ErrorRecovery.recover(\n () => gradientBase(text, colors, options),\n text,\n process.env.DEBUG === 'true'\n );\n };\n } else if (args.length >= 1 && typeof args[0] === 'string') {\n // Direct form: rainbow(text, options?)\n const [text, options = {}] = args;\n return ErrorRecovery.recover(\n () => gradientBase(text, colors, options),\n text,\n process.env.DEBUG === 'true'\n );\n }\n \n // Default case\n return '';\n}","/**\n * Global Resource Manager for tracking and disposing resources\n * Prevents memory leaks by ensuring all resources are properly cleaned up\n */\n\nexport interface Disposable {\n dispose(): void;\n}\n\nexport class ResourceManager {\n private static resources = new Set<Disposable>();\n private static initialized = false;\n private static isDisposing = false;\n\n static register(resource: Disposable): void {\n this.ensureInitialized();\n this.resources.add(resource);\n }\n\n static unregister(resource: Disposable): void {\n this.resources.delete(resource);\n }\n\n static disposeAll(): void {\n // Atomic check-and-set to prevent race conditions\n const wasDisposing = this.isDisposing;\n this.isDisposing = true;\n \n // If already disposing, wait and return\n if (wasDisposing) return;\n \n const resources = Array.from(this.resources);\n this.resources.clear();\n \n // Dispose resources with error isolation\n for (const resource of resources) {\n try {\n resource.dispose();\n } catch (error) {\n // Log error but continue cleanup to prevent cascading failures\n if (typeof console !== 'undefined' && console.warn) {\n console.warn('Error disposing resource:', error);\n }\n }\n }\n \n this.isDisposing = false;\n }\n\n static getResourceCount(): number {\n return this.resources.size;\n }\n\n private static ensureInitialized(): void {\n if (this.initialized) return;\n this.initialized = true;\n\n // Set up process exit handlers only once\n const cleanup = () => {\n this.disposeAll();\n };\n\n // Create cleanup handler that ensures single execution\n let cleanupExecuted = false;\n const safeCleanup = () => {\n if (!cleanupExecuted) {\n cleanupExecuted = true;\n cleanup();\n }\n };\n\n // Increase listener limit to prevent warnings\n if (typeof process !== 'undefined' && process.setMaxListeners) {\n const currentMax = process.getMaxListeners();\n if (currentMax < 20) {\n process.setMaxListeners(20);\n }\n }\n\n // Register cleanup handlers with safe wrapper\n if (typeof process !== 'undefined') {\n process.once('exit', safeCleanup);\n process.once('SIGINT', safeCleanup);\n process.once('SIGTERM', safeCleanup);\n process.once('uncaughtException', (error) => {\n console.error('Uncaught exception:', error);\n safeCleanup();\n });\n process.once('unhandledRejection', (reason) => {\n console.error('Unhandled rejection:', reason);\n safeCleanup();\n });\n }\n }\n}\n\n/**\n * Helper decorator for auto-registering disposable classes\n */\nexport function autoDispose<T extends new (...args: any[]) => Disposable>(\n constructor: T\n) {\n return class extends constructor {\n constructor(...args: any[]) {\n super(...args);\n ResourceManager.register(this);\n }\n\n dispose(): void {\n ResourceManager.unregister(this);\n super.dispose();\n }\n };\n}\n\n/**\n * Utility for creating disposable resources with automatic cleanup\n */\nexport function createDisposable<T>(\n resource: T,\n disposeFn: (resource: T) => void\n): Disposable & { resource: T } {\n const disposable = {\n resource,\n dispose(): void {\n try {\n disposeFn(resource);\n } catch (error) {\n console.warn('Error in dispose function:', error);\n }\n }\n };\n\n ResourceManager.register(disposable);\n return disposable;\n}","/**\n * Safe utility functions for preventing runtime errors\n * Provides bounds checking, error recovery, and safe operations\n */\n\n/**\n * Safe division that prevents division by zero and handles edge cases\n */\nexport function safeDivide(a: number, b: number, defaultValue = 0): number {\n if (b === 0 || !isFinite(b) || !isFinite(a)) {\n return defaultValue;\n }\n const result = a / b;\n return isFinite(result) ? result : defaultValue;\n}\n\n/**\n * Safe substring with bounds checking\n */\nexport function safeSubstring(str: string, start: number, end?: number): string {\n if (!str || typeof str !== 'string') return '';\n \n const len = str.length;\n const safeStart = Math.max(0, Math.min(start, len));\n \n if (end === undefined) {\n return str.substring(safeStart);\n }\n \n const safeEnd = Math.max(safeStart, Math.min(end, len));\n return str.substring(safeStart, safeEnd);\n}\n\n/**\n * Safe array access with bounds checking\n */\nexport function safeArrayAccess<T>(array: T[], index: number, defaultValue?: T): T | undefined {\n if (!Array.isArray(array) || index < 0 || index >= array.length) {\n return defaultValue;\n }\n return array[index];\n}\n\n/**\n * Safe number parsing with fallback\n */\nexport function safeParseInt(value: unknown, defaultValue = 0): number {\n if (typeof value === 'number' && isFinite(value)) {\n return Math.floor(value);\n }\n \n if (typeof value === 'string') {\n const parsed = parseInt(value, 10);\n return isFinite(parsed) ? parsed : defaultValue;\n }\n \n return defaultValue;\n}\n\n/**\n * Safe float parsing with fallback\n */\nexport function safeParseFloat(value: unknown, defaultValue = 0): number {\n if (typeof value === 'number' && isFinite(value)) {\n return value;\n }\n \n if (typeof value === 'string') {\n const parsed = parseFloat(value);\n return isFinite(parsed) ? parsed : defaultValue;\n }\n \n return defaultValue;\n}\n\n/**\n * Safe execution wrapper with error recovery\n */\nexport function safeExecute<T>(\n operation: () => T,\n fallback: T,\n errorHandler?: (error: Error) => void\n): T {\n try {\n return operation();\n } catch (error) {\n if (errorHandler) {\n try {\n errorHandler(error as Error);\n } catch (handlerError) {\n // Ignore handler errors to prevent cascading failures\n }\n }\n return fallback;\n }\n}\n\n/**\n * Safe async execution wrapper\n */\nexport async function safeExecuteAsync<T>(\n operation: () => Promise<T>,\n fallback: T,\n errorHandler?: (error: Error) => void\n): Promise<T> {\n try {\n return await operation();\n } catch (error) {\n if (errorHandler) {\n try {\n errorHandler(error as Error);\n } catch (handlerError) {\n // Ignore handler errors\n }\n }\n return fallback;\n }\n}\n\n/**\n * Clamp number to range\n */\nexport function clamp(value: number, min: number, max: number): number {\n if (!isFinite(value)) return min;\n return Math.max(min, Math.min(max, value));\n}\n\n/**\n * Safe object property access\n */\nexport function safeGet<T>(\n obj: any,\n path: string | string[],\n defaultValue?: T\n): T | undefined {\n if (!obj || typeof obj !== 'object') {\n return defaultValue;\n }\n\n const keys = Array.isArray(path) ? path : path.split('.');\n let current = obj;\n\n for (const key of keys) {\n if (current == null || typeof current !== 'object' || !(key in current)) {\n return defaultValue;\n }\n current = current[key];\n }\n\n return current;\n}\n\n/**\n * Debounce function to prevent excessive calls\n */\nexport function debounce<T extends (...args: any[]) => any>(\n func: T,\n delay: number\n): (...args: Parameters<T>) => void {\n let timeoutId: NodeJS.Timeout | undefined;\n \n return (...args: Parameters<T>) => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n \n timeoutId = setTimeout(() => {\n func(...args);\n }, delay);\n };\n}\n\n/**\n * Throttle function to limit call frequency\n */\nexport function throttle<T extends (...args: any[]) => any>(\n func: T,\n delay: number\n): (...args: Parameters<T>) => void {\n let lastCall = 0;\n \n return (...args: Parameters<T>) => {\n const now = Date.now();\n if (now - lastCall >= delay) {\n lastCall = now;\n func(...args);\n }\n };\n}","/**\n * Global Cursor State Manager\n * Prevents cursor state corruption when multiple components control cursor visibility\n */\n\nimport { hideCursor, showCursor } from './ansi';\nimport { safeExecute } from './safe-utils';\n\nexport class CursorManager {\n private static instance: CursorManager;\n private hiddenBy = new Set<string>();\n private isHidden = false;\n\n static getInstance(): CursorManager {\n if (!this.instance) {\n this.instance = new CursorManager();\n }\n return this.instance;\n }\n\n /**\n * Hide cursor with reference tracking\n */\n hide(componentId: string): void {\n this.hiddenBy.add(componentId);\n \n if (!this.isHidden) {\n safeExecute(() => {\n if (typeof process !== 'undefined' && process.stdout) {\n process.stdout.write(hideCursor());\n this.isHidden = true;\n }\n }, undefined);\n }\n }\n\n /**\n * Show cursor only when no components need it hidden\n */\n show(componentId: string): void {\n this.hiddenBy.delete(componentId);\n \n // Only show cursor if no other components need it hidden\n if (this.hiddenBy.size === 0 && this.isHidden) {\n safeExecute(() => {\n if (typeof process !== 'undefined' && process.stdout) {\n process.stdout.write(showCursor());\n this.isHidden = false;\n }\n }, undefined);\n }\n }\n\n /**\n * Force show cursor (emergency cleanup)\n */\n forceShow(): void {\n this.hiddenBy.clear();\n if (this.isHidden) {\n safeExecute(() => {\n if (typeof process !== 'undefined' && process.stdout) {\n process.stdout.write(showCursor());\n this.isHidden = false;\n }\n }, undefined);\n }\n }\n\n /**\n * Get current cursor state\n */\n get isCurrentlyHidden(): boolean {\n return this.isHidden;\n }\n\n /**\n * Get list of components that have hidden the cursor\n */\n get hiddenByComponents(): string[] {\n return Array.from(this.hiddenBy);\n }\n}\n\n// Export singleton instance\nexport const cursorManager = CursorManager.getInstance();","import { eraseLine } from '../core/ansi';\nimport { Style } from '../styles/style';\nimport { ResourceManager, Disposable } from '../core/resource-manager';\nimport { cursorManager } from '../core/cursor-manager';\nimport { safeExecute } from '../core/safe-utils';\nimport { InputValidator } from '../core/validators';\nimport { AnimationError, ErrorCode } from '../core/errors';\n\nexport type AnimationType = 'blink' | 'pulse' | 'slide' | 'typewriter' | 'fade';\n\nexport interface AnimationOptions {\n duration?: number;\n interval?: number;\n iterations?: number;\n onComplete?: () => void;\n}\n\nexport class Animation implements Disposable {\n private intervalId?: NodeJS.Timeout;\n private running = false;\n private isDisposed = false;\n private componentId: string;\n private frameCount = 0;\n private startTime = 0;\n private pausedFrame = 0;\n private pausedIteration = 0;\n\n constructor(\n private text: string,\n private type: AnimationType,\n private options: AnimationOptions = {}\n ) {\n // Validate text input\n const textValidation = InputValidator.validateText(text);\n if (!textValidation.valid) {\n throw new AnimationError(\n textValidation.error!,\n ErrorCode.INVALID_TEXT_INPUT,\n { text }\n );\n }\n this.text = textValidation.value!.text;\n \n // Validate animation options\n if (options.duration !== undefined) {\n const durationValidation = InputValidator.validatePositiveNumber(options.duration, 'duration');\n if (!durationValidation.valid) {\n throw new AnimationError(\n durationValidation.error!,\n ErrorCode.INVALID_NUMBER_INPUT,\n { duration: options.duration }\n );\n }\n }\n \n if (options.interval !== undefined) {\n const intervalValidation = InputValidator.validatePositiveNumber(options.interval, 'interval');\n if (!intervalValidation.valid) {\n throw new AnimationError(\n intervalValidation.error!,\n ErrorCode.INVALID_NUMBER_INPUT,\n { interval: options.interval }\n );\n }\n }\n \n if (options.iterations !== undefined && options.iterations !== Infinity) {\n const iterationsValidation = InputValidator.validatePositiveNumber(options.iterations, 'iterations');\n if (!iterationsValidation.valid) {\n throw new AnimationError(\n iterationsValidation.error!,\n ErrorCode.INVALID_NUMBER_INPUT,\n { iterations: options.iterations }\n );\n }\n }\n \n this.options = {\n duration: 1000,\n interval: 100,\n iterations: Infinity,\n ...options\n };\n \n // Generate unique component ID for cursor management\n this.componentId = `animation-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n \n // Register with ResourceManager for automatic cleanup\n ResourceManager.register(this);\n }\n\n start(): void {\n if (this.running || this.isDisposed) return;\n \n // Atomic disposal: Clear any existing interval BEFORE creating new one\n if (this.intervalId) {\n clearInterval(this.intervalId);\n this.intervalId = undefined;\n }\n \n this.running = true;\n \n // Hide cursor using cursor manager\n cursorManager.hide(this.componentId);\n \n // Resume from paused state or start fresh\n let frame = this.pausedFrame || 1;\n let iteration = this.pausedIteration || 0;\n const totalFrames = Math.floor((this.options.duration || 1000) / (this.options.interval || 100));\n \n this.intervalId = setInterval(() => {\n // Double-check disposal state to prevent zombie timers\n if (this.isDisposed || !this.running) {\n this.stop();\n return;\n }\n \n const progress = (frame % totalFrames) / totalFrames;\n \n const success = safeExecute(() => {\n if (typeof process !== 'undefined' && process.stdout) {\n // Use carriage return to go to beginning of current line instead of absolute positioning\n process.stdout.write('\\r' + eraseLine());\n \n switch (this.type) {\n case 'blink':\n this.renderBlink(progress);\n break;\n case 'pulse':\n this.renderPulse(progress);\n break;\n case 'slide':\n this.renderSlide(progress);\n break;\n case 'typewriter':\n this.renderTypewriter(progress);\n break;\n case 'fade':\n this.renderFade(progress);\n break;\n }\n return true;\n }\n return false;\n }, false);\n \n if (!success) {\n this.stop();\n return;\n }\n \n frame++;\n \n if (frame > totalFrames) {\n iteration++;\n frame = 1;\n \n if (this.options.iterations !== Infinity && this.options.iterations !== undefined && iteration >= this.options.iterations) {\n this.stop();\n if (this.options.onComplete) {\n this.options.onComplete();\n }\n }\n }\n \n // Update paused state in case of pause\n this.pausedFrame = frame;\n this.pausedIteration = iteration;\n }, this.options.interval);\n }\n\n stop(): void {\n if (this.intervalId) {\n clearInterval(this.intervalId);\n this.intervalId = undefined;\n }\n this.running = false;\n \n // Reset paused state on stop\n this.pausedFrame = 0;\n this.pausedIteration = 0;\n \n // Show cursor using cursor manager\n if (!this.isDisposed) {\n cursorManager.show(this.componentId);\n }\n }\n \n pause(frame?: number, iteration?: number): void {\n if (this.intervalId) {\n clearInterval(this.intervalId);\n this.intervalId = undefined;\n }\n this.running = false;\n \n // Save current state if provided\n if (frame !== undefined) {\n this.pausedFrame = frame;\n }\n if (iteration !== undefined) {\n this.pausedIteration = iteration;\n }\n }\n \n resume(): void {\n if (!this.running && !this.isDisposed) {\n this.start();\n }\n }\n \n dispose(): void {\n if (this.isDisposed) return;\n this.isDisposed = true;\n \n // Unregister from ResourceManager\n ResourceManager.unregister(this);\n \n // Stop animation\n this.stop();\n \n // Ensure cursor is shown by this component\n cursorManager.show(this.componentId);\n }\n\n private renderBlink(progress: number): void {\n if (progress <= 0.5) {\n process.stdout.write(this.text);\n } else {\n process.stdout.write(' '.repeat(this.text.length));\n }\n }\n\n private renderPulse(progress: number): void {\n const intensity = Math.sin(progress * Math.PI) * 128 + 127;\n const color: [number, number, number] = [intensity, intensity, intensity];\n const styled = new Style().color(color).apply(this.text);\n process.stdout.write(styled);\n }\n\n private renderSlide(progress: number): void {\n const offset = Math.floor(progress * this.text.length);\n const visible = this.text.slice(0, offset) + ' '.repeat(this.text.length - offset);\n process.stdout.write(visible);\n }\n\n private renderTypewriter(progress: number): void {\n const chars = Math.floor(progress * this.text.length);\n const visible = this.text.slice(0, chars);\n process.stdout.write(visible + '█');\n }\n\n private renderFade(progress: number): void {\n const opacity = progress < 0.5 ? progress * 2 : (1 - progress) * 2;\n const intensity = Math.floor(opacity * 255);\n const color: [number, number, number] = [intensity, intensity, intensity];\n const styled = new Style().color(color).apply(this.text);\n process.stdout.write(styled);\n }\n}\n\nexport function animate(\n text: string,\n type: AnimationType,\n options?: AnimationOptions\n): Animation {\n const animation = new Animation(text, type, options);\n animation.start();\n return animation;\n}\n\nexport const spinners = {\n dots: { frames: ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'], interval: 80 },\n dots2: { frames: ['⣾', '⣽', '⣻', '⢿', '⡿', '⣟', '⣯', '⣷'], interval: 80 },\n dots3: { frames: ['⠋', '⠙', '⠚', '⠞', '⠖', '⠦', '⠴', '⠲', '⠳', '⠓'], interval: 80 },\n line: { frames: ['-', '\\\\', '|', '/'], interval: 130 },\n line2: { frames: ['⠂', '-', '–', '—', '–', '-'], interval: 100 },\n pipe: { frames: ['┤', '┘', '┴', '└', '├', '┌', '┬', '┐'], interval: 100 },\n star: { frames: ['✶', '✸', '✹', '✺', '✹', '✷'], interval: 70 },\n toggle: { frames: ['⊶', '⊷'], interval: 250 },\n box: { frames: ['◰', '◳', '◲', '◱'], interval: 120 },\n circle: { frames: ['◐', '◓', '◑', '◒'], interval: 120 },\n arrow: { frames: ['←', '↖', '↑', '↗', '→', '↘', '↓', '↙'], interval: 100 },\n bounce: { frames: ['⠁', '⠂', '⠄', '⠂'], interval: 120 },\n bar: { frames: ['▁', '▃', '▄', '▅', '▆', '▇', '█', '▇', '▆', '▅', '▄', '▃'], interval: 80 },\n earth: { frames: ['🌍', '🌎', '🌏'], interval: 180 },\n moon: { frames: ['🌑', '🌒', '🌓', '🌔', '🌕', '🌖', '🌗', '🌘'], interval: 80 },\n clock: { frames: ['🕐', '🕑', '🕒', '🕓', '🕔', '🕕', '🕖', '🕗', '🕘', '🕙', '🕚', '🕛'], interval: 100 },\n balloon: { frames: [' ', '.', 'o', 'O', '@', '*', ' '], interval: 140 },\n noise: { frames: ['▓', '▒', '░'], interval: 100 },\n boxBounce: { frames: ['▖', '▘', '▝', '▗'], interval: 120 },\n triangle: { frames: ['◢', '◣', '◤', '◥'], interval: 50 },\n binary: { frames: ['010010', '101101', '010010', '101010'], interval: 120 },\n runner: { frames: ['🚶', '🏃'], interval: 140 },\n pong: { frames: ['▐⠂ ▌', '▐⠈ ▌', '▐ ⠂ ▌', '▐ ⠠ ▌', '▐ ⡀ ▌', '▐ ⠠ ▌', '▐ ⠂ ▌', '▐ ⠈ ▌', '▐ ⠂ ▌', '▐ ⠠ ▌', '▐ ⡀ ▌', '▐ ⠠ ▌', '▐ ⠂ ▌', '▐ ⠈ ▌', '▐ ⠂▌', '▐ ⠠▌', '▐ ⡀▌', '▐ ⠠ ▌', '▐ ⠂ ▌', '▐ ⠈ ▌', '▐ ⠂ ▌', '▐ ⠠ ▌', '▐ ⡀ ▌', '▐ ⠠ ▌', '▐ ⠂ ▌', '▐ ⠈ ▌', '▐ ⠂ ▌', '▐ ⠠ ▌', '▐ ⡀ ▌', '▐⠠ ▌'], interval: 80 },\n shark: { frames: ['▐|\\\\____________▌', '▐_|\\\\___________▌', '▐__|\\\\__________▌', '▐___|\\\\_________▌', '▐____|\\\\________▌', '▐_____|\\\\_______▌', '▐______|\\\\______▌', '▐_______|\\\\_____▌', '▐________|\\\\____▌', '▐_________|\\\\___▌', '▐__________|\\\\__▌', '▐___________|\\\\_▌', '▐____________|\\\\▌', '▐____________/|▌', '▐___________/|_▌', '▐__________/|__▌', '▐_________/|___▌', '▐________/|____▌', '▐_______/|_____▌', '▐______/|______▌', '▐_____/|_______▌', '▐____/|________▌', '▐___/|_________▌', '▐__/|__________▌', '▐_/|___________▌', '▐/|____________▌'], interval: 120 },\n dqpb: { frames: ['d', 'q', 'p', 'b'], interval: 100 },\n weather: { frames: ['☀️ ', '⛅ ', '🌤 ', '⛈ ', '🌧 ', '🌦 ', '☀️ '], interval: 100 },\n christmas: { frames: ['🌲', '🎄'], interval: 400 }\n} as const;\n\nexport type SpinnerName = keyof typeof spinners;\n\nexport class Spinner implements Disposable {\n private frames: string[];\n private currentFrame = 0;\n private intervalId?: NodeJS.Timeout;\n private running = false;\n private interval: number;\n private isDisposed = false;\n private componentId: string;\n\n constructor(\n private text: string,\n spinnerOrOptions?: SpinnerName | { spinner?: SpinnerName | string; color?: string; interval?: number },\n interval?: number\n ) {\n // Validate text input\n const textValidation = InputValidator.validateText(text);\n if (!textValidation.valid) {\n throw new AnimationError(\n textValidation.error!,\n ErrorCode.INVALID_TEXT_INPUT,\n { text }\n );\n }\n this.text = textValidation.value!.text;\n \n let spinnerName: SpinnerName = 'dots';\n let finalInterval = 80;\n\n if (typeof spinnerOrOptions === 'string') {\n spinnerName = spinnerOrOptions;\n finalInterval = interval ?? spinners[spinnerName]?.interval ?? 80;\n } else if (spinnerOrOptions && typeof spinnerOrOptions === 'object') {\n spinnerName = (spinnerOrOptions.spinner as SpinnerName) ?? 'dots';\n finalInterval = spinnerOrOptions.interval ?? spinners[spinnerName]?.interval ?? 80;\n }\n \n // Validate interval\n if (finalInterval) {\n const intervalValidation = InputValidator.validatePositiveNumber(finalInterval, 'interval');\n if (!intervalValidation.valid) {\n throw new AnimationError(\n intervalValidation.error!,\n ErrorCode.INVALID_NUMBER_INPUT,\n { interval: finalInterval }\n );\n }\n }\n\n // Handle invalid spinner names gracefully\n const spinner = spinners[spinnerName];\n if (spinner) {\n this.frames = [...spinner.frames];\n this.interval = finalInterval;\n } else {\n // Fallback to dots if spinner not found\n this.frames = [...spinners.dots.frames];\n this.interval = finalInterval;\n }\n \n // Generate unique component ID for cursor management\n this.componentId = `spinner-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n \n // Register with ResourceManager for automatic cleanup\n ResourceManager.register(this);\n }\n\n start(): void {\n if (this.running || this.isDisposed) return;\n \n // Clear any existing interval\n if (this.intervalId) {\n clearInterval(this.intervalId);\n }\n \n this.running = true;\n \n // Hide cursor using cursor manager\n cursorManager.hide(this.componentId);\n \n this.intervalId = setInterval(() => {\n if (this.isDisposed) {\n this.stop();\n return;\n }\n \n const success = safeExecute(() => {\n if (typeof process !== 'undefined' && process.stdout) {\n const frame = this.frames[this.currentFrame];\n process.stdout.write(`\\r${frame} ${this.text}`);\n this.currentFrame = (this.currentFrame + 1) % this.frames.length;\n return true;\n }\n return false;\n }, false);\n \n if (!success) {\n this.stop();\n }\n }, this.interval);\n }\n\n stop(finalText?: string): void {\n if (this.intervalId) {\n clearInterval(this.intervalId);\n this.intervalId = undefined;\n }\n this.running = false;\n \n if (!this.isDisposed) {\n safeExecute(() => {\n if (typeof process !== 'undefined' && process.stdout) {\n process.stdout.write('\\r' + eraseLine());\n if (finalText) {\n process.stdout.write(finalText);\n }\n process.stdout.write('\\n');\n }\n // Show cursor using cursor manager\n cursorManager.show(this.componentId);\n }, undefined);\n }\n }\n\n update(text: string): void {\n this.text = text;\n }\n\n updateColor(_color: string): void {\n // Store color for future use - this is a placeholder for color functionality\n }\n\n succeed(text?: string): void {\n this.stop(`✓ ${text || this.text}`);\n }\n\n fail(text?: string): void {\n this.stop(`✗ ${text || this.text}`);\n }\n\n warn(text?: string): void {\n this.stop(`⚠ ${text || this.text}`);\n }\n\n info(text?: string): void {\n this.stop(`ℹ ${text || this.text}`);\n }\n\n clear(): void {\n if (this.intervalId) {\n clearInterval(this.intervalId);\n this.intervalId = undefined;\n }\n this.running = false;\n \n if (!this.isDisposed) {\n safeExecute(() => {\n if (typeof process !== 'undefined' && process.stdout) {\n process.stdout.write('\\r' + eraseLine());\n }\n // Show cursor using cursor manager\n cursorManager.show(this.componentId);\n }, undefined);\n }\n }\n \n dispose(): void {\n if (this.isDisposed) return;\n this.isDisposed = true;\n \n // Ensure interval is cleared first\n if (this.intervalId) {\n clearInterval(this.intervalId);\n this.intervalId = undefined;\n }\n \n // Unregister from ResourceManager\n ResourceManager.unregister(this);\n \n // Clear animation\n this.clear();\n \n // Ensure cursor is shown by this component\n cursorManager.show(this.componentId);\n }\n}\n\nexport function spinner(\n text: string, \n options?: SpinnerName | { spinner?: SpinnerName; color?: string; interval?: number }\n): Spinner {\n const s = new Spinner(text, options);\n s.start();\n return s;\n}\n\n// Add pulse animation function for backward compatibility\nexport function pulse(text: string, options: { color?: string; duration?: number } = {}): string[] {\n const frames: string[] = [];\n const totalFrames = Math.floor((options.duration || 1000) / 100); // 100ms per frame\n \n for (let i = 0; i < totalFrames; i++) {\n let styledText = text;\n if (options.color) {\n const style = new Style([], [], { force: true });\n styledText = style.color(options.color).apply(text);\n }\n \n frames.push(styledText);\n }\n \n return frames;\n}","import { Style } from '../styles/style';\nimport { stripAnsi } from '../core/ansi';\n\nexport type BoxStyle = 'single' | 'double' | 'round' | 'bold' | 'ascii';\n\nexport interface BoxOptions {\n padding?: number | { top?: number; right?: number; bottom?: number; left?: number };\n margin?: number | { top?: number; right?: number; bottom?: number; left?: number };\n borderStyle?: BoxStyle;\n borderColor?: string | [number, number, number];\n backgroundColor?: string | [number, number, number];\n align?: 'left' | 'center' | 'right';\n title?: string;\n titleAlignment?: 'left' | 'center' | 'right';\n width?: number;\n wrap?: boolean;\n}\n\nconst boxStyles = {\n single: {\n topLeft: '┌',\n topRight: '┐',\n bottomLeft: '└',\n bottomRight: '┘',\n horizontal: '─',\n vertical: '│'\n },\n double: {\n topLeft: '╔',\n topRight: '╗',\n bottomLeft: '╚',\n bottomRight: '╝',\n horizontal: '═',\n vertical: '║'\n },\n round: {\n topLeft: '╭',\n topRight: '╮',\n bottomLeft: '╰',\n bottomRight: '╯',\n horizontal: '─',\n vertical: '│'\n },\n bold: {\n topLeft: '┏',\n topRight: '┓',\n bottomLeft: '┗',\n bottomRight: '┛',\n horizontal: '━',\n vertical: '┃'\n },\n ascii: {\n topLeft: '+',\n topRight: '+',\n bottomLeft: '+',\n bottomRight: '+',\n horizontal: '-',\n vertical: '|'\n }\n} as const;\n\nfunction getPadding(padding: BoxOptions['padding']): { top: number; right: number; bottom: number; left: number } {\n if (typeof padding === 'number') {\n return { top: padding, right: padding, bottom: padding, left: padding };\n }\n return {\n top: padding?.top ?? 0,\n right: padding?.right ?? 0,\n bottom: padding?.bottom ?? 0,\n left: padding?.left ?? 0\n };\n}\n\nfunction wrapText(text: string, width: number): string[] {\n const lines: string[] = [];\n const words = text.split(' ');\n let currentLine = '';\n\n for (const word of words) {\n const testLine = currentLine ? `${currentLine} ${word}` : word;\n if (stripAnsi(testLine).length <= width) {\n currentLine = testLine;\n } else {\n if (currentLine) lines.push(currentLine);\n currentLine = word;\n }\n }\n \n if (currentLine) lines.push(currentLine);\n return lines;\n}\n\nfunction alignText(text: string, width: number, align: 'left' | 'center' | 'right'): string {\n const textLength = stripAnsi(text).length;\n const totalPadding = width - textLength;\n \n if (totalPadding <= 0) return text;\n \n switch (align) {\n case 'center': {\n const leftPad = Math.floor(totalPadding / 2);\n const rightPad = totalPadding - leftPad;\n return ' '.repeat(leftPad) + text + ' '.repeat(rightPad);\n }\n case 'right': {\n return ' '.repeat(totalPadding) + text;\n }\n default:\n return text + ' '.repeat(totalPadding);\n }\n}\n\nexport function box(content: string, options: BoxOptions = {}): string {\n const {\n padding = 0,\n margin = 0,\n borderStyle = 'single',\n borderColor,\n backgroundColor,\n align = 'left',\n title,\n titleAlignment = 'center',\n width,\n wrap = true\n } = options;\n\n const style = boxStyles[borderStyle];\n const pad = getPadding(padding);\n const mar = getPadding(margin);\n \n let lines = content.split('\\n');\n \n if (width && wrap) {\n lines = lines.flatMap(line => wrapText(line, width - pad.left - pad.right - 2));\n }\n \n const maxLineLength = Math.max(\n ...lines.map(line => stripAnsi(line).length),\n 0\n );\n \n // Calculate minimum width needed for the title (including spacing)\n let titleWidth = 0;\n if (title) {\n const titleLen = stripAnsi(title).length;\n if (titleLen > maxLineLength) {\n // When title is longer than content, ensure at least 3 chars padding on each side\n titleWidth = titleLen + 8; // 8 for \"─── title ───\"\n } else {\n titleWidth = titleLen + 4; // 4 for \"─ title ─\"\n }\n }\n \n // Content width should accommodate both content and title\n const minContentWidth = Math.max(maxLineLength + pad.left + pad.right, titleWidth);\n \n const contentWidth = width ? Math.max(width - 2, titleWidth) : minContentWidth;\n \n const paddedLines = lines.map(line => {\n const aligned = alignText(line, contentWidth - pad.left - pad.right, align);\n return ' '.repeat(pad.left) + aligned + ' '.repeat(pad.right);\n });\n \n for (let i = 0; i < pad.top; i++) {\n paddedLines.unshift(' '.repeat(contentWidth));\n }\n \n for (let i = 0; i < pad.bottom; i++) {\n paddedLines.push(' '.repeat(contentWidth));\n }\n \n let borderStyle_ = new Style();\n if (borderColor) {\n borderStyle_ = typeof borderColor === 'string' \n ? borderStyle_.color(borderColor)\n : borderStyle_.color(borderColor);\n }\n \n let topBorder = style.topLeft + style.horizontal.repeat(contentWidth) + style.topRight;\n \n if (title) {\n const titleLength = stripAnsi(title).length;\n const availableSpace = contentWidth - titleLength - 2; // -2 for the spaces around title\n \n let leftPadding: string, rightPadding: string;\n \n switch (titleAlignment) {\n case 'center': {\n const leftSpaces = Math.ceil(availableSpace / 2);\n const rightSpaces = availableSpace - leftSpaces;\n leftPadding = style.horizontal.repeat(leftSpaces) + ' ';\n rightPadding = ' ' + style.horizontal.repeat(rightSpaces);\n break;\n }\n case 'left': {\n leftPadding = ' ';\n rightPadding = ' ' + style.horizontal.repeat(availableSpace);\n break;\n }\n case 'right': {\n leftPadding = style.horizontal.repeat(availableSpace) + ' ';\n rightPadding = ' ';\n break;\n }\n default: {\n const defaultLeftSpaces = Math.floor(availableSpace / 2);\n const defaultRightSpaces = availableSpace - defaultLeftSpaces;\n leftPadding = style.horizontal.repeat(defaultLeftSpaces) + ' ';\n rightPadding = ' ' + style.horizontal.repeat(defaultRightSpaces);\n }\n }\n \n topBorder = style.topLeft + leftPadding + title + rightPadding + style.topRight;\n }\n \n const bottomBorder = style.bottomLeft + style.horizontal.repeat(contentWidth) + style.bottomRight;\n \n const boxLines: string[] = [];\n \n boxLines.push(borderStyle_.apply(topBorder));\n \n paddedLines.forEach(line => {\n let fullLine = borderStyle_.apply(style.vertical) + line + borderStyle_.apply(style.vertical);\n \n if (backgroundColor) {\n const bgStyle = typeof backgroundColor === 'string'\n ? new Style().bgColor(backgroundColor)\n : new Style().bgColor(backgroundColor);\n fullLine = bgStyle.apply(fullLine);\n }\n \n boxLines.push(fullLine);\n });\n \n boxLines.push(borderStyle_.apply(bottomBorder));\n \n if (mar.top > 0) {\n for (let i = 0; i < mar.top; i++) {\n boxLines.unshift('');\n }\n }\n \n if (mar.bottom > 0) {\n for (let i = 0; i < mar.bottom; i++) {\n boxLines.push('');\n }\n }\n \n return boxLines.map(line => {\n if (mar.left > 0 && line !== '') {\n return ' '.repeat(mar.left) + line;\n }\n return line;\n }).join('\\n');\n}\n\n// Add create alias for backward compatibility\nexport const create = box;\n\n// Export default for CommonJS compatibility\nexport default Object.assign(box, {\n box,\n create\n});","import { eraseLine } from '../core/ansi';\nimport { Style } from '../styles/style';\nimport { ResourceManager, Disposable } from '../core/resource-manager';\nimport { cursorManager } from '../core/cursor-manager';\nimport { safeExecute, safeDivide } from '../core/safe-utils';\nimport { InputValidator } from '../core/validators';\nimport { ValidationError, ConfigurationError, ErrorCode } from '../core/errors';\n\nexport interface ProgressBarOptions {\n total?: number;\n width?: number;\n complete?: string;\n incomplete?: string;\n head?: string;\n clear?: boolean;\n renderThrottle?: number;\n format?: string;\n stream?: NodeJS.WriteStream;\n barColor?: string | [number, number, number];\n completeColor?: string | [number, number, number];\n}\n\nexport class ProgressBar implements Disposable {\n private current = 0;\n private startTime = Date.now();\n private lastRender = 0;\n private options: Required<ProgressBarOptions>;\n private isDisposed = false;\n private componentId: string;\n\n constructor(options: ProgressBarOptions = {}) {\n // Validate options\n if (options.total !== undefined) {\n if (typeof options.total !== 'number' || !Number.isFinite(options.total) || options.total < 0) {\n throw new ConfigurationError(\n 'total must be a non-negative number',\n ErrorCode.CONFIG_INVALID_OPTION,\n { option: 'total', value: options.total }\n );\n }\n }\n \n if (options.width !== undefined) {\n const validation = InputValidator.validatePositiveNumber(options.width, 'width');\n if (!validation.valid) {\n throw new ConfigurationError(\n validation.error!,\n ErrorCode.CONFIG_INVALID_OPTION,\n { option: 'width', value: options.width }\n );\n }\n }\n \n if (options.renderThrottle !== undefined) {\n const validation = InputValidator.validatePositiveNumber(options.renderThrottle, 'renderThrottle');\n if (!validation.valid) {\n throw new ConfigurationError(\n validation.error!,\n ErrorCode.CONFIG_INVALID_OPTION,\n { option: 'renderThrottle', value: options.renderThrottle }\n );\n }\n }\n \n if (options.barColor !== undefined) {\n const validation = InputValidator.validateColor(options.barColor);\n if (!validation.valid) {\n throw new ConfigurationError(\n validation.error!,\n ErrorCode.INVALID_COLOR_INPUT,\n { option: 'barColor', value: options.barColor }\n );\n }\n }\n \n if (options.completeColor !== undefined) {\n const validation = InputValidator.validateColor(options.completeColor);\n if (!validation.valid) {\n throw new ConfigurationError(\n validation.error!,\n ErrorCode.INVALID_COLOR_INPUT,\n { option: 'completeColor', value: options.completeColor }\n );\n }\n }\n \n this.options = {\n total: 100,\n width: 40,\n complete: '█',\n incomplete: '░',\n head: '',\n clear: false,\n renderThrottle: 16,\n format: ':bar :percent :etas',\n stream: process.stdout,\n barColor: '',\n completeColor: '',\n ...options\n };\n \n // Generate unique component ID for cursor management\n this.componentId = `progress-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n \n // Register with ResourceManager for automatic cleanup\n ResourceManager.register(this);\n }\n\n tick(delta = 1, tokens?: Record<string, string>): void {\n if (this.isDisposed) return;\n \n // Validate delta\n if (typeof delta !== 'number' || !Number.isFinite(delta)) {\n throw new ValidationError(\n 'Delta must be a finite number',\n ErrorCode.INVALID_NUMBER_INPUT,\n { delta }\n );\n }\n \n const oldCurrent = this.current;\n this.current = Math.min(this.current + delta, this.options.total);\n this.render(tokens, oldCurrent !== this.current);\n }\n\n update(current: number, tokens?: Record<string, string>): void {\n if (this.isDisposed) return;\n \n // Validate current value\n if (typeof current !== 'number' || !Number.isFinite(current)) {\n throw new ValidationError(\n 'Current value must be a finite number',\n ErrorCode.INVALID_NUMBER_INPUT,\n { current }\n );\n }\n \n this.current = Math.max(0, Math.min(current, this.options.total));\n this.render(tokens);\n }\n\n private render(tokens?: Record<string, string>, forceRender = false): void {\n if (this.isDisposed) return;\n \n const now = Date.now();\n if (!forceRender && this.options.renderThrottle > 0 && now - this.lastRender < this.options.renderThrottle && this.current < this.options.total) {\n return;\n }\n this.lastRender = now;\n\n // Ensure percent is between 0 and 1\n const rawPercent = safeDivide(this.current, this.options.total);\n const percent = Math.max(0, Math.min(1, rawPercent));\n \n const filledLength = Math.max(0, Math.floor(this.options.width * percent));\n const emptyLength = Math.max(0, this.options.width - filledLength);\n\n let filled = this.options.complete.repeat(Math.max(0, filledLength));\n const empty = this.options.incomplete.repeat(Math.max(0, emptyLength));\n\n if (this.options.head && filledLength > 0 && filledLength < this.options.width) {\n filled = filled.slice(0, -1) + this.options.head;\n }\n\n if (this.options.barColor) {\n const style = new Style();\n filled = typeof this.options.barColor === 'string'\n ? style.color(this.options.barColor).apply(filled)\n : style.color(this.options.barColor).apply(filled);\n }\n\n const bar = filled + empty;\n const elapsed = (now - this.startTime) / 1000;\n const eta = percent > 0 ? (elapsed / percent - elapsed) : 0;\n\n let output = this.options.format\n .replace(':bar', bar)\n .replace(':percent', `${Math.floor(percent * 100)}%`)\n .replace(':current', String(this.current))\n .replace(':total', String(this.options.total))\n .replace(':elapsed', this.formatTime(elapsed))\n .replace(':etas', eta > 0 ? this.formatTime(eta) : '')\n .replace(':eta', this.formatTime(eta));\n\n if (tokens) {\n Object.entries(tokens).forEach(([key, value]) => {\n output = output.replace(`:${key}`, value);\n });\n }\n\n if (this.options.completeColor && percent === 1) {\n const style = new Style();\n output = typeof this.options.completeColor === 'string'\n ? style.color(this.options.completeColor).apply(output)\n : style.color(this.options.completeColor).apply(output);\n }\n\n safeExecute(() => {\n // Hide cursor on first render using cursor manager\n cursorManager.hide(this.componentId);\n \n this.options.stream.write('\\r' + eraseLine() + output);\n }, undefined, () => {\n // Handle stream errors gracefully\n this.dispose();\n });\n }\n\n\n private formatTime(seconds: number): string {\n if (!isFinite(seconds) || seconds < 0) return '0:00';\n \n const hours = Math.floor(seconds / 3600);\n const minutes = Math.floor((seconds % 3600) / 60);\n const secs = Math.floor(seconds % 60);\n\n if (hours > 0) {\n return `${hours}:${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;\n }\n return `${minutes}:${secs.toString().padStart(2, '0')}`;\n }\n\n complete(): void {\n if (this.isDisposed) return;\n \n this.current = this.options.total;\n this.render();\n \n try {\n this.options.stream.write('\\n');\n \n // Show cursor using cursor manager\n cursorManager.show(this.componentId);\n \n if (this.options.clear) {\n this.options.stream.write('\\r' + eraseLine());\n }\n } catch (error) {\n // Ignore stream errors during completion\n }\n \n this.dispose();\n }\n\n getRenderString(): string {\n const percent = safeDivide(this.current, this.options.total);\n const filledLength = Math.max(0, Math.floor(this.options.width * percent));\n const emptyLength = Math.max(0, this.options.width - filledLength);\n\n let filled = this.options.complete.repeat(filledLength);\n const empty = this.options.incomplete.repeat(emptyLength);\n\n if (this.options.head && filledLength > 0 && filledLength < this.options.width) {\n filled = filled.slice(0, -1) + this.options.head;\n }\n\n const bar = filled + empty;\n const elapsed = (Date.now() - this.startTime) / 1000;\n const eta = percent > 0 ? (elapsed / percent - elapsed) : 0;\n\n return this.options.format\n .replace(':bar', bar)\n .replace(':percent', `${Math.floor(percent * 100)}%`)\n .replace(':current', String(this.current))\n .replace(':total', String(this.options.total))\n .replace(':elapsed', this.formatTime(elapsed))\n .replace(':etas', eta > 0 ? this.formatTime(eta) : '')\n .replace(':eta', this.formatTime(eta));\n }\n \n dispose(): void {\n if (this.isDisposed) return;\n this.isDisposed = true;\n \n // Unregister from ResourceManager\n ResourceManager.unregister(this);\n \n // Show cursor using cursor manager\n cursorManager.show(this.componentId);\n }\n}\n\nexport interface MultiProgressOptions {\n total?: number;\n width?: number;\n complete?: string;\n incomplete?: string;\n stream?: NodeJS.WriteStream;\n}\n\nexport class MultiProgress implements Disposable {\n private bars: ProgressBar[] = [];\n private options: Required<MultiProgressOptions>;\n private isDisposed = false;\n\n constructor(options: MultiProgressOptions = {}) {\n this.options = {\n total: 100,\n width: 40,\n complete: '█',\n incomplete: '░',\n stream: process.stdout,\n ...options\n };\n \n // Register with ResourceManager for automatic cleanup\n ResourceManager.register(this);\n }\n\n newBar(format: string, options?: ProgressBarOptions): ProgressBar {\n if (this.isDisposed) {\n throw new Error('MultiProgress has been disposed');\n }\n \n const bar = new ProgressBar({\n format,\n ...this.options,\n ...options,\n stream: this.options.stream\n });\n \n this.bars.push(bar);\n return bar;\n }\n\n render(): void {\n if (this.isDisposed) return;\n \n safeExecute(() => {\n // Move cursor up to overwrite previous bars\n if (this.bars.length > 0) {\n // Use relative cursor movement instead of absolute positioning\n for (let i = 0; i < this.bars.length; i++) {\n this.options.stream.write('\\u001b[1A'); // Move up one line\n }\n }\n\n // Render each bar\n this.bars.forEach((bar, index) => {\n this.options.stream.write('\\r' + eraseLine() + bar.getRenderString());\n if (index < this.bars.length - 1) {\n this.options.stream.write('\\n');\n }\n });\n }, undefined, () => {\n // Handle stream errors\n this.dispose();\n });\n }\n\n update(): void {\n this.render();\n }\n \n dispose(): void {\n if (this.isDisposed) return;\n this.isDisposed = true;\n \n // Unregister from ResourceManager\n ResourceManager.unregister(this);\n \n // Dispose all bars safely\n const barsToDispose = [...this.bars];\n this.bars = [];\n \n barsToDispose.forEach(bar => {\n try {\n bar.dispose();\n } catch (error) {\n console.warn('Error disposing progress bar:', error);\n }\n });\n }\n}\n\nexport function progressBar(options?: ProgressBarOptions): ProgressBar {\n return new ProgressBar(options);\n}\n\nexport function multiProgress(options?: MultiProgressOptions): MultiProgress {\n return new MultiProgress(options);\n}\n\n// Add bar method for backward compatibility\nexport function bar(current: number, total: number, options?: ProgressBarOptions): string {\n const barOptions = { ...options, total };\n \n // Create the bar string\n const percent = total > 0 ? current / total : 0;\n const width = barOptions.width || 40;\n const filledLength = Math.max(0, Math.min(width, Math.floor(width * percent)));\n const emptyLength = Math.max(0, width - filledLength);\n \n const complete = barOptions.complete || '█';\n const incomplete = barOptions.incomplete || '░';\n \n return complete.repeat(filledLength) + incomplete.repeat(emptyLength);\n}","import { Style } from './styles/style';\nimport { Formatter, FormatterProxy } from './formatter';\n\nexport type TemplateFunction = (strings: TemplateStringsArray, ...values: any[]) => string;\n\nexport interface TemplateHelpers {\n [key: string]: Style | TemplateFunction;\n}\n\nfunction parseStyleTags(text: string, helpers: TemplateHelpers): string {\n // Parse from inside out to handle nesting\n let result = text;\n let changed = true;\n \n while (changed) {\n changed = false;\n const tagRegex = /\\{([^}]+)\\}([^{]*?)\\{\\/\\1\\}/g;\n \n result = result.replace(tagRegex, (fullMatch, tagName, content) => {\n const helper = helpers[tagName];\n \n if (helper instanceof Style) {\n changed = true;\n return helper.apply(content);\n } else if (typeof helper === 'function') {\n changed = true;\n return helper([content] as any);\n }\n \n return fullMatch;\n });\n }\n\n return result;\n}\n\nfunction parseInlineStyles(text: string, formatter: FormatterProxy): string {\n // Match patterns like ${red`text`} or ${red.bold`text`}\n const inlineRegex = /\\$\\{([^}]+)`([^`]*)`\\}/g;\n \n return text.replace(inlineRegex, (fullMatch, stylePath, content) => {\n try {\n const styles = stylePath.split('.');\n \n let currentStyle: any = formatter;\n for (const style of styles) {\n if (currentStyle && typeof currentStyle === 'object' && style in currentStyle) {\n currentStyle = currentStyle[style];\n } else if (currentStyle && typeof currentStyle === 'function') {\n // Try to access property via proxy getter\n currentStyle = currentStyle[style];\n } else {\n return fullMatch; // Return unchanged if style not found\n }\n }\n \n // If we have a valid style function, apply it\n if (typeof currentStyle === 'function') {\n return currentStyle(content);\n }\n \n // If it's a Style object with apply method, use that\n if (currentStyle && typeof currentStyle === 'object' && 'apply' in currentStyle && typeof currentStyle.apply === 'function') {\n return currentStyle.apply(content);\n }\n \n return fullMatch;\n } catch (error) {\n return fullMatch; // Return unchanged on error\n }\n });\n}\n\nexport function createTemplate(formatter: FormatterProxy, helpers: TemplateHelpers = {}): TemplateFunction {\n // Always include default helpers, but allow overrides\n const allHelpers = {\n ...createDefaultHelpers(),\n ...helpers\n };\n return (strings: TemplateStringsArray, ...values: any[]): string => {\n let result = '';\n const mutableStrings = [...strings]; // Create mutable copy\n \n // First, combine template strings and values\n mutableStrings.forEach((str, i) => {\n result += str;\n if (i < values.length) {\n const value = values[i];\n \n // Handle Style objects with apply method differently\n if (value && typeof value === 'object' && 'apply' in value && typeof value.apply === 'function') {\n // Check if the next string starts with a backtick (template literal)\n const nextStr = mutableStrings[i + 1] || '';\n const backtickMatch = nextStr.match(/^`([^`]*)`(.*)/);\n if (backtickMatch) {\n // Apply the style to the content and update the next string\n result += value.apply(backtickMatch[1]);\n mutableStrings[i + 1] = backtickMatch[2];\n return;\n }\n }\n \n result += String(value);\n }\n });\n \n // Then parse inline styles and tags\n result = parseInlineStyles(result, formatter);\n result = parseStyleTags(result, allHelpers);\n \n return result;\n };\n}\n\nexport function createTemplateTag(options: { formatter?: FormatterProxy; helpers?: TemplateHelpers } = {}): TemplateFunction {\n const formatter = options.formatter || Formatter.create({ force: true }); // Force colors for template tags\n const helpers = {\n ...createDefaultHelpers(),\n ...options.helpers\n };\n \n return createTemplate(formatter, helpers);\n}\n\n// Add parse function for backward compatibility\nexport function parse(template: string, variables: Record<string, any> = {}): string {\n const helpers = createDefaultHelpers();\n \n // Replace variables first\n let result = template;\n Object.entries(variables).forEach(([key, value]) => {\n const regex = new RegExp(`{{${key}}}`, 'g');\n result = result.replace(regex, String(value));\n });\n \n // Then parse style tags\n return parseStyleTags(result, helpers);\n}\n\nfunction createDefaultHelpers(): TemplateHelpers {\n const style = new Style([], [], { force: true });\n \n return {\n bold: style.bold,\n dim: style.dim,\n italic: style.italic,\n underline: style.underline,\n inverse: style.inverse,\n hidden: style.hidden,\n strikethrough: style.strikethrough,\n \n black: style.black,\n red: style.red,\n green: style.green,\n yellow: style.yellow,\n blue: style.blue,\n magenta: style.magenta,\n cyan: style.cyan,\n white: style.white,\n gray: style.gray,\n \n bgBlack: style.bgBlack,\n bgRed: style.bgRed,\n bgGreen: style.bgGreen,\n bgYellow: style.bgYellow,\n bgBlue: style.bgBlue,\n bgMagenta: style.bgMagenta,\n bgCyan: style.bgCyan,\n bgWhite: style.bgWhite,\n bgGray: style.bgGray,\n \n success: style.green.bold,\n error: style.red.bold,\n warning: style.yellow.bold,\n info: style.blue.bold,\n debug: style.gray.dim\n };\n}\n\n// Export default for CommonJS compatibility\nexport default {\n parse,\n createTemplate,\n createTemplateTag,\n createDefaultHelpers\n};","import { Style } from '../styles/style';\n\nexport interface ThemeColors {\n primary?: string | [number, number, number];\n secondary?: string | [number, number, number];\n success?: string | [number, number, number];\n error?: string | [number, number, number];\n warning?: string | [number, number, number];\n info?: string | [number, number, number];\n debug?: string | [number, number, number];\n muted?: string | [number, number, number];\n accent?: string | [number, number, number];\n highlight?: string | [number, number, number];\n [key: string]: string | [number, number, number] | undefined;\n}\n\nexport interface ThemeStyles {\n heading1?: Style;\n heading2?: Style;\n heading3?: Style;\n text?: Style;\n bold?: Style;\n italic?: Style;\n underline?: Style;\n code?: Style;\n link?: Style;\n quote?: Style;\n list?: Style;\n [key: string]: Style | undefined;\n}\n\nexport interface Theme {\n name: string;\n colors: ThemeColors;\n styles: ThemeStyles;\n}\n\nexport const defaultTheme: Theme = {\n name: 'default',\n colors: {\n primary: '#0066cc',\n secondary: '#6c757d',\n success: '#28a745',\n error: '#dc3545',\n warning: '#ffc107',\n info: '#17a2b8',\n debug: '#6c757d',\n muted: '#999999',\n accent: '#e91e63',\n highlight: '#ffeb3b'\n },\n styles: {\n heading1: new Style([], [], { force: true }).bold.underline,\n heading2: new Style([], [], { force: true }).bold,\n heading3: new Style([], [], { force: true }).underline,\n text: new Style([], [], { force: true }),\n bold: new Style([], [], { force: true }).bold,\n italic: new Style([], [], { force: true }).italic,\n underline: new Style([], [], { force: true }).underline,\n code: new Style([], [], { force: true }).bgColor('#2d2d2d').color('#f8f8f2'),\n link: new Style([], [], { force: true }).underline.color('#0066cc'),\n quote: new Style([], [], { force: true }).italic.color('#6c757d'),\n list: new Style([], [], { force: true }).color('#333333')\n }\n};\n\nexport const themes: Record<string, Theme> = {\n default: defaultTheme,\n \n dark: {\n name: 'dark',\n colors: {\n primary: '#61afef',\n secondary: '#abb2bf',\n success: '#98c379',\n error: '#e06c75',\n warning: '#e5c07b',\n info: '#56b6c2',\n debug: '#5c6370',\n muted: '#5c6370',\n accent: '#c678dd',\n highlight: '#d19a66'\n },\n styles: {\n heading1: new Style([], [], { force: true }).bold.color('#61afef'),\n heading2: new Style([], [], { force: true }).bold.color('#98c379'),\n heading3: new Style([], [], { force: true }).color('#e5c07b'),\n text: new Style([], [], { force: true }).color('#abb2bf'),\n bold: new Style([], [], { force: true }).bold,\n italic: new Style([], [], { force: true }).italic,\n underline: new Style([], [], { force: true }).underline,\n code: new Style([], [], { force: true }).bgColor('#282c34').color('#abb2bf'),\n link: new Style([], [], { force: true }).underline.color('#61afef'),\n quote: new Style([], [], { force: true }).italic.color('#5c6370'),\n list: new Style([], [], { force: true }).color('#abb2bf')\n }\n },\n \n ocean: {\n name: 'ocean',\n colors: {\n primary: '#0074d9',\n secondary: '#39cccc',\n success: '#2ecc40',\n error: '#ff4136',\n warning: '#ff851b',\n info: '#7fdbff',\n debug: '#b10dc9',\n muted: '#aaaaaa',\n accent: '#f012be',\n highlight: '#ffdc00'\n },\n styles: {\n heading1: new Style([], [], { force: true }).bold.color('#0074d9'),\n heading2: new Style([], [], { force: true }).bold.color('#39cccc'),\n heading3: new Style([], [], { force: true }).color('#7fdbff'),\n text: new Style([], [], { force: true }),\n bold: new Style([], [], { force: true }).bold,\n italic: new Style([], [], { force: true }).italic,\n underline: new Style([], [], { force: true }).underline,\n code: new Style([], [], { force: true }).bgColor('#001f3f').color('#7fdbff'),\n link: new Style([], [], { force: true }).underline.color('#0074d9'),\n quote: new Style([], [], { force: true }).italic.color('#39cccc'),\n list: new Style([], [], { force: true }).color('#0074d9')\n }\n },\n \n forest: {\n name: 'forest',\n colors: {\n primary: '#228b22',\n secondary: '#8b4513',\n success: '#32cd32',\n error: '#dc143c',\n warning: '#ffa500',\n info: '#4682b4',\n debug: '#696969',\n muted: '#808080',\n accent: '#ff1493',\n highlight: '#ffd700'\n },\n styles: {\n heading1: new Style([], [], { force: true }).bold.color('#228b22'),\n heading2: new Style([], [], { force: true }).bold.color('#32cd32'),\n heading3: new Style([], [], { force: true }).color('#8b4513'),\n text: new Style([], [], { force: true }),\n bold: new Style([], [], { force: true }).bold,\n italic: new Style([], [], { force: true }).italic,\n underline: new Style([], [], { force: true }).underline,\n code: new Style([], [], { force: true }).bgColor('#013220').color('#90ee90'),\n link: new Style([], [], { force: true }).underline.color('#228b22'),\n quote: new Style([], [], { force: true }).italic.color('#8b4513'),\n list: new Style([], [], { force: true }).color('#228b22')\n }\n }\n};\n\n// Helper function to create theme proxy objects\nexport function create(colors: ThemeColors): any {\n const style = new Style([], [], { force: true });\n const proxy: any = {};\n \n // Add color methods\n Object.entries(colors).forEach(([name, color]) => {\n if (color) {\n proxy[name] = (text: string) => style.color(color).apply(text);\n }\n });\n \n return proxy;\n}\n\nexport class ThemeManager {\n private currentTheme: Theme;\n private customThemes: Record<string, Theme> = {};\n\n constructor(themeName: string = 'default') {\n this.currentTheme = themes[themeName] || defaultTheme;\n }\n\n setTheme(themeName: string): void {\n const theme = themes[themeName] || this.customThemes[themeName];\n if (theme) {\n this.currentTheme = theme;\n } else {\n throw new Error(`Theme '${themeName}' not found`);\n }\n }\n\n getTheme(): Theme {\n return this.currentTheme;\n }\n\n registerTheme(theme: Theme): void;\n registerTheme(name: string, theme: Omit<Theme, 'name'>): void;\n registerTheme(nameOrTheme: string | Theme, theme?: Omit<Theme, 'name'>): void {\n if (typeof nameOrTheme === 'string' && theme) {\n this.customThemes[nameOrTheme] = { name: nameOrTheme, ...theme };\n } else if (typeof nameOrTheme === 'object' && 'name' in nameOrTheme) {\n this.customThemes[nameOrTheme.name] = nameOrTheme;\n } else {\n throw new Error('Invalid arguments to registerTheme');\n }\n }\n\n getColor(colorName: string): string | [number, number, number] | undefined {\n return this.currentTheme.colors[colorName];\n }\n\n getStyle(styleName: string): Style | undefined {\n return this.currentTheme.styles[styleName];\n }\n\n applyTheme(): Record<string, (...args: any[]) => any> {\n const themedFormatters: Record<string, (...args: any[]) => any> = {};\n \n // Create themed color functions\n Object.entries(this.currentTheme.colors).forEach(([name, color]) => {\n if (color) {\n themedFormatters[name] = (text: string) => {\n const style = new Style([], [], { force: true });\n return style.color(color).apply(text);\n };\n }\n });\n \n // Create themed style functions\n Object.entries(this.currentTheme.styles).forEach(([name, style]) => {\n if (style) {\n themedFormatters[name] = (text: string) => style.apply(text);\n }\n });\n \n return themedFormatters;\n }\n\n getCurrentTheme(): string {\n return this.currentTheme.name;\n }\n}\n\n// Export default for CommonJS compatibility\nexport default Object.assign(create, {\n create,\n ThemeManager,\n themes,\n defaultTheme\n});","import { Style } from './styles/style';\n\nexport type Condition = boolean | (() => boolean);\nexport type ConditionalStyle = [Condition, Style | string];\n\nexport interface ConditionalOptions {\n defaultStyle?: Style;\n fallback?: string;\n}\n\nexport class ConditionalFormatter {\n private conditions: ConditionalStyle[] = [];\n private options: ConditionalOptions;\n public format: any;\n\n constructor(condition: boolean, options?: ConditionalOptions);\n constructor(options?: ConditionalOptions);\n constructor(conditionOrOptions?: boolean | ConditionalOptions, optionsParam?: ConditionalOptions) {\n let condition: boolean | undefined;\n let options: ConditionalOptions;\n\n if (typeof conditionOrOptions === 'boolean') {\n condition = conditionOrOptions;\n options = optionsParam || {};\n } else {\n options = conditionOrOptions || {};\n }\n\n this.options = {\n defaultStyle: new Style(),\n fallback: '',\n ...options\n };\n \n // Handle explicit undefined defaultStyle\n if (options && typeof options === 'object' && 'defaultStyle' in options && options.defaultStyle === undefined) {\n this.options.defaultStyle = undefined;\n }\n\n // If condition is provided, create a conditional formatter\n if (condition !== undefined) {\n this.format = conditional(condition, options);\n } else {\n // Create a format method that applies the configured conditions\n this.format = (text: string) => this.formatText(text);\n }\n }\n\n when(condition: Condition, style: Style | string): this {\n this.conditions.push([condition, style]);\n return this;\n }\n \n elsif(condition: Condition, style: Style | string): this {\n return this.when(condition, style);\n }\n \n else(style: Style | string): this {\n this.conditions.push([true, style]);\n return this;\n }\n\n formatText(text: string): string {\n for (const [condition, style] of this.conditions) {\n let isTrue: boolean;\n try {\n isTrue = typeof condition === 'function' ? condition() : condition;\n } catch (error) {\n // If condition function throws, treat as false\n isTrue = false;\n }\n \n if (isTrue) {\n if (typeof style === 'string') {\n return style;\n }\n return style.apply(text);\n }\n }\n \n if (this.options.defaultStyle) {\n return this.options.defaultStyle.apply(text);\n }\n \n return this.options.fallback || text;\n }\n}\n\nexport function conditional(): ConditionalFormatter;\nexport function conditional(condition: any, options?: ConditionalOptions): any;\nexport function conditional(condition?: any, options?: ConditionalOptions): any & { when: (...args: any[]) => any } {\n // If no arguments provided, return a new ConditionalFormatter for chaining\n if (arguments.length === 0) {\n return new ConditionalFormatter(options);\n }\n \n if (condition) {\n const style = new Style([], [], { force: true, ...options });\n \n // Create a proxy that makes style getters callable\n const proxy = new Proxy(style, {\n get(target, prop) {\n const value = target[prop as keyof Style];\n \n // If it's a Style getter, make it callable\n if (value instanceof Style) {\n return (text: string) => value.apply(text);\n }\n \n // If it's a method, bind it\n if (typeof value === 'function') {\n return value.bind(target);\n }\n \n return value;\n }\n });\n \n return proxy;\n } else {\n // For falsy values including null, return no-op proxy\n return createNoOpProxy();\n }\n}\n\n// Helper function to create a no-op proxy\nfunction createNoOpProxy(): any {\n const createNoOpMethod = () => (text: string) => text;\n \n const proxy = new Proxy(createNoOpMethod(), {\n get: (_target, prop) => {\n // Common style method names\n const styleMethods = [\n 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white', 'gray', 'black',\n 'bgRed', 'bgGreen', 'bgYellow', 'bgBlue', 'bgMagenta', 'bgCyan', 'bgWhite', 'bgGray', 'bgBlack',\n 'bold', 'dim', 'italic', 'underline', 'inverse', 'hidden', 'strikethrough',\n 'rgb', 'hex', 'bgRgb', 'bgHex', 'color', 'bgColor'\n ];\n \n if (styleMethods.includes(String(prop))) {\n return createNoOpMethod();\n }\n \n // For apply method\n if (prop === 'apply') {\n return createNoOpMethod();\n }\n \n // Return another proxy that maintains the chainable interface\n return proxy;\n },\n apply: (_target, _thisArg, args) => args[0] || ''\n });\n return proxy;\n}\n\nexport interface LogLevel {\n name: string;\n value: number;\n style: Style;\n prefix?: string;\n}\n\nexport const logLevels: Record<string, LogLevel> = {\n trace: { name: 'TRACE', value: 10, style: new Style().gray, prefix: '🔍' },\n debug: { name: 'DEBUG', value: 20, style: new Style().cyan, prefix: '🐛' },\n info: { name: 'INFO', value: 30, style: new Style().blue, prefix: 'ℹ️' },\n warn: { name: 'WARN', value: 40, style: new Style().yellow, prefix: '⚠️' },\n error: { name: 'ERROR', value: 50, style: new Style().red, prefix: '❌' },\n fatal: { name: 'FATAL', value: 60, style: new Style().red.bold.inverse, prefix: '💀' }\n};\n\nexport class LogFormatter {\n private minLevel: number;\n private usePrefix: boolean;\n private timestamp: boolean;\n\n constructor(options: { minLevel?: string; usePrefix?: boolean; timestamp?: boolean } = {}) {\n this.minLevel = logLevels[options.minLevel || 'info'].value;\n this.usePrefix = options.usePrefix ?? true;\n this.timestamp = options.timestamp ?? false;\n }\n\n format(level: string, message: string): string | null {\n const logLevel = logLevels[level];\n if (!logLevel || logLevel.value < this.minLevel) {\n return null;\n }\n\n let output = '';\n \n if (this.timestamp) {\n const time = new Date().toISOString();\n output += new Style().gray.apply(`[${time}] `);\n }\n \n if (this.usePrefix && logLevel.prefix) {\n output += logLevel.prefix + ' ';\n }\n \n output += logLevel.style.apply(`[${logLevel.name}]`) + ' ';\n output += message;\n \n return output;\n }\n\n trace(message: string): string | null {\n return this.format('trace', message);\n }\n\n debug(message: string): string | null {\n return this.format('debug', message);\n }\n\n info(message: string): string | null {\n return this.format('info', message);\n }\n\n warn(message: string): string | null {\n return this.format('warn', message);\n }\n\n error(message: string): string | null {\n return this.format('error', message);\n }\n\n fatal(message: string): string | null {\n return this.format('fatal', message);\n }\n}\n\nexport function createLogFormatter(options?: ConstructorParameters<typeof LogFormatter>[0]): LogFormatter {\n return new LogFormatter(options);\n}\n\nexport interface StatusFormatter {\n success(text: string): string;\n error(text: string): string;\n warning(text: string): string;\n info(text: string): string;\n pending(text: string): string;\n skipped(text: string): string;\n}\n\nexport function createStatusFormatter(): StatusFormatter {\n return {\n success: (text: string) => new Style().green.apply('✓ ') + text,\n error: (text: string) => new Style().red.apply('✗ ') + text,\n warning: (text: string) => new Style().yellow.apply('⚠ ') + text,\n info: (text: string) => new Style().blue.apply('ℹ ') + text,\n pending: (text: string) => new Style().gray.apply('◌ ') + text,\n skipped: (text: string) => new Style().gray.dim.apply('⊘ ') + text\n };\n}\n\n// Helper function for color conditional\nexport function color(input: string, fallback?: string | Style): string {\n // If input contains ANSI codes, return it, otherwise return fallback\n if (input && typeof input === 'string' && input.includes('\\u001B[')) {\n return input;\n }\n \n // Handle fallback - if it's a Style object, apply it to the input\n if (fallback && typeof fallback === 'object' && 'apply' in fallback) {\n return (fallback as Style).apply(input);\n }\n \n return (fallback as string) || input;\n}\n\n// Add when method to conditional function for chaining API\nconditional.when = function(condition: Condition | (() => Promise<boolean>), text: string, style?: Style | string): string | Promise<string> {\n try {\n if (typeof condition === 'function') {\n const result = condition();\n // Handle async functions that return promises\n if (result && typeof result === 'object' && 'then' in result && typeof result.then === 'function') {\n return (result as Promise<boolean>).then((isTrue: boolean) => {\n if (isTrue && style) {\n if (typeof style === 'string') {\n return style;\n }\n return style.apply(text);\n }\n return text;\n }).catch(() => {\n // If async condition rejects, return text unchanged\n return text;\n });\n }\n // Handle sync functions\n const isTrue = result as boolean;\n if (isTrue && style) {\n if (typeof style === 'string') {\n return style;\n }\n return style.apply(text);\n }\n return text;\n }\n \n // Handle boolean conditions\n const isTrue = condition as boolean;\n if (isTrue && style) {\n if (typeof style === 'string') {\n return style;\n }\n return style.apply(text);\n }\n return text;\n } catch (error) {\n // If condition throws, return text unchanged\n return text;\n }\n};","import { Formatter, FormatterAPI } from './formatter';\nimport { Style, StyleOptions } from './styles/style';\nimport { terminal, getTerminalInfo, TerminalInfo } from './utils/terminal';\nimport { gradientEnhanced as gradient, rainbow, GradientOptions } from './effects/gradient';\nimport { \n animate, \n Animation, \n AnimationType, \n AnimationOptions,\n spinner,\n Spinner,\n SpinnerName,\n spinners\n} from './effects/animation';\nimport { box, BoxOptions, BoxStyle } from './effects/box';\nimport { \n progressBar, \n ProgressBar, \n ProgressBarOptions,\n multiProgress,\n MultiProgress,\n MultiProgressOptions,\n bar\n} from './effects/progress';\nimport { createTemplateTag, TemplateFunction, TemplateHelpers, parse as templateParse } from './template';\nimport { \n Theme, \n ThemeManager, \n themes, \n defaultTheme,\n ThemeColors,\n ThemeStyles,\n create as themeCreate\n} from './themes/theme';\nimport {\n conditional,\n ConditionalFormatter,\n ConditionalOptions,\n createLogFormatter,\n LogFormatter,\n createStatusFormatter,\n StatusFormatter,\n logLevels,\n color as conditionalColor\n} from './conditional';\nimport { stripAnsi } from './core/ansi';\nimport { cacheManager } from './core/cache-manager';\n\nconst formatter = Formatter.create() as FormatterAPI;\n\nconst termstyle: FormatterAPI & {\n Style: typeof Style;\n Formatter: typeof Formatter;\n \n gradient: typeof gradient;\n rainbow: typeof rainbow;\n \n animate: typeof animate;\n Animation: typeof Animation;\n spinner: typeof spinner;\n Spinner: typeof Spinner;\n spinners: typeof spinners;\n \n box: typeof box;\n \n progressBar: typeof progressBar;\n ProgressBar: typeof ProgressBar;\n multiProgress: typeof multiProgress;\n MultiProgress: typeof MultiProgress;\n \n template: TemplateFunction;\n createTemplate: typeof createTemplateTag;\n templateParse: typeof templateParse;\n \n ThemeManager: typeof ThemeManager;\n themes: typeof themes;\n \n conditional: typeof conditional;\n ConditionalFormatter: typeof ConditionalFormatter;\n createLogFormatter: typeof createLogFormatter;\n LogFormatter: typeof LogFormatter;\n createStatusFormatter: typeof createStatusFormatter;\n logLevels: typeof logLevels;\n conditionalColor: typeof conditionalColor;\n \n terminal: typeof terminal;\n getTerminalInfo: typeof getTerminalInfo;\n \n strip: typeof stripAnsi;\n stripAnsi: typeof stripAnsi;\n \n create: typeof Formatter.create;\n \n supportsColor: boolean;\n level: 0 | 1 | 2 | 3;\n} = Object.assign(formatter, {\n Style,\n Formatter,\n \n gradient,\n rainbow,\n \n animate,\n Animation,\n spinner,\n Spinner,\n spinners,\n \n box,\n \n progressBar,\n ProgressBar,\n multiProgress,\n MultiProgress,\n bar,\n \n template: createTemplateTag(),\n createTemplate: createTemplateTag,\n templateParse,\n \n ThemeManager,\n themes,\n \n conditional,\n ConditionalFormatter,\n createLogFormatter,\n LogFormatter,\n createStatusFormatter,\n logLevels,\n conditionalColor,\n \n terminal,\n getTerminalInfo,\n \n strip: stripAnsi,\n stripAnsi,\n \n create: Formatter.create,\n \n get supportsColor() {\n return terminal().supportsColor;\n },\n \n get level() {\n return terminal().colorLevel;\n }\n});\n\n// Create a style instance for easy access\nconst style = new Style();\n\nexport default termstyle;\n\n// Export classes and functions\nexport {\n Style,\n Formatter,\n style,\n gradient,\n rainbow,\n bar,\n themeCreate,\n animate,\n Animation,\n spinner,\n Spinner,\n spinners,\n box,\n progressBar,\n ProgressBar,\n multiProgress,\n MultiProgress,\n createTemplateTag,\n templateParse,\n ThemeManager,\n themes,\n defaultTheme,\n conditional,\n ConditionalFormatter,\n createLogFormatter,\n LogFormatter,\n createStatusFormatter,\n logLevels,\n conditionalColor,\n terminal,\n getTerminalInfo,\n stripAnsi,\n cacheManager\n};\n\n// Export types separately\nexport type {\n StyleOptions,\n FormatterAPI,\n GradientOptions,\n AnimationType,\n AnimationOptions,\n SpinnerName,\n BoxOptions,\n BoxStyle,\n ProgressBarOptions,\n MultiProgressOptions,\n TemplateFunction,\n TemplateHelpers,\n Theme,\n ThemeColors,\n ThemeStyles,\n ConditionalOptions,\n StatusFormatter,\n TerminalInfo\n};"],"mappings":"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","names":["ESC","RESET","ansiCode","code","ansiCodes","rgb","r","g","b","bgRgb","ansi256","code","bgAnsi256","hexToRgb","hex","cleanHex","char","rgbToAnsi256","index","ansiR","ansiG","ansiB","stripAnsi","str","ansiColorPattern","ansiControlPattern","result","i","eraseLine","ESC","hideCursor","ESC","showCursor","release","getIsCI","getColorLevel","_a","_b","currentEnv","osRelease","majorVersion","buildVersion","getTerminalInfo","_c","colorLevel","columns","rows","terminalInfo","terminalInfoTimestamp","resizeListener","TERMINAL_INFO_TTL","terminal","now","updateTerminalInfo","resizeListener","updateTerminalInfo","InputValidator","input","inputArray","warnings","validated","i","value","r","g","b","trimmed","rgbMatch","allowNegative","min","clamped","wasClamped","type","validTypes","normalized","found","t","text","converted","hasControlChars","hasAnsiCodes","isEmpty","colors","validColors","c","results","errors","skippedCount","result","w","name","max","numberResult","preserveAnsi","sanitized","TermStyleError","errorDetails","message","s","ValidationError","code","details","AnimationError","TermStyleError","message","code","details","ConfigurationError","ErrorRecovery","operation","fallback","logError","error","maxAttempts","initialDelay","lastError","attempt","delay","resolve","fn","errorHandler","args","result","defaultValue","ErrorContext","key","value","context","keys","LRUCacheOptimized","capacity","key","value","firstKey","callback","CacheManager","_CacheManager","LRUCacheOptimized","key","cached","value","hex","firstKey","type","stats","total","cacheManager","colorNames","ColorProcessor","input","key","cached","cacheManager","result","h","s","l","r","g","b","name","hex","num","trimmed","hexToRgb","rgbMatch","hslMatch","c","x","m","rIndex","gIndex","bIndex","Style","_Style","codes","resetCodes","options","terminal","code","resetCode","newCodes","newResetCodes","codeNum","isForegroundColor","isBackgroundColor","indicesToRemove","i","existingCode","existingCodeNum","index","resetIndex","text","validation","InputValidator","validatedText","openCodes","ansiCode","closeCodes","ansiCodes","color","level","basicColors","colorLower","r","g","b","ColorProcessor","rgb","rgbToAnsi256","ansi256","basicBgColors","bgAnsi256","bgRgb","brightness","closestColor","hex","Formatter","_Formatter","options","Style","style","formatter","args","target","prop","newStyle","result","strings","values","str","i","text","stripAnsi","StringBuilder","_StringBuilder","initial","value","str","index","current","codes","text","openCodes","closeCodes","builder","code","i","StringBuilderPool","fn","rgbToBasic","r","g","b","convertColorInput","color","ColorProcessor","interpolateLinear","start","end","factor","rgbToHsv","max","min","delta","h","s","v","hsvToRgb","i","f","p","q","t","interpolateHsv","spin","h1Start","s1","v1","h2Start","s2","v2","h1","h2","getGradientCacheKey","text","colors","options","keyBuilder","StringBuilder","c","hash","optimizedGradientBase","textValidation","InputValidator","validatedText","termInfo","terminal","colorValidation","validColors","vc","rgb","Style","chars","cacheKey","cached","cacheManager","colorStops","segments","charsPerSegment","builder","colorReset","colorLevel","useHsvInterpolation","char","segment","segmentProgress","startColor","endColor","colorIndex","basicColor","result","gradientBase","gradientWithLinear","args","colors","text","options","gradientBase","rainbow","args","colors","text","options","ErrorRecovery","gradientBase","ResourceManager","resource","wasDisposing","resources","error","cleanup","cleanupExecuted","safeCleanup","reason","safeDivide","a","b","defaultValue","result","safeExecute","operation","fallback","errorHandler","error","CursorManager","_CursorManager","componentId","safeExecute","hideCursor","showCursor","cursorManager","Animation","text","type","options","textValidation","InputValidator","AnimationError","durationValidation","intervalValidation","iterationsValidation","ResourceManager","cursorManager","frame","iteration","totalFrames","progress","safeExecute","eraseLine","intensity","color","styled","Style","offset","visible","chars","opacity","animate","animation","spinners","Spinner","spinnerOrOptions","interval","_a","_b","spinnerName","finalInterval","spinner","finalText","_color","s","boxStyles","getPadding","padding","wrapText","text","width","lines","words","currentLine","word","testLine","stripAnsi","alignText","align","textLength","totalPadding","leftPad","rightPad","box","content","options","margin","borderStyle","borderColor","backgroundColor","title","titleAlignment","wrap","style","pad","mar","line","maxLineLength","titleWidth","titleLen","minContentWidth","contentWidth","paddedLines","aligned","i","borderStyle_","Style","topBorder","titleLength","availableSpace","leftPadding","rightPadding","leftSpaces","rightSpaces","defaultLeftSpaces","defaultRightSpaces","bottomBorder","boxLines","fullLine","create","box_default","ProgressBar","options","ConfigurationError","validation","InputValidator","ResourceManager","delta","tokens","ValidationError","oldCurrent","current","forceRender","now","rawPercent","safeDivide","percent","filledLength","emptyLength","filled","empty","style","Style","bar","elapsed","eta","output","key","value","safeExecute","cursorManager","eraseLine","seconds","hours","minutes","secs","MultiProgress","format","i","index","barsToDispose","error","progressBar","multiProgress","total","barOptions","width","complete","incomplete","parseStyleTags","text","helpers","result","changed","tagRegex","fullMatch","tagName","content","helper","Style","parseInlineStyles","formatter","inlineRegex","stylePath","styles","currentStyle","style","createTemplate","allHelpers","createDefaultHelpers","strings","values","mutableStrings","str","i","value","backtickMatch","createTemplateTag","options","Formatter","parse","template","variables","key","regex","defaultTheme","Style","themes","create","colors","style","proxy","name","color","text","ThemeManager","themeName","theme","nameOrTheme","colorName","styleName","themedFormatters","theme_default","ConditionalFormatter","conditionOrOptions","optionsParam","condition","options","Style","conditional","text","style","isTrue","target","prop","value","createNoOpProxy","createNoOpMethod","proxy","_target","_thisArg","args","logLevels","LogFormatter","level","message","logLevel","output","time","createLogFormatter","createStatusFormatter","color","input","fallback","result","formatter","Formatter","termstyle","Style","gradientWithLinear","rainbow","animate","Animation","spinner","Spinner","spinners","box","progressBar","ProgressBar","multiProgress","MultiProgress","bar","createTemplateTag","parse","ThemeManager","themes","conditional","ConditionalFormatter","createLogFormatter","LogFormatter","createStatusFormatter","logLevels","color","terminal","getTerminalInfo","stripAnsi","style","index_default"]}