@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,61 @@
1
+ import {
2
+ inject,
3
+ Injectable,
4
+ LoggerOutput,
5
+ type ClassTypeWithInstance,
6
+ type LoggerService,
7
+ type LogLevel,
8
+ } from '@navios/core'
9
+
10
+ import { ScreenLogger } from '../tokens/index.ts'
11
+
12
+ export function overrideConsoleLogger(
13
+ hidden: boolean = false,
14
+ ): ClassTypeWithInstance<LoggerService> {
15
+ /**
16
+ * Override the ConsoleLogger service to use the ScreenLogger service instead of the default ConsoleLogger service.
17
+ */
18
+ @Injectable({
19
+ token: LoggerOutput,
20
+ priority: 1000,
21
+ })
22
+ class ConsoleLoggerOverride implements LoggerService {
23
+ protected readonly logger = inject(ScreenLogger, {
24
+ screen: {
25
+ name: 'default',
26
+ icon: '💻',
27
+ hidden,
28
+ },
29
+ })
30
+
31
+ log(message: string): void {
32
+ this.logger.log(message)
33
+ }
34
+
35
+ error(message: string): void {
36
+ this.logger.error(message)
37
+ }
38
+
39
+ warn(message: string): void {
40
+ this.logger.warn(message)
41
+ }
42
+
43
+ debug(message: string): void {
44
+ this.logger.debug(message)
45
+ }
46
+
47
+ fatal(message: any) {
48
+ this.logger.fatal(message)
49
+ }
50
+
51
+ verbose(message: any) {
52
+ this.logger.verbose(message)
53
+ }
54
+
55
+ setLogLevels(levels: LogLevel[]): void {
56
+ this.logger.setLogLevels(levels)
57
+ }
58
+ }
59
+
60
+ return ConsoleLoggerOverride
61
+ }
@@ -0,0 +1 @@
1
+ export * from './console.logger.override.ts'
@@ -0,0 +1,3 @@
1
+ export * from './screen-options.ts'
2
+ export * from './logger-options.ts'
3
+ export * from './prompt-options.ts'
@@ -0,0 +1,13 @@
1
+ import { z } from 'zod/v4'
2
+
3
+ import { ALL_LOG_LEVELS } from '../types/index.ts'
4
+
5
+ import { ScreenOptionsSchema } from './screen-options.ts'
6
+
7
+ export const LoggerOptionsSchema = z.object({
8
+ screen: ScreenOptionsSchema.or(z.string()).optional().default('default'),
9
+ context: z.string().optional(),
10
+ enabledLevels: z.array(z.enum(ALL_LOG_LEVELS)).default(ALL_LOG_LEVELS),
11
+ })
12
+
13
+ export type LoggerOptions = z.infer<typeof LoggerOptionsSchema>
@@ -0,0 +1,9 @@
1
+ import { z } from 'zod/v4'
2
+
3
+ import { ScreenOptionsSchema } from './screen-options.ts'
4
+
5
+ export const PromptOptionsSchema = z.object({
6
+ screen: ScreenOptionsSchema.or(z.string()).optional().default('default'),
7
+ })
8
+
9
+ export type PromptOptions = z.infer<typeof PromptOptionsSchema>
@@ -0,0 +1,14 @@
1
+ import { z } from 'zod/v4'
2
+
3
+ export const ScreenOptionsSchema = z.object({
4
+ /** The name of the screen */
5
+ name: z.string(),
6
+ /** The icon of the screen */
7
+ icon: z.string().optional(),
8
+ /** The badge count of the screen */
9
+ badgeCount: z.number().optional(),
10
+ /** Whether the screen is hidden */
11
+ hidden: z.boolean().optional().default(false),
12
+ })
13
+
14
+ export type ScreenOptions = z.infer<typeof ScreenOptionsSchema>
@@ -0,0 +1,4 @@
1
+ export * from './screen_manager.tsx'
2
+ export * from './screen.ts'
3
+ export * from './logger.ts'
4
+ export * from './prompt.ts'
@@ -0,0 +1,369 @@
1
+ import { inject, Injectable } from '@navios/core'
2
+
3
+ import type { LoggerService, LogLevel } from '@navios/core'
4
+
5
+ import { Screen, ScreenLogger } from '../tokens/index.ts'
6
+ import { captureTrace, formatObject } from '../utils/index.ts'
7
+
8
+ import type { LoggerOptions } from '../schemas/index.ts'
9
+ import type {
10
+ DiffMessageData,
11
+ FileErrorMessageData,
12
+ FileMessageData,
13
+ GroupMessageData,
14
+ LoadingHandle,
15
+ LoadingMessageData,
16
+ LogMessageData,
17
+ LogMessageVariant,
18
+ ProgressHandle,
19
+ ProgressMessageData,
20
+ PromiseOptions,
21
+ TableMessageData,
22
+ } from '../types/index.ts'
23
+
24
+ import type { ScreenInstance } from './screen.ts'
25
+
26
+ let messageIdCounter = 0
27
+ function generateId(): string {
28
+ return `msg-${++messageIdCounter}`
29
+ }
30
+
31
+ @Injectable({
32
+ token: ScreenLogger,
33
+ })
34
+ export class ScreenLoggerInstance implements LoggerService {
35
+ private screen: ScreenInstance
36
+ private context?: string
37
+ private enabledLevels: Set<LogLevel>
38
+
39
+ constructor(options: LoggerOptions) {
40
+ this.screen = inject(
41
+ Screen,
42
+ typeof options.screen === 'string'
43
+ ? {
44
+ name: options.screen,
45
+ }
46
+ : options.screen,
47
+ )
48
+
49
+ this.context = options.context
50
+ this.enabledLevels = new Set(options.enabledLevels)
51
+ }
52
+
53
+ private isLevelEnabled(level: LogLevel): boolean {
54
+ return this.enabledLevels.has(level)
55
+ }
56
+
57
+ // ============================================
58
+ // Log Level Methods (chainable)
59
+ // ============================================
60
+
61
+ verbose(msg: string | object, label?: string): this {
62
+ return this.write('verbose', msg, label)
63
+ }
64
+
65
+ setLogLevels(levels: LogLevel[]) {
66
+ this.enabledLevels = new Set(levels)
67
+ return this
68
+ }
69
+
70
+ trace(msg: string | object, label?: string): this {
71
+ const trace = captureTrace()
72
+ return this.write('verbose', msg, label, trace, 'trace')
73
+ }
74
+
75
+ debug(msg: string | object, label?: string): this {
76
+ return this.write('debug', msg, label)
77
+ }
78
+
79
+ log(msg: string | object, label?: string): this {
80
+ return this.write('log', msg, label)
81
+ }
82
+
83
+ success(msg: string | object, label?: string): this {
84
+ return this.write('log', msg, label, undefined, 'success')
85
+ }
86
+
87
+ warn(msg: string | object, label?: string): this {
88
+ return this.write('warn', msg, label)
89
+ }
90
+
91
+ error(msg: string | object, label?: string): this {
92
+ return this.write('error', msg, label)
93
+ }
94
+
95
+ fatal(msg: string | object, label?: string): this {
96
+ return this.write('fatal', msg, label)
97
+ }
98
+
99
+ private write(
100
+ level: LogLevel,
101
+ content: string | object,
102
+ label?: string,
103
+ trace?: string,
104
+ variant?: LogMessageVariant,
105
+ ): this {
106
+ if (!this.isLevelEnabled(level)) {
107
+ return this
108
+ }
109
+
110
+ const formattedContent = typeof content === 'object' ? formatObject(content) : content
111
+ const message: LogMessageData = {
112
+ id: generateId(),
113
+ type: 'log',
114
+ timestamp: new Date(),
115
+ level,
116
+ content: formattedContent,
117
+ label: label ?? this.context,
118
+ trace,
119
+ variant,
120
+ }
121
+ this.screen.addMessage(message)
122
+ return this
123
+ }
124
+
125
+ // ============================================
126
+ // File Methods (chainable)
127
+ // ============================================
128
+
129
+ file(path: string, content: string): this {
130
+ if (!this.isLevelEnabled('debug')) {
131
+ return this
132
+ }
133
+
134
+ const message: FileMessageData = {
135
+ id: generateId(),
136
+ type: 'file',
137
+ timestamp: new Date(),
138
+ filePath: path,
139
+ content,
140
+ }
141
+ this.screen.addMessage(message)
142
+ return this
143
+ }
144
+
145
+ diff(path: string, diffContent: string, view?: 'unified' | 'split'): this {
146
+ if (!this.isLevelEnabled('debug')) {
147
+ return this
148
+ }
149
+
150
+ const message: DiffMessageData = {
151
+ id: generateId(),
152
+ type: 'diff',
153
+ timestamp: new Date(),
154
+ filePath: path,
155
+ diff: diffContent,
156
+ view,
157
+ }
158
+ this.screen.addMessage(message)
159
+ return this
160
+ }
161
+
162
+ fileError(path: string, content: string, errorLines: number[], startLine: number = 1): this {
163
+ if (!this.isLevelEnabled('debug')) {
164
+ return this
165
+ }
166
+
167
+ const message: FileErrorMessageData = {
168
+ id: generateId(),
169
+ type: 'fileError',
170
+ timestamp: new Date(),
171
+ filePath: path,
172
+ content,
173
+ errorLines,
174
+ startLine,
175
+ }
176
+ this.screen.addMessage(message)
177
+ return this
178
+ }
179
+
180
+ // ============================================
181
+ // Promise/Async Methods
182
+ // ============================================
183
+
184
+ /**
185
+ * Sonner-like promise handling
186
+ */
187
+ async promise<T>(promise: Promise<T>, options: PromiseOptions<T>): Promise<T> {
188
+ const id = generateId()
189
+
190
+ // Add loading message
191
+ const loadingMessage: LoadingMessageData = {
192
+ id,
193
+ type: 'loading',
194
+ timestamp: new Date(),
195
+ content: options.loading,
196
+ status: 'loading',
197
+ }
198
+ this.screen.addMessage(loadingMessage)
199
+
200
+ try {
201
+ const result = await promise
202
+
203
+ // Update to success
204
+ const successContent =
205
+ typeof options.success === 'function' ? options.success(result) : options.success
206
+
207
+ this.screen.updateMessage(id, {
208
+ status: 'success',
209
+ resolvedContent: successContent,
210
+ })
211
+
212
+ return result
213
+ } catch (err) {
214
+ // Update to error
215
+ const error = err instanceof Error ? err : new Error(String(err))
216
+ const errorContent =
217
+ typeof options.error === 'function' ? options.error(error) : options.error
218
+
219
+ this.screen.updateMessage(id, {
220
+ status: 'fail',
221
+ resolvedContent: errorContent,
222
+ })
223
+
224
+ throw err
225
+ }
226
+ }
227
+
228
+ /**
229
+ * Create a loading message with manual resolution
230
+ */
231
+ loading(message: string): LoadingHandle {
232
+ const id = generateId()
233
+
234
+ const loadingMessage: LoadingMessageData = {
235
+ id,
236
+ type: 'loading',
237
+ timestamp: new Date(),
238
+ content: message,
239
+ status: 'loading',
240
+ }
241
+ this.screen.addMessage(loadingMessage)
242
+
243
+ return {
244
+ success: (resolvedMessage: string) => {
245
+ this.screen.updateMessage(id, {
246
+ status: 'success',
247
+ resolvedContent: resolvedMessage,
248
+ })
249
+ },
250
+ fail: (resolvedMessage: string) => {
251
+ this.screen.updateMessage(id, {
252
+ status: 'fail',
253
+ resolvedContent: resolvedMessage,
254
+ })
255
+ },
256
+ }
257
+ }
258
+
259
+ // ============================================
260
+ // Progress Bar
261
+ // ============================================
262
+
263
+ /**
264
+ * Create a progress bar with manual updates
265
+ */
266
+ progress(label: string, options: { total: number }): ProgressHandle {
267
+ const id = generateId()
268
+
269
+ const progressMessage: ProgressMessageData = {
270
+ id,
271
+ type: 'progress',
272
+ timestamp: new Date(),
273
+ label,
274
+ current: 0,
275
+ total: options.total,
276
+ status: 'active',
277
+ }
278
+ this.screen.addMessage(progressMessage)
279
+
280
+ return {
281
+ update: (current: number, newLabel?: string) => {
282
+ this.screen.updateProgressMessage(id, {
283
+ current,
284
+ label: newLabel ?? label,
285
+ })
286
+ },
287
+ complete: (message?: string) => {
288
+ this.screen.updateProgressMessage(id, {
289
+ current: options.total,
290
+ status: 'complete',
291
+ resolvedContent: message,
292
+ })
293
+ },
294
+ fail: (message?: string) => {
295
+ this.screen.updateProgressMessage(id, {
296
+ status: 'failed',
297
+ resolvedContent: message,
298
+ })
299
+ },
300
+ }
301
+ }
302
+
303
+ // ============================================
304
+ // Log Groups
305
+ // ============================================
306
+
307
+ /**
308
+ * Start a collapsible log group
309
+ */
310
+ group(label: string): this {
311
+ const message: GroupMessageData = {
312
+ id: generateId(),
313
+ type: 'group',
314
+ timestamp: new Date(),
315
+ label,
316
+ collapsed: false,
317
+ isEnd: false,
318
+ }
319
+ this.screen.addMessage(message)
320
+ return this
321
+ }
322
+
323
+ /**
324
+ * End the current log group
325
+ */
326
+ groupEnd(): this {
327
+ const message: GroupMessageData = {
328
+ id: generateId(),
329
+ type: 'group',
330
+ timestamp: new Date(),
331
+ label: '',
332
+ collapsed: false,
333
+ isEnd: true,
334
+ }
335
+ this.screen.addMessage(message)
336
+ return this
337
+ }
338
+
339
+ // ============================================
340
+ // Table Display
341
+ // ============================================
342
+
343
+ /**
344
+ * Display tabular data
345
+ */
346
+ table(data: Record<string, unknown>[], options?: { title?: string }): this {
347
+ if (data.length === 0) return this
348
+
349
+ const firstRow = data[0]
350
+ if (!firstRow) return this
351
+
352
+ // Extract headers from first row
353
+ const headers = Object.keys(firstRow)
354
+
355
+ // Convert data to string rows
356
+ const rows = data.map((row) => headers.map((h) => String(row[h] ?? '')))
357
+
358
+ const message: TableMessageData = {
359
+ id: generateId(),
360
+ type: 'table',
361
+ timestamp: new Date(),
362
+ headers,
363
+ rows,
364
+ title: options?.title,
365
+ }
366
+ this.screen.addMessage(message)
367
+ return this
368
+ }
369
+ }
@@ -0,0 +1,169 @@
1
+ import { inject, Injectable } from '@navios/core'
2
+
3
+ import { Prompt, Screen } from '../tokens/index.ts'
4
+
5
+ import type { PromptOptions } from '../schemas/index.ts'
6
+ import type {
7
+ ChoiceOptions,
8
+ ChoicePromptData,
9
+ ConfirmOptions,
10
+ ConfirmPromptData,
11
+ InputOptions,
12
+ InputPromptData,
13
+ MultiChoiceOptions,
14
+ MultiChoicePromptData,
15
+ } from '../types/index.ts'
16
+
17
+ import type { ScreenInstance } from './screen.ts'
18
+
19
+ /**
20
+ * Prompt class for interactive user input.
21
+ * Similar to Logger, but for prompts that require user interaction.
22
+ */
23
+ @Injectable({
24
+ token: Prompt,
25
+ })
26
+ export class PromptInstance {
27
+ private screen: ScreenInstance
28
+
29
+ constructor(options: PromptOptions) {
30
+ this.screen = inject(
31
+ Screen,
32
+ typeof options.screen === 'string'
33
+ ? {
34
+ name: options.screen,
35
+ }
36
+ : options.screen,
37
+ )
38
+ }
39
+
40
+ /**
41
+ * Display a choice prompt and wait for user selection.
42
+ * Returns the selected value (or input text if an input option was selected).
43
+ */
44
+ async choice(options: ChoiceOptions): Promise<string> {
45
+ const { question, choices, defaultChoice, timeout } = options
46
+
47
+ if (choices.length === 0) {
48
+ throw new Error('Choices array cannot be empty')
49
+ }
50
+
51
+ // Find default index
52
+ const defaultIndex = defaultChoice ? choices.findIndex((c) => c.value === defaultChoice) : 0
53
+
54
+ const prompt: ChoicePromptData = {
55
+ type: 'choice',
56
+ id: `prompt-${Date.now()}-${Math.random().toString(36).slice(2)}`,
57
+ timestamp: new Date(),
58
+ question,
59
+ choices,
60
+ defaultChoice: defaultChoice ?? choices[0]?.value ?? '',
61
+ selectedIndex: Math.max(0, defaultIndex),
62
+ inputMode: false,
63
+ inputValue: '',
64
+ resolved: false,
65
+ timeout,
66
+ timeoutStarted: timeout ? Date.now() : undefined,
67
+ }
68
+
69
+ return this.screen._addPrompt(prompt) as Promise<string>
70
+ }
71
+
72
+ /**
73
+ * Display a confirmation prompt and wait for user response.
74
+ * Returns true for confirm, false for cancel.
75
+ */
76
+ async confirm(options: ConfirmOptions): Promise<boolean> {
77
+ const {
78
+ question,
79
+ confirmText = 'Yes',
80
+ cancelText = 'No',
81
+ defaultValue = true,
82
+ timeout,
83
+ } = options
84
+
85
+ const prompt: ConfirmPromptData = {
86
+ type: 'confirm',
87
+ id: `prompt-${Date.now()}-${Math.random().toString(36).slice(2)}`,
88
+ timestamp: new Date(),
89
+ question,
90
+ confirmText,
91
+ cancelText,
92
+ defaultValue,
93
+ selectedValue: defaultValue,
94
+ resolved: false,
95
+ timeout,
96
+ timeoutStarted: timeout ? Date.now() : undefined,
97
+ }
98
+
99
+ return this.screen._addPrompt(prompt) as Promise<boolean>
100
+ }
101
+
102
+ /**
103
+ * Display a text input prompt and wait for user input.
104
+ * Returns the entered text.
105
+ */
106
+ async input(options: InputOptions): Promise<string> {
107
+ const { question, placeholder = '', defaultValue = '', timeout } = options
108
+
109
+ const prompt: InputPromptData = {
110
+ type: 'input',
111
+ id: `prompt-${Date.now()}-${Math.random().toString(36).slice(2)}`,
112
+ timestamp: new Date(),
113
+ question,
114
+ placeholder,
115
+ defaultValue,
116
+ value: defaultValue,
117
+ resolved: false,
118
+ timeout,
119
+ timeoutStarted: timeout ? Date.now() : undefined,
120
+ }
121
+
122
+ return this.screen._addPrompt(prompt) as Promise<string>
123
+ }
124
+
125
+ /**
126
+ * Display a multi-select choice prompt.
127
+ * Returns an array of selected values.
128
+ */
129
+ async multiChoice(options: MultiChoiceOptions): Promise<string[]> {
130
+ const {
131
+ question,
132
+ choices,
133
+ defaultChoices = [],
134
+ minSelect = 0,
135
+ maxSelect = choices.length,
136
+ timeout,
137
+ } = options
138
+
139
+ if (choices.length === 0) {
140
+ throw new Error('Choices array cannot be empty')
141
+ }
142
+
143
+ // Find default indices
144
+ const selectedIndices = new Set<number>()
145
+ defaultChoices.forEach((value) => {
146
+ const index = choices.findIndex((c) => c.value === value)
147
+ if (index !== -1) {
148
+ selectedIndices.add(index)
149
+ }
150
+ })
151
+
152
+ const prompt: MultiChoicePromptData = {
153
+ type: 'multiChoice',
154
+ id: `prompt-${Date.now()}-${Math.random().toString(36).slice(2)}`,
155
+ timestamp: new Date(),
156
+ question,
157
+ choices,
158
+ selectedIndices,
159
+ focusedIndex: 0,
160
+ minSelect,
161
+ maxSelect,
162
+ resolved: false,
163
+ timeout,
164
+ timeoutStarted: timeout ? Date.now() : undefined,
165
+ }
166
+
167
+ return this.screen._addPrompt(prompt) as Promise<string[]>
168
+ }
169
+ }