@navios/commander-tui 1.0.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 (348) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +275 -0
  3. package/coverage/__tests__/utils/factories.ts.html +1147 -0
  4. package/coverage/__tests__/utils/index.html +131 -0
  5. package/coverage/__tests__/utils/render-utils.tsx.html +202 -0
  6. package/coverage/base.css +224 -0
  7. package/coverage/block-navigation.js +87 -0
  8. package/coverage/clover.xml +959 -0
  9. package/coverage/components/filter/filter_bar.tsx.html +322 -0
  10. package/coverage/components/filter/index.html +116 -0
  11. package/coverage/components/log/index.html +131 -0
  12. package/coverage/components/log/index.ts.html +88 -0
  13. package/coverage/components/log/log_message.tsx.html +391 -0
  14. package/coverage/components/prompt/index.html +116 -0
  15. package/coverage/components/prompt/prompt_renderer.tsx.html +1123 -0
  16. package/coverage/components/screen/index.html +131 -0
  17. package/coverage/components/screen/loading_message.tsx.html +217 -0
  18. package/coverage/components/screen/progress_message.tsx.html +265 -0
  19. package/coverage/components/sidebar/index.html +146 -0
  20. package/coverage/components/sidebar/sidebar.tsx.html +391 -0
  21. package/coverage/components/sidebar/sidebar_item.tsx.html +235 -0
  22. package/coverage/components/sidebar/sidebar_separator.tsx.html +124 -0
  23. package/coverage/context/index.html +131 -0
  24. package/coverage/context/index.ts.html +88 -0
  25. package/coverage/context/logger_context.tsx.html +412 -0
  26. package/coverage/coverage-final.json +55 -0
  27. package/coverage/favicon.png +0 -0
  28. package/coverage/filter/filter_engine.ts.html +424 -0
  29. package/coverage/filter/index.html +116 -0
  30. package/coverage/hooks/index.html +131 -0
  31. package/coverage/hooks/index.ts.html +88 -0
  32. package/coverage/hooks/use_theme.ts.html +121 -0
  33. package/coverage/index.html +356 -0
  34. package/coverage/keyboard/index.html +116 -0
  35. package/coverage/keyboard/keyboard_manager.ts.html +784 -0
  36. package/coverage/prettify.css +1 -0
  37. package/coverage/prettify.js +2 -0
  38. package/coverage/schemas/index.html +161 -0
  39. package/coverage/schemas/index.ts.html +94 -0
  40. package/coverage/schemas/logger-options.ts.html +124 -0
  41. package/coverage/schemas/prompt-options.ts.html +112 -0
  42. package/coverage/schemas/screen-options.ts.html +127 -0
  43. package/coverage/services/index.html +146 -0
  44. package/coverage/services/logger.ts.html +1192 -0
  45. package/coverage/services/prompt.ts.html +568 -0
  46. package/coverage/services/screen.ts.html +1804 -0
  47. package/coverage/sort-arrow-sprite.png +0 -0
  48. package/coverage/sorter.js +210 -0
  49. package/coverage/themes/dark.ts.html +604 -0
  50. package/coverage/themes/high-contrast.ts.html +619 -0
  51. package/coverage/themes/index.html +176 -0
  52. package/coverage/themes/index.ts.html +97 -0
  53. package/coverage/themes/light.ts.html +601 -0
  54. package/coverage/themes/utils.ts.html +334 -0
  55. package/coverage/tokens/index.html +161 -0
  56. package/coverage/tokens/index.ts.html +94 -0
  57. package/coverage/tokens/logger.ts.html +115 -0
  58. package/coverage/tokens/prompt.ts.html +115 -0
  59. package/coverage/tokens/screen.ts.html +115 -0
  60. package/coverage/types/file.types.ts.html +265 -0
  61. package/coverage/types/filter.types.ts.html +238 -0
  62. package/coverage/types/index.html +236 -0
  63. package/coverage/types/index.ts.html +151 -0
  64. package/coverage/types/keyboard.types.ts.html +364 -0
  65. package/coverage/types/log.types.ts.html +268 -0
  66. package/coverage/types/message.types.ts.html +445 -0
  67. package/coverage/types/prompt.types.ts.html +403 -0
  68. package/coverage/types/screen.types.ts.html +451 -0
  69. package/coverage/types/theme.types.ts.html +841 -0
  70. package/coverage/utils/colors/file-colors.ts.html +112 -0
  71. package/coverage/utils/colors/helpers.ts.html +235 -0
  72. package/coverage/utils/colors/index.html +221 -0
  73. package/coverage/utils/colors/index.ts.html +145 -0
  74. package/coverage/utils/colors/log-colors.ts.html +253 -0
  75. package/coverage/utils/colors/progress-colors.ts.html +160 -0
  76. package/coverage/utils/colors/prompt-colors.ts.html +175 -0
  77. package/coverage/utils/colors/sidebar-colors.ts.html +241 -0
  78. package/coverage/utils/colors/table-colors.ts.html +118 -0
  79. package/coverage/utils/filetype.ts.html +277 -0
  80. package/coverage/utils/format.ts.html +241 -0
  81. package/coverage/utils/index.html +161 -0
  82. package/coverage/utils/index.ts.html +118 -0
  83. package/coverage/utils/stdout-printer.ts.html +523 -0
  84. package/dist/src/components/file/file_log.d.ts +35 -0
  85. package/dist/src/components/file/file_log.d.ts.map +1 -0
  86. package/dist/src/components/file/index.d.ts +2 -0
  87. package/dist/src/components/file/index.d.ts.map +1 -0
  88. package/dist/src/components/filter/filter_bar.d.ts +10 -0
  89. package/dist/src/components/filter/filter_bar.d.ts.map +1 -0
  90. package/dist/src/components/filter/index.d.ts +2 -0
  91. package/dist/src/components/filter/index.d.ts.map +1 -0
  92. package/dist/src/components/help/help_overlay.d.ts +10 -0
  93. package/dist/src/components/help/help_overlay.d.ts.map +1 -0
  94. package/dist/src/components/help/index.d.ts +2 -0
  95. package/dist/src/components/help/index.d.ts.map +1 -0
  96. package/dist/src/components/index.d.ts +27 -0
  97. package/dist/src/components/index.d.ts.map +1 -0
  98. package/dist/src/components/log/debug_log.d.ts +3 -0
  99. package/dist/src/components/log/debug_log.d.ts.map +1 -0
  100. package/dist/src/components/log/error_log.d.ts +3 -0
  101. package/dist/src/components/log/error_log.d.ts.map +1 -0
  102. package/dist/src/components/log/fatal_log.d.ts +3 -0
  103. package/dist/src/components/log/fatal_log.d.ts.map +1 -0
  104. package/dist/src/components/log/index.d.ts +9 -0
  105. package/dist/src/components/log/index.d.ts.map +1 -0
  106. package/dist/src/components/log/info_log.d.ts +3 -0
  107. package/dist/src/components/log/info_log.d.ts.map +1 -0
  108. package/dist/src/components/log/log_message.d.ts +33 -0
  109. package/dist/src/components/log/log_message.d.ts.map +1 -0
  110. package/dist/src/components/log/success_log.d.ts +3 -0
  111. package/dist/src/components/log/success_log.d.ts.map +1 -0
  112. package/dist/src/components/log/trace_log.d.ts +3 -0
  113. package/dist/src/components/log/trace_log.d.ts.map +1 -0
  114. package/dist/src/components/log/warning_log.d.ts +3 -0
  115. package/dist/src/components/log/warning_log.d.ts.map +1 -0
  116. package/dist/src/components/prompt/index.d.ts +3 -0
  117. package/dist/src/components/prompt/index.d.ts.map +1 -0
  118. package/dist/src/components/prompt/prompt_renderer.d.ts +6 -0
  119. package/dist/src/components/prompt/prompt_renderer.d.ts.map +1 -0
  120. package/dist/src/components/screen/group_renderer.d.ts +19 -0
  121. package/dist/src/components/screen/group_renderer.d.ts.map +1 -0
  122. package/dist/src/components/screen/index.d.ts +13 -0
  123. package/dist/src/components/screen/index.d.ts.map +1 -0
  124. package/dist/src/components/screen/loading_message.d.ts +6 -0
  125. package/dist/src/components/screen/loading_message.d.ts.map +1 -0
  126. package/dist/src/components/screen/message_renderer.d.ts +8 -0
  127. package/dist/src/components/screen/message_renderer.d.ts.map +1 -0
  128. package/dist/src/components/screen/progress_message.d.ts +8 -0
  129. package/dist/src/components/screen/progress_message.d.ts.map +1 -0
  130. package/dist/src/components/screen/screen_bridge.d.ts +20 -0
  131. package/dist/src/components/screen/screen_bridge.d.ts.map +1 -0
  132. package/dist/src/components/screen/table_message.d.ts +6 -0
  133. package/dist/src/components/screen/table_message.d.ts.map +1 -0
  134. package/dist/src/components/screen_manager_bridge.d.ts +11 -0
  135. package/dist/src/components/screen_manager_bridge.d.ts.map +1 -0
  136. package/dist/src/components/sidebar/index.d.ts +6 -0
  137. package/dist/src/components/sidebar/index.d.ts.map +1 -0
  138. package/dist/src/components/sidebar/sidebar.d.ts +18 -0
  139. package/dist/src/components/sidebar/sidebar.d.ts.map +1 -0
  140. package/dist/src/components/sidebar/sidebar_item.d.ts +14 -0
  141. package/dist/src/components/sidebar/sidebar_item.d.ts.map +1 -0
  142. package/dist/src/components/sidebar/sidebar_separator.d.ts +2 -0
  143. package/dist/src/components/sidebar/sidebar_separator.d.ts.map +1 -0
  144. package/dist/src/context/logger_context.d.ts +60 -0
  145. package/dist/src/context/logger_context.d.ts.map +1 -0
  146. package/dist/src/filter/filter_engine.d.ts +20 -0
  147. package/dist/src/filter/filter_engine.d.ts.map +1 -0
  148. package/dist/src/filter/index.d.ts +4 -0
  149. package/dist/src/filter/index.d.ts.map +1 -0
  150. package/dist/src/hooks/index.d.ts +2 -0
  151. package/dist/src/hooks/index.d.ts.map +1 -0
  152. package/dist/src/hooks/use_theme.d.ts +7 -0
  153. package/dist/src/hooks/use_theme.d.ts.map +1 -0
  154. package/dist/src/index.d.ts +88 -0
  155. package/dist/src/index.d.ts.map +1 -0
  156. package/dist/src/keyboard/create_bindings.d.ts +31 -0
  157. package/dist/src/keyboard/create_bindings.d.ts.map +1 -0
  158. package/dist/src/keyboard/index.d.ts +12 -0
  159. package/dist/src/keyboard/index.d.ts.map +1 -0
  160. package/dist/src/keyboard/keyboard_manager.d.ts +69 -0
  161. package/dist/src/keyboard/keyboard_manager.d.ts.map +1 -0
  162. package/dist/src/services/index.d.ts +5 -0
  163. package/dist/src/services/index.d.ts.map +1 -0
  164. package/dist/src/services/logger.d.ts +61 -0
  165. package/dist/src/services/logger.d.ts.map +1 -0
  166. package/dist/src/services/prompt.d.ts +37 -0
  167. package/dist/src/services/prompt.d.ts.map +1 -0
  168. package/dist/src/services/screen.d.ts +165 -0
  169. package/dist/src/services/screen.d.ts.map +1 -0
  170. package/dist/src/services/screen_manager.d.ts +124 -0
  171. package/dist/src/services/screen_manager.d.ts.map +1 -0
  172. package/dist/src/themes/dark.d.ts +7 -0
  173. package/dist/src/themes/dark.d.ts.map +1 -0
  174. package/dist/src/themes/high-contrast.d.ts +7 -0
  175. package/dist/src/themes/high-contrast.d.ts.map +1 -0
  176. package/dist/src/themes/index.d.ts +18 -0
  177. package/dist/src/themes/index.d.ts.map +1 -0
  178. package/dist/src/themes/light.d.ts +6 -0
  179. package/dist/src/themes/light.d.ts.map +1 -0
  180. package/dist/src/themes/utils.d.ts +22 -0
  181. package/dist/src/themes/utils.d.ts.map +1 -0
  182. package/dist/src/types/file.types.d.ts +40 -0
  183. package/dist/src/types/file.types.d.ts.map +1 -0
  184. package/dist/src/types/filter.types.d.ts +31 -0
  185. package/dist/src/types/filter.types.d.ts.map +1 -0
  186. package/dist/src/types/index.d.ts +81 -0
  187. package/dist/src/types/index.d.ts.map +1 -0
  188. package/dist/src/types/keyboard.types.d.ts +83 -0
  189. package/dist/src/types/keyboard.types.d.ts.map +1 -0
  190. package/dist/src/types/log.types.d.ts +32 -0
  191. package/dist/src/types/log.types.d.ts.map +1 -0
  192. package/dist/src/types/message.types.d.ts +91 -0
  193. package/dist/src/types/message.types.d.ts.map +1 -0
  194. package/dist/src/types/prompt.types.d.ts +89 -0
  195. package/dist/src/types/prompt.types.d.ts.map +1 -0
  196. package/dist/src/types/screen.types.d.ts +85 -0
  197. package/dist/src/types/screen.types.d.ts.map +1 -0
  198. package/dist/src/types/theme.types.d.ts +216 -0
  199. package/dist/src/types/theme.types.d.ts.map +1 -0
  200. package/dist/src/utils/colors/file-colors.d.ts +10 -0
  201. package/dist/src/utils/colors/file-colors.d.ts.map +1 -0
  202. package/dist/src/utils/colors/helpers.d.ts +29 -0
  203. package/dist/src/utils/colors/helpers.d.ts.map +1 -0
  204. package/dist/src/utils/colors/index.d.ts +13 -0
  205. package/dist/src/utils/colors/index.d.ts.map +1 -0
  206. package/dist/src/utils/colors/log-colors.d.ts +15 -0
  207. package/dist/src/utils/colors/log-colors.d.ts.map +1 -0
  208. package/dist/src/utils/colors/progress-colors.d.ts +25 -0
  209. package/dist/src/utils/colors/progress-colors.d.ts.map +1 -0
  210. package/dist/src/utils/colors/prompt-colors.d.ts +22 -0
  211. package/dist/src/utils/colors/prompt-colors.d.ts.map +1 -0
  212. package/dist/src/utils/colors/sidebar-colors.d.ts +50 -0
  213. package/dist/src/utils/colors/sidebar-colors.d.ts.map +1 -0
  214. package/dist/src/utils/colors/table-colors.d.ts +12 -0
  215. package/dist/src/utils/colors/table-colors.d.ts.map +1 -0
  216. package/dist/src/utils/filetype.d.ts +19 -0
  217. package/dist/src/utils/filetype.d.ts.map +1 -0
  218. package/dist/src/utils/format.d.ts +9 -0
  219. package/dist/src/utils/format.d.ts.map +1 -0
  220. package/dist/src/utils/index.d.ts +20 -0
  221. package/dist/src/utils/index.d.ts.map +1 -0
  222. package/dist/src/utils/stdout-printer.d.ts +10 -0
  223. package/dist/src/utils/stdout-printer.d.ts.map +1 -0
  224. package/dist/tsconfig.lib.tsbuildinfo +1 -0
  225. package/dist/tsconfig.tsbuildinfo +1 -0
  226. package/dist/tsdown.config.d.mts +5 -0
  227. package/dist/tsdown.config.d.mts.map +1 -0
  228. package/dist/vitest.config.d.mts +3 -0
  229. package/dist/vitest.config.d.mts.map +1 -0
  230. package/lib/index.cjs +6349 -0
  231. package/lib/index.cjs.map +1 -0
  232. package/lib/index.d.cts +1720 -0
  233. package/lib/index.d.cts.map +1 -0
  234. package/lib/index.d.mts +1720 -0
  235. package/lib/index.d.mts.map +1 -0
  236. package/lib/index.mjs +6264 -0
  237. package/lib/index.mjs.map +1 -0
  238. package/lib/screen_manager_bridge-BpDgVu3e.cjs +3357 -0
  239. package/lib/screen_manager_bridge-BpDgVu3e.cjs.map +1 -0
  240. package/lib/screen_manager_bridge-CkV7637i.cjs +3 -0
  241. package/lib/screen_manager_bridge-DN2J6_k1.mjs +3 -0
  242. package/lib/screen_manager_bridge-Dfg4QUrl.mjs +3034 -0
  243. package/lib/screen_manager_bridge-Dfg4QUrl.mjs.map +1 -0
  244. package/package.json +43 -0
  245. package/project.json +60 -0
  246. package/src/__tests__/components/__snapshots__/filter_bar.spec.tsx.snap +2245 -0
  247. package/src/__tests__/components/__snapshots__/loading_message.spec.tsx.snap +1382 -0
  248. package/src/__tests__/components/__snapshots__/log_message.spec.tsx.snap +3169 -0
  249. package/src/__tests__/components/__snapshots__/progress_message.spec.tsx.snap +1743 -0
  250. package/src/__tests__/components/__snapshots__/prompt_renderer.spec.tsx.snap +3135 -0
  251. package/src/__tests__/components/__snapshots__/sidebar.spec.tsx.snap +2617 -0
  252. package/src/__tests__/components/filter_bar.spec.tsx +190 -0
  253. package/src/__tests__/components/loading_message.spec.tsx +110 -0
  254. package/src/__tests__/components/log_message.spec.tsx +166 -0
  255. package/src/__tests__/components/progress_message.spec.tsx +147 -0
  256. package/src/__tests__/components/prompt_renderer.spec.tsx +274 -0
  257. package/src/__tests__/components/sidebar.spec.tsx +305 -0
  258. package/src/__tests__/filter/filter_engine.spec.ts +325 -0
  259. package/src/__tests__/keyboard/keyboard_manager.spec.ts +557 -0
  260. package/src/__tests__/mocks/scm-mock.ts +5 -0
  261. package/src/__tests__/services/logger.spec.ts +630 -0
  262. package/src/__tests__/services/prompt.spec.ts +411 -0
  263. package/src/__tests__/services/screen.spec.ts +721 -0
  264. package/src/__tests__/setup.ts +43 -0
  265. package/src/__tests__/utils/factories.ts +354 -0
  266. package/src/__tests__/utils/filetype.spec.ts +195 -0
  267. package/src/__tests__/utils/format.spec.ts +178 -0
  268. package/src/__tests__/utils/render-utils.tsx +39 -0
  269. package/src/__tests__/utils/test-container.ts +48 -0
  270. package/src/components/file/file_log.tsx +241 -0
  271. package/src/components/file/index.ts +1 -0
  272. package/src/components/filter/filter_bar.tsx +79 -0
  273. package/src/components/filter/index.ts +1 -0
  274. package/src/components/help/help_overlay.tsx +100 -0
  275. package/src/components/help/index.ts +1 -0
  276. package/src/components/index.ts +15 -0
  277. package/src/components/log/index.ts +1 -0
  278. package/src/components/log/log_message.tsx +102 -0
  279. package/src/components/prompt/index.ts +2 -0
  280. package/src/components/prompt/prompt_renderer.tsx +346 -0
  281. package/src/components/screen/group_renderer.tsx +64 -0
  282. package/src/components/screen/index.ts +6 -0
  283. package/src/components/screen/loading_message.tsx +44 -0
  284. package/src/components/screen/message_renderer.tsx +108 -0
  285. package/src/components/screen/progress_message.tsx +60 -0
  286. package/src/components/screen/screen_bridge.tsx +149 -0
  287. package/src/components/screen/table_message.tsx +57 -0
  288. package/src/components/screen_manager_bridge.tsx +245 -0
  289. package/src/components/sidebar/index.ts +3 -0
  290. package/src/components/sidebar/sidebar.tsx +102 -0
  291. package/src/components/sidebar/sidebar_item.tsx +50 -0
  292. package/src/components/sidebar/sidebar_separator.tsx +13 -0
  293. package/src/context/index.ts +1 -0
  294. package/src/context/logger_context.tsx +109 -0
  295. package/src/factories/index.ts +1 -0
  296. package/src/factories/screen.factory.ts +22 -0
  297. package/src/filter/filter_engine.ts +113 -0
  298. package/src/filter/index.ts +1 -0
  299. package/src/hooks/index.ts +1 -0
  300. package/src/hooks/use_theme.ts +12 -0
  301. package/src/index.ts +64 -0
  302. package/src/keyboard/create_bindings.ts +457 -0
  303. package/src/keyboard/index.ts +2 -0
  304. package/src/keyboard/keyboard_manager.ts +233 -0
  305. package/src/overrides/console.logger.override.ts +61 -0
  306. package/src/overrides/index.ts +1 -0
  307. package/src/schemas/index.ts +3 -0
  308. package/src/schemas/logger-options.ts +13 -0
  309. package/src/schemas/prompt-options.ts +9 -0
  310. package/src/schemas/screen-options.ts +14 -0
  311. package/src/services/index.ts +4 -0
  312. package/src/services/logger.ts +369 -0
  313. package/src/services/prompt.ts +169 -0
  314. package/src/services/screen.ts +590 -0
  315. package/src/services/screen_manager.tsx +390 -0
  316. package/src/themes/dark.ts +173 -0
  317. package/src/themes/high-contrast.ts +178 -0
  318. package/src/themes/index.ts +4 -0
  319. package/src/themes/light.ts +172 -0
  320. package/src/themes/utils.ts +83 -0
  321. package/src/tokens/index.ts +3 -0
  322. package/src/tokens/logger.ts +10 -0
  323. package/src/tokens/prompt.ts +10 -0
  324. package/src/tokens/screen.ts +10 -0
  325. package/src/types/file.types.ts +60 -0
  326. package/src/types/filter.types.ts +51 -0
  327. package/src/types/index.ts +22 -0
  328. package/src/types/keyboard.types.ts +93 -0
  329. package/src/types/log.types.ts +61 -0
  330. package/src/types/message.types.ts +120 -0
  331. package/src/types/prompt.types.ts +106 -0
  332. package/src/types/screen.types.ts +124 -0
  333. package/src/types/theme.types.ts +252 -0
  334. package/src/utils/colors/file-colors.ts +9 -0
  335. package/src/utils/colors/helpers.ts +50 -0
  336. package/src/utils/colors/index.ts +20 -0
  337. package/src/utils/colors/log-colors.ts +56 -0
  338. package/src/utils/colors/progress-colors.ts +25 -0
  339. package/src/utils/colors/prompt-colors.ts +30 -0
  340. package/src/utils/colors/sidebar-colors.ts +52 -0
  341. package/src/utils/colors/table-colors.ts +11 -0
  342. package/src/utils/filetype.ts +64 -0
  343. package/src/utils/format.ts +52 -0
  344. package/src/utils/index.ts +11 -0
  345. package/src/utils/stdout-printer.ts +255 -0
  346. package/tsconfig.json +14 -0
  347. package/tsdown.config.mts +34 -0
  348. package/vitest.config.mts +10 -0
@@ -0,0 +1,630 @@
1
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
2
+ import { TestContainer } from '@navios/core/testing'
3
+
4
+ import { ScreenLoggerInstance } from '../../services/logger.ts'
5
+ import { Screen } from '../../tokens/index.ts'
6
+ import { createMockScreenInstance } from '../utils/factories.ts'
7
+
8
+ import type { MockScreenInstance } from '../utils/factories.ts'
9
+ import type { LogLevel } from '@navios/core'
10
+
11
+ describe('ScreenLoggerInstance', () => {
12
+ let container: TestContainer
13
+ let mockScreen: MockScreenInstance
14
+
15
+ const ALL_LEVELS: LogLevel[] = ['verbose', 'debug', 'log', 'warn', 'error', 'fatal']
16
+
17
+ beforeEach(() => {
18
+ container = new TestContainer()
19
+ mockScreen = createMockScreenInstance()
20
+ container.bind(Screen).toValue(mockScreen)
21
+ })
22
+
23
+ afterEach(async () => {
24
+ await container.dispose()
25
+ })
26
+
27
+ async function createLogger(options: { enabledLevels?: LogLevel[] } = {}) {
28
+ return container.get(ScreenLoggerInstance, {
29
+ screen: 'test',
30
+ enabledLevels: options.enabledLevels ?? ALL_LEVELS,
31
+ })
32
+ }
33
+
34
+ describe('log level methods', () => {
35
+ it('should add verbose message', async () => {
36
+ const logger = await createLogger()
37
+
38
+ logger.verbose('Verbose message')
39
+
40
+ expect(mockScreen.addMessage).toHaveBeenCalledWith(
41
+ expect.objectContaining({
42
+ type: 'log',
43
+ level: 'verbose',
44
+ content: 'Verbose message',
45
+ }),
46
+ )
47
+ })
48
+
49
+ it('should add debug message', async () => {
50
+ const logger = await createLogger()
51
+
52
+ logger.debug('Debug message')
53
+
54
+ expect(mockScreen.addMessage).toHaveBeenCalledWith(
55
+ expect.objectContaining({
56
+ type: 'log',
57
+ level: 'debug',
58
+ content: 'Debug message',
59
+ }),
60
+ )
61
+ })
62
+
63
+ it('should add log message', async () => {
64
+ const logger = await createLogger()
65
+
66
+ logger.log('Log message')
67
+
68
+ expect(mockScreen.addMessage).toHaveBeenCalledWith(
69
+ expect.objectContaining({
70
+ type: 'log',
71
+ level: 'log',
72
+ content: 'Log message',
73
+ }),
74
+ )
75
+ })
76
+
77
+ it('should add warn message', async () => {
78
+ const logger = await createLogger()
79
+
80
+ logger.warn('Warning message')
81
+
82
+ expect(mockScreen.addMessage).toHaveBeenCalledWith(
83
+ expect.objectContaining({
84
+ type: 'log',
85
+ level: 'warn',
86
+ content: 'Warning message',
87
+ }),
88
+ )
89
+ })
90
+
91
+ it('should add error message', async () => {
92
+ const logger = await createLogger()
93
+
94
+ logger.error('Error message')
95
+
96
+ expect(mockScreen.addMessage).toHaveBeenCalledWith(
97
+ expect.objectContaining({
98
+ type: 'log',
99
+ level: 'error',
100
+ content: 'Error message',
101
+ }),
102
+ )
103
+ })
104
+
105
+ it('should add fatal message', async () => {
106
+ const logger = await createLogger()
107
+
108
+ logger.fatal('Fatal message')
109
+
110
+ expect(mockScreen.addMessage).toHaveBeenCalledWith(
111
+ expect.objectContaining({
112
+ type: 'log',
113
+ level: 'fatal',
114
+ content: 'Fatal message',
115
+ }),
116
+ )
117
+ })
118
+
119
+ it('should add success message with success variant', async () => {
120
+ const logger = await createLogger()
121
+
122
+ logger.success('Success message')
123
+
124
+ expect(mockScreen.addMessage).toHaveBeenCalledWith(
125
+ expect.objectContaining({
126
+ type: 'log',
127
+ level: 'log',
128
+ content: 'Success message',
129
+ variant: 'success',
130
+ }),
131
+ )
132
+ })
133
+
134
+ it('should add trace message with trace variant and stack trace', async () => {
135
+ const logger = await createLogger()
136
+
137
+ logger.trace('Trace message')
138
+
139
+ expect(mockScreen.addMessage).toHaveBeenCalledWith(
140
+ expect.objectContaining({
141
+ type: 'log',
142
+ level: 'verbose',
143
+ content: 'Trace message',
144
+ variant: 'trace',
145
+ trace: expect.any(String),
146
+ }),
147
+ )
148
+ })
149
+
150
+ it('should include label when provided', async () => {
151
+ const logger = await createLogger()
152
+
153
+ logger.log('Message', 'CustomLabel')
154
+
155
+ expect(mockScreen.addMessage).toHaveBeenCalledWith(
156
+ expect.objectContaining({
157
+ label: 'CustomLabel',
158
+ }),
159
+ )
160
+ })
161
+
162
+ it('should format objects to string', async () => {
163
+ const logger = await createLogger()
164
+
165
+ logger.log({ foo: 'bar', num: 42 })
166
+
167
+ expect(mockScreen.addMessage).toHaveBeenCalledWith(
168
+ expect.objectContaining({
169
+ content: expect.stringContaining('foo'),
170
+ }),
171
+ )
172
+ })
173
+
174
+ it('should return this for chaining', async () => {
175
+ const logger = await createLogger()
176
+
177
+ const result = logger.log('Message').warn('Warning').error('Error')
178
+
179
+ expect(result).toBe(logger)
180
+ expect(mockScreen.addMessage).toHaveBeenCalledTimes(3)
181
+ })
182
+
183
+ it('should respect enabledLevels filter', async () => {
184
+ const logger = await createLogger({ enabledLevels: ['error', 'fatal'] })
185
+
186
+ logger.log('Should not appear')
187
+ logger.warn('Should not appear')
188
+ logger.error('Should appear')
189
+
190
+ expect(mockScreen.addMessage).toHaveBeenCalledTimes(1)
191
+ expect(mockScreen.addMessage).toHaveBeenCalledWith(
192
+ expect.objectContaining({ level: 'error' }),
193
+ )
194
+ })
195
+ })
196
+
197
+ describe('setLogLevels', () => {
198
+ it('should update enabled levels', async () => {
199
+ const logger = await createLogger({ enabledLevels: ['log'] })
200
+
201
+ logger.error('Should not appear initially')
202
+ expect(mockScreen.addMessage).toHaveBeenCalledTimes(0)
203
+
204
+ logger.setLogLevels(['error'])
205
+ logger.error('Should appear now')
206
+
207
+ expect(mockScreen.addMessage).toHaveBeenCalledTimes(1)
208
+ })
209
+
210
+ it('should return this for chaining', async () => {
211
+ const logger = await createLogger()
212
+
213
+ const result = logger.setLogLevels(['error'])
214
+
215
+ expect(result).toBe(logger)
216
+ })
217
+ })
218
+
219
+ describe('file methods', () => {
220
+ it('should add file message', async () => {
221
+ const logger = await createLogger()
222
+
223
+ logger.file('/path/to/file.ts', 'const x = 1;')
224
+
225
+ expect(mockScreen.addMessage).toHaveBeenCalledWith(
226
+ expect.objectContaining({
227
+ type: 'file',
228
+ filePath: '/path/to/file.ts',
229
+ content: 'const x = 1;',
230
+ }),
231
+ )
232
+ })
233
+
234
+ it('should add diff message', async () => {
235
+ const logger = await createLogger()
236
+
237
+ logger.diff('/path/to/file.ts', '- old\n+ new')
238
+
239
+ expect(mockScreen.addMessage).toHaveBeenCalledWith(
240
+ expect.objectContaining({
241
+ type: 'diff',
242
+ filePath: '/path/to/file.ts',
243
+ diff: '- old\n+ new',
244
+ }),
245
+ )
246
+ })
247
+
248
+ it('should add diff message with view option', async () => {
249
+ const logger = await createLogger()
250
+
251
+ logger.diff('/path/to/file.ts', '- old\n+ new', 'split')
252
+
253
+ expect(mockScreen.addMessage).toHaveBeenCalledWith(
254
+ expect.objectContaining({
255
+ type: 'diff',
256
+ view: 'split',
257
+ }),
258
+ )
259
+ })
260
+
261
+ it('should add fileError message', async () => {
262
+ const logger = await createLogger()
263
+
264
+ logger.fileError('/path/to/file.ts', 'const x = 1;', [1, 3], 1)
265
+
266
+ expect(mockScreen.addMessage).toHaveBeenCalledWith(
267
+ expect.objectContaining({
268
+ type: 'fileError',
269
+ filePath: '/path/to/file.ts',
270
+ content: 'const x = 1;',
271
+ errorLines: [1, 3],
272
+ startLine: 1,
273
+ }),
274
+ )
275
+ })
276
+
277
+ it('should respect debug level for file methods', async () => {
278
+ const logger = await createLogger({ enabledLevels: ['log'] }) // No debug
279
+
280
+ logger.file('/path.ts', 'content')
281
+
282
+ expect(mockScreen.addMessage).not.toHaveBeenCalled()
283
+ })
284
+
285
+ it('should return this for chaining', async () => {
286
+ const logger = await createLogger()
287
+
288
+ const result = logger.file('/path.ts', 'content').diff('/path.ts', 'diff')
289
+
290
+ expect(result).toBe(logger)
291
+ })
292
+ })
293
+
294
+ describe('promise', () => {
295
+ it('should add loading message initially', async () => {
296
+ const logger = await createLogger()
297
+ const testPromise = new Promise((resolve) => setTimeout(() => resolve('done'), 100))
298
+
299
+ logger.promise(testPromise, {
300
+ loading: 'Loading...',
301
+ success: 'Done!',
302
+ error: 'Failed!',
303
+ })
304
+
305
+ expect(mockScreen.addMessage).toHaveBeenCalledWith(
306
+ expect.objectContaining({
307
+ type: 'loading',
308
+ content: 'Loading...',
309
+ status: 'loading',
310
+ }),
311
+ )
312
+ })
313
+
314
+ it('should update to success on resolve', async () => {
315
+ const logger = await createLogger()
316
+ const testPromise = Promise.resolve('result')
317
+
318
+ await logger.promise(testPromise, {
319
+ loading: 'Loading...',
320
+ success: 'Done!',
321
+ error: 'Failed!',
322
+ })
323
+
324
+ expect(mockScreen.updateMessage).toHaveBeenCalledWith(
325
+ expect.any(String),
326
+ expect.objectContaining({
327
+ status: 'success',
328
+ resolvedContent: 'Done!',
329
+ }),
330
+ )
331
+ })
332
+
333
+ it('should update to fail on reject', async () => {
334
+ const logger = await createLogger()
335
+ const testPromise = Promise.reject(new Error('Test error'))
336
+
337
+ await expect(
338
+ logger.promise(testPromise, {
339
+ loading: 'Loading...',
340
+ success: 'Done!',
341
+ error: 'Failed!',
342
+ }),
343
+ ).rejects.toThrow('Test error')
344
+
345
+ expect(mockScreen.updateMessage).toHaveBeenCalledWith(
346
+ expect.any(String),
347
+ expect.objectContaining({
348
+ status: 'fail',
349
+ resolvedContent: 'Failed!',
350
+ }),
351
+ )
352
+ })
353
+
354
+ it('should call success function with result', async () => {
355
+ const logger = await createLogger()
356
+ const testPromise = Promise.resolve({ count: 5 })
357
+ const successFn = vi.fn((data: { count: number }) => `Processed ${data.count} items`)
358
+
359
+ await logger.promise(testPromise, {
360
+ loading: 'Loading...',
361
+ success: successFn,
362
+ error: 'Failed!',
363
+ })
364
+
365
+ expect(successFn).toHaveBeenCalledWith({ count: 5 })
366
+ expect(mockScreen.updateMessage).toHaveBeenCalledWith(
367
+ expect.any(String),
368
+ expect.objectContaining({
369
+ resolvedContent: 'Processed 5 items',
370
+ }),
371
+ )
372
+ })
373
+
374
+ it('should call error function with error', async () => {
375
+ const logger = await createLogger()
376
+ const testPromise = Promise.reject(new Error('Custom error'))
377
+ const errorFn = vi.fn((err: Error) => `Error: ${err.message}`)
378
+
379
+ await expect(
380
+ logger.promise(testPromise, {
381
+ loading: 'Loading...',
382
+ success: 'Done!',
383
+ error: errorFn,
384
+ }),
385
+ ).rejects.toThrow()
386
+
387
+ expect(errorFn).toHaveBeenCalledWith(expect.any(Error))
388
+ expect(mockScreen.updateMessage).toHaveBeenCalledWith(
389
+ expect.any(String),
390
+ expect.objectContaining({
391
+ resolvedContent: 'Error: Custom error',
392
+ }),
393
+ )
394
+ })
395
+ })
396
+
397
+ describe('loading', () => {
398
+ it('should return handle with success and fail methods', async () => {
399
+ const logger = await createLogger()
400
+
401
+ const handle = logger.loading('Loading...')
402
+
403
+ expect(handle).toHaveProperty('success')
404
+ expect(handle).toHaveProperty('fail')
405
+ expect(typeof handle.success).toBe('function')
406
+ expect(typeof handle.fail).toBe('function')
407
+ })
408
+
409
+ it('should add loading message', async () => {
410
+ const logger = await createLogger()
411
+
412
+ logger.loading('Loading...')
413
+
414
+ expect(mockScreen.addMessage).toHaveBeenCalledWith(
415
+ expect.objectContaining({
416
+ type: 'loading',
417
+ content: 'Loading...',
418
+ status: 'loading',
419
+ }),
420
+ )
421
+ })
422
+
423
+ it('should update to success when handle.success called', async () => {
424
+ const logger = await createLogger()
425
+
426
+ const handle = logger.loading('Loading...')
427
+ handle.success('Completed!')
428
+
429
+ expect(mockScreen.updateMessage).toHaveBeenCalledWith(
430
+ expect.any(String),
431
+ expect.objectContaining({
432
+ status: 'success',
433
+ resolvedContent: 'Completed!',
434
+ }),
435
+ )
436
+ })
437
+
438
+ it('should update to fail when handle.fail called', async () => {
439
+ const logger = await createLogger()
440
+
441
+ const handle = logger.loading('Loading...')
442
+ handle.fail('Failed!')
443
+
444
+ expect(mockScreen.updateMessage).toHaveBeenCalledWith(
445
+ expect.any(String),
446
+ expect.objectContaining({
447
+ status: 'fail',
448
+ resolvedContent: 'Failed!',
449
+ }),
450
+ )
451
+ })
452
+ })
453
+
454
+ describe('progress', () => {
455
+ it('should return handle with update, complete, and fail methods', async () => {
456
+ const logger = await createLogger()
457
+
458
+ const handle = logger.progress('Processing', { total: 100 })
459
+
460
+ expect(handle).toHaveProperty('update')
461
+ expect(handle).toHaveProperty('complete')
462
+ expect(handle).toHaveProperty('fail')
463
+ })
464
+
465
+ it('should add progress message', async () => {
466
+ const logger = await createLogger()
467
+
468
+ logger.progress('Processing', { total: 100 })
469
+
470
+ expect(mockScreen.addMessage).toHaveBeenCalledWith(
471
+ expect.objectContaining({
472
+ type: 'progress',
473
+ label: 'Processing',
474
+ current: 0,
475
+ total: 100,
476
+ status: 'active',
477
+ }),
478
+ )
479
+ })
480
+
481
+ it('should update current value when handle.update called', async () => {
482
+ const logger = await createLogger()
483
+
484
+ const handle = logger.progress('Processing', { total: 100 })
485
+ handle.update(50)
486
+
487
+ expect(mockScreen.updateProgressMessage).toHaveBeenCalledWith(
488
+ expect.any(String),
489
+ expect.objectContaining({
490
+ current: 50,
491
+ }),
492
+ )
493
+ })
494
+
495
+ it('should update label when handle.update called with label', async () => {
496
+ const logger = await createLogger()
497
+
498
+ const handle = logger.progress('Processing', { total: 100 })
499
+ handle.update(50, 'New label')
500
+
501
+ expect(mockScreen.updateProgressMessage).toHaveBeenCalledWith(
502
+ expect.any(String),
503
+ expect.objectContaining({
504
+ current: 50,
505
+ label: 'New label',
506
+ }),
507
+ )
508
+ })
509
+
510
+ it('should set status to complete when handle.complete called', async () => {
511
+ const logger = await createLogger()
512
+
513
+ const handle = logger.progress('Processing', { total: 100 })
514
+ handle.complete('Done!')
515
+
516
+ expect(mockScreen.updateProgressMessage).toHaveBeenCalledWith(
517
+ expect.any(String),
518
+ expect.objectContaining({
519
+ current: 100,
520
+ status: 'complete',
521
+ resolvedContent: 'Done!',
522
+ }),
523
+ )
524
+ })
525
+
526
+ it('should set status to failed when handle.fail called', async () => {
527
+ const logger = await createLogger()
528
+
529
+ const handle = logger.progress('Processing', { total: 100 })
530
+ handle.fail('Error occurred')
531
+
532
+ expect(mockScreen.updateProgressMessage).toHaveBeenCalledWith(
533
+ expect.any(String),
534
+ expect.objectContaining({
535
+ status: 'failed',
536
+ resolvedContent: 'Error occurred',
537
+ }),
538
+ )
539
+ })
540
+ })
541
+
542
+ describe('group methods', () => {
543
+ it('should add group start marker', async () => {
544
+ const logger = await createLogger()
545
+
546
+ logger.group('My Group')
547
+
548
+ expect(mockScreen.addMessage).toHaveBeenCalledWith(
549
+ expect.objectContaining({
550
+ type: 'group',
551
+ label: 'My Group',
552
+ collapsed: false,
553
+ isEnd: false,
554
+ }),
555
+ )
556
+ })
557
+
558
+ it('should add group end marker', async () => {
559
+ const logger = await createLogger()
560
+
561
+ logger.groupEnd()
562
+
563
+ expect(mockScreen.addMessage).toHaveBeenCalledWith(
564
+ expect.objectContaining({
565
+ type: 'group',
566
+ isEnd: true,
567
+ }),
568
+ )
569
+ })
570
+
571
+ it('should return this for chaining', async () => {
572
+ const logger = await createLogger()
573
+
574
+ const result = logger.group('Group').log('Inside').groupEnd()
575
+
576
+ expect(result).toBe(logger)
577
+ })
578
+ })
579
+
580
+ describe('table', () => {
581
+ it('should create table message from array of objects', async () => {
582
+ const logger = await createLogger()
583
+
584
+ logger.table([
585
+ { name: 'Alice', age: 30 },
586
+ { name: 'Bob', age: 25 },
587
+ ])
588
+
589
+ expect(mockScreen.addMessage).toHaveBeenCalledWith(
590
+ expect.objectContaining({
591
+ type: 'table',
592
+ headers: ['name', 'age'],
593
+ rows: [
594
+ ['Alice', '30'],
595
+ ['Bob', '25'],
596
+ ],
597
+ }),
598
+ )
599
+ })
600
+
601
+ it('should include title when provided', async () => {
602
+ const logger = await createLogger()
603
+
604
+ logger.table([{ name: 'Alice' }], { title: 'Users' })
605
+
606
+ expect(mockScreen.addMessage).toHaveBeenCalledWith(
607
+ expect.objectContaining({
608
+ title: 'Users',
609
+ }),
610
+ )
611
+ })
612
+
613
+ it('should return this for empty data', async () => {
614
+ const logger = await createLogger()
615
+
616
+ const result = logger.table([])
617
+
618
+ expect(result).toBe(logger)
619
+ expect(mockScreen.addMessage).not.toHaveBeenCalled()
620
+ })
621
+
622
+ it('should return this for chaining', async () => {
623
+ const logger = await createLogger()
624
+
625
+ const result = logger.table([{ a: 1 }])
626
+
627
+ expect(result).toBe(logger)
628
+ })
629
+ })
630
+ })