@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
package/README.md CHANGED
@@ -8,33 +8,15 @@
8
8
 
9
9
  ## ✨ Features
10
10
 
11
- ### Core
12
- - 🎨 **Estilos CSS en consola** — gradientes, sombras, `%c` formatting, presets listos
13
- - 🏷️ **Badges** — etiquetado flexible con `badges()` / `badge()`
14
- - 🌗 **Temas adaptativos** — detección automática light/dark
15
- - 🎯 **TypeScript first** — tipado completo, cero `any` en la superficie pública
16
-
17
- ### Niveles y verbosidad
18
- - 📊 **6 niveles jerárquicos** — `trace < debug < info < warn < error < critical` (+ `silent`)
19
- - 🔭 **`trace` alineado con OpenTelemetry** severity number OTel (1-24) listo para SigNoz
20
- - 🔇 **Verbosidad filtrable** — `setVerbosity('warn')` filtra todo por debajo
21
-
22
- ### Log context (MDC)
23
- - 🧩 **Contexto estructurado** — `withContext({ requestId, userId })` se mergea en cada `TransportRecord`
24
- - 🧬 **Loggers hijuelos** — `child({ ... })` hereda contexto sin mutar al padre
25
- - 🏷️ **Resource OTel** — `setResource({ 'service.name': ... })` por logger
26
-
27
- ### Transports
28
- - 📁 **File** — async (`fs.promises`), bounded buffer, sanitización de path, fallback a `localStorage` en browser
29
- - 🌐 **HTTP** — batching, retry con backoff, bounded buffer (sin OOM), status check
30
- - 🔭 **OTLP → SigNoz** — payload OTLP/HTTP JSON spec-compliant, ingestion key desde env var (nunca hardcodeada)
31
- - 🧩 **Custom** — implementa `ITransport` y registra con `addTransport()`
32
-
33
- ### Hooks, serializers y más
34
- - 🪝 **Hooks** — `on('beforeLog', ...)` (awaited, soporta redacción PII) / `on('afterLog', ...)`
35
- - 🔄 **Middleware** — pipeline `use((entry, next) => ...)`
36
- - 🧬 **Serializers** — transforma tipos antes de loggear (`addSerializer(Error, fn)`)
37
- - 🖥️ **CLI integrado** — spinners, boxes, tablas, steps, headers
11
+ - 🎨 **Styling dual** — CSS `%c` con gradientes y sombras en browser, ANSI en terminal. Themes (`default`/`dark`/`light`/`neon`/`minimal`/`cyberpunk`) y Smart Presets (`cyberpunk`/`glassmorphism`/`minimal`/`debug`/`production`).
12
+ - 📊 **6 niveles + verbosity** — `trace < debug < info < warn < error < critical` (+ `silent`). `trace` alineado con la banda TRACE de OpenTelemetry (severity 1-4).
13
+ - 🧩 **Log context (MDC)** — bindings persistentes con `child()` o scoped via `AsyncLocalStorage` con `withContext(bindings, fn)`. Se mergean en `TransportRecord.attributes`.
14
+ - 📡 **Transports** — `FileTransport` (async, bounded buffer), `HttpTransport` (batching + retry exponencial), `OtlpTransport` (OTLP/HTTP → SigNoz y otros backends). Custom via `ITransport`.
15
+ - 🪝 **Hooks awaited** — `beforeLog` (mutación reflejada en el mensaje), `afterLog` (métricas fire-and-forget), middleware Koa-style con `use()`. Ideales para redacción PII.
16
+ - 🧬 **Serializers por tipo** — `addSerializer(Error, fn)`, `addSerializer(User, fn)`. Defaults para `Error`/`Date`/`Map`/`Set`/`Buffer`/`RegExp`.
17
+ - 🏷️ **Scoped loggers** — `scope('Auth')`, `component('Database')`, `api('GraphQL')` con badges automáticos y métodos específicos (`slow`, `rateLimit`, `auth`, `deprecated`).
18
+ - 🖥️ **CLI primitives** — spinners braille 80ms, boxes ASCII, tablas, steps, headers, dividers. Fallback automático en non-TTY.
19
+ - 🔭 **OpenTelemetry ready** — `severityNumber` / `severityText` / `traceId` / `spanId` / `attributes` / `resource` en cada `TransportRecord`.
38
20
 
39
21
  ## 📦 Instalación
40
22
 
@@ -50,340 +32,60 @@ bun add @mks2508/better-logger
50
32
  import logger from '@mks2508/better-logger';
51
33
 
52
34
  logger.info('Application started');
53
- logger.success('Database connected');
54
35
  logger.warn('High memory usage');
55
36
  logger.error('Connection failed');
56
- logger.critical('Disk full');
57
- logger.trace('verbose internals'); // filtrado por defecto (verbosity=debug)
37
+
38
+ // Loggers hijuelos (request-scoped, persistentes)
39
+ const requestLog = logger.child({ requestId: getRequestId() });
40
+ requestLog.info('auth ok'); // lleva requestId automáticamente
58
41
  ```
59
42
 
60
- ### Importar métodos sueltos
43
+ Más métodos sueltos:
61
44
 
62
45
  ```typescript
63
- import { info, error, success, trace } from '@mks2508/better-logger';
46
+ import { info, success, error, trace } from '@mks2508/better-logger';
64
47
  info('Proceso iniciado');
65
48
  success('✓ Completado');
66
49
  ```
67
50
 
51
+ ## 📚 Documentación
52
+
53
+ | Página | Cubre |
54
+ |---|---|
55
+ | [Inicio](docs/index.md) | Overview, features, instalación |
56
+ | [Transports](docs/transports.md) | `FileTransport`, `HttpTransport`, `OtlpTransport`, custom `ITransport` |
57
+ | [Log Context (MDC)](docs/context.md) | `child()` inmutable vs `withContext(bindings, fn)` scoped |
58
+ | [Hooks & Middleware](docs/hooks.md) | `on`/`once`/`off`/`use`, redacción PII, métricas |
59
+ | [Serializers](docs/serializers.md) | `addSerializer`, defaults, circular refs, depth |
60
+ | [Styling](docs/styles.md) | Themes, Smart Presets, `StyleBuilder` chainable, badges |
61
+ | [CLI](docs/cli.md) | 8 comandos `/help`/`/config`/`/themes`/... vía `logger.cli()` |
62
+ | [Playground](docs/playground.md) | Renderers raw y `Logger` wrappers para terminales |
63
+ | [Core Logger](docs/core.md) | `CoreLogger` minimal (~360 líneas) para Node/CLI ligeros |
64
+ | [Node (reserved)](docs/node.md) | Subpath reservado para futuras features Node-only |
65
+ | [Migración 0.18.x](docs/migration-v0.18.md) | Breaking changes desde 1.x–5.x |
66
+ | [API Reference](docs/api/) | TypeDoc generado, 164 archivos |
67
+
68
68
  ## 📊 Niveles de log
69
69
 
70
70
  ```text
71
71
  trace(-1) < debug(0) < info(1) < warn(2) < error(3) < critical(4)
72
72
  ```
73
73
 
74
- `trace` es el nivel más bajo, alineado con la banda TRACE de OpenTelemetry (severity 1-4). Cada `TransportRecord` incluye `severityNumber` y `severityText` OTel automáticamente.
74
+ `success()` emite a nivel `info` con `tag: 'success'` para que transports distingan success de info genérico.
75
75
 
76
76
  ```typescript
77
- import { LOG_LEVELS } from '@mks2508/better-logger';
78
-
79
- logger.setVerbosity('debug'); // muestra trace + debug + ...
77
+ logger.setVerbosity('debug'); // trace + debug + info + ...
80
78
  logger.setVerbosity('warn'); // solo warn, error, critical
81
79
  logger.setVerbosity('silent'); // nada
82
80
  ```
83
81
 
84
- `success()` emite a **INFO severity** (con styling de success y `tag: 'success'` en el record, para que transports distingan success de info genérico).
85
-
86
- ## 🧩 Log Context (MDC)
87
-
88
- Contexto estructurado que se adjunta a **cada** log emitido y se mergea en `TransportRecord.attributes`:
89
-
90
- ```typescript
91
- // Mutar el logger (chaining)
92
- logger.withContext({ requestId: 'req_123', userId: 'u_42' });
93
- logger.info('processing'); // → attributes: { requestId, userId }
94
-
95
- // Limpiar
96
- logger.clearContext();
97
-
98
- // Snapshot read-only
99
- const ctx = logger.getContext();
100
- ```
101
-
102
- ### Loggers hijuelos (inmutables)
103
-
104
- `child()` devuelve un logger nuevo con contexto merged, **sin tocar al padre** — ideal para request-scoped logging:
105
-
106
- ```typescript
107
- const requestLogger = logger.child({ requestId: getRequestId() });
108
- requestLogger.info('auth ok'); // lleva requestId
109
- logger.info('unrelated'); // NO lleva requestId (padre intacto)
110
- ```
111
-
112
- ### Resource OTel
113
-
114
- ```typescript
115
- logger.setResource({
116
- 'service.name': 'my-app',
117
- 'service.version': '1.2.3',
118
- 'deployment.environment': 'production'
119
- });
120
- ```
121
-
122
- ## 📡 Transports
123
-
124
- Los transports reciben cada `TransportRecord` y lo mandan a un destino. Se registran con `addTransport()`:
125
-
126
- ```typescript
127
- import logger, { FileTransport, HttpTransport, OtlpTransport } from '@mks2508/better-logger';
128
- ```
129
-
130
- ### File (Node.js)
131
-
132
- ```typescript
133
- logger.addTransport({
134
- target: new FileTransport({
135
- destination: '/var/log/app.log',
136
- batchSize: 100,
137
- flushInterval: 5000,
138
- maxBufferSize: 10_000 // hard cap, drop oldest on overflow
139
- }),
140
- level: 'info'
141
- });
142
- ```
143
-
144
- - Escritura **async** con `fs.promises` (no bloquea el event loop)
145
- - **Bounded buffer** — si se llena, dropea el record más viejo (avisa vía `onError`)
146
- - Sanitización de `destination` (sin path traversal)
147
- - En **browser**: fallback silencioso a `localStorage`
148
-
149
- ### HTTP
150
-
151
- ```typescript
152
- logger.addTransport({
153
- target: new HttpTransport({
154
- url: 'https://logs.example.com/ingest',
155
- batchSize: 50,
156
- flushInterval: 5000,
157
- maxBufferSize: 10_000,
158
- maxRetries: 3,
159
- headers: { 'Authorization': `Bearer ${process.env.LOG_TOKEN}` }
160
- }),
161
- level: 'warn'
162
- });
163
- ```
164
-
165
- - Batching + flush periódico
166
- - **Retry con backoff exponencial** (bounded)
167
- - **Status check** — solo re-bufferea en errores recuperables (5xx, red), descarta en 4xx
168
- - Bounded buffer (sin OOM en outages largos)
169
-
170
- ### OTLP → SigNoz (o cualquier backend OTLP/HTTP)
171
-
172
- ```typescript
173
- logger.addTransport({
174
- target: new OtlpTransport({
175
- endpoint: 'https://otelcollector.example.com:4318',
176
- serviceName: 'my-app', // requerido (service.name)
177
- serviceVersion: '1.2.3',
178
- environment: 'production',
179
- ingestKeyEnvVar: 'SIGNOZ_KEY', // lee process.env.SIGNOZ_KEY — NUNCA hardcodear
180
- batchSize: 50,
181
- flushInterval: 5000
182
- })
183
- });
184
-
185
- logger.info('Hola desde better-logger → SigNoz');
186
- // → POST <endpoint>/v1/logs con payload OTLP/HTTP JSON
187
- // → visible en SigNoz Logs UI
188
- ```
189
-
190
- El transport POSTea a `<endpoint>/v1/logs` con el body `LogsData` spec-compliant (`resourceLogs` → `scopeLogs` → `logRecords`). La ingestion key se lee de la **env var** indicada en `ingestKeyEnvVar` al construir el transport — no se escribe en código ni en el record.
191
-
192
- > 🔐 **Seguridad:** la key vive en tu gestor de secrets (Bitwarden / Coolify env) y se inyecta vía `process.env`. El transport no la loguea ni la serializa.
193
-
194
- ### Registry de strings
195
-
196
- Para los 4 built-ins puedes usar el nombre en vez de la instancia:
197
-
198
- ```typescript
199
- logger.addTransport({ target: 'file', options: { destination: '/var/log/app.log' } });
200
- logger.addTransport({ target: 'console' });
201
- ```
202
-
203
- Para Otlp conviene la **instancia directa** (opciones tipadas: `endpoint`, `serviceName`, `ingestKeyEnvVar`).
204
-
205
- ### Custom transport
206
-
207
- ```typescript
208
- import type { ITransport, TransportRecord } from '@mks2508/better-logger';
209
-
210
- const elastic: ITransport = {
211
- name: 'elasticsearch',
212
- async write(record: TransportRecord) {
213
- await fetch('https://es.example.com/logs/_doc', {
214
- method: 'POST',
215
- headers: { 'content-type': 'application/json' },
216
- body: JSON.stringify(record)
217
- });
218
- },
219
- async flush() { /* ... */ },
220
- async close() { /* ... */ }
221
- };
222
-
223
- logger.addTransport({ target: elastic });
224
- ```
225
-
226
- ### Flush y shutdown
227
-
228
- ```typescript
229
- await logger.flushTransports(); // fuerza el envío del buffer
230
- await logger.closeTransports(); // cierra todos (drain)
231
- ```
232
-
233
- En shutdown limpio: `await logger.cleanup()` hace drain de transports + reset de estado.
234
-
235
- ## 🪝 Hooks & Middleware
236
-
237
- ```typescript
238
- // beforeLog es AWAITED — las mutaciones se reflejan en el mensaje emitido
239
- logger.on('beforeLog', (entry) => {
240
- entry.message = entry.message.replace(/password=\S+/g, 'password=***');
241
- return entry;
242
- });
243
-
244
- // afterLog es fire-and-forget (no cambia el mensaje ya en pantalla)
245
- logger.on('afterLog', (entry) => {
246
- metrics.increment(`logs.${entry.level}`);
247
- });
248
-
249
- // Correlation ID en cada log
250
- logger.use((entry, next) => {
251
- entry.correlationId = getCorrelationId();
252
- next();
253
- });
254
- ```
255
-
256
- `on()` / `once()` / `off()` / `use()` devuelven una función de unsub.
257
-
258
- ## 🧬 Serializers
259
-
260
- Transforma tipos antes de serializarlos al log:
261
-
262
- ```typescript
263
- logger.addSerializer(Error, (err) => ({
264
- name: err.name,
265
- message: err.message,
266
- stack: err.stack?.split('\n').slice(0, 5)
267
- }));
268
-
269
- logger.addSerializer(User, (user) => ({
270
- id: user.id,
271
- email: user.email // password omitido
272
- }));
273
-
274
- logger.error('Failed:', new Error('timeout')); // Error serializado custom
275
- ```
276
-
277
- ## 🏷️ Scoped Loggers
278
-
279
- ```typescript
280
- // Scope simple
281
- const auth = logger.scope('Auth');
282
- auth.info('validating token');
283
-
284
- // Component (auto-badge COMPONENT)
285
- const db = logger.component('Database');
286
- db.lifecycle('connect', 'pool ready');
287
-
288
- // API (auto-badge API, +métodos slow/rateLimit/auth/deprecated)
289
- const api = logger.api('GraphQL');
290
- api.slow('query timeout', 1200);
291
- api.deprecated('use v2 endpoint');
292
- ```
293
-
294
- ### Context logger (bloques anidados)
295
-
296
- ```typescript
297
- const request = logger.scope('Request');
298
-
299
- await request.context('auth').runAsync(async () => {
300
- // prefix efectivo: "Request:auth"
301
- request.info('checking credentials');
302
- await request.context('db').runAsync(async () => {
303
- // prefix: "Request:auth:db"
304
- request.info('querying user');
305
- });
306
- });
307
- ```
308
-
309
- ## 🎨 Styling
310
-
311
- ```typescript
312
- // Presets
313
- logger.preset('cyberpunk'); // neón, glow
314
- logger.preset('glassmorphism'); // blur moderno
315
- logger.preset('minimal');
316
- logger.preset('debug');
317
-
318
- // Toggles
319
- logger.hideTimestamp().showLocation().hideBadges();
320
-
321
- // Tema
322
- logger.setTheme('dark'); // 'default' | 'dark' | 'light' | 'neon' | 'minimal' | 'cyberpunk'
323
- ```
324
-
325
- ### Estilos custom (StyleBuilder)
326
-
327
- ```typescript
328
- import { createStyle } from '@mks2508/better-logger';
329
-
330
- const style = createStyle()
331
- .bg('linear-gradient(45deg, #667eea, #764ba2)')
332
- .color('white')
333
- .padding('12px 24px')
334
- .rounded('8px')
335
- .shadow('0 4px 15px rgba(102, 126, 234, 0.4)')
336
- .build();
337
-
338
- console.log('%c🚀 Hello', style);
339
- ```
340
-
341
- ## 🖥️ CLI Primitives
342
-
343
- Spinners, boxes, tablas, steps y headers para CLIs Node.js:
344
-
345
- ```typescript
346
- logger.header('Deploy', 'production');
347
- logger.step(2, 5, 'building');
348
- logger.spinner('uploading...');
349
-
350
- logger.box('Build complete', { border: 'round' });
351
- logger.cliTable([
352
- { service: 'api', status: 'ok' },
353
- { service: 'db', status: 'ok' }
354
- ]);
355
- ```
356
-
357
- ## 🔧 Configuración avanzada
358
-
359
- ```typescript
360
- import { Logger } from '@mks2508/better-logger';
361
-
362
- const logger = new Logger({
363
- prefix: 'APP',
364
- verbosity: 'debug',
365
- enableStackTrace: true,
366
- theme: 'dark',
367
- timestampFormat: 'iso'
368
- });
369
-
370
- logger.updateConfig({ verbosity: 'warn' });
371
- logger.resetConfig();
372
- ```
373
-
374
82
  ## 🌐 Compatibilidad
375
83
 
376
- - ✅ **Browsers modernos** — soporte completo (CSS, DevTools, localStorage fallback)
84
+ - ✅ **Browsers modernos** — soporte completo (CSS, DevTools, `localStorage` fallback)
377
85
  - ✅ **Node.js** — core + transports (File async, HTTP, OTLP)
378
- - ✅ **TypeScript** — definiciones completas
379
- - ✅ **ESM & CommonJS** — ambos exports
380
-
381
- ## 🔗 Recursos
382
-
383
- - 📦 **[NPM](https://www.npmjs.com/package/@mks2508/better-logger)**
384
- - 📚 **[Documentación](docs/)** — [API](docs/API.md) · [Core](docs/CORE.md) · [Exports](docs/EXPORTS.md) · [Styling](docs/STYLING.md)
385
- - 🐛 **[Issues](https://github.com/MKS2508/advanced-logger/issues)**
86
+ - ✅ **TypeScript** — definiciones completas, cero `any` en superficie pública
87
+ - ✅ **ESM & CommonJS** — ambos exports; subpath layout (`./transports`, `./context`, `./hooks`, `./serializers`, `./styles`, `./cli`, `./playground`, `./core`)
386
88
 
387
89
  ## 📄 Licencia
388
90
 
389
- MIT — ver [LICENSE](LICENSE).
91
+ MIT — ver [LICENSE](LICENSE).