@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,325 @@
1
+ import { beforeEach, describe, expect, it } from 'vitest'
2
+
3
+ import { FilterEngine } from '../../filter/filter_engine.ts'
4
+ import {
5
+ createDiffMessage,
6
+ createFilterState,
7
+ createGroupMessage,
8
+ createLoadingMessage,
9
+ createLogMessage,
10
+ createProgressMessage,
11
+ createTableMessage,
12
+ createFileMessage,
13
+ resetIdCounter,
14
+ } from '../utils/factories.ts'
15
+
16
+ import type { LogLevel } from '@navios/core'
17
+ import type { MessageData } from '../../types/index.ts'
18
+
19
+ describe('FilterEngine', () => {
20
+ beforeEach(() => {
21
+ resetIdCounter()
22
+ })
23
+
24
+ describe('filterMessages', () => {
25
+ it('should return original array when no filters are active', () => {
26
+ const messages: MessageData[] = [
27
+ createLogMessage({ level: 'log' }),
28
+ createLogMessage({ level: 'error' }),
29
+ createLogMessage({ level: 'warn' }),
30
+ ]
31
+
32
+ const filter = createFilterState()
33
+ const result = FilterEngine.filterMessages(messages, filter)
34
+
35
+ expect(result).toBe(messages) // Same reference
36
+ })
37
+
38
+ it('should filter by single log level', () => {
39
+ const messages: MessageData[] = [
40
+ createLogMessage({ level: 'log', content: 'log message' }),
41
+ createLogMessage({ level: 'error', content: 'error message' }),
42
+ createLogMessage({ level: 'warn', content: 'warn message' }),
43
+ ]
44
+
45
+ const filter = createFilterState({
46
+ enabledLevels: new Set(['error'] as LogLevel[]),
47
+ })
48
+ const result = FilterEngine.filterMessages(messages, filter)
49
+
50
+ expect(result).toHaveLength(1)
51
+ expect((result[0] as any).level).toBe('error')
52
+ })
53
+
54
+ it('should filter by multiple log levels', () => {
55
+ const messages: MessageData[] = [
56
+ createLogMessage({ level: 'log' }),
57
+ createLogMessage({ level: 'error' }),
58
+ createLogMessage({ level: 'warn' }),
59
+ createLogMessage({ level: 'debug' }),
60
+ ]
61
+
62
+ const filter = createFilterState({
63
+ enabledLevels: new Set(['error', 'warn'] as LogLevel[]),
64
+ })
65
+ const result = FilterEngine.filterMessages(messages, filter)
66
+
67
+ expect(result).toHaveLength(2)
68
+ expect(result.map((m) => (m as any).level)).toEqual(['error', 'warn'])
69
+ })
70
+
71
+ it('should filter by search query (content match)', () => {
72
+ const messages: MessageData[] = [
73
+ createLogMessage({ content: 'Hello world' }),
74
+ createLogMessage({ content: 'Goodbye world' }),
75
+ createLogMessage({ content: 'Something else' }),
76
+ ]
77
+
78
+ const filter = createFilterState({
79
+ searchQuery: 'world',
80
+ })
81
+ const result = FilterEngine.filterMessages(messages, filter)
82
+
83
+ expect(result).toHaveLength(2)
84
+ })
85
+
86
+ it('should filter by search query (label match)', () => {
87
+ const messages: MessageData[] = [
88
+ createLogMessage({ content: 'Message 1', label: 'API' }),
89
+ createLogMessage({ content: 'Message 2', label: 'Database' }),
90
+ createLogMessage({ content: 'Message 3', label: 'API' }),
91
+ ]
92
+
93
+ const filter = createFilterState({
94
+ searchQuery: 'API',
95
+ })
96
+ const result = FilterEngine.filterMessages(messages, filter)
97
+
98
+ expect(result).toHaveLength(2)
99
+ })
100
+
101
+ it('should combine log level and search filters', () => {
102
+ const messages: MessageData[] = [
103
+ createLogMessage({ level: 'log', content: 'Hello log' }),
104
+ createLogMessage({ level: 'error', content: 'Hello error' }),
105
+ createLogMessage({ level: 'log', content: 'Goodbye log' }),
106
+ createLogMessage({ level: 'error', content: 'Goodbye error' }),
107
+ ]
108
+
109
+ const filter = createFilterState({
110
+ enabledLevels: new Set(['error'] as LogLevel[]),
111
+ searchQuery: 'Hello',
112
+ })
113
+ const result = FilterEngine.filterMessages(messages, filter)
114
+
115
+ expect(result).toHaveLength(1)
116
+ expect((result[0] as any).content).toBe('Hello error')
117
+ })
118
+
119
+ it('should preserve group markers during filtering', () => {
120
+ const messages: MessageData[] = [
121
+ createGroupMessage({ label: 'Group 1', isEnd: false }),
122
+ createLogMessage({ level: 'error', content: 'Error in group' }),
123
+ createGroupMessage({ label: '', isEnd: true }),
124
+ ]
125
+
126
+ const filter = createFilterState({
127
+ enabledLevels: new Set(['log'] as LogLevel[]), // Excludes error
128
+ })
129
+ const result = FilterEngine.filterMessages(messages, filter)
130
+
131
+ // Group markers should still be present
132
+ expect(result.filter((m) => m.type === 'group')).toHaveLength(2)
133
+ })
134
+
135
+ it('should handle non-log messages (file, progress, loading) without level filter', () => {
136
+ const messages: MessageData[] = [
137
+ createFileMessage({ filePath: '/test.ts' }),
138
+ createProgressMessage({ label: 'Processing' }),
139
+ createLoadingMessage({ content: 'Loading...' }),
140
+ createLogMessage({ level: 'log', content: 'Log message' }),
141
+ ]
142
+
143
+ const filter = createFilterState({
144
+ enabledLevels: new Set(['error'] as LogLevel[]), // Would exclude log
145
+ })
146
+ const result = FilterEngine.filterMessages(messages, filter)
147
+
148
+ // Non-log messages should pass through
149
+ expect(result.filter((m) => m.type === 'file')).toHaveLength(1)
150
+ expect(result.filter((m) => m.type === 'progress')).toHaveLength(1)
151
+ expect(result.filter((m) => m.type === 'loading')).toHaveLength(1)
152
+ // Log message should be filtered out
153
+ expect(result.filter((m) => m.type === 'log')).toHaveLength(0)
154
+ })
155
+
156
+ it('should perform case-insensitive search', () => {
157
+ const messages: MessageData[] = [
158
+ createLogMessage({ content: 'HELLO WORLD' }),
159
+ createLogMessage({ content: 'hello world' }),
160
+ createLogMessage({ content: 'Hello World' }),
161
+ ]
162
+
163
+ const filter = createFilterState({
164
+ searchQuery: 'hello',
165
+ })
166
+ const result = FilterEngine.filterMessages(messages, filter)
167
+
168
+ expect(result).toHaveLength(3)
169
+ })
170
+
171
+ it('should search file message path and content', () => {
172
+ const messages: MessageData[] = [
173
+ createFileMessage({ filePath: '/src/api.ts', content: 'const x = 1' }),
174
+ createFileMessage({ filePath: '/src/db.ts', content: 'const api = 2' }),
175
+ createFileMessage({ filePath: '/src/utils.ts', content: 'const y = 3' }),
176
+ ]
177
+
178
+ const filter = createFilterState({
179
+ searchQuery: 'api',
180
+ })
181
+ const result = FilterEngine.filterMessages(messages, filter)
182
+
183
+ expect(result).toHaveLength(2)
184
+ })
185
+
186
+ it('should search diff message path and diff content', () => {
187
+ const messages: MessageData[] = [
188
+ createDiffMessage({ filePath: '/src/api.ts', diff: '- old\n+ new' }),
189
+ createDiffMessage({ filePath: '/src/db.ts', diff: '- removed\n+ added api call' }),
190
+ createDiffMessage({ filePath: '/src/utils.ts', diff: '- x\n+ y' }),
191
+ ]
192
+
193
+ const filter = createFilterState({
194
+ searchQuery: 'api',
195
+ })
196
+ const result = FilterEngine.filterMessages(messages, filter)
197
+
198
+ expect(result).toHaveLength(2)
199
+ })
200
+
201
+ it('should search loading message content and resolved content', () => {
202
+ const messages: MessageData[] = [
203
+ createLoadingMessage({ content: 'Loading data...', resolvedContent: 'Done!' }),
204
+ createLoadingMessage({ content: 'Saving...', resolvedContent: 'Data saved!' }),
205
+ createLoadingMessage({ content: 'Processing...', resolvedContent: undefined }),
206
+ ]
207
+
208
+ const filter = createFilterState({
209
+ searchQuery: 'data',
210
+ })
211
+ const result = FilterEngine.filterMessages(messages, filter)
212
+
213
+ expect(result).toHaveLength(2)
214
+ })
215
+
216
+ it('should search progress message label', () => {
217
+ const messages: MessageData[] = [
218
+ createProgressMessage({ label: 'Downloading files' }),
219
+ createProgressMessage({ label: 'Uploading data' }),
220
+ createProgressMessage({ label: 'Processing' }),
221
+ ]
222
+
223
+ const filter = createFilterState({
224
+ searchQuery: 'load',
225
+ })
226
+ const result = FilterEngine.filterMessages(messages, filter)
227
+
228
+ expect(result).toHaveLength(2) // Downloading and Uploading
229
+ })
230
+
231
+ it('should search group message label', () => {
232
+ const messages: MessageData[] = [
233
+ createGroupMessage({ label: 'API Calls', isEnd: false }),
234
+ createGroupMessage({ label: 'Database Operations', isEnd: false }),
235
+ ]
236
+
237
+ const filter = createFilterState({
238
+ searchQuery: 'API',
239
+ })
240
+ const result = FilterEngine.filterMessages(messages, filter)
241
+
242
+ expect(result).toHaveLength(1)
243
+ })
244
+
245
+ it('should search table title, headers, and cell content', () => {
246
+ const messages: MessageData[] = [
247
+ createTableMessage({
248
+ title: 'User Data',
249
+ headers: ['Name', 'Email'],
250
+ rows: [['John', 'john@example.com']],
251
+ }),
252
+ createTableMessage({
253
+ title: 'Products',
254
+ headers: ['SKU', 'Price'],
255
+ rows: [['ABC123', '99.99']],
256
+ }),
257
+ createTableMessage({
258
+ headers: ['ID', 'Value'],
259
+ rows: [['1', 'test']],
260
+ }),
261
+ ]
262
+
263
+ // Search by title
264
+ let filter = createFilterState({ searchQuery: 'User' })
265
+ expect(FilterEngine.filterMessages(messages, filter)).toHaveLength(1)
266
+
267
+ // Search by header
268
+ filter = createFilterState({ searchQuery: 'Email' })
269
+ expect(FilterEngine.filterMessages(messages, filter)).toHaveLength(1)
270
+
271
+ // Search by cell content
272
+ filter = createFilterState({ searchQuery: 'john@' })
273
+ expect(FilterEngine.filterMessages(messages, filter)).toHaveLength(1)
274
+ })
275
+ })
276
+
277
+ describe('countByLevel', () => {
278
+ it('should count messages by log level', () => {
279
+ const messages: MessageData[] = [
280
+ createLogMessage({ level: 'log' }),
281
+ createLogMessage({ level: 'log' }),
282
+ createLogMessage({ level: 'error' }),
283
+ createLogMessage({ level: 'warn' }),
284
+ createLogMessage({ level: 'warn' }),
285
+ createLogMessage({ level: 'warn' }),
286
+ ]
287
+
288
+ const counts = FilterEngine.countByLevel(messages)
289
+
290
+ expect(counts.log).toBe(2)
291
+ expect(counts.error).toBe(1)
292
+ expect(counts.warn).toBe(3)
293
+ expect(counts.debug).toBe(0)
294
+ expect(counts.verbose).toBe(0)
295
+ expect(counts.fatal).toBe(0)
296
+ })
297
+
298
+ it('should ignore non-log messages', () => {
299
+ const messages: MessageData[] = [
300
+ createLogMessage({ level: 'log' }),
301
+ createFileMessage(),
302
+ createProgressMessage(),
303
+ createLoadingMessage(),
304
+ createGroupMessage(),
305
+ createTableMessage(),
306
+ ]
307
+
308
+ const counts = FilterEngine.countByLevel(messages)
309
+
310
+ expect(counts.log).toBe(1)
311
+ expect(counts.error).toBe(0)
312
+ })
313
+
314
+ it('should return zero counts for empty array', () => {
315
+ const counts = FilterEngine.countByLevel([])
316
+
317
+ expect(counts.log).toBe(0)
318
+ expect(counts.error).toBe(0)
319
+ expect(counts.warn).toBe(0)
320
+ expect(counts.debug).toBe(0)
321
+ expect(counts.verbose).toBe(0)
322
+ expect(counts.fatal).toBe(0)
323
+ })
324
+ })
325
+ })