@mks2508/better-logger 0.14.0-alpha.2 → 0.18.2-alpha.2

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 (472) hide show
  1. package/README.md +50 -244
  2. package/dist/Logger.d.ts +662 -202
  3. package/dist/Logger.d.ts.map +1 -1
  4. package/dist/ScopedLogger.d.ts +434 -175
  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-BaMXleWj.cjs +105 -0
  11. package/dist/chunks/LogContext-BaMXleWj.cjs.map +1 -0
  12. package/dist/chunks/LogContext-DjlITOzZ.js +100 -0
  13. package/dist/chunks/LogContext-DjlITOzZ.js.map +1 -0
  14. package/dist/chunks/SerializerBridge-Ba43Mk7j.js +393 -0
  15. package/dist/chunks/SerializerBridge-Ba43Mk7j.js.map +1 -0
  16. package/dist/chunks/SerializerBridge-C4a9Z37F.cjs +410 -0
  17. package/dist/chunks/SerializerBridge-C4a9Z37F.cjs.map +1 -0
  18. package/dist/chunks/StyleManager-DQ6UNRB-.cjs +118 -0
  19. package/dist/chunks/StyleManager-DQ6UNRB-.cjs.map +1 -0
  20. package/dist/chunks/StyleManager-DjwAYbxE.js +113 -0
  21. package/dist/chunks/StyleManager-DjwAYbxE.js.map +1 -0
  22. package/dist/chunks/core-Blfi2klP.js +31 -0
  23. package/dist/chunks/core-Blfi2klP.js.map +1 -0
  24. package/dist/chunks/core-CqS_UBzJ.cjs +36 -0
  25. package/dist/chunks/core-CqS_UBzJ.cjs.map +1 -0
  26. package/dist/chunks/environment-detector-7NvnYUfr.js +110 -0
  27. package/dist/chunks/environment-detector-7NvnYUfr.js.map +1 -0
  28. package/dist/chunks/environment-detector-D-tHkKWA.cjs +163 -0
  29. package/dist/chunks/environment-detector-D-tHkKWA.cjs.map +1 -0
  30. package/dist/chunks/server-fallback-CaCPjWby.cjs +119 -0
  31. package/dist/chunks/server-fallback-CaCPjWby.cjs.map +1 -0
  32. package/dist/chunks/server-fallback-jj0T6XaK.js +114 -0
  33. package/dist/chunks/server-fallback-jj0T6XaK.js.map +1 -0
  34. package/dist/chunks/spinner-BHyYEXsM.cjs +1029 -0
  35. package/dist/chunks/spinner-BHyYEXsM.cjs.map +1 -0
  36. package/dist/chunks/spinner-BtkwpzYv.js +982 -0
  37. package/dist/chunks/spinner-BtkwpzYv.js.map +1 -0
  38. package/dist/chunks/styling-CRw3KQW4.js +1592 -0
  39. package/dist/chunks/styling-CRw3KQW4.js.map +1 -0
  40. package/dist/chunks/styling-Cel2wPRy.cjs +1645 -0
  41. package/dist/chunks/styling-Cel2wPRy.cjs.map +1 -0
  42. package/dist/chunks/transports-BGfwwakw.js +1237 -0
  43. package/dist/chunks/transports-BGfwwakw.js.map +1 -0
  44. package/dist/chunks/transports-yK6CL0Ml.cjs +1278 -0
  45. package/dist/chunks/transports-yK6CL0Ml.cjs.map +1 -0
  46. package/dist/chunks/utils-W_cxqriN.cjs +705 -0
  47. package/dist/chunks/utils-W_cxqriN.cjs.map +1 -0
  48. package/dist/chunks/utils-tKfBAWUM.js +586 -0
  49. package/dist/chunks/utils-tKfBAWUM.js.map +1 -0
  50. package/dist/cli/CommandProcessor.d.ts +166 -19
  51. package/dist/cli/CommandProcessor.d.ts.map +1 -1
  52. package/dist/cli/commands/ConfigCommand.d.ts +36 -1
  53. package/dist/cli/commands/ConfigCommand.d.ts.map +1 -1
  54. package/dist/cli/commands/ExportCommand.d.ts +54 -26
  55. package/dist/cli/commands/ExportCommand.d.ts.map +1 -1
  56. package/dist/cli/commands/ThemeCommand.d.ts +62 -3
  57. package/dist/cli/commands/ThemeCommand.d.ts.map +1 -1
  58. package/dist/cli/help.d.ts +30 -2
  59. package/dist/cli/help.d.ts.map +1 -1
  60. package/dist/cli/index.d.ts +30 -4
  61. package/dist/cli/index.d.ts.map +1 -1
  62. package/dist/cli-module.d.ts +13 -0
  63. package/dist/cli-module.d.ts.map +1 -0
  64. package/dist/cli.cjs +11 -0
  65. package/dist/cli.js +3 -0
  66. package/dist/constants.d.ts +16 -47
  67. package/dist/constants.d.ts.map +1 -1
  68. package/dist/context/LogContext.d.ts +245 -0
  69. package/dist/context/LogContext.d.ts.map +1 -0
  70. package/dist/context/index.d.ts +6 -0
  71. package/dist/context/index.d.ts.map +1 -0
  72. package/dist/context-module.d.ts +6 -0
  73. package/dist/context-module.d.ts.map +1 -0
  74. package/dist/context.cjs +3 -0
  75. package/dist/context.js +2 -0
  76. package/dist/core.cjs +304 -2
  77. package/dist/core.cjs.map +1 -1
  78. package/dist/core.d.ts +56 -34
  79. package/dist/core.d.ts.map +1 -1
  80. package/dist/core.js +281 -314
  81. package/dist/core.js.map +1 -1
  82. package/dist/hooks/HookBridge.d.ts +32 -0
  83. package/dist/hooks/HookBridge.d.ts.map +1 -0
  84. package/dist/hooks/HookManager.d.ts +319 -0
  85. package/dist/hooks/HookManager.d.ts.map +1 -0
  86. package/dist/hooks/index.d.ts +7 -0
  87. package/dist/hooks/index.d.ts.map +1 -0
  88. package/dist/hooks-module.d.ts +7 -0
  89. package/dist/hooks-module.d.ts.map +1 -0
  90. package/dist/hooks.cjs +5 -0
  91. package/dist/hooks.js +2 -0
  92. package/dist/index.cjs +3402 -2
  93. package/dist/index.cjs.map +1 -1
  94. package/dist/index.d.ts +42 -130
  95. package/dist/index.d.ts.map +1 -1
  96. package/dist/index.js +3327 -158
  97. package/dist/index.js.map +1 -1
  98. package/dist/node-module.d.ts +10 -0
  99. package/dist/node-module.d.ts.map +1 -0
  100. package/dist/node.cjs +13 -0
  101. package/dist/node.cjs.map +1 -0
  102. package/dist/node.js +12 -0
  103. package/dist/node.js.map +1 -0
  104. package/dist/playground/TerminalBridge.d.ts +53 -0
  105. package/dist/playground/TerminalBridge.d.ts.map +1 -0
  106. package/dist/playground/box.d.ts +45 -0
  107. package/dist/playground/box.d.ts.map +1 -0
  108. package/dist/playground/cli-table.d.ts +50 -0
  109. package/dist/playground/cli-table.d.ts.map +1 -0
  110. package/dist/playground/divider.d.ts +29 -0
  111. package/dist/playground/divider.d.ts.map +1 -0
  112. package/dist/playground/header.d.ts +28 -0
  113. package/dist/playground/header.d.ts.map +1 -0
  114. package/dist/playground/index.d.ts +11 -0
  115. package/dist/playground/index.d.ts.map +1 -0
  116. package/dist/playground/server-fallback.d.ts +114 -0
  117. package/dist/playground/server-fallback.d.ts.map +1 -0
  118. package/dist/playground/spinner.d.ts +197 -0
  119. package/dist/playground/spinner.d.ts.map +1 -0
  120. package/dist/playground/step.d.ts +33 -0
  121. package/dist/playground/step.d.ts.map +1 -0
  122. package/dist/playground-module.d.ts +11 -0
  123. package/dist/playground-module.d.ts.map +1 -0
  124. package/dist/playground.cjs +9 -0
  125. package/dist/playground.js +2 -0
  126. package/dist/serializers/SerializerBridge.d.ts +28 -0
  127. package/dist/serializers/SerializerBridge.d.ts.map +1 -0
  128. package/dist/serializers/SerializerRegistry.d.ts +252 -0
  129. package/dist/serializers/SerializerRegistry.d.ts.map +1 -0
  130. package/dist/serializers/index.d.ts +7 -0
  131. package/dist/serializers/index.d.ts.map +1 -0
  132. package/dist/serializers-module.d.ts +7 -0
  133. package/dist/serializers-module.d.ts.map +1 -0
  134. package/dist/serializers.cjs +5 -0
  135. package/dist/serializers.js +2 -0
  136. package/dist/styles/StyleManager.d.ts +190 -0
  137. package/dist/styles/StyleManager.d.ts.map +1 -0
  138. package/dist/styles/index.d.ts +7 -0
  139. package/dist/styles/index.d.ts.map +1 -0
  140. package/dist/styles-module.d.ts +7 -0
  141. package/dist/styles-module.d.ts.map +1 -0
  142. package/dist/styles.cjs +7 -0
  143. package/dist/styles.js +3 -0
  144. package/dist/styling/SmartPresets.d.ts +100 -6
  145. package/dist/styling/SmartPresets.d.ts.map +1 -1
  146. package/dist/styling/StyleBuilder.d.ts +453 -32
  147. package/dist/styling/StyleBuilder.d.ts.map +1 -1
  148. package/dist/styling/banners.d.ts +85 -5
  149. package/dist/styling/banners.d.ts.map +1 -1
  150. package/dist/styling/index.d.ts +8 -3
  151. package/dist/styling/index.d.ts.map +1 -1
  152. package/dist/styling/themes.d.ts +41 -2
  153. package/dist/styling/themes.d.ts.map +1 -1
  154. package/dist/terminal/color-converter.d.ts +73 -0
  155. package/dist/terminal/color-converter.d.ts.map +1 -0
  156. package/dist/terminal/formatter.d.ts +23 -0
  157. package/dist/terminal/formatter.d.ts.map +1 -0
  158. package/dist/transports/ConsoleTransport.d.ts +104 -0
  159. package/dist/transports/ConsoleTransport.d.ts.map +1 -0
  160. package/dist/transports/FileTransport.d.ts +137 -0
  161. package/dist/transports/FileTransport.d.ts.map +1 -0
  162. package/dist/transports/HttpTransport.d.ts +180 -0
  163. package/dist/transports/HttpTransport.d.ts.map +1 -0
  164. package/dist/transports/OtlpTransport.d.ts +165 -0
  165. package/dist/transports/OtlpTransport.d.ts.map +1 -0
  166. package/dist/transports/TransportBridge.d.ts +43 -0
  167. package/dist/transports/TransportBridge.d.ts.map +1 -0
  168. package/dist/transports/TransportManager.d.ts +251 -0
  169. package/dist/transports/TransportManager.d.ts.map +1 -0
  170. package/dist/transports/index.d.ts +6 -0
  171. package/dist/transports/index.d.ts.map +1 -0
  172. package/dist/transports-module.d.ts +10 -0
  173. package/dist/transports-module.d.ts.map +1 -0
  174. package/dist/transports.cjs +7 -0
  175. package/dist/transports.js +2 -0
  176. package/dist/types/core.d.ts +295 -17
  177. package/dist/types/core.d.ts.map +1 -1
  178. package/dist/types/handlers.d.ts +0 -67
  179. package/dist/types/handlers.d.ts.map +1 -1
  180. package/dist/types/hooks.d.ts +138 -0
  181. package/dist/types/hooks.d.ts.map +1 -0
  182. package/dist/types/index.d.ts +7 -3
  183. package/dist/types/index.d.ts.map +1 -1
  184. package/dist/types/serializers.d.ts +97 -0
  185. package/dist/types/serializers.d.ts.map +1 -0
  186. package/dist/types/transports.d.ts +132 -0
  187. package/dist/types/transports.d.ts.map +1 -0
  188. package/dist/utils/ansi-colors.d.ts +115 -0
  189. package/dist/utils/ansi-colors.d.ts.map +1 -0
  190. package/dist/utils/environment-detector.d.ts +53 -0
  191. package/dist/utils/environment-detector.d.ts.map +1 -0
  192. package/dist/utils/formatting.d.ts +9 -8
  193. package/dist/utils/formatting.d.ts.map +1 -1
  194. package/dist/utils/index.d.ts +3 -2
  195. package/dist/utils/index.d.ts.map +1 -1
  196. package/dist/utils/output.d.ts +14 -17
  197. package/dist/utils/output.d.ts.map +1 -1
  198. package/dist/utils/stackTrace.d.ts +2 -2
  199. package/dist/utils/stackTrace.d.ts.map +1 -1
  200. package/dist/utils/timestamps.d.ts +0 -12
  201. package/dist/utils/timestamps.d.ts.map +1 -1
  202. package/package.json +95 -21
  203. package/.claude/settings.local.json +0 -39
  204. package/.github/workflows/ci-quality.yml +0 -357
  205. package/.github/workflows/docs-demo.yml +0 -119
  206. package/.github/workflows/releases-core.yml +0 -512
  207. package/.github/workflows/releases-full.yml +0 -582
  208. package/.github/workflows-backup/ci.yml +0 -221
  209. package/.github/workflows-backup/nightly.yml +0 -196
  210. package/.github/workflows-backup/release-optimized.yml +0 -373
  211. package/.github/workflows-backup/release.yml +0 -269
  212. package/.release-notes-0.2.0.md +0 -129
  213. package/.yamllint +0 -28
  214. package/CHANGELOG.json +0 -865
  215. package/CLAUDE.md +0 -204
  216. package/bun.lock +0 -323
  217. package/demo.html +0 -847
  218. package/dist/.tsbuildinfo +0 -1
  219. package/dist/Logger.js +0 -1124
  220. package/dist/ScopedLogger.js +0 -426
  221. package/dist/chunks/Logger-Crw1woqR.js +0 -3464
  222. package/dist/chunks/Logger-Crw1woqR.js.map +0 -1
  223. package/dist/chunks/Logger-D_p3xnbq.js +0 -2
  224. package/dist/chunks/Logger-D_p3xnbq.js.map +0 -1
  225. package/dist/chunks/RemoteLogHandler-CjWpWZGl.js +0 -33
  226. package/dist/chunks/RemoteLogHandler-CjWpWZGl.js.map +0 -1
  227. package/dist/chunks/RemoteLogHandler-ymkQ97xl.js +0 -2
  228. package/dist/chunks/RemoteLogHandler-ymkQ97xl.js.map +0 -1
  229. package/dist/chunks/environment-Bxbnw4pd.js +0 -544
  230. package/dist/chunks/environment-Bxbnw4pd.js.map +0 -1
  231. package/dist/chunks/environment-Dm66zOML.js +0 -4
  232. package/dist/chunks/environment-Dm66zOML.js.map +0 -1
  233. package/dist/chunks/formatting-C0riPC5_.js +0 -95
  234. package/dist/chunks/formatting-C0riPC5_.js.map +0 -1
  235. package/dist/chunks/formatting-DNCAV66-.js +0 -2
  236. package/dist/chunks/formatting-DNCAV66-.js.map +0 -1
  237. package/dist/cli/CommandProcessor.js +0 -184
  238. package/dist/cli/commands/ConfigCommand.js +0 -88
  239. package/dist/cli/commands/ExportCommand.js +0 -243
  240. package/dist/cli/commands/HistoryCommand.d.ts +0 -50
  241. package/dist/cli/commands/HistoryCommand.d.ts.map +0 -1
  242. package/dist/cli/commands/HistoryCommand.js +0 -96
  243. package/dist/cli/commands/StatusCommand.d.ts +0 -33
  244. package/dist/cli/commands/StatusCommand.d.ts.map +0 -1
  245. package/dist/cli/commands/StatusCommand.js +0 -93
  246. package/dist/cli/commands/ThemeCommand.js +0 -79
  247. package/dist/cli/help.js +0 -118
  248. package/dist/cli/index.js +0 -46
  249. package/dist/constants.js +0 -159
  250. package/dist/example.d.ts +0 -18
  251. package/dist/example.d.ts.map +0 -1
  252. package/dist/example.js +0 -154
  253. package/dist/exports-module.d.ts +0 -203
  254. package/dist/exports-module.d.ts.map +0 -1
  255. package/dist/exports-module.js +0 -260
  256. package/dist/exports.cjs +0 -2
  257. package/dist/exports.cjs.map +0 -1
  258. package/dist/exports.js +0 -238
  259. package/dist/exports.js.map +0 -1
  260. package/dist/handlers/AnalyticsLogHandler.d.ts +0 -11
  261. package/dist/handlers/AnalyticsLogHandler.d.ts.map +0 -1
  262. package/dist/handlers/AnalyticsLogHandler.js +0 -19
  263. package/dist/handlers/ExportLogHandler.d.ts +0 -103
  264. package/dist/handlers/ExportLogHandler.d.ts.map +0 -1
  265. package/dist/handlers/ExportLogHandler.js +0 -516
  266. package/dist/handlers/FileLogHandler.d.ts +0 -36
  267. package/dist/handlers/FileLogHandler.d.ts.map +0 -1
  268. package/dist/handlers/FileLogHandler.js +0 -156
  269. package/dist/handlers/RemoteLogHandler.d.ts +0 -14
  270. package/dist/handlers/RemoteLogHandler.d.ts.map +0 -1
  271. package/dist/handlers/RemoteLogHandler.js +0 -37
  272. package/dist/handlers/index.d.ts +0 -8
  273. package/dist/handlers/index.d.ts.map +0 -1
  274. package/dist/handlers/index.js +0 -7
  275. package/dist/main.d.ts +0 -2
  276. package/dist/main.d.ts.map +0 -1
  277. package/dist/main.js +0 -139
  278. package/dist/styling/LogStyleBuilder.d.ts +0 -149
  279. package/dist/styling/LogStyleBuilder.d.ts.map +0 -1
  280. package/dist/styling/LogStyleBuilder.js +0 -289
  281. package/dist/styling/SemanticStyles.d.ts +0 -181
  282. package/dist/styling/SemanticStyles.d.ts.map +0 -1
  283. package/dist/styling/SemanticStyles.js +0 -339
  284. package/dist/styling/SmartPresets.js +0 -276
  285. package/dist/styling/StyleBuilder.js +0 -280
  286. package/dist/styling/banners.js +0 -155
  287. package/dist/styling/index.js +0 -9
  288. package/dist/styling/themes.js +0 -231
  289. package/dist/styling-module.d.ts +0 -185
  290. package/dist/styling-module.d.ts.map +0 -1
  291. package/dist/styling-module.js +0 -199
  292. package/dist/styling.cjs +0 -2
  293. package/dist/styling.cjs.map +0 -1
  294. package/dist/styling.js +0 -146
  295. package/dist/styling.js.map +0 -1
  296. package/dist/types/Logger.d.ts +0 -700
  297. package/dist/types/Logger.d.ts.map +0 -1
  298. package/dist/types/ScopedLogger.d.ts +0 -310
  299. package/dist/types/ScopedLogger.d.ts.map +0 -1
  300. package/dist/types/cli/CommandProcessor.d.ts +0 -100
  301. package/dist/types/cli/CommandProcessor.d.ts.map +0 -1
  302. package/dist/types/cli/commands/ConfigCommand.d.ts +0 -14
  303. package/dist/types/cli/commands/ConfigCommand.d.ts.map +0 -1
  304. package/dist/types/cli/commands/ExportCommand.d.ts +0 -48
  305. package/dist/types/cli/commands/ExportCommand.d.ts.map +0 -1
  306. package/dist/types/cli/commands/HistoryCommand.d.ts +0 -47
  307. package/dist/types/cli/commands/HistoryCommand.d.ts.map +0 -1
  308. package/dist/types/cli/commands/StatusCommand.d.ts +0 -30
  309. package/dist/types/cli/commands/StatusCommand.d.ts.map +0 -1
  310. package/dist/types/cli/commands/ThemeCommand.d.ts +0 -30
  311. package/dist/types/cli/commands/ThemeCommand.d.ts.map +0 -1
  312. package/dist/types/cli/help.d.ts +0 -12
  313. package/dist/types/cli/help.d.ts.map +0 -1
  314. package/dist/types/cli/index.d.ts +0 -15
  315. package/dist/types/cli/index.d.ts.map +0 -1
  316. package/dist/types/constants.d.ts +0 -119
  317. package/dist/types/constants.d.ts.map +0 -1
  318. package/dist/types/core.js +0 -28
  319. package/dist/types/example.d.ts +0 -18
  320. package/dist/types/example.d.ts.map +0 -1
  321. package/dist/types/exports-module.d.ts +0 -196
  322. package/dist/types/exports-module.d.ts.map +0 -1
  323. package/dist/types/handlers/AnalyticsLogHandler.d.ts +0 -8
  324. package/dist/types/handlers/AnalyticsLogHandler.d.ts.map +0 -1
  325. package/dist/types/handlers/ExportLogHandler.d.ts +0 -100
  326. package/dist/types/handlers/ExportLogHandler.d.ts.map +0 -1
  327. package/dist/types/handlers/FileLogHandler.d.ts +0 -33
  328. package/dist/types/handlers/FileLogHandler.d.ts.map +0 -1
  329. package/dist/types/handlers/RemoteLogHandler.d.ts +0 -11
  330. package/dist/types/handlers/RemoteLogHandler.d.ts.map +0 -1
  331. package/dist/types/handlers/index.d.ts +0 -8
  332. package/dist/types/handlers/index.d.ts.map +0 -1
  333. package/dist/types/handlers.js +0 -4
  334. package/dist/types/index.js +0 -4
  335. package/dist/types/main.d.ts +0 -2
  336. package/dist/types/main.d.ts.map +0 -1
  337. package/dist/types/styling/LogStyleBuilder.d.ts +0 -146
  338. package/dist/types/styling/LogStyleBuilder.d.ts.map +0 -1
  339. package/dist/types/styling/SemanticStyles.d.ts +0 -178
  340. package/dist/types/styling/SemanticStyles.d.ts.map +0 -1
  341. package/dist/types/styling/SmartPresets.d.ts +0 -22
  342. package/dist/types/styling/SmartPresets.d.ts.map +0 -1
  343. package/dist/types/styling/StyleBuilder.d.ts +0 -140
  344. package/dist/types/styling/StyleBuilder.d.ts.map +0 -1
  345. package/dist/types/styling/banners.d.ts +0 -42
  346. package/dist/types/styling/banners.d.ts.map +0 -1
  347. package/dist/types/styling/index.d.ts +0 -10
  348. package/dist/types/styling/index.d.ts.map +0 -1
  349. package/dist/types/styling/themes.d.ts +0 -7
  350. package/dist/types/styling/themes.d.ts.map +0 -1
  351. package/dist/types/styling-module.d.ts +0 -178
  352. package/dist/types/styling-module.d.ts.map +0 -1
  353. package/dist/types/types/core.d.ts +0 -221
  354. package/dist/types/types/core.d.ts.map +0 -1
  355. package/dist/types/types/handlers.d.ts +0 -85
  356. package/dist/types/types/handlers.d.ts.map +0 -1
  357. package/dist/types/types/index.d.ts +0 -7
  358. package/dist/types/types/index.d.ts.map +0 -1
  359. package/dist/types/utils/environment.d.ts +0 -47
  360. package/dist/types/utils/environment.d.ts.map +0 -1
  361. package/dist/types/utils/formatting.d.ts +0 -37
  362. package/dist/types/utils/formatting.d.ts.map +0 -1
  363. package/dist/types/utils/index.d.ts +0 -7
  364. package/dist/types/utils/index.d.ts.map +0 -1
  365. package/dist/types/utils/opentui-detection.d.ts +0 -34
  366. package/dist/types/utils/opentui-detection.d.ts.map +0 -1
  367. package/dist/types/utils/output.d.ts +0 -41
  368. package/dist/types/utils/output.d.ts.map +0 -1
  369. package/dist/types/utils/stackTrace.d.ts +0 -6
  370. package/dist/types/utils/stackTrace.d.ts.map +0 -1
  371. package/dist/types/utils/timestamps.d.ts +0 -20
  372. package/dist/types/utils/timestamps.d.ts.map +0 -1
  373. package/dist/utils/environment.d.ts +0 -47
  374. package/dist/utils/environment.d.ts.map +0 -1
  375. package/dist/utils/environment.js +0 -85
  376. package/dist/utils/formatting.js +0 -117
  377. package/dist/utils/index.js +0 -6
  378. package/dist/utils/opentui-detection.d.ts +0 -34
  379. package/dist/utils/opentui-detection.d.ts.map +0 -1
  380. package/dist/utils/opentui-detection.js +0 -116
  381. package/dist/utils/output.js +0 -150
  382. package/dist/utils/stackTrace.js +0 -81
  383. package/dist/utils/timestamps.js +0 -71
  384. package/dist/vite.svg +0 -1
  385. package/docs/API.md +0 -691
  386. package/docs/CORE.md +0 -264
  387. package/docs/DEVELOPMENT.md +0 -731
  388. package/docs/EXPORTS.md +0 -467
  389. package/docs/PACKAGES.md +0 -244
  390. package/docs/STYLING.md +0 -405
  391. package/docs/_config.yml +0 -36
  392. package/docs/index.md +0 -179
  393. package/examples/README.md +0 -208
  394. package/examples/basic-logging.js +0 -75
  395. package/examples/data-export.js +0 -234
  396. package/examples/package.json +0 -16
  397. package/examples/performance-timing.js +0 -170
  398. package/examples/simplified-api.js +0 -124
  399. package/examples/styling-themes.js +0 -207
  400. package/index.html +0 -358
  401. package/packages/core/package.json +0 -57
  402. package/packages/exports/package.json +0 -41
  403. package/packages/nodejs-opentui/README.md +0 -232
  404. package/packages/nodejs-opentui/package.json +0 -72
  405. package/packages/nodejs-opentui/src/LogRenderer.ts +0 -171
  406. package/packages/nodejs-opentui/src/OpenTUILogHandler.ts +0 -178
  407. package/packages/nodejs-opentui/src/components/LogBadge.tsx +0 -131
  408. package/packages/nodejs-opentui/src/index.ts +0 -133
  409. package/packages/nodejs-opentui/src/types.ts +0 -158
  410. package/packages/nodejs-opentui/tsconfig.json +0 -20
  411. package/packages/styling/package.json +0 -41
  412. package/project-utils/README.md +0 -172
  413. package/project-utils/auto-release-gemini.ts +0 -1193
  414. package/project-utils/auto-release-ui.ts +0 -1329
  415. package/project-utils/commit-generator.ts +0 -1385
  416. package/project-utils/commit-ui.ts +0 -264
  417. package/project-utils/git-utils.ts +0 -199
  418. package/project-utils/github-release-manager.ts +0 -466
  419. package/project-utils/project-config.ts +0 -260
  420. package/project-utils/prompt-templates.js +0 -345
  421. package/project-utils/prompt-templates.ts +0 -422
  422. package/project-utils/version-manager.ts +0 -1078
  423. package/public/vite.svg +0 -1
  424. package/src/Logger.ts +0 -1276
  425. package/src/ScopedLogger.ts +0 -454
  426. package/src/cli/CommandProcessor.ts +0 -248
  427. package/src/cli/commands/ConfigCommand.ts +0 -93
  428. package/src/cli/commands/ExportCommand.ts +0 -276
  429. package/src/cli/commands/HistoryCommand.ts +0 -117
  430. package/src/cli/commands/StatusCommand.ts +0 -112
  431. package/src/cli/commands/ThemeCommand.ts +0 -88
  432. package/src/cli/help.ts +0 -127
  433. package/src/cli/index.ts +0 -71
  434. package/src/constants.ts +0 -171
  435. package/src/core.ts +0 -393
  436. package/src/example.ts +0 -210
  437. package/src/exports-module.ts +0 -311
  438. package/src/handlers/AnalyticsLogHandler.ts +0 -22
  439. package/src/handlers/ExportLogHandler.ts +0 -609
  440. package/src/handlers/FileLogHandler.ts +0 -169
  441. package/src/handlers/RemoteLogHandler.ts +0 -42
  442. package/src/handlers/index.ts +0 -8
  443. package/src/index.ts +0 -209
  444. package/src/main.ts +0 -196
  445. package/src/style.css +0 -96
  446. package/src/styling/LogStyleBuilder.ts +0 -355
  447. package/src/styling/SemanticStyles.ts +0 -380
  448. package/src/styling/SmartPresets.ts +0 -288
  449. package/src/styling/StyleBuilder.ts +0 -319
  450. package/src/styling/banners.ts +0 -168
  451. package/src/styling/index.ts +0 -27
  452. package/src/styling/themes.ts +0 -235
  453. package/src/styling-module.ts +0 -244
  454. package/src/types/core.ts +0 -236
  455. package/src/types/handlers.ts +0 -95
  456. package/src/types/index.ts +0 -35
  457. package/src/typescript.svg +0 -1
  458. package/src/utils/environment.ts +0 -94
  459. package/src/utils/formatting.ts +0 -142
  460. package/src/utils/index.ts +0 -21
  461. package/src/utils/opentui-detection.ts +0 -138
  462. package/src/utils/output.ts +0 -185
  463. package/src/utils/stackTrace.ts +0 -95
  464. package/src/utils/timestamps.ts +0 -80
  465. package/src/vite-env.d.ts +0 -1
  466. package/test-core-browser.html +0 -237
  467. package/test-core-node.js +0 -63
  468. package/tests/test-conflict-resolution.ts +0 -391
  469. package/tests/validate-workflows.sh +0 -131
  470. package/tests/yaml-autofix.sh +0 -146
  471. package/tsconfig.json +0 -50
  472. package/vite.config.ts +0 -223
@@ -0,0 +1,100 @@
1
+ //#region src/context/LogContext.ts
2
+ const alsInstance = typeof AsyncLocalStorage !== "undefined" ? new AsyncLocalStorage() : void 0;
3
+ /**
4
+ * Factory que crea una instancia de {@link LogContext}.
5
+ *
6
+ * @param options - Configuración (ver {@link ILogContextOptions})
7
+ * @returns Una instancia de LogContext lista para usar
8
+ *
9
+ * @example
10
+ * const logContext = createLogContext({
11
+ * childLoggerFactory: (cfg) => new Logger(cfg),
12
+ * initialContext: { service: 'orders-api' },
13
+ * initialResource: { serviceName: 'orders-api', environment: 'prod' }
14
+ * });
15
+ *
16
+ * // Child inmutable con contexto persistente
17
+ * const requestLog = logContext.child({ requestId: 'abc-123' });
18
+ *
19
+ * // Scope transitorio vía ALS (Node; en browser sin ALS es no-op)
20
+ * logContext.withContext({ traceId: 't-9' }, () => {
21
+ * requestLog.info('procesando orden');
22
+ * });
23
+ */
24
+ function createLogContext(options) {
25
+ let context = { ...options.initialContext };
26
+ let resource = options.initialResource ? { ...options.initialResource } : void 0;
27
+ const als = options.alsInstance ?? alsInstance;
28
+ return {
29
+ getContext() {
30
+ return { ...context };
31
+ },
32
+ withContext(bindings, fn) {
33
+ if (!als) {
34
+ if (fn) return fn();
35
+ return;
36
+ }
37
+ if (!fn) return void 0;
38
+ const merged = {
39
+ ...context,
40
+ ...bindings
41
+ };
42
+ return als.run(merged, fn);
43
+ },
44
+ async withContextAsync(bindings, fn) {
45
+ if (!als) return fn();
46
+ const merged = {
47
+ ...context,
48
+ ...bindings
49
+ };
50
+ return als.run(merged, fn);
51
+ },
52
+ clearContext() {
53
+ context = {};
54
+ return this;
55
+ },
56
+ setResource(res) {
57
+ resource = {
58
+ ...resource,
59
+ ...res
60
+ };
61
+ return this;
62
+ },
63
+ child(_extra) {
64
+ const snapshot = this._getBaseContextRecord();
65
+ const childLogger = options.childLoggerFactory({});
66
+ childLogger["__parentSnapshot"] = snapshot;
67
+ return childLogger;
68
+ },
69
+ _getContextRecord() {
70
+ const base = this._getBaseContextRecord();
71
+ const alsContext = als?.getStore();
72
+ if (alsContext && Object.keys(alsContext).length > 0) return {
73
+ ...base,
74
+ ...alsContext
75
+ };
76
+ return base;
77
+ },
78
+ _getBaseContextRecord() {
79
+ let base = {};
80
+ const parentRecord = options.getParentContextRecord?.() ?? null;
81
+ if (parentRecord && Object.keys(parentRecord).length > 0) base = parentRecord;
82
+ else if (Object.keys(context).length > 0) base = context;
83
+ if (Object.keys(context).length > 0) base = {
84
+ ...base,
85
+ ...context
86
+ };
87
+ return base;
88
+ },
89
+ _getResource() {
90
+ return resource;
91
+ },
92
+ _getAlsStore() {
93
+ return als?.getStore();
94
+ }
95
+ };
96
+ }
97
+ //#endregion
98
+ export { createLogContext as t };
99
+
100
+ //# sourceMappingURL=LogContext-DjlITOzZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LogContext-DjlITOzZ.js","names":[],"sources":["../../src/context/LogContext.ts"],"sourcesContent":["/**\n * @fileoverview Bridge de LogContext — gestión de MDC (Mapped Diagnostic Context).\n *\n * Encapsula el contexto estructurado por logger, la creación de child loggers y\n * el merge de resource OTel en cada record emitido.\n *\n * Modelo de API:\n * - `withContext(bindings, fn?)` — si se pasa `fn`, lo ejecuta dentro de un\n * scope de AsyncLocalStorage mergeando `bindings`. Sin `fn`: no-op (shim de\n * backwards compat para la vieja forma de setter).\n * - `withContextAsync(bindings, fn)` — variante async callback.\n * - `child(bindings)` — inmutable (patrón canónico de MDC).\n * - Feature-detect de AsyncLocalStorage; en browser sin ALS es no-op.\n */\n\nimport type { ILogResourceRef } from '../types/index.js';\nimport type { LoggerConfig } from '../types/index.js';\n\n/**\n * Snapshot del contexto bound. Lo retorna {@link LogContext.getContext}.\n *\n * Es `Readonly` para marcar contractually que el objeto devuelto es una shallow\n * copy: mutarlo no afecta a los records que emitan futuras llamadas de log.\n */\nexport type ContextSnapshot = Readonly<Record<string, unknown>>;\n\n/**\n * Tipo de la factory function para crear instancias child de Logger.\n *\n * Se inyecta en LogContext para que `child()` pueda instanciar nuevos loggers\n * sin introducir un import circular entre `Logger.ts` y `LogContext.ts`.\n * Retorna `unknown` — la clase Logger concreta la maneja el caller, y la\n * instancia devuelta tiene su campo `context` escrito por LogContext tras la\n * creación.\n */\nexport type ChildLoggerFactory = (config: Partial<LoggerConfig>) => unknown;\n\n/**\n * Shape mínima de una instancia de Logger que LogContext necesita ver.\n *\n * Evita dependencias circulares entre LogContext y Logger. El campo\n * `_parentContextRecord` lo setea el Logger padre después de que\n * `LogContext.child()` retorna, estableciendo la cadena de contextos.\n */\nexport interface ChildLoggerShape {\n _parentContextRecord?: Record<string, unknown>;\n /** Campo legacy — ya no es la fuente canónica del contexto. */\n context?: Record<string, unknown>;\n}\n\n/**\n * Options que se pasan a {@link createLogContext}.\n */\nexport interface ILogContextOptions {\n /** Pares key-value iniciales del contexto. */\n initialContext?: Record<string, unknown>;\n /** Factory para crear instancias child de logger. */\n childLoggerFactory: ChildLoggerFactory;\n /** Resource OTel inicial a mergear en cada record emitido. */\n initialResource?: Partial<ILogResourceRef>;\n /**\n * Retorna el record de contexto mergeado del logger padre en el momento\n * de creación del child. Lo usa `_getContextRecord()` para construir la\n * cadena de contextos.\n * @internal\n */\n getParentContextRecord?: () => Record<string, unknown>;\n /**\n * Instancia de AsyncLocalStorage a usar para el scoping de `withContext`.\n * @internal\n */\n alsInstance?: ALS;\n}\n\n/**\n * Contrato que retorna {@link createLogContext}.\n *\n * Fachada de MDC (Mapped Diagnostic Context) por logger. Combina tres fuentes\n * de contexto:\n * - **base inmutable** vía `child()` (snapshot capturado al crear el child),\n * - **scope transitorio** vía `withContext()` / `withContextAsync()` sobre\n * AsyncLocalStorage,\n * - **resource OTel** mergeado en cada record.\n *\n * En entornos browser sin `AsyncLocalStorage`, las variantes `withContext*`\n * degradan a no-op: ejecutan `fn` sin scoping (o lo skipan si no hay `fn`).\n * `child()` sigue operativo en browser porque no depende de ALS.\n */\nexport interface LogContext {\n /**\n * Snapshot actual del contexto bound.\n *\n * @returns Copia inmutable (shallow) del contexto; mutarla no afecta a los\n * records que emitan futuras llamadas de log.\n *\n * @example\n * const ctx = logContext.getContext();\n * console.log(ctx.requestId); // 'abc-123'\n */\n getContext(): ContextSnapshot;\n\n /**\n * Ejecuta `fn` dentro de un scope de AsyncLocalStorage donde `bindings`\n * se mergean al contexto para todas las llamadas de log dentro de `fn`.\n *\n * Si no se pasa `fn` (la vieja forma de setter), es no-op por backwards\n * compatibility. Para binding persistente prefiere `child()`; para\n * callbacks async usa `withContextAsync()`.\n *\n * **Browser fallback**: sin ALS, ejecuta `fn` directamente sin scoping\n * (los bindings NO se mergean). Si tampoco hay `fn`, retorna `undefined`.\n *\n * @param bindings - Pares key-value a attachar durante la ejecución de `fn`\n * @param fn - Función sincrónica opcional a ejecutar bajo el scope ALS\n * @returns El valor de retorno de `fn`, o `undefined` si no se pasa `fn`\n *\n * @example\n * logContext.withContext({ requestId: 'abc-123' }, () => {\n * logger.info('procesando'); // el record lleva requestId=abc-123\n * });\n * // fuera de fn: requestId ya no está presente en próximos logs\n *\n * @see {@link LogContext.withContextAsync} para callbacks async\n * @see {@link LogContext.child} para binding persistente inmutable (sin ALS)\n */\n withContext<R>(bindings: Record<string, unknown>, fn?: () => R): R | undefined;\n\n /**\n * Variante async de {@link withContext}. Ejecuta `fn` dentro de un scope\n * de AsyncLocalStorage para que los bindings queden disponibles a todas las\n * llamadas de log async dentro de `fn` (incluso tras `await`).\n *\n * **Browser fallback**: sin ALS, ejecuta `fn` directamente sin scoping.\n *\n * @param bindings - Pares key-value a attachar durante la ejecución de `fn`\n * @param fn - Función async a ejecutar bajo el scope ALS\n * @returns El Promise retornado por `fn`\n *\n * @example\n * await logContext.withContextAsync({ traceId }, async () => {\n * const user = await fetchUser();\n * logger.info('user cargado', { id: user.id });\n * // el record lleva el traceId aunque el log ocurra tras un await\n * });\n */\n withContextAsync<R>(bindings: Record<string, unknown>, fn: () => Promise<R>): Promise<R>;\n\n /**\n * Droppea todas las keys del contexto bound. Tras esta llamada, los\n * records emitidos ya no llevan `attributes` hasta que\n * {@link withContext} o {@link child} restablezcan uno.\n *\n * @returns La misma instancia de LogContext, ahora sin contexto\n *\n * @example\n * logContext.clearContext();\n * logger.info('limpio'); // sin attributes\n */\n clearContext(): this;\n\n /**\n * Actualiza el resource OTel por defecto (service.name, version,\n * deployment.environment, ...).\n *\n * Se persiste en el campo `resource` de cada record emitido, salvo que el\n * propio record lo overridee.\n *\n * @param resource - Resource OTel parcial a mergear con el actual\n * @returns La misma instancia de LogContext, para encadenar calls\n *\n * @example\n * logContext.setResource({ serviceName: 'api-gateway', environment: 'prod' });\n */\n setResource(resource: Partial<ILogResourceRef>): this;\n\n /**\n * Devuelve una copia inmutable de este logger con el contexto extra bound.\n *\n * Las llamadas futuras sobre el child emiten con el contexto mergeado, sin\n * mutar al padre — patrón canónico de MDC.\n *\n * A diferencia de {@link withContext}, **no involucra AsyncLocalStorage**:\n * el binding es persistente y queda capturado en el snapshot del child al\n * crearse. Por eso `child()` es operativo también en browser sin ALS.\n *\n * Los bindings transitorios de ALS activos en el momento de `child()` NO\n * se bakean en el child — solo se captura el contexto base. ALS se aplica\n * fresco en cada dispatch vía `_getContextRecord()`.\n *\n * @param extra - Pares key-value a attachar (requestId, userId, ...)\n * @returns Un nuevo Logger con el contexto mergeado\n *\n * @example\n * const requestLog = logContext.child({ requestId: 'abc-123' });\n * requestLog.info('inicio'); // siempre lleva requestId=abc-123\n * requestLog.info('fin');\n * // el logger padre no se ve afectado por estos bindings\n *\n * @see {@link LogContext.withContext} para scoping transitorio (ALS)\n */\n child(extra: Record<string, unknown>): ChildLoggerShape;\n\n /**\n * Record de contexto interno. Expuesto para el ensamblado de TransportRecord\n * (base + overlay ALS si hay store activo).\n * @internal\n */\n _getContextRecord(): Record<string, unknown>;\n /**\n * Retorna el contexto base SIN el overlay de ALS.\n *\n * Lo usa `Logger.child()` para capturar el snapshot del contexto padre al\n * crear un child logger, garantizando que el binding ALS transitorio no\n * se bakeé en el child.\n * @internal\n */\n _getBaseContextRecord(): Record<string, unknown>;\n /**\n * Record de resource interno. Expuesto para el ensamblado de TransportRecord.\n * @internal\n */\n _getResource(): Partial<ILogResourceRef> | undefined;\n /**\n * Retorna el store actual de AsyncLocalStorage, si ALS está activo en el\n * call stack corriente.\n * @internal\n */\n _getAlsStore(): Record<string, unknown> | undefined;\n}\n\n// AsyncLocalStorage type (Node 14+, undefined in browser)\ntype ALS = {\n run<R>(store: Record<string, unknown>, fn: () => R): R;\n getStore(): Record<string, unknown> | undefined;\n};\ndeclare const AsyncLocalStorage: new () => ALS;\n\n// Feature-detect AsyncLocalStorage\nconst hasALS = typeof AsyncLocalStorage !== 'undefined';\nconst alsInstance: ALS | undefined = hasALS ? new AsyncLocalStorage() : undefined;\n\n/**\n * Factory que crea una instancia de {@link LogContext}.\n *\n * @param options - Configuración (ver {@link ILogContextOptions})\n * @returns Una instancia de LogContext lista para usar\n *\n * @example\n * const logContext = createLogContext({\n * childLoggerFactory: (cfg) => new Logger(cfg),\n * initialContext: { service: 'orders-api' },\n * initialResource: { serviceName: 'orders-api', environment: 'prod' }\n * });\n *\n * // Child inmutable con contexto persistente\n * const requestLog = logContext.child({ requestId: 'abc-123' });\n *\n * // Scope transitorio vía ALS (Node; en browser sin ALS es no-op)\n * logContext.withContext({ traceId: 't-9' }, () => {\n * requestLog.info('procesando orden');\n * });\n */\nexport function createLogContext(options: ILogContextOptions): LogContext {\n let context: Record<string, unknown> = { ...options.initialContext };\n let resource: Partial<ILogResourceRef> | undefined = options.initialResource\n ? { ...options.initialResource }\n : undefined;\n\n // Use provided ALS instance or fall back to module-level (browser fallback)\n const als = options.alsInstance ?? alsInstance;\n\n return {\n getContext(): ContextSnapshot {\n return { ...context };\n },\n\n withContext<R>(bindings: Record<string, unknown>, fn?: () => R): R | undefined {\n // No-op without AsyncLocalStorage (browser) — warn once\n if (!als) {\n if (fn) return fn();\n return undefined;\n }\n // No fn: backwards-compat no-op setter shim\n if (!fn) return undefined;\n // Run fn within AsyncLocalStorage scope\n const merged = { ...context, ...bindings };\n return als.run(merged, fn);\n },\n\n async withContextAsync<R>(bindings: Record<string, unknown>, fn: () => Promise<R>): Promise<R> {\n if (!als) return fn();\n const merged = { ...context, ...bindings };\n return als.run(merged, fn);\n },\n\n clearContext(): typeof this {\n context = {};\n return this;\n },\n\n setResource(res: Partial<ILogResourceRef>): typeof this {\n resource = { ...resource, ...res };\n return this;\n },\n\n child(_extra: Record<string, unknown>): ChildLoggerShape {\n // Creates the child logger via factory. Captures the current\n // _getBaseContextRecord() snapshot (parent context WITHOUT ALS) at\n // child-creation time. ALS is transient and should not be baked into\n // the child's _parentContextRecord — it is applied fresh at dispatch time.\n // Note: _extra (bindings) are stored by Logger.child() as _bindings.\n const snapshot = this._getBaseContextRecord();\n const childLogger = options.childLoggerFactory({}) as ChildLoggerShape;\n // Store on childLogger for Logger.child() to pick up\n (childLogger as unknown as Record<string, unknown>)['__parentSnapshot'] = snapshot;\n return childLogger;\n },\n\n _getContextRecord(): Record<string, unknown> {\n // Returns the full merged context for dispatch purposes.\n // Base (parent snapshot + own context) plus ALS overlay if active.\n const base = this._getBaseContextRecord();\n const alsContext = als?.getStore();\n if (alsContext && Object.keys(alsContext).length > 0) {\n return { ...base, ...alsContext };\n }\n return base;\n },\n\n _getBaseContextRecord(): Record<string, unknown> {\n // Returns parent context chain + own context (NO ALS overlay).\n // ALS is applied by _getContextRecord() as a live overlay.\n let base: Record<string, unknown> = {};\n const parentRecord = options.getParentContextRecord?.() ?? null;\n if (parentRecord && Object.keys(parentRecord).length > 0) {\n base = parentRecord;\n } else if (Object.keys(context).length > 0) {\n base = context;\n }\n if (Object.keys(context).length > 0) {\n base = { ...base, ...context };\n }\n return base;\n },\n\n _getResource(): Partial<ILogResourceRef> | undefined {\n return resource;\n },\n\n _getAlsStore(): Record<string, unknown> | undefined {\n return als?.getStore();\n }\n };\n}\n"],"mappings":";AA+OA,MAAM,cADS,OAAO,sBAAsB,cACE,IAAI,kBAAkB,IAAI,KAAA;;;;;;;;;;;;;;;;;;;;;;AAuBxE,SAAgB,iBAAiB,SAAyC;CACtE,IAAI,UAAmC,EAAE,GAAG,QAAQ,eAAe;CACnE,IAAI,WAAiD,QAAQ,kBACvD,EAAE,GAAG,QAAQ,gBAAgB,IAC7B,KAAA;CAGN,MAAM,MAAM,QAAQ,eAAe;CAEnC,OAAO;EACH,aAA8B;GAC1B,OAAO,EAAE,GAAG,QAAQ;EACxB;EAEA,YAAe,UAAmC,IAA6B;GAE3E,IAAI,CAAC,KAAK;IACN,IAAI,IAAI,OAAO,GAAG;IAClB;GACJ;GAEA,IAAI,CAAC,IAAI,OAAO,KAAA;GAEhB,MAAM,SAAS;IAAE,GAAG;IAAS,GAAG;GAAS;GACzC,OAAO,IAAI,IAAI,QAAQ,EAAE;EAC7B;EAEA,MAAM,iBAAoB,UAAmC,IAAkC;GAC3F,IAAI,CAAC,KAAK,OAAO,GAAG;GACpB,MAAM,SAAS;IAAE,GAAG;IAAS,GAAG;GAAS;GACzC,OAAO,IAAI,IAAI,QAAQ,EAAE;EAC7B;EAEA,eAA4B;GACxB,UAAU,CAAC;GACX,OAAO;EACX;EAEA,YAAY,KAA4C;GACpD,WAAW;IAAE,GAAG;IAAU,GAAG;GAAI;GACjC,OAAO;EACX;EAEA,MAAM,QAAmD;GAMrD,MAAM,WAAW,KAAK,sBAAsB;GAC5C,MAAM,cAAc,QAAQ,mBAAmB,CAAC,CAAC;GAEjD,YAAoD,sBAAsB;GAC1E,OAAO;EACX;EAEA,oBAA6C;GAGzC,MAAM,OAAO,KAAK,sBAAsB;GACxC,MAAM,aAAa,KAAK,SAAS;GACjC,IAAI,cAAc,OAAO,KAAK,UAAU,CAAC,CAAC,SAAS,GAC/C,OAAO;IAAE,GAAG;IAAM,GAAG;GAAW;GAEpC,OAAO;EACX;EAEA,wBAAiD;GAG7C,IAAI,OAAgC,CAAC;GACrC,MAAM,eAAe,QAAQ,yBAAyB,KAAK;GAC3D,IAAI,gBAAgB,OAAO,KAAK,YAAY,CAAC,CAAC,SAAS,GACnD,OAAO;QACJ,IAAI,OAAO,KAAK,OAAO,CAAC,CAAC,SAAS,GACrC,OAAO;GAEX,IAAI,OAAO,KAAK,OAAO,CAAC,CAAC,SAAS,GAC9B,OAAO;IAAE,GAAG;IAAM,GAAG;GAAQ;GAEjC,OAAO;EACX;EAEA,eAAqD;GACjD,OAAO;EACX;EAEA,eAAoD;GAChD,OAAO,KAAK,SAAS;EACzB;CACJ;AACJ"}
@@ -0,0 +1,393 @@
1
+ //#region src/serializers/SerializerRegistry.ts
2
+ /**
3
+ * Configuración por defecto del registry. Se merguea con la config que reciba
4
+ * el constructor (gana la del caller).
5
+ *
6
+ * @internal Constante de módulo; no es API pública.
7
+ */
8
+ const DEFAULT_CONFIG = {
9
+ maxDepth: 5,
10
+ circular: "placeholder",
11
+ preserveUndefined: false
12
+ };
13
+ /**
14
+ * Registry de serializers tipados por constructor.
15
+ *
16
+ * Mantiene un mapa ordenado por `priority` (mayor primero) de serializers
17
+ * registrados para clases específicas. El método {@link SerializerRegistry.serialize}
18
+ * recorre objetos de forma recursiva aplicando el serializer que matchee por
19
+ * `instanceof`, con dos guardas de seguridad:
20
+ *
21
+ * - **Depth guard**: corta la recursión al llegar a `maxDepth` y emite el
22
+ * placeholder `'[Max Depth]'`.
23
+ * - **Circular ref**: lleva un `WeakSet` de objetos visitados en el path actual;
24
+ * al re-encontrar uno aplica la estrategia de `circular` (`placeholder` por
25
+ * default).
26
+ *
27
+ * Implementa {@link ISerializerRegistry}. Suele usarse vía el singleton de
28
+ * {@link getDefaultSerializerRegistry}, expuesto al Logger a través del
29
+ * {@link SerializerBridge}.
30
+ *
31
+ * @example
32
+ * ```ts
33
+ * const registry = new SerializerRegistry({ maxDepth: 3 });
34
+ *
35
+ * registry.add(URL, (url: URL) => ({
36
+ * href: url.href,
37
+ * origin: url.origin
38
+ * }), 60);
39
+ *
40
+ * const safe = registry.serialize(someMaybeCyclicObject);
41
+ * ```
42
+ *
43
+ * @see {@link ISerializerRegistry} para el contrato interface.
44
+ * @see {@link SerializerConfig} para las opciones del constructor.
45
+ */
46
+ var SerializerRegistry = class {
47
+ serializers = /* @__PURE__ */ new Map();
48
+ config;
49
+ /**
50
+ * Crea un registry nuevo con los serializers builtin ya registrados
51
+ * (Error, Date, RegExp, Map, Set, Buffer cuando está disponible).
52
+ *
53
+ * @param {SerializerConfig} config - Overrides sobre {@link DEFAULT_CONFIG}.
54
+ * - `maxDepth` (default `5`): profundidad máxima de anidamiento antes del
55
+ * placeholder `'[Max Depth]'`.
56
+ * - `circular` (default `'placeholder'`): qué hacer ante una referencia
57
+ * circular. `'placeholder'` emite `'[Circular]'`, `'skip'` omite la key
58
+ * (devuelve `undefined`), `'error'` lanza.
59
+ * - `preserveUndefined` (default `false`): si `true` deja `undefined`
60
+ * textual; si `false` lo reemplaza por `'[undefined]'` (más seguro para
61
+ * JSON / transporte).
62
+ *
63
+ * @example
64
+ * ```ts
65
+ * // Defaults (depth 5, circular → placeholder)
66
+ * const a = new SerializerRegistry();
67
+ *
68
+ * // Estricto: lanza ante ciclo, conservar undefined
69
+ * const b = new SerializerRegistry({
70
+ * maxDepth: 10,
71
+ * circular: 'error',
72
+ * preserveUndefined: true
73
+ * });
74
+ * ```
75
+ */
76
+ constructor(config = {}) {
77
+ this.config = {
78
+ ...DEFAULT_CONFIG,
79
+ ...config
80
+ };
81
+ this.registerDefaults();
82
+ }
83
+ /**
84
+ * Registra los serializers builtin con sus prioridades. Invocado por el
85
+ * constructor; no es API pública.
86
+ *
87
+ * Defaults (mayor priority = gana primero en `instanceof`):
88
+ *
89
+ * | Tipo | Priority | Salida |
90
+ * |----------|----------|------------------------------------------------|
91
+ * | `Error` | 100 | `{ name, message, stack[], cause? }` |
92
+ * | `Date` | 90 | `{ iso, timestamp }` |
93
+ * | `RegExp` | 90 | `{ pattern, flags }` |
94
+ * | `Map` | 80 | `{ __type:'Map', entries }` |
95
+ * | `Set` | 80 | `{ __type:'Set', values[] }` |
96
+ * | `Buffer` | 70 | `{ __type:'Buffer', length, preview }` (Node) |
97
+ *
98
+ * @internal
99
+ */
100
+ registerDefaults() {
101
+ this.add(Error, (err) => ({
102
+ name: err.name,
103
+ message: err.message,
104
+ stack: err.stack?.split("\n").slice(0, 10),
105
+ ...err.cause ? { cause: this.serialize(err.cause) } : {}
106
+ }), 100);
107
+ this.add(Date, (date) => ({
108
+ iso: date.toISOString(),
109
+ timestamp: date.getTime()
110
+ }), 90);
111
+ this.add(RegExp, (regex) => ({
112
+ pattern: regex.source,
113
+ flags: regex.flags
114
+ }), 90);
115
+ this.add(Map, (map, ctx) => {
116
+ const obj = {};
117
+ map.forEach((value, key) => {
118
+ const keyStr = typeof key === "object" ? JSON.stringify(key) : String(key);
119
+ obj[keyStr] = this.serializeInternal(value, {
120
+ ...ctx,
121
+ depth: ctx.depth + 1,
122
+ path: [...ctx.path, keyStr]
123
+ });
124
+ });
125
+ return {
126
+ __type: "Map",
127
+ entries: obj
128
+ };
129
+ }, 80);
130
+ this.add(Set, (set, ctx) => ({
131
+ __type: "Set",
132
+ values: Array.from(set).map((v, i) => this.serializeInternal(v, {
133
+ ...ctx,
134
+ depth: ctx.depth + 1,
135
+ path: [...ctx.path, `[${i}]`]
136
+ }))
137
+ }), 80);
138
+ if (typeof Buffer !== "undefined") this.add(Buffer, (buf) => ({
139
+ __type: "Buffer",
140
+ length: buf.length,
141
+ preview: buf.slice(0, 50).toString("hex")
142
+ }), 70);
143
+ }
144
+ /**
145
+ * Registra (o reemplaza) el serializer para una clase constructora.
146
+ *
147
+ * Si ya existía un serializer para `type`, se sobrescribe. La `priority`
148
+ * sólo ordena de cara al lookup por `instanceof` hecho en
149
+ * {@link SerializerRegistry.getAll} — útil cuando una subclass debería
150
+ * matchear antes que su superclass (p.ej. `TypeError` antes que `Error`).
151
+ *
152
+ * @param {new (...args: any[]) => T} type - Constructor de la clase a matchear.
153
+ * @param {SerializerFn<T>} serializer - Función que recibe la instancia y el
154
+ * {@link SerializerContext} (depth, path, seen); devuelve una representación
155
+ * serializable.
156
+ * @param {number} [priority=50] - Orden de lookup (mayor = primero). Los
157
+ * defaults builtin usan 70–100.
158
+ *
159
+ * @example
160
+ * ```ts
161
+ * registry.add(
162
+ * URL,
163
+ * (url: URL, ctx) => ({ href: url.href, origin: url.origin }),
164
+ * 60
165
+ * );
166
+ * ```
167
+ */
168
+ add(type, serializer, priority = 50) {
169
+ this.serializers.set(type, {
170
+ type,
171
+ serializer,
172
+ priority
173
+ });
174
+ }
175
+ /**
176
+ * Elimina el serializer registrado para `type`.
177
+ *
178
+ * @param {new (...args: any[]) => T} type - Constructor a remover.
179
+ * @returns `true` si existía y fue removido, `false` si no había registro.
180
+ *
181
+ * @example
182
+ * ```ts
183
+ * registry.remove(Date); // → true (estaba registrado por defecto)
184
+ * registry.remove(Date); // → false (ya no está)
185
+ * ```
186
+ */
187
+ remove(type) {
188
+ return this.serializers.delete(type);
189
+ }
190
+ /**
191
+ * Indica si hay un serializer registrado para `type`.
192
+ *
193
+ * @param {new (...args: any[]) => T} type - Constructor a consultar.
194
+ * @returns `true` si `type` está registrado.
195
+ *
196
+ * @example
197
+ * ```ts
198
+ * if (!registry.has(CustomError)) {
199
+ * registry.add(CustomError, serializeCustomError, 95);
200
+ * }
201
+ * ```
202
+ */
203
+ has(type) {
204
+ return this.serializers.has(type);
205
+ }
206
+ /**
207
+ * Devuelve todas las entradas registradas, ordenadas por `priority`
208
+ * descendente (mayor priority primero). Este es el orden en el que
209
+ * {@link SerializerRegistry.serialize} los prueba vía `instanceof`.
210
+ *
211
+ * @returns {SerializerEntry[]} Array de entradas ordenadas por prioridad.
212
+ *
213
+ * @example
214
+ * ```ts
215
+ * const entries = registry.getAll();
216
+ * console.log(entries.map(e => [e.type.name, e.priority]));
217
+ * // [['Error', 100], ['Date', 90], ['RegExp', 90], ['Map', 80], ...]
218
+ * ```
219
+ *
220
+ * @see {@link SerializerEntry}
221
+ */
222
+ getAll() {
223
+ return Array.from(this.serializers.values()).sort((a, b) => (b.priority ?? 50) - (a.priority ?? 50));
224
+ }
225
+ /**
226
+ * Busca el primer serializer cuyo `type` matchee `value instanceof type`,
227
+ * recorriendo las entradas en orden de prioridad descendente.
228
+ *
229
+ * @internal Helper del pipeline interno; no es API pública.
230
+ * @param value - Valor a testear.
231
+ * @returns Entrada matcheante, o `null` si ninguna aplica.
232
+ */
233
+ findSerializer(value) {
234
+ const sorted = this.getAll();
235
+ for (const entry of sorted) if (value instanceof entry.type) return entry;
236
+ return null;
237
+ }
238
+ /**
239
+ * Pipeline interno de serialización recursiva. Es el core de
240
+ * {@link SerializerRegistry.serialize}; no es API pública pero se documenta
241
+ * aquí para mantener la semántica del pipeline en un solo lugar.
242
+ *
243
+ * Orden de guardas (cada una corta la recursión):
244
+ *
245
+ * 1. `null` / `undefined` — directo (respeta `preserveUndefined`).
246
+ * 2. `function` — placeholder `'[Function: name]'`.
247
+ * 3. Primitiva no-objeto — se devuelve tal cual.
248
+ * 4. **Depth guard**: si `depth >= maxDepth` → `'[Max Depth]'`.
249
+ * 5. **Circular**: si `value` ya está en el `WeakSet` `seen` del contexto,
250
+ * aplica `circular` (`placeholder` / `skip` / `error`).
251
+ * 6. Se marca en `seen`, se busca serializer por `instanceof`; si matchea,
252
+ * se delega (el serializer puede recursar via `ctx`).
253
+ * 7. Si es array, mapea cada item incrementando depth y extendiendo path.
254
+ * 8. Si es plain object, itera keys recursivamente.
255
+ *
256
+ * @internal
257
+ * @param value - Valor a serializar.
258
+ * @param context - Estado de recursión (depth, path, seen, maxDepth).
259
+ * @returns Valor serializable (puede ser primitiva, objeto, array o placeholder).
260
+ * @throws {Error} Sólo si `circular: 'error'` y se detecta ciclo.
261
+ */
262
+ serializeInternal(value, context) {
263
+ if (value === null) return null;
264
+ if (value === void 0) return this.config.preserveUndefined ? void 0 : "[undefined]";
265
+ if (typeof value === "function") return `[Function: ${value.name || "anonymous"}]`;
266
+ if (typeof value !== "object") return value;
267
+ if (context.depth >= this.config.maxDepth) return "[Max Depth]";
268
+ if (context.seen.has(value)) switch (this.config.circular) {
269
+ case "error": throw new Error(`Circular reference at ${context.path.join(".")}`);
270
+ case "skip": return;
271
+ default: return "[Circular]";
272
+ }
273
+ context.seen.add(value);
274
+ const serializer = this.findSerializer(value);
275
+ if (serializer) return serializer.serializer(value, context);
276
+ if (Array.isArray(value)) return value.map((item, i) => this.serializeInternal(item, {
277
+ ...context,
278
+ depth: context.depth + 1,
279
+ path: [...context.path, `[${i}]`]
280
+ }));
281
+ const result = {};
282
+ for (const [key, val] of Object.entries(value)) result[key] = this.serializeInternal(val, {
283
+ ...context,
284
+ depth: context.depth + 1,
285
+ path: [...context.path, key]
286
+ });
287
+ return result;
288
+ }
289
+ /**
290
+ * Serializa un valor arbitrario a una representación segura para transporte
291
+ * (JSON, remote log, OTLP, etc.).
292
+ *
293
+ * Entry point público del pipeline. Construye un {@link SerializerContext}
294
+ * fresco (depth 0, path vacío, `WeakSet` nuevo para detección de ciclos),
295
+ * merguea overrides de `config` sobre los del constructor y delega a
296
+ * {@link SerializerRegistry.serializeInternal}.
297
+ *
298
+ * @param {any} value - Valor a serializar. Cualquier tipo.
299
+ * @param {SerializerConfig} [config] - Overrides puntuales para esta llamada
300
+ * (no mutan la config del registry). Útil para, p.ej., subir `maxDepth`
301
+ * sólo en un log concreto.
302
+ * @returns {any} Valor serializable. Para objetos sin serializer registrado
303
+ * se devuelve un plain object; para tipos builtin, la shape definida en
304
+ * {@link SerializerRegistry.registerDefaults}; para los cortes de
305
+ * profundidad o circular, los placeholders `'[Max Depth]'` / `'[Circular]'`.
306
+ * @throws {Error} Sólo si `circular: 'error'` y se detecta una referencia circular.
307
+ *
308
+ * @example
309
+ * ```ts
310
+ * // Objetos simples
311
+ * registry.serialize({ a: 1, b: [2, 3] });
312
+ * // → { a: 1, b: [2, 3] }
313
+ *
314
+ * // Errores (serializer builtin)
315
+ * registry.serialize(new Error('boom'));
316
+ * // → { name: 'Error', message: 'boom', stack: [...] }
317
+ *
318
+ * // Referencia circular → placeholder
319
+ * const o: any = {};
320
+ * o.self = o;
321
+ * registry.serialize(o); // → { self: '[Circular]' }
322
+ *
323
+ * // Override puntual de maxDepth
324
+ * registry.serialize(deepObj, { maxDepth: 2 });
325
+ * ```
326
+ *
327
+ * @see {@link SerializerRegistry.serializeInternal} para el detalle del pipeline.
328
+ */
329
+ serialize(value, config) {
330
+ const mergedConfig = {
331
+ ...this.config,
332
+ ...config
333
+ };
334
+ return this.serializeInternal(value, {
335
+ depth: 0,
336
+ maxDepth: mergedConfig.maxDepth,
337
+ path: [],
338
+ seen: /* @__PURE__ */ new WeakSet()
339
+ });
340
+ }
341
+ };
342
+ /**
343
+ * Cache del singleton de {@link SerializerRegistry}. Module-private.
344
+ *
345
+ * @internal
346
+ */
347
+ let _defaultRegistry = null;
348
+ /**
349
+ * Devuelve el singleton de {@link SerializerRegistry} (lo crea con config
350
+ * default en la primera llamada). Es la vía canónica de obtener el registry
351
+ * compartido que usa el Logger internamente.
352
+ *
353
+ * @returns {SerializerRegistry} Instancia singleton.
354
+ *
355
+ * @example
356
+ * ```ts
357
+ * import { getDefaultSerializerRegistry } from '@mks2508/better-logger/serializers';
358
+ *
359
+ * const registry = getDefaultSerializerRegistry();
360
+ * if (!registry.has(CustomError)) {
361
+ * registry.add(CustomError, (e) => ({ code: e.code, message: e.message }), 95);
362
+ * }
363
+ * ```
364
+ */
365
+ function getDefaultSerializerRegistry() {
366
+ if (!_defaultRegistry) _defaultRegistry = new SerializerRegistry();
367
+ return _defaultRegistry;
368
+ }
369
+ //#endregion
370
+ //#region src/serializers/SerializerBridge.ts
371
+ /**
372
+ * Crea una instancia de {@link SerializerBridge}.
373
+ *
374
+ * @internal
375
+ */
376
+ function createSerializerBridge() {
377
+ const serializerRegistry = new SerializerRegistry();
378
+ return {
379
+ addSerializer(type, serializer, priority) {
380
+ serializerRegistry.add(type, serializer, priority);
381
+ },
382
+ removeSerializer(type) {
383
+ return serializerRegistry.remove(type);
384
+ },
385
+ getSerializerRegistry() {
386
+ return serializerRegistry;
387
+ }
388
+ };
389
+ }
390
+ //#endregion
391
+ export { SerializerRegistry as n, getDefaultSerializerRegistry as r, createSerializerBridge as t };
392
+
393
+ //# sourceMappingURL=SerializerBridge-Ba43Mk7j.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SerializerBridge-Ba43Mk7j.js","names":[],"sources":["../../src/serializers/SerializerRegistry.ts","../../src/serializers/SerializerBridge.ts"],"sourcesContent":["/**\n * @fileoverview Registry de serializers con control de profundidad, detección\n * de referencias circulares y soporte para tipos builtin (Error, Date, RegExp,\n * Map, Set, Buffer). Implementa {@link ISerializerRegistry}.\n */\nimport type {\n SerializerFn,\n SerializerContext,\n SerializerEntry,\n SerializerConfig,\n ISerializerRegistry\n} from '../types/index.js';\n\n/**\n * Configuración por defecto del registry. Se merguea con la config que reciba\n * el constructor (gana la del caller).\n *\n * @internal Constante de módulo; no es API pública.\n */\nconst DEFAULT_CONFIG: Required<SerializerConfig> = {\n maxDepth: 5,\n circular: 'placeholder',\n preserveUndefined: false\n};\n\n/**\n * Registry de serializers tipados por constructor.\n *\n * Mantiene un mapa ordenado por `priority` (mayor primero) de serializers\n * registrados para clases específicas. El método {@link SerializerRegistry.serialize}\n * recorre objetos de forma recursiva aplicando el serializer que matchee por\n * `instanceof`, con dos guardas de seguridad:\n *\n * - **Depth guard**: corta la recursión al llegar a `maxDepth` y emite el\n * placeholder `'[Max Depth]'`.\n * - **Circular ref**: lleva un `WeakSet` de objetos visitados en el path actual;\n * al re-encontrar uno aplica la estrategia de `circular` (`placeholder` por\n * default).\n *\n * Implementa {@link ISerializerRegistry}. Suele usarse vía el singleton de\n * {@link getDefaultSerializerRegistry}, expuesto al Logger a través del\n * {@link SerializerBridge}.\n *\n * @example\n * ```ts\n * const registry = new SerializerRegistry({ maxDepth: 3 });\n *\n * registry.add(URL, (url: URL) => ({\n * href: url.href,\n * origin: url.origin\n * }), 60);\n *\n * const safe = registry.serialize(someMaybeCyclicObject);\n * ```\n *\n * @see {@link ISerializerRegistry} para el contrato interface.\n * @see {@link SerializerConfig} para las opciones del constructor.\n */\nexport class SerializerRegistry implements ISerializerRegistry {\n private serializers: Map<Function, SerializerEntry> = new Map();\n private config: Required<SerializerConfig>;\n\n /**\n * Crea un registry nuevo con los serializers builtin ya registrados\n * (Error, Date, RegExp, Map, Set, Buffer cuando está disponible).\n *\n * @param {SerializerConfig} config - Overrides sobre {@link DEFAULT_CONFIG}.\n * - `maxDepth` (default `5`): profundidad máxima de anidamiento antes del\n * placeholder `'[Max Depth]'`.\n * - `circular` (default `'placeholder'`): qué hacer ante una referencia\n * circular. `'placeholder'` emite `'[Circular]'`, `'skip'` omite la key\n * (devuelve `undefined`), `'error'` lanza.\n * - `preserveUndefined` (default `false`): si `true` deja `undefined`\n * textual; si `false` lo reemplaza por `'[undefined]'` (más seguro para\n * JSON / transporte).\n *\n * @example\n * ```ts\n * // Defaults (depth 5, circular → placeholder)\n * const a = new SerializerRegistry();\n *\n * // Estricto: lanza ante ciclo, conservar undefined\n * const b = new SerializerRegistry({\n * maxDepth: 10,\n * circular: 'error',\n * preserveUndefined: true\n * });\n * ```\n */\n constructor(config: SerializerConfig = {}) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.registerDefaults();\n }\n\n /**\n * Registra los serializers builtin con sus prioridades. Invocado por el\n * constructor; no es API pública.\n *\n * Defaults (mayor priority = gana primero en `instanceof`):\n *\n * | Tipo | Priority | Salida |\n * |----------|----------|------------------------------------------------|\n * | `Error` | 100 | `{ name, message, stack[], cause? }` |\n * | `Date` | 90 | `{ iso, timestamp }` |\n * | `RegExp` | 90 | `{ pattern, flags }` |\n * | `Map` | 80 | `{ __type:'Map', entries }` |\n * | `Set` | 80 | `{ __type:'Set', values[] }` |\n * | `Buffer` | 70 | `{ __type:'Buffer', length, preview }` (Node) |\n *\n * @internal\n */\n private registerDefaults(): void {\n this.add(Error, (err: Error) => ({\n name: err.name,\n message: err.message,\n stack: err.stack?.split('\\n').slice(0, 10),\n ...(err.cause ? { cause: this.serialize(err.cause) } : {})\n }), 100);\n\n this.add(Date, (date: Date) => ({\n iso: date.toISOString(),\n timestamp: date.getTime()\n }), 90);\n\n this.add(RegExp, (regex: RegExp) => ({\n pattern: regex.source,\n flags: regex.flags\n }), 90);\n\n this.add(Map, (map: Map<any, any>, ctx) => {\n const obj: Record<string, any> = {};\n map.forEach((value, key) => {\n const keyStr = typeof key === 'object' ? JSON.stringify(key) : String(key);\n obj[keyStr] = this.serializeInternal(value, {\n ...ctx,\n depth: ctx.depth + 1,\n path: [...ctx.path, keyStr]\n });\n });\n return { __type: 'Map', entries: obj };\n }, 80);\n\n this.add(Set, (set: Set<any>, ctx) => ({\n __type: 'Set',\n values: Array.from(set).map((v, i) =>\n this.serializeInternal(v, {\n ...ctx,\n depth: ctx.depth + 1,\n path: [...ctx.path, `[${i}]`]\n })\n )\n }), 80);\n\n if (typeof Buffer !== 'undefined') {\n this.add(Buffer as any, (buf: Buffer) => ({\n __type: 'Buffer',\n length: buf.length,\n preview: buf.slice(0, 50).toString('hex')\n }), 70);\n }\n }\n\n /**\n * Registra (o reemplaza) el serializer para una clase constructora.\n *\n * Si ya existía un serializer para `type`, se sobrescribe. La `priority`\n * sólo ordena de cara al lookup por `instanceof` hecho en\n * {@link SerializerRegistry.getAll} — útil cuando una subclass debería\n * matchear antes que su superclass (p.ej. `TypeError` antes que `Error`).\n *\n * @param {new (...args: any[]) => T} type - Constructor de la clase a matchear.\n * @param {SerializerFn<T>} serializer - Función que recibe la instancia y el\n * {@link SerializerContext} (depth, path, seen); devuelve una representación\n * serializable.\n * @param {number} [priority=50] - Orden de lookup (mayor = primero). Los\n * defaults builtin usan 70–100.\n *\n * @example\n * ```ts\n * registry.add(\n * URL,\n * (url: URL, ctx) => ({ href: url.href, origin: url.origin }),\n * 60\n * );\n * ```\n */\n add<T>(\n type: new (...args: any[]) => T,\n serializer: SerializerFn<T>,\n priority: number = 50\n ): void {\n this.serializers.set(type, { type, serializer, priority });\n }\n\n /**\n * Elimina el serializer registrado para `type`.\n *\n * @param {new (...args: any[]) => T} type - Constructor a remover.\n * @returns `true` si existía y fue removido, `false` si no había registro.\n *\n * @example\n * ```ts\n * registry.remove(Date); // → true (estaba registrado por defecto)\n * registry.remove(Date); // → false (ya no está)\n * ```\n */\n remove<T>(type: new (...args: any[]) => T): boolean {\n return this.serializers.delete(type);\n }\n\n /**\n * Indica si hay un serializer registrado para `type`.\n *\n * @param {new (...args: any[]) => T} type - Constructor a consultar.\n * @returns `true` si `type` está registrado.\n *\n * @example\n * ```ts\n * if (!registry.has(CustomError)) {\n * registry.add(CustomError, serializeCustomError, 95);\n * }\n * ```\n */\n has<T>(type: new (...args: any[]) => T): boolean {\n return this.serializers.has(type);\n }\n\n /**\n * Devuelve todas las entradas registradas, ordenadas por `priority`\n * descendente (mayor priority primero). Este es el orden en el que\n * {@link SerializerRegistry.serialize} los prueba vía `instanceof`.\n *\n * @returns {SerializerEntry[]} Array de entradas ordenadas por prioridad.\n *\n * @example\n * ```ts\n * const entries = registry.getAll();\n * console.log(entries.map(e => [e.type.name, e.priority]));\n * // [['Error', 100], ['Date', 90], ['RegExp', 90], ['Map', 80], ...]\n * ```\n *\n * @see {@link SerializerEntry}\n */\n getAll(): SerializerEntry[] {\n return Array.from(this.serializers.values())\n .sort((a, b) => (b.priority ?? 50) - (a.priority ?? 50));\n }\n\n /**\n * Busca el primer serializer cuyo `type` matchee `value instanceof type`,\n * recorriendo las entradas en orden de prioridad descendente.\n *\n * @internal Helper del pipeline interno; no es API pública.\n * @param value - Valor a testear.\n * @returns Entrada matcheante, o `null` si ninguna aplica.\n */\n private findSerializer(value: any): SerializerEntry | null {\n const sorted = this.getAll();\n for (const entry of sorted) {\n if (value instanceof entry.type) {\n return entry;\n }\n }\n return null;\n }\n\n /**\n * Pipeline interno de serialización recursiva. Es el core de\n * {@link SerializerRegistry.serialize}; no es API pública pero se documenta\n * aquí para mantener la semántica del pipeline en un solo lugar.\n *\n * Orden de guardas (cada una corta la recursión):\n *\n * 1. `null` / `undefined` — directo (respeta `preserveUndefined`).\n * 2. `function` — placeholder `'[Function: name]'`.\n * 3. Primitiva no-objeto — se devuelve tal cual.\n * 4. **Depth guard**: si `depth >= maxDepth` → `'[Max Depth]'`.\n * 5. **Circular**: si `value` ya está en el `WeakSet` `seen` del contexto,\n * aplica `circular` (`placeholder` / `skip` / `error`).\n * 6. Se marca en `seen`, se busca serializer por `instanceof`; si matchea,\n * se delega (el serializer puede recursar via `ctx`).\n * 7. Si es array, mapea cada item incrementando depth y extendiendo path.\n * 8. Si es plain object, itera keys recursivamente.\n *\n * @internal\n * @param value - Valor a serializar.\n * @param context - Estado de recursión (depth, path, seen, maxDepth).\n * @returns Valor serializable (puede ser primitiva, objeto, array o placeholder).\n * @throws {Error} Sólo si `circular: 'error'` y se detecta ciclo.\n */\n private serializeInternal(value: any, context: SerializerContext): any {\n if (value === null) return null;\n if (value === undefined) return this.config.preserveUndefined ? undefined : '[undefined]';\n if (typeof value === 'function') return `[Function: ${value.name || 'anonymous'}]`;\n if (typeof value !== 'object') return value;\n\n if (context.depth >= this.config.maxDepth) {\n return '[Max Depth]';\n }\n\n if (context.seen.has(value)) {\n switch (this.config.circular) {\n case 'error':\n throw new Error(`Circular reference at ${context.path.join('.')}`);\n case 'skip':\n return undefined;\n case 'placeholder':\n default:\n return '[Circular]';\n }\n }\n context.seen.add(value);\n\n const serializer = this.findSerializer(value);\n if (serializer) {\n return serializer.serializer(value, context);\n }\n\n if (Array.isArray(value)) {\n return value.map((item, i) =>\n this.serializeInternal(item, {\n ...context,\n depth: context.depth + 1,\n path: [...context.path, `[${i}]`]\n })\n );\n }\n\n const result: Record<string, any> = {};\n for (const [key, val] of Object.entries(value)) {\n result[key] = this.serializeInternal(val, {\n ...context,\n depth: context.depth + 1,\n path: [...context.path, key]\n });\n }\n return result;\n }\n\n /**\n * Serializa un valor arbitrario a una representación segura para transporte\n * (JSON, remote log, OTLP, etc.).\n *\n * Entry point público del pipeline. Construye un {@link SerializerContext}\n * fresco (depth 0, path vacío, `WeakSet` nuevo para detección de ciclos),\n * merguea overrides de `config` sobre los del constructor y delega a\n * {@link SerializerRegistry.serializeInternal}.\n *\n * @param {any} value - Valor a serializar. Cualquier tipo.\n * @param {SerializerConfig} [config] - Overrides puntuales para esta llamada\n * (no mutan la config del registry). Útil para, p.ej., subir `maxDepth`\n * sólo en un log concreto.\n * @returns {any} Valor serializable. Para objetos sin serializer registrado\n * se devuelve un plain object; para tipos builtin, la shape definida en\n * {@link SerializerRegistry.registerDefaults}; para los cortes de\n * profundidad o circular, los placeholders `'[Max Depth]'` / `'[Circular]'`.\n * @throws {Error} Sólo si `circular: 'error'` y se detecta una referencia circular.\n *\n * @example\n * ```ts\n * // Objetos simples\n * registry.serialize({ a: 1, b: [2, 3] });\n * // → { a: 1, b: [2, 3] }\n *\n * // Errores (serializer builtin)\n * registry.serialize(new Error('boom'));\n * // → { name: 'Error', message: 'boom', stack: [...] }\n *\n * // Referencia circular → placeholder\n * const o: any = {};\n * o.self = o;\n * registry.serialize(o); // → { self: '[Circular]' }\n *\n * // Override puntual de maxDepth\n * registry.serialize(deepObj, { maxDepth: 2 });\n * ```\n *\n * @see {@link SerializerRegistry.serializeInternal} para el detalle del pipeline.\n */\n serialize(value: any, config?: SerializerConfig): any {\n const mergedConfig = { ...this.config, ...config };\n return this.serializeInternal(value, {\n depth: 0,\n maxDepth: mergedConfig.maxDepth,\n path: [],\n seen: new WeakSet()\n });\n }\n}\n\n/**\n * Cache del singleton de {@link SerializerRegistry}. Module-private.\n *\n * @internal\n */\nlet _defaultRegistry: SerializerRegistry | null = null;\n\n/**\n * Devuelve el singleton de {@link SerializerRegistry} (lo crea con config\n * default en la primera llamada). Es la vía canónica de obtener el registry\n * compartido que usa el Logger internamente.\n *\n * @returns {SerializerRegistry} Instancia singleton.\n *\n * @example\n * ```ts\n * import { getDefaultSerializerRegistry } from '@mks2508/better-logger/serializers';\n *\n * const registry = getDefaultSerializerRegistry();\n * if (!registry.has(CustomError)) {\n * registry.add(CustomError, (e) => ({ code: e.code, message: e.message }), 95);\n * }\n * ```\n */\nexport function getDefaultSerializerRegistry(): SerializerRegistry {\n if (!_defaultRegistry) {\n _defaultRegistry = new SerializerRegistry();\n }\n return _defaultRegistry;\n}\n","/**\n * @fileoverview SerializerBridge — facade de SerializerRegistry.\n * Encapsula registro, eliminación y acceso al registry de serializers.\n *\n * @internal\n */\n\nimport type { SerializerFn } from '../types/index.js';\nimport { SerializerRegistry } from './index.js';\n\n/**\n * Bridge para la gestión de serializers.\n *\n * @internal\n */\nexport interface SerializerBridge {\n /** Añade un serializer para un tipo. */\n addSerializer<T>(type: new (...args: unknown[]) => T, serializer: SerializerFn<T>, priority?: number): void;\n /** Elimina el serializer asociado a un tipo. Devuelve `true` si se eliminó. */\n removeSerializer<T>(type: new (...args: unknown[]) => T): boolean;\n /** Devuelve el registry subyacente. */\n getSerializerRegistry(): SerializerRegistry;\n}\n\n/**\n * Crea una instancia de {@link SerializerBridge}.\n *\n * @internal\n */\nexport function createSerializerBridge(): SerializerBridge {\n const serializerRegistry = new SerializerRegistry();\n\n return {\n addSerializer<T>(type: new (...args: unknown[]) => T, serializer: SerializerFn<T>, priority?: number): void {\n serializerRegistry.add(type, serializer, priority);\n },\n\n removeSerializer<T>(type: new (...args: unknown[]) => T): boolean {\n return serializerRegistry.remove(type);\n },\n\n getSerializerRegistry(): SerializerRegistry {\n return serializerRegistry;\n }\n };\n}\n"],"mappings":"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"}