@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,411 @@
1
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest'
2
+ import { TestContainer } from '@navios/core/testing'
3
+
4
+ import { PromptInstance } from '../../services/prompt.ts'
5
+ import { Screen } from '../../tokens/index.ts'
6
+ import { createMockScreenInstance } from '../utils/factories.ts'
7
+
8
+ import type { MockScreenInstance } from '../utils/factories.ts'
9
+
10
+ describe('PromptInstance', () => {
11
+ let container: TestContainer
12
+ let mockScreen: MockScreenInstance
13
+
14
+ beforeEach(() => {
15
+ container = new TestContainer()
16
+ mockScreen = createMockScreenInstance()
17
+ container.bind(Screen).toValue(mockScreen)
18
+ })
19
+
20
+ afterEach(async () => {
21
+ await container.dispose()
22
+ })
23
+
24
+ async function createPrompt() {
25
+ return container.get(PromptInstance, { screen: 'test' })
26
+ }
27
+
28
+ describe('choice', () => {
29
+ it('should create ChoicePromptData with correct structure', async () => {
30
+ const prompt = await createPrompt()
31
+
32
+ prompt.choice({
33
+ question: 'Select an option',
34
+ choices: [
35
+ { label: 'Option A', value: 'a' },
36
+ { label: 'Option B', value: 'b' },
37
+ ],
38
+ })
39
+
40
+ expect(mockScreen._addPrompt).toHaveBeenCalledWith(
41
+ expect.objectContaining({
42
+ type: 'choice',
43
+ question: 'Select an option',
44
+ choices: [
45
+ { label: 'Option A', value: 'a' },
46
+ { label: 'Option B', value: 'b' },
47
+ ],
48
+ inputMode: false,
49
+ inputValue: '',
50
+ resolved: false,
51
+ }),
52
+ )
53
+ })
54
+
55
+ it('should set defaultChoice and selectedIndex', async () => {
56
+ const prompt = await createPrompt()
57
+
58
+ prompt.choice({
59
+ question: 'Select',
60
+ choices: [
61
+ { label: 'A', value: 'a' },
62
+ { label: 'B', value: 'b' },
63
+ { label: 'C', value: 'c' },
64
+ ],
65
+ defaultChoice: 'b',
66
+ })
67
+
68
+ expect(mockScreen._addPrompt).toHaveBeenCalledWith(
69
+ expect.objectContaining({
70
+ defaultChoice: 'b',
71
+ selectedIndex: 1,
72
+ }),
73
+ )
74
+ })
75
+
76
+ it('should default selectedIndex to 0 if defaultChoice not found', async () => {
77
+ const prompt = await createPrompt()
78
+
79
+ prompt.choice({
80
+ question: 'Select',
81
+ choices: [
82
+ { label: 'A', value: 'a' },
83
+ { label: 'B', value: 'b' },
84
+ ],
85
+ defaultChoice: 'nonexistent',
86
+ })
87
+
88
+ expect(mockScreen._addPrompt).toHaveBeenCalledWith(
89
+ expect.objectContaining({
90
+ selectedIndex: 0,
91
+ }),
92
+ )
93
+ })
94
+
95
+ it('should include timeout when provided', async () => {
96
+ const prompt = await createPrompt()
97
+
98
+ prompt.choice({
99
+ question: 'Select',
100
+ choices: [{ label: 'A', value: 'a' }],
101
+ timeout: 5000,
102
+ })
103
+
104
+ expect(mockScreen._addPrompt).toHaveBeenCalledWith(
105
+ expect.objectContaining({
106
+ timeout: 5000,
107
+ timeoutStarted: expect.any(Number),
108
+ }),
109
+ )
110
+ })
111
+
112
+ it('should return Promise from screen._addPrompt', async () => {
113
+ mockScreen._addPrompt.mockResolvedValue('selected')
114
+ const prompt = await createPrompt()
115
+
116
+ const result = await prompt.choice({
117
+ question: 'Select',
118
+ choices: [{ label: 'A', value: 'a' }],
119
+ })
120
+
121
+ expect(result).toBe('selected')
122
+ })
123
+ })
124
+
125
+ describe('confirm', () => {
126
+ it('should create ConfirmPromptData with defaults', async () => {
127
+ const prompt = await createPrompt()
128
+
129
+ prompt.confirm({
130
+ question: 'Are you sure?',
131
+ })
132
+
133
+ expect(mockScreen._addPrompt).toHaveBeenCalledWith(
134
+ expect.objectContaining({
135
+ type: 'confirm',
136
+ question: 'Are you sure?',
137
+ confirmText: 'Yes',
138
+ cancelText: 'No',
139
+ defaultValue: true,
140
+ selectedValue: true,
141
+ resolved: false,
142
+ }),
143
+ )
144
+ })
145
+
146
+ it('should use custom confirmText and cancelText', async () => {
147
+ const prompt = await createPrompt()
148
+
149
+ prompt.confirm({
150
+ question: 'Delete file?',
151
+ confirmText: 'Delete',
152
+ cancelText: 'Keep',
153
+ })
154
+
155
+ expect(mockScreen._addPrompt).toHaveBeenCalledWith(
156
+ expect.objectContaining({
157
+ confirmText: 'Delete',
158
+ cancelText: 'Keep',
159
+ }),
160
+ )
161
+ })
162
+
163
+ it('should respect defaultValue', async () => {
164
+ const prompt = await createPrompt()
165
+
166
+ prompt.confirm({
167
+ question: 'Confirm?',
168
+ defaultValue: false,
169
+ })
170
+
171
+ expect(mockScreen._addPrompt).toHaveBeenCalledWith(
172
+ expect.objectContaining({
173
+ defaultValue: false,
174
+ selectedValue: false,
175
+ }),
176
+ )
177
+ })
178
+
179
+ it('should include timeout when provided', async () => {
180
+ const prompt = await createPrompt()
181
+
182
+ prompt.confirm({
183
+ question: 'Confirm?',
184
+ timeout: 10000,
185
+ })
186
+
187
+ expect(mockScreen._addPrompt).toHaveBeenCalledWith(
188
+ expect.objectContaining({
189
+ timeout: 10000,
190
+ timeoutStarted: expect.any(Number),
191
+ }),
192
+ )
193
+ })
194
+
195
+ it('should return Promise<boolean>', async () => {
196
+ mockScreen._addPrompt.mockResolvedValue(false)
197
+ const prompt = await createPrompt()
198
+
199
+ const result = await prompt.confirm({
200
+ question: 'Confirm?',
201
+ })
202
+
203
+ expect(result).toBe(false)
204
+ })
205
+ })
206
+
207
+ describe('input', () => {
208
+ it('should create InputPromptData with placeholder and defaultValue', async () => {
209
+ const prompt = await createPrompt()
210
+
211
+ prompt.input({
212
+ question: 'Enter your name',
213
+ placeholder: 'John Doe',
214
+ defaultValue: 'Anonymous',
215
+ })
216
+
217
+ expect(mockScreen._addPrompt).toHaveBeenCalledWith(
218
+ expect.objectContaining({
219
+ type: 'input',
220
+ question: 'Enter your name',
221
+ placeholder: 'John Doe',
222
+ defaultValue: 'Anonymous',
223
+ value: 'Anonymous',
224
+ resolved: false,
225
+ }),
226
+ )
227
+ })
228
+
229
+ it('should use empty string defaults', async () => {
230
+ const prompt = await createPrompt()
231
+
232
+ prompt.input({
233
+ question: 'Enter value',
234
+ })
235
+
236
+ expect(mockScreen._addPrompt).toHaveBeenCalledWith(
237
+ expect.objectContaining({
238
+ placeholder: '',
239
+ defaultValue: '',
240
+ value: '',
241
+ }),
242
+ )
243
+ })
244
+
245
+ it('should include timeout when provided', async () => {
246
+ const prompt = await createPrompt()
247
+
248
+ prompt.input({
249
+ question: 'Enter',
250
+ timeout: 30000,
251
+ })
252
+
253
+ expect(mockScreen._addPrompt).toHaveBeenCalledWith(
254
+ expect.objectContaining({
255
+ timeout: 30000,
256
+ timeoutStarted: expect.any(Number),
257
+ }),
258
+ )
259
+ })
260
+
261
+ it('should return Promise<string>', async () => {
262
+ mockScreen._addPrompt.mockResolvedValue('entered text')
263
+ const prompt = await createPrompt()
264
+
265
+ const result = await prompt.input({
266
+ question: 'Enter',
267
+ })
268
+
269
+ expect(result).toBe('entered text')
270
+ })
271
+ })
272
+
273
+ describe('multiChoice', () => {
274
+ it('should create MultiChoicePromptData', async () => {
275
+ const prompt = await createPrompt()
276
+
277
+ prompt.multiChoice({
278
+ question: 'Select options',
279
+ choices: [
280
+ { label: 'A', value: 'a' },
281
+ { label: 'B', value: 'b' },
282
+ { label: 'C', value: 'c' },
283
+ ],
284
+ })
285
+
286
+ expect(mockScreen._addPrompt).toHaveBeenCalledWith(
287
+ expect.objectContaining({
288
+ type: 'multiChoice',
289
+ question: 'Select options',
290
+ choices: [
291
+ { label: 'A', value: 'a' },
292
+ { label: 'B', value: 'b' },
293
+ { label: 'C', value: 'c' },
294
+ ],
295
+ focusedIndex: 0,
296
+ resolved: false,
297
+ }),
298
+ )
299
+ })
300
+
301
+ it('should set defaultChoices as selectedIndices', async () => {
302
+ const prompt = await createPrompt()
303
+
304
+ prompt.multiChoice({
305
+ question: 'Select',
306
+ choices: [
307
+ { label: 'A', value: 'a' },
308
+ { label: 'B', value: 'b' },
309
+ { label: 'C', value: 'c' },
310
+ ],
311
+ defaultChoices: ['a', 'c'],
312
+ })
313
+
314
+ const call = mockScreen._addPrompt.mock.calls[0][0]
315
+ expect(call.selectedIndices.has(0)).toBe(true)
316
+ expect(call.selectedIndices.has(1)).toBe(false)
317
+ expect(call.selectedIndices.has(2)).toBe(true)
318
+ })
319
+
320
+ it('should respect minSelect and maxSelect', async () => {
321
+ const prompt = await createPrompt()
322
+
323
+ prompt.multiChoice({
324
+ question: 'Select 2-3 options',
325
+ choices: [
326
+ { label: 'A', value: 'a' },
327
+ { label: 'B', value: 'b' },
328
+ { label: 'C', value: 'c' },
329
+ { label: 'D', value: 'd' },
330
+ ],
331
+ minSelect: 2,
332
+ maxSelect: 3,
333
+ })
334
+
335
+ expect(mockScreen._addPrompt).toHaveBeenCalledWith(
336
+ expect.objectContaining({
337
+ minSelect: 2,
338
+ maxSelect: 3,
339
+ }),
340
+ )
341
+ })
342
+
343
+ it('should default minSelect to 0 and maxSelect to choices length', async () => {
344
+ const prompt = await createPrompt()
345
+
346
+ prompt.multiChoice({
347
+ question: 'Select',
348
+ choices: [
349
+ { label: 'A', value: 'a' },
350
+ { label: 'B', value: 'b' },
351
+ ],
352
+ })
353
+
354
+ expect(mockScreen._addPrompt).toHaveBeenCalledWith(
355
+ expect.objectContaining({
356
+ minSelect: 0,
357
+ maxSelect: 2,
358
+ }),
359
+ )
360
+ })
361
+
362
+ it('should include timeout when provided', async () => {
363
+ const prompt = await createPrompt()
364
+
365
+ prompt.multiChoice({
366
+ question: 'Select',
367
+ choices: [{ label: 'A', value: 'a' }],
368
+ timeout: 15000,
369
+ })
370
+
371
+ expect(mockScreen._addPrompt).toHaveBeenCalledWith(
372
+ expect.objectContaining({
373
+ timeout: 15000,
374
+ timeoutStarted: expect.any(Number),
375
+ }),
376
+ )
377
+ })
378
+
379
+ it('should return Promise<string[]>', async () => {
380
+ mockScreen._addPrompt.mockResolvedValue(['a', 'c'])
381
+ const prompt = await createPrompt()
382
+
383
+ const result = await prompt.multiChoice({
384
+ question: 'Select',
385
+ choices: [
386
+ { label: 'A', value: 'a' },
387
+ { label: 'B', value: 'b' },
388
+ { label: 'C', value: 'c' },
389
+ ],
390
+ })
391
+
392
+ expect(result).toEqual(['a', 'c'])
393
+ })
394
+
395
+ it('should ignore invalid defaultChoices', async () => {
396
+ const prompt = await createPrompt()
397
+
398
+ prompt.multiChoice({
399
+ question: 'Select',
400
+ choices: [
401
+ { label: 'A', value: 'a' },
402
+ { label: 'B', value: 'b' },
403
+ ],
404
+ defaultChoices: ['a', 'nonexistent', 'b'],
405
+ })
406
+
407
+ const call = mockScreen._addPrompt.mock.calls[0][0]
408
+ expect(call.selectedIndices.size).toBe(2) // Only 'a' and 'b'
409
+ })
410
+ })
411
+ })