@mks2508/better-logger 0.0.2-alpha.2 → 0.8.1-alpha.1

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 (231) hide show
  1. package/.github/workflows/ci-quality.yml +356 -0
  2. package/.github/workflows/docs-demo.yml +123 -0
  3. package/.github/workflows/releases-core.yml +448 -0
  4. package/.github/workflows/releases-full.yml +404 -0
  5. package/.github/{workflows → workflows-backup}/ci.yml +12 -110
  6. package/.github/workflows-backup/nightly.yml +196 -0
  7. package/.github/workflows-backup/release-optimized.yml +373 -0
  8. package/.release-notes-0.2.0.md +129 -0
  9. package/CHANGELOG.json +658 -0
  10. package/README.md +110 -512
  11. package/demo.html +9 -2
  12. package/dist/Logger.d.ts +176 -0
  13. package/dist/Logger.d.ts.map +1 -0
  14. package/dist/Logger.js +498 -0
  15. package/dist/chunks/{Logger-BrFKFZcD.js → Logger-CbCUS5pQ.js} +987 -5
  16. package/dist/chunks/Logger-CbCUS5pQ.js.map +1 -0
  17. package/dist/chunks/Logger-PCfgYKTP.js +2 -0
  18. package/dist/chunks/Logger-PCfgYKTP.js.map +1 -0
  19. package/dist/chunks/RemoteLogHandler-CjWpWZGl.js +33 -0
  20. package/dist/chunks/RemoteLogHandler-CjWpWZGl.js.map +1 -0
  21. package/dist/chunks/RemoteLogHandler-ymkQ97xl.js +2 -0
  22. package/dist/chunks/RemoteLogHandler-ymkQ97xl.js.map +1 -0
  23. package/dist/chunks/StyleBuilder-BoJTmskd.js +361 -0
  24. package/dist/chunks/StyleBuilder-BoJTmskd.js.map +1 -0
  25. package/dist/chunks/StyleBuilder-LPLzsoHY.js +4 -0
  26. package/dist/chunks/StyleBuilder-LPLzsoHY.js.map +1 -0
  27. package/dist/cli/CommandProcessor.d.ts +40 -0
  28. package/dist/cli/CommandProcessor.d.ts.map +1 -0
  29. package/dist/cli/CommandProcessor.js +57 -0
  30. package/dist/cli/commands/ConfigCommand.d.ts +17 -0
  31. package/dist/cli/commands/ConfigCommand.d.ts.map +1 -0
  32. package/dist/cli/commands/ConfigCommand.js +88 -0
  33. package/dist/cli/commands/ExportCommand.d.ts +51 -0
  34. package/dist/cli/commands/ExportCommand.d.ts.map +1 -0
  35. package/dist/cli/commands/ExportCommand.js +243 -0
  36. package/dist/cli/commands/StatusCommand.d.ts +33 -0
  37. package/dist/cli/commands/StatusCommand.d.ts.map +1 -0
  38. package/dist/cli/commands/StatusCommand.js +93 -0
  39. package/dist/cli/commands/ThemeCommand.d.ts +33 -0
  40. package/dist/cli/commands/ThemeCommand.d.ts.map +1 -0
  41. package/dist/cli/commands/ThemeCommand.js +79 -0
  42. package/dist/cli/help.d.ts +15 -0
  43. package/dist/cli/help.d.ts.map +1 -0
  44. package/dist/cli/help.js +118 -0
  45. package/dist/cli/index.d.ts +15 -0
  46. package/dist/cli/index.d.ts.map +1 -0
  47. package/dist/cli/index.js +40 -0
  48. package/dist/constants.d.ts +91 -0
  49. package/dist/constants.d.ts.map +1 -0
  50. package/dist/constants.js +80 -0
  51. package/dist/core.cjs +1 -1
  52. package/dist/core.cjs.map +1 -1
  53. package/dist/core.d.ts +130 -0
  54. package/dist/core.d.ts.map +1 -0
  55. package/dist/core.js +258 -242
  56. package/dist/core.js.map +1 -1
  57. package/dist/example.d.ts +18 -0
  58. package/dist/example.d.ts.map +1 -0
  59. package/dist/example.js +154 -0
  60. package/dist/exports-module.d.ts +203 -0
  61. package/dist/exports-module.d.ts.map +1 -0
  62. package/dist/exports-module.js +260 -0
  63. package/dist/exports.cjs +1 -1
  64. package/dist/exports.cjs.map +1 -1
  65. package/dist/exports.js +2 -2
  66. package/dist/handlers/AnalyticsLogHandler.d.ts +11 -0
  67. package/dist/handlers/AnalyticsLogHandler.d.ts.map +1 -0
  68. package/dist/handlers/AnalyticsLogHandler.js +19 -0
  69. package/dist/handlers/ExportLogHandler.d.ts +103 -0
  70. package/dist/handlers/ExportLogHandler.d.ts.map +1 -0
  71. package/dist/handlers/ExportLogHandler.js +516 -0
  72. package/dist/handlers/FileLogHandler.d.ts +13 -0
  73. package/dist/handlers/FileLogHandler.d.ts.map +1 -0
  74. package/dist/handlers/FileLogHandler.js +24 -0
  75. package/dist/handlers/RemoteLogHandler.d.ts +14 -0
  76. package/dist/handlers/RemoteLogHandler.d.ts.map +1 -0
  77. package/dist/handlers/RemoteLogHandler.js +37 -0
  78. package/dist/handlers/index.d.ts +8 -0
  79. package/dist/handlers/index.d.ts.map +1 -0
  80. package/dist/handlers/index.js +7 -0
  81. package/dist/index.cjs +1 -1
  82. package/dist/index.cjs.map +1 -1
  83. package/dist/index.d.ts +86 -0
  84. package/dist/index.d.ts.map +1 -0
  85. package/dist/index.js +89 -103
  86. package/dist/main.d.ts +2 -0
  87. package/dist/main.d.ts.map +1 -0
  88. package/dist/main.js +139 -0
  89. package/dist/styling/StyleBuilder.d.ts +132 -0
  90. package/dist/styling/StyleBuilder.d.ts.map +1 -0
  91. package/dist/styling/StyleBuilder.js +268 -0
  92. package/dist/styling/banners.d.ts +45 -0
  93. package/dist/styling/banners.d.ts.map +1 -0
  94. package/dist/styling/banners.js +155 -0
  95. package/dist/styling/index.d.ts +7 -0
  96. package/dist/styling/index.d.ts.map +1 -0
  97. package/dist/styling/index.js +6 -0
  98. package/dist/styling/themes.d.ts +10 -0
  99. package/dist/styling/themes.d.ts.map +1 -0
  100. package/dist/styling/themes.js +231 -0
  101. package/dist/styling-module.d.ts +185 -0
  102. package/dist/styling-module.d.ts.map +1 -0
  103. package/dist/styling-module.js +199 -0
  104. package/dist/styling.cjs +1 -1
  105. package/dist/styling.cjs.map +1 -1
  106. package/dist/styling.js +4 -4
  107. package/dist/types/Logger.d.ts +172 -0
  108. package/dist/types/Logger.d.ts.map +1 -0
  109. package/dist/types/cli/CommandProcessor.d.ts +37 -0
  110. package/dist/types/cli/CommandProcessor.d.ts.map +1 -0
  111. package/dist/types/cli/commands/ConfigCommand.d.ts +14 -0
  112. package/dist/types/cli/commands/ConfigCommand.d.ts.map +1 -0
  113. package/dist/types/cli/commands/ExportCommand.d.ts +48 -0
  114. package/dist/types/cli/commands/ExportCommand.d.ts.map +1 -0
  115. package/dist/types/cli/commands/StatusCommand.d.ts +30 -0
  116. package/dist/types/cli/commands/StatusCommand.d.ts.map +1 -0
  117. package/dist/types/cli/commands/ThemeCommand.d.ts +30 -0
  118. package/dist/types/cli/commands/ThemeCommand.d.ts.map +1 -0
  119. package/dist/types/cli/help.d.ts +12 -0
  120. package/dist/types/cli/help.d.ts.map +1 -0
  121. package/dist/types/cli/index.d.ts +15 -0
  122. package/dist/types/cli/index.d.ts.map +1 -0
  123. package/dist/types/constants.d.ts +88 -0
  124. package/dist/types/constants.d.ts.map +1 -0
  125. package/dist/types/core.d.ts +71 -211
  126. package/dist/types/core.d.ts.map +1 -0
  127. package/dist/types/core.js +13 -0
  128. package/dist/types/example.d.ts +18 -0
  129. package/dist/types/example.d.ts.map +1 -0
  130. package/dist/types/exports-module.d.ts +196 -0
  131. package/dist/types/exports-module.d.ts.map +1 -0
  132. package/dist/types/handlers/AnalyticsLogHandler.d.ts +8 -0
  133. package/dist/types/handlers/AnalyticsLogHandler.d.ts.map +1 -0
  134. package/dist/types/handlers/ExportLogHandler.d.ts +100 -0
  135. package/dist/types/handlers/ExportLogHandler.d.ts.map +1 -0
  136. package/dist/types/handlers/FileLogHandler.d.ts +10 -0
  137. package/dist/types/handlers/FileLogHandler.d.ts.map +1 -0
  138. package/dist/types/handlers/RemoteLogHandler.d.ts +11 -0
  139. package/dist/types/handlers/RemoteLogHandler.d.ts.map +1 -0
  140. package/dist/types/handlers/index.d.ts +8 -0
  141. package/dist/types/handlers/index.d.ts.map +1 -0
  142. package/dist/types/handlers.d.ts +88 -0
  143. package/dist/types/handlers.d.ts.map +1 -0
  144. package/dist/types/handlers.js +4 -0
  145. package/dist/types/index.d.ts +7 -675
  146. package/dist/types/index.d.ts.map +1 -0
  147. package/dist/types/index.js +4 -0
  148. package/dist/types/main.d.ts +2 -0
  149. package/dist/types/main.d.ts.map +1 -0
  150. package/dist/types/styling/StyleBuilder.d.ts +132 -0
  151. package/dist/types/styling/StyleBuilder.d.ts.map +1 -0
  152. package/dist/types/styling/banners.d.ts +42 -0
  153. package/dist/types/styling/banners.d.ts.map +1 -0
  154. package/dist/types/styling/index.d.ts +7 -0
  155. package/dist/types/styling/index.d.ts.map +1 -0
  156. package/dist/types/styling/themes.d.ts +7 -0
  157. package/dist/types/styling/themes.d.ts.map +1 -0
  158. package/dist/types/styling-module.d.ts +178 -0
  159. package/dist/types/styling-module.d.ts.map +1 -0
  160. package/dist/types/types/core.d.ts +71 -0
  161. package/dist/types/types/core.d.ts.map +1 -0
  162. package/dist/types/types/handlers.d.ts +85 -0
  163. package/dist/types/types/handlers.d.ts.map +1 -0
  164. package/dist/types/types/index.d.ts +7 -0
  165. package/dist/types/types/index.d.ts.map +1 -0
  166. package/dist/types/utils/index.d.ts +7 -0
  167. package/dist/types/utils/index.d.ts.map +1 -0
  168. package/dist/types/utils/output.d.ts +29 -0
  169. package/dist/types/utils/output.d.ts.map +1 -0
  170. package/dist/types/utils/stackTrace.d.ts +6 -0
  171. package/dist/types/utils/stackTrace.d.ts.map +1 -0
  172. package/dist/types/utils/timestamps.d.ts +20 -0
  173. package/dist/types/utils/timestamps.d.ts.map +1 -0
  174. package/dist/utils/index.d.ts +7 -0
  175. package/dist/utils/index.d.ts.map +1 -0
  176. package/dist/utils/index.js +6 -0
  177. package/dist/utils/output.d.ts +32 -0
  178. package/dist/utils/output.d.ts.map +1 -0
  179. package/dist/utils/output.js +97 -0
  180. package/dist/utils/stackTrace.d.ts +9 -0
  181. package/dist/utils/stackTrace.d.ts.map +1 -0
  182. package/dist/utils/stackTrace.js +81 -0
  183. package/dist/utils/timestamps.d.ts +20 -0
  184. package/dist/utils/timestamps.d.ts.map +1 -0
  185. package/dist/utils/timestamps.js +71 -0
  186. package/docs/API.md +607 -0
  187. package/docs/DEVELOPMENT.md +731 -0
  188. package/docs/_config.yml +36 -0
  189. package/docs/index.md +179 -0
  190. package/examples/README.md +208 -0
  191. package/examples/basic-logging.js +75 -0
  192. package/examples/data-export.js +234 -0
  193. package/examples/package.json +16 -0
  194. package/examples/performance-timing.js +170 -0
  195. package/examples/styling-themes.js +207 -0
  196. package/package.json +24 -21
  197. package/packages/core/package.json +35 -0
  198. package/packages/exports/package.json +41 -0
  199. package/packages/styling/package.json +41 -0
  200. package/project-utils/README.md +172 -0
  201. package/project-utils/auto-release-gemini.ts +1193 -0
  202. package/project-utils/commit-generator.ts +1000 -0
  203. package/project-utils/commit-ui.ts +246 -0
  204. package/project-utils/git-utils.ts +199 -0
  205. package/project-utils/github-release-manager.ts +466 -0
  206. package/project-utils/prompt-templates.js +345 -0
  207. package/project-utils/prompt-templates.ts +422 -0
  208. package/project-utils/version-manager.ts +1078 -0
  209. package/src/Logger.ts +2 -1
  210. package/src/handlers/ExportLogHandler.ts +141 -0
  211. package/vite.config.ts +152 -50
  212. package/.claude/settings.local.json +0 -22
  213. package/.npmrc.bak +0 -1
  214. package/dist/chunks/Logger-BQhMKy_T.js +0 -2
  215. package/dist/chunks/Logger-BQhMKy_T.js.map +0 -1
  216. package/dist/chunks/Logger-BrFKFZcD.js.map +0 -1
  217. package/dist/chunks/core-2opW4Pi3.js +0 -194
  218. package/dist/chunks/core-2opW4Pi3.js.map +0 -1
  219. package/dist/chunks/core-DyugwSYZ.js +0 -4
  220. package/dist/chunks/core-DyugwSYZ.js.map +0 -1
  221. package/dist/chunks/exports-BNP3R7dp.js +0 -421
  222. package/dist/chunks/exports-BNP3R7dp.js.map +0 -1
  223. package/dist/chunks/exports-U1xLBXrY.js +0 -2
  224. package/dist/chunks/exports-U1xLBXrY.js.map +0 -1
  225. package/dist/chunks/styling-DhUDzwlE.js +0 -654
  226. package/dist/chunks/styling-DhUDzwlE.js.map +0 -1
  227. package/dist/chunks/styling-tmRDI28D.js +0 -2
  228. package/dist/chunks/styling-tmRDI28D.js.map +0 -1
  229. package/dist/types/exports.d.ts +0 -600
  230. package/dist/types/styling.d.ts +0 -751
  231. /package/.github/{workflows → workflows-backup}/release.yml +0 -0
@@ -1,6 +1,983 @@
1
- import { E as EXPORT_FORMATS, D as DEFAULT_CONFIG, a as parseStackTrace, c as createStyledOutput, b as formatTimestamp } from "./core-2opW4Pi3.js";
2
- import { T as THEME_PRESETS, S as StyleBuilder, B as BANNER_VARIANTS, d as displayInitBanner, b as THEME_BANNERS, a as StylePresets } from "./styling-DhUDzwlE.js";
3
- import { E as ExportLogHandler } from "./exports-BNP3R7dp.js";
1
+ import { f as formatTimestamp, a as StyleBuilder, B as BUFFER_LIMITS, b as parseTimeInput, c as formatDisplayTime, E as EXPORT_FORMATS, D as DEFAULT_CONFIG, p as parseStackTrace, S as StylePresets } from "./StyleBuilder-BoJTmskd.js";
2
+ const THEME_PRESETS = {
3
+ default: {
4
+ debug: {
5
+ emoji: "🐞",
6
+ label: "DEBUG",
7
+ background: "linear-gradient(135deg, #667eea 0%, #764ba2 100%)",
8
+ color: "#ffffff",
9
+ border: "1px solid #667eea",
10
+ shadow: "0 2px 4px rgba(102, 126, 234, 0.3)"
11
+ },
12
+ info: {
13
+ emoji: "ℹ️",
14
+ label: "INFO",
15
+ background: "linear-gradient(135deg, #74b9ff 0%, #0984e3 100%)",
16
+ color: "#ffffff",
17
+ border: "1px solid #74b9ff",
18
+ shadow: "0 2px 4px rgba(116, 185, 255, 0.3)"
19
+ },
20
+ warn: {
21
+ emoji: "⚠️",
22
+ label: "WARN",
23
+ background: "linear-gradient(135deg, #fdcb6e 0%, #e17055 100%)",
24
+ color: "#2d3436",
25
+ border: "1px solid #fdcb6e",
26
+ shadow: "0 2px 4px rgba(253, 203, 110, 0.3)"
27
+ },
28
+ error: {
29
+ emoji: "❌",
30
+ label: "ERROR",
31
+ background: "linear-gradient(135deg, #e84393 0%, #d63031 100%)",
32
+ color: "#ffffff",
33
+ border: "1px solid #e84393",
34
+ shadow: "0 2px 4px rgba(232, 67, 147, 0.3)"
35
+ },
36
+ success: {
37
+ emoji: "✅",
38
+ label: "SUCCESS",
39
+ background: "linear-gradient(135deg, #00b894 0%, #00a085 100%)",
40
+ color: "#ffffff",
41
+ border: "1px solid #00b894",
42
+ shadow: "0 2px 4px rgba(0, 184, 148, 0.3)"
43
+ },
44
+ critical: {
45
+ emoji: "🔥",
46
+ label: "CRITICAL",
47
+ background: "linear-gradient(135deg, #ff3838 0%, #ff1744 100%)",
48
+ color: "#ffffff",
49
+ border: "2px solid #ff3838",
50
+ shadow: "0 4px 8px rgba(255, 56, 56, 0.5)"
51
+ }
52
+ },
53
+ dark: {
54
+ debug: {
55
+ emoji: "🌙",
56
+ label: "DEBUG",
57
+ background: "linear-gradient(135deg, #2d3748 0%, #4a5568 100%)",
58
+ color: "#e2e8f0",
59
+ border: "1px solid #4a5568",
60
+ shadow: "0 2px 4px rgba(45, 55, 72, 0.8)"
61
+ },
62
+ info: {
63
+ emoji: "💡",
64
+ label: "INFO",
65
+ background: "linear-gradient(135deg, #1a202c 0%, #2d3748 100%)",
66
+ color: "#90cdf4",
67
+ border: "1px solid #3182ce",
68
+ shadow: "0 2px 4px rgba(26, 32, 44, 0.8)"
69
+ },
70
+ warn: {
71
+ emoji: "⚡",
72
+ label: "WARN",
73
+ background: "linear-gradient(135deg, #744210 0%, #975a16 100%)",
74
+ color: "#faf089",
75
+ border: "1px solid #d69e2e",
76
+ shadow: "0 2px 4px rgba(116, 66, 16, 0.8)"
77
+ },
78
+ error: {
79
+ emoji: "💀",
80
+ label: "ERROR",
81
+ background: "linear-gradient(135deg, #742a2a 0%, #9b2c2c 100%)",
82
+ color: "#feb2b2",
83
+ border: "1px solid #e53e3e",
84
+ shadow: "0 2px 4px rgba(116, 42, 42, 0.8)"
85
+ },
86
+ success: {
87
+ emoji: "🎯",
88
+ label: "SUCCESS",
89
+ background: "linear-gradient(135deg, #276749 0%, #2f855a 100%)",
90
+ color: "#9ae6b4",
91
+ border: "1px solid #38a169",
92
+ shadow: "0 2px 4px rgba(39, 103, 73, 0.8)"
93
+ },
94
+ critical: {
95
+ emoji: "💥",
96
+ label: "CRITICAL",
97
+ background: "linear-gradient(135deg, #1a1a1a 0%, #ff0000 100%)",
98
+ color: "#ffffff",
99
+ border: "2px solid #ff0000",
100
+ shadow: "0 4px 8px rgba(255, 0, 0, 0.9)"
101
+ }
102
+ },
103
+ neon: {
104
+ debug: {
105
+ emoji: "⚡",
106
+ label: "DEBUG",
107
+ background: "linear-gradient(135deg, #0f3460 0%, #e94560 100%)",
108
+ color: "#00ffff",
109
+ border: "1px solid #00ffff",
110
+ shadow: "0 0 10px rgba(0, 255, 255, 0.5)"
111
+ },
112
+ info: {
113
+ emoji: "🔮",
114
+ label: "INFO",
115
+ background: "linear-gradient(135deg, #16213e 0%, #0f3460 100%)",
116
+ color: "#00ff41",
117
+ border: "1px solid #00ff41",
118
+ shadow: "0 0 10px rgba(0, 255, 65, 0.5)"
119
+ },
120
+ warn: {
121
+ emoji: "⚠️",
122
+ label: "WARN",
123
+ background: "linear-gradient(135deg, #533a03 0%, #e94560 100%)",
124
+ color: "#ffff00",
125
+ border: "1px solid #ffff00",
126
+ shadow: "0 0 10px rgba(255, 255, 0, 0.5)"
127
+ },
128
+ error: {
129
+ emoji: "💥",
130
+ label: "ERROR",
131
+ background: "linear-gradient(135deg, #5c0a0a 0%, #ff073a 100%)",
132
+ color: "#ff073a",
133
+ border: "1px solid #ff073a",
134
+ shadow: "0 0 10px rgba(255, 7, 58, 0.8)"
135
+ },
136
+ success: {
137
+ emoji: "✨",
138
+ label: "SUCCESS",
139
+ background: "linear-gradient(135deg, #0a5c0a 0%, #39ff14 100%)",
140
+ color: "#39ff14",
141
+ border: "1px solid #39ff14",
142
+ shadow: "0 0 10px rgba(57, 255, 20, 0.8)"
143
+ },
144
+ critical: {
145
+ emoji: "🌟",
146
+ label: "CRITICAL",
147
+ background: "linear-gradient(135deg, #000000 0%, #ff0080 100%)",
148
+ color: "#ff0080",
149
+ border: "2px solid #ff0080",
150
+ shadow: "0 0 20px rgba(255, 0, 128, 1)"
151
+ }
152
+ },
153
+ minimal: {
154
+ debug: {
155
+ emoji: "",
156
+ label: "DEBUG",
157
+ background: "#f7fafc",
158
+ color: "#4a5568",
159
+ border: "1px solid #e2e8f0",
160
+ shadow: "none"
161
+ },
162
+ info: {
163
+ emoji: "",
164
+ label: "INFO",
165
+ background: "#ebf8ff",
166
+ color: "#2b6cb0",
167
+ border: "1px solid #bee3f8",
168
+ shadow: "none"
169
+ },
170
+ warn: {
171
+ emoji: "",
172
+ label: "WARN",
173
+ background: "#fffbf0",
174
+ color: "#c05621",
175
+ border: "1px solid #fed7aa",
176
+ shadow: "none"
177
+ },
178
+ error: {
179
+ emoji: "",
180
+ label: "ERROR",
181
+ background: "#fef5f5",
182
+ color: "#c53030",
183
+ border: "1px solid #fca5a5",
184
+ shadow: "none"
185
+ },
186
+ success: {
187
+ emoji: "",
188
+ label: "SUCCESS",
189
+ background: "#f0fff4",
190
+ color: "#2f855a",
191
+ border: "1px solid #9ae6b4",
192
+ shadow: "none"
193
+ },
194
+ critical: {
195
+ emoji: "",
196
+ label: "CRITICAL",
197
+ background: "#fef5f5",
198
+ color: "#e53e3e",
199
+ border: "2px solid #f56565",
200
+ shadow: "none"
201
+ }
202
+ },
203
+ // Additional theme variants can be added here
204
+ light: {
205
+ debug: {
206
+ emoji: "🔍",
207
+ label: "DEBUG",
208
+ background: "linear-gradient(135deg, #e3f2fd 0%, #bbdefb 100%)",
209
+ color: "#1565c0",
210
+ border: "1px solid #90caf9",
211
+ shadow: "0 1px 3px rgba(33, 150, 243, 0.2)"
212
+ },
213
+ info: {
214
+ emoji: "ℹ️",
215
+ label: "INFO",
216
+ background: "linear-gradient(135deg, #f3e5f5 0%, #e1bee7 100%)",
217
+ color: "#7b1fa2",
218
+ border: "1px solid #ce93d8",
219
+ shadow: "0 1px 3px rgba(156, 39, 176, 0.2)"
220
+ },
221
+ warn: {
222
+ emoji: "⚠️",
223
+ label: "WARN",
224
+ background: "linear-gradient(135deg, #fff8e1 0%, #ffecb3 100%)",
225
+ color: "#f57c00",
226
+ border: "1px solid #ffcc02",
227
+ shadow: "0 1px 3px rgba(255, 152, 0, 0.2)"
228
+ },
229
+ error: {
230
+ emoji: "❌",
231
+ label: "ERROR",
232
+ background: "linear-gradient(135deg, #ffebee 0%, #ffcdd2 100%)",
233
+ color: "#d32f2f",
234
+ border: "1px solid #f44336",
235
+ shadow: "0 1px 3px rgba(244, 67, 54, 0.2)"
236
+ },
237
+ success: {
238
+ emoji: "✅",
239
+ label: "SUCCESS",
240
+ background: "linear-gradient(135deg, #e8f5e8 0%, #c8e6c9 100%)",
241
+ color: "#388e3c",
242
+ border: "1px solid #4caf50",
243
+ shadow: "0 1px 3px rgba(76, 175, 80, 0.2)"
244
+ },
245
+ critical: {
246
+ emoji: "🚨",
247
+ label: "CRITICAL",
248
+ background: "linear-gradient(135deg, #fce4ec 0%, #f8bbd9 100%)",
249
+ color: "#c2185b",
250
+ border: "2px solid #e91e63",
251
+ shadow: "0 2px 6px rgba(233, 30, 99, 0.3)"
252
+ }
253
+ },
254
+ cyberpunk: {
255
+ debug: {
256
+ emoji: "🤖",
257
+ label: "DEBUG",
258
+ background: "linear-gradient(135deg, #0d1b2a 0%, #415a77 100%)",
259
+ color: "#00d4aa",
260
+ border: "1px solid #00d4aa",
261
+ shadow: "0 0 15px rgba(0, 212, 170, 0.4)"
262
+ },
263
+ info: {
264
+ emoji: "🔗",
265
+ label: "INFO",
266
+ background: "linear-gradient(135deg, #1b263b 0%, #0d1b2a 100%)",
267
+ color: "#00b4d8",
268
+ border: "1px solid #00b4d8",
269
+ shadow: "0 0 15px rgba(0, 180, 216, 0.4)"
270
+ },
271
+ warn: {
272
+ emoji: "⚡",
273
+ label: "WARN",
274
+ background: "linear-gradient(135deg, #f72585 0%, #b5179e 100%)",
275
+ color: "#ffff3f",
276
+ border: "1px solid #ffff3f",
277
+ shadow: "0 0 15px rgba(255, 255, 63, 0.4)"
278
+ },
279
+ error: {
280
+ emoji: "💀",
281
+ label: "ERROR",
282
+ background: "linear-gradient(135deg, #7209b7 0%, #480ca8 100%)",
283
+ color: "#ff006e",
284
+ border: "1px solid #ff006e",
285
+ shadow: "0 0 15px rgba(255, 0, 110, 0.6)"
286
+ },
287
+ success: {
288
+ emoji: "⚡",
289
+ label: "SUCCESS",
290
+ background: "linear-gradient(135deg, #003566 0%, #001d3d 100%)",
291
+ color: "#00f5ff",
292
+ border: "1px solid #00f5ff",
293
+ shadow: "0 0 15px rgba(0, 245, 255, 0.4)"
294
+ },
295
+ critical: {
296
+ emoji: "💥",
297
+ label: "CRITICAL",
298
+ background: "linear-gradient(135deg, #000000 0%, #ff0040 100%)",
299
+ color: "#ff0040",
300
+ border: "2px solid #ff0040",
301
+ shadow: "0 0 25px rgba(255, 0, 64, 0.8)"
302
+ }
303
+ }
304
+ };
305
+ const BANNER_VARIANTS = {
306
+ simple: {
307
+ text: "🚀 ADVANCED LOGGER v2.0.0 - State-of-the-art Console Styling 🚀",
308
+ style: "background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 12px 20px; border-radius: 8px; font-weight: bold; font-size: 14px;"
309
+ },
310
+ ascii: {
311
+ text: `
312
+ ___ ____ _ __ ___ _ __ _____ _____ ____ __ ___ _____ _____ _____ ____
313
+ / _ \\ / __ \\| | / / / _ \\ | \\ | |/ ____| ____| _ \\ | | / _ \\ / ____| ___| _ | _ \\
314
+ / /_\\ \\ / / _\` | |/ / / /_\\ \\ | \\| | | | |__ | | | | | | / / \\ \\| | __| |_ | |_| | |_) |
315
+ | _ || | (_| | < | _ | | . \` | | | __| | | | | | | | | | | | |_ | _| | /| _ <
316
+ | | | |\\ \\__,_|_|\\_\\ | | | | | |\\ | |___| |____| |_| | | |__\\ \\_/ /| |__| | |___| |\\ \\| |_) |
317
+ \\_| |_/ \\____/ \\_| |_/ |_| \\_|\\_____|______|____/ |_____/\\___/ \\_____|_____|_| \\_|____/
318
+
319
+ Advanced Logger v2.0.0 - Console Excellence`,
320
+ style: 'font-family: "Courier New", Consolas, Monaco, monospace; color: #667eea; font-size: 11px; line-height: 1.2;'
321
+ },
322
+ unicode: {
323
+ text: `
324
+ ╔══════════════════════════════════════════════════════════════════════════╗
325
+ ║ 🚀 ADVANCED LOGGER v2.0.0 ║
326
+ ║ State-of-the-art Console Styling ║
327
+ ╚══════════════════════════════════════════════════════════════════════════╝`,
328
+ style: 'font-family: "Courier New", Consolas, Monaco, monospace; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 15px; border-radius: 8px; font-size: 12px; line-height: 1.3;'
329
+ },
330
+ svg: {
331
+ text: " ",
332
+ style: `
333
+ background-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 400 80'><defs><linearGradient id='grad' x1='0%' y1='0%' x2='100%' y2='0%'><stop offset='0%' style='stop-color:%23667eea'/><stop offset='100%' style='stop-color:%23764ba2'/></linearGradient></defs><rect width='100%' height='100%' fill='url(%23grad)' rx='8'/><text x='200' y='30' text-anchor='middle' fill='white' font-family='monospace' font-size='14' font-weight='bold'>🚀 ADVANCED LOGGER</text><text x='200' y='50' text-anchor='middle' fill='white' font-family='monospace' font-size='12'>State-of-the-art Console Styling</text><text x='200' y='65' text-anchor='middle' fill='white' font-family='monospace' font-size='10'>v2.0.0</text></svg>");
334
+ background-repeat: no-repeat;
335
+ background-size: 400px 80px;
336
+ padding: 40px 200px;
337
+ color: transparent;
338
+ display: inline-block;
339
+ border-radius: 8px;
340
+ `
341
+ },
342
+ animated: {
343
+ text: " 🚀 ADVANCED LOGGER v2.0.0 ",
344
+ style: `
345
+ background: linear-gradient(-45deg, #667eea, #764ba2, #667eea, #764ba2);
346
+ background-size: 400% 400%;
347
+ color: white;
348
+ padding: 15px 25px;
349
+ border-radius: 10px;
350
+ font-weight: bold;
351
+ font-size: 14px;
352
+ font-family: monospace;
353
+ animation: gradientShift 3s ease infinite;
354
+ display: inline-block;
355
+ `
356
+ }
357
+ };
358
+ const THEME_BANNERS = {
359
+ default: {
360
+ simple: "🚀 ADVANCED LOGGER v2.0.0 - State-of-the-art Console Styling 🚀",
361
+ style: "background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 12px 20px; border-radius: 8px; font-weight: bold;"
362
+ },
363
+ dark: {
364
+ simple: "🌙 ADVANCED LOGGER v2.0.0 - Dark Mode Console Excellence 🌙",
365
+ style: "background: linear-gradient(135deg, #1a202c 0%, #2d3748 100%); color: #e2e8f0; padding: 12px 20px; border-radius: 8px; font-weight: bold; border: 1px solid #4a5568;"
366
+ },
367
+ neon: {
368
+ simple: "⚡ ADVANCED LOGGER v2.0.0 - Cyberpunk Console Experience ⚡",
369
+ style: "background: linear-gradient(135deg, #0f3460 0%, #e94560 100%); color: #00ffff; padding: 12px 20px; border-radius: 8px; font-weight: bold; text-shadow: 0 0 10px #00ffff;"
370
+ },
371
+ minimal: {
372
+ simple: "ADVANCED LOGGER v2.0.0 - Clean Console Styling",
373
+ style: "background: #f7fafc; color: #2d3748; padding: 8px 16px; border: 1px solid #e2e8f0; border-radius: 4px; font-weight: 500;"
374
+ },
375
+ light: {
376
+ simple: "☀️ ADVANCED LOGGER v2.0.0 - Bright Console Styling ☀️",
377
+ style: "background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%); color: #495057; padding: 12px 20px; border-radius: 8px; font-weight: bold; border: 1px solid #dee2e6;"
378
+ },
379
+ cyberpunk: {
380
+ simple: "🤖 ADVANCED LOGGER v2.0.0 - Neural Console Interface 🤖",
381
+ style: "background: linear-gradient(135deg, #0d1b2a 0%, #415a77 100%); color: #00d4aa; padding: 12px 20px; border-radius: 8px; font-weight: bold; text-shadow: 0 0 10px #00d4aa; border: 1px solid #00d4aa;"
382
+ }
383
+ };
384
+ function detectBannerCapabilities() {
385
+ const userAgent = navigator.userAgent;
386
+ const isChrome = /Chrome/.test(userAgent);
387
+ const isFirefox = /Firefox/.test(userAgent);
388
+ const isSafari = /Safari/.test(userAgent) && !/Chrome/.test(userAgent);
389
+ const supportsSVG = !!document.createElementNS && !!document.createElementNS("http://www.w3.org/2000/svg", "svg").createSVGRect;
390
+ const supportsAnimations = typeof document !== "undefined" && "animationName" in document.createElement("div").style;
391
+ if (supportsAnimations && isChrome) {
392
+ return "animated";
393
+ } else if (supportsSVG && (isChrome || isFirefox)) {
394
+ return "svg";
395
+ } else if (isChrome || isFirefox) {
396
+ return "unicode";
397
+ } else if (isSafari) {
398
+ return "ascii";
399
+ }
400
+ return "simple";
401
+ }
402
+ function displayInitBanner(bannerType) {
403
+ const selectedType = bannerType || detectBannerCapabilities();
404
+ const banner = BANNER_VARIANTS[selectedType];
405
+ if (selectedType === "animated") {
406
+ const style = document.createElement("style");
407
+ style.textContent = `
408
+ @keyframes gradientShift {
409
+ 0% { background-position: 0% 50%; }
410
+ 50% { background-position: 100% 50%; }
411
+ 100% { background-position: 0% 50%; }
412
+ }
413
+ `;
414
+ document.head.appendChild(style);
415
+ }
416
+ console.log(`%c${banner.text}`, banner.style);
417
+ const features = [
418
+ "🎨 Advanced CSS Console Styling",
419
+ "📍 Automatic Stack Trace Parsing",
420
+ "🔧 Scoped Loggers & Prefixes",
421
+ "⚡ Performance Timers",
422
+ "🎯 Verbosity Filtering",
423
+ "🔌 Extensible Handlers",
424
+ "📱 Modern TypeScript Patterns",
425
+ "📤 Export & Clipboard Support"
426
+ ];
427
+ console.group(`%c✨ Features`, "background: #f8f9fa; color: #495057; padding: 4px 8px; border-radius: 4px; font-weight: bold;");
428
+ features.forEach((feature) => {
429
+ console.log(`%c${feature}`, "color: #6c757d; font-size: 13px;");
430
+ });
431
+ console.groupEnd();
432
+ console.log("");
433
+ }
434
+ function createStyledOutput(level, levelStyles, prefix, message, stackInfo) {
435
+ const levelConfig = levelStyles[level];
436
+ const timestamp = formatTimestamp();
437
+ const timestampStyle = new StyleBuilder().color("#666").size("11px").font("Monaco, Consolas, monospace").build();
438
+ const levelStyle = new StyleBuilder().bg(levelConfig.background).color(levelConfig.color).border(levelConfig.border).shadow(levelConfig.shadow).padding("2px 8px").rounded("4px").bold().font("Monaco, Consolas, monospace").size("12px").build();
439
+ const prefixStyle = new StyleBuilder().bg("#2d3748").color("#e2e8f0").padding("2px 6px").rounded("3px").bold().font("Monaco, Consolas, monospace").size("11px").build();
440
+ const messageStyle = new StyleBuilder().color("#2d3748").font("system-ui, -apple-system, sans-serif").size("14px").build();
441
+ const locationStyle = new StyleBuilder().color("#718096").size("11px").font("Monaco, Consolas, monospace").build();
442
+ let format = `%c${timestamp.slice(11, 23)} %c${levelConfig.emoji} ${levelConfig.label}`;
443
+ const styles = [timestampStyle, levelStyle];
444
+ if (prefix) {
445
+ format += ` %c${prefix}`;
446
+ styles.push(prefixStyle);
447
+ }
448
+ format += ` %c${message}`;
449
+ styles.push(messageStyle);
450
+ if (stackInfo) {
451
+ format += ` %c(${stackInfo.file}:${stackInfo.line}:${stackInfo.column})`;
452
+ styles.push(locationStyle);
453
+ }
454
+ return [format, ...styles];
455
+ }
456
+ function generateLogId() {
457
+ return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
458
+ }
459
+ function escapeHtml(text) {
460
+ const div = document.createElement("div");
461
+ div.textContent = text;
462
+ return div.innerHTML;
463
+ }
464
+ function safeStringify(obj, _maxDepth = 3) {
465
+ try {
466
+ return JSON.stringify(obj, (_key, value) => {
467
+ if (typeof value === "function") return "[Function]";
468
+ if (value instanceof Error) return `[Error: ${value.message}]`;
469
+ if (value instanceof Date) return value.toISOString();
470
+ if (typeof value === "undefined") return "[undefined]";
471
+ return value;
472
+ }, 2);
473
+ } catch (error) {
474
+ return String(obj);
475
+ }
476
+ }
477
+ class ExportLogHandler {
478
+ buffer = [];
479
+ maxSize;
480
+ groupDepth = 0;
481
+ currentGroup;
482
+ constructor(maxSize = BUFFER_LIMITS.DEFAULT_SIZE) {
483
+ this.maxSize = Math.min(Math.max(maxSize, BUFFER_LIMITS.MIN_SIZE), BUFFER_LIMITS.MAX_SIZE);
484
+ }
485
+ /**
486
+ * Handle incoming log and store in buffer
487
+ */
488
+ handle(level, message, args, metadata) {
489
+ const entry = {
490
+ id: generateLogId(),
491
+ timestamp: metadata.timestamp,
492
+ level,
493
+ prefix: metadata.prefix,
494
+ message,
495
+ args,
496
+ location: metadata.stackInfo,
497
+ groupInfo: this.groupDepth > 0 ? {
498
+ depth: this.groupDepth,
499
+ groupName: this.currentGroup
500
+ } : void 0
501
+ };
502
+ this.buffer.push(entry);
503
+ if (this.buffer.length > this.maxSize) {
504
+ this.buffer.shift();
505
+ }
506
+ }
507
+ /**
508
+ * Set group tracking for nested logs
509
+ */
510
+ setGroupInfo(depth, groupName) {
511
+ this.groupDepth = depth;
512
+ this.currentGroup = groupName;
513
+ }
514
+ /**
515
+ * Get buffer statistics
516
+ */
517
+ getBufferStats() {
518
+ const levelCounts = this.buffer.reduce((acc, entry) => {
519
+ const currentCount = acc[entry.level] ? acc[entry.level] : 0;
520
+ acc[entry.level] = currentCount + 1;
521
+ return acc;
522
+ }, {});
523
+ let oldestLog;
524
+ let newestLog;
525
+ if (this.buffer.length > 0) {
526
+ const firstEntry = this.buffer[0];
527
+ const lastEntry = this.buffer[this.buffer.length - 1];
528
+ if (firstEntry && firstEntry.timestamp) {
529
+ oldestLog = new Date(firstEntry.timestamp);
530
+ }
531
+ if (lastEntry && lastEntry.timestamp) {
532
+ newestLog = new Date(lastEntry.timestamp);
533
+ }
534
+ }
535
+ return {
536
+ size: this.buffer.length,
537
+ maxSize: this.maxSize,
538
+ usage: this.buffer.length / this.maxSize * 100,
539
+ oldestLog,
540
+ newestLog,
541
+ levelCounts: {
542
+ debug: levelCounts.debug ? levelCounts.debug : 0,
543
+ info: levelCounts.info ? levelCounts.info : 0,
544
+ warn: levelCounts.warn ? levelCounts.warn : 0,
545
+ error: levelCounts.error ? levelCounts.error : 0,
546
+ critical: levelCounts.critical ? levelCounts.critical : 0
547
+ }
548
+ };
549
+ }
550
+ /**
551
+ * Clear the buffer
552
+ */
553
+ clearBuffer() {
554
+ this.buffer = [];
555
+ }
556
+ /**
557
+ * Set buffer size (with limits)
558
+ */
559
+ setBufferSize(size) {
560
+ this.maxSize = Math.min(Math.max(size, BUFFER_LIMITS.MIN_SIZE), BUFFER_LIMITS.MAX_SIZE);
561
+ if (this.buffer.length > this.maxSize) {
562
+ this.buffer = this.buffer.slice(-this.maxSize);
563
+ }
564
+ }
565
+ /**
566
+ * Filter logs based on criteria
567
+ */
568
+ filterLogs(filters = {}) {
569
+ let filtered = [...this.buffer];
570
+ if (filters.levels?.length) {
571
+ filtered = filtered.filter((entry) => filters.levels.includes(entry.level));
572
+ }
573
+ if (filters.prefixes?.length) {
574
+ filtered = filtered.filter(
575
+ (entry) => entry.prefix && filters.prefixes.includes(entry.prefix)
576
+ );
577
+ }
578
+ if (filters.excludePrefixes?.length) {
579
+ filtered = filtered.filter(
580
+ (entry) => !entry.prefix || !filters.excludePrefixes.includes(entry.prefix)
581
+ );
582
+ }
583
+ if (filters.since) {
584
+ const sinceDate = parseTimeInput(filters.since);
585
+ filtered = filtered.filter((entry) => new Date(entry.timestamp) >= sinceDate);
586
+ }
587
+ if (filters.until) {
588
+ const untilDate = parseTimeInput(filters.until);
589
+ filtered = filtered.filter((entry) => new Date(entry.timestamp) <= untilDate);
590
+ }
591
+ if (filters.withStackTrace) {
592
+ filtered = filtered.filter((entry) => entry.location);
593
+ }
594
+ if (filters.errorsOnly) {
595
+ filtered = filtered.filter((entry) => entry.level === "error" || entry.level === "critical");
596
+ }
597
+ if (filters.search) {
598
+ const searchTerm = filters.search.toLowerCase();
599
+ filtered = filtered.filter(
600
+ (entry) => entry.message.toLowerCase().includes(searchTerm) || entry.args.some(
601
+ (arg) => String(arg).toLowerCase().includes(searchTerm)
602
+ )
603
+ );
604
+ }
605
+ if (filters.last) {
606
+ filtered = filtered.slice(-filters.last);
607
+ }
608
+ if (filters.first) {
609
+ filtered = filtered.slice(0, filters.first);
610
+ }
611
+ return filtered;
612
+ }
613
+ /**
614
+ * Export logs in JSON format
615
+ */
616
+ exportJSON(logs, options) {
617
+ const data = logs.map((entry) => ({
618
+ timestamp: entry.timestamp,
619
+ level: entry.level,
620
+ prefix: entry.prefix,
621
+ message: entry.message,
622
+ ...options.minimal ? {} : {
623
+ args: entry.args.slice(1),
624
+ location: entry.location,
625
+ groupInfo: entry.groupInfo
626
+ }
627
+ }));
628
+ return options.compact ? JSON.stringify(data) : JSON.stringify(data, null, 2);
629
+ }
630
+ /**
631
+ * Export logs in CSV format
632
+ */
633
+ exportCSV(logs, options) {
634
+ const headers = options.minimal ? ["Timestamp", "Level", "Prefix", "Message"] : ["Timestamp", "Level", "Prefix", "Message", "File", "Line", "Args"];
635
+ const rows = logs.map((entry) => {
636
+ const baseRow = [
637
+ formatDisplayTime(new Date(entry.timestamp), "full"),
638
+ entry.level.toUpperCase(),
639
+ entry.prefix || "",
640
+ `"${entry.message.replace(/"/g, '""')}"`
641
+ ];
642
+ if (!options.minimal) {
643
+ baseRow.push(
644
+ entry.location?.file || "",
645
+ entry.location?.line?.toString() || "",
646
+ `"${safeStringify(entry.args.slice(1)).replace(/"/g, '""')}"`
647
+ );
648
+ }
649
+ return baseRow;
650
+ });
651
+ return [headers.join(","), ...rows.map((row) => row.join(","))].join("\n");
652
+ }
653
+ /**
654
+ * Export logs in Markdown format
655
+ */
656
+ exportMarkdown(logs, options) {
657
+ const now = /* @__PURE__ */ new Date();
658
+ let content = `# Log Export - ${formatDisplayTime(now, "full")}
659
+
660
+ `;
661
+ if (!options.minimal) {
662
+ const summary = this.getBufferStats();
663
+ content += `## Summary
664
+ `;
665
+ content += `- **Total logs**: ${logs.length}
666
+ `;
667
+ content += `- **Errors**: ${summary.levelCounts.error + summary.levelCounts.critical}
668
+ `;
669
+ content += `- **Warnings**: ${summary.levelCounts.warn}
670
+
671
+ `;
672
+ }
673
+ if (options.groupBy === "level") {
674
+ const grouped = logs.reduce((acc, entry) => {
675
+ const level = entry.level;
676
+ if (!acc[level]) {
677
+ acc[level] = [];
678
+ }
679
+ const levelArray = acc[level];
680
+ if (levelArray) {
681
+ levelArray.push(entry);
682
+ }
683
+ return acc;
684
+ }, {});
685
+ Object.entries(grouped).forEach(([level, entries]) => {
686
+ const emoji = this.getLevelEmoji(level);
687
+ content += `## ${emoji} ${level.toUpperCase()} (${entries.length})
688
+
689
+ `;
690
+ entries.forEach((entry) => {
691
+ const time = formatDisplayTime(new Date(entry.timestamp), "time-only");
692
+ const location = entry.location ? ` (${entry.location.file}:${entry.location.line})` : "";
693
+ const prefix = entry.prefix ? ` **${entry.prefix}**:` : "";
694
+ content += `- \`${time}\`${prefix} ${entry.message}${location}
695
+ `;
696
+ });
697
+ content += "\n";
698
+ });
699
+ } else {
700
+ content += "## Logs\n\n";
701
+ logs.forEach((entry) => {
702
+ const time = formatDisplayTime(new Date(entry.timestamp), "time-only");
703
+ const emoji = this.getLevelEmoji(entry.level);
704
+ const location = entry.location ? ` (${entry.location.file}:${entry.location.line})` : "";
705
+ const prefix = entry.prefix ? ` **${entry.prefix}**:` : "";
706
+ content += `- \`${time}\` ${emoji}${prefix} ${entry.message}${location}
707
+ `;
708
+ });
709
+ }
710
+ return content;
711
+ }
712
+ /**
713
+ * Export logs in plain text format
714
+ */
715
+ exportPlain(logs, options) {
716
+ return logs.map((entry) => {
717
+ const time = formatDisplayTime(new Date(entry.timestamp), options.minimal ? "time-only" : "short");
718
+ const level = entry.level.toUpperCase().padEnd(8);
719
+ const prefix = entry.prefix ? `[${entry.prefix}] ` : "";
720
+ const location = !options.minimal && entry.location ? ` (${entry.location.file}:${entry.location.line})` : "";
721
+ return `${time} ${level} ${prefix}${entry.message}${location}`;
722
+ }).join("\n");
723
+ }
724
+ /**
725
+ * Export logs in HTML format
726
+ */
727
+ exportHTML(logs, _options) {
728
+ const title = `Log Export - ${formatDisplayTime(/* @__PURE__ */ new Date(), "full")}`;
729
+ let html = `<!DOCTYPE html>
730
+ <html lang="en">
731
+ <head>
732
+ <meta charset="UTF-8">
733
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
734
+ <title>${title}</title>
735
+ <style>
736
+ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; margin: 20px; line-height: 1.6; }
737
+ .header { border-bottom: 2px solid #ddd; padding-bottom: 20px; margin-bottom: 20px; }
738
+ .log-entry { margin: 5px 0; padding: 8px; border-radius: 4px; font-family: 'Monaco', 'Consolas', monospace; }
739
+ .timestamp { color: #666; font-size: 0.9em; }
740
+ .level { font-weight: bold; padding: 2px 6px; border-radius: 3px; margin: 0 8px; }
741
+ .prefix { background: #2d3748; color: #e2e8f0; padding: 2px 6px; border-radius: 3px; margin: 0 8px; }
742
+ .location { color: #718096; font-size: 0.9em; }
743
+ .debug { background: #f0f4ff; }
744
+ .info { background: #f0f9ff; }
745
+ .warn { background: #fffbeb; }
746
+ .error { background: #fef2f2; }
747
+ .critical { background: #fef2f2; border-left: 4px solid #dc2626; }
748
+ .level.debug { background: #667eea; color: white; }
749
+ .level.info { background: #74b9ff; color: white; }
750
+ .level.warn { background: #fdcb6e; color: #2d3436; }
751
+ .level.error { background: #e84393; color: white; }
752
+ .level.critical { background: #ff3838; color: white; }
753
+ </style>
754
+ </head>
755
+ <body>
756
+ <div class="header">
757
+ <h1>${title}</h1>
758
+ <p>Generated by Advanced Logger v2.0.0</p>
759
+ </div>
760
+ <div class="logs">`;
761
+ logs.forEach((entry) => {
762
+ const time = formatDisplayTime(new Date(entry.timestamp), "full");
763
+ const location = entry.location ? ` <span class="location">(${escapeHtml(entry.location.file)}:${entry.location.line})</span>` : "";
764
+ const prefix = entry.prefix ? ` <span class="prefix">${escapeHtml(entry.prefix)}</span>` : "";
765
+ html += `
766
+ <div class="log-entry ${entry.level}">
767
+ <span class="timestamp">${time}</span>
768
+ <span class="level ${entry.level}">${entry.level.toUpperCase()}</span>
769
+ ${prefix}
770
+ <span class="message">${escapeHtml(entry.message)}</span>
771
+ ${location}
772
+ </div>`;
773
+ });
774
+ html += `
775
+ </div>
776
+ </body>
777
+ </html>`;
778
+ return html;
779
+ }
780
+ /**
781
+ * Get emoji for log level
782
+ */
783
+ getLevelEmoji(level) {
784
+ const emojis = {
785
+ debug: "🐞",
786
+ info: "ℹ️",
787
+ warn: "⚠️",
788
+ error: "❌",
789
+ critical: "🔥"
790
+ };
791
+ return emojis[level] || "";
792
+ }
793
+ /**
794
+ * Main export function
795
+ */
796
+ export(format, filters = {}, options = {}) {
797
+ const filteredLogs = this.filterLogs(filters);
798
+ let data;
799
+ switch (format) {
800
+ case "json":
801
+ data = this.exportJSON(filteredLogs, options);
802
+ break;
803
+ case "csv":
804
+ data = this.exportCSV(filteredLogs, options);
805
+ break;
806
+ case "markdown":
807
+ data = this.exportMarkdown(filteredLogs, options);
808
+ break;
809
+ case "plain":
810
+ data = this.exportPlain(filteredLogs, options);
811
+ break;
812
+ case "html":
813
+ data = this.exportHTML(filteredLogs, options);
814
+ break;
815
+ default:
816
+ throw new Error(`Unsupported export format: ${format}`);
817
+ }
818
+ return {
819
+ format,
820
+ data,
821
+ metadata: {
822
+ totalLogs: this.buffer.length,
823
+ filteredLogs: filteredLogs.length,
824
+ exportedAt: (/* @__PURE__ */ new Date()).toISOString(),
825
+ filters,
826
+ options
827
+ }
828
+ };
829
+ }
830
+ /**
831
+ * Copy to clipboard with fallback
832
+ */
833
+ async copyToClipboard(format, filters = {}, options = {}) {
834
+ const result = this.export(format, filters, options);
835
+ try {
836
+ if (navigator.clipboard && window.isSecureContext) {
837
+ await navigator.clipboard.writeText(result.data);
838
+ return true;
839
+ } else {
840
+ const textArea = document.createElement("textarea");
841
+ textArea.value = result.data;
842
+ textArea.style.position = "fixed";
843
+ textArea.style.opacity = "0";
844
+ document.body.appendChild(textArea);
845
+ textArea.focus();
846
+ textArea.select();
847
+ const success = document.execCommand("copy");
848
+ document.body.removeChild(textArea);
849
+ return success;
850
+ }
851
+ } catch (error) {
852
+ console.error("Failed to copy to clipboard:", error);
853
+ return false;
854
+ }
855
+ }
856
+ /**
857
+ * Get all logs (for debugging)
858
+ */
859
+ getAllLogs() {
860
+ return [...this.buffer];
861
+ }
862
+ /**
863
+ * Save export to file with download prompt
864
+ */
865
+ async saveToFile(format, filters = {}, options = {}) {
866
+ try {
867
+ const result = this.export(format, filters, options);
868
+ const blob = new Blob([result.data], {
869
+ type: this.getMimeType(format)
870
+ });
871
+ const url = URL.createObjectURL(blob);
872
+ const a = document.createElement("a");
873
+ const filename = this.generateFilename(format, filters);
874
+ a.href = url;
875
+ a.download = filename;
876
+ a.style.display = "none";
877
+ document.body.appendChild(a);
878
+ a.click();
879
+ document.body.removeChild(a);
880
+ URL.revokeObjectURL(url);
881
+ return true;
882
+ } catch (error) {
883
+ console.error("Failed to save file:", error);
884
+ return false;
885
+ }
886
+ }
887
+ /**
888
+ * Get MIME type for format
889
+ */
890
+ getMimeType(format) {
891
+ const mimeTypes = {
892
+ json: "application/json",
893
+ csv: "text/csv",
894
+ markdown: "text/markdown",
895
+ plain: "text/plain",
896
+ html: "text/html"
897
+ };
898
+ return mimeTypes[format] || "text/plain";
899
+ }
900
+ /**
901
+ * Generate filename with timestamp
902
+ */
903
+ generateFilename(format, filters) {
904
+ const timestamp = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-").slice(0, -5);
905
+ const prefix = filters.prefixes?.length === 1 ? `_${filters.prefixes[0]}` : "";
906
+ const extension = format === "markdown" ? "md" : format;
907
+ return `logs${prefix}_${timestamp}.${extension}`;
908
+ }
909
+ /**
910
+ * Stream logs to external endpoint
911
+ */
912
+ async streamToEndpoint(endpoint, filters = {}, options = {}) {
913
+ try {
914
+ const logs = this.filterLogs(filters);
915
+ const batchSize = options.batchSize || 100;
916
+ const format = options.format || "json";
917
+ for (let i = 0; i < logs.length; i += batchSize) {
918
+ const batch = logs.slice(i, i + batchSize);
919
+ const result = this.export(format, {}, { compact: true });
920
+ const headers = {
921
+ "Content-Type": "application/json"
922
+ };
923
+ if (options.apiKey) {
924
+ headers["Authorization"] = `Bearer ${options.apiKey}`;
925
+ }
926
+ const response = await fetch(endpoint, {
927
+ method: "POST",
928
+ headers,
929
+ body: JSON.stringify({
930
+ logs: batch,
931
+ metadata: {
932
+ batchIndex: Math.floor(i / batchSize),
933
+ totalBatches: Math.ceil(logs.length / batchSize),
934
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
935
+ }
936
+ })
937
+ });
938
+ if (!response.ok) {
939
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
940
+ }
941
+ }
942
+ return true;
943
+ } catch (error) {
944
+ console.error("Failed to stream logs:", error);
945
+ return false;
946
+ }
947
+ }
948
+ /**
949
+ * Create export with metadata enrichment
950
+ */
951
+ exportWithMetadata(format, filters = {}, options = {}) {
952
+ const baseResult = this.export(format, filters, options);
953
+ const bufferStats = this.getBufferStats();
954
+ return {
955
+ ...baseResult,
956
+ metadata: {
957
+ ...baseResult.metadata,
958
+ bufferStats,
959
+ performance: {
960
+ memoryUsage: this.estimateMemoryUsage(),
961
+ processingTime: Date.now()
962
+ },
963
+ system: {
964
+ userAgent: typeof navigator !== "undefined" ? navigator.userAgent : "Node.js",
965
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
966
+ timezone: Intl.DateTimeFormat().resolvedOptions().timeZone
967
+ }
968
+ }
969
+ };
970
+ }
971
+ /**
972
+ * Estimate memory usage of buffer
973
+ */
974
+ estimateMemoryUsage() {
975
+ const sampleEntry = this.buffer[0];
976
+ if (!sampleEntry) return 0;
977
+ const sampleSize = JSON.stringify(sampleEntry).length;
978
+ return sampleSize * this.buffer.length;
979
+ }
980
+ }
4
981
  class CommandProcessor {
5
982
  commands = /* @__PURE__ */ new Map();
6
983
  /**
@@ -973,6 +1950,11 @@ new Logger({
973
1950
  });
974
1951
  displayInitBanner();
975
1952
  export {
976
- Logger as L
1953
+ BANNER_VARIANTS as B,
1954
+ ExportLogHandler as E,
1955
+ Logger as L,
1956
+ THEME_PRESETS as T,
1957
+ THEME_BANNERS as a,
1958
+ displayInitBanner as d
977
1959
  };
978
- //# sourceMappingURL=Logger-BrFKFZcD.js.map
1960
+ //# sourceMappingURL=Logger-CbCUS5pQ.js.map