@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
package/dist/core.js CHANGED
@@ -1,244 +1,317 @@
1
- import { D as DEFAULT_CONFIG, b as formatTimestamp, a as parseStackTrace } from "./chunks/core-2opW4Pi3.js";
2
- import "./chunks/styling-DhUDzwlE.js";
3
- class CoreLogger {
4
- config;
5
- scopedPrefix;
6
- handlers = [];
7
- timers = /* @__PURE__ */ new Map();
8
- groupDepth = 0;
9
- /**
10
- * Creates a new CoreLogger instance
11
- * @param config - Optional configuration
12
- */
13
- constructor(config = {}) {
14
- this.config = {
15
- ...DEFAULT_CONFIG,
16
- ...config,
17
- // Force disable advanced features for core module
18
- enableColors: false,
19
- enableTimestamps: config.enableTimestamps ?? true,
20
- enableStackTrace: config.enableStackTrace ?? false
21
- };
22
- }
23
- // ===== CONFIGURATION METHODS =====
24
- /**
25
- * Get current configuration
26
- */
27
- getConfig() {
28
- return { ...this.config };
29
- }
30
- /**
31
- * Sets the global prefix for all log messages
32
- */
33
- setGlobalPrefix(prefix) {
34
- this.config.globalPrefix = prefix;
35
- }
36
- /**
37
- * Sets the verbosity level for filtering log output
38
- */
39
- setVerbosity(level) {
40
- this.config.verbosity = level;
41
- }
42
- /**
43
- * Creates a scoped logger with a specific prefix
44
- */
45
- createScopedLogger(prefix) {
46
- const scopedLogger = new CoreLogger(this.config);
47
- scopedLogger.scopedPrefix = prefix;
48
- scopedLogger.handlers = [...this.handlers];
49
- return scopedLogger;
50
- }
51
- /**
52
- * Adds a custom log handler for extensibility
53
- */
54
- addHandler(handler) {
55
- this.handlers.push(handler);
56
- }
57
- // ===== CORE LOGGING METHODS =====
58
- /**
59
- * Checks if a log level should be output based on current verbosity
60
- */
61
- shouldLog(level) {
62
- if (this.config.verbosity === "silent") return false;
63
- const levels = { debug: 0, info: 1, warn: 2, error: 3, critical: 4 };
64
- return levels[level] >= levels[this.config.verbosity];
65
- }
66
- /**
67
- * Gets the effective prefix (global + scoped)
68
- */
69
- getEffectivePrefix() {
70
- const parts = [this.config.globalPrefix, this.scopedPrefix].filter(Boolean);
71
- return parts.length > 0 ? parts.join(":") : void 0;
72
- }
73
- /**
74
- * Core logging method with minimal formatting
75
- */
76
- log(level, ...args) {
77
- if (!this.shouldLog(level)) return;
78
- const prefix = this.getEffectivePrefix();
79
- const timestamp = this.config.enableTimestamps ? formatTimestamp() : null;
80
- const stackInfo = this.config.enableStackTrace ? parseStackTrace() : null;
81
- const parts = [];
82
- if (timestamp) {
83
- parts.push(`[${timestamp.slice(11, 23)}]`);
84
- }
85
- parts.push(`[${level.toUpperCase()}]`);
86
- if (prefix) {
87
- parts.push(`[${prefix}]`);
88
- }
89
- const groupIndent = " ".repeat(this.groupDepth);
90
- const logPrefix = groupIndent + parts.join(" ");
91
- console.log(logPrefix, ...args);
92
- if (stackInfo && this.config.enableStackTrace) {
93
- console.log(` at ${stackInfo.file}:${stackInfo.line}:${stackInfo.column}`);
94
- }
95
- const metadata = {
96
- timestamp: timestamp || formatTimestamp(),
97
- level,
98
- prefix,
99
- stackInfo: stackInfo || void 0
100
- };
101
- this.handlers.forEach((handler) => {
102
- try {
103
- handler.handle(level, String(args[0] || ""), args, metadata);
104
- } catch (error2) {
105
- console.error("Log handler failed:", error2);
106
- }
107
- });
108
- }
109
- /**
110
- * Logs debug information (lowest priority)
111
- */
112
- debug(...args) {
113
- this.log("debug", ...args);
114
- }
115
- /**
116
- * Logs informational messages
117
- */
118
- info(...args) {
119
- this.log("info", ...args);
120
- }
121
- /**
122
- * Logs warning messages
123
- */
124
- warn(...args) {
125
- this.log("warn", ...args);
126
- }
127
- /**
128
- * Logs error messages
129
- */
130
- error(...args) {
131
- this.log("error", ...args);
132
- }
133
- /**
134
- * Logs critical errors (highest priority)
135
- */
136
- critical(...args) {
137
- this.log("critical", ...args);
138
- }
139
- /**
140
- * Logs trace information (detailed debugging)
141
- */
142
- trace(...args) {
143
- this.log("debug", ...args);
144
- if (this.shouldLog("debug")) {
145
- console.trace(...args);
146
- }
147
- }
148
- // ===== BASIC ADVANCED FEATURES =====
149
- /**
150
- * Displays data in a table format
151
- */
152
- table(data, columns) {
153
- if (!this.shouldLog("info")) return;
154
- const prefix = this.getEffectivePrefix();
155
- console.log(`[TABLE]${prefix ? ` [${prefix}]` : ""}:`);
156
- if (columns) {
157
- console.table(data, columns);
158
- } else {
159
- console.table(data);
160
- }
161
- }
162
- /**
163
- * Starts a collapsible group in the console
164
- */
165
- group(label, collapsed = false) {
166
- const prefix = this.getEffectivePrefix();
167
- const fullLabel = `${prefix ? `[${prefix}] ` : ""}${label}`;
168
- if (collapsed) {
169
- console.groupCollapsed(fullLabel);
170
- } else {
171
- console.group(fullLabel);
172
- }
173
- this.groupDepth++;
174
- }
175
- /**
176
- * Ends the current console group
177
- */
178
- groupEnd() {
179
- if (this.groupDepth > 0) {
180
- console.groupEnd();
181
- this.groupDepth--;
182
- }
183
- }
184
- /**
185
- * Starts a timer with the given label
186
- */
187
- time(label) {
188
- const timer = {
189
- label,
190
- startTime: performance.now()
191
- };
192
- this.timers.set(label, timer);
193
- console.log(`[TIMER] Started: ${label}`);
194
- }
195
- /**
196
- * Ends a timer and logs the elapsed time
197
- */
198
- timeEnd(label) {
199
- const timer = this.timers.get(label);
200
- if (!timer) {
201
- this.warn(`Timer '${label}' does not exist`);
202
- return;
203
- }
204
- const elapsed = performance.now() - timer.startTime;
205
- this.timers.delete(label);
206
- console.log(`[TIMER] ${label}: ${elapsed.toFixed(2)}ms`);
207
- }
1
+ /**
2
+ * @fileoverview Core Logger Module - Minimal logging without advanced features
3
+ * @version 0.0.1
4
+ *
5
+ * This module provides the essential logging functionality without visual enhancements,
6
+ * SVG support, or advanced styling. Perfect for lightweight applications or server-side usage.
7
+ */
8
+ // Core utilities
9
+ import { parseStackTrace } from './utils/index.js';
10
+ // Universal formatting and environment detection
11
+ import { createPlainOutput, getConsoleMethod, createLogEntry, formatTablePlain } from './utils/formatting.js';
12
+ import { isBrowser, isNode, supportsCSSColors } from './utils/environment.js';
13
+ import { createStyledOutput } from './utils/output.js';
14
+ // Constants
15
+ import { DEFAULT_CONFIG, LEVEL_STYLES } from './constants.js';
16
+ /**
17
+ * Minimal Logger class with core functionality only
18
+ *
19
+ * @example
20
+ * ```typescript
21
+ * import { CoreLogger } from '@mks2508/better-logger/core';
22
+ *
23
+ * const logger = new CoreLogger();
24
+ * logger.info('Hello world');
25
+ * logger.error('Something went wrong', error);
26
+ * ```
27
+ */
28
+ export class CoreLogger {
29
+ config;
30
+ scopedPrefix;
31
+ handlers = [];
32
+ timers = new Map();
33
+ groupDepth = 0;
34
+ /**
35
+ * Creates a new CoreLogger instance
36
+ * @param config - Optional configuration
37
+ */
38
+ constructor(config = {}) {
39
+ this.config = {
40
+ ...DEFAULT_CONFIG,
41
+ ...config,
42
+ // Auto-configure based on environment
43
+ enableColors: config.enableColors ?? (isBrowser ? true : false),
44
+ enableTimestamps: config.enableTimestamps ?? true,
45
+ enableStackTrace: config.enableStackTrace ?? false,
46
+ autoDetectTheme: config.autoDetectTheme ?? true
47
+ };
48
+ }
49
+ // ===== CONFIGURATION METHODS =====
50
+ /**
51
+ * Get current configuration
52
+ */
53
+ getConfig() {
54
+ return { ...this.config };
55
+ }
56
+ /**
57
+ * Sets the global prefix for all log messages
58
+ */
59
+ setGlobalPrefix(prefix) {
60
+ this.config.globalPrefix = prefix;
61
+ }
62
+ /**
63
+ * Sets the verbosity level for filtering log output
64
+ */
65
+ setVerbosity(level) {
66
+ this.config.verbosity = level;
67
+ }
68
+ /**
69
+ * Creates a scoped logger with a specific prefix
70
+ */
71
+ scope(prefix) {
72
+ const scopedLogger = new CoreLogger(this.config);
73
+ scopedLogger.scopedPrefix = prefix;
74
+ scopedLogger.handlers = [...this.handlers];
75
+ return scopedLogger;
76
+ }
77
+ /**
78
+ * Adds a custom log handler for extensibility
79
+ */
80
+ addHandler(handler) {
81
+ this.handlers.push(handler);
82
+ }
83
+ // ===== CORE LOGGING METHODS =====
84
+ /**
85
+ * Checks if a log level should be output based on current verbosity
86
+ */
87
+ shouldLog(level) {
88
+ if (this.config.verbosity === 'silent')
89
+ return false;
90
+ const levels = { debug: 0, info: 1, warn: 2, error: 3, critical: 4 };
91
+ return levels[level] >= levels[this.config.verbosity];
92
+ }
93
+ /**
94
+ * Gets the effective prefix (global + scoped)
95
+ */
96
+ getEffectivePrefix() {
97
+ const parts = [this.config.globalPrefix, this.scopedPrefix].filter(Boolean);
98
+ return parts.length > 0 ? parts.join(':') : undefined;
99
+ }
100
+ /**
101
+ * Core logging method with universal formatting
102
+ */
103
+ log(level, ...args) {
104
+ if (!this.shouldLog(level))
105
+ return;
106
+ const prefix = this.getEffectivePrefix();
107
+ const message = String(args[0] || '');
108
+ const stackInfo = this.config.enableStackTrace ? parseStackTrace() : null;
109
+ const consoleMethod = getConsoleMethod(level);
110
+ // Choose formatting based on environment and configuration
111
+ if (isBrowser && this.config.enableColors && supportsCSSColors()) {
112
+ // Browser with CSS styling
113
+ try {
114
+ const [format, ...styles] = createStyledOutput(level, LEVEL_STYLES, prefix, message, stackInfo, this.config.autoDetectTheme);
115
+ console[consoleMethod](format, ...styles, ...args.slice(1));
116
+ }
117
+ catch (error) {
118
+ // Fallback to plain text if CSS fails
119
+ const output = createPlainOutput(level, message, prefix, stackInfo);
120
+ console[consoleMethod](output, ...args.slice(1));
121
+ }
122
+ }
123
+ else {
124
+ // Node.js or browser without colors - use plain text
125
+ const groupIndent = ' '.repeat(this.groupDepth);
126
+ const output = groupIndent + createPlainOutput(level, message, prefix, stackInfo);
127
+ console[consoleMethod](output, ...args.slice(1));
128
+ }
129
+ // Call custom handlers with structured metadata
130
+ const logEntry = createLogEntry(level, message, args, prefix, stackInfo);
131
+ const metadata = {
132
+ timestamp: logEntry.timestamp,
133
+ level,
134
+ prefix,
135
+ stackInfo: logEntry.location,
136
+ };
137
+ this.handlers.forEach(handler => {
138
+ try {
139
+ handler.handle(level, message, args, metadata);
140
+ }
141
+ catch (error) {
142
+ console.error('Log handler failed:', error);
143
+ }
144
+ });
145
+ }
146
+ /**
147
+ * Logs debug information (lowest priority)
148
+ */
149
+ debug(...args) {
150
+ this.log('debug', ...args);
151
+ }
152
+ /**
153
+ * Logs informational messages
154
+ */
155
+ info(...args) {
156
+ this.log('info', ...args);
157
+ }
158
+ /**
159
+ * Logs warning messages
160
+ */
161
+ warn(...args) {
162
+ this.log('warn', ...args);
163
+ }
164
+ /**
165
+ * Logs error messages
166
+ */
167
+ error(...args) {
168
+ this.log('error', ...args);
169
+ }
170
+ /**
171
+ * Logs critical errors (highest priority)
172
+ */
173
+ critical(...args) {
174
+ this.log('critical', ...args);
175
+ }
176
+ /**
177
+ * Logs trace information (detailed debugging)
178
+ */
179
+ trace(...args) {
180
+ this.log('debug', ...args);
181
+ if (this.shouldLog('debug')) {
182
+ console.trace(...args);
183
+ }
184
+ }
185
+ // ===== BASIC ADVANCED FEATURES =====
186
+ /**
187
+ * Displays data in a table format
188
+ */
189
+ table(data, columns) {
190
+ if (!this.shouldLog('info'))
191
+ return;
192
+ const prefix = this.getEffectivePrefix();
193
+ const tableHeader = `[TABLE]${prefix ? ` [${prefix}]` : ''}:`;
194
+ if (isBrowser && typeof console.table === 'function') {
195
+ // Browser has native table support
196
+ console.log(tableHeader);
197
+ if (columns) {
198
+ console.table(data, columns);
199
+ }
200
+ else {
201
+ console.table(data);
202
+ }
203
+ }
204
+ else {
205
+ // Node.js or fallback - use plain text formatting
206
+ console.log(tableHeader);
207
+ const tableText = formatTablePlain(data, columns);
208
+ console.log(tableText);
209
+ }
210
+ }
211
+ /**
212
+ * Starts a collapsible group in the console
213
+ */
214
+ group(label, collapsed = false) {
215
+ const prefix = this.getEffectivePrefix();
216
+ const fullLabel = `${prefix ? `[${prefix}] ` : ''}${label}`;
217
+ if (isBrowser && console.group && console.groupCollapsed) {
218
+ // Browser supports native grouping
219
+ if (collapsed) {
220
+ console.groupCollapsed(fullLabel);
221
+ }
222
+ else {
223
+ console.group(fullLabel);
224
+ }
225
+ }
226
+ else {
227
+ // Node.js fallback - just log the group label
228
+ const groupStart = '┌─ ' + fullLabel;
229
+ console.log(groupStart);
230
+ }
231
+ this.groupDepth++;
232
+ }
233
+ /**
234
+ * Ends the current console group
235
+ */
236
+ groupEnd() {
237
+ if (this.groupDepth > 0) {
238
+ if (isBrowser && console.groupEnd) {
239
+ console.groupEnd();
240
+ }
241
+ else {
242
+ // Node.js fallback - log group end
243
+ const groupEnd = '└─ (end group)';
244
+ console.log(groupEnd);
245
+ }
246
+ this.groupDepth--;
247
+ }
248
+ }
249
+ /**
250
+ * Starts a timer with the given label
251
+ */
252
+ time(label) {
253
+ const startTime = this.getPerformanceNow();
254
+ const timer = {
255
+ label,
256
+ startTime,
257
+ };
258
+ this.timers.set(label, timer);
259
+ const prefix = this.getEffectivePrefix();
260
+ const message = `Timer started: ${label}`;
261
+ const output = createPlainOutput('info', message, prefix);
262
+ console.log(output);
263
+ }
264
+ /**
265
+ * Ends a timer and logs the elapsed time
266
+ */
267
+ timeEnd(label) {
268
+ const timer = this.timers.get(label);
269
+ if (!timer) {
270
+ this.warn(`Timer '${label}' does not exist`);
271
+ return;
272
+ }
273
+ const elapsed = this.getPerformanceNow() - timer.startTime;
274
+ this.timers.delete(label);
275
+ const prefix = this.getEffectivePrefix();
276
+ const message = `Timer ended: ${label} - ${elapsed.toFixed(2)}ms`;
277
+ const output = createPlainOutput('info', message, prefix);
278
+ console.log(output);
279
+ }
280
+ /**
281
+ * Gets performance.now() or fallback for older environments
282
+ */
283
+ getPerformanceNow() {
284
+ if (typeof performance !== 'undefined' && performance.now) {
285
+ return performance.now();
286
+ }
287
+ if (isNode && process.hrtime) {
288
+ // Node.js high-resolution time
289
+ const [seconds, nanoseconds] = process.hrtime();
290
+ return seconds * 1000 + nanoseconds / 1000000;
291
+ }
292
+ // Fallback to Date.now()
293
+ return Date.now();
294
+ }
208
295
  }
296
+ // Create and export singleton instance for convenience
209
297
  const coreLogger = new CoreLogger();
210
- const debug = (...args) => coreLogger.debug(...args);
211
- const info = (...args) => coreLogger.info(...args);
212
- const warn = (...args) => coreLogger.warn(...args);
213
- const error = (...args) => coreLogger.error(...args);
214
- const critical = (...args) => coreLogger.critical(...args);
215
- const trace = (...args) => coreLogger.trace(...args);
216
- const table = (data, columns) => coreLogger.table(data, columns);
217
- const group = (label, collapsed) => coreLogger.group(label, collapsed);
218
- const groupEnd = () => coreLogger.groupEnd();
219
- const time = (label) => coreLogger.time(label);
220
- const timeEnd = (label) => coreLogger.timeEnd(label);
221
- const setGlobalPrefix = (prefix) => coreLogger.setGlobalPrefix(prefix);
222
- const createScopedLogger = (prefix) => coreLogger.createScopedLogger(prefix);
223
- const setVerbosity = (level) => coreLogger.setVerbosity(level);
224
- const addHandler = (handler) => coreLogger.addHandler(handler);
225
- export {
226
- CoreLogger,
227
- addHandler,
228
- createScopedLogger,
229
- critical,
230
- debug,
231
- coreLogger as default,
232
- error,
233
- group,
234
- groupEnd,
235
- info,
236
- setGlobalPrefix,
237
- setVerbosity,
238
- table,
239
- time,
240
- timeEnd,
241
- trace,
242
- warn
243
- };
244
- //# sourceMappingURL=core.js.map
298
+ /**
299
+ * Export individual methods for convenience (with proper binding)
300
+ */
301
+ export const debug = (...args) => coreLogger.debug(...args);
302
+ export const info = (...args) => coreLogger.info(...args);
303
+ export const warn = (...args) => coreLogger.warn(...args);
304
+ export const error = (...args) => coreLogger.error(...args);
305
+ export const critical = (...args) => coreLogger.critical(...args);
306
+ export const trace = (...args) => coreLogger.trace(...args);
307
+ export const table = (data, columns) => coreLogger.table(data, columns);
308
+ export const group = (label, collapsed) => coreLogger.group(label, collapsed);
309
+ export const groupEnd = () => coreLogger.groupEnd();
310
+ export const time = (label) => coreLogger.time(label);
311
+ export const timeEnd = (label) => coreLogger.timeEnd(label);
312
+ export const setGlobalPrefix = (prefix) => coreLogger.setGlobalPrefix(prefix);
313
+ export const scope = (prefix) => coreLogger.scope(prefix);
314
+ export const setVerbosity = (level) => coreLogger.setVerbosity(level);
315
+ export const addHandler = (handler) => coreLogger.addHandler(handler);
316
+ // Export the singleton as default
317
+ export default coreLogger;
package/dist/core.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"core.js","sources":["../src/core.ts"],"sourcesContent":["/**\n * @fileoverview Core Logger Module - Minimal logging without advanced features\n * @version 0.0.1\n * \n * This module provides the essential logging functionality without visual enhancements,\n * SVG support, or advanced styling. Perfect for lightweight applications or server-side usage.\n */\n\n// Core types\nimport type {\n LogLevel,\n Verbosity,\n LoggerConfig,\n ILogHandler,\n LogMetadata,\n TimerEntry\n} from './types/index.js';\n\n// Core utilities only\nimport {\n parseStackTrace,\n formatTimestamp\n} from './utils/index.js';\n\n// Minimal constants\nimport { DEFAULT_CONFIG } from './constants.js';\n\n/**\n * Minimal Logger class with core functionality only\n * \n * @example\n * ```typescript\n * import { CoreLogger } from '@mks2508/better-logger/core';\n * \n * const logger = new CoreLogger();\n * logger.info('Hello world');\n * logger.error('Something went wrong', error);\n * ```\n */\nexport class CoreLogger {\n private config: LoggerConfig;\n private scopedPrefix?: string;\n private handlers: ILogHandler[] = [];\n private timers: Map<string, TimerEntry> = new Map();\n private groupDepth: number = 0;\n\n /**\n * Creates a new CoreLogger instance\n * @param config - Optional configuration\n */\n constructor(config: Partial<LoggerConfig> = {}) {\n this.config = {\n ...DEFAULT_CONFIG,\n ...config,\n // Force disable advanced features for core module\n enableColors: false,\n enableTimestamps: config.enableTimestamps ?? true,\n enableStackTrace: config.enableStackTrace ?? false,\n };\n }\n\n // ===== CONFIGURATION METHODS =====\n\n /**\n * Get current configuration\n */\n getConfig(): LoggerConfig {\n return { ...this.config };\n }\n\n /**\n * Sets the global prefix for all log messages\n */\n setGlobalPrefix(prefix: string): void {\n this.config.globalPrefix = prefix;\n }\n\n /**\n * Sets the verbosity level for filtering log output\n */\n setVerbosity(level: Verbosity): void {\n this.config.verbosity = level;\n }\n\n /**\n * Creates a scoped logger with a specific prefix\n */\n createScopedLogger(prefix: string): CoreLogger {\n const scopedLogger = new CoreLogger(this.config);\n scopedLogger.scopedPrefix = prefix;\n scopedLogger.handlers = [...this.handlers];\n return scopedLogger;\n }\n\n /**\n * Adds a custom log handler for extensibility\n */\n addHandler(handler: ILogHandler): void {\n this.handlers.push(handler);\n }\n\n // ===== CORE LOGGING METHODS =====\n\n /**\n * Checks if a log level should be output based on current verbosity\n */\n private shouldLog(level: LogLevel): boolean {\n if (this.config.verbosity === 'silent') return false;\n const levels = { debug: 0, info: 1, warn: 2, error: 3, critical: 4 };\n return levels[level] >= levels[this.config.verbosity];\n }\n\n /**\n * Gets the effective prefix (global + scoped)\n */\n private getEffectivePrefix(): string | undefined {\n const parts = [this.config.globalPrefix, this.scopedPrefix].filter(Boolean);\n return parts.length > 0 ? parts.join(':') : undefined;\n }\n\n /**\n * Core logging method with minimal formatting\n */\n private log(level: LogLevel, ...args: any[]): void {\n if (!this.shouldLog(level)) return;\n\n const prefix = this.getEffectivePrefix();\n const timestamp = this.config.enableTimestamps ? formatTimestamp() : null;\n const stackInfo = this.config.enableStackTrace ? parseStackTrace() : null;\n \n // Simple formatting without CSS styling\n const parts: string[] = [];\n \n if (timestamp) {\n parts.push(`[${timestamp.slice(11, 23)}]`);\n }\n \n parts.push(`[${level.toUpperCase()}]`);\n \n if (prefix) {\n parts.push(`[${prefix}]`);\n }\n\n const groupIndent = ' '.repeat(this.groupDepth);\n const logPrefix = groupIndent + parts.join(' ');\n \n // Output to console with simple formatting\n console.log(logPrefix, ...args);\n \n if (stackInfo && this.config.enableStackTrace) {\n console.log(` at ${stackInfo.file}:${stackInfo.line}:${stackInfo.column}`);\n }\n\n // Call custom handlers\n const metadata: LogMetadata = {\n timestamp: timestamp || formatTimestamp(),\n level,\n prefix,\n stackInfo: stackInfo || undefined,\n };\n\n this.handlers.forEach(handler => {\n try {\n handler.handle(level, String(args[0] || ''), args, metadata);\n } catch (error) {\n console.error('Log handler failed:', error);\n }\n });\n }\n\n /**\n * Logs debug information (lowest priority)\n */\n debug(...args: any[]): void {\n this.log('debug', ...args);\n }\n\n /**\n * Logs informational messages\n */\n info(...args: any[]): void {\n this.log('info', ...args);\n }\n\n /**\n * Logs warning messages\n */\n warn(...args: any[]): void {\n this.log('warn', ...args);\n }\n\n /**\n * Logs error messages\n */\n error(...args: any[]): void {\n this.log('error', ...args);\n }\n\n /**\n * Logs critical errors (highest priority)\n */\n critical(...args: any[]): void {\n this.log('critical', ...args);\n }\n\n /**\n * Logs trace information (detailed debugging)\n */\n trace(...args: any[]): void {\n this.log('debug', ...args);\n if (this.shouldLog('debug')) {\n console.trace(...args);\n }\n }\n\n // ===== BASIC ADVANCED FEATURES =====\n\n /**\n * Displays data in a table format\n */\n table(data: any, columns?: string[]): void {\n if (!this.shouldLog('info')) return;\n\n const prefix = this.getEffectivePrefix();\n console.log(`[TABLE]${prefix ? ` [${prefix}]` : ''}:`);\n \n if (columns) {\n console.table(data, columns);\n } else {\n console.table(data);\n }\n }\n\n /**\n * Starts a collapsible group in the console\n */\n group(label: string, collapsed: boolean = false): void {\n const prefix = this.getEffectivePrefix();\n const fullLabel = `${prefix ? `[${prefix}] ` : ''}${label}`;\n \n if (collapsed) {\n console.groupCollapsed(fullLabel);\n } else {\n console.group(fullLabel);\n }\n \n this.groupDepth++;\n }\n\n /**\n * Ends the current console group\n */\n groupEnd(): void {\n if (this.groupDepth > 0) {\n console.groupEnd();\n this.groupDepth--;\n }\n }\n\n /**\n * Starts a timer with the given label\n */\n time(label: string): void {\n const timer: TimerEntry = {\n label,\n startTime: performance.now(),\n };\n this.timers.set(label, timer);\n console.log(`[TIMER] Started: ${label}`);\n }\n\n /**\n * Ends a timer and logs the elapsed time\n */\n timeEnd(label: string): void {\n const timer = this.timers.get(label);\n if (!timer) {\n this.warn(`Timer '${label}' does not exist`);\n return;\n }\n\n const elapsed = performance.now() - timer.startTime;\n this.timers.delete(label);\n console.log(`[TIMER] ${label}: ${elapsed.toFixed(2)}ms`);\n }\n}\n\n// Create and export singleton instance for convenience\nconst coreLogger = new CoreLogger();\n\n/**\n * Export individual methods for convenience (with proper binding)\n */\nexport const debug = (...args: any[]) => coreLogger.debug(...args);\nexport const info = (...args: any[]) => coreLogger.info(...args);\nexport const warn = (...args: any[]) => coreLogger.warn(...args);\nexport const error = (...args: any[]) => coreLogger.error(...args);\nexport const critical = (...args: any[]) => coreLogger.critical(...args);\nexport const trace = (...args: any[]) => coreLogger.trace(...args);\nexport const table = (data: any, columns?: string[]) => coreLogger.table(data, columns);\nexport const group = (label: string, collapsed?: boolean) => coreLogger.group(label, collapsed);\nexport const groupEnd = () => coreLogger.groupEnd();\nexport const time = (label: string) => coreLogger.time(label);\nexport const timeEnd = (label: string) => coreLogger.timeEnd(label);\nexport const setGlobalPrefix = (prefix: string) => coreLogger.setGlobalPrefix(prefix);\nexport const createScopedLogger = (prefix: string) => coreLogger.createScopedLogger(prefix);\nexport const setVerbosity = (level: Verbosity) => coreLogger.setVerbosity(level);\nexport const addHandler = (handler: ILogHandler) => coreLogger.addHandler(handler);\n\n// Export the singleton as default\nexport default coreLogger;\n\n// Re-export core types\nexport type {\n LogLevel,\n Verbosity,\n LoggerConfig,\n ILogHandler,\n LogMetadata\n} from './types/index.js';"],"names":["error"],"mappings":"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"}
1
+ {"version":3,"file":"core.js","sources":["../src/core.ts"],"sourcesContent":["/**\n * @fileoverview Core Logger Module - Minimal logging without advanced features\n * @version 0.0.1\n * \n * This module provides the essential logging functionality without visual enhancements,\n * SVG support, or advanced styling. Perfect for lightweight applications or server-side usage.\n */\n\n// Core types\nimport type {\n LogLevel,\n Verbosity,\n LoggerConfig,\n ILogHandler,\n LogMetadata,\n TimerEntry\n} from './types/index.js';\n\n// Core utilities\nimport {\n parseStackTrace,\n formatTimestamp\n} from './utils/index.js';\n\n// Universal formatting and environment detection\nimport {\n createPlainOutput,\n getConsoleMethod,\n createLogEntry,\n formatTablePlain,\n safeSerialize\n} from './utils/formatting.js';\n\nimport {\n isBrowser,\n isNode,\n getRuntimeEnvironment,\n supportsColors,\n supportsCSSColors\n} from './utils/environment.js';\n\nimport { createStyledOutput } from './utils/output.js';\n\n// Constants\nimport { DEFAULT_CONFIG, LEVEL_STYLES } from './constants.js';\n\n/**\n * Minimal Logger class with core functionality only\n * \n * @example\n * ```typescript\n * import { CoreLogger } from '@mks2508/better-logger/core';\n * \n * const logger = new CoreLogger();\n * logger.info('Hello world');\n * logger.error('Something went wrong', error);\n * ```\n */\nexport class CoreLogger {\n private config: LoggerConfig;\n private scopedPrefix?: string;\n private handlers: ILogHandler[] = [];\n private timers: Map<string, TimerEntry> = new Map();\n private groupDepth: number = 0;\n\n /**\n * Creates a new CoreLogger instance\n * @param config - Optional configuration\n */\n constructor(config: Partial<LoggerConfig> = {}) {\n this.config = {\n ...DEFAULT_CONFIG,\n ...config,\n // Auto-configure based on environment\n enableColors: config.enableColors ?? (isBrowser ? true : false),\n enableTimestamps: config.enableTimestamps ?? true,\n enableStackTrace: config.enableStackTrace ?? false,\n autoDetectTheme: config.autoDetectTheme ?? true\n };\n }\n\n // ===== CONFIGURATION METHODS =====\n\n /**\n * Get current configuration\n */\n getConfig(): LoggerConfig {\n return { ...this.config };\n }\n\n /**\n * Sets the global prefix for all log messages\n */\n setGlobalPrefix(prefix: string): void {\n this.config.globalPrefix = prefix;\n }\n\n /**\n * Sets the verbosity level for filtering log output\n */\n setVerbosity(level: Verbosity): void {\n this.config.verbosity = level;\n }\n\n /**\n * Creates a scoped logger with a specific prefix\n */\n scope(prefix: string): CoreLogger {\n const scopedLogger = new CoreLogger(this.config);\n scopedLogger.scopedPrefix = prefix;\n scopedLogger.handlers = [...this.handlers];\n return scopedLogger;\n }\n\n /**\n * Adds a custom log handler for extensibility\n */\n addHandler(handler: ILogHandler): void {\n this.handlers.push(handler);\n }\n\n // ===== CORE LOGGING METHODS =====\n\n /**\n * Checks if a log level should be output based on current verbosity\n */\n private shouldLog(level: LogLevel): boolean {\n if (this.config.verbosity === 'silent') return false;\n const levels = { debug: 0, info: 1, warn: 2, error: 3, critical: 4 };\n return levels[level] >= levels[this.config.verbosity];\n }\n\n /**\n * Gets the effective prefix (global + scoped)\n */\n private getEffectivePrefix(): string | undefined {\n const parts = [this.config.globalPrefix, this.scopedPrefix].filter(Boolean);\n return parts.length > 0 ? parts.join(':') : undefined;\n }\n\n /**\n * Core logging method with universal formatting\n */\n private log(level: LogLevel, ...args: any[]): void {\n if (!this.shouldLog(level)) return;\n\n const prefix = this.getEffectivePrefix();\n const message = String(args[0] || '');\n const stackInfo = this.config.enableStackTrace ? parseStackTrace() : null;\n const consoleMethod = getConsoleMethod(level);\n \n // Choose formatting based on environment and configuration\n if (isBrowser && this.config.enableColors && supportsCSSColors()) {\n // Browser with CSS styling\n try {\n const [format, ...styles] = createStyledOutput(\n level,\n LEVEL_STYLES,\n prefix,\n message,\n stackInfo,\n this.config.autoDetectTheme\n );\n console[consoleMethod](format, ...styles, ...args.slice(1));\n } catch (error) {\n // Fallback to plain text if CSS fails\n const output = createPlainOutput(level, message, prefix, stackInfo);\n console[consoleMethod](output, ...args.slice(1));\n }\n } else {\n // Node.js or browser without colors - use plain text\n const groupIndent = ' '.repeat(this.groupDepth);\n const output = groupIndent + createPlainOutput(level, message, prefix, stackInfo);\n console[consoleMethod](output, ...args.slice(1));\n }\n\n // Call custom handlers with structured metadata\n const logEntry = createLogEntry(level, message, args, prefix, stackInfo);\n const metadata: LogMetadata = {\n timestamp: logEntry.timestamp,\n level,\n prefix,\n stackInfo: logEntry.location,\n };\n\n this.handlers.forEach(handler => {\n try {\n handler.handle(level, message, args, metadata);\n } catch (error) {\n console.error('Log handler failed:', error);\n }\n });\n }\n\n /**\n * Logs debug information (lowest priority)\n */\n debug(...args: any[]): void {\n this.log('debug', ...args);\n }\n\n /**\n * Logs informational messages\n */\n info(...args: any[]): void {\n this.log('info', ...args);\n }\n\n /**\n * Logs warning messages\n */\n warn(...args: any[]): void {\n this.log('warn', ...args);\n }\n\n /**\n * Logs error messages\n */\n error(...args: any[]): void {\n this.log('error', ...args);\n }\n\n /**\n * Logs critical errors (highest priority)\n */\n critical(...args: any[]): void {\n this.log('critical', ...args);\n }\n\n /**\n * Logs trace information (detailed debugging)\n */\n trace(...args: any[]): void {\n this.log('debug', ...args);\n if (this.shouldLog('debug')) {\n console.trace(...args);\n }\n }\n\n // ===== BASIC ADVANCED FEATURES =====\n\n /**\n * Displays data in a table format\n */\n table(data: any, columns?: string[]): void {\n if (!this.shouldLog('info')) return;\n\n const prefix = this.getEffectivePrefix();\n const tableHeader = `[TABLE]${prefix ? ` [${prefix}]` : ''}:`;\n \n if (isBrowser && typeof console.table === 'function') {\n // Browser has native table support\n console.log(tableHeader);\n if (columns) {\n console.table(data, columns);\n } else {\n console.table(data);\n }\n } else {\n // Node.js or fallback - use plain text formatting\n console.log(tableHeader);\n const tableText = formatTablePlain(data, columns);\n console.log(tableText);\n }\n }\n\n /**\n * Starts a collapsible group in the console\n */\n group(label: string, collapsed: boolean = false): void {\n const prefix = this.getEffectivePrefix();\n const fullLabel = `${prefix ? `[${prefix}] ` : ''}${label}`;\n \n if (isBrowser && console.group && console.groupCollapsed) {\n // Browser supports native grouping\n if (collapsed) {\n console.groupCollapsed(fullLabel);\n } else {\n console.group(fullLabel);\n }\n } else {\n // Node.js fallback - just log the group label\n const groupStart = '┌─ ' + fullLabel;\n console.log(groupStart);\n }\n \n this.groupDepth++;\n }\n\n /**\n * Ends the current console group\n */\n groupEnd(): void {\n if (this.groupDepth > 0) {\n if (isBrowser && console.groupEnd) {\n console.groupEnd();\n } else {\n // Node.js fallback - log group end\n const groupEnd = '└─ (end group)';\n console.log(groupEnd);\n }\n this.groupDepth--;\n }\n }\n\n /**\n * Starts a timer with the given label\n */\n time(label: string): void {\n const startTime = this.getPerformanceNow();\n const timer: TimerEntry = {\n label,\n startTime,\n };\n this.timers.set(label, timer);\n \n const prefix = this.getEffectivePrefix();\n const message = `Timer started: ${label}`;\n const output = createPlainOutput('info', message, prefix);\n console.log(output);\n }\n\n /**\n * Ends a timer and logs the elapsed time\n */\n timeEnd(label: string): void {\n const timer = this.timers.get(label);\n if (!timer) {\n this.warn(`Timer '${label}' does not exist`);\n return;\n }\n\n const elapsed = this.getPerformanceNow() - timer.startTime;\n this.timers.delete(label);\n \n const prefix = this.getEffectivePrefix();\n const message = `Timer ended: ${label} - ${elapsed.toFixed(2)}ms`;\n const output = createPlainOutput('info', message, prefix);\n console.log(output);\n }\n\n /**\n * Gets performance.now() or fallback for older environments\n */\n private getPerformanceNow(): number {\n if (typeof performance !== 'undefined' && performance.now) {\n return performance.now();\n }\n \n if (isNode && process.hrtime) {\n // Node.js high-resolution time\n const [seconds, nanoseconds] = process.hrtime();\n return seconds * 1000 + nanoseconds / 1000000;\n }\n \n // Fallback to Date.now()\n return Date.now();\n }\n}\n\n// Create and export singleton instance for convenience\nconst coreLogger = new CoreLogger();\n\n/**\n * Export individual methods for convenience (with proper binding)\n */\nexport const debug = (...args: any[]) => coreLogger.debug(...args);\nexport const info = (...args: any[]) => coreLogger.info(...args);\nexport const warn = (...args: any[]) => coreLogger.warn(...args);\nexport const error = (...args: any[]) => coreLogger.error(...args);\nexport const critical = (...args: any[]) => coreLogger.critical(...args);\nexport const trace = (...args: any[]) => coreLogger.trace(...args);\nexport const table = (data: any, columns?: string[]) => coreLogger.table(data, columns);\nexport const group = (label: string, collapsed?: boolean) => coreLogger.group(label, collapsed);\nexport const groupEnd = () => coreLogger.groupEnd();\nexport const time = (label: string) => coreLogger.time(label);\nexport const timeEnd = (label: string) => coreLogger.timeEnd(label);\nexport const setGlobalPrefix = (prefix: string) => coreLogger.setGlobalPrefix(prefix);\nexport const scope = (prefix: string) => coreLogger.scope(prefix);\nexport const setVerbosity = (level: Verbosity) => coreLogger.setVerbosity(level);\nexport const addHandler = (handler: ILogHandler) => coreLogger.addHandler(handler);\n\n// Export the singleton as default\nexport default coreLogger;\n\n// Re-export core types\nexport type {\n LogLevel,\n Verbosity,\n LoggerConfig,\n ILogHandler,\n LogMetadata\n} from './types/index.js';"],"names":["error","groupEnd"],"mappings":"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"}