@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,255 @@
1
+ import type {
2
+ GroupMessageData,
3
+ LoadingMessageData,
4
+ LogMessageData,
5
+ LogMessageVariant,
6
+ MessageData,
7
+ ProgressMessageData,
8
+ TableMessageData,
9
+ } from '../types/index.ts'
10
+ import type { LogLevel } from '@navios/core'
11
+
12
+ import { DEFAULT_LOG_LEVEL_COLORS, GROUP_COLORS, PROGRESS_COLORS, TABLE_COLORS, VARIANT_COLORS } from './colors/index.ts'
13
+
14
+ // ANSI escape codes
15
+ const RESET = '\x1b[0m'
16
+ const BOLD = '\x1b[1m'
17
+ const DIM = '\x1b[2m'
18
+
19
+ // Convert hex color to ANSI 24-bit color
20
+ function hexToAnsi(hex: string, isForeground = true): string {
21
+ // Remove # if present and take first 6 chars
22
+ const cleanHex = hex.replace('#', '').slice(0, 6)
23
+
24
+ // Validate hex format
25
+ if (!/^[0-9A-Fa-f]{6}$/.test(cleanHex)) {
26
+ return '' // Return empty string for invalid colors (no styling)
27
+ }
28
+
29
+ const r = parseInt(cleanHex.slice(0, 2), 16)
30
+ const g = parseInt(cleanHex.slice(2, 4), 16)
31
+ const b = parseInt(cleanHex.slice(4, 6), 16)
32
+
33
+ const code = isForeground ? 38 : 48
34
+ return `\x1b[${code};2;${r};${g};${b}m`
35
+ }
36
+
37
+ // Get ANSI color for log level or variant
38
+ function getLogLevelAnsiColor(level: LogLevel, variant?: LogMessageVariant): string {
39
+ const colors = variant ? VARIANT_COLORS[variant] : DEFAULT_LOG_LEVEL_COLORS[level]
40
+ return hexToAnsi(colors.border, true)
41
+ }
42
+
43
+ // Format a log level label
44
+ function formatLevel(level: LogLevel, variant?: LogMessageVariant): string {
45
+ const color = getLogLevelAnsiColor(level, variant)
46
+ // Use variant name if present, otherwise use level name
47
+ const displayName = variant ?? level
48
+ const label = displayName.toUpperCase().padEnd(7)
49
+ return `${color}${BOLD}[${label}]${RESET}`
50
+ }
51
+
52
+ // Format timestamp
53
+ function formatTimestamp(date: Date): string {
54
+ return `${DIM}${date.toLocaleTimeString()}${RESET}`
55
+ }
56
+
57
+ // Print a single message
58
+ function printMessage(message: MessageData, stream: NodeJS.WriteStream): void {
59
+ switch (message.type) {
60
+ case 'log': {
61
+ const logMessage = message as LogMessageData
62
+ const timestamp = formatTimestamp(message.timestamp)
63
+ const level = formatLevel(logMessage.level, logMessage.variant)
64
+ const label = logMessage.label ? ` ${DIM}[${logMessage.label}]${RESET}` : ''
65
+ stream.write(`${timestamp} ${level}${label} ${logMessage.content}\n`)
66
+ break
67
+ }
68
+
69
+ case 'file': {
70
+ const header = `${DIM}─── ${message.filePath} ───${RESET}`
71
+ stream.write(`${header}\n${message.content}\n`)
72
+ break
73
+ }
74
+
75
+ case 'diff': {
76
+ const header = `${DIM}─── ${message.filePath} (diff) ───${RESET}`
77
+ // Color diff lines
78
+ const coloredDiff = message.diff
79
+ .split('\n')
80
+ .map((line) => {
81
+ if (line.startsWith('+') && !line.startsWith('+++')) {
82
+ return `\x1b[32m${line}${RESET}` // Green for additions
83
+ } else if (line.startsWith('-') && !line.startsWith('---')) {
84
+ return `\x1b[31m${line}${RESET}` // Red for deletions
85
+ } else if (line.startsWith('@@')) {
86
+ return `\x1b[36m${line}${RESET}` // Cyan for hunk headers
87
+ }
88
+ return line
89
+ })
90
+ .join('\n')
91
+ stream.write(`${header}\n${coloredDiff}\n`)
92
+ break
93
+ }
94
+
95
+ case 'fileError': {
96
+ const header = `${DIM}─── ${message.filePath} ───${RESET}`
97
+ const errorLineSet = new Set(message.errorLines)
98
+ const startLine = message.startLine ?? 1
99
+
100
+ const lines = message.content.split('\n')
101
+ const numberedLines = lines.map((line, index) => {
102
+ const lineNum = startLine + index
103
+ const numStr = String(lineNum).padStart(4)
104
+ const isError = errorLineSet.has(lineNum)
105
+
106
+ if (isError) {
107
+ return `\x1b[31m${numStr} │ ${line}${RESET}`
108
+ }
109
+ return `${DIM}${numStr}${RESET} │ ${line}`
110
+ })
111
+
112
+ stream.write(`${header}\n${numberedLines.join('\n')}\n`)
113
+ break
114
+ }
115
+
116
+ case 'loading': {
117
+ const loadingMessage = message as LoadingMessageData
118
+ const status = loadingMessage.status
119
+ const content = loadingMessage.resolvedContent ?? loadingMessage.content
120
+
121
+ let level: LogLevel = 'log'
122
+ let variant: LogMessageVariant | undefined
123
+ if (status === 'success') {
124
+ level = 'log'
125
+ variant = 'success'
126
+ } else if (status === 'fail') {
127
+ level = 'error'
128
+ }
129
+
130
+ const timestamp = formatTimestamp(message.timestamp)
131
+ const levelStr = formatLevel(level, variant)
132
+ const prefix = status === 'loading' ? '... ' : ''
133
+ stream.write(`${timestamp} ${levelStr} ${prefix}${content}\n`)
134
+ break
135
+ }
136
+
137
+ case 'progress': {
138
+ const progressMessage = message as ProgressMessageData
139
+ const { label, current, total, status, resolvedContent } = progressMessage
140
+ const percentage = total > 0 ? Math.round((current / total) * 100) : 0
141
+ const barWidth = 20
142
+ const filledWidth = Math.round((percentage / 100) * barWidth)
143
+ const emptyWidth = barWidth - filledWidth
144
+
145
+ const progressColor = hexToAnsi(PROGRESS_COLORS.barFilled)
146
+ const emptyColor = hexToAnsi(PROGRESS_COLORS.barEmpty)
147
+ const filledBar = '█'.repeat(filledWidth)
148
+ const emptyBar = '░'.repeat(emptyWidth)
149
+
150
+ let statusIcon = ''
151
+ let statusColor = ''
152
+ if (status === 'complete') {
153
+ statusIcon = '✓'
154
+ statusColor = hexToAnsi(PROGRESS_COLORS.complete)
155
+ } else if (status === 'failed') {
156
+ statusIcon = '✗'
157
+ statusColor = hexToAnsi(PROGRESS_COLORS.failed)
158
+ }
159
+
160
+ const displayLabel = resolvedContent ?? label
161
+ const progressBar = `${progressColor}${filledBar}${RESET}${emptyColor}${emptyBar}${RESET}`
162
+ const percentStr = `${String(percentage).padStart(3)}%`
163
+
164
+ if (statusIcon) {
165
+ stream.write(`${statusColor}${statusIcon}${RESET} ${displayLabel} [${progressBar}] ${percentStr}\n`)
166
+ } else {
167
+ stream.write(` ${displayLabel} [${progressBar}] ${percentStr} (${current}/${total})\n`)
168
+ }
169
+ break
170
+ }
171
+
172
+ case 'group': {
173
+ const groupMessage = message as GroupMessageData
174
+ const { label, collapsed, isEnd } = groupMessage
175
+ const groupColor = hexToAnsi(GROUP_COLORS.border)
176
+ const iconColor = hexToAnsi(GROUP_COLORS.icon)
177
+
178
+ if (isEnd) {
179
+ stream.write(`${groupColor}└─${RESET} ${DIM}end ${label}${RESET}\n`)
180
+ } else {
181
+ const icon = collapsed ? '▶' : '▼'
182
+ stream.write(`${groupColor}┌─${RESET} ${iconColor}${icon}${RESET} ${BOLD}${label}${RESET}\n`)
183
+ }
184
+ break
185
+ }
186
+
187
+ case 'table': {
188
+ const tableMessage = message as TableMessageData
189
+ const { headers, rows, title } = tableMessage
190
+
191
+ const tableColor = hexToAnsi(TABLE_COLORS.border)
192
+ const headerColor = hexToAnsi(TABLE_COLORS.headerText)
193
+ const cellColor = hexToAnsi(TABLE_COLORS.cellText)
194
+
195
+ // Calculate column widths
196
+ const colWidths = headers.map((h, i) => {
197
+ const maxRowWidth = rows.reduce((max, row) => Math.max(max, (row[i] ?? '').length), 0)
198
+ return Math.max(h.length, maxRowWidth)
199
+ })
200
+
201
+ // Build separator line
202
+ const separator = `${tableColor}├${colWidths.map((w) => '─'.repeat(w + 2)).join('┼')}┤${RESET}`
203
+ const topBorder = `${tableColor}┌${colWidths.map((w) => '─'.repeat(w + 2)).join('┬')}┐${RESET}`
204
+ const bottomBorder = `${tableColor}└${colWidths.map((w) => '─'.repeat(w + 2)).join('┴')}┘${RESET}`
205
+
206
+ // Print title if present
207
+ if (title) {
208
+ stream.write(`${BOLD}${title}${RESET}\n`)
209
+ }
210
+
211
+ // Print top border
212
+ stream.write(`${topBorder}\n`)
213
+
214
+ // Print headers
215
+ const headerRow = headers.map((h, i) => ` ${h.padEnd(colWidths[i])} `).join(`${tableColor}│${RESET}`)
216
+ stream.write(`${tableColor}│${RESET}${headerColor}${headerRow}${RESET}${tableColor}│${RESET}\n`)
217
+
218
+ // Print separator
219
+ stream.write(`${separator}\n`)
220
+
221
+ // Print rows
222
+ for (const row of rows) {
223
+ const rowStr = headers.map((_, i) => ` ${(row[i] ?? '').padEnd(colWidths[i])} `).join(`${tableColor}│${RESET}`)
224
+ stream.write(`${tableColor}│${RESET}${cellColor}${rowStr}${RESET}${tableColor}│${RESET}\n`)
225
+ }
226
+
227
+ // Print bottom border
228
+ stream.write(`${bottomBorder}\n`)
229
+ break
230
+ }
231
+ }
232
+ }
233
+
234
+ /**
235
+ * Print all messages to stdout (or stderr if isError)
236
+ */
237
+ export function printMessagesToStdout(
238
+ messages: MessageData[],
239
+ screenName: string,
240
+ isError: boolean = false,
241
+ ): void {
242
+ const stream = isError ? process.stderr : process.stdout
243
+
244
+ // Print screen header
245
+ const headerColor = isError ? '\x1b[31m' : '\x1b[32m'
246
+ const status = isError ? 'FAILED' : 'COMPLETED'
247
+ stream.write(`\n${headerColor}${BOLD}═══ ${screenName} [${status}] ═══${RESET}\n\n`)
248
+
249
+ // Print each message
250
+ for (const message of messages) {
251
+ printMessage(message, stream)
252
+ }
253
+
254
+ stream.write('\n')
255
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,14 @@
1
+ {
2
+ "extends": "../../tsconfig.json",
3
+ "compilerOptions": {
4
+ "outDir": "dist",
5
+ "jsx": "react-jsx",
6
+ "jsxImportSource": "@opentui/react",
7
+ "module": "Preserve",
8
+ "moduleResolution": "bundler",
9
+ "allowImportingTsExtensions": true,
10
+ "noEmit": true
11
+ },
12
+ "include": ["src/**/*"],
13
+ "exclude": ["src/**/*.spec.ts", "src/**/*.spec.tsx"]
14
+ }
@@ -0,0 +1,34 @@
1
+ import { withFilter } from 'rolldown/filter'
2
+ import { defineConfig } from 'tsdown'
3
+ import swc from 'unplugin-swc'
4
+
5
+ export default defineConfig({
6
+ entry: ['src/index.ts'],
7
+ outDir: 'lib',
8
+ format: ['esm', 'cjs'],
9
+ clean: true,
10
+ treeshake: true,
11
+ sourcemap: true,
12
+ platform: 'node',
13
+ dts: true,
14
+ target: 'es2022',
15
+ plugins: [
16
+ swc.rolldown({
17
+ jsc: {
18
+ target: 'es2022',
19
+ parser: {
20
+ tsx: true,
21
+ syntax: 'typescript',
22
+ decorators: true,
23
+ },
24
+ transform: {
25
+ decoratorVersion: '2022-03',
26
+ react: {
27
+ runtime: 'automatic',
28
+ importSource: '@opentui/react',
29
+ },
30
+ },
31
+ },
32
+ }),
33
+ ],
34
+ })
@@ -0,0 +1,10 @@
1
+ import { defineProject } from 'vitest/config'
2
+
3
+ export default defineProject({
4
+ test: {
5
+ typecheck: {
6
+ enabled: true,
7
+ },
8
+ setupFiles: ['./src/__tests__/setup.ts'],
9
+ },
10
+ })