@mks2508/better-logger 0.0.2-alpha.2 → 0.3.0

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 (326) hide show
  1. package/.claude/settings.local.json +18 -2
  2. package/.github/workflows/ci-quality.yml +357 -0
  3. package/.github/workflows/docs-demo.yml +119 -0
  4. package/.github/workflows/releases-core.yml +512 -0
  5. package/.github/workflows/releases-full.yml +582 -0
  6. package/.github/{workflows → workflows-backup}/ci.yml +12 -110
  7. package/.github/workflows-backup/nightly.yml +196 -0
  8. package/.github/workflows-backup/release-optimized.yml +373 -0
  9. package/.release-notes-0.2.0.md +129 -0
  10. package/.yamllint +28 -0
  11. package/CHANGELOG.json +783 -0
  12. package/CLAUDE.md +92 -1
  13. package/README.md +198 -490
  14. package/bun.lock +323 -0
  15. package/demo.html +9 -2
  16. package/dist/.tsbuildinfo +1 -0
  17. package/dist/Logger.d.ts +272 -0
  18. package/dist/Logger.d.ts.map +1 -0
  19. package/dist/Logger.js +680 -0
  20. package/dist/ScopedLogger.d.ts +126 -0
  21. package/dist/ScopedLogger.d.ts.map +1 -0
  22. package/dist/ScopedLogger.js +234 -0
  23. package/dist/chunks/Logger-BpeuYIxR.js +2 -0
  24. package/dist/chunks/Logger-BpeuYIxR.js.map +1 -0
  25. package/dist/chunks/Logger-Didxtr23.js +3275 -0
  26. package/dist/chunks/Logger-Didxtr23.js.map +1 -0
  27. package/dist/chunks/RemoteLogHandler-CjWpWZGl.js +33 -0
  28. package/dist/chunks/RemoteLogHandler-CjWpWZGl.js.map +1 -0
  29. package/dist/chunks/RemoteLogHandler-ymkQ97xl.js +2 -0
  30. package/dist/chunks/RemoteLogHandler-ymkQ97xl.js.map +1 -0
  31. package/dist/chunks/environment-Bxbnw4pd.js +544 -0
  32. package/dist/chunks/environment-Bxbnw4pd.js.map +1 -0
  33. package/dist/chunks/environment-Dm66zOML.js +4 -0
  34. package/dist/chunks/environment-Dm66zOML.js.map +1 -0
  35. package/dist/chunks/formatting-C0riPC5_.js +95 -0
  36. package/dist/chunks/formatting-C0riPC5_.js.map +1 -0
  37. package/dist/chunks/formatting-DNCAV66-.js +2 -0
  38. package/dist/chunks/formatting-DNCAV66-.js.map +1 -0
  39. package/dist/cli/CommandProcessor.d.ts +103 -0
  40. package/dist/cli/CommandProcessor.d.ts.map +1 -0
  41. package/dist/cli/CommandProcessor.js +184 -0
  42. package/dist/cli/commands/ConfigCommand.d.ts +17 -0
  43. package/dist/cli/commands/ConfigCommand.d.ts.map +1 -0
  44. package/dist/cli/commands/ConfigCommand.js +88 -0
  45. package/dist/cli/commands/ExportCommand.d.ts +51 -0
  46. package/dist/cli/commands/ExportCommand.d.ts.map +1 -0
  47. package/dist/cli/commands/ExportCommand.js +243 -0
  48. package/dist/cli/commands/HistoryCommand.d.ts +50 -0
  49. package/dist/cli/commands/HistoryCommand.d.ts.map +1 -0
  50. package/dist/cli/commands/HistoryCommand.js +96 -0
  51. package/dist/cli/commands/StatusCommand.d.ts +33 -0
  52. package/dist/cli/commands/StatusCommand.d.ts.map +1 -0
  53. package/dist/cli/commands/StatusCommand.js +93 -0
  54. package/dist/cli/commands/ThemeCommand.d.ts +33 -0
  55. package/dist/cli/commands/ThemeCommand.d.ts.map +1 -0
  56. package/dist/cli/commands/ThemeCommand.js +79 -0
  57. package/dist/cli/help.d.ts +15 -0
  58. package/dist/cli/help.d.ts.map +1 -0
  59. package/dist/cli/help.js +118 -0
  60. package/dist/cli/index.d.ts +15 -0
  61. package/dist/cli/index.d.ts.map +1 -0
  62. package/dist/cli/index.js +46 -0
  63. package/dist/constants.d.ts +122 -0
  64. package/dist/constants.d.ts.map +1 -0
  65. package/dist/constants.js +159 -0
  66. package/dist/core.cjs +1 -1
  67. package/dist/core.cjs.map +1 -1
  68. package/dist/core.d.ts +134 -0
  69. package/dist/core.d.ts.map +1 -0
  70. package/dist/core.js +315 -242
  71. package/dist/core.js.map +1 -1
  72. package/dist/example.d.ts +18 -0
  73. package/dist/example.d.ts.map +1 -0
  74. package/dist/example.js +154 -0
  75. package/dist/exports-module.d.ts +203 -0
  76. package/dist/exports-module.d.ts.map +1 -0
  77. package/dist/exports-module.js +260 -0
  78. package/dist/exports.cjs +1 -1
  79. package/dist/exports.cjs.map +1 -1
  80. package/dist/exports.js +5 -4
  81. package/dist/exports.js.map +1 -1
  82. package/dist/handlers/AnalyticsLogHandler.d.ts +11 -0
  83. package/dist/handlers/AnalyticsLogHandler.d.ts.map +1 -0
  84. package/dist/handlers/AnalyticsLogHandler.js +19 -0
  85. package/dist/handlers/ExportLogHandler.d.ts +103 -0
  86. package/dist/handlers/ExportLogHandler.d.ts.map +1 -0
  87. package/dist/handlers/ExportLogHandler.js +516 -0
  88. package/dist/handlers/FileLogHandler.d.ts +36 -0
  89. package/dist/handlers/FileLogHandler.d.ts.map +1 -0
  90. package/dist/handlers/FileLogHandler.js +156 -0
  91. package/dist/handlers/RemoteLogHandler.d.ts +14 -0
  92. package/dist/handlers/RemoteLogHandler.d.ts.map +1 -0
  93. package/dist/handlers/RemoteLogHandler.js +37 -0
  94. package/dist/handlers/index.d.ts +8 -0
  95. package/dist/handlers/index.d.ts.map +1 -0
  96. package/dist/handlers/index.js +7 -0
  97. package/dist/index.cjs +1 -1
  98. package/dist/index.cjs.map +1 -1
  99. package/dist/index.d.ts +86 -0
  100. package/dist/index.d.ts.map +1 -0
  101. package/dist/index.js +89 -103
  102. package/dist/index.js.map +1 -1
  103. package/dist/main.d.ts +2 -0
  104. package/dist/main.d.ts.map +1 -0
  105. package/dist/main.js +139 -0
  106. package/dist/styling/LogStyleBuilder.d.ts +149 -0
  107. package/dist/styling/LogStyleBuilder.d.ts.map +1 -0
  108. package/dist/styling/LogStyleBuilder.js +289 -0
  109. package/dist/styling/SemanticStyles.d.ts +181 -0
  110. package/dist/styling/SemanticStyles.d.ts.map +1 -0
  111. package/dist/styling/SemanticStyles.js +339 -0
  112. package/dist/styling/SmartPresets.d.ts +25 -0
  113. package/dist/styling/SmartPresets.d.ts.map +1 -0
  114. package/dist/styling/SmartPresets.js +276 -0
  115. package/dist/styling/StyleBuilder.d.ts +140 -0
  116. package/dist/styling/StyleBuilder.d.ts.map +1 -0
  117. package/dist/styling/StyleBuilder.js +280 -0
  118. package/dist/styling/banners.d.ts +45 -0
  119. package/dist/styling/banners.d.ts.map +1 -0
  120. package/dist/styling/banners.js +155 -0
  121. package/dist/styling/index.d.ts +10 -0
  122. package/dist/styling/index.d.ts.map +1 -0
  123. package/dist/styling/index.js +9 -0
  124. package/dist/styling/themes.d.ts +10 -0
  125. package/dist/styling/themes.d.ts.map +1 -0
  126. package/dist/styling/themes.js +231 -0
  127. package/dist/styling-module.d.ts +185 -0
  128. package/dist/styling-module.d.ts.map +1 -0
  129. package/dist/styling-module.js +199 -0
  130. package/dist/styling.cjs +1 -1
  131. package/dist/styling.cjs.map +1 -1
  132. package/dist/styling.js +6 -6
  133. package/dist/styling.js.map +1 -1
  134. package/dist/types/Logger.d.ts +268 -0
  135. package/dist/types/Logger.d.ts.map +1 -0
  136. package/dist/types/ScopedLogger.d.ts +123 -0
  137. package/dist/types/ScopedLogger.d.ts.map +1 -0
  138. package/dist/types/cli/CommandProcessor.d.ts +100 -0
  139. package/dist/types/cli/CommandProcessor.d.ts.map +1 -0
  140. package/dist/types/cli/commands/ConfigCommand.d.ts +14 -0
  141. package/dist/types/cli/commands/ConfigCommand.d.ts.map +1 -0
  142. package/dist/types/cli/commands/ExportCommand.d.ts +48 -0
  143. package/dist/types/cli/commands/ExportCommand.d.ts.map +1 -0
  144. package/dist/types/cli/commands/HistoryCommand.d.ts +47 -0
  145. package/dist/types/cli/commands/HistoryCommand.d.ts.map +1 -0
  146. package/dist/types/cli/commands/StatusCommand.d.ts +30 -0
  147. package/dist/types/cli/commands/StatusCommand.d.ts.map +1 -0
  148. package/dist/types/cli/commands/ThemeCommand.d.ts +30 -0
  149. package/dist/types/cli/commands/ThemeCommand.d.ts.map +1 -0
  150. package/dist/types/cli/help.d.ts +12 -0
  151. package/dist/types/cli/help.d.ts.map +1 -0
  152. package/dist/types/cli/index.d.ts +15 -0
  153. package/dist/types/cli/index.d.ts.map +1 -0
  154. package/dist/types/constants.d.ts +119 -0
  155. package/dist/types/constants.d.ts.map +1 -0
  156. package/dist/types/core.d.ts +125 -211
  157. package/dist/types/core.d.ts.map +1 -0
  158. package/dist/types/core.js +13 -0
  159. package/dist/types/example.d.ts +18 -0
  160. package/dist/types/example.d.ts.map +1 -0
  161. package/dist/types/exports-module.d.ts +196 -0
  162. package/dist/types/exports-module.d.ts.map +1 -0
  163. package/dist/types/handlers/AnalyticsLogHandler.d.ts +8 -0
  164. package/dist/types/handlers/AnalyticsLogHandler.d.ts.map +1 -0
  165. package/dist/types/handlers/ExportLogHandler.d.ts +100 -0
  166. package/dist/types/handlers/ExportLogHandler.d.ts.map +1 -0
  167. package/dist/types/handlers/FileLogHandler.d.ts +33 -0
  168. package/dist/types/handlers/FileLogHandler.d.ts.map +1 -0
  169. package/dist/types/handlers/RemoteLogHandler.d.ts +11 -0
  170. package/dist/types/handlers/RemoteLogHandler.d.ts.map +1 -0
  171. package/dist/types/handlers/index.d.ts +8 -0
  172. package/dist/types/handlers/index.d.ts.map +1 -0
  173. package/dist/types/handlers.d.ts +88 -0
  174. package/dist/types/handlers.d.ts.map +1 -0
  175. package/dist/types/handlers.js +4 -0
  176. package/dist/types/index.d.ts +7 -675
  177. package/dist/types/index.d.ts.map +1 -0
  178. package/dist/types/index.js +4 -0
  179. package/dist/types/main.d.ts +2 -0
  180. package/dist/types/main.d.ts.map +1 -0
  181. package/dist/types/styling/LogStyleBuilder.d.ts +146 -0
  182. package/dist/types/styling/LogStyleBuilder.d.ts.map +1 -0
  183. package/dist/types/styling/SemanticStyles.d.ts +178 -0
  184. package/dist/types/styling/SemanticStyles.d.ts.map +1 -0
  185. package/dist/types/styling/SmartPresets.d.ts +22 -0
  186. package/dist/types/styling/SmartPresets.d.ts.map +1 -0
  187. package/dist/types/styling/StyleBuilder.d.ts +140 -0
  188. package/dist/types/styling/StyleBuilder.d.ts.map +1 -0
  189. package/dist/types/styling/banners.d.ts +42 -0
  190. package/dist/types/styling/banners.d.ts.map +1 -0
  191. package/dist/types/styling/index.d.ts +10 -0
  192. package/dist/types/styling/index.d.ts.map +1 -0
  193. package/dist/types/styling/themes.d.ts +7 -0
  194. package/dist/types/styling/themes.d.ts.map +1 -0
  195. package/dist/types/styling-module.d.ts +178 -0
  196. package/dist/types/styling-module.d.ts.map +1 -0
  197. package/dist/types/types/core.d.ts +125 -0
  198. package/dist/types/types/core.d.ts.map +1 -0
  199. package/dist/types/types/handlers.d.ts +85 -0
  200. package/dist/types/types/handlers.d.ts.map +1 -0
  201. package/dist/types/types/index.d.ts +7 -0
  202. package/dist/types/types/index.d.ts.map +1 -0
  203. package/dist/types/utils/environment.d.ts +47 -0
  204. package/dist/types/utils/environment.d.ts.map +1 -0
  205. package/dist/types/utils/formatting.d.ts +37 -0
  206. package/dist/types/utils/formatting.d.ts.map +1 -0
  207. package/dist/types/utils/index.d.ts +7 -0
  208. package/dist/types/utils/index.d.ts.map +1 -0
  209. package/dist/types/utils/opentui-detection.d.ts +34 -0
  210. package/dist/types/utils/opentui-detection.d.ts.map +1 -0
  211. package/dist/types/utils/output.d.ts +41 -0
  212. package/dist/types/utils/output.d.ts.map +1 -0
  213. package/dist/types/utils/stackTrace.d.ts +6 -0
  214. package/dist/types/utils/stackTrace.d.ts.map +1 -0
  215. package/dist/types/utils/timestamps.d.ts +20 -0
  216. package/dist/types/utils/timestamps.d.ts.map +1 -0
  217. package/dist/utils/environment.d.ts +47 -0
  218. package/dist/utils/environment.d.ts.map +1 -0
  219. package/dist/utils/environment.js +85 -0
  220. package/dist/utils/formatting.d.ts +40 -0
  221. package/dist/utils/formatting.d.ts.map +1 -0
  222. package/dist/utils/formatting.js +117 -0
  223. package/dist/utils/index.d.ts +7 -0
  224. package/dist/utils/index.d.ts.map +1 -0
  225. package/dist/utils/index.js +6 -0
  226. package/dist/utils/opentui-detection.d.ts +34 -0
  227. package/dist/utils/opentui-detection.d.ts.map +1 -0
  228. package/dist/utils/opentui-detection.js +116 -0
  229. package/dist/utils/output.d.ts +44 -0
  230. package/dist/utils/output.d.ts.map +1 -0
  231. package/dist/utils/output.js +150 -0
  232. package/dist/utils/stackTrace.d.ts +9 -0
  233. package/dist/utils/stackTrace.d.ts.map +1 -0
  234. package/dist/utils/stackTrace.js +81 -0
  235. package/dist/utils/timestamps.d.ts +20 -0
  236. package/dist/utils/timestamps.d.ts.map +1 -0
  237. package/dist/utils/timestamps.js +71 -0
  238. package/docs/API.md +691 -0
  239. package/docs/CORE.md +10 -10
  240. package/docs/DEVELOPMENT.md +731 -0
  241. package/docs/PACKAGES.md +244 -0
  242. package/docs/_config.yml +36 -0
  243. package/docs/index.md +179 -0
  244. package/examples/README.md +208 -0
  245. package/examples/basic-logging.js +75 -0
  246. package/examples/data-export.js +234 -0
  247. package/examples/package.json +16 -0
  248. package/examples/performance-timing.js +170 -0
  249. package/examples/simplified-api.js +124 -0
  250. package/examples/styling-themes.js +207 -0
  251. package/package.json +37 -21
  252. package/packages/core/package.json +57 -0
  253. package/packages/exports/package.json +41 -0
  254. package/packages/nodejs-opentui/README.md +232 -0
  255. package/packages/nodejs-opentui/package.json +72 -0
  256. package/packages/nodejs-opentui/src/LogRenderer.ts +171 -0
  257. package/packages/nodejs-opentui/src/OpenTUILogHandler.ts +178 -0
  258. package/packages/nodejs-opentui/src/components/LogBadge.tsx +131 -0
  259. package/packages/nodejs-opentui/src/index.ts +133 -0
  260. package/packages/nodejs-opentui/src/types.ts +158 -0
  261. package/packages/nodejs-opentui/tsconfig.json +20 -0
  262. package/packages/styling/package.json +41 -0
  263. package/project-utils/README.md +172 -0
  264. package/project-utils/auto-release-gemini.ts +1193 -0
  265. package/project-utils/auto-release-ui.ts +1329 -0
  266. package/project-utils/commit-generator.ts +1385 -0
  267. package/project-utils/commit-ui.ts +264 -0
  268. package/project-utils/git-utils.ts +199 -0
  269. package/project-utils/github-release-manager.ts +466 -0
  270. package/project-utils/project-config.ts +260 -0
  271. package/project-utils/prompt-templates.js +345 -0
  272. package/project-utils/prompt-templates.ts +422 -0
  273. package/project-utils/version-manager.ts +1078 -0
  274. package/src/Logger.ts +251 -16
  275. package/src/ScopedLogger.ts +262 -0
  276. package/src/cli/CommandProcessor.ts +173 -2
  277. package/src/cli/commands/HistoryCommand.ts +117 -0
  278. package/src/cli/index.ts +12 -0
  279. package/src/constants.ts +84 -2
  280. package/src/core.ts +119 -46
  281. package/src/example.ts +4 -4
  282. package/src/exports-module.ts +1 -1
  283. package/src/handlers/ExportLogHandler.ts +141 -0
  284. package/src/handlers/FileLogHandler.ts +144 -5
  285. package/src/index.ts +1 -1
  286. package/src/main.ts +3 -3
  287. package/src/styling/LogStyleBuilder.ts +355 -0
  288. package/src/styling/SemanticStyles.ts +380 -0
  289. package/src/styling/SmartPresets.ts +288 -0
  290. package/src/styling/StyleBuilder.ts +14 -0
  291. package/src/styling/index.ts +16 -1
  292. package/src/styling-module.ts +1 -1
  293. package/src/types/core.ts +60 -0
  294. package/src/types/index.ts +6 -0
  295. package/src/utils/environment.ts +94 -0
  296. package/src/utils/formatting.ts +142 -0
  297. package/src/utils/index.ts +3 -0
  298. package/src/utils/opentui-detection.ts +138 -0
  299. package/src/utils/output.ts +66 -8
  300. package/test-core-browser.html +237 -0
  301. package/test-core-node.js +63 -0
  302. package/tests/test-conflict-resolution.ts +391 -0
  303. package/tests/validate-workflows.sh +131 -0
  304. package/tests/yaml-autofix.sh +146 -0
  305. package/vite.config.ts +189 -50
  306. package/.npmrc.bak +0 -1
  307. package/dist/chunks/Logger-BQhMKy_T.js +0 -2
  308. package/dist/chunks/Logger-BQhMKy_T.js.map +0 -1
  309. package/dist/chunks/Logger-BrFKFZcD.js +0 -978
  310. package/dist/chunks/Logger-BrFKFZcD.js.map +0 -1
  311. package/dist/chunks/core-2opW4Pi3.js +0 -194
  312. package/dist/chunks/core-2opW4Pi3.js.map +0 -1
  313. package/dist/chunks/core-DyugwSYZ.js +0 -4
  314. package/dist/chunks/core-DyugwSYZ.js.map +0 -1
  315. package/dist/chunks/exports-BNP3R7dp.js +0 -421
  316. package/dist/chunks/exports-BNP3R7dp.js.map +0 -1
  317. package/dist/chunks/exports-U1xLBXrY.js +0 -2
  318. package/dist/chunks/exports-U1xLBXrY.js.map +0 -1
  319. package/dist/chunks/styling-DhUDzwlE.js +0 -654
  320. package/dist/chunks/styling-DhUDzwlE.js.map +0 -1
  321. package/dist/chunks/styling-tmRDI28D.js +0 -2
  322. package/dist/chunks/styling-tmRDI28D.js.map +0 -1
  323. package/dist/types/exports.d.ts +0 -600
  324. package/dist/types/styling.d.ts +0 -751
  325. package/src/Logger.ts.backup +0 -1684
  326. /package/.github/{workflows → workflows-backup}/release.yml +0 -0
@@ -0,0 +1,138 @@
1
+ /**
2
+ * @fileoverview OpenTUI detection and enhancement utilities for core logger
3
+ */
4
+
5
+ import { isNode } from './environment.js';
6
+
7
+ /**
8
+ * Check if OpenTUI packages are available
9
+ */
10
+ export async function hasOpenTUI(): Promise<boolean> {
11
+ if (!isNode) {
12
+ return false; // OpenTUI is Node.js only
13
+ }
14
+
15
+ try {
16
+ // Try to dynamically import OpenTUI core
17
+ // @ts-expect-error - Optional dependency, may not be installed
18
+ await import('@opentui/core');
19
+ return true;
20
+ } catch (error) {
21
+ return false;
22
+ }
23
+ }
24
+
25
+ /**
26
+ * Check if OpenTUI enhancement package is available
27
+ */
28
+ export async function hasOpenTUILogHandler(): Promise<boolean> {
29
+ if (!isNode) {
30
+ return false;
31
+ }
32
+
33
+ try {
34
+ // @ts-expect-error - Optional dependency, may not be installed
35
+ await import('@mks2508/better-logger-nodejs-opentui');
36
+ return true;
37
+ } catch (error) {
38
+ return false;
39
+ }
40
+ }
41
+
42
+ /**
43
+ * Dynamically enhance logger with OpenTUI if available
44
+ */
45
+ export async function tryEnhanceWithOpenTUI(logger: any): Promise<boolean> {
46
+ try {
47
+ // Check if both OpenTUI and our enhancement package are available
48
+ const [hasCore, hasEnhancer] = await Promise.all([
49
+ hasOpenTUI(),
50
+ hasOpenTUILogHandler()
51
+ ]);
52
+
53
+ if (!hasCore || !hasEnhancer) {
54
+ return false;
55
+ }
56
+
57
+ // Dynamically import and apply enhancement
58
+ // @ts-expect-error - Optional dependency, may not be installed
59
+ const { enhanceLoggerWithOpenTUI } = await import('@mks2508/better-logger-nodejs-opentui');
60
+
61
+ const enhanced = await enhanceLoggerWithOpenTUI(logger, {
62
+ renderer: {
63
+ animated: true,
64
+ theme: 'auto',
65
+ components: {
66
+ badges: true,
67
+ progressBars: false,
68
+ tables: false,
69
+ charts: false
70
+ }
71
+ }
72
+ });
73
+
74
+ return enhanced;
75
+ } catch (error) {
76
+ console.warn('Failed to enhance logger with OpenTUI:', error);
77
+ return false;
78
+ }
79
+ }
80
+
81
+ /**
82
+ * Get OpenTUI environment information
83
+ */
84
+ export async function getOpenTUIInfo(): Promise<{
85
+ available: boolean;
86
+ coreAvailable: boolean;
87
+ handlerAvailable: boolean;
88
+ nodeVersion: string | null;
89
+ terminalSupport: boolean;
90
+ }> {
91
+ const [coreAvailable, handlerAvailable] = await Promise.all([
92
+ hasOpenTUI(),
93
+ hasOpenTUILogHandler()
94
+ ]);
95
+
96
+ return {
97
+ available: coreAvailable && handlerAvailable,
98
+ coreAvailable,
99
+ handlerAvailable,
100
+ nodeVersion: isNode ? process.version : null,
101
+ terminalSupport: isNode ? process.stdout?.isTTY === true : false
102
+ };
103
+ }
104
+
105
+ /**
106
+ * Auto-enhance logger with best available rendering
107
+ */
108
+ export async function autoEnhanceLogger(logger: any): Promise<{
109
+ enhanced: boolean;
110
+ method: 'opentui' | 'ansi' | 'plain';
111
+ info?: any;
112
+ }> {
113
+ // Try OpenTUI first
114
+ const openTUIEnhanced = await tryEnhanceWithOpenTUI(logger);
115
+ if (openTUIEnhanced) {
116
+ return {
117
+ enhanced: true,
118
+ method: 'opentui',
119
+ info: await getOpenTUIInfo()
120
+ };
121
+ }
122
+
123
+ // Fallback to ANSI colors if in Node.js
124
+ if (isNode && process.stdout?.isTTY) {
125
+ return {
126
+ enhanced: false,
127
+ method: 'ansi',
128
+ info: { reason: 'OpenTUI not available, using ANSI colors' }
129
+ };
130
+ }
131
+
132
+ // Plain text fallback
133
+ return {
134
+ enhanced: false,
135
+ method: 'plain',
136
+ info: { reason: 'No enhanced rendering available' }
137
+ };
138
+ }
@@ -2,9 +2,10 @@
2
2
  * @fileoverview Styled output creation utilities for Advanced Logger
3
3
  */
4
4
 
5
- import type { LogLevel, StackInfo } from '../types/index.js';
5
+ import type { LogLevel, StackInfo, DevToolsTheme, AdaptiveColors } from '../types/index.js';
6
6
  import { formatTimestamp } from './timestamps.js';
7
7
  import { StyleBuilder } from '../styling/index.js';
8
+ import { ADAPTIVE_COLORS } from '../constants.js';
8
9
 
9
10
  /**
10
11
  * Style configuration for each log level
@@ -18,6 +19,61 @@ export interface LevelStyleConfig {
18
19
  shadow: string;
19
20
  }
20
21
 
22
+ /**
23
+ * Detects the current DevTools theme preference
24
+ */
25
+ export function detectDevToolsTheme(): DevToolsTheme {
26
+ try {
27
+ if (typeof window === 'undefined' || !window.matchMedia) {
28
+ return 'light'; // Safe fallback for SSR or older browsers
29
+ }
30
+
31
+ const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
32
+ return mediaQuery.matches ? 'dark' : 'light';
33
+ } catch (error) {
34
+ console.warn('Failed to detect DevTools theme:', error);
35
+ return 'light'; // Fallback to light theme
36
+ }
37
+ }
38
+
39
+ /**
40
+ * Gets adaptive color based on current DevTools theme
41
+ */
42
+ export function getAdaptiveColor(colors: AdaptiveColors, theme?: DevToolsTheme): string {
43
+ const currentTheme = theme ?? detectDevToolsTheme();
44
+ return colors[currentTheme];
45
+ }
46
+
47
+ /**
48
+ * Sets up theme change listener for dynamic updates
49
+ */
50
+ export function setupThemeChangeListener(callback: (theme: DevToolsTheme) => void): (() => void) | null {
51
+ try {
52
+ if (typeof window === 'undefined' || !window.matchMedia) {
53
+ return null;
54
+ }
55
+
56
+ const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
57
+ const handler = (e: MediaQueryListEvent) => {
58
+ callback(e.matches ? 'dark' : 'light');
59
+ };
60
+
61
+ // Use newer addEventListener if available, fallback to addListener
62
+ if (mediaQuery.addEventListener) {
63
+ mediaQuery.addEventListener('change', handler);
64
+ return () => mediaQuery.removeEventListener('change', handler);
65
+ } else if (mediaQuery.addListener) {
66
+ mediaQuery.addListener(handler);
67
+ return () => mediaQuery.removeListener?.(handler);
68
+ }
69
+
70
+ return null;
71
+ } catch (error) {
72
+ console.warn('Failed to set up theme change listener:', error);
73
+ return null;
74
+ }
75
+ }
76
+
21
77
 
22
78
  /**
23
79
  * Creates styled console output with multiple %c formatters
@@ -27,14 +83,16 @@ export function createStyledOutput(
27
83
  levelStyles: Record<LogLevel | 'success', LevelStyleConfig>,
28
84
  prefix: string | undefined,
29
85
  message: string,
30
- stackInfo: StackInfo | null
86
+ stackInfo: StackInfo | null,
87
+ autoDetectTheme: boolean = true
31
88
  ): [string, ...string[]] {
32
89
  const levelConfig = levelStyles[level];
33
90
  const timestamp = formatTimestamp();
91
+ const currentTheme = autoDetectTheme ? detectDevToolsTheme() : 'light';
34
92
 
35
- // Base styles
93
+ // Base styles with adaptive colors
36
94
  const timestampStyle = new StyleBuilder()
37
- .color('#666')
95
+ .color(getAdaptiveColor(ADAPTIVE_COLORS.timestamp, currentTheme))
38
96
  .size('11px')
39
97
  .font('Monaco, Consolas, monospace')
40
98
  .build();
@@ -52,8 +110,8 @@ export function createStyledOutput(
52
110
  .build();
53
111
 
54
112
  const prefixStyle = new StyleBuilder()
55
- .bg('#2d3748')
56
- .color('#e2e8f0')
113
+ .bg(getAdaptiveColor(ADAPTIVE_COLORS.prefixBackground, currentTheme))
114
+ .color(getAdaptiveColor(ADAPTIVE_COLORS.prefix, currentTheme))
57
115
  .padding('2px 6px')
58
116
  .rounded('3px')
59
117
  .bold()
@@ -62,13 +120,13 @@ export function createStyledOutput(
62
120
  .build();
63
121
 
64
122
  const messageStyle = new StyleBuilder()
65
- .color('#2d3748')
123
+ .color(getAdaptiveColor(ADAPTIVE_COLORS.messageText, currentTheme))
66
124
  .font('system-ui, -apple-system, sans-serif')
67
125
  .size('14px')
68
126
  .build();
69
127
 
70
128
  const locationStyle = new StyleBuilder()
71
- .color('#718096')
129
+ .color(getAdaptiveColor(ADAPTIVE_COLORS.location, currentTheme))
72
130
  .size('11px')
73
131
  .font('Monaco, Consolas, monospace')
74
132
  .build();
@@ -0,0 +1,237 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Core Logger Browser Test</title>
7
+ <style>
8
+ body {
9
+ font-family: system-ui, sans-serif;
10
+ max-width: 800px;
11
+ margin: 0 auto;
12
+ padding: 20px;
13
+ background-color: #f5f5f5;
14
+ }
15
+ .test-section {
16
+ background: white;
17
+ margin: 20px 0;
18
+ padding: 20px;
19
+ border-radius: 8px;
20
+ box-shadow: 0 2px 4px rgba(0,0,0,0.1);
21
+ }
22
+ button {
23
+ background: #007bff;
24
+ color: white;
25
+ border: none;
26
+ padding: 10px 20px;
27
+ margin: 5px;
28
+ border-radius: 4px;
29
+ cursor: pointer;
30
+ }
31
+ button:hover { background: #0056b3; }
32
+ .console-note {
33
+ background: #e9ecef;
34
+ padding: 10px;
35
+ border-left: 4px solid #007bff;
36
+ margin: 10px 0;
37
+ }
38
+ .success { color: #28a745; font-weight: bold; }
39
+ .error { color: #dc3545; font-weight: bold; }
40
+ </style>
41
+ </head>
42
+ <body>
43
+ <h1>🧪 Core Logger Browser Test</h1>
44
+
45
+ <div class="console-note">
46
+ <strong>📋 Instructions:</strong> Open your browser's Developer Console (F12) to see the log output.
47
+ All tests will show styled output in browser console with CSS formatting.
48
+ </div>
49
+
50
+ <div class="test-section">
51
+ <h2>Environment Detection</h2>
52
+ <button onclick="testEnvironment()">Test Environment Detection</button>
53
+ <div id="env-info"></div>
54
+ </div>
55
+
56
+ <div class="test-section">
57
+ <h2>Basic Logging</h2>
58
+ <button onclick="testBasicLogging()">Test Basic Levels</button>
59
+ <p>Check console for styled output with gradients and colors.</p>
60
+ </div>
61
+
62
+ <div class="test-section">
63
+ <h2>Scoped Logger</h2>
64
+ <button onclick="testScopedLogger()">Test Scoped Logging</button>
65
+ <p>Should show prefixed messages in console.</p>
66
+ </div>
67
+
68
+ <div class="test-section">
69
+ <h2>Advanced Features</h2>
70
+ <button onclick="testAdvancedFeatures()">Test Tables & Groups</button>
71
+ <p>Should use native browser console.table() and grouping.</p>
72
+ </div>
73
+
74
+ <div class="test-section">
75
+ <h2>Performance Timers</h2>
76
+ <button onclick="testTimers()">Test Timers</button>
77
+ <p>Should measure and log execution time.</p>
78
+ </div>
79
+
80
+ <div class="test-section">
81
+ <h2>Custom Handlers</h2>
82
+ <button onclick="testHandlers()">Test Custom Handler</button>
83
+ <p>Should trigger custom handler alongside console output.</p>
84
+ </div>
85
+
86
+ <div class="test-section">
87
+ <h2>Results</h2>
88
+ <div id="results"></div>
89
+ </div>
90
+
91
+ <script type="module">
92
+ // Import the core logger
93
+ import logger from './packages/core/dist/index.js';
94
+
95
+ // Make logger available globally for tests
96
+ window.logger = logger;
97
+ window.testResults = [];
98
+
99
+ // Test functions
100
+ window.testEnvironment = function() {
101
+ console.log('=== Environment Detection Test ===');
102
+
103
+ const info = {
104
+ userAgent: navigator.userAgent,
105
+ platform: navigator.platform,
106
+ language: navigator.language,
107
+ cookiesEnabled: navigator.cookieEnabled,
108
+ onLine: navigator.onLine,
109
+ colorScheme: window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'
110
+ };
111
+
112
+ logger.info('Browser environment detected');
113
+ logger.info('User Agent: ' + info.userAgent);
114
+ logger.info('Platform: ' + info.platform);
115
+ logger.info('Color Scheme: ' + info.colorScheme);
116
+
117
+ document.getElementById('env-info').innerHTML = `
118
+ <p><strong>Platform:</strong> ${info.platform}</p>
119
+ <p><strong>Color Scheme:</strong> ${info.colorScheme}</p>
120
+ <p class="success">✅ Environment detection working</p>
121
+ `;
122
+
123
+ window.testResults.push('Environment: ✅ Passed');
124
+ updateResults();
125
+ };
126
+
127
+ window.testBasicLogging = function() {
128
+ console.log('=== Basic Logging Test ===');
129
+
130
+ logger.debug('Debug message - should be styled with gray gradient');
131
+ logger.info('Info message - should be styled with blue gradient');
132
+ logger.warn('Warning message - should be styled with yellow gradient');
133
+ logger.error('Error message - should be styled with red gradient');
134
+ logger.critical('Critical message - should be styled with dark red gradient');
135
+
136
+ console.log('Check above for styled console output with gradients and colors');
137
+ window.testResults.push('Basic Logging: ✅ Passed');
138
+ updateResults();
139
+ };
140
+
141
+ window.testScopedLogger = function() {
142
+ console.log('=== Scoped Logger Test ===');
143
+
144
+ const apiLogger = logger.scope('API');
145
+ const dbLogger = logger.scope('DATABASE');
146
+
147
+ apiLogger.info('API request started');
148
+ apiLogger.warn('API rate limit warning');
149
+ apiLogger.error('API request failed');
150
+
151
+ dbLogger.info('Database connection established');
152
+ dbLogger.warn('Slow query detected');
153
+
154
+ window.testResults.push('Scoped Logging: ✅ Passed');
155
+ updateResults();
156
+ };
157
+
158
+ window.testAdvancedFeatures = function() {
159
+ console.log('=== Advanced Features Test ===');
160
+
161
+ // Test table
162
+ const sampleData = [
163
+ { name: 'Alice', age: 25, role: 'Developer' },
164
+ { name: 'Bob', age: 30, role: 'Designer' },
165
+ { name: 'Carol', age: 28, role: 'Manager' }
166
+ ];
167
+
168
+ logger.table(sampleData);
169
+
170
+ // Test groups
171
+ logger.group('Database Operations');
172
+ logger.info('Connecting to database');
173
+ logger.info('Executing complex query');
174
+ logger.group('Transaction Details', true); // collapsed
175
+ logger.info('Transaction started');
176
+ logger.info('Updating records');
177
+ logger.groupEnd();
178
+ logger.info('Transaction completed');
179
+ logger.groupEnd();
180
+
181
+ window.testResults.push('Advanced Features: ✅ Passed');
182
+ updateResults();
183
+ };
184
+
185
+ window.testTimers = function() {
186
+ console.log('=== Performance Timers Test ===');
187
+
188
+ logger.time('operation-1');
189
+ logger.time('operation-2');
190
+
191
+ setTimeout(() => {
192
+ logger.timeEnd('operation-1');
193
+
194
+ setTimeout(() => {
195
+ logger.timeEnd('operation-2');
196
+ window.testResults.push('Timers: ✅ Passed');
197
+ updateResults();
198
+ }, 150);
199
+ }, 100);
200
+ };
201
+
202
+ window.testHandlers = function() {
203
+ console.log('=== Custom Handlers Test ===');
204
+
205
+ let handlerCalled = false;
206
+ const testHandler = {
207
+ handle: (level, message, args, metadata) => {
208
+ console.log('🔧 Custom handler received:', { level, message, timestamp: metadata.timestamp });
209
+ handlerCalled = true;
210
+ }
211
+ };
212
+
213
+ logger.addHandler(testHandler);
214
+ logger.info('This message should trigger the custom handler');
215
+
216
+ setTimeout(() => {
217
+ if (handlerCalled) {
218
+ window.testResults.push('Custom Handlers: ✅ Passed');
219
+ } else {
220
+ window.testResults.push('Custom Handlers: ❌ Failed');
221
+ }
222
+ updateResults();
223
+ }, 50);
224
+ };
225
+
226
+ function updateResults() {
227
+ const resultsDiv = document.getElementById('results');
228
+ resultsDiv.innerHTML = '<h3>Test Results:</h3>' +
229
+ window.testResults.map(result => `<p>${result}</p>`).join('');
230
+ }
231
+
232
+ // Auto-run environment test
233
+ console.log('🚀 Core Logger Browser Test Started');
234
+ console.log('📍 Check console output for styled logs with CSS gradients');
235
+ </script>
236
+ </body>
237
+ </html>
@@ -0,0 +1,63 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Test script for core logger in Node.js environment
5
+ */
6
+ console.log('=== Testing Core Logger in Node.js ===\n');
7
+
8
+ // Test ES module import
9
+ import logger from './packages/core/dist/index.js';
10
+
11
+ console.log('Environment detection:');
12
+ console.log('- Runtime:', process.versions.node ? 'Node.js' : 'Unknown');
13
+ console.log('- Colors supported:', process.stdout.isTTY);
14
+ console.log('- File system available:', 'Yes (Node.js)');
15
+ console.log();
16
+
17
+ console.log('Testing basic logging:');
18
+ logger.info('Hello from Node.js!');
19
+ logger.warn('This is a warning message');
20
+ logger.error('This is an error message');
21
+ logger.critical('This should work in Node.js (critical level)');
22
+ console.log();
23
+
24
+ console.log('Testing scoped logger:');
25
+ const apiLogger = logger.scope('API');
26
+ apiLogger.info('API request started');
27
+ apiLogger.error('API request failed');
28
+ console.log();
29
+
30
+ console.log('Testing timers:');
31
+ logger.time('test-operation');
32
+ setTimeout(() => {
33
+ logger.timeEnd('test-operation');
34
+ console.log();
35
+
36
+ console.log('Testing table (Node.js plain text):');
37
+ const data = [
38
+ { name: 'Alice', age: 25, role: 'Developer' },
39
+ { name: 'Bob', age: 30, role: 'Designer' },
40
+ { name: 'Carol', age: 28, role: 'Manager' }
41
+ ];
42
+ logger.table(data);
43
+ console.log();
44
+
45
+ console.log('Testing groups:');
46
+ logger.group('Database Operations');
47
+ logger.info('Connecting to database');
48
+ logger.info('Executing query');
49
+ logger.groupEnd();
50
+ console.log();
51
+
52
+ console.log('Testing custom handler (mock):');
53
+ const mockHandler = {
54
+ handle: (level, message, args, metadata) => {
55
+ console.log(`Custom handler received: [${level.toUpperCase()}] ${message}`);
56
+ }
57
+ };
58
+ logger.addHandler(mockHandler);
59
+ logger.info('This should trigger custom handler');
60
+ console.log();
61
+
62
+ console.log('✅ Node.js tests completed successfully!');
63
+ }, 100);