@mks2508/better-logger 0.18.2-alpha.1 → 0.18.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. package/README.md +38 -336
  2. package/dist/Logger.d.ts +356 -157
  3. package/dist/Logger.d.ts.map +1 -1
  4. package/dist/ScopedLogger.d.ts +549 -9
  5. package/dist/ScopedLogger.d.ts.map +1 -1
  6. package/dist/chunks/HookBridge-C-AvXmPD.cjs +504 -0
  7. package/dist/chunks/HookBridge-C-AvXmPD.cjs.map +1 -0
  8. package/dist/chunks/HookBridge-CI2PH79S.js +487 -0
  9. package/dist/chunks/HookBridge-CI2PH79S.js.map +1 -0
  10. package/dist/chunks/{LogContext-L7HzynFw.cjs → LogContext-BaMXleWj.cjs} +19 -4
  11. package/dist/chunks/LogContext-BaMXleWj.cjs.map +1 -0
  12. package/dist/chunks/LogContext-DZasm_P5.cjs +141 -0
  13. package/dist/chunks/LogContext-DZasm_P5.cjs.map +1 -0
  14. package/dist/chunks/{LogContext-Cwn-1Zzb.js → LogContext-DjlITOzZ.js} +19 -4
  15. package/dist/chunks/LogContext-DjlITOzZ.js.map +1 -0
  16. package/dist/chunks/LogContext-Dyzs61XG.js +136 -0
  17. package/dist/chunks/LogContext-Dyzs61XG.js.map +1 -0
  18. package/dist/chunks/SerializerBridge-Ba43Mk7j.js +393 -0
  19. package/dist/chunks/SerializerBridge-Ba43Mk7j.js.map +1 -0
  20. package/dist/chunks/SerializerBridge-C4a9Z37F.cjs +410 -0
  21. package/dist/chunks/SerializerBridge-C4a9Z37F.cjs.map +1 -0
  22. package/dist/chunks/{StyleManager-CIpd6wbO.cjs → StyleManager-DQ6UNRB-.cjs} +37 -11
  23. package/dist/chunks/StyleManager-DQ6UNRB-.cjs.map +1 -0
  24. package/dist/chunks/StyleManager-DjwAYbxE.js +113 -0
  25. package/dist/chunks/StyleManager-DjwAYbxE.js.map +1 -0
  26. package/dist/chunks/{core-PoT7RrTK.js → core-Blfi2klP.js} +1 -4
  27. package/dist/chunks/core-Blfi2klP.js.map +1 -0
  28. package/dist/chunks/{core-Dzz7agGa.cjs → core-CqS_UBzJ.cjs} +1 -4
  29. package/dist/chunks/core-CqS_UBzJ.cjs.map +1 -0
  30. package/dist/chunks/{environment-detector-CI3TrWK_.js → environment-detector-7NvnYUfr.js} +11 -11
  31. package/dist/chunks/environment-detector-7NvnYUfr.js.map +1 -0
  32. package/dist/chunks/{environment-detector-Cnn6wr6O.cjs → environment-detector-D-tHkKWA.cjs} +11 -11
  33. package/dist/chunks/environment-detector-D-tHkKWA.cjs.map +1 -0
  34. package/dist/chunks/server-fallback-CaCPjWby.cjs +119 -0
  35. package/dist/chunks/server-fallback-CaCPjWby.cjs.map +1 -0
  36. package/dist/chunks/server-fallback-jj0T6XaK.js +114 -0
  37. package/dist/chunks/server-fallback-jj0T6XaK.js.map +1 -0
  38. package/dist/chunks/{spinner-DNvxbM9a.cjs → spinner-BHyYEXsM.cjs} +319 -37
  39. package/dist/chunks/spinner-BHyYEXsM.cjs.map +1 -0
  40. package/dist/chunks/{spinner-D3FsF78o.js → spinner-BtkwpzYv.js} +319 -37
  41. package/dist/chunks/spinner-BtkwpzYv.js.map +1 -0
  42. package/dist/chunks/styling-CRw3KQW4.js +1592 -0
  43. package/dist/chunks/styling-CRw3KQW4.js.map +1 -0
  44. package/dist/chunks/styling-Cel2wPRy.cjs +1645 -0
  45. package/dist/chunks/styling-Cel2wPRy.cjs.map +1 -0
  46. package/dist/chunks/transports-BGfwwakw.js +1237 -0
  47. package/dist/chunks/transports-BGfwwakw.js.map +1 -0
  48. package/dist/chunks/transports-BZ-Mc2IT.cjs +1450 -0
  49. package/dist/chunks/transports-BZ-Mc2IT.cjs.map +1 -0
  50. package/dist/chunks/transports-DvaLAeGJ.js +1403 -0
  51. package/dist/chunks/transports-DvaLAeGJ.js.map +1 -0
  52. package/dist/chunks/transports-yK6CL0Ml.cjs +1278 -0
  53. package/dist/chunks/transports-yK6CL0Ml.cjs.map +1 -0
  54. package/dist/chunks/{utils-BqlFYocD.cjs → utils-W_cxqriN.cjs} +44 -37
  55. package/dist/chunks/utils-W_cxqriN.cjs.map +1 -0
  56. package/dist/chunks/{utils-VETbVpkR.js → utils-tKfBAWUM.js} +44 -37
  57. package/dist/chunks/utils-tKfBAWUM.js.map +1 -0
  58. package/dist/cli/CommandProcessor.d.ts +166 -19
  59. package/dist/cli/CommandProcessor.d.ts.map +1 -1
  60. package/dist/cli/commands/ConfigCommand.d.ts +36 -1
  61. package/dist/cli/commands/ConfigCommand.d.ts.map +1 -1
  62. package/dist/cli/commands/ExportCommand.d.ts +49 -3
  63. package/dist/cli/commands/ExportCommand.d.ts.map +1 -1
  64. package/dist/cli/commands/ThemeCommand.d.ts +62 -3
  65. package/dist/cli/commands/ThemeCommand.d.ts.map +1 -1
  66. package/dist/cli/help.d.ts +30 -2
  67. package/dist/cli/help.d.ts.map +1 -1
  68. package/dist/cli/index.d.ts +29 -2
  69. package/dist/cli/index.d.ts.map +1 -1
  70. package/dist/cli.cjs +2 -2
  71. package/dist/cli.js +2 -2
  72. package/dist/context/LogContext.d.ts +167 -70
  73. package/dist/context/LogContext.d.ts.map +1 -1
  74. package/dist/context.cjs +1 -1
  75. package/dist/context.js +1 -1
  76. package/dist/core.cjs +52 -29
  77. package/dist/core.cjs.map +1 -1
  78. package/dist/core.d.ts +50 -27
  79. package/dist/core.d.ts.map +1 -1
  80. package/dist/core.js +52 -29
  81. package/dist/core.js.map +1 -1
  82. package/dist/hooks/HookBridge.d.ts +15 -9
  83. package/dist/hooks/HookBridge.d.ts.map +1 -1
  84. package/dist/hooks/HookManager.d.ts +295 -2
  85. package/dist/hooks/HookManager.d.ts.map +1 -1
  86. package/dist/hooks.cjs +1 -1
  87. package/dist/hooks.js +1 -1
  88. package/dist/index.cjs +1415 -214
  89. package/dist/index.cjs.map +1 -1
  90. package/dist/index.d.ts +5 -1
  91. package/dist/index.d.ts.map +1 -1
  92. package/dist/index.js +1413 -215
  93. package/dist/index.js.map +1 -1
  94. package/dist/playground/TerminalBridge.d.ts +23 -16
  95. package/dist/playground/TerminalBridge.d.ts.map +1 -1
  96. package/dist/playground/box.d.ts +36 -5
  97. package/dist/playground/box.d.ts.map +1 -1
  98. package/dist/playground/cli-table.d.ts +41 -5
  99. package/dist/playground/cli-table.d.ts.map +1 -1
  100. package/dist/playground/divider.d.ts +22 -3
  101. package/dist/playground/divider.d.ts.map +1 -1
  102. package/dist/playground/header.d.ts +21 -4
  103. package/dist/playground/header.d.ts.map +1 -1
  104. package/dist/playground/server-fallback.d.ts +96 -9
  105. package/dist/playground/server-fallback.d.ts.map +1 -1
  106. package/dist/playground/spinner.d.ts +159 -10
  107. package/dist/playground/spinner.d.ts.map +1 -1
  108. package/dist/playground/step.d.ts +25 -6
  109. package/dist/playground/step.d.ts.map +1 -1
  110. package/dist/playground.cjs +1 -1
  111. package/dist/playground.js +1 -1
  112. package/dist/serializers/SerializerBridge.d.ts +13 -6
  113. package/dist/serializers/SerializerBridge.d.ts.map +1 -1
  114. package/dist/serializers/SerializerRegistry.d.ts +236 -0
  115. package/dist/serializers/SerializerRegistry.d.ts.map +1 -1
  116. package/dist/serializers.cjs +1 -1
  117. package/dist/serializers.js +1 -1
  118. package/dist/styles/StyleManager.d.ts +138 -31
  119. package/dist/styles/StyleManager.d.ts.map +1 -1
  120. package/dist/styles.cjs +2 -2
  121. package/dist/styles.js +2 -2
  122. package/dist/styling/SmartPresets.d.ts +100 -6
  123. package/dist/styling/SmartPresets.d.ts.map +1 -1
  124. package/dist/styling/StyleBuilder.d.ts +453 -32
  125. package/dist/styling/StyleBuilder.d.ts.map +1 -1
  126. package/dist/styling/banners.d.ts +83 -7
  127. package/dist/styling/banners.d.ts.map +1 -1
  128. package/dist/styling/themes.d.ts +41 -2
  129. package/dist/styling/themes.d.ts.map +1 -1
  130. package/dist/transports/ConsoleTransport.d.ts +95 -0
  131. package/dist/transports/ConsoleTransport.d.ts.map +1 -1
  132. package/dist/transports/FileTransport.d.ts +99 -18
  133. package/dist/transports/FileTransport.d.ts.map +1 -1
  134. package/dist/transports/HttpTransport.d.ts +135 -22
  135. package/dist/transports/HttpTransport.d.ts.map +1 -1
  136. package/dist/transports/OtlpTraceTransport.d.ts +118 -0
  137. package/dist/transports/OtlpTraceTransport.d.ts.map +1 -0
  138. package/dist/transports/OtlpTransport.d.ts +80 -37
  139. package/dist/transports/OtlpTransport.d.ts.map +1 -1
  140. package/dist/transports/SpanRuntime.d.ts +73 -0
  141. package/dist/transports/SpanRuntime.d.ts.map +1 -0
  142. package/dist/transports/TransportBridge.d.ts +19 -13
  143. package/dist/transports/TransportBridge.d.ts.map +1 -1
  144. package/dist/transports/TransportManager.d.ts +232 -10
  145. package/dist/transports/TransportManager.d.ts.map +1 -1
  146. package/dist/transports/index.d.ts +1 -0
  147. package/dist/transports/index.d.ts.map +1 -1
  148. package/dist/transports-module.d.ts +3 -1
  149. package/dist/transports-module.d.ts.map +1 -1
  150. package/dist/transports.cjs +2 -1
  151. package/dist/transports.js +2 -2
  152. package/dist/types/core.d.ts +155 -59
  153. package/dist/types/core.d.ts.map +1 -1
  154. package/dist/types/hooks.d.ts +92 -14
  155. package/dist/types/hooks.d.ts.map +1 -1
  156. package/dist/types/index.d.ts +1 -1
  157. package/dist/types/index.d.ts.map +1 -1
  158. package/dist/types/serializers.d.ts +72 -0
  159. package/dist/types/serializers.d.ts.map +1 -1
  160. package/dist/types/transports.d.ts +163 -39
  161. package/dist/types/transports.d.ts.map +1 -1
  162. package/dist/utils/ansi-colors.d.ts +15 -15
  163. package/dist/utils/asyncLocalStorage.d.ts +33 -0
  164. package/dist/utils/asyncLocalStorage.d.ts.map +1 -0
  165. package/dist/utils/environment-detector.d.ts +11 -11
  166. package/dist/utils/formatting.d.ts +8 -8
  167. package/dist/utils/output.d.ts +9 -9
  168. package/dist/utils/output.d.ts.map +1 -1
  169. package/dist/utils/stackTrace.d.ts +2 -2
  170. package/package.json +24 -25
  171. package/dist/chunks/HookBridge-CiRfR67f.cjs +0 -190
  172. package/dist/chunks/HookBridge-CiRfR67f.cjs.map +0 -1
  173. package/dist/chunks/HookBridge-SgMmbXZB.js +0 -173
  174. package/dist/chunks/HookBridge-SgMmbXZB.js.map +0 -1
  175. package/dist/chunks/LogContext-Cwn-1Zzb.js.map +0 -1
  176. package/dist/chunks/LogContext-L7HzynFw.cjs.map +0 -1
  177. package/dist/chunks/SerializerBridge-BaOQOb8q.cjs +0 -166
  178. package/dist/chunks/SerializerBridge-BaOQOb8q.cjs.map +0 -1
  179. package/dist/chunks/SerializerBridge-BkpQu5c9.js +0 -149
  180. package/dist/chunks/SerializerBridge-BkpQu5c9.js.map +0 -1
  181. package/dist/chunks/StyleManager-CIpd6wbO.cjs.map +0 -1
  182. package/dist/chunks/StyleManager-LCvVlVdx.js +0 -87
  183. package/dist/chunks/StyleManager-LCvVlVdx.js.map +0 -1
  184. package/dist/chunks/core-Dzz7agGa.cjs.map +0 -1
  185. package/dist/chunks/core-PoT7RrTK.js.map +0 -1
  186. package/dist/chunks/environment-detector-CI3TrWK_.js.map +0 -1
  187. package/dist/chunks/environment-detector-Cnn6wr6O.cjs.map +0 -1
  188. package/dist/chunks/server-fallback-BUKjdLS7.cjs +0 -42
  189. package/dist/chunks/server-fallback-BUKjdLS7.cjs.map +0 -1
  190. package/dist/chunks/server-fallback-BsuWH1Dk.js +0 -37
  191. package/dist/chunks/server-fallback-BsuWH1Dk.js.map +0 -1
  192. package/dist/chunks/spinner-D3FsF78o.js.map +0 -1
  193. package/dist/chunks/spinner-DNvxbM9a.cjs.map +0 -1
  194. package/dist/chunks/styling-84N8T97t.js +0 -941
  195. package/dist/chunks/styling-84N8T97t.js.map +0 -1
  196. package/dist/chunks/styling-Cg5saQ46.cjs +0 -994
  197. package/dist/chunks/styling-Cg5saQ46.cjs.map +0 -1
  198. package/dist/chunks/transports-BiDk345e.js +0 -715
  199. package/dist/chunks/transports-BiDk345e.js.map +0 -1
  200. package/dist/chunks/transports-COPWmlF1.cjs +0 -756
  201. package/dist/chunks/transports-COPWmlF1.cjs.map +0 -1
  202. package/dist/chunks/utils-BqlFYocD.cjs.map +0 -1
  203. package/dist/chunks/utils-VETbVpkR.js.map +0 -1
  204. package/dist/example.d.ts +0 -18
  205. package/dist/example.d.ts.map +0 -1
  206. package/dist/main.d.ts +0 -2
  207. package/dist/main.d.ts.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StyleManager-DjwAYbxE.js","names":["themeRecord"],"sources":["../../src/styles/StyleManager.ts"],"sourcesContent":["/**\n * @fileoverview StyleManager — gestión de presets de estilo y display settings.\n *\n * Encapsula el tracking del preset activo, los toggles de visibilidad del\n * output (timestamp, location, badges) y la variable de módulo\n * {@link LEVEL_STYLES}. El Logger delega en este bridge la resolución de\n * estilos y los cambios de theme para mantener sincronizado el estado\n * compartido a nivel módulo.\n */\n\nimport {\n THEME_PRESETS,\n type StylePresets,\n type StyleBuilder\n} from '../styling/index.js';\nimport { getSmartPreset, getAvailablePresets, hasPreset } from '../styling/SmartPresets.js';\nimport type { ThemeVariant, LogStyles } from '../types/index.js';\n\n/**\n * Re-export de `StyleBuilder` para consumo interno del Logger dentro de este\n * paquete. La API pública de styling vive en `../styling/index.ts`; este\n * re-export existe únicamente para evitar un segundo import cruzado desde\n * Logger.ts. No considerar parte del surface público de este módulo.\n *\n * @internal\n */\nexport { StyleBuilder } from '../styling/index.js';\n\n/**\n * Toggles de visibilidad que controlan qué metadatos acompañan a cada línea\n * de log en la salida formateada. Cada preset inteligente\n * (via {@link StyleManager.applyPreset}) puede imponer sus propios defaults\n * sobreescribiendo estos valores.\n */\nexport interface DisplaySettings {\n /** Muestra (o no) el timestamp ISO al inicio de cada línea. */\n showTimestamp: boolean;\n /** Muestra (o no) la ubicación del caller (file:line) parseada del stack. */\n showLocation: boolean;\n /** Muestra (o no) los badges de scope/nivel junto al mensaje. */\n showBadges: boolean;\n}\n\n/**\n * Snapshot del estado interno que el StyleManager trackea en closure:\n * preset activo, overrides de `customize()` y display settings vigentes.\n * Útil para serializar/inspeccionar el estado de styling sin exponer la\n * implementación del bridge.\n */\nexport interface PresetState {\n /** Config de estilos resuelta (referencia a {@link LEVEL_STYLES}). */\n styles: typeof THEME_PRESETS.default;\n /** Config del smart-preset activo (si lo hay). */\n activePreset: unknown;\n /** Nombre del smart-preset activo (si lo hay). */\n activePresetName: string | undefined;\n /** Últimos overrides aplicados via `customize()`. */\n customization: unknown;\n /** Toggles de visibilidad del output. */\n displaySettings: DisplaySettings;\n}\n\n/**\n * Opciones de construcción para {@link createStyleManager}.\n */\nexport interface IStyleManagerOptions {\n /** Display settings iniciales (parciales: se merguean sobre los defaults). */\n initialDisplaySettings?: Partial<DisplaySettings>;\n}\n\n/**\n * Bridge que gestiona presets de estilo, display settings y el ciclo de\n * theme switching para un Logger.\n *\n * Encapsula el estado de styling en una closure para que el Logger no\n * tenga que mantener boilerplate propio. La implementación por defecto\n * (ver {@link createStyleManager}) opera sobre la variable de módulo\n * compartida {@link LEVEL_STYLES}: esto significa que `setTheme()` y\n * `resetStyles()` mutan estado global visible para TODAS las instancias\n * de Logger que comparten el módulo. Cada Logger construye su propio\n * StyleManager, pero la backing store de estilos activos es module-scoped\n * — está pensado así para que cambiar de theme una vez afecte a toda la\n * app, pero conviene saberlo al instanciar múltiples loggers con intents\n * distintos.\n */\nexport interface StyleManager {\n /**\n * Devuelve un shallow clone de los display settings vigentes, de modo\n * que el caller pueda leerlos sin riesgo de mutar el estado interno.\n */\n getDisplaySettings(): DisplaySettings;\n /**\n * Aplica un smart-preset por nombre. Si el preset existe, actualiza los\n * toggles de display (`showTimestamp`/`showLocation`) según la config\n * del preset y memoriza su nombre/config para que el renderer pueda\n * regenerar el output si cambia el theme.\n *\n * @param name - Identificador del preset (ver {@link getAvailablePresets}).\n * @returns `true` si el preset existe y se aplicó, `false` si no se encontró.\n */\n applyPreset(name: string): boolean;\n /**\n * Lista los identificadores de todos los smart-presets registrados.\n * Útil para alimentar un selector de UI o validar input de usuario.\n */\n getAvailablePresets(): string[];\n /**\n * Devuelve la referencia actual a {@link LEVEL_STYLES}. Como es\n * module-scoped, refleja el último `setTheme()`/`resetStyles()` aunque\n * provenga de otra instancia.\n */\n getStyles(): typeof THEME_PRESETS.default;\n /** Devuelve la config cruda del smart-preset activo (o `undefined`). */\n getActivePreset(): unknown;\n /** Nombre del smart-preset activo — útil para logging diagnóstico. */\n getActivePresetName(): string | undefined;\n /** Último override aplicado via `Logger.customize()` (si lo hubo). */\n getCustomization(): unknown;\n /**\n * Persiste overrides de customización para que el renderer los consuma\n * en el próximo render. No muta {@link LEVEL_STYLES}.\n */\n setCustomization(overrides: unknown): void;\n /**\n * Resuelve (sin mutar nada) el set de estilos que correspondería a un\n * theme dado. Si el theme no existe en {@link THEME_PRESETS}, cae al\n * preset `default`. Útil para previsualizar un theme sin aplicarlo.\n *\n * @param theme - Variante de theme soportada por {@link THEME_PRESETS}.\n */\n resolveThemeStyle(theme: ThemeVariant): typeof THEME_PRESETS.default;\n /**\n * Aplica el theme mutando la variable de módulo {@link LEVEL_STYLES}.\n *\n * **Side-effect global**: como `LEVEL_STYLES` se comparte entre todas\n * las instancias de Logger del módulo, este cambio es visible para\n * cualquier Logger que haya en el proceso. No hay undo a nivel\n * instancia — llamar a {@link resetStyles} para volver al default.\n *\n * @param theme - Variante de theme soportada por {@link THEME_PRESETS}.\n * @returns `true` si el theme existe y se aplicó, `false` si no se encontró.\n */\n setTheme(theme: ThemeVariant): boolean;\n /**\n * Restablece {@link LEVEL_STYLES} al preset `default` de\n * {@link THEME_PRESETS}. Al igual que {@link setTheme}, afecta a todas\n * las instancias de Logger del módulo.\n */\n resetStyles(): void;\n}\n\nfunction createDefaultDisplaySettings(): DisplaySettings {\n return {\n showTimestamp: true,\n showLocation: true,\n showBadges: true\n };\n}\n\n/**\n * Crea una instancia de {@link StyleManager} con display settings por defecto\n * (o los overrides que se pasen en `options`).\n *\n * Cada instancia mantiene su propio estado de preset/customization/display,\n * pero la backing store de estilos activos ({@link LEVEL_STYLES}) es\n * module-scoped: dos StyleManagers comparten la misma vista de LEVEL_STYLES.\n *\n * @param options - Overrides opcionales para los display settings iniciales.\n *\n * @example\n * ```ts\n * const sm = createStyleManager({\n * initialDisplaySettings: { showTimestamp: false, showBadges: true }\n * });\n *\n * sm.applyPreset('cyberpunk'); // aplica preset + ajusta toggles\n * sm.setTheme('dark'); // muta LEVEL_STYLES (global al módulo)\n * console.log(sm.getStyles()); // lee el LEVEL_STYLES vigente\n * ```\n *\n * @see {@link StyleManager} para el contrato completo del bridge.\n */\nexport function createStyleManager(options: IStyleManagerOptions = {}): StyleManager {\n const displaySettings = createDefaultDisplaySettings();\n let activePreset: unknown;\n let activePresetName: string | undefined;\n let customization: unknown;\n\n return {\n getDisplaySettings(): DisplaySettings {\n return { ...displaySettings };\n },\n\n applyPreset(name: string): boolean {\n if (!hasPreset(name)) {\n return false;\n }\n\n const presetConfig = getSmartPreset(name);\n if (presetConfig) {\n displaySettings.showTimestamp = presetConfig.timestamp?.show ?? true;\n displaySettings.showLocation = presetConfig.location?.show ?? true;\n activePreset = presetConfig;\n activePresetName = name;\n }\n return true;\n },\n\n getAvailablePresets(): string[] {\n return getAvailablePresets();\n },\n\n getStyles(): typeof THEME_PRESETS.default {\n return LEVEL_STYLES;\n },\n\n getActivePreset(): unknown {\n return activePreset;\n },\n\n getActivePresetName(): string | undefined {\n return activePresetName;\n },\n\n getCustomization(): unknown {\n return customization;\n },\n\n setCustomization(overrides: unknown): void {\n customization = overrides;\n },\n\n resolveThemeStyle(theme: ThemeVariant): typeof THEME_PRESETS.default {\n if (theme in THEME_PRESETS) {\n const themeRecord = THEME_PRESETS as unknown as Record<string, typeof LEVEL_STYLES>;\n return themeRecord[theme] ?? THEME_PRESETS.default;\n }\n return THEME_PRESETS.default;\n },\n\n setTheme(theme: ThemeVariant): boolean {\n if (theme in THEME_PRESETS) {\n const themeRecord = THEME_PRESETS as unknown as Record<string, typeof LEVEL_STYLES>;\n const newStyles = themeRecord[theme];\n if (newStyles) {\n LEVEL_STYLES = newStyles;\n return true;\n }\n }\n return false;\n },\n\n resetStyles(): void {\n LEVEL_STYLES = THEME_PRESETS.default;\n }\n };\n}\n\n/**\n * Variable de módulo con el set de estilos activo, compartida por todas las\n * instancias de Logger/StyleManager que importan este módulo. Se exporta\n * `let` para que el Logger la pueda leer directamente sin pasar por el bridge.\n *\n * **Mutadores**: {@link StyleManager.setTheme} y {@link StyleManager.resetStyles}\n * (o el {@link resetStyles} exportado de este módulo) reasignan esta variable.\n * Cualquier referencia capturada con anterioridad queda stale — siempre leer\n * vía `LEVEL_STYLES` en punto de uso, no cacheandola.\n */\nexport let LEVEL_STYLES: typeof THEME_PRESETS.default = THEME_PRESETS.default;\n\n/**\n * Restablece {@link LEVEL_STYLES} al preset `default` de {@link THEME_PRESETS}.\n *\n * Equivalente a invocar {@link StyleManager.resetStyles} sobre cualquier\n * instancia, expuesto como función libre para que código externo al Logger\n * (CLIs, tooling, tests) pueda resetear el módulo sin tener que sostener una\n * referencia al StyleManager. Mismo side-effect global que `setTheme`.\n *\n * @example\n * ```ts\n * import { resetStyles } from '@mks2508/better-logger/styles';\n * resetStyles(); // vuelve al theme default para todos los loggers del módulo\n * ```\n */\nexport function resetStyles(): void {\n LEVEL_STYLES = THEME_PRESETS.default;\n}\n"],"mappings":";;;;;;;;;;;AAuJA,SAAS,+BAAgD;CACrD,OAAO;EACH,eAAe;EACf,cAAc;EACd,YAAY;CAChB;AACJ;;;;;;;;;;;;;;;;;;;;;;;;AAyBA,SAAgB,mBAAmB,UAAgC,CAAC,GAAiB;CACjF,MAAM,kBAAkB,6BAA6B;CACrD,IAAI;CACJ,IAAI;CACJ,IAAI;CAEJ,OAAO;EACH,qBAAsC;GAClC,OAAO,EAAE,GAAG,gBAAgB;EAChC;EAEA,YAAY,MAAuB;GAC/B,IAAI,CAAC,UAAU,IAAI,GACf,OAAO;GAGX,MAAM,eAAe,eAAe,IAAI;GACxC,IAAI,cAAc;IACd,gBAAgB,gBAAgB,aAAa,WAAW,QAAQ;IAChE,gBAAgB,eAAe,aAAa,UAAU,QAAQ;IAC9D,eAAe;IACf,mBAAmB;GACvB;GACA,OAAO;EACX;EAEA,sBAAgC;GAC5B,OAAO,oBAAoB;EAC/B;EAEA,YAA0C;GACtC,OAAO;EACX;EAEA,kBAA2B;GACvB,OAAO;EACX;EAEA,sBAA0C;GACtC,OAAO;EACX;EAEA,mBAA4B;GACxB,OAAO;EACX;EAEA,iBAAiB,WAA0B;GACvC,gBAAgB;EACpB;EAEA,kBAAkB,OAAmD;GACjE,IAAI,SAAS,eAET,OAAOA,cAAY,UAAU,cAAc;GAE/C,OAAO,cAAc;EACzB;EAEA,SAAS,OAA8B;GACnC,IAAI,SAAS,eAAe;IAExB,MAAM,YAAYA,cAAY;IAC9B,IAAI,WAAW;KACX,eAAe;KACf,OAAO;IACX;GACJ;GACA,OAAO;EACX;EAEA,cAAoB;GAChB,eAAe,cAAc;EACjC;CACJ;AACJ;;;;;;;;;;;AAYA,IAAW,eAA6C,cAAc"}
@@ -1,8 +1,5 @@
1
1
  //#region src/types/core.ts
2
2
  /**
3
- * @fileoverview Definiciones de tipos principales para Better Logger
4
- */
5
- /**
6
3
  * Niveles de log soportados en orden jerárquico
7
4
  * (trace < debug < info < warn < error < critical)
8
5
  *
@@ -31,4 +28,4 @@ const LOG_LEVELS = {
31
28
  //#endregion
32
29
  export { LOG_LEVELS as t };
33
30
 
34
- //# sourceMappingURL=core-PoT7RrTK.js.map
31
+ //# sourceMappingURL=core-Blfi2klP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core-Blfi2klP.js","names":[],"sources":["../../src/types/core.ts"],"sourcesContent":["/**\n * Niveles de log soportados en orden jerárquico\n * (trace < debug < info < warn < error < critical)\n *\n * @constant {Object} LOG_LEVELS\n * @property {number} trace - Nivel -1: Trazas muy verbosas (alineado con OTel TRACE severity 1-4)\n * @property {number} debug - Nivel 0: Información de depuración detallada\n * @property {number} info - Nivel 1: Mensajes informativos generales\n * @property {number} warn - Nivel 2: Advertencias que no detienen la ejecución\n * @property {number} error - Nivel 3: Errores que pueden afectar funcionalidad\n * @property {number} critical - Nivel 4: Errores críticos que requieren atención inmediata\n *\n * @example\n * // Verificar si un nivel debe mostrarse\n * if (LOG_LEVELS[currentLevel] >= LOG_LEVELS.warn) {\n * // Mostrar solo warn, error y critical\n * }\n */\nexport const LOG_LEVELS = {\n trace: -1,\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n critical: 4,\n} as const;\n\n/**\n * Tipo de nivel de log derivado de las claves de LOG_LEVELS\n * @typedef {'trace' | 'debug' | 'info' | 'warn' | 'error' | 'critical'} LogLevel\n */\nexport type LogLevel = keyof typeof LOG_LEVELS;\n\n/**\n * Tag especial de \"nivel\" usado por `success()` — mapea a severidad INFO de OTel.\n * Vive fuera del union `LogLevel` estándar para que las comparaciones internas\n * de nivel (trace < debug < info < warn < error < critical) no se vean alteradas.\n */\nexport const SUCCESS_LEVEL = 'success' as const;\n\n/**\n * Tags aceptados por la familia `log()` y los métodos visuales (`success()`\n * emite a severidad INFO pero usa styling de success). Útil para transports\n * que necesitan distinguir \"success\" de logs info genéricos.\n */\nexport type LogTag = LogLevel | typeof SUCCESS_LEVEL;\n\n/**\n * Tipo de nivel de verbosidad para filtrar logs\n * @typedef {LogLevel | 'silent'} Verbosity\n * @description 'silent' desactiva completamente todos los logs\n */\nexport type Verbosity = LogLevel | 'silent';\n\n/**\n * Variantes de tema para diferentes estilos visuales\n * @typedef {'default' | 'dark' | 'light' | 'neon' | 'minimal' | 'cyberpunk'} ThemeVariant\n * \n * @description\n * - default: Tema adaptativo automático (claro/oscuro)\n * - dark: Tema oscuro con colores vibrantes\n * - light: Tema claro con colores suaves\n * - neon: Colores neón brillantes con efectos de resplandor\n * - minimal: Diseño minimalista y limpio\n * - cyberpunk: Estilo futurista con neón y efectos\n */\nexport type ThemeVariant = 'default' | 'dark' | 'light' | 'neon' | 'minimal' | 'cyberpunk';\n\n/**\n * Detección de tema de DevTools del navegador\n * @typedef {'light' | 'dark'} DevToolsTheme\n */\nexport type DevToolsTheme = 'light' | 'dark';\n\n/**\n * Tipos de banner para diferentes enfoques visuales\n * @typedef {'simple' | 'ascii' | 'unicode' | 'svg' | 'animated'} BannerType\n * \n * @description\n * - simple: Texto simple sin decoración\n * - ascii: Arte ASCII tradicional\n * - unicode: Caracteres Unicode decorativos\n * - svg: Gráfico SVG embebido\n * - animated: Banner con animación CSS\n */\nexport type BannerType = 'simple' | 'ascii' | 'unicode' | 'svg' | 'animated';\n\n/**\n * Formatos de exportación para datos de log\n * @typedef {'json' | 'csv' | 'markdown' | 'plain' | 'html'} ExportFormat\n *\n * @description\n * - json: Formato JSON estructurado\n * - csv: Valores separados por comas para Excel/Sheets\n * - markdown: Formato Markdown para documentación\n * - plain: Texto plano sin formato\n * - html: HTML con estilos para visualización web\n */\nexport type ExportFormat = 'json' | 'csv' | 'markdown' | 'plain' | 'html';\n\n/**\n * Formatos de salida para diferentes entornos\n * @typedef {'auto' | 'plain' | 'ansi' | 'build' | 'ci'} OutputFormat\n *\n * @description\n * - auto: Detección automática basada en entorno (recomendado)\n * - plain: Texto plano sin colores (máxima compatibilidad)\n * - ansi: Colores ANSI para terminales modernos\n * - build: Formato optimizado para builds (Next.js, webpack, etc.)\n * - ci: Formato optimizado para CI/CD (sin emojis, texto simple)\n */\nexport type OutputFormat = 'auto' | 'plain' | 'ansi' | 'build' | 'ci';\n\n/**\n * Modos de output para controlar dónde se escriben los logs.\n * @typedef {'console' | 'silent' | 'custom'} OutputMode\n *\n * @description\n * - console: Output estándar vía `console.log` (default)\n * - silent: Sin output\n * - custom: Usa un `OutputWriter` custom para escenarios avanzados\n */\nexport type OutputMode = 'console' | 'silent' | 'custom';\n\n/**\n * Interfaz de output writer custom para redirigir el output de logs.\n *\n * @interface OutputWriter\n *\n * @description\n * Permite redirigir el output de logs a destinos custom como:\n * - DraftLog para CLI spinners con logging concurrente\n * - Buffers para colectar logs durante operaciones\n * - Streams o transports custom\n *\n * @example\n * class BufferWriter implements OutputWriter {\n * private buffer: string[] = [];\n *\n * write(message: string, level: LogLevel, styles: string[]): void {\n * this.buffer.push(message);\n * }\n *\n * flush(): void {\n * this.buffer.forEach(msg => console.log(msg));\n * this.buffer = [];\n * }\n * }\n */\nexport interface OutputWriter {\n write(message: string, level: LogLevel, styles: string[]): void;\n flush?(): void;\n}\n\n/**\n * Shape mínima de recurso OTel — duplicada aquí para evitar un import\n * circular con `./transports.js`. El `ILogResource` canónico vive en\n * `./transports.js`; ambos shapes se mantienen sincronizados vía el\n * contrato público (service.name + version opcional + environment opcional).\n */\nexport interface ILogResourceRef {\n 'service.name': string;\n 'service.version'?: string;\n 'deployment.environment'?: string;\n [key: string]: string | undefined;\n}\n\n/**\n * Configuración de una instancia de `Logger`. Los campos booleanos activan\n * o desactivan features visuales (colores, timestamps, stack traces); los\n * campos selectores controlan tema, banner y formato de salida. Todos los\n * campos son opcionales salvo `verbosity`, `enableColors` y\n * `enableTimestamps`, que el constructor del logger rellena desde\n * `DEFAULT_CONFIG` cuando no se proveen.\n *\n * @example\n * const config: LoggerConfig = {\n * globalPrefix: 'MiApp',\n * verbosity: 'info',\n * enableColors: true,\n * enableTimestamps: true,\n * enableStackTrace: false,\n * theme: 'cyberpunk',\n * bannerType: 'animated',\n * bufferSize: 500,\n * autoDetectTheme: true\n * };\n */\nexport interface LoggerConfig {\n globalPrefix?: string;\n verbosity: Verbosity;\n enableColors: boolean;\n enableTimestamps: boolean;\n enableStackTrace: boolean;\n theme?: ThemeVariant;\n bannerType?: BannerType;\n bufferSize?: number;\n autoDetectTheme?: boolean;\n outputFormat?: OutputFormat;\n /** Modo de output: 'console' (default), 'silent' o 'custom'. */\n outputMode?: OutputMode;\n /** Writer custom cuando outputMode es 'custom'. */\n outputWriter?: OutputWriter;\n /** Nivel de verbosidad CLI para controlar el output primitivo. */\n cliLevel?: CLILogLevel;\n /**\n * Recurso OTel por defecto adjuntado a cada record que no lo sobreescriba.\n * Se setea una vez por proceso (service.name, service.version, deployment.environment).\n */\n resource?: Partial<ILogResourceRef>;\n}\n\n/**\n * Información parseada del stack trace\n * \n * @interface StackInfo\n * @description Contiene la ubicación exacta donde se originó el log\n */\nexport interface StackInfo {\n file: string;\n line: number;\n column: number;\n function?: string;\n}\n\n/**\n * Entrada de temporizador para medición de rendimiento\n * \n * @interface TimerEntry\n * @description Usado internamente para rastrear temporizadores activos\n */\nexport interface TimerEntry {\n label: string;\n startTime: number;\n}\n\n/**\n * Opciones para estilizar componentes\n * \n * @interface StyleOptions\n * @description Configuración de dimensiones y espaciado para elementos visuales\n */\nexport interface StyleOptions {\n width?: number;\n height?: number;\n padding?: string;\n}\n\n/**\n * Configuración de colores adaptativos para temas claro/oscuro\n * \n * @interface AdaptiveColors\n * @description Define colores que se ajustan automáticamente al tema del navegador\n */\nexport interface AdaptiveColors {\n light: string;\n dark: string;\n}\n\n/**\n * Configuración de espaciado para elementos del log\n * @typedef {'compact' | 'normal' | 'spacious'} SpacingType\n * \n * @description\n * - compact: Espaciado mínimo para más densidad\n * - normal: Espaciado estándar balanceado\n * - spacious: Espaciado amplio para mejor legibilidad\n */\nexport type SpacingType = 'compact' | 'normal' | 'spacious';\n\n/**\n * Layout de la línea de log: spacing entre elementos, padding interior,\n * margen externo y separador entre partes. Lo consume el renderer para\n * estructurar la salida visual.\n *\n * @interface LogLayout\n */\nexport interface LogLayout {\n spacing: SpacingType;\n innerPadding?: string;\n outerMargin?: string;\n separator?: string;\n}\n\n/**\n * Estilo de un elemento individual del log (timestamp, level, prefix,\n * mensaje, location). Cada campo es opcional y se aplica solo al elemento\n * seleccionado sin tocar el resto de la línea.\n *\n * @interface LogPartConfig\n *\n * @example\n * const timestampConfig: LogPartConfig = {\n * show: true,\n * color: '#888',\n * font: 'Monaco',\n * size: '11px'\n * };\n */\nexport interface LogPartConfig {\n show?: boolean;\n style?: string;\n font?: string;\n size?: string;\n color?: string; // Adaptativo por defecto\n background?: string;\n padding?: string;\n margin?: string;\n border?: string;\n shadow?: string;\n uppercase?: boolean;\n}\n\n/**\n * Estilos globales del log: layout, configuración por elemento (timestamp,\n * level, prefix, mensaje, location) y props visuales de fondo (backdrop,\n * transparency).\n *\n * @interface LogStyles\n */\nexport interface LogStyles {\n layout?: LogLayout;\n timestamp?: LogPartConfig;\n level?: LogPartConfig;\n prefix?: LogPartConfig;\n message?: LogPartConfig;\n location?: LogPartConfig;\n backdrop?: string;\n transparency?: number;\n}\n\n/**\n * Resultado de un timer completado. Lo retorna internamente `Logger.timeEnd`\n * y lo pasan los hooks en `extra` para mediciones de rendimiento.\n *\n * @property label - Etiqueta con la que se registró el timer vía `time(label)`.\n * @property duration - Milisegundos transcurridos entre `startTime` y `endTime`.\n * @property startTime - Marca temporal de inicio (`performance.now()` o `Date.now()`).\n * @property endTime - Marca temporal de fin.\n */\nexport interface TimerResult {\n label: string;\n duration: number;\n startTime: number;\n endTime: number;\n}\n\n/**\n * Contrato del logger retornado por los factory de scope (`Logger.component`,\n * `Logger.scope`). Expone los métodos de log por nivel más una API fluida\n * para badges, timers y estilos.\n *\n * Los métodos de log (`debug`, `info`, ...) devuelven `void`; los métodos de\n * configuración (`badges`, `badge`, `clearBadges`, `style`) devuelven `this`\n * para permitir encadenamiento.\n *\n * @example\n * const auth = logger.component('Auth');\n * auth.badge('JWT').info('Token validado');\n * auth.style('cyberpunk').success('Login OK');\n */\nexport interface IScopedLogger {\n debug(...args: any[]): void;\n info(...args: any[]): void;\n warn(...args: any[]): void;\n error(...args: any[]): void;\n success(...args: any[]): void;\n critical(...args: any[]): void;\n trace(...args: any[]): void;\n\n badges(badges: string[]): this;\n badge(badge: string): this;\n clearBadges(): this;\n\n time(label: string): void;\n timeEnd(label: string): number | undefined;\n\n style(presetName: string): this;\n}\n\n/**\n * Logger especializado para servicios API. Extiende {@link IScopedLogger} con\n * verbosidades específicas de backend: latencia (`slow`), rate limiting\n * (`rateLimit`), fallos de credenciales (`auth`) y endpoints legacy\n * (`deprecated`).\n */\nexport interface IAPILogger extends IScopedLogger {\n slow(message: string, duration?: number): void;\n rateLimit(message: string): void;\n auth(message: string): void;\n deprecated(message: string): void;\n}\n\n/**\n * Logger especializado para componentes UI. Extiende {@link IScopedLogger}\n * con verbosidades de lifecycle: montaje/desmontaje (`lifecycle`), cambios\n * de estado (`stateChange`) y diffs de props (`propsChange`). Útil para\n * depurar re-renders y flujos de componentes sin inundar el log de ruido.\n */\nexport interface IComponentLogger extends IScopedLogger {\n lifecycle(event: string, message?: string): void;\n stateChange(from: string, to: string, data?: any): void;\n propsChange(changes: Record<string, any>): void;\n}\n\n/**\n * Bindings inmutables que viajan con un logger scoped/child. Definen la\n * \"identidad\" del logger para filtrado, agrupación y atribución en\n * transports. Se propagan a través de `child()` y se merguean al construir\n * el {@link TransportRecord} que reciben los transports.\n *\n * @property scope - Etiqueta lógica del scope (p.ej. `\"Auth\"`, `\"API:Users\"`).\n * @property badges - Lista de badges a renderizar junto al mensaje.\n * @property type - Categoría del logger: `'scope'` (genérico), `'api'` (verbosidades HTTP), `'component'` (UI lifecycle).\n * @property context - Cadena jerárquica de contexto (parent → child) para traces anidados.\n */\nexport interface Bindings {\n scope?: string;\n badges?: string[];\n type?: 'scope' | 'api' | 'component';\n context?: string[];\n}\n\n/**\n * Estilo visual del wrapper de un badge.\n *\n * - `'brackets'` — `[badge]`\n * - `'rounded'` — `(badge)`\n * - `'plain'` — `badge` (sin wrapper)\n * - `'unicode'` — `「badge」`\n * - `'pill'` — badge con fondo redondeado estilo pill (CSS)\n */\nexport type BadgeStyle = 'brackets' | 'rounded' | 'plain' | 'unicode' | 'pill';\n\n/**\n * Formato de renderizado del timestamp en la línea de log.\n *\n * - `'iso'` — `2026-07-05T12:34:56.789Z` (default, sortable)\n * - `'time'` — `12:34:56`\n * - `'timeMs'` — `12:34:56.789`\n * - `'relative'` — tiempo relativo al momento de carga del logger\n * - `'elapsed'` — `+1.2s` transcurrido desde el primer log de la sesión\n * - `'date'` — `2026-07-05 12:34:56` (local)\n * - `'custom'` — delega al formateador custom registrado en el logger\n */\nexport type TimestampFormat = 'iso' | 'time' | 'timeMs' | 'relative' | 'elapsed' | 'date' | 'custom';\n\n/**\n * Alineación horizontal de una celda dentro de una columna de\n * `Logger.cliTable`.\n */\nexport type ColumnAlign = 'left' | 'right' | 'center';\n\n/**\n * Definición de una columna para `Logger.cliTable`. `content` es la fuente\n * del valor (clave del row o string fijo); los demás campos controlan layout\n * y color.\n *\n * @property content - Clave del row a renderizar, o string fijo para todas las filas.\n * @property width - Ancho fijo en caracteres; si se omite, se auto-detecta del contenido.\n * @property align - Alineación del contenido dentro de la celda.\n * @property color - Color del texto (hex, nombre CSS o nombre ANSI).\n */\nexport interface ColumnConfig {\n content: string;\n width?: number;\n align?: ColumnAlign;\n color?: string;\n}\n\n/**\n * Opciones de presentación aplicables a un log individual. Controlan layout\n * multi-columna, ancho máximo, modo clave-valor, estilo de badge y formato\n * de timestamp — todo sin alterar el `LoggerConfig` global del logger.\n *\n * @property rightAlign - Texto alineado a la derecha del mensaje principal (p.ej. duración).\n * @property columns - Definición de columnas para modo tabla.\n * @property maxWidth - Ancho máximo del mensaje antes de truncar/wrap.\n * @property keyValue - Si `true`, renderiza los argumentos como `clave: valor`.\n * @property badgeStyle - Override del estilo de badge para esta entrada.\n * @property timestampFormat - Override del formato de timestamp para esta entrada.\n */\nexport interface LogOptions {\n rightAlign?: string;\n columns?: ColumnConfig[];\n maxWidth?: number;\n keyValue?: boolean;\n badgeStyle?: BadgeStyle;\n timestampFormat?: TimestampFormat;\n}\n\n// ===== CLI PRIMITIVES =====\n\n/**\n * Niveles de verbosidad CLI para controlar el output primitivo.\n */\nexport type CLILogLevel = 'silent' | 'quiet' | 'normal' | 'verbose' | 'debug';\n\n/**\n * Handle retornado por `logger.spinner()` para controlar el ciclo de vida\n * del spinner.\n */\nexport interface ISpinnerHandle {\n /** Arranca la animación del spinner. */\n start(): void;\n /** Detiene el spinner sin mensaje de status. */\n stop(): void;\n /** Detiene el spinner con un mensaje de success. */\n succeed(msg?: string): void;\n /** Detiene el spinner con un mensaje de failure. */\n fail(msg?: string): void;\n /** Actualiza el texto del spinner mientras corre. */\n text(msg: string): void;\n}\n\n/**\n * Opciones para el output de `logger.box()`.\n */\nexport interface IBoxOptions {\n /** Título mostrado en el borde superior. */\n title?: string;\n /** Color del borde (hex, nombre CSS o nombre ANSI). */\n borderColor?: string;\n /** Estilo de caracteres del borde. */\n borderStyle?: 'single' | 'double' | 'rounded' | 'bold';\n /** Líneas de padding interior (default: 0). */\n padding?: number;\n}\n\n/**\n * Opciones para el output de `logger.cliTable()`.\n */\nexport interface ITableOptions {\n /** Nombres de columnas a mostrar (sobreescribe la auto-detección). */\n columns?: string[];\n /** Labels del header (default: nombres de columnas). */\n head?: string[];\n}"],"mappings":";;;;;;;;;;;;;;;;;;;AAkBA,MAAa,aAAa;CACtB,OAAO;CACP,OAAO;CACP,MAAM;CACN,MAAM;CACN,OAAO;CACP,UAAU;AACd"}
@@ -1,8 +1,5 @@
1
1
  //#region src/types/core.ts
2
2
  /**
3
- * @fileoverview Definiciones de tipos principales para Better Logger
4
- */
5
- /**
6
3
  * Niveles de log soportados en orden jerárquico
7
4
  * (trace < debug < info < warn < error < critical)
8
5
  *
@@ -36,4 +33,4 @@ Object.defineProperty(exports, "LOG_LEVELS", {
36
33
  }
37
34
  });
38
35
 
39
- //# sourceMappingURL=core-Dzz7agGa.cjs.map
36
+ //# sourceMappingURL=core-CqS_UBzJ.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core-CqS_UBzJ.cjs","names":[],"sources":["../../src/types/core.ts"],"sourcesContent":["/**\n * Niveles de log soportados en orden jerárquico\n * (trace < debug < info < warn < error < critical)\n *\n * @constant {Object} LOG_LEVELS\n * @property {number} trace - Nivel -1: Trazas muy verbosas (alineado con OTel TRACE severity 1-4)\n * @property {number} debug - Nivel 0: Información de depuración detallada\n * @property {number} info - Nivel 1: Mensajes informativos generales\n * @property {number} warn - Nivel 2: Advertencias que no detienen la ejecución\n * @property {number} error - Nivel 3: Errores que pueden afectar funcionalidad\n * @property {number} critical - Nivel 4: Errores críticos que requieren atención inmediata\n *\n * @example\n * // Verificar si un nivel debe mostrarse\n * if (LOG_LEVELS[currentLevel] >= LOG_LEVELS.warn) {\n * // Mostrar solo warn, error y critical\n * }\n */\nexport const LOG_LEVELS = {\n trace: -1,\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n critical: 4,\n} as const;\n\n/**\n * Tipo de nivel de log derivado de las claves de LOG_LEVELS\n * @typedef {'trace' | 'debug' | 'info' | 'warn' | 'error' | 'critical'} LogLevel\n */\nexport type LogLevel = keyof typeof LOG_LEVELS;\n\n/**\n * Tag especial de \"nivel\" usado por `success()` — mapea a severidad INFO de OTel.\n * Vive fuera del union `LogLevel` estándar para que las comparaciones internas\n * de nivel (trace < debug < info < warn < error < critical) no se vean alteradas.\n */\nexport const SUCCESS_LEVEL = 'success' as const;\n\n/**\n * Tags aceptados por la familia `log()` y los métodos visuales (`success()`\n * emite a severidad INFO pero usa styling de success). Útil para transports\n * que necesitan distinguir \"success\" de logs info genéricos.\n */\nexport type LogTag = LogLevel | typeof SUCCESS_LEVEL;\n\n/**\n * Tipo de nivel de verbosidad para filtrar logs\n * @typedef {LogLevel | 'silent'} Verbosity\n * @description 'silent' desactiva completamente todos los logs\n */\nexport type Verbosity = LogLevel | 'silent';\n\n/**\n * Variantes de tema para diferentes estilos visuales\n * @typedef {'default' | 'dark' | 'light' | 'neon' | 'minimal' | 'cyberpunk'} ThemeVariant\n * \n * @description\n * - default: Tema adaptativo automático (claro/oscuro)\n * - dark: Tema oscuro con colores vibrantes\n * - light: Tema claro con colores suaves\n * - neon: Colores neón brillantes con efectos de resplandor\n * - minimal: Diseño minimalista y limpio\n * - cyberpunk: Estilo futurista con neón y efectos\n */\nexport type ThemeVariant = 'default' | 'dark' | 'light' | 'neon' | 'minimal' | 'cyberpunk';\n\n/**\n * Detección de tema de DevTools del navegador\n * @typedef {'light' | 'dark'} DevToolsTheme\n */\nexport type DevToolsTheme = 'light' | 'dark';\n\n/**\n * Tipos de banner para diferentes enfoques visuales\n * @typedef {'simple' | 'ascii' | 'unicode' | 'svg' | 'animated'} BannerType\n * \n * @description\n * - simple: Texto simple sin decoración\n * - ascii: Arte ASCII tradicional\n * - unicode: Caracteres Unicode decorativos\n * - svg: Gráfico SVG embebido\n * - animated: Banner con animación CSS\n */\nexport type BannerType = 'simple' | 'ascii' | 'unicode' | 'svg' | 'animated';\n\n/**\n * Formatos de exportación para datos de log\n * @typedef {'json' | 'csv' | 'markdown' | 'plain' | 'html'} ExportFormat\n *\n * @description\n * - json: Formato JSON estructurado\n * - csv: Valores separados por comas para Excel/Sheets\n * - markdown: Formato Markdown para documentación\n * - plain: Texto plano sin formato\n * - html: HTML con estilos para visualización web\n */\nexport type ExportFormat = 'json' | 'csv' | 'markdown' | 'plain' | 'html';\n\n/**\n * Formatos de salida para diferentes entornos\n * @typedef {'auto' | 'plain' | 'ansi' | 'build' | 'ci'} OutputFormat\n *\n * @description\n * - auto: Detección automática basada en entorno (recomendado)\n * - plain: Texto plano sin colores (máxima compatibilidad)\n * - ansi: Colores ANSI para terminales modernos\n * - build: Formato optimizado para builds (Next.js, webpack, etc.)\n * - ci: Formato optimizado para CI/CD (sin emojis, texto simple)\n */\nexport type OutputFormat = 'auto' | 'plain' | 'ansi' | 'build' | 'ci';\n\n/**\n * Modos de output para controlar dónde se escriben los logs.\n * @typedef {'console' | 'silent' | 'custom'} OutputMode\n *\n * @description\n * - console: Output estándar vía `console.log` (default)\n * - silent: Sin output\n * - custom: Usa un `OutputWriter` custom para escenarios avanzados\n */\nexport type OutputMode = 'console' | 'silent' | 'custom';\n\n/**\n * Interfaz de output writer custom para redirigir el output de logs.\n *\n * @interface OutputWriter\n *\n * @description\n * Permite redirigir el output de logs a destinos custom como:\n * - DraftLog para CLI spinners con logging concurrente\n * - Buffers para colectar logs durante operaciones\n * - Streams o transports custom\n *\n * @example\n * class BufferWriter implements OutputWriter {\n * private buffer: string[] = [];\n *\n * write(message: string, level: LogLevel, styles: string[]): void {\n * this.buffer.push(message);\n * }\n *\n * flush(): void {\n * this.buffer.forEach(msg => console.log(msg));\n * this.buffer = [];\n * }\n * }\n */\nexport interface OutputWriter {\n write(message: string, level: LogLevel, styles: string[]): void;\n flush?(): void;\n}\n\n/**\n * Shape mínima de recurso OTel — duplicada aquí para evitar un import\n * circular con `./transports.js`. El `ILogResource` canónico vive en\n * `./transports.js`; ambos shapes se mantienen sincronizados vía el\n * contrato público (service.name + version opcional + environment opcional).\n */\nexport interface ILogResourceRef {\n 'service.name': string;\n 'service.version'?: string;\n 'deployment.environment'?: string;\n [key: string]: string | undefined;\n}\n\n/**\n * Configuración de una instancia de `Logger`. Los campos booleanos activan\n * o desactivan features visuales (colores, timestamps, stack traces); los\n * campos selectores controlan tema, banner y formato de salida. Todos los\n * campos son opcionales salvo `verbosity`, `enableColors` y\n * `enableTimestamps`, que el constructor del logger rellena desde\n * `DEFAULT_CONFIG` cuando no se proveen.\n *\n * @example\n * const config: LoggerConfig = {\n * globalPrefix: 'MiApp',\n * verbosity: 'info',\n * enableColors: true,\n * enableTimestamps: true,\n * enableStackTrace: false,\n * theme: 'cyberpunk',\n * bannerType: 'animated',\n * bufferSize: 500,\n * autoDetectTheme: true\n * };\n */\nexport interface LoggerConfig {\n globalPrefix?: string;\n verbosity: Verbosity;\n enableColors: boolean;\n enableTimestamps: boolean;\n enableStackTrace: boolean;\n theme?: ThemeVariant;\n bannerType?: BannerType;\n bufferSize?: number;\n autoDetectTheme?: boolean;\n outputFormat?: OutputFormat;\n /** Modo de output: 'console' (default), 'silent' o 'custom'. */\n outputMode?: OutputMode;\n /** Writer custom cuando outputMode es 'custom'. */\n outputWriter?: OutputWriter;\n /** Nivel de verbosidad CLI para controlar el output primitivo. */\n cliLevel?: CLILogLevel;\n /**\n * Recurso OTel por defecto adjuntado a cada record que no lo sobreescriba.\n * Se setea una vez por proceso (service.name, service.version, deployment.environment).\n */\n resource?: Partial<ILogResourceRef>;\n}\n\n/**\n * Información parseada del stack trace\n * \n * @interface StackInfo\n * @description Contiene la ubicación exacta donde se originó el log\n */\nexport interface StackInfo {\n file: string;\n line: number;\n column: number;\n function?: string;\n}\n\n/**\n * Entrada de temporizador para medición de rendimiento\n * \n * @interface TimerEntry\n * @description Usado internamente para rastrear temporizadores activos\n */\nexport interface TimerEntry {\n label: string;\n startTime: number;\n}\n\n/**\n * Opciones para estilizar componentes\n * \n * @interface StyleOptions\n * @description Configuración de dimensiones y espaciado para elementos visuales\n */\nexport interface StyleOptions {\n width?: number;\n height?: number;\n padding?: string;\n}\n\n/**\n * Configuración de colores adaptativos para temas claro/oscuro\n * \n * @interface AdaptiveColors\n * @description Define colores que se ajustan automáticamente al tema del navegador\n */\nexport interface AdaptiveColors {\n light: string;\n dark: string;\n}\n\n/**\n * Configuración de espaciado para elementos del log\n * @typedef {'compact' | 'normal' | 'spacious'} SpacingType\n * \n * @description\n * - compact: Espaciado mínimo para más densidad\n * - normal: Espaciado estándar balanceado\n * - spacious: Espaciado amplio para mejor legibilidad\n */\nexport type SpacingType = 'compact' | 'normal' | 'spacious';\n\n/**\n * Layout de la línea de log: spacing entre elementos, padding interior,\n * margen externo y separador entre partes. Lo consume el renderer para\n * estructurar la salida visual.\n *\n * @interface LogLayout\n */\nexport interface LogLayout {\n spacing: SpacingType;\n innerPadding?: string;\n outerMargin?: string;\n separator?: string;\n}\n\n/**\n * Estilo de un elemento individual del log (timestamp, level, prefix,\n * mensaje, location). Cada campo es opcional y se aplica solo al elemento\n * seleccionado sin tocar el resto de la línea.\n *\n * @interface LogPartConfig\n *\n * @example\n * const timestampConfig: LogPartConfig = {\n * show: true,\n * color: '#888',\n * font: 'Monaco',\n * size: '11px'\n * };\n */\nexport interface LogPartConfig {\n show?: boolean;\n style?: string;\n font?: string;\n size?: string;\n color?: string; // Adaptativo por defecto\n background?: string;\n padding?: string;\n margin?: string;\n border?: string;\n shadow?: string;\n uppercase?: boolean;\n}\n\n/**\n * Estilos globales del log: layout, configuración por elemento (timestamp,\n * level, prefix, mensaje, location) y props visuales de fondo (backdrop,\n * transparency).\n *\n * @interface LogStyles\n */\nexport interface LogStyles {\n layout?: LogLayout;\n timestamp?: LogPartConfig;\n level?: LogPartConfig;\n prefix?: LogPartConfig;\n message?: LogPartConfig;\n location?: LogPartConfig;\n backdrop?: string;\n transparency?: number;\n}\n\n/**\n * Resultado de un timer completado. Lo retorna internamente `Logger.timeEnd`\n * y lo pasan los hooks en `extra` para mediciones de rendimiento.\n *\n * @property label - Etiqueta con la que se registró el timer vía `time(label)`.\n * @property duration - Milisegundos transcurridos entre `startTime` y `endTime`.\n * @property startTime - Marca temporal de inicio (`performance.now()` o `Date.now()`).\n * @property endTime - Marca temporal de fin.\n */\nexport interface TimerResult {\n label: string;\n duration: number;\n startTime: number;\n endTime: number;\n}\n\n/**\n * Contrato del logger retornado por los factory de scope (`Logger.component`,\n * `Logger.scope`). Expone los métodos de log por nivel más una API fluida\n * para badges, timers y estilos.\n *\n * Los métodos de log (`debug`, `info`, ...) devuelven `void`; los métodos de\n * configuración (`badges`, `badge`, `clearBadges`, `style`) devuelven `this`\n * para permitir encadenamiento.\n *\n * @example\n * const auth = logger.component('Auth');\n * auth.badge('JWT').info('Token validado');\n * auth.style('cyberpunk').success('Login OK');\n */\nexport interface IScopedLogger {\n debug(...args: any[]): void;\n info(...args: any[]): void;\n warn(...args: any[]): void;\n error(...args: any[]): void;\n success(...args: any[]): void;\n critical(...args: any[]): void;\n trace(...args: any[]): void;\n\n badges(badges: string[]): this;\n badge(badge: string): this;\n clearBadges(): this;\n\n time(label: string): void;\n timeEnd(label: string): number | undefined;\n\n style(presetName: string): this;\n}\n\n/**\n * Logger especializado para servicios API. Extiende {@link IScopedLogger} con\n * verbosidades específicas de backend: latencia (`slow`), rate limiting\n * (`rateLimit`), fallos de credenciales (`auth`) y endpoints legacy\n * (`deprecated`).\n */\nexport interface IAPILogger extends IScopedLogger {\n slow(message: string, duration?: number): void;\n rateLimit(message: string): void;\n auth(message: string): void;\n deprecated(message: string): void;\n}\n\n/**\n * Logger especializado para componentes UI. Extiende {@link IScopedLogger}\n * con verbosidades de lifecycle: montaje/desmontaje (`lifecycle`), cambios\n * de estado (`stateChange`) y diffs de props (`propsChange`). Útil para\n * depurar re-renders y flujos de componentes sin inundar el log de ruido.\n */\nexport interface IComponentLogger extends IScopedLogger {\n lifecycle(event: string, message?: string): void;\n stateChange(from: string, to: string, data?: any): void;\n propsChange(changes: Record<string, any>): void;\n}\n\n/**\n * Bindings inmutables que viajan con un logger scoped/child. Definen la\n * \"identidad\" del logger para filtrado, agrupación y atribución en\n * transports. Se propagan a través de `child()` y se merguean al construir\n * el {@link TransportRecord} que reciben los transports.\n *\n * @property scope - Etiqueta lógica del scope (p.ej. `\"Auth\"`, `\"API:Users\"`).\n * @property badges - Lista de badges a renderizar junto al mensaje.\n * @property type - Categoría del logger: `'scope'` (genérico), `'api'` (verbosidades HTTP), `'component'` (UI lifecycle).\n * @property context - Cadena jerárquica de contexto (parent → child) para traces anidados.\n */\nexport interface Bindings {\n scope?: string;\n badges?: string[];\n type?: 'scope' | 'api' | 'component';\n context?: string[];\n}\n\n/**\n * Estilo visual del wrapper de un badge.\n *\n * - `'brackets'` — `[badge]`\n * - `'rounded'` — `(badge)`\n * - `'plain'` — `badge` (sin wrapper)\n * - `'unicode'` — `「badge」`\n * - `'pill'` — badge con fondo redondeado estilo pill (CSS)\n */\nexport type BadgeStyle = 'brackets' | 'rounded' | 'plain' | 'unicode' | 'pill';\n\n/**\n * Formato de renderizado del timestamp en la línea de log.\n *\n * - `'iso'` — `2026-07-05T12:34:56.789Z` (default, sortable)\n * - `'time'` — `12:34:56`\n * - `'timeMs'` — `12:34:56.789`\n * - `'relative'` — tiempo relativo al momento de carga del logger\n * - `'elapsed'` — `+1.2s` transcurrido desde el primer log de la sesión\n * - `'date'` — `2026-07-05 12:34:56` (local)\n * - `'custom'` — delega al formateador custom registrado en el logger\n */\nexport type TimestampFormat = 'iso' | 'time' | 'timeMs' | 'relative' | 'elapsed' | 'date' | 'custom';\n\n/**\n * Alineación horizontal de una celda dentro de una columna de\n * `Logger.cliTable`.\n */\nexport type ColumnAlign = 'left' | 'right' | 'center';\n\n/**\n * Definición de una columna para `Logger.cliTable`. `content` es la fuente\n * del valor (clave del row o string fijo); los demás campos controlan layout\n * y color.\n *\n * @property content - Clave del row a renderizar, o string fijo para todas las filas.\n * @property width - Ancho fijo en caracteres; si se omite, se auto-detecta del contenido.\n * @property align - Alineación del contenido dentro de la celda.\n * @property color - Color del texto (hex, nombre CSS o nombre ANSI).\n */\nexport interface ColumnConfig {\n content: string;\n width?: number;\n align?: ColumnAlign;\n color?: string;\n}\n\n/**\n * Opciones de presentación aplicables a un log individual. Controlan layout\n * multi-columna, ancho máximo, modo clave-valor, estilo de badge y formato\n * de timestamp — todo sin alterar el `LoggerConfig` global del logger.\n *\n * @property rightAlign - Texto alineado a la derecha del mensaje principal (p.ej. duración).\n * @property columns - Definición de columnas para modo tabla.\n * @property maxWidth - Ancho máximo del mensaje antes de truncar/wrap.\n * @property keyValue - Si `true`, renderiza los argumentos como `clave: valor`.\n * @property badgeStyle - Override del estilo de badge para esta entrada.\n * @property timestampFormat - Override del formato de timestamp para esta entrada.\n */\nexport interface LogOptions {\n rightAlign?: string;\n columns?: ColumnConfig[];\n maxWidth?: number;\n keyValue?: boolean;\n badgeStyle?: BadgeStyle;\n timestampFormat?: TimestampFormat;\n}\n\n// ===== CLI PRIMITIVES =====\n\n/**\n * Niveles de verbosidad CLI para controlar el output primitivo.\n */\nexport type CLILogLevel = 'silent' | 'quiet' | 'normal' | 'verbose' | 'debug';\n\n/**\n * Handle retornado por `logger.spinner()` para controlar el ciclo de vida\n * del spinner.\n */\nexport interface ISpinnerHandle {\n /** Arranca la animación del spinner. */\n start(): void;\n /** Detiene el spinner sin mensaje de status. */\n stop(): void;\n /** Detiene el spinner con un mensaje de success. */\n succeed(msg?: string): void;\n /** Detiene el spinner con un mensaje de failure. */\n fail(msg?: string): void;\n /** Actualiza el texto del spinner mientras corre. */\n text(msg: string): void;\n}\n\n/**\n * Opciones para el output de `logger.box()`.\n */\nexport interface IBoxOptions {\n /** Título mostrado en el borde superior. */\n title?: string;\n /** Color del borde (hex, nombre CSS o nombre ANSI). */\n borderColor?: string;\n /** Estilo de caracteres del borde. */\n borderStyle?: 'single' | 'double' | 'rounded' | 'bold';\n /** Líneas de padding interior (default: 0). */\n padding?: number;\n}\n\n/**\n * Opciones para el output de `logger.cliTable()`.\n */\nexport interface ITableOptions {\n /** Nombres de columnas a mostrar (sobreescribe la auto-detección). */\n columns?: string[];\n /** Labels del header (default: nombres de columnas). */\n head?: string[];\n}"],"mappings":";;;;;;;;;;;;;;;;;;;AAkBA,MAAa,aAAa;CACtB,OAAO;CACP,OAAO;CACP,MAAM;CACN,MAAM;CACN,OAAO;CACP,UAAU;AACd"}
@@ -1,14 +1,14 @@
1
1
  //#region src/utils/environment-detector.ts
2
2
  /**
3
- * Checks if running in Node.js environment
3
+ * Comprueba si se ejecuta en entorno Node.js
4
4
  */
5
5
  const isNode = typeof process !== "undefined" && process.versions && process.versions.node;
6
6
  /**
7
- * Checks if running in browser environment
7
+ * Comprueba si se ejecuta en entorno browser
8
8
  */
9
9
  const isBrowser = typeof window !== "undefined" && typeof document !== "undefined";
10
10
  /**
11
- * Main environment detection function
11
+ * Función principal de detección de entorno
12
12
  */
13
13
  function getEnvironment() {
14
14
  if (typeof globalThis !== "undefined" && globalThis.Deno) return "deno";
@@ -21,7 +21,7 @@ function getEnvironment() {
21
21
  return "unknown";
22
22
  }
23
23
  /**
24
- * Check if running in an interactive terminal
24
+ * Comprueba si se ejecuta en una terminal interactiva
25
25
  */
26
26
  function isRunningInTerminal() {
27
27
  if (typeof process === "undefined") return false;
@@ -43,7 +43,7 @@ function isRunningInTerminal() {
43
43
  return Boolean(isTTY || hasTerminalEnv || isTerminalProgram);
44
44
  }
45
45
  /**
46
- * Check if environment supports ANSI colors
46
+ * Comprueba si el entorno soporta colores ANSI
47
47
  */
48
48
  function supportsANSI() {
49
49
  const env = getEnvironment();
@@ -53,7 +53,7 @@ function supportsANSI() {
53
53
  return false;
54
54
  }
55
55
  /**
56
- * Check if server environment supports ANSI colors
56
+ * Comprueba si el entorno server soporta colores ANSI
57
57
  */
58
58
  function checkServerANSISupport() {
59
59
  if (typeof process === "undefined") return false;
@@ -61,7 +61,7 @@ function checkServerANSISupport() {
61
61
  return Boolean(supportsANSI);
62
62
  }
63
63
  /**
64
- * Get environment-specific color capability
64
+ * Obtiene la capacidad de color específica del entorno
65
65
  */
66
66
  function getColorCapability() {
67
67
  if (getEnvironment() === "browser") return "full";
@@ -74,21 +74,21 @@ function getColorCapability() {
74
74
  return "basic";
75
75
  }
76
76
  /**
77
- * Get terminal width in columns
77
+ * Obtiene el ancho de la terminal en columnas
78
78
  */
79
79
  function getTerminalWidth() {
80
80
  if (typeof process !== "undefined" && process.stdout?.columns) return process.stdout.columns;
81
81
  return 80;
82
82
  }
83
83
  /**
84
- * Get terminal height in rows
84
+ * Obtiene el alto de la terminal en filas
85
85
  */
86
86
  function getTerminalHeight() {
87
87
  if (typeof process !== "undefined" && process.stdout?.rows) return process.stdout.rows;
88
88
  return 24;
89
89
  }
90
90
  /**
91
- * Environment information for debugging
91
+ * Información del entorno para debugging
92
92
  */
93
93
  function getEnvironmentInfo() {
94
94
  return {
@@ -107,4 +107,4 @@ function getEnvironmentInfo() {
107
107
  //#endregion
108
108
  export { getTerminalWidth as a, isRunningInTerminal as c, getTerminalHeight as i, supportsANSI as l, getEnvironment as n, isBrowser as o, getEnvironmentInfo as r, isNode as s, getColorCapability as t };
109
109
 
110
- //# sourceMappingURL=environment-detector-CI3TrWK_.js.map
110
+ //# sourceMappingURL=environment-detector-7NvnYUfr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment-detector-7NvnYUfr.js","names":[],"sources":["../../src/utils/environment-detector.ts"],"sourcesContent":["/**\n * Detector de entorno — Detección robusta del entorno para el logger\n * Detecta entornos browser, terminal, server y otros runtime\n */\n\nexport type Environment = 'browser' | 'terminal' | 'server' | 'webworker' | 'deno' | 'unknown';\n\n/**\n * Comprueba si se ejecuta en entorno Node.js\n */\nexport const isNode = typeof process !== 'undefined' &&\n process.versions &&\n process.versions.node;\n\n/**\n * Comprueba si se ejecuta en entorno browser\n */\nexport const isBrowser = typeof window !== 'undefined' &&\n typeof document !== 'undefined';\n\n/**\n * Función principal de detección de entorno\n */\nexport function getEnvironment(): Environment {\n // Comprueba Deno primero\n if (typeof globalThis !== 'undefined' && (globalThis as any).Deno) {\n return 'deno';\n }\n\n // Comprueba WebWorker\n if (typeof window === 'undefined' && typeof self !== 'undefined' && typeof (self as any).importScripts === 'function') {\n return 'webworker';\n }\n\n // Comprueba Node.js (entorno server)\n if (typeof process !== 'undefined' && process.versions && process.versions.node) {\n // Determina si corre en una terminal o como server\n if (isRunningInTerminal()) {\n return 'terminal';\n }\n return 'server';\n }\n\n // Comprueba browser\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n return 'browser';\n }\n\n return 'unknown';\n}\n\n/**\n * Comprueba si se ejecuta en una terminal interactiva\n */\nexport function isRunningInTerminal(): boolean {\n // Comprueba indicadores comunes de terminal\n if (typeof process === 'undefined') return false;\n\n const isTTY = process.stdout && process.stdout.isTTY;\n const hasTerminalEnv = process.env && (\n process.env.TERM ||\n process.env.TERM_PROGRAM ||\n process.env.SSH_TTY ||\n process.env.TERM_SESSION_ID\n );\n\n // Comprueba si corre dentro de programas de terminal comunes\n const terminalPrograms = [\n 'vscode',\n 'hyper',\n 'iterm',\n 'terminal',\n 'alacritty',\n 'kitty',\n 'gnome-terminal',\n 'konsole',\n 'xterm',\n 'tmux',\n 'screen'\n ];\n\n const isTerminalProgram = hasTerminalEnv && terminalPrograms.some(program =>\n process.env.TERM_PROGRAM?.toLowerCase().includes(program) ||\n process.env.TERM?.toLowerCase().includes(program)\n );\n\n return Boolean(isTTY || hasTerminalEnv || isTerminalProgram);\n}\n\n/**\n * Comprueba si el entorno soporta colores ANSI\n */\nexport function supportsANSI(): boolean {\n const env = getEnvironment();\n\n if (env === 'browser') return false;\n if (env === 'terminal') return true;\n if (env === 'server') return checkServerANSISupport();\n\n return false;\n}\n\n/**\n * Comprueba si el entorno server soporta colores ANSI\n */\nfunction checkServerANSISupport(): boolean {\n if (typeof process === 'undefined') return false;\n\n // Comprueba variables de entorno comunes que indican soporte ANSI\n const supportsANSI = process.env && (\n process.env.COLORTERM ||\n process.env.FORCE_COLOR ||\n (process.env.TERM && process.env.TERM !== 'dumb') ||\n process.env.TERM_PROGRAM\n );\n\n return Boolean(supportsANSI);\n}\n\n/**\n * Obtiene la capacidad de color específica del entorno\n */\nexport function getColorCapability(): 'full' | 'basic' | 'none' {\n const env = getEnvironment();\n\n if (env === 'browser') {\n return 'full'; // Colores CSS\n }\n\n if (!supportsANSI()) {\n return 'none';\n }\n\n // Comprueba soporte de 256 colores o truecolor\n if (typeof process !== 'undefined' && process.env) {\n const hasTrueColor = process.env.COLORTERM === 'truecolor' || process.env.COLORTERM === '24bit';\n const has256Colors = process.env.TERM && process.env.TERM.includes('256');\n\n if (hasTrueColor || has256Colors) {\n return 'full';\n }\n }\n\n return 'basic'; // 16 colores básicos\n}\n\n/**\n * Obtiene el ancho de la terminal en columnas\n */\nexport function getTerminalWidth(): number {\n if (typeof process !== 'undefined' && process.stdout?.columns) {\n return process.stdout.columns;\n }\n return 80;\n}\n\n/**\n * Obtiene el alto de la terminal en filas\n */\nexport function getTerminalHeight(): number {\n if (typeof process !== 'undefined' && process.stdout?.rows) {\n return process.stdout.rows;\n }\n return 24;\n}\n\n/**\n * Información del entorno para debugging\n */\nexport function getEnvironmentInfo() {\n return {\n environment: getEnvironment(),\n supportsANSI: supportsANSI(),\n colorCapability: getColorCapability(),\n isTTY: typeof process !== 'undefined' ? Boolean(process.stdout?.isTTY) : false,\n platform: typeof process !== 'undefined' ? process.platform : 'unknown',\n nodeVersion: typeof process !== 'undefined' ? process.versions?.node : null,\n term: typeof process !== 'undefined' ? process.env?.TERM : null,\n colorTerm: typeof process !== 'undefined' ? process.env?.COLORTERM : null,\n terminalWidth: getTerminalWidth(),\n terminalHeight: getTerminalHeight()\n };\n}"],"mappings":";;;;AAUA,MAAa,SAAS,OAAO,YAAY,eACnB,QAAQ,YACR,QAAQ,SAAS;;;;AAKvC,MAAa,YAAY,OAAO,WAAW,eACjB,OAAO,aAAa;;;;AAK9C,SAAgB,iBAA8B;CAE1C,IAAI,OAAO,eAAe,eAAgB,WAAmB,MACzD,OAAO;CAIX,IAAI,OAAO,WAAW,eAAe,OAAO,SAAS,eAAe,OAAQ,KAAa,kBAAkB,YACvG,OAAO;CAIX,IAAI,OAAO,YAAY,eAAe,QAAQ,YAAY,QAAQ,SAAS,MAAM;EAE7E,IAAI,oBAAoB,GACpB,OAAO;EAEX,OAAO;CACX;CAGA,IAAI,OAAO,WAAW,eAAe,OAAO,aAAa,aACrD,OAAO;CAGX,OAAO;AACX;;;;AAKA,SAAgB,sBAA+B;CAE3C,IAAI,OAAO,YAAY,aAAa,OAAO;CAE3C,MAAM,QAAQ,QAAQ,UAAU,QAAQ,OAAO;CAC/C,MAAM,iBAAiB,QAAQ,QAC3B,QAAQ,IAAI,QACZ,QAAQ,IAAI,gBACZ,QAAQ,IAAI,WACZ,QAAQ,IAAI;CAkBhB,MAAM,oBAAoB,kBAAkB;EAbxC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CAGuD,CAAC,CAAC,MAAK,YAC9D,QAAQ,IAAI,cAAc,YAAY,CAAC,CAAC,SAAS,OAAO,KACxD,QAAQ,IAAI,MAAM,YAAY,CAAC,CAAC,SAAS,OAAO,CACpD;CAEA,OAAO,QAAQ,SAAS,kBAAkB,iBAAiB;AAC/D;;;;AAKA,SAAgB,eAAwB;CACpC,MAAM,MAAM,eAAe;CAE3B,IAAI,QAAQ,WAAW,OAAO;CAC9B,IAAI,QAAQ,YAAY,OAAO;CAC/B,IAAI,QAAQ,UAAU,OAAO,uBAAuB;CAEpD,OAAO;AACX;;;;AAKA,SAAS,yBAAkC;CACvC,IAAI,OAAO,YAAY,aAAa,OAAO;CAG3C,MAAM,eAAe,QAAQ,QACzB,QAAQ,IAAI,aACZ,QAAQ,IAAI,eACX,QAAQ,IAAI,QAAQ,QAAQ,IAAI,SAAS,UAC1C,QAAQ,IAAI;CAGhB,OAAO,QAAQ,YAAY;AAC/B;;;;AAKA,SAAgB,qBAAgD;CAG5D,IAFY,eAEN,MAAM,WACR,OAAO;CAGX,IAAI,CAAC,aAAa,GACd,OAAO;CAIX,IAAI,OAAO,YAAY,eAAe,QAAQ,KAAK;EAC/C,MAAM,eAAe,QAAQ,IAAI,cAAc,eAAe,QAAQ,IAAI,cAAc;EACxF,MAAM,eAAe,QAAQ,IAAI,QAAQ,QAAQ,IAAI,KAAK,SAAS,KAAK;EAExE,IAAI,gBAAgB,cAChB,OAAO;CAEf;CAEA,OAAO;AACX;;;;AAKA,SAAgB,mBAA2B;CACvC,IAAI,OAAO,YAAY,eAAe,QAAQ,QAAQ,SAClD,OAAO,QAAQ,OAAO;CAE1B,OAAO;AACX;;;;AAKA,SAAgB,oBAA4B;CACxC,IAAI,OAAO,YAAY,eAAe,QAAQ,QAAQ,MAClD,OAAO,QAAQ,OAAO;CAE1B,OAAO;AACX;;;;AAKA,SAAgB,qBAAqB;CACjC,OAAO;EACH,aAAa,eAAe;EAC5B,cAAc,aAAa;EAC3B,iBAAiB,mBAAmB;EACpC,OAAO,OAAO,YAAY,cAAc,QAAQ,QAAQ,QAAQ,KAAK,IAAI;EACzE,UAAU,OAAO,YAAY,cAAc,QAAQ,WAAW;EAC9D,aAAa,OAAO,YAAY,cAAc,QAAQ,UAAU,OAAO;EACvE,MAAM,OAAO,YAAY,cAAc,QAAQ,KAAK,OAAO;EAC3D,WAAW,OAAO,YAAY,cAAc,QAAQ,KAAK,YAAY;EACrE,eAAe,iBAAiB;EAChC,gBAAgB,kBAAkB;CACtC;AACJ"}
@@ -1,14 +1,14 @@
1
1
  //#region src/utils/environment-detector.ts
2
2
  /**
3
- * Checks if running in Node.js environment
3
+ * Comprueba si se ejecuta en entorno Node.js
4
4
  */
5
5
  const isNode = typeof process !== "undefined" && process.versions && process.versions.node;
6
6
  /**
7
- * Checks if running in browser environment
7
+ * Comprueba si se ejecuta en entorno browser
8
8
  */
9
9
  const isBrowser = typeof window !== "undefined" && typeof document !== "undefined";
10
10
  /**
11
- * Main environment detection function
11
+ * Función principal de detección de entorno
12
12
  */
13
13
  function getEnvironment() {
14
14
  if (typeof globalThis !== "undefined" && globalThis.Deno) return "deno";
@@ -21,7 +21,7 @@ function getEnvironment() {
21
21
  return "unknown";
22
22
  }
23
23
  /**
24
- * Check if running in an interactive terminal
24
+ * Comprueba si se ejecuta en una terminal interactiva
25
25
  */
26
26
  function isRunningInTerminal() {
27
27
  if (typeof process === "undefined") return false;
@@ -43,7 +43,7 @@ function isRunningInTerminal() {
43
43
  return Boolean(isTTY || hasTerminalEnv || isTerminalProgram);
44
44
  }
45
45
  /**
46
- * Check if environment supports ANSI colors
46
+ * Comprueba si el entorno soporta colores ANSI
47
47
  */
48
48
  function supportsANSI() {
49
49
  const env = getEnvironment();
@@ -53,7 +53,7 @@ function supportsANSI() {
53
53
  return false;
54
54
  }
55
55
  /**
56
- * Check if server environment supports ANSI colors
56
+ * Comprueba si el entorno server soporta colores ANSI
57
57
  */
58
58
  function checkServerANSISupport() {
59
59
  if (typeof process === "undefined") return false;
@@ -61,7 +61,7 @@ function checkServerANSISupport() {
61
61
  return Boolean(supportsANSI);
62
62
  }
63
63
  /**
64
- * Get environment-specific color capability
64
+ * Obtiene la capacidad de color específica del entorno
65
65
  */
66
66
  function getColorCapability() {
67
67
  if (getEnvironment() === "browser") return "full";
@@ -74,21 +74,21 @@ function getColorCapability() {
74
74
  return "basic";
75
75
  }
76
76
  /**
77
- * Get terminal width in columns
77
+ * Obtiene el ancho de la terminal en columnas
78
78
  */
79
79
  function getTerminalWidth() {
80
80
  if (typeof process !== "undefined" && process.stdout?.columns) return process.stdout.columns;
81
81
  return 80;
82
82
  }
83
83
  /**
84
- * Get terminal height in rows
84
+ * Obtiene el alto de la terminal en filas
85
85
  */
86
86
  function getTerminalHeight() {
87
87
  if (typeof process !== "undefined" && process.stdout?.rows) return process.stdout.rows;
88
88
  return 24;
89
89
  }
90
90
  /**
91
- * Environment information for debugging
91
+ * Información del entorno para debugging
92
92
  */
93
93
  function getEnvironmentInfo() {
94
94
  return {
@@ -160,4 +160,4 @@ Object.defineProperty(exports, "supportsANSI", {
160
160
  }
161
161
  });
162
162
 
163
- //# sourceMappingURL=environment-detector-Cnn6wr6O.cjs.map
163
+ //# sourceMappingURL=environment-detector-D-tHkKWA.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment-detector-D-tHkKWA.cjs","names":[],"sources":["../../src/utils/environment-detector.ts"],"sourcesContent":["/**\n * Detector de entorno — Detección robusta del entorno para el logger\n * Detecta entornos browser, terminal, server y otros runtime\n */\n\nexport type Environment = 'browser' | 'terminal' | 'server' | 'webworker' | 'deno' | 'unknown';\n\n/**\n * Comprueba si se ejecuta en entorno Node.js\n */\nexport const isNode = typeof process !== 'undefined' &&\n process.versions &&\n process.versions.node;\n\n/**\n * Comprueba si se ejecuta en entorno browser\n */\nexport const isBrowser = typeof window !== 'undefined' &&\n typeof document !== 'undefined';\n\n/**\n * Función principal de detección de entorno\n */\nexport function getEnvironment(): Environment {\n // Comprueba Deno primero\n if (typeof globalThis !== 'undefined' && (globalThis as any).Deno) {\n return 'deno';\n }\n\n // Comprueba WebWorker\n if (typeof window === 'undefined' && typeof self !== 'undefined' && typeof (self as any).importScripts === 'function') {\n return 'webworker';\n }\n\n // Comprueba Node.js (entorno server)\n if (typeof process !== 'undefined' && process.versions && process.versions.node) {\n // Determina si corre en una terminal o como server\n if (isRunningInTerminal()) {\n return 'terminal';\n }\n return 'server';\n }\n\n // Comprueba browser\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n return 'browser';\n }\n\n return 'unknown';\n}\n\n/**\n * Comprueba si se ejecuta en una terminal interactiva\n */\nexport function isRunningInTerminal(): boolean {\n // Comprueba indicadores comunes de terminal\n if (typeof process === 'undefined') return false;\n\n const isTTY = process.stdout && process.stdout.isTTY;\n const hasTerminalEnv = process.env && (\n process.env.TERM ||\n process.env.TERM_PROGRAM ||\n process.env.SSH_TTY ||\n process.env.TERM_SESSION_ID\n );\n\n // Comprueba si corre dentro de programas de terminal comunes\n const terminalPrograms = [\n 'vscode',\n 'hyper',\n 'iterm',\n 'terminal',\n 'alacritty',\n 'kitty',\n 'gnome-terminal',\n 'konsole',\n 'xterm',\n 'tmux',\n 'screen'\n ];\n\n const isTerminalProgram = hasTerminalEnv && terminalPrograms.some(program =>\n process.env.TERM_PROGRAM?.toLowerCase().includes(program) ||\n process.env.TERM?.toLowerCase().includes(program)\n );\n\n return Boolean(isTTY || hasTerminalEnv || isTerminalProgram);\n}\n\n/**\n * Comprueba si el entorno soporta colores ANSI\n */\nexport function supportsANSI(): boolean {\n const env = getEnvironment();\n\n if (env === 'browser') return false;\n if (env === 'terminal') return true;\n if (env === 'server') return checkServerANSISupport();\n\n return false;\n}\n\n/**\n * Comprueba si el entorno server soporta colores ANSI\n */\nfunction checkServerANSISupport(): boolean {\n if (typeof process === 'undefined') return false;\n\n // Comprueba variables de entorno comunes que indican soporte ANSI\n const supportsANSI = process.env && (\n process.env.COLORTERM ||\n process.env.FORCE_COLOR ||\n (process.env.TERM && process.env.TERM !== 'dumb') ||\n process.env.TERM_PROGRAM\n );\n\n return Boolean(supportsANSI);\n}\n\n/**\n * Obtiene la capacidad de color específica del entorno\n */\nexport function getColorCapability(): 'full' | 'basic' | 'none' {\n const env = getEnvironment();\n\n if (env === 'browser') {\n return 'full'; // Colores CSS\n }\n\n if (!supportsANSI()) {\n return 'none';\n }\n\n // Comprueba soporte de 256 colores o truecolor\n if (typeof process !== 'undefined' && process.env) {\n const hasTrueColor = process.env.COLORTERM === 'truecolor' || process.env.COLORTERM === '24bit';\n const has256Colors = process.env.TERM && process.env.TERM.includes('256');\n\n if (hasTrueColor || has256Colors) {\n return 'full';\n }\n }\n\n return 'basic'; // 16 colores básicos\n}\n\n/**\n * Obtiene el ancho de la terminal en columnas\n */\nexport function getTerminalWidth(): number {\n if (typeof process !== 'undefined' && process.stdout?.columns) {\n return process.stdout.columns;\n }\n return 80;\n}\n\n/**\n * Obtiene el alto de la terminal en filas\n */\nexport function getTerminalHeight(): number {\n if (typeof process !== 'undefined' && process.stdout?.rows) {\n return process.stdout.rows;\n }\n return 24;\n}\n\n/**\n * Información del entorno para debugging\n */\nexport function getEnvironmentInfo() {\n return {\n environment: getEnvironment(),\n supportsANSI: supportsANSI(),\n colorCapability: getColorCapability(),\n isTTY: typeof process !== 'undefined' ? Boolean(process.stdout?.isTTY) : false,\n platform: typeof process !== 'undefined' ? process.platform : 'unknown',\n nodeVersion: typeof process !== 'undefined' ? process.versions?.node : null,\n term: typeof process !== 'undefined' ? process.env?.TERM : null,\n colorTerm: typeof process !== 'undefined' ? process.env?.COLORTERM : null,\n terminalWidth: getTerminalWidth(),\n terminalHeight: getTerminalHeight()\n };\n}"],"mappings":";;;;AAUA,MAAa,SAAS,OAAO,YAAY,eACnB,QAAQ,YACR,QAAQ,SAAS;;;;AAKvC,MAAa,YAAY,OAAO,WAAW,eACjB,OAAO,aAAa;;;;AAK9C,SAAgB,iBAA8B;CAE1C,IAAI,OAAO,eAAe,eAAgB,WAAmB,MACzD,OAAO;CAIX,IAAI,OAAO,WAAW,eAAe,OAAO,SAAS,eAAe,OAAQ,KAAa,kBAAkB,YACvG,OAAO;CAIX,IAAI,OAAO,YAAY,eAAe,QAAQ,YAAY,QAAQ,SAAS,MAAM;EAE7E,IAAI,oBAAoB,GACpB,OAAO;EAEX,OAAO;CACX;CAGA,IAAI,OAAO,WAAW,eAAe,OAAO,aAAa,aACrD,OAAO;CAGX,OAAO;AACX;;;;AAKA,SAAgB,sBAA+B;CAE3C,IAAI,OAAO,YAAY,aAAa,OAAO;CAE3C,MAAM,QAAQ,QAAQ,UAAU,QAAQ,OAAO;CAC/C,MAAM,iBAAiB,QAAQ,QAC3B,QAAQ,IAAI,QACZ,QAAQ,IAAI,gBACZ,QAAQ,IAAI,WACZ,QAAQ,IAAI;CAkBhB,MAAM,oBAAoB,kBAAkB;EAbxC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CAGuD,CAAC,CAAC,MAAK,YAC9D,QAAQ,IAAI,cAAc,YAAY,CAAC,CAAC,SAAS,OAAO,KACxD,QAAQ,IAAI,MAAM,YAAY,CAAC,CAAC,SAAS,OAAO,CACpD;CAEA,OAAO,QAAQ,SAAS,kBAAkB,iBAAiB;AAC/D;;;;AAKA,SAAgB,eAAwB;CACpC,MAAM,MAAM,eAAe;CAE3B,IAAI,QAAQ,WAAW,OAAO;CAC9B,IAAI,QAAQ,YAAY,OAAO;CAC/B,IAAI,QAAQ,UAAU,OAAO,uBAAuB;CAEpD,OAAO;AACX;;;;AAKA,SAAS,yBAAkC;CACvC,IAAI,OAAO,YAAY,aAAa,OAAO;CAG3C,MAAM,eAAe,QAAQ,QACzB,QAAQ,IAAI,aACZ,QAAQ,IAAI,eACX,QAAQ,IAAI,QAAQ,QAAQ,IAAI,SAAS,UAC1C,QAAQ,IAAI;CAGhB,OAAO,QAAQ,YAAY;AAC/B;;;;AAKA,SAAgB,qBAAgD;CAG5D,IAFY,eAEN,MAAM,WACR,OAAO;CAGX,IAAI,CAAC,aAAa,GACd,OAAO;CAIX,IAAI,OAAO,YAAY,eAAe,QAAQ,KAAK;EAC/C,MAAM,eAAe,QAAQ,IAAI,cAAc,eAAe,QAAQ,IAAI,cAAc;EACxF,MAAM,eAAe,QAAQ,IAAI,QAAQ,QAAQ,IAAI,KAAK,SAAS,KAAK;EAExE,IAAI,gBAAgB,cAChB,OAAO;CAEf;CAEA,OAAO;AACX;;;;AAKA,SAAgB,mBAA2B;CACvC,IAAI,OAAO,YAAY,eAAe,QAAQ,QAAQ,SAClD,OAAO,QAAQ,OAAO;CAE1B,OAAO;AACX;;;;AAKA,SAAgB,oBAA4B;CACxC,IAAI,OAAO,YAAY,eAAe,QAAQ,QAAQ,MAClD,OAAO,QAAQ,OAAO;CAE1B,OAAO;AACX;;;;AAKA,SAAgB,qBAAqB;CACjC,OAAO;EACH,aAAa,eAAe;EAC5B,cAAc,aAAa;EAC3B,iBAAiB,mBAAmB;EACpC,OAAO,OAAO,YAAY,cAAc,QAAQ,QAAQ,QAAQ,KAAK,IAAI;EACzE,UAAU,OAAO,YAAY,cAAc,QAAQ,WAAW;EAC9D,aAAa,OAAO,YAAY,cAAc,QAAQ,UAAU,OAAO;EACvE,MAAM,OAAO,YAAY,cAAc,QAAQ,KAAK,OAAO;EAC3D,WAAW,OAAO,YAAY,cAAc,QAAQ,KAAK,YAAY;EACrE,eAAe,iBAAiB;EAChC,gBAAgB,kBAAkB;CACtC;AACJ"}
@@ -0,0 +1,119 @@
1
+ //#region src/playground/server-fallback.ts
2
+ /**
3
+ * Degradación de CLI primitives para modo server/non-TTY.
4
+ *
5
+ * Cada método espeja uno del {@link TerminalBridge} (`step`/`header`/`box`/...)
6
+ * y decide cómo renderizarlo sin depender de caracteres de caja ni control
7
+ * ANSI: texto plano al logger, o no-op cuando no hay nada útil que emitir.
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * // En CI (sin TTY), TerminalBridge enruta automáticamente aquí:
12
+ * logger.step(2, 5, 'Compilando'); // logger.info('[2/5] Compilando')
13
+ * logger.header('Build', 'v1.2.3'); // logger.info('Build v1.2.3')
14
+ * logger.divider(); // (no-op)
15
+ * ```
16
+ *
17
+ * @see {@link TerminalBridge} para el dispatcher TTY-vs-server.
18
+ */
19
+ var ServerFallback = class {
20
+ logger;
21
+ /**
22
+ * @param {Logger} logger - Logger sobre el que se emiten los mensajes
23
+ * degradados. Respeta el `outputMode` que tenga configurado (json,
24
+ * console, ...), por lo que funciona tanto para logs estructurados
25
+ * como para texto plano.
26
+ */
27
+ constructor(logger) {
28
+ this.logger = logger;
29
+ }
30
+ /**
31
+ * Emite un step como `logger.info` con el contador `[current/total]`
32
+ * prefijado al mensaje. Conserva el orden y el progreso sin depender
33
+ * de caracteres de caja.
34
+ *
35
+ * @param {number} current - Índice del step actual (1-based).
36
+ * @param {number} total - Total de steps del run.
37
+ * @param {string} msg - Descripción del step.
38
+ * @returns {void}
39
+ */
40
+ step(current, total, msg) {
41
+ this.logger.info(`[${current}/${total}] ${msg}`);
42
+ }
43
+ /**
44
+ * Emite el título (y subtítulo opcional) como `logger.info`. No pinta
45
+ * bordes ni separadores — en modo server solo interesa el texto.
46
+ *
47
+ * @param {string} title - Texto principal del header.
48
+ * @param {string} [subtitle] - Subtítulo optativo; se concatena con
49
+ * espacio si viene.
50
+ * @returns {void}
51
+ */
52
+ header(title, subtitle) {
53
+ const text = subtitle ? `${title} ${subtitle}` : title;
54
+ this.logger.info(text);
55
+ }
56
+ /**
57
+ * No-op: un divisor visual (`───`) no aporta nada a un log server/JSON
58
+ * y solo ensuciaría el stream.
59
+ *
60
+ * @returns {void}
61
+ */
62
+ divider() {}
63
+ /**
64
+ * No-op: las líneas en blanco rompen la consistencia de un log JSON
65
+ * (cada línea debería ser un registro parseable).
66
+ *
67
+ * @returns {void}
68
+ */
69
+ blank() {}
70
+ /**
71
+ * Emite el contenido del box como `logger.info`, ignorando bordes y
72
+ * opciones de estilo (`title`, `borderColor`, ...). En modo server lo
73
+ * que importa es el payload, no el embalaje.
74
+ *
75
+ * @param {string} content - Texto a registrar.
76
+ * @param {IBoxOptions} [_options] - Opciones de box de la API TTY;
77
+ * ignoradas en este fallback.
78
+ * @returns {void}
79
+ */
80
+ box(content, _options) {
81
+ this.logger.info(content);
82
+ }
83
+ /**
84
+ * Emite cada fila de la tabla como un `logger.info` con la fila
85
+ * serializada a JSON, en lugar de pintar una grilla ASCII.
86
+ *
87
+ * Cada fila queda como su propio registro JSON — útil para filtrar por
88
+ * columna en tools como `jq` o Loki. Las opciones de columnas/headers
89
+ * (`ITableOptions.columns` / `ITableOptions.head`) se ignoran: en modo
90
+ * server los keys del objeto son la fuente de verdad.
91
+ *
92
+ * @param {Record<string, unknown>[]} rows - Filas a emitir.
93
+ * @param {ITableOptions} [_options] - Opciones de tabla de la API TTY;
94
+ * ignoradas en este fallback.
95
+ * @returns {void}
96
+ *
97
+ * @example
98
+ * ```ts
99
+ * serverFallback.cliTable([
100
+ * { user: 'alice', age: 30 },
101
+ * { user: 'bob', age: 25 }
102
+ * ]);
103
+ * // logger.info('{"user":"alice","age":30}')
104
+ * // logger.info('{"user":"bob","age":25}')
105
+ * ```
106
+ */
107
+ cliTable(rows, _options) {
108
+ for (const row of rows) this.logger.info(JSON.stringify(row));
109
+ }
110
+ };
111
+ //#endregion
112
+ Object.defineProperty(exports, "ServerFallback", {
113
+ enumerable: true,
114
+ get: function() {
115
+ return ServerFallback;
116
+ }
117
+ });
118
+
119
+ //# sourceMappingURL=server-fallback-CaCPjWby.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-fallback-CaCPjWby.cjs","names":[],"sources":["../../src/playground/server-fallback.ts"],"sourcesContent":["/**\n * @fileoverview Server/JSON fallback para CLI primitives en entornos non-TTY.\n *\n * Cuando el logger corre con `outputMode: 'json'` o fuera de una TTY real\n * (CI logs, pipes, redirecciones), los primitives visuales — `step`,\n * `header`, `box`, `cliTable` — no tienen sentido como arte ASCII.\n * {@link ServerFallback} los degrada a llamadas `logger.info` / no-ops\n * conservando el contenido semántico, para que el log siga siendo parseable\n * línea por línea en aggregators centralizados.\n *\n * La factoría vive en `TerminalBridge.getServerFallback()` (lazy-singleton);\n * los consumers no construyen esta clase directamente.\n */\n\nimport type { IBoxOptions, ITableOptions } from '../types/core.js';\nimport type { Logger } from '../Logger.js';\n\n/**\n * Degradación de CLI primitives para modo server/non-TTY.\n *\n * Cada método espeja uno del {@link TerminalBridge} (`step`/`header`/`box`/...)\n * y decide cómo renderizarlo sin depender de caracteres de caja ni control\n * ANSI: texto plano al logger, o no-op cuando no hay nada útil que emitir.\n *\n * @example\n * ```ts\n * // En CI (sin TTY), TerminalBridge enruta automáticamente aquí:\n * logger.step(2, 5, 'Compilando'); // logger.info('[2/5] Compilando')\n * logger.header('Build', 'v1.2.3'); // logger.info('Build v1.2.3')\n * logger.divider(); // (no-op)\n * ```\n *\n * @see {@link TerminalBridge} para el dispatcher TTY-vs-server.\n */\nexport class ServerFallback {\n private logger: Logger;\n\n /**\n * @param {Logger} logger - Logger sobre el que se emiten los mensajes\n * degradados. Respeta el `outputMode` que tenga configurado (json,\n * console, ...), por lo que funciona tanto para logs estructurados\n * como para texto plano.\n */\n constructor(logger: Logger) {\n this.logger = logger;\n }\n\n /**\n * Emite un step como `logger.info` con el contador `[current/total]`\n * prefijado al mensaje. Conserva el orden y el progreso sin depender\n * de caracteres de caja.\n *\n * @param {number} current - Índice del step actual (1-based).\n * @param {number} total - Total de steps del run.\n * @param {string} msg - Descripción del step.\n * @returns {void}\n */\n step(current: number, total: number, msg: string): void {\n this.logger.info(`[${current}/${total}] ${msg}`);\n }\n\n /**\n * Emite el título (y subtítulo opcional) como `logger.info`. No pinta\n * bordes ni separadores — en modo server solo interesa el texto.\n *\n * @param {string} title - Texto principal del header.\n * @param {string} [subtitle] - Subtítulo optativo; se concatena con\n * espacio si viene.\n * @returns {void}\n */\n header(title: string, subtitle?: string): void {\n const text = subtitle ? `${title} ${subtitle}` : title;\n this.logger.info(text);\n }\n\n /**\n * No-op: un divisor visual (`───`) no aporta nada a un log server/JSON\n * y solo ensuciaría el stream.\n *\n * @returns {void}\n */\n divider(): void {\n // No-op in server/JSON mode\n }\n\n /**\n * No-op: las líneas en blanco rompen la consistencia de un log JSON\n * (cada línea debería ser un registro parseable).\n *\n * @returns {void}\n */\n blank(): void {\n // No-op in server/JSON mode\n }\n\n /**\n * Emite el contenido del box como `logger.info`, ignorando bordes y\n * opciones de estilo (`title`, `borderColor`, ...). En modo server lo\n * que importa es el payload, no el embalaje.\n *\n * @param {string} content - Texto a registrar.\n * @param {IBoxOptions} [_options] - Opciones de box de la API TTY;\n * ignoradas en este fallback.\n * @returns {void}\n */\n box(content: string, _options?: IBoxOptions): void {\n this.logger.info(content);\n }\n\n /**\n * Emite cada fila de la tabla como un `logger.info` con la fila\n * serializada a JSON, en lugar de pintar una grilla ASCII.\n *\n * Cada fila queda como su propio registro JSON — útil para filtrar por\n * columna en tools como `jq` o Loki. Las opciones de columnas/headers\n * (`ITableOptions.columns` / `ITableOptions.head`) se ignoran: en modo\n * server los keys del objeto son la fuente de verdad.\n *\n * @param {Record<string, unknown>[]} rows - Filas a emitir.\n * @param {ITableOptions} [_options] - Opciones de tabla de la API TTY;\n * ignoradas en este fallback.\n * @returns {void}\n *\n * @example\n * ```ts\n * serverFallback.cliTable([\n * { user: 'alice', age: 30 },\n * { user: 'bob', age: 25 }\n * ]);\n * // logger.info('{\"user\":\"alice\",\"age\":30}')\n * // logger.info('{\"user\":\"bob\",\"age\":25}')\n * ```\n */\n cliTable(rows: Record<string, unknown>[], _options?: ITableOptions): void {\n for (const row of rows) {\n this.logger.info(JSON.stringify(row));\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAkCA,IAAa,iBAAb,MAA4B;CACxB;;;;;;;CAQA,YAAY,QAAgB;EACxB,KAAK,SAAS;CAClB;;;;;;;;;;;CAYA,KAAK,SAAiB,OAAe,KAAmB;EACpD,KAAK,OAAO,KAAK,IAAI,QAAQ,GAAG,MAAM,IAAI,KAAK;CACnD;;;;;;;;;;CAWA,OAAO,OAAe,UAAyB;EAC3C,MAAM,OAAO,WAAW,GAAG,MAAM,GAAG,aAAa;EACjD,KAAK,OAAO,KAAK,IAAI;CACzB;;;;;;;CAQA,UAAgB,CAEhB;;;;;;;CAQA,QAAc,CAEd;;;;;;;;;;;CAYA,IAAI,SAAiB,UAA8B;EAC/C,KAAK,OAAO,KAAK,OAAO;CAC5B;;;;;;;;;;;;;;;;;;;;;;;;;CA0BA,SAAS,MAAiC,UAAgC;EACtE,KAAK,MAAM,OAAO,MACd,KAAK,OAAO,KAAK,KAAK,UAAU,GAAG,CAAC;CAE5C;AACJ"}
@@ -0,0 +1,114 @@
1
+ //#region src/playground/server-fallback.ts
2
+ /**
3
+ * Degradación de CLI primitives para modo server/non-TTY.
4
+ *
5
+ * Cada método espeja uno del {@link TerminalBridge} (`step`/`header`/`box`/...)
6
+ * y decide cómo renderizarlo sin depender de caracteres de caja ni control
7
+ * ANSI: texto plano al logger, o no-op cuando no hay nada útil que emitir.
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * // En CI (sin TTY), TerminalBridge enruta automáticamente aquí:
12
+ * logger.step(2, 5, 'Compilando'); // logger.info('[2/5] Compilando')
13
+ * logger.header('Build', 'v1.2.3'); // logger.info('Build v1.2.3')
14
+ * logger.divider(); // (no-op)
15
+ * ```
16
+ *
17
+ * @see {@link TerminalBridge} para el dispatcher TTY-vs-server.
18
+ */
19
+ var ServerFallback = class {
20
+ logger;
21
+ /**
22
+ * @param {Logger} logger - Logger sobre el que se emiten los mensajes
23
+ * degradados. Respeta el `outputMode` que tenga configurado (json,
24
+ * console, ...), por lo que funciona tanto para logs estructurados
25
+ * como para texto plano.
26
+ */
27
+ constructor(logger) {
28
+ this.logger = logger;
29
+ }
30
+ /**
31
+ * Emite un step como `logger.info` con el contador `[current/total]`
32
+ * prefijado al mensaje. Conserva el orden y el progreso sin depender
33
+ * de caracteres de caja.
34
+ *
35
+ * @param {number} current - Índice del step actual (1-based).
36
+ * @param {number} total - Total de steps del run.
37
+ * @param {string} msg - Descripción del step.
38
+ * @returns {void}
39
+ */
40
+ step(current, total, msg) {
41
+ this.logger.info(`[${current}/${total}] ${msg}`);
42
+ }
43
+ /**
44
+ * Emite el título (y subtítulo opcional) como `logger.info`. No pinta
45
+ * bordes ni separadores — en modo server solo interesa el texto.
46
+ *
47
+ * @param {string} title - Texto principal del header.
48
+ * @param {string} [subtitle] - Subtítulo optativo; se concatena con
49
+ * espacio si viene.
50
+ * @returns {void}
51
+ */
52
+ header(title, subtitle) {
53
+ const text = subtitle ? `${title} ${subtitle}` : title;
54
+ this.logger.info(text);
55
+ }
56
+ /**
57
+ * No-op: un divisor visual (`───`) no aporta nada a un log server/JSON
58
+ * y solo ensuciaría el stream.
59
+ *
60
+ * @returns {void}
61
+ */
62
+ divider() {}
63
+ /**
64
+ * No-op: las líneas en blanco rompen la consistencia de un log JSON
65
+ * (cada línea debería ser un registro parseable).
66
+ *
67
+ * @returns {void}
68
+ */
69
+ blank() {}
70
+ /**
71
+ * Emite el contenido del box como `logger.info`, ignorando bordes y
72
+ * opciones de estilo (`title`, `borderColor`, ...). En modo server lo
73
+ * que importa es el payload, no el embalaje.
74
+ *
75
+ * @param {string} content - Texto a registrar.
76
+ * @param {IBoxOptions} [_options] - Opciones de box de la API TTY;
77
+ * ignoradas en este fallback.
78
+ * @returns {void}
79
+ */
80
+ box(content, _options) {
81
+ this.logger.info(content);
82
+ }
83
+ /**
84
+ * Emite cada fila de la tabla como un `logger.info` con la fila
85
+ * serializada a JSON, en lugar de pintar una grilla ASCII.
86
+ *
87
+ * Cada fila queda como su propio registro JSON — útil para filtrar por
88
+ * columna en tools como `jq` o Loki. Las opciones de columnas/headers
89
+ * (`ITableOptions.columns` / `ITableOptions.head`) se ignoran: en modo
90
+ * server los keys del objeto son la fuente de verdad.
91
+ *
92
+ * @param {Record<string, unknown>[]} rows - Filas a emitir.
93
+ * @param {ITableOptions} [_options] - Opciones de tabla de la API TTY;
94
+ * ignoradas en este fallback.
95
+ * @returns {void}
96
+ *
97
+ * @example
98
+ * ```ts
99
+ * serverFallback.cliTable([
100
+ * { user: 'alice', age: 30 },
101
+ * { user: 'bob', age: 25 }
102
+ * ]);
103
+ * // logger.info('{"user":"alice","age":30}')
104
+ * // logger.info('{"user":"bob","age":25}')
105
+ * ```
106
+ */
107
+ cliTable(rows, _options) {
108
+ for (const row of rows) this.logger.info(JSON.stringify(row));
109
+ }
110
+ };
111
+ //#endregion
112
+ export { ServerFallback as t };
113
+
114
+ //# sourceMappingURL=server-fallback-jj0T6XaK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-fallback-jj0T6XaK.js","names":[],"sources":["../../src/playground/server-fallback.ts"],"sourcesContent":["/**\n * @fileoverview Server/JSON fallback para CLI primitives en entornos non-TTY.\n *\n * Cuando el logger corre con `outputMode: 'json'` o fuera de una TTY real\n * (CI logs, pipes, redirecciones), los primitives visuales — `step`,\n * `header`, `box`, `cliTable` — no tienen sentido como arte ASCII.\n * {@link ServerFallback} los degrada a llamadas `logger.info` / no-ops\n * conservando el contenido semántico, para que el log siga siendo parseable\n * línea por línea en aggregators centralizados.\n *\n * La factoría vive en `TerminalBridge.getServerFallback()` (lazy-singleton);\n * los consumers no construyen esta clase directamente.\n */\n\nimport type { IBoxOptions, ITableOptions } from '../types/core.js';\nimport type { Logger } from '../Logger.js';\n\n/**\n * Degradación de CLI primitives para modo server/non-TTY.\n *\n * Cada método espeja uno del {@link TerminalBridge} (`step`/`header`/`box`/...)\n * y decide cómo renderizarlo sin depender de caracteres de caja ni control\n * ANSI: texto plano al logger, o no-op cuando no hay nada útil que emitir.\n *\n * @example\n * ```ts\n * // En CI (sin TTY), TerminalBridge enruta automáticamente aquí:\n * logger.step(2, 5, 'Compilando'); // logger.info('[2/5] Compilando')\n * logger.header('Build', 'v1.2.3'); // logger.info('Build v1.2.3')\n * logger.divider(); // (no-op)\n * ```\n *\n * @see {@link TerminalBridge} para el dispatcher TTY-vs-server.\n */\nexport class ServerFallback {\n private logger: Logger;\n\n /**\n * @param {Logger} logger - Logger sobre el que se emiten los mensajes\n * degradados. Respeta el `outputMode` que tenga configurado (json,\n * console, ...), por lo que funciona tanto para logs estructurados\n * como para texto plano.\n */\n constructor(logger: Logger) {\n this.logger = logger;\n }\n\n /**\n * Emite un step como `logger.info` con el contador `[current/total]`\n * prefijado al mensaje. Conserva el orden y el progreso sin depender\n * de caracteres de caja.\n *\n * @param {number} current - Índice del step actual (1-based).\n * @param {number} total - Total de steps del run.\n * @param {string} msg - Descripción del step.\n * @returns {void}\n */\n step(current: number, total: number, msg: string): void {\n this.logger.info(`[${current}/${total}] ${msg}`);\n }\n\n /**\n * Emite el título (y subtítulo opcional) como `logger.info`. No pinta\n * bordes ni separadores — en modo server solo interesa el texto.\n *\n * @param {string} title - Texto principal del header.\n * @param {string} [subtitle] - Subtítulo optativo; se concatena con\n * espacio si viene.\n * @returns {void}\n */\n header(title: string, subtitle?: string): void {\n const text = subtitle ? `${title} ${subtitle}` : title;\n this.logger.info(text);\n }\n\n /**\n * No-op: un divisor visual (`───`) no aporta nada a un log server/JSON\n * y solo ensuciaría el stream.\n *\n * @returns {void}\n */\n divider(): void {\n // No-op in server/JSON mode\n }\n\n /**\n * No-op: las líneas en blanco rompen la consistencia de un log JSON\n * (cada línea debería ser un registro parseable).\n *\n * @returns {void}\n */\n blank(): void {\n // No-op in server/JSON mode\n }\n\n /**\n * Emite el contenido del box como `logger.info`, ignorando bordes y\n * opciones de estilo (`title`, `borderColor`, ...). En modo server lo\n * que importa es el payload, no el embalaje.\n *\n * @param {string} content - Texto a registrar.\n * @param {IBoxOptions} [_options] - Opciones de box de la API TTY;\n * ignoradas en este fallback.\n * @returns {void}\n */\n box(content: string, _options?: IBoxOptions): void {\n this.logger.info(content);\n }\n\n /**\n * Emite cada fila de la tabla como un `logger.info` con la fila\n * serializada a JSON, en lugar de pintar una grilla ASCII.\n *\n * Cada fila queda como su propio registro JSON — útil para filtrar por\n * columna en tools como `jq` o Loki. Las opciones de columnas/headers\n * (`ITableOptions.columns` / `ITableOptions.head`) se ignoran: en modo\n * server los keys del objeto son la fuente de verdad.\n *\n * @param {Record<string, unknown>[]} rows - Filas a emitir.\n * @param {ITableOptions} [_options] - Opciones de tabla de la API TTY;\n * ignoradas en este fallback.\n * @returns {void}\n *\n * @example\n * ```ts\n * serverFallback.cliTable([\n * { user: 'alice', age: 30 },\n * { user: 'bob', age: 25 }\n * ]);\n * // logger.info('{\"user\":\"alice\",\"age\":30}')\n * // logger.info('{\"user\":\"bob\",\"age\":25}')\n * ```\n */\n cliTable(rows: Record<string, unknown>[], _options?: ITableOptions): void {\n for (const row of rows) {\n this.logger.info(JSON.stringify(row));\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAkCA,IAAa,iBAAb,MAA4B;CACxB;;;;;;;CAQA,YAAY,QAAgB;EACxB,KAAK,SAAS;CAClB;;;;;;;;;;;CAYA,KAAK,SAAiB,OAAe,KAAmB;EACpD,KAAK,OAAO,KAAK,IAAI,QAAQ,GAAG,MAAM,IAAI,KAAK;CACnD;;;;;;;;;;CAWA,OAAO,OAAe,UAAyB;EAC3C,MAAM,OAAO,WAAW,GAAG,MAAM,GAAG,aAAa;EACjD,KAAK,OAAO,KAAK,IAAI;CACzB;;;;;;;CAQA,UAAgB,CAEhB;;;;;;;CAQA,QAAc,CAEd;;;;;;;;;;;CAYA,IAAI,SAAiB,UAA8B;EAC/C,KAAK,OAAO,KAAK,OAAO;CAC5B;;;;;;;;;;;;;;;;;;;;;;;;;CA0BA,SAAS,MAAiC,UAAgC;EACtE,KAAK,MAAM,OAAO,MACd,KAAK,OAAO,KAAK,KAAK,UAAU,GAAG,CAAC;CAE5C;AACJ"}