termcast 1.3.9 → 1.3.16

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 (559) hide show
  1. package/dist/action-utils.js +1 -1
  2. package/dist/action-utils.js.map +1 -1
  3. package/dist/apis/ai.js +1 -1
  4. package/dist/apis/ai.js.map +1 -1
  5. package/dist/apis/clipboard.js +2 -2
  6. package/dist/apis/clipboard.js.map +1 -1
  7. package/dist/apis/hud.d.ts +2 -2
  8. package/dist/apis/hud.d.ts.map +1 -1
  9. package/dist/apis/hud.js +5 -5
  10. package/dist/apis/hud.js.map +1 -1
  11. package/dist/apis/oauth.d.ts +1 -1
  12. package/dist/apis/oauth.d.ts.map +1 -1
  13. package/dist/apis/oauth.js +8 -8
  14. package/dist/apis/oauth.js.map +1 -1
  15. package/dist/apis/preferences.js +4 -4
  16. package/dist/apis/preferences.js.map +1 -1
  17. package/dist/apis/toast.d.ts +1 -5
  18. package/dist/apis/toast.d.ts.map +1 -1
  19. package/dist/apis/toast.js +26 -20
  20. package/dist/apis/toast.js.map +1 -1
  21. package/dist/build.d.ts +2 -0
  22. package/dist/build.d.ts.map +1 -1
  23. package/dist/build.js +9 -8
  24. package/dist/build.js.map +1 -1
  25. package/dist/cli.js +44 -2
  26. package/dist/cli.js.map +1 -1
  27. package/dist/colors.d.ts +8 -1
  28. package/dist/colors.d.ts.map +1 -1
  29. package/dist/colors.js +12 -0
  30. package/dist/colors.js.map +1 -1
  31. package/dist/compile.d.ts +30 -0
  32. package/dist/compile.d.ts.map +1 -0
  33. package/dist/compile.js +156 -0
  34. package/dist/compile.js.map +1 -0
  35. package/dist/components/actions.d.ts +2 -1
  36. package/dist/components/actions.d.ts.map +1 -1
  37. package/dist/components/actions.js +11 -8
  38. package/dist/components/actions.js.map +1 -1
  39. package/dist/components/alert.js +4 -4
  40. package/dist/components/alert.js.map +1 -1
  41. package/dist/components/command-arguments.d.ts +9 -0
  42. package/dist/components/command-arguments.d.ts.map +1 -0
  43. package/dist/components/command-arguments.js +21 -0
  44. package/dist/components/command-arguments.js.map +1 -0
  45. package/dist/components/detail.d.ts +3 -3
  46. package/dist/components/detail.d.ts.map +1 -1
  47. package/dist/components/detail.js +20 -42
  48. package/dist/components/detail.js.map +1 -1
  49. package/dist/components/dropdown.d.ts +2 -1
  50. package/dist/components/dropdown.d.ts.map +1 -1
  51. package/dist/components/dropdown.js +81 -25
  52. package/dist/components/dropdown.js.map +1 -1
  53. package/dist/components/extension-preferences.d.ts.map +1 -1
  54. package/dist/components/extension-preferences.js +23 -33
  55. package/dist/components/extension-preferences.js.map +1 -1
  56. package/dist/components/form/checkbox.d.ts.map +1 -1
  57. package/dist/components/form/checkbox.js +11 -4
  58. package/dist/components/form/checkbox.js.map +1 -1
  59. package/dist/components/form/date-picker.d.ts.map +1 -1
  60. package/dist/components/form/date-picker.js +18 -31
  61. package/dist/components/form/date-picker.js.map +1 -1
  62. package/dist/components/form/description.d.ts +2 -0
  63. package/dist/components/form/description.d.ts.map +1 -1
  64. package/dist/components/form/description.js +21 -3
  65. package/dist/components/form/description.js.map +1 -1
  66. package/dist/components/form/dropdown.d.ts.map +1 -1
  67. package/dist/components/form/dropdown.js +17 -32
  68. package/dist/components/form/dropdown.js.map +1 -1
  69. package/dist/components/form/file-autocomplete.d.ts +7 -4
  70. package/dist/components/form/file-autocomplete.d.ts.map +1 -1
  71. package/dist/components/form/file-autocomplete.js +56 -48
  72. package/dist/components/form/file-autocomplete.js.map +1 -1
  73. package/dist/components/form/file-picker.d.ts +5 -0
  74. package/dist/components/form/file-picker.d.ts.map +1 -1
  75. package/dist/components/form/file-picker.js +48 -51
  76. package/dist/components/form/file-picker.js.map +1 -1
  77. package/dist/components/form/form-end.js +1 -1
  78. package/dist/components/form/form-end.js.map +1 -1
  79. package/dist/components/form/form-ref.d.ts +43 -0
  80. package/dist/components/form/form-ref.d.ts.map +1 -0
  81. package/dist/components/form/form-ref.js +53 -0
  82. package/dist/components/form/form-ref.js.map +1 -0
  83. package/dist/components/form/index.d.ts +16 -0
  84. package/dist/components/form/index.d.ts.map +1 -1
  85. package/dist/components/form/index.js +90 -27
  86. package/dist/components/form/index.js.map +1 -1
  87. package/dist/components/form/password-field.d.ts.map +1 -1
  88. package/dist/components/form/password-field.js +33 -17
  89. package/dist/components/form/password-field.js.map +1 -1
  90. package/dist/components/form/separator.js +1 -1
  91. package/dist/components/form/separator.js.map +1 -1
  92. package/dist/components/form/tagpicker.d.ts +1 -1
  93. package/dist/components/form/tagpicker.d.ts.map +1 -1
  94. package/dist/components/form/text-area.d.ts.map +1 -1
  95. package/dist/components/form/text-area.js +33 -16
  96. package/dist/components/form/text-area.js.map +1 -1
  97. package/dist/components/form/text-field.d.ts.map +1 -1
  98. package/dist/components/form/text-field.js +38 -18
  99. package/dist/components/form/text-field.js.map +1 -1
  100. package/dist/components/form/use-form-navigation.d.ts +4 -0
  101. package/dist/components/form/use-form-navigation.d.ts.map +1 -1
  102. package/dist/components/form/use-form-navigation.js +35 -18
  103. package/dist/components/form/use-form-navigation.js.map +1 -1
  104. package/dist/components/form/with-left-border.d.ts.map +1 -1
  105. package/dist/components/form/with-left-border.js +3 -3
  106. package/dist/components/form/with-left-border.js.map +1 -1
  107. package/dist/components/icon.d.ts +3 -1
  108. package/dist/components/icon.d.ts.map +1 -1
  109. package/dist/components/icon.js +494 -469
  110. package/dist/components/icon.js.map +1 -1
  111. package/dist/components/image.js +1 -1
  112. package/dist/components/image.js.map +1 -1
  113. package/dist/components/list.d.ts +12 -8
  114. package/dist/components/list.d.ts.map +1 -1
  115. package/dist/components/list.js +172 -40
  116. package/dist/components/list.js.map +1 -1
  117. package/dist/components/loading-bar.js +2 -2
  118. package/dist/components/loading-bar.js.map +1 -1
  119. package/dist/components/menubar-extra.d.ts +1 -1
  120. package/dist/components/menubar-extra.d.ts.map +1 -1
  121. package/dist/components/menubar-extra.js +2 -2
  122. package/dist/components/menubar-extra.js.map +1 -1
  123. package/dist/descendants.d.ts.map +1 -1
  124. package/dist/descendants.js +8 -5
  125. package/dist/descendants.js.map +1 -1
  126. package/dist/e2e-node.d.ts +2 -0
  127. package/dist/e2e-node.d.ts.map +1 -1
  128. package/dist/e2e-node.js +14 -0
  129. package/dist/e2e-node.js.map +1 -1
  130. package/dist/examples/action-show-in-finder.js +3 -3
  131. package/dist/examples/action-show-in-finder.js.map +1 -1
  132. package/dist/examples/environment-test.js +4 -4
  133. package/dist/examples/environment-test.js.map +1 -1
  134. package/dist/examples/error-boundary.js +5 -5
  135. package/dist/examples/error-boundary.js.map +1 -1
  136. package/dist/examples/form-basic.d.ts.map +1 -1
  137. package/dist/examples/form-basic.js +6 -6
  138. package/dist/examples/form-basic.js.map +1 -1
  139. package/dist/examples/form-dropdown.js +3 -3
  140. package/dist/examples/form-dropdown.js.map +1 -1
  141. package/dist/examples/form-scroll.d.ts +2 -0
  142. package/dist/examples/form-scroll.d.ts.map +1 -0
  143. package/dist/examples/form-scroll.js +8 -0
  144. package/dist/examples/form-scroll.js.map +1 -0
  145. package/dist/examples/form-tagpicker.js +3 -3
  146. package/dist/examples/form-tagpicker.js.map +1 -1
  147. package/dist/examples/internal/descendants-filtering.js +10 -5
  148. package/dist/examples/internal/descendants-filtering.js.map +1 -1
  149. package/dist/examples/internal/descendants.js +13 -6
  150. package/dist/examples/internal/descendants.js.map +1 -1
  151. package/dist/examples/internal/rhf-custom-ref.d.ts +2 -0
  152. package/dist/examples/internal/rhf-custom-ref.d.ts.map +1 -0
  153. package/dist/examples/internal/rhf-custom-ref.js +67 -0
  154. package/dist/examples/internal/rhf-custom-ref.js.map +1 -0
  155. package/dist/examples/internal/scrollbox-demo.js +4 -8
  156. package/dist/examples/internal/scrollbox-demo.js.map +1 -1
  157. package/dist/examples/internal/scrollbox-with-descendants.d.ts +2 -0
  158. package/dist/examples/internal/scrollbox-with-descendants.d.ts.map +1 -0
  159. package/dist/examples/internal/scrollbox-with-descendants.js +63 -0
  160. package/dist/examples/internal/scrollbox-with-descendants.js.map +1 -0
  161. package/dist/examples/internal/simple-dialog.js +7 -7
  162. package/dist/examples/internal/simple-dialog.js.map +1 -1
  163. package/dist/examples/internal/simple-scrollbox.d.ts +2 -0
  164. package/dist/examples/internal/simple-scrollbox.d.ts.map +1 -0
  165. package/dist/examples/internal/simple-scrollbox.js +25 -0
  166. package/dist/examples/internal/simple-scrollbox.js.map +1 -0
  167. package/dist/examples/internal/text-stacking.js +4 -2
  168. package/dist/examples/internal/text-stacking.js.map +1 -1
  169. package/dist/examples/list-dropdown-default.js +3 -3
  170. package/dist/examples/list-dropdown-default.js.map +1 -1
  171. package/dist/examples/list-fetch-data.js +3 -3
  172. package/dist/examples/list-fetch-data.js.map +1 -1
  173. package/dist/examples/list-scrollbox.d.ts +2 -0
  174. package/dist/examples/list-scrollbox.d.ts.map +1 -0
  175. package/dist/examples/list-scrollbox.js +29 -0
  176. package/dist/examples/list-scrollbox.js.map +1 -0
  177. package/dist/examples/list-with-detail.js +2 -2
  178. package/dist/examples/list-with-detail.js.map +1 -1
  179. package/dist/examples/list-with-dropdown.js +2 -2
  180. package/dist/examples/list-with-dropdown.js.map +1 -1
  181. package/dist/examples/list-with-sections.js +6 -6
  182. package/dist/examples/list-with-sections.js.map +1 -1
  183. package/dist/examples/miscellaneous.js +14 -14
  184. package/dist/examples/miscellaneous.js.map +1 -1
  185. package/dist/examples/nested-navigation.js +9 -7
  186. package/dist/examples/nested-navigation.js.map +1 -1
  187. package/dist/examples/preferences-test.js +4 -4
  188. package/dist/examples/preferences-test.js.map +1 -1
  189. package/dist/examples/simple-dropdown.js +4 -4
  190. package/dist/examples/simple-dropdown.js.map +1 -1
  191. package/dist/examples/simple-file-picker.js +3 -3
  192. package/dist/examples/simple-file-picker.js.map +1 -1
  193. package/dist/examples/simple-grid.js +2 -2
  194. package/dist/examples/simple-grid.js.map +1 -1
  195. package/dist/examples/simple-hud.js +4 -4
  196. package/dist/examples/simple-hud.js.map +1 -1
  197. package/dist/examples/simple-list-search.js +21 -5
  198. package/dist/examples/simple-list-search.js.map +1 -1
  199. package/dist/examples/simple-list.js +4 -4
  200. package/dist/examples/simple-list.js.map +1 -1
  201. package/dist/examples/simple-navigation.js +9 -7
  202. package/dist/examples/simple-navigation.js.map +1 -1
  203. package/dist/examples/store.js +1 -1
  204. package/dist/examples/store.js.map +1 -1
  205. package/dist/examples/submodule-diff.d.ts +2 -0
  206. package/dist/examples/submodule-diff.d.ts.map +1 -0
  207. package/dist/examples/submodule-diff.js +99 -0
  208. package/dist/examples/submodule-diff.js.map +1 -0
  209. package/dist/examples/tanstack-demo.js +3 -3
  210. package/dist/examples/tanstack-demo.js.map +1 -1
  211. package/dist/examples/use-promise-demo.js +3 -3
  212. package/dist/examples/use-promise-demo.js.map +1 -1
  213. package/dist/extensions/dev.d.ts +8 -0
  214. package/dist/extensions/dev.d.ts.map +1 -1
  215. package/dist/extensions/dev.js +60 -35
  216. package/dist/extensions/dev.js.map +1 -1
  217. package/dist/extensions/home.d.ts.map +1 -1
  218. package/dist/extensions/home.js +22 -97
  219. package/dist/extensions/home.js.map +1 -1
  220. package/dist/extensions/store.js +2 -2
  221. package/dist/extensions/store.js.map +1 -1
  222. package/dist/globals.js +1 -1
  223. package/dist/globals.js.map +1 -1
  224. package/dist/hooks/index.d.ts +1 -1
  225. package/dist/hooks/index.d.ts.map +1 -1
  226. package/dist/hooks/index.js +1 -1
  227. package/dist/hooks/index.js.map +1 -1
  228. package/dist/hooks/use-action-panel.js +1 -1
  229. package/dist/hooks/use-action-panel.js.map +1 -1
  230. package/dist/hooks/use-unstable-ai.js +1 -1
  231. package/dist/hooks/use-unstable-ai.js.map +1 -1
  232. package/dist/index.d.ts +57 -55
  233. package/dist/index.d.ts.map +1 -1
  234. package/dist/index.js +42 -38
  235. package/dist/index.js.map +1 -1
  236. package/dist/internal/date-picker-widget.d.ts.map +1 -1
  237. package/dist/internal/date-picker-widget.js +56 -48
  238. package/dist/internal/date-picker-widget.js.map +1 -1
  239. package/dist/internal/dialog.d.ts +3 -3
  240. package/dist/internal/dialog.d.ts.map +1 -1
  241. package/dist/internal/dialog.js +10 -10
  242. package/dist/internal/dialog.js.map +1 -1
  243. package/dist/internal/error-handler.js +2 -2
  244. package/dist/internal/error-handler.js.map +1 -1
  245. package/dist/internal/focus-context.d.ts +1 -1
  246. package/dist/internal/focus-context.d.ts.map +1 -1
  247. package/dist/internal/navigation.d.ts +1 -1
  248. package/dist/internal/navigation.d.ts.map +1 -1
  249. package/dist/internal/navigation.js +2 -2
  250. package/dist/internal/navigation.js.map +1 -1
  251. package/dist/internal/providers.d.ts +2 -2
  252. package/dist/internal/providers.d.ts.map +1 -1
  253. package/dist/internal/providers.js +9 -9
  254. package/dist/internal/providers.js.map +1 -1
  255. package/dist/internal/scrollbox.d.ts +12 -0
  256. package/dist/internal/scrollbox.d.ts.map +1 -0
  257. package/dist/internal/scrollbox.js +34 -0
  258. package/dist/internal/scrollbox.js.map +1 -0
  259. package/dist/preload.js +1 -1
  260. package/dist/preload.js.map +1 -1
  261. package/dist/release.d.ts +11 -0
  262. package/dist/release.d.ts.map +1 -0
  263. package/dist/release.js +113 -0
  264. package/dist/release.js.map +1 -0
  265. package/dist/state.d.ts +1 -0
  266. package/dist/state.d.ts.map +1 -1
  267. package/dist/state.js +1 -0
  268. package/dist/state.js.map +1 -1
  269. package/dist/theme.d.ts +11 -8
  270. package/dist/theme.d.ts.map +1 -1
  271. package/dist/theme.js +31 -8
  272. package/dist/theme.js.map +1 -1
  273. package/dist/utils/run-command.d.ts +22 -0
  274. package/dist/utils/run-command.d.ts.map +1 -0
  275. package/dist/utils/run-command.js +127 -0
  276. package/dist/utils/run-command.js.map +1 -0
  277. package/dist/utils.d.ts +1 -1
  278. package/dist/utils.d.ts.map +1 -1
  279. package/dist/utils.js +6 -4
  280. package/dist/utils.js.map +1 -1
  281. package/package.json +13 -8
  282. package/src/apis/toast.tsx +38 -17
  283. package/src/build.tsx +5 -3
  284. package/src/cli.tsx +46 -0
  285. package/src/colors.tsx +22 -1
  286. package/src/compile.tsx +219 -0
  287. package/src/components/actions.tsx +7 -1
  288. package/src/components/command-arguments.tsx +81 -0
  289. package/src/components/detail.tsx +26 -58
  290. package/src/components/dropdown.tsx +108 -23
  291. package/src/components/extension-preferences.tsx +55 -35
  292. package/src/components/form/checkbox.tsx +13 -5
  293. package/src/components/form/date-picker.tsx +24 -29
  294. package/src/components/form/description.tsx +35 -7
  295. package/src/components/form/dropdown.tsx +16 -30
  296. package/src/components/form/file-autocomplete.tsx +87 -77
  297. package/src/components/form/file-picker.tsx +69 -57
  298. package/src/components/form/form-ref.tsx +68 -0
  299. package/src/components/form/index.tsx +152 -41
  300. package/src/components/form/password-field.tsx +35 -22
  301. package/src/components/form/text-area.tsx +78 -58
  302. package/src/components/form/text-field.tsx +82 -61
  303. package/src/components/form/use-form-navigation.tsx +43 -23
  304. package/src/components/form/with-left-border.tsx +2 -1
  305. package/src/components/icon.tsx +497 -469
  306. package/src/components/list.tsx +279 -112
  307. package/src/components/loading-bar.tsx +1 -1
  308. package/src/descendants.tsx +15 -5
  309. package/src/e2e-node.tsx +16 -0
  310. package/src/examples/action-show-in-finder.tsx +1 -1
  311. package/src/examples/environment-test.tsx +1 -1
  312. package/src/examples/error-boundary.tsx +1 -1
  313. package/src/examples/file-autocomplete.vitest.tsx +245 -0
  314. package/src/examples/form-basic.tsx +12 -12
  315. package/src/examples/form-basic.vitest.tsx +297 -671
  316. package/src/examples/form-dropdown.tsx +1 -1
  317. package/src/examples/form-dropdown.vitest.tsx +353 -221
  318. package/src/examples/form-scroll.tsx +56 -0
  319. package/src/examples/form-scroll.vitest.tsx +228 -0
  320. package/src/examples/form-tagpicker.tsx +1 -1
  321. package/src/examples/form-tagpicker.vitest.tsx +438 -193
  322. package/src/examples/internal/descendants-filtering.tsx +13 -5
  323. package/src/examples/internal/descendants.tsx +17 -5
  324. package/src/examples/internal/rhf-custom-ref.tsx +152 -0
  325. package/src/examples/internal/scrollbox-demo.tsx +15 -7
  326. package/src/examples/internal/scrollbox-with-descendants.tsx +94 -0
  327. package/src/examples/internal/simple-dialog.tsx +1 -1
  328. package/src/examples/internal/simple-scrollbox.tsx +58 -0
  329. package/src/examples/internal/simple-scrollbox.vitest.tsx +104 -0
  330. package/src/examples/internal/text-stacking.tsx +4 -2
  331. package/src/examples/list-dropdown-default.tsx +1 -1
  332. package/src/examples/list-dropdown-default.vitest.tsx +136 -71
  333. package/src/examples/list-fetch-data.tsx +1 -1
  334. package/src/examples/list-fetch-data.vitest.tsx +42 -33
  335. package/src/examples/list-scrollbox.tsx +46 -0
  336. package/src/examples/list-scrollbox.vitest.tsx +103 -0
  337. package/src/examples/list-with-detail.tsx +1 -1
  338. package/src/examples/list-with-detail.vitest.tsx +290 -294
  339. package/src/examples/list-with-dropdown.tsx +1 -1
  340. package/src/examples/list-with-dropdown.vitest.tsx +190 -150
  341. package/src/examples/list-with-sections.tsx +12 -1
  342. package/src/examples/list-with-sections.vitest.tsx +390 -218
  343. package/src/examples/miscellaneous.tsx +1 -1
  344. package/src/examples/nested-navigation.tsx +7 -5
  345. package/src/examples/preferences-test.tsx +1 -1
  346. package/src/examples/simple-dropdown.tsx +1 -1
  347. package/src/examples/simple-file-picker.tsx +1 -1
  348. package/src/examples/simple-file-picker.vitest.tsx +533 -127
  349. package/src/examples/simple-grid.tsx +1 -1
  350. package/src/examples/simple-grid.vitest.tsx +258 -234
  351. package/src/examples/simple-hud.tsx +1 -1
  352. package/src/examples/simple-list-search.tsx +42 -1
  353. package/src/examples/simple-list.tsx +1 -1
  354. package/src/examples/simple-navigation.tsx +7 -5
  355. package/src/examples/simple-navigation.vitest.tsx +434 -238
  356. package/src/examples/store.tsx +1 -1
  357. package/src/examples/store.vitest.tsx +31 -14
  358. package/src/examples/submodule-diff.tsx +153 -0
  359. package/src/examples/tanstack-demo.tsx +1 -1
  360. package/src/examples/use-promise-demo.tsx +1 -1
  361. package/src/extensions/dev.tsx +76 -38
  362. package/src/extensions/dev.vitest.tsx +220 -0
  363. package/src/extensions/home.tsx +20 -121
  364. package/src/globals.ts +1 -1
  365. package/src/index.tsx +12 -25
  366. package/src/internal/date-picker-widget.tsx +56 -46
  367. package/src/internal/dialog.tsx +6 -6
  368. package/src/internal/providers.tsx +1 -1
  369. package/src/internal/scrollbox.tsx +63 -0
  370. package/src/release.tsx +159 -0
  371. package/src/state.tsx +2 -0
  372. package/src/store-api/search.test.tsx +4 -13
  373. package/src/theme.tsx +33 -8
  374. package/src/utils/run-command.tsx +204 -0
  375. package/src/utils.tsx +6 -4
  376. package/dist/ai.d.ts +0 -104
  377. package/dist/ai.d.ts.map +0 -1
  378. package/dist/ai.js +0 -135
  379. package/dist/ai.js.map +0 -1
  380. package/dist/apis/cache.test.d.ts +0 -2
  381. package/dist/apis/cache.test.d.ts.map +0 -1
  382. package/dist/apis/cache.test.js +0 -246
  383. package/dist/apis/cache.test.js.map +0 -1
  384. package/dist/apis/localstorage.test.d.ts +0 -2
  385. package/dist/apis/localstorage.test.d.ts.map +0 -1
  386. package/dist/apis/localstorage.test.js +0 -131
  387. package/dist/apis/localstorage.test.js.map +0 -1
  388. package/dist/apis/toast.test.d.ts +0 -2
  389. package/dist/apis/toast.test.d.ts.map +0 -1
  390. package/dist/apis/toast.test.js +0 -67
  391. package/dist/apis/toast.test.js.map +0 -1
  392. package/dist/build.test.d.ts +0 -2
  393. package/dist/build.test.d.ts.map +0 -1
  394. package/dist/build.test.js +0 -73
  395. package/dist/build.test.js.map +0 -1
  396. package/dist/cache.d.ts +0 -32
  397. package/dist/cache.d.ts.map +0 -1
  398. package/dist/cache.js +0 -205
  399. package/dist/cache.js.map +0 -1
  400. package/dist/cache.test.d.ts +0 -2
  401. package/dist/cache.test.d.ts.map +0 -1
  402. package/dist/cache.test.js +0 -246
  403. package/dist/cache.test.js.map +0 -1
  404. package/dist/clipboard.d.ts +0 -36
  405. package/dist/clipboard.d.ts.map +0 -1
  406. package/dist/clipboard.js +0 -154
  407. package/dist/clipboard.js.map +0 -1
  408. package/dist/components/form/form-type-only.d.ts +0 -174
  409. package/dist/components/form/form-type-only.d.ts.map +0 -1
  410. package/dist/components/form/form-type-only.js +0 -2
  411. package/dist/components/form/form-type-only.js.map +0 -1
  412. package/dist/components/form/use-form-handling.d.ts +0 -4
  413. package/dist/components/form/use-form-handling.d.ts.map +0 -1
  414. package/dist/components/form/use-form-handling.js +0 -37
  415. package/dist/components/form/use-form-handling.js.map +0 -1
  416. package/dist/dev-ui.d.ts +0 -7
  417. package/dist/dev-ui.d.ts.map +0 -1
  418. package/dist/dev-ui.js +0 -118
  419. package/dist/dev-ui.js.map +0 -1
  420. package/dist/environment.d.ts +0 -63
  421. package/dist/environment.d.ts.map +0 -1
  422. package/dist/environment.js +0 -189
  423. package/dist/environment.js.map +0 -1
  424. package/dist/examples/datepicker.d.ts +0 -2
  425. package/dist/examples/datepicker.d.ts.map +0 -1
  426. package/dist/examples/datepicker.js +0 -344
  427. package/dist/examples/datepicker.js.map +0 -1
  428. package/dist/examples/form-basic-arrow-keys.vitest.d.ts +0 -2
  429. package/dist/examples/form-basic-arrow-keys.vitest.d.ts.map +0 -1
  430. package/dist/examples/form-basic-arrow-keys.vitest.js +0 -46
  431. package/dist/examples/form-basic-arrow-keys.vitest.js.map +0 -1
  432. package/dist/examples/form-basic.vitest.d.ts +0 -2
  433. package/dist/examples/form-basic.vitest.d.ts.map +0 -1
  434. package/dist/examples/form-basic.vitest.js +0 -995
  435. package/dist/examples/form-basic.vitest.js.map +0 -1
  436. package/dist/examples/form-dropdown-with-sections.d.ts +0 -2
  437. package/dist/examples/form-dropdown-with-sections.d.ts.map +0 -1
  438. package/dist/examples/form-dropdown-with-sections.js +0 -13
  439. package/dist/examples/form-dropdown-with-sections.js.map +0 -1
  440. package/dist/examples/form-dropdown-with-sections.vitest.d.ts +0 -2
  441. package/dist/examples/form-dropdown-with-sections.vitest.d.ts.map +0 -1
  442. package/dist/examples/form-dropdown-with-sections.vitest.js +0 -75
  443. package/dist/examples/form-dropdown-with-sections.vitest.js.map +0 -1
  444. package/dist/examples/form-dropdown.vitest.d.ts +0 -2
  445. package/dist/examples/form-dropdown.vitest.d.ts.map +0 -1
  446. package/dist/examples/form-dropdown.vitest.js +0 -722
  447. package/dist/examples/form-dropdown.vitest.js.map +0 -1
  448. package/dist/examples/form-multiselect-dropdown.d.ts +0 -2
  449. package/dist/examples/form-multiselect-dropdown.d.ts.map +0 -1
  450. package/dist/examples/form-multiselect-dropdown.js +0 -13
  451. package/dist/examples/form-multiselect-dropdown.js.map +0 -1
  452. package/dist/examples/form-tagpicker.vitest.d.ts +0 -2
  453. package/dist/examples/form-tagpicker.vitest.d.ts.map +0 -1
  454. package/dist/examples/form-tagpicker.vitest.js +0 -491
  455. package/dist/examples/form-tagpicker.vitest.js.map +0 -1
  456. package/dist/examples/internal/nested-boxes.d.ts +0 -2
  457. package/dist/examples/internal/nested-boxes.d.ts.map +0 -1
  458. package/dist/examples/internal/nested-boxes.js +0 -7
  459. package/dist/examples/internal/nested-boxes.js.map +0 -1
  460. package/dist/examples/internal/unicode-square-repro.d.ts +0 -2
  461. package/dist/examples/internal/unicode-square-repro.d.ts.map +0 -1
  462. package/dist/examples/internal/unicode-square-repro.js +0 -7
  463. package/dist/examples/internal/unicode-square-repro.js.map +0 -1
  464. package/dist/examples/list-dropdown-default.vitest.d.ts +0 -2
  465. package/dist/examples/list-dropdown-default.vitest.d.ts.map +0 -1
  466. package/dist/examples/list-dropdown-default.vitest.js +0 -164
  467. package/dist/examples/list-dropdown-default.vitest.js.map +0 -1
  468. package/dist/examples/list-fetch-data.vitest.d.ts +0 -2
  469. package/dist/examples/list-fetch-data.vitest.d.ts.map +0 -1
  470. package/dist/examples/list-fetch-data.vitest.js +0 -103
  471. package/dist/examples/list-fetch-data.vitest.js.map +0 -1
  472. package/dist/examples/list-filter-navigation.d.ts +0 -2
  473. package/dist/examples/list-filter-navigation.d.ts.map +0 -1
  474. package/dist/examples/list-filter-navigation.js +0 -8
  475. package/dist/examples/list-filter-navigation.js.map +0 -1
  476. package/dist/examples/list-with-detail.vitest.d.ts +0 -2
  477. package/dist/examples/list-with-detail.vitest.d.ts.map +0 -1
  478. package/dist/examples/list-with-detail.vitest.js +0 -438
  479. package/dist/examples/list-with-detail.vitest.js.map +0 -1
  480. package/dist/examples/list-with-dropdown.vitest.d.ts +0 -2
  481. package/dist/examples/list-with-dropdown.vitest.d.ts.map +0 -1
  482. package/dist/examples/list-with-dropdown.vitest.js +0 -297
  483. package/dist/examples/list-with-dropdown.vitest.js.map +0 -1
  484. package/dist/examples/list-with-sections.vitest.d.ts +0 -2
  485. package/dist/examples/list-with-sections.vitest.d.ts.map +0 -1
  486. package/dist/examples/list-with-sections.vitest.js +0 -441
  487. package/dist/examples/list-with-sections.vitest.js.map +0 -1
  488. package/dist/examples/simple-file-picker.vitest.d.ts +0 -2
  489. package/dist/examples/simple-file-picker.vitest.d.ts.map +0 -1
  490. package/dist/examples/simple-file-picker.vitest.js +0 -277
  491. package/dist/examples/simple-file-picker.vitest.js.map +0 -1
  492. package/dist/examples/simple-grid.vitest.d.ts +0 -2
  493. package/dist/examples/simple-grid.vitest.d.ts.map +0 -1
  494. package/dist/examples/simple-grid.vitest.js +0 -498
  495. package/dist/examples/simple-grid.vitest.js.map +0 -1
  496. package/dist/examples/simple-navigation.vitest.d.ts +0 -2
  497. package/dist/examples/simple-navigation.vitest.d.ts.map +0 -1
  498. package/dist/examples/simple-navigation.vitest.js +0 -522
  499. package/dist/examples/simple-navigation.vitest.js.map +0 -1
  500. package/dist/examples/store.vitest.d.ts +0 -2
  501. package/dist/examples/store.vitest.d.ts.map +0 -1
  502. package/dist/examples/store.vitest.js +0 -52
  503. package/dist/examples/store.vitest.js.map +0 -1
  504. package/dist/home-command.d.ts +0 -8
  505. package/dist/home-command.d.ts.map +0 -1
  506. package/dist/home-command.js +0 -181
  507. package/dist/home-command.js.map +0 -1
  508. package/dist/hooks/hooks.test.d.ts +0 -2
  509. package/dist/hooks/hooks.test.d.ts.map +0 -1
  510. package/dist/hooks/hooks.test.js +0 -37
  511. package/dist/hooks/hooks.test.js.map +0 -1
  512. package/dist/hover-repro.d.ts +0 -2
  513. package/dist/hover-repro.d.ts.map +0 -1
  514. package/dist/hover-repro.js +0 -20
  515. package/dist/hover-repro.js.map +0 -1
  516. package/dist/localstorage.d.ts +0 -13
  517. package/dist/localstorage.d.ts.map +0 -1
  518. package/dist/localstorage.js +0 -190
  519. package/dist/localstorage.js.map +0 -1
  520. package/dist/localstorage.test.d.ts +0 -2
  521. package/dist/localstorage.test.d.ts.map +0 -1
  522. package/dist/localstorage.test.js +0 -131
  523. package/dist/localstorage.test.js.map +0 -1
  524. package/dist/oauth.d.ts +0 -142
  525. package/dist/oauth.d.ts.map +0 -1
  526. package/dist/oauth.js +0 -551
  527. package/dist/oauth.js.map +0 -1
  528. package/dist/preferences.d.ts +0 -23
  529. package/dist/preferences.d.ts.map +0 -1
  530. package/dist/preferences.js +0 -105
  531. package/dist/preferences.js.map +0 -1
  532. package/dist/store-api/download.test.d.ts +0 -2
  533. package/dist/store-api/download.test.d.ts.map +0 -1
  534. package/dist/store-api/download.test.js +0 -36
  535. package/dist/store-api/download.test.js.map +0 -1
  536. package/dist/store-api/extension.test.d.ts +0 -2
  537. package/dist/store-api/extension.test.d.ts.map +0 -1
  538. package/dist/store-api/extension.test.js +0 -22
  539. package/dist/store-api/extension.test.js.map +0 -1
  540. package/dist/store-api/search.test.d.ts +0 -2
  541. package/dist/store-api/search.test.d.ts.map +0 -1
  542. package/dist/store-api/search.test.js +0 -45
  543. package/dist/store-api/search.test.js.map +0 -1
  544. package/dist/store.d.ts +0 -21
  545. package/dist/store.d.ts.map +0 -1
  546. package/dist/store.js +0 -84
  547. package/dist/store.js.map +0 -1
  548. package/dist/toast.d.ts +0 -44
  549. package/dist/toast.d.ts.map +0 -1
  550. package/dist/toast.js +0 -221
  551. package/dist/toast.js.map +0 -1
  552. package/dist/utils.test.d.ts +0 -2
  553. package/dist/utils.test.d.ts.map +0 -1
  554. package/dist/utils.test.js +0 -152
  555. package/dist/utils.test.js.map +0 -1
  556. package/dist/window.d.ts +0 -12
  557. package/dist/window.d.ts.map +0 -1
  558. package/dist/window.js +0 -48
  559. package/dist/window.js.map +0 -1
@@ -1,4 +1,4 @@
1
1
  import Store from '../extensions/store'
2
2
  import { renderWithProviders } from '../utils'
3
3
 
4
- renderWithProviders(<Store />)
4
+ await renderWithProviders(<Store />)
@@ -1,22 +1,24 @@
1
1
  import { test, expect, afterEach, beforeEach } from 'vitest'
2
- import { NodeTuiDriver } from 'termcast/src/e2e-node'
2
+ import { launchTerminal, Session } from 'tuistory/src'
3
3
 
4
- let driver: NodeTuiDriver
4
+ let session: Session
5
5
 
6
- beforeEach(() => {
7
- driver = new NodeTuiDriver('bun', ['src/examples/store.tsx'], {
6
+ beforeEach(async () => {
7
+ session = await launchTerminal({
8
+ command: 'bun',
9
+ args: ['src/examples/store.tsx'],
8
10
  cols: 80,
9
11
  rows: 30,
10
12
  })
11
13
  })
12
14
 
13
15
  afterEach(() => {
14
- driver?.dispose()
16
+ session?.close()
15
17
  })
16
18
 
17
19
  test('Store extension - searching for spiceblow shows Database', async () => {
18
20
  // Wait for store interface to load
19
- const initialOutput = await driver.text({
21
+ const initialOutput = await session.text({
20
22
  waitFor: (text) => {
21
23
  // Wait until we see the store title
22
24
  return text.includes('Store - Install Extensions')
@@ -28,11 +30,11 @@ test('Store extension - searching for spiceblow shows Database', async () => {
28
30
  expect(initialOutput).toContain('Store - Install Extensions')
29
31
 
30
32
  // Type "spiceblow" in the search bar
31
- await driver.keys.type('spiceblow')
33
+ await session.type('spiceblow')
32
34
 
33
35
  // Get the output after search, waiting for Database to appear
34
36
  // This will automatically wait for the API request to complete and results to show
35
- const afterSearchOutput = await driver.text({
37
+ const afterSearchOutput = await session.text({
36
38
  waitFor: (text) => {
37
39
  return text.includes('Search, update, insert')
38
40
  },
@@ -43,17 +45,32 @@ test('Store extension - searching for spiceblow shows Database', async () => {
43
45
  expect(afterSearchOutput).toMatchInlineSnapshot(`
44
46
  "
45
47
 
48
+
46
49
  Store - Install Extensions ───────────────────────────────────────────────
47
50
 
48
51
  spiceblow
49
52
 
50
- ›Spiceblow - Sql Database Management Search, update, insert and delete rows in
51
- Spike Resolve incidents, check who is on-call, and add overrides from Raycast
52
- Image Modification Apply filters and transformations to various image formats
53
- Next Run Spin up a Next.js project from Raycast
54
- Donut Show an animation of a donut
53
+ ›Spiceblow - Sql Database Management Search, update, insert and delete row
54
+
55
+
56
+
57
+
58
+
59
+
60
+
61
+
62
+
63
+
64
+
65
+
66
+
67
+
68
+
69
+
70
+
71
+
55
72
 
56
73
 
57
- ↵ select ↑↓ navigate ^k actions"
74
+ ↵ select ↑↓ navigate ^k actions"
58
75
  `)
59
76
  }, 30000)
@@ -0,0 +1,153 @@
1
+ import { $ } from 'bun'
2
+ import path from 'node:path'
3
+ import React from 'react'
4
+ import { List, Action, ActionPanel, renderWithProviders, Color } from 'termcast'
5
+
6
+ interface FileDiff {
7
+ file: string
8
+ additions: number
9
+ deletions: number
10
+ }
11
+
12
+ interface SubmoduleDiff {
13
+ name: string
14
+ path: string
15
+ files: FileDiff[]
16
+ }
17
+
18
+ async function getSubmodules(): Promise<{ name: string; path: string }[]> {
19
+ const result = await $`git submodule status`.text()
20
+ return result
21
+ .trim()
22
+ .split('\n')
23
+ .filter((line) => {
24
+ return line.trim()
25
+ })
26
+ .map((line) => {
27
+ const parts = line.trim().split(/\s+/)
28
+ const submodulePath = parts[1]
29
+ return {
30
+ name: path.basename(submodulePath),
31
+ path: submodulePath,
32
+ }
33
+ })
34
+ }
35
+
36
+ async function getSubmoduleDiff({ submodulePath }: { submodulePath: string }): Promise<FileDiff[]> {
37
+ try {
38
+ const result = await $`git -C ${submodulePath} diff --numstat`.text()
39
+ if (!result.trim()) {
40
+ return []
41
+ }
42
+ return result
43
+ .trim()
44
+ .split('\n')
45
+ .filter((line) => {
46
+ return line.trim()
47
+ })
48
+ .map((line) => {
49
+ const [additions, deletions, file] = line.split('\t')
50
+ return {
51
+ file,
52
+ additions: additions === '-' ? 0 : parseInt(additions, 10),
53
+ deletions: deletions === '-' ? 0 : parseInt(deletions, 10),
54
+ }
55
+ })
56
+ } catch {
57
+ return []
58
+ }
59
+ }
60
+
61
+ async function loadSubmoduleDiffs(): Promise<SubmoduleDiff[]> {
62
+ const submodules = await getSubmodules()
63
+ const allRepos = [{ name: 'root', path: '.' }, ...submodules]
64
+ const diffs = await Promise.all(
65
+ allRepos.map(async (sub) => {
66
+ const files = await getSubmoduleDiff({ submodulePath: sub.path })
67
+ return {
68
+ name: sub.name,
69
+ path: sub.path,
70
+ files,
71
+ }
72
+ }),
73
+ )
74
+ return diffs.filter((d) => {
75
+ return d.files.length > 0
76
+ })
77
+ }
78
+
79
+ const POLL_INTERVAL_MS = 2000
80
+
81
+ function SubmoduleDiffList(): any {
82
+ const [diffs, setDiffs] = React.useState<SubmoduleDiff[]>([])
83
+ const [isLoading, setIsLoading] = React.useState(true)
84
+ const [lastUpdated, setLastUpdated] = React.useState<Date | null>(null)
85
+
86
+ React.useEffect(() => {
87
+ let mounted = true
88
+
89
+ const refresh = async () => {
90
+ const result = await loadSubmoduleDiffs()
91
+ if (mounted) {
92
+ setDiffs(result)
93
+ setIsLoading(false)
94
+ setLastUpdated(new Date())
95
+ }
96
+ }
97
+
98
+ refresh()
99
+ const interval = setInterval(refresh, POLL_INTERVAL_MS)
100
+
101
+ return () => {
102
+ mounted = false
103
+ clearInterval(interval)
104
+ }
105
+ }, [])
106
+
107
+ const subtitle = lastUpdated ? `Watching · Last checked ${lastUpdated.toLocaleTimeString()}` : undefined
108
+
109
+ return (
110
+ <List navigationTitle='Submodule Diffs' isLoading={isLoading} searchBarPlaceholder='Search files...'>
111
+ {diffs.length === 0 && !isLoading ? (
112
+ <List.EmptyView title='No changes' description={`No uncommitted changes in submodules · ${subtitle}`} />
113
+ ) : (
114
+ diffs.map((submodule) => {
115
+ return (
116
+ <List.Section
117
+ key={submodule.name}
118
+ title={submodule.name}
119
+ subtitle={`${submodule.files.length} file${submodule.files.length === 1 ? '' : 's'}`}
120
+ >
121
+ {submodule.files.map((file) => {
122
+ const fullPath = path.join(submodule.path, file.file)
123
+ return (
124
+ <List.Item
125
+ key={fullPath}
126
+ id={fullPath}
127
+ title={file.file}
128
+ accessories={[
129
+ { text: { value: `+${file.additions}`, color: Color.Green } },
130
+ { text: { value: `-${file.deletions}`, color: Color.Red } },
131
+ ]}
132
+ actions={
133
+ <ActionPanel>
134
+ <Action
135
+ title='Open in Zed'
136
+ onAction={async () => {
137
+ await $`zed ${fullPath}`
138
+ }}
139
+ />
140
+ </ActionPanel>
141
+ }
142
+ />
143
+ )
144
+ })}
145
+ </List.Section>
146
+ )
147
+ })
148
+ )}
149
+ </List>
150
+ )
151
+ }
152
+
153
+ await renderWithProviders(<SubmoduleDiffList />)
@@ -101,4 +101,4 @@ function UsePromiseExample() {
101
101
  )
102
102
  }
103
103
 
104
- renderWithProviders(<UsePromiseExample />)
104
+ await renderWithProviders(<UsePromiseExample />)
@@ -93,4 +93,4 @@ function UsePromiseExample() {
93
93
  )
94
94
  }
95
95
 
96
- renderWithProviders(<UsePromiseExample />)
96
+ await renderWithProviders(<UsePromiseExample />)
@@ -1,18 +1,21 @@
1
1
  import fs from 'node:fs'
2
2
  import path from 'node:path'
3
3
  import React from 'react'
4
- import { render } from '@opentui/react'
4
+ import { createRoot } from '@opentui/react'
5
+ import { createCliRenderer } from '@opentui/core'
5
6
  import { List, useStore } from 'termcast'
6
7
  import { Action, ActionPanel } from 'termcast'
7
8
  import { useNavigation } from 'termcast/src/internal/navigation'
8
- import { Providers } from 'termcast/src/internal/providers'
9
+ import { TermcastProvider } from 'termcast/src/internal/providers'
9
10
  import { showToast, Toast } from 'termcast/src/apis/toast'
10
11
  import { Icon } from 'termcast'
11
12
  import { getCommandsWithFiles, CommandWithFile } from '../package-json'
12
13
  import { buildExtensionCommands } from '../build'
14
+ import { runCommand, clearCommandArguments } from '../utils/run-command'
13
15
 
14
16
  interface BundledCommand extends CommandWithFile {
15
17
  bundledPath: string
18
+ Component?: (props: any) => any
16
19
  }
17
20
 
18
21
  function ExtensionCommandsList({
@@ -23,47 +26,38 @@ function ExtensionCommandsList({
23
26
  commands: BundledCommand[]
24
27
  }): any {
25
28
  const { push } = useNavigation()
26
- const packageJson = getCommandsWithFiles({
29
+ const { packageJson } = getCommandsWithFiles({
27
30
  packageJsonPath: path.join(extensionPath, 'package.json'),
28
- }).packageJson
31
+ })
32
+ const devRebuildCount = useStore((state) => state.devRebuildCount)
29
33
 
30
34
  const handleCommandSelect = async (command: BundledCommand) => {
35
+ clearCommandArguments()
36
+
37
+ if (!command.bundledPath && !command.Component) {
38
+ await showToast({
39
+ style: Toast.Style.Failure,
40
+ title: 'Command not built',
41
+ message: `Command ${command.name} was not built successfully`,
42
+ })
43
+ return
44
+ }
45
+
31
46
  try {
32
- if (!command.bundledPath) {
33
- await showToast({
34
- style: Toast.Style.Failure,
35
- title: 'Command not built',
36
- message: `Command ${command.name} was not built successfully`,
37
- })
38
- return
39
- }
40
-
41
- const state = useStore.getState()
42
- const devRebuildCount = state.devRebuildCount
43
-
44
- // Set the current command in state
45
- useStore.setState({ currentCommandName: command.name })
46
-
47
- const module = await import(
48
- `${command.bundledPath}?rebuild=${devRebuildCount}`
49
- )
50
- const Component = module.default
51
-
52
- if (!Component) {
53
- await showToast({
54
- style: Toast.Style.Failure,
55
- title: 'No default export',
56
- message: `Command file ${command.name} has no default export`,
57
- })
58
- return
59
- }
60
-
61
- push(<Component />)
62
- } catch (error) {
47
+ await runCommand({
48
+ command,
49
+ extensionName: packageJson.name,
50
+ packageJson,
51
+ bundledPath: command.bundledPath,
52
+ Component: command.Component,
53
+ push,
54
+ cacheBustParam: String(devRebuildCount),
55
+ })
56
+ } catch (error: any) {
63
57
  await showToast({
64
58
  style: Toast.Style.Failure,
65
59
  title: 'Failed to load command',
66
- message: error.message ? error.message : error,
60
+ message: error.message || String(error),
67
61
  })
68
62
  }
69
63
  }
@@ -170,10 +164,54 @@ export async function startDevMode({
170
164
  const devElement = useStore((state) => state.devElement)
171
165
  const devRebuildCount = useStore((state) => state.devRebuildCount)
172
166
 
173
- return <Providers key={String(devRebuildCount)}>{devElement}</Providers>
167
+ return <TermcastProvider key={String(devRebuildCount)}>{devElement}</TermcastProvider>
168
+ }
169
+
170
+ const renderer = await createCliRenderer()
171
+ createRoot(renderer).render(<App />)
172
+ }
173
+
174
+ export async function startCompiledExtension({
175
+ extensionPath,
176
+ compiledCommands,
177
+ }: {
178
+ extensionPath: string
179
+ compiledCommands: Array<{
180
+ name: string
181
+ bundledPath: string
182
+ Component: (props: any) => any
183
+ }>
184
+ }): Promise<void> {
185
+ const packageJsonPath = path.join(extensionPath, 'package.json')
186
+ const { packageJson, commands: commandsMetadata } = getCommandsWithFiles({
187
+ packageJsonPath,
188
+ })
189
+
190
+ const commands: BundledCommand[] = compiledCommands.map((compiled) => {
191
+ const metadata = commandsMetadata.find((cmd) => cmd.name === compiled.name)
192
+ return {
193
+ ...metadata!,
194
+ bundledPath: '',
195
+ Component: compiled.Component,
196
+ }
197
+ })
198
+
199
+ useStore.setState({
200
+ ...useStore.getInitialState(),
201
+ extensionPath,
202
+ extensionPackageJson: packageJson,
203
+ devElement: (
204
+ <ExtensionCommandsList extensionPath={extensionPath} commands={commands} />
205
+ ),
206
+ })
207
+
208
+ function App(): any {
209
+ const devElement = useStore((state) => state.devElement)
210
+ return <TermcastProvider>{devElement}</TermcastProvider>
174
211
  }
175
212
 
176
- await render(<App />)
213
+ const renderer = await createCliRenderer()
214
+ createRoot(renderer).render(<App />)
177
215
  }
178
216
 
179
217
  export async function triggerRebuild({
@@ -0,0 +1,220 @@
1
+ import { test, expect, afterEach, beforeEach } from 'vitest'
2
+ import { launchTerminal, Session } from 'tuistory/src'
3
+ import path from 'node:path'
4
+
5
+ let session: Session
6
+
7
+ const fixtureDir = path.resolve(__dirname, '../../fixtures/simple-extension')
8
+
9
+ beforeEach(async () => {
10
+ session = await launchTerminal({
11
+ command: 'bun',
12
+ args: ['src/cli.tsx', 'dev', fixtureDir],
13
+ cols: 60,
14
+ rows: 16,
15
+ })
16
+ })
17
+
18
+ afterEach(() => {
19
+ session?.close()
20
+ })
21
+
22
+ test('dev command shows extension commands list', async () => {
23
+ await session.text({
24
+ waitFor: (text) => /Simple Test Extension/i.test(text),
25
+ timeout: 10000,
26
+ })
27
+
28
+ const snapshot = await session.text()
29
+ expect(snapshot).toMatchInlineSnapshot(`
30
+ "
31
+
32
+
33
+ Simple Test Extension ────────────────────────────────
34
+
35
+ Search commands...
36
+
37
+ Commands ▲
38
+ ›List Items Displays a simple list with some ite view ▀
39
+ Search Items Search and filter through a list o view
40
+ Google Oauth view
41
+ usePromise Demo Shows how to use the usePromise view
42
+
43
+
44
+
45
+ ↵ select ↑↓ navigate ^k actions"
46
+ `)
47
+ }, 30000)
48
+
49
+ test('selecting command with arguments shows arguments form', async () => {
50
+ await session.text({
51
+ waitFor: (text) => /Simple Test Extension/i.test(text),
52
+ timeout: 10000,
53
+ })
54
+
55
+ // Navigate to "With Arguments" command (6th item)
56
+ await session.press('down')
57
+ await session.press('down')
58
+ await session.press('down')
59
+ await session.press('down')
60
+ await session.press('down')
61
+
62
+ const selectedSnapshot = await session.text()
63
+ expect(selectedSnapshot).toMatchInlineSnapshot(`
64
+ "
65
+
66
+
67
+ Simple Test Extension ────────────────────────────────
68
+
69
+ Search commands...
70
+
71
+ Search Items Search and filter through a list o view ▲
72
+ Google Oauth view
73
+ usePromise Demo Shows how to use the usePromise view ▄
74
+ Show State Shows the current application state view
75
+ ›With Arguments Demonstrates command arguments ( view
76
+
77
+
78
+
79
+ ↵ select ↑↓ navigate ^k actions"
80
+ `)
81
+
82
+ // Select the command to show arguments form (enter opens action panel, enter again runs)
83
+ await session.press('enter')
84
+ await session.press('enter')
85
+
86
+ await session.text({
87
+ waitFor: (text) => /Search query/i.test(text),
88
+ timeout: 10000,
89
+ })
90
+
91
+ const argsFormSnapshot = await session.text()
92
+ expect(argsFormSnapshot).toMatchInlineSnapshot(`
93
+ "
94
+
95
+
96
+ ▪ With Arguments █
97
+ │ Enter the arguments to run this command. ▀
98
+
99
+ ◆ Search query
100
+ ┃ Search query
101
+
102
+ ◇ Secret key
103
+ │ Secret key
104
+ ◇ Category
105
+ │ Category
106
+
107
+
108
+ alt ↵ submit ↑↓ navigate ^k actions"
109
+ `)
110
+ }, 30000)
111
+
112
+ test('can fill arguments and run command', async () => {
113
+ await session.text({
114
+ waitFor: (text) => /Simple Test Extension/i.test(text),
115
+ timeout: 10000,
116
+ })
117
+
118
+ // Navigate to "With Arguments" command
119
+ await session.press('down')
120
+ await session.press('down')
121
+ await session.press('down')
122
+ await session.press('down')
123
+ await session.press('down')
124
+ await session.press('enter')
125
+ await session.press('enter')
126
+
127
+ await session.text({
128
+ waitFor: (text) => /Search query/i.test(text),
129
+ timeout: 10000,
130
+ })
131
+
132
+ // Type in the search query field
133
+ await session.type('my search term')
134
+
135
+ const afterTypingSnapshot = await session.text()
136
+ expect(afterTypingSnapshot).toMatchInlineSnapshot(`
137
+ "
138
+
139
+
140
+ ▪ With Arguments █
141
+ │ Enter the arguments to run this command. ▀
142
+
143
+ ◆ Search query
144
+ ┃ my search term
145
+
146
+ ◇ Secret key
147
+ │ Secret key
148
+ ◇ Category
149
+ │ Category
150
+
151
+
152
+ alt ↵ submit ↑↓ navigate ^k actions"
153
+ `)
154
+
155
+ // Submit the form with Alt+Enter (opens action panel), then Enter (selects submit)
156
+ await session.press(['alt', 'enter'])
157
+ await session.press('enter')
158
+
159
+ await session.text({
160
+ waitFor: (text) => /Received Arguments/i.test(text),
161
+ timeout: 10000,
162
+ })
163
+
164
+ const commandResultSnapshot = await session.text()
165
+ expect(commandResultSnapshot).toMatchInlineSnapshot(`
166
+ "
167
+
168
+
169
+ Command Arguments Demo ───────────────────────────────
170
+
171
+ Search...
172
+
173
+ Received Arguments
174
+ ›Search Query my search term
175
+ Secret Key (empty)
176
+ Category (empty)
177
+
178
+
179
+
180
+ ↵ sele┌────────────────────────────────────────┐
181
+ │ ✓ Copied to Clipboard - my search term │
182
+ └────────────────────────────────────────┘"
183
+ `)
184
+ }, 30000)
185
+
186
+ test('can run simple view command without arguments', async () => {
187
+ await session.text({
188
+ waitFor: (text) => /Simple Test Extension/i.test(text),
189
+ timeout: 10000,
190
+ })
191
+
192
+ // Select first command (List Items) - enter opens action panel, enter again runs
193
+ await session.press('enter')
194
+ await session.press('enter')
195
+
196
+ await session.text({
197
+ waitFor: (text) => /First Item/i.test(text),
198
+ timeout: 10000,
199
+ })
200
+
201
+ const listItemsSnapshot = await session.text()
202
+ expect(listItemsSnapshot).toMatchInlineSnapshot(`
203
+ "
204
+
205
+
206
+ List Items ───────────────────────────────────────────
207
+
208
+ Search...
209
+
210
+ Items ▲
211
+ ›First Item This is the first item █
212
+ Second Item This is the second item
213
+ Third Item This is the third item
214
+ Fourth Item This is the fourth item
215
+
216
+
217
+
218
+ ↵ select ↑↓ navigate ^k actions"
219
+ `)
220
+ }, 30000)