mepcli 2.0.0-beta.2 → 2.0.0-beta.3

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 (356) hide show
  1. package/dist/ansi.d.ts +36 -0
  2. package/dist/ansi.js +1 -0
  3. package/dist/base.d.ts +60 -0
  4. package/dist/base.js +1 -0
  5. package/dist/{src/core.js → core.d.ts} +175 -345
  6. package/dist/core.js +1 -0
  7. package/dist/data/countries.d.ts +2 -0
  8. package/dist/data/countries.js +1 -0
  9. package/dist/data/licenses.d.ts +2 -0
  10. package/dist/data/licenses.js +1 -0
  11. package/dist/highlight.d.ts +7 -0
  12. package/dist/highlight.js +1 -0
  13. package/dist/index.d.ts +48 -0
  14. package/dist/index.js +1 -0
  15. package/dist/input.d.ts +14 -0
  16. package/dist/input.js +1 -0
  17. package/dist/pipeline.d.ts +90 -0
  18. package/dist/pipeline.js +1 -0
  19. package/dist/prompts/autocomplete.d.ts +22 -0
  20. package/dist/prompts/autocomplete.js +1 -0
  21. package/dist/prompts/box.d.ts +21 -0
  22. package/dist/prompts/box.js +4 -0
  23. package/dist/prompts/breadcrumb-search.d.ts +14 -0
  24. package/dist/prompts/breadcrumb-search.js +2 -0
  25. package/dist/prompts/breadcrumb.d.ts +32 -0
  26. package/dist/prompts/breadcrumb.js +3 -0
  27. package/dist/prompts/byte.d.ts +13 -0
  28. package/dist/prompts/byte.js +5 -0
  29. package/dist/prompts/calculator.d.ts +17 -0
  30. package/dist/prompts/calculator.js +3 -0
  31. package/dist/prompts/calendar.d.ts +33 -0
  32. package/dist/prompts/calendar.js +3 -0
  33. package/dist/prompts/checkbox.d.ts +13 -0
  34. package/dist/prompts/checkbox.js +2 -0
  35. package/dist/prompts/code.d.ts +19 -0
  36. package/dist/prompts/code.js +4 -0
  37. package/dist/prompts/color.d.ts +14 -0
  38. package/dist/prompts/color.js +10 -0
  39. package/dist/prompts/confirm.d.ts +8 -0
  40. package/dist/prompts/confirm.js +1 -0
  41. package/dist/prompts/connection-string.d.ts +18 -0
  42. package/dist/prompts/connection-string.js +1 -0
  43. package/dist/prompts/cron.d.ts +13 -0
  44. package/dist/prompts/cron.js +4 -0
  45. package/dist/prompts/curl-utils.d.ts +25 -0
  46. package/dist/prompts/curl-utils.js +1 -0
  47. package/dist/prompts/curl.d.ts +41 -0
  48. package/dist/prompts/curl.js +12 -0
  49. package/dist/prompts/data-inspector.d.ts +22 -0
  50. package/dist/prompts/data-inspector.js +5 -0
  51. package/dist/prompts/date.d.ts +12 -0
  52. package/dist/prompts/date.js +2 -0
  53. package/dist/prompts/dependency.d.ts +16 -0
  54. package/dist/prompts/dependency.js +3 -0
  55. package/dist/prompts/dial.d.ts +10 -0
  56. package/dist/prompts/dial.js +3 -0
  57. package/dist/prompts/diff.d.ts +10 -0
  58. package/dist/prompts/diff.js +10 -0
  59. package/dist/prompts/draw.d.ts +20 -0
  60. package/dist/prompts/draw.js +6 -0
  61. package/dist/prompts/editor.d.ts +14 -0
  62. package/dist/prompts/editor.js +2 -0
  63. package/dist/prompts/emoji.d.ts +18 -0
  64. package/dist/prompts/emoji.js +5 -0
  65. package/dist/prompts/exec.d.ts +17 -0
  66. package/dist/prompts/exec.js +1 -0
  67. package/dist/prompts/file.d.ts +21 -0
  68. package/dist/prompts/file.js +2 -0
  69. package/dist/prompts/form.d.ts +18 -0
  70. package/dist/prompts/form.js +1 -0
  71. package/dist/prompts/fuzzy-multi-column.d.ts +12 -0
  72. package/dist/prompts/fuzzy-multi-column.js +2 -0
  73. package/dist/prompts/fuzzy.d.ts +12 -0
  74. package/dist/prompts/fuzzy.js +2 -0
  75. package/dist/prompts/gauge.d.ts +21 -0
  76. package/dist/prompts/gauge.js +4 -0
  77. package/dist/prompts/grid.d.ts +14 -0
  78. package/dist/prompts/grid.js +2 -0
  79. package/dist/prompts/heatmap.d.ts +13 -0
  80. package/dist/prompts/heatmap.js +2 -0
  81. package/dist/prompts/ip.d.ts +11 -0
  82. package/dist/prompts/ip.js +3 -0
  83. package/dist/prompts/kanban.d.ts +17 -0
  84. package/dist/prompts/kanban.js +4 -0
  85. package/dist/prompts/keypress.d.ts +7 -0
  86. package/dist/prompts/keypress.js +1 -0
  87. package/dist/prompts/license.d.ts +9 -0
  88. package/dist/prompts/license.js +13 -0
  89. package/dist/prompts/list.d.ts +9 -0
  90. package/dist/prompts/list.js +1 -0
  91. package/dist/prompts/map.d.ts +17 -0
  92. package/dist/prompts/map.js +5 -0
  93. package/dist/prompts/match.d.ts +19 -0
  94. package/dist/prompts/match.js +7 -0
  95. package/dist/prompts/miller.d.ts +15 -0
  96. package/dist/prompts/miller.js +2 -0
  97. package/dist/prompts/multi-column-select.d.ts +10 -0
  98. package/dist/prompts/multi-column-select.js +2 -0
  99. package/dist/prompts/multi-range.d.ts +9 -0
  100. package/dist/prompts/multi-range.js +3 -0
  101. package/dist/prompts/multi-select.d.ts +15 -0
  102. package/dist/prompts/multi-select.js +4 -0
  103. package/dist/prompts/number.d.ts +11 -0
  104. package/dist/prompts/number.js +2 -0
  105. package/dist/prompts/otp.d.ts +10 -0
  106. package/dist/prompts/otp.js +2 -0
  107. package/dist/prompts/pattern.d.ts +22 -0
  108. package/dist/prompts/pattern.js +4 -0
  109. package/dist/prompts/phone.d.ts +41 -0
  110. package/dist/prompts/phone.js +3 -0
  111. package/dist/prompts/quiz-select.d.ts +10 -0
  112. package/dist/prompts/quiz-select.js +7 -0
  113. package/dist/prompts/quiz-text.d.ts +11 -0
  114. package/dist/prompts/quiz-text.js +8 -0
  115. package/dist/prompts/range.d.ts +9 -0
  116. package/dist/prompts/range.js +1 -0
  117. package/dist/prompts/rating.d.ts +8 -0
  118. package/dist/prompts/rating.js +1 -0
  119. package/dist/prompts/regex.d.ts +13 -0
  120. package/dist/prompts/regex.js +5 -0
  121. package/dist/prompts/region.d.ts +11 -0
  122. package/dist/prompts/region.js +5 -0
  123. package/dist/prompts/schedule.d.ts +20 -0
  124. package/dist/prompts/schedule.js +5 -0
  125. package/dist/prompts/scroll.d.ts +13 -0
  126. package/dist/prompts/scroll.js +1 -0
  127. package/dist/prompts/seat.d.ts +17 -0
  128. package/dist/prompts/seat.js +5 -0
  129. package/dist/prompts/select-range.d.ts +8 -0
  130. package/dist/prompts/select-range.js +3 -0
  131. package/dist/prompts/select.d.ts +15 -0
  132. package/dist/prompts/select.js +2 -0
  133. package/dist/prompts/semver.d.ts +6 -0
  134. package/dist/prompts/semver.js +1 -0
  135. package/dist/prompts/shortcut.d.ts +9 -0
  136. package/dist/prompts/shortcut.js +1 -0
  137. package/dist/prompts/slider.d.ts +8 -0
  138. package/dist/prompts/slider.js +1 -0
  139. package/dist/prompts/slot.d.ts +16 -0
  140. package/dist/prompts/slot.js +8 -0
  141. package/dist/prompts/snippet.d.ts +19 -0
  142. package/dist/prompts/snippet.js +4 -0
  143. package/dist/prompts/sort-grid.d.ts +16 -0
  144. package/dist/prompts/sort-grid.js +2 -0
  145. package/dist/prompts/sort.d.ts +14 -0
  146. package/dist/prompts/sort.js +2 -0
  147. package/dist/prompts/spam.d.ts +17 -0
  148. package/dist/prompts/spam.js +2 -0
  149. package/dist/prompts/spreadsheet.d.ts +21 -0
  150. package/dist/prompts/spreadsheet.js +7 -0
  151. package/dist/prompts/table.d.ts +14 -0
  152. package/dist/prompts/table.js +3 -0
  153. package/dist/prompts/text.d.ts +17 -0
  154. package/dist/prompts/text.js +2 -0
  155. package/dist/prompts/time.d.ts +12 -0
  156. package/dist/prompts/time.js +2 -0
  157. package/dist/prompts/toggle.d.ts +8 -0
  158. package/dist/prompts/toggle.js +1 -0
  159. package/dist/prompts/transfer.d.ts +18 -0
  160. package/dist/prompts/transfer.js +5 -0
  161. package/dist/prompts/tree-select.d.ts +31 -0
  162. package/dist/prompts/tree-select.js +3 -0
  163. package/dist/prompts/tree.d.ts +20 -0
  164. package/dist/prompts/tree.js +3 -0
  165. package/dist/prompts/wait.d.ts +18 -0
  166. package/dist/prompts/wait.js +1 -0
  167. package/dist/spinner.d.ts +33 -0
  168. package/dist/spinner.js +3 -0
  169. package/dist/symbols.d.ts +33 -0
  170. package/dist/symbols.js +1 -0
  171. package/dist/tasks.d.ts +57 -0
  172. package/dist/tasks.js +1 -0
  173. package/dist/theme.d.ts +2 -0
  174. package/dist/theme.js +1 -0
  175. package/dist/types.d.ts +503 -0
  176. package/dist/types.js +1 -0
  177. package/dist/utils.d.ts +81 -0
  178. package/dist/utils.js +1 -0
  179. package/package.json +8 -9
  180. package/dist/src/ansi.js +0 -50
  181. package/dist/src/ansi.js.map +0 -1
  182. package/dist/src/base.js +0 -258
  183. package/dist/src/base.js.map +0 -1
  184. package/dist/src/core.js.map +0 -1
  185. package/dist/src/data/countries.js +0 -569
  186. package/dist/src/data/countries.js.map +0 -1
  187. package/dist/src/data/licenses.js +0 -480
  188. package/dist/src/data/licenses.js.map +0 -1
  189. package/dist/src/highlight.js +0 -185
  190. package/dist/src/highlight.js.map +0 -1
  191. package/dist/src/index.js +0 -66
  192. package/dist/src/index.js.map +0 -1
  193. package/dist/src/input.js +0 -158
  194. package/dist/src/input.js.map +0 -1
  195. package/dist/src/pipeline.js +0 -273
  196. package/dist/src/pipeline.js.map +0 -1
  197. package/dist/src/prompts/autocomplete.js +0 -171
  198. package/dist/src/prompts/autocomplete.js.map +0 -1
  199. package/dist/src/prompts/box.js +0 -225
  200. package/dist/src/prompts/box.js.map +0 -1
  201. package/dist/src/prompts/breadcrumb-search.js +0 -260
  202. package/dist/src/prompts/breadcrumb-search.js.map +0 -1
  203. package/dist/src/prompts/breadcrumb.js +0 -307
  204. package/dist/src/prompts/breadcrumb.js.map +0 -1
  205. package/dist/src/prompts/byte.js +0 -176
  206. package/dist/src/prompts/byte.js.map +0 -1
  207. package/dist/src/prompts/calculator.js +0 -243
  208. package/dist/src/prompts/calculator.js.map +0 -1
  209. package/dist/src/prompts/calendar.js +0 -430
  210. package/dist/src/prompts/calendar.js.map +0 -1
  211. package/dist/src/prompts/checkbox.js +0 -159
  212. package/dist/src/prompts/checkbox.js.map +0 -1
  213. package/dist/src/prompts/code.js +0 -271
  214. package/dist/src/prompts/code.js.map +0 -1
  215. package/dist/src/prompts/color.js +0 -165
  216. package/dist/src/prompts/color.js.map +0 -1
  217. package/dist/src/prompts/confirm.js +0 -55
  218. package/dist/src/prompts/confirm.js.map +0 -1
  219. package/dist/src/prompts/connection-string.js +0 -120
  220. package/dist/src/prompts/connection-string.js.map +0 -1
  221. package/dist/src/prompts/cron.js +0 -207
  222. package/dist/src/prompts/cron.js.map +0 -1
  223. package/dist/src/prompts/curl-utils.js +0 -71
  224. package/dist/src/prompts/curl-utils.js.map +0 -1
  225. package/dist/src/prompts/curl.js +0 -431
  226. package/dist/src/prompts/curl.js.map +0 -1
  227. package/dist/src/prompts/data-inspector.js +0 -261
  228. package/dist/src/prompts/data-inspector.js.map +0 -1
  229. package/dist/src/prompts/date.js +0 -185
  230. package/dist/src/prompts/date.js.map +0 -1
  231. package/dist/src/prompts/dependency.js +0 -283
  232. package/dist/src/prompts/dependency.js.map +0 -1
  233. package/dist/src/prompts/dial.js +0 -124
  234. package/dist/src/prompts/dial.js.map +0 -1
  235. package/dist/src/prompts/diff.js +0 -118
  236. package/dist/src/prompts/diff.js.map +0 -1
  237. package/dist/src/prompts/draw.js +0 -191
  238. package/dist/src/prompts/draw.js.map +0 -1
  239. package/dist/src/prompts/editor.js +0 -234
  240. package/dist/src/prompts/editor.js.map +0 -1
  241. package/dist/src/prompts/emoji.js +0 -226
  242. package/dist/src/prompts/emoji.js.map +0 -1
  243. package/dist/src/prompts/exec.js +0 -151
  244. package/dist/src/prompts/exec.js.map +0 -1
  245. package/dist/src/prompts/file.js +0 -217
  246. package/dist/src/prompts/file.js.map +0 -1
  247. package/dist/src/prompts/form.js +0 -241
  248. package/dist/src/prompts/form.js.map +0 -1
  249. package/dist/src/prompts/fuzzy-multi-column.js +0 -161
  250. package/dist/src/prompts/fuzzy-multi-column.js.map +0 -1
  251. package/dist/src/prompts/fuzzy.js +0 -147
  252. package/dist/src/prompts/fuzzy.js.map +0 -1
  253. package/dist/src/prompts/gauge.js +0 -137
  254. package/dist/src/prompts/gauge.js.map +0 -1
  255. package/dist/src/prompts/grid.js +0 -191
  256. package/dist/src/prompts/grid.js.map +0 -1
  257. package/dist/src/prompts/heatmap.js +0 -147
  258. package/dist/src/prompts/heatmap.js.map +0 -1
  259. package/dist/src/prompts/ip.js +0 -138
  260. package/dist/src/prompts/ip.js.map +0 -1
  261. package/dist/src/prompts/kanban.js +0 -233
  262. package/dist/src/prompts/kanban.js.map +0 -1
  263. package/dist/src/prompts/keypress.js +0 -54
  264. package/dist/src/prompts/keypress.js.map +0 -1
  265. package/dist/src/prompts/license.js +0 -144
  266. package/dist/src/prompts/license.js.map +0 -1
  267. package/dist/src/prompts/list.js +0 -124
  268. package/dist/src/prompts/list.js.map +0 -1
  269. package/dist/src/prompts/map.js +0 -262
  270. package/dist/src/prompts/map.js.map +0 -1
  271. package/dist/src/prompts/match.js +0 -271
  272. package/dist/src/prompts/match.js.map +0 -1
  273. package/dist/src/prompts/miller.js +0 -228
  274. package/dist/src/prompts/miller.js.map +0 -1
  275. package/dist/src/prompts/multi-column-select.js +0 -176
  276. package/dist/src/prompts/multi-column-select.js.map +0 -1
  277. package/dist/src/prompts/multi-range.js +0 -189
  278. package/dist/src/prompts/multi-range.js.map +0 -1
  279. package/dist/src/prompts/multi-select.js +0 -183
  280. package/dist/src/prompts/multi-select.js.map +0 -1
  281. package/dist/src/prompts/number.js +0 -166
  282. package/dist/src/prompts/number.js.map +0 -1
  283. package/dist/src/prompts/otp.js +0 -107
  284. package/dist/src/prompts/otp.js.map +0 -1
  285. package/dist/src/prompts/pattern.js +0 -252
  286. package/dist/src/prompts/pattern.js.map +0 -1
  287. package/dist/src/prompts/phone.js +0 -398
  288. package/dist/src/prompts/phone.js.map +0 -1
  289. package/dist/src/prompts/quiz-select.js +0 -114
  290. package/dist/src/prompts/quiz-select.js.map +0 -1
  291. package/dist/src/prompts/quiz-text.js +0 -98
  292. package/dist/src/prompts/quiz-text.js.map +0 -1
  293. package/dist/src/prompts/range.js +0 -164
  294. package/dist/src/prompts/range.js.map +0 -1
  295. package/dist/src/prompts/rating.js +0 -83
  296. package/dist/src/prompts/rating.js.map +0 -1
  297. package/dist/src/prompts/regex.js +0 -145
  298. package/dist/src/prompts/regex.js.map +0 -1
  299. package/dist/src/prompts/region.js +0 -170
  300. package/dist/src/prompts/region.js.map +0 -1
  301. package/dist/src/prompts/schedule.js +0 -270
  302. package/dist/src/prompts/schedule.js.map +0 -1
  303. package/dist/src/prompts/scroll.js +0 -155
  304. package/dist/src/prompts/scroll.js.map +0 -1
  305. package/dist/src/prompts/seat.js +0 -164
  306. package/dist/src/prompts/seat.js.map +0 -1
  307. package/dist/src/prompts/select-range.js +0 -148
  308. package/dist/src/prompts/select-range.js.map +0 -1
  309. package/dist/src/prompts/select.js +0 -163
  310. package/dist/src/prompts/select.js.map +0 -1
  311. package/dist/src/prompts/semver.js +0 -43
  312. package/dist/src/prompts/semver.js.map +0 -1
  313. package/dist/src/prompts/shortcut.js +0 -133
  314. package/dist/src/prompts/shortcut.js.map +0 -1
  315. package/dist/src/prompts/slider.js +0 -69
  316. package/dist/src/prompts/slider.js.map +0 -1
  317. package/dist/src/prompts/slot.js +0 -117
  318. package/dist/src/prompts/slot.js.map +0 -1
  319. package/dist/src/prompts/snippet.js +0 -228
  320. package/dist/src/prompts/snippet.js.map +0 -1
  321. package/dist/src/prompts/sort-grid.js +0 -151
  322. package/dist/src/prompts/sort-grid.js.map +0 -1
  323. package/dist/src/prompts/sort.js +0 -166
  324. package/dist/src/prompts/sort.js.map +0 -1
  325. package/dist/src/prompts/spam.js +0 -80
  326. package/dist/src/prompts/spam.js.map +0 -1
  327. package/dist/src/prompts/spreadsheet.js +0 -240
  328. package/dist/src/prompts/spreadsheet.js.map +0 -1
  329. package/dist/src/prompts/table.js +0 -120
  330. package/dist/src/prompts/table.js.map +0 -1
  331. package/dist/src/prompts/text.js +0 -317
  332. package/dist/src/prompts/text.js.map +0 -1
  333. package/dist/src/prompts/time.js +0 -211
  334. package/dist/src/prompts/time.js.map +0 -1
  335. package/dist/src/prompts/toggle.js +0 -53
  336. package/dist/src/prompts/toggle.js.map +0 -1
  337. package/dist/src/prompts/transfer.js +0 -207
  338. package/dist/src/prompts/transfer.js.map +0 -1
  339. package/dist/src/prompts/tree-select.js +0 -270
  340. package/dist/src/prompts/tree-select.js.map +0 -1
  341. package/dist/src/prompts/tree.js +0 -233
  342. package/dist/src/prompts/tree.js.map +0 -1
  343. package/dist/src/prompts/wait.js +0 -79
  344. package/dist/src/prompts/wait.js.map +0 -1
  345. package/dist/src/spinner.js +0 -105
  346. package/dist/src/spinner.js.map +0 -1
  347. package/dist/src/symbols.js +0 -66
  348. package/dist/src/symbols.js.map +0 -1
  349. package/dist/src/tasks.js +0 -231
  350. package/dist/src/tasks.js.map +0 -1
  351. package/dist/src/theme.js +0 -29
  352. package/dist/src/theme.js.map +0 -1
  353. package/dist/src/types.js +0 -8
  354. package/dist/src/types.js.map +0 -1
  355. package/dist/src/utils.js +0 -480
  356. package/dist/src/utils.js.map +0 -1
@@ -0,0 +1,7 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"SpreadsheetPrompt",{enumerable:true,get:function(){return SpreadsheetPrompt}});const _ansi=require("../ansi");const _base=require("../base");const _theme=require("../theme");const _symbols=require("../symbols");const _utils=require("../utils");function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}let SpreadsheetPrompt=class SpreadsheetPrompt extends _base.Prompt{calculateColWidths(){this.colWidths=this.options.columns.map(col=>{if(col.width)return col.width;let max=(0,_utils.stringWidth)(col.name);this.options.data.forEach(row=>{const val=String(row[col.key]||"");max=Math.max(max,(0,_utils.stringWidth)(val))});return Math.min(max+2,30)})}render(_firstRender){let output="";const mode=this.editMode?`${_ansi.ANSI.FG_YELLOW}[EDIT]${_ansi.ANSI.RESET}`:`${_ansi.ANSI.FG_BLUE}[NAV]${_ansi.ANSI.RESET}`;output+=`${_theme.theme.title}${this.options.message} ${mode}${_ansi.ANSI.RESET}
2
+ `;output+=`${_ansi.ANSI.DIM}(Arrows: Move, Enter/Type: Edit, Esc: Cancel)${_ansi.ANSI.RESET}
3
+ `;const maxScrollRow=Math.max(0,this.options.data.length-this.viewportHeight);if(this.cursorRow<this.scrollRow)this.scrollRow=this.cursorRow;if(this.cursorRow>=this.scrollRow+this.viewportHeight)this.scrollRow=this.cursorRow-this.viewportHeight+1;this.scrollRow=Math.min(maxScrollRow,this.scrollRow);const termWidth=this.stdout.columns||80;let currentWidth=4;const visibleCols=[];for(let i=this.scrollCol;i<this.options.columns.length;i++){const w=this.colWidths[i];if(currentWidth+w+1>termWidth&&visibleCols.length>0)break;visibleCols.push(i);currentWidth+=w+1}let headerStr=" ";let totalWidth=3;visibleCols.forEach(idx=>{const col=this.options.columns[idx];const w=this.colWidths[idx];headerStr+=this.pad(col.name,w)+" ";totalWidth+=w+1});output+=`${_ansi.ANSI.BOLD}${headerStr}${_ansi.ANSI.RESET}
4
+ `;output+=`${_ansi.ANSI.DIM} ${_symbols.symbols.horizontal.repeat(Math.max(0,totalWidth-3))}${_ansi.ANSI.RESET}
5
+ `;for(let i=0;i<this.viewportHeight;i++){const rowIndex=this.scrollRow+i;if(rowIndex>=this.options.data.length)break;const rowData=this.options.data[rowIndex];let rowStr=`${_ansi.ANSI.DIM}${String(rowIndex+1).padEnd(3)}${_ansi.ANSI.RESET}`;visibleCols.forEach(colIndex=>{const col=this.options.columns[colIndex];const w=this.colWidths[colIndex];const isCursor=rowIndex===this.cursorRow&&colIndex===this.cursorCol;let val=String(rowData[col.key]||"");if(isCursor&&this.editMode){val=this.tempValue}let displayVal=this.truncate(val,w);displayVal=this.pad(displayVal,w);if(isCursor){if(this.editMode){displayVal=`${_theme.theme.main}${_ansi.ANSI.UNDERLINE}${displayVal}${_ansi.ANSI.RESET}`}else{displayVal=`${_ansi.ANSI.REVERSE}${displayVal}${_ansi.ANSI.RESET}`}}rowStr+=displayVal+" "});output+=rowStr+"\n"}if(this.editMode){output+=`
6
+ ${_ansi.ANSI.FG_YELLOW}Editing cell (${this.cursorRow+1}, ${this.options.columns[this.cursorCol].name}). Press Enter to save.${_ansi.ANSI.RESET}`}else{output+=`
7
+ ${_ansi.ANSI.DIM}Press 's' or Enter to Save & Exit${_ansi.ANSI.RESET}`}this.renderFrame(output)}pad(str,width){const w=(0,_utils.stringWidth)(str);if(w>=width)return str;return str+" ".repeat(width-w)}handleInput(char,_key){if(this.editMode){this.handleEditInput(char)}else{this.handleNavInput(char)}}handleNavInput(char){if(this.isUp(char)){this.cursorRow=Math.max(0,this.cursorRow-1);this.render(false);return}if(this.isDown(char)){this.cursorRow=Math.min(this.options.data.length-1,this.cursorRow+1);this.render(false);return}if(this.isLeft(char)||char==="\x1b[Z"){this.cursorCol=Math.max(0,this.cursorCol-1);if(this.cursorCol<this.scrollCol){this.scrollCol=this.cursorCol}this.render(false);return}if(this.isRight(char)||char===" "){this.cursorCol=Math.min(this.options.columns.length-1,this.cursorCol+1);while(true){const termWidth=this.stdout.columns||80;let w=4;let isVisible=false;for(let i=this.scrollCol;i<this.options.columns.length;i++){w+=this.colWidths[i]+1;if(w>termWidth&&i>this.scrollCol)break;if(i===this.cursorCol){isVisible=true;break}}if(isVisible)break;this.scrollCol++;if(this.scrollCol>this.cursorCol){this.scrollCol=this.cursorCol;break}}this.render(false);return}if(char==="\r"||char==="\n"){this.startEditing();return}if(char==="s"){this.submit(this.options.data);return}if(!/^[\x00-\x1F]/.test(char)){this.startEditing(char)}}startEditing(initialChar=""){const col=this.options.columns[this.cursorCol];if(col.editable===false)return;this.editMode=true;const currentVal=String(this.options.data[this.cursorRow][col.key]||"");this.tempValue=initialChar?initialChar:currentVal;this.render(false)}handleEditInput(char){if(char==="\r"||char==="\n"){const col=this.options.columns[this.cursorCol];this.options.data[this.cursorRow][col.key]=this.tempValue;this.editMode=false;this.calculateColWidths();this.render(false);return}if(char==="\x1b"){this.editMode=false;this.render(false);return}if(char===""||char==="\b"){this.tempValue=this.tempValue.slice(0,-1);this.render(false);return}if(!/^[\x00-\x1F]/.test(char)){this.tempValue+=char;this.render(false)}}handleMouse(event){if(event.action==="scroll"){if(event.scroll==="up"){this.cursorRow=Math.max(0,this.cursorRow-1);this.render(false)}else{this.cursorRow=Math.min(this.options.data.length-1,this.cursorRow+1);this.render(false)}}}constructor(options){super(options),_define_property(this,"cursorRow",0),_define_property(this,"cursorCol",0),_define_property(this,"scrollRow",0),_define_property(this,"scrollCol",0),_define_property(this,"editMode",false),_define_property(this,"tempValue",""),_define_property(this,"colWidths",[]),_define_property(this,"viewportHeight",void 0);this.viewportHeight=options.rows||10;this.calculateColWidths()}};
@@ -0,0 +1,14 @@
1
+ import { Prompt } from '../base';
2
+ import { TableOptions, MouseEvent } from '../types';
3
+ export declare class TablePrompt<V> extends Prompt<V, TableOptions<V>> {
4
+ private selectedIndex;
5
+ private scrollTop;
6
+ private readonly pageSize;
7
+ private colWidths;
8
+ constructor(options: TableOptions<V>);
9
+ private calculateColWidths;
10
+ protected render(_firstRender: boolean): void;
11
+ private pad;
12
+ protected handleInput(char: string): void;
13
+ protected handleMouse(event: MouseEvent): void;
14
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"TablePrompt",{enumerable:true,get:function(){return TablePrompt}});const _ansi=require("../ansi");const _base=require("../base");const _theme=require("../theme");const _symbols=require("../symbols");const _utils=require("../utils");function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}let TablePrompt=class TablePrompt extends _base.Prompt{calculateColWidths(){const{columns,data}=this.options;this.colWidths=columns.map(c=>(0,_utils.stringWidth)(c));data.forEach(row=>{row.row.forEach((cell,idx)=>{if(idx<this.colWidths.length){this.colWidths[idx]=Math.max(this.colWidths[idx],(0,_utils.stringWidth)(cell))}})});this.colWidths=this.colWidths.map(w=>w+2)}render(_firstRender){if(this.selectedIndex<this.scrollTop){this.scrollTop=this.selectedIndex}else if(this.selectedIndex>=this.scrollTop+this.pageSize){this.scrollTop=this.selectedIndex-this.pageSize+1}const maxScroll=Math.max(0,this.options.data.length-this.pageSize);this.scrollTop=Math.min(this.scrollTop,maxScroll);let output="";output+=`${_theme.theme.success}?${_ansi.ANSI.RESET} ${_ansi.ANSI.BOLD}${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET}
2
+ `;let headerStr=" ";this.options.columns.forEach((col,i)=>{headerStr+=this.pad(col,this.colWidths[i])});output+=`${_ansi.ANSI.BOLD}${headerStr}${_ansi.ANSI.RESET}
3
+ `;const visibleRows=this.options.data.slice(this.scrollTop,this.scrollTop+this.pageSize);visibleRows.forEach((item,index)=>{const actualIndex=this.scrollTop+index;if(index>0)output+="\n";const isSelected=actualIndex===this.selectedIndex;const pointer=isSelected?`${_theme.theme.main}${_symbols.symbols.pointer}${_ansi.ANSI.RESET} `:" ";let rowStr="";item.row.forEach((cell,colIdx)=>{const width=this.colWidths[colIdx];let cellStr=this.pad(cell,width);if(isSelected){cellStr=`${_theme.theme.main}${cellStr}${_ansi.ANSI.RESET}`}rowStr+=cellStr});output+=`${pointer}${rowStr}`});this.renderFrame(output)}pad(str,width){const len=(0,_utils.stringWidth)(str);if(len>=width)return str;return str+" ".repeat(width-len)}handleInput(char){if(char==="\r"||char==="\n"){this.submit(this.options.data[this.selectedIndex].value);return}if(this.isUp(char)){this.selectedIndex=this.selectedIndex>0?this.selectedIndex-1:this.options.data.length-1;this.render(false);return}if(this.isDown(char)){this.selectedIndex=this.selectedIndex<this.options.data.length-1?this.selectedIndex+1:0;this.render(false);return}}handleMouse(event){if(event.action==="scroll"){if(event.scroll==="up"){this.selectedIndex=this.selectedIndex>0?this.selectedIndex-1:this.options.data.length-1;this.render(false)}else if(event.scroll==="down"){this.selectedIndex=this.selectedIndex<this.options.data.length-1?this.selectedIndex+1:0;this.render(false)}}}constructor(options){super(options),_define_property(this,"selectedIndex",0),_define_property(this,"scrollTop",0),_define_property(this,"pageSize",void 0),_define_property(this,"colWidths",[]);this.pageSize=options.rows||7;this.calculateColWidths()}};
@@ -0,0 +1,17 @@
1
+ import { Prompt } from '../base';
2
+ import { TextOptions } from '../types';
3
+ export declare class TextPrompt<O extends TextOptions = TextOptions> extends Prompt<string, O> {
4
+ protected errorMsg: string;
5
+ protected cursor: number;
6
+ protected hasTyped: boolean;
7
+ protected segments: string[];
8
+ protected lastLinesUp: number;
9
+ private ghost;
10
+ constructor(options: O);
11
+ private triggerSuggest;
12
+ protected render(firstRender: boolean): void;
13
+ private getSegmentWidth;
14
+ protected cleanup(): void;
15
+ protected handleInput(char: string): void;
16
+ private validateAndSubmit;
17
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"TextPrompt",{enumerable:true,get:function(){return TextPrompt}});const _ansi=require("../ansi");const _base=require("../base");const _theme=require("../theme");const _symbols=require("../symbols");const _utils=require("../utils");function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}let TextPrompt=class TextPrompt extends _base.Prompt{triggerSuggest(){if(!this.options.suggest||this.cursor!==this.segments.length){this.ghost="";return}const currentValue=this.segments.join("");const result=this.options.suggest(currentValue);if(result instanceof Promise){result.then(suggestion=>{if(this.segments.join("")===currentValue){if(suggestion.startsWith(currentValue)&&suggestion.length>currentValue.length){this.ghost=suggestion.slice(currentValue.length)}else{this.ghost=""}this.render(false)}})}else{if(result.startsWith(currentValue)&&result.length>currentValue.length){this.ghost=result.slice(currentValue.length)}else{this.ghost=""}}}render(firstRender){if(!firstRender&&this.lastLinesUp>0){this.print(`\x1b[${this.lastLinesUp}B`)}this.lastLinesUp=0;const icon=this.errorMsg?`${_theme.theme.error}${_symbols.symbols.cross}`:`${_theme.theme.success}?`;const hint=this.options.multiline?` ${_theme.theme.muted}(Press Ctrl+D to submit)${_ansi.ANSI.RESET}`:"";const prefix=`${icon} ${_ansi.ANSI.BOLD}${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET}${hint} `;const prefixVisualLen=this.stripAnsi(prefix).length;let displayValueLines=[];let cursorRelativeRow=0;let cursorRelativeCol=0;this.value=this.segments.join("");if(this.segments.length===0&&this.options.placeholder&&!this.errorMsg&&!this.hasTyped){const placeholder=`${_theme.theme.muted}${this.options.placeholder}${_ansi.ANSI.RESET}`;displayValueLines=[placeholder];cursorRelativeRow=0;cursorRelativeCol=0}else{const maskChar=this.options.mask??(this.options.isPassword?"*":undefined);let cursorLineIndex=0;cursorLineIndex=0;let visualColIndex=0;for(let i=0;i<this.cursor;i++){const seg=this.segments[i];if(seg==="\n"){cursorLineIndex++;visualColIndex=0}else{if(maskChar!==undefined){visualColIndex+=maskChar.length}else{visualColIndex+=this.getSegmentWidth(seg)}}}cursorRelativeRow=cursorLineIndex;cursorRelativeCol=visualColIndex;let currentLineSegments=[];const processedLines=[];for(const seg of this.segments){if(seg==="\n"){processedLines.push(currentLineSegments);currentLineSegments=[]}else{currentLineSegments.push(seg)}}processedLines.push(currentLineSegments);processedLines.forEach(lineSegs=>{let visibleLine="";if(maskChar!==undefined){visibleLine=maskChar.repeat(lineSegs.length)}else{visibleLine=lineSegs.join("")}displayValueLines.push(_theme.theme.main+visibleLine+_ansi.ANSI.RESET)});if(this.ghost&&this.cursor===this.segments.length&&displayValueLines.length>0){displayValueLines[displayValueLines.length-1]+=_theme.theme.muted+this.ghost+_ansi.ANSI.RESET}}let output="";displayValueLines.forEach((lineStr,idx)=>{if(idx===0){output+=prefix+lineStr}else{output+="\n"+lineStr}});if(this.errorMsg){output+=`
2
+ ${_theme.theme.error}>> ${this.errorMsg}${_ansi.ANSI.RESET}`}this.renderFrame(output);this.print(_ansi.ANSI.SHOW_CURSOR);const errorOffset=this.errorMsg?1:0;const totalRows=displayValueLines.length+errorOffset;const linesUp=totalRows-1-cursorRelativeRow;if(linesUp>0){this.print(`\x1b[${linesUp}A`)}this.lastLinesUp=linesUp;let targetCol=0;if(cursorRelativeRow===0){targetCol=prefixVisualLen+cursorRelativeCol}else{targetCol=cursorRelativeCol}this.print(_ansi.ANSI.CURSOR_LEFT);if(targetCol>0){this.print(`\x1b[${targetCol}C`)}}getSegmentWidth(seg){return(0,_utils.stringWidth)(seg)}cleanup(){if(this.lastLinesUp>0){this.print(`\x1b[${this.lastLinesUp}B`);this.lastLinesUp=0}super.cleanup()}handleInput(char){if(char===" "){if(this.ghost){const ghostSegments=(0,_utils.safeSplit)(this.ghost);this.segments.splice(this.cursor,0,...ghostSegments);this.cursor+=ghostSegments.length;this.ghost="";this.errorMsg="";this.triggerSuggest();this.render(false)}return}if(char==="\r"||char==="\n"){if(this.options.multiline){this.segments.splice(this.cursor,0,"\n");this.cursor++;this.render(false);return}this.validateAndSubmit();return}if(this.options.multiline&&(char==="\x04"||char==="\x13")){this.validateAndSubmit();return}if(char==="\b"||char===""){this.hasTyped=true;if(this.cursor>0){this.segments.splice(this.cursor-1,1);this.cursor--;this.errorMsg="";this.triggerSuggest();this.render(false)}return}if(this.isLeft(char)){if(this.cursor>0){this.cursor--;this.render(false)}return}if(this.isRight(char)){if(this.cursor<this.segments.length){this.cursor++;this.render(false)}return}if(char==="\x1b[3~"){this.hasTyped=true;if(this.cursor<this.segments.length){this.segments.splice(this.cursor,1);this.errorMsg="";this.triggerSuggest();this.render(false)}return}if(!/^[\x00-\x1F]/.test(char)&&!char.startsWith("\x1b")){this.hasTyped=true;const newSegments=(0,_utils.safeSplit)(char);this.segments.splice(this.cursor,0,...newSegments);this.cursor+=newSegments.length;this.errorMsg="";this.triggerSuggest();this.render(false)}}validateAndSubmit(){this.value=this.segments.join("");if(this.options.validate){const result=this.options.validate(this.value);if(result instanceof Promise){this.errorMsg="Validating...";this.render(false);result.then(valid=>{if(typeof valid==="string"&&valid.length>0){this.errorMsg=valid;this.render(false)}else if(valid===false){this.errorMsg="Invalid input";this.render(false)}else{this.errorMsg="";this.render(false);this.submit(this.value)}}).catch(err=>{this.errorMsg=err.message||"Validation failed";this.render(false)});return}if(typeof result==="string"&&result.length>0){this.errorMsg=result;this.render(false);return}if(result===false){this.errorMsg="Invalid input";this.render(false);return}}this.submit(this.value)}constructor(options){super(options),_define_property(this,"errorMsg",""),_define_property(this,"cursor",0),_define_property(this,"hasTyped",false),_define_property(this,"segments",[]),_define_property(this,"lastLinesUp",0),_define_property(this,"ghost","");this.value=options.initial||"";this.segments=(0,_utils.safeSplit)(this.value);this.cursor=this.segments.length}};
@@ -0,0 +1,12 @@
1
+ import { Prompt } from '../base';
2
+ import { TimeOptions, MouseEvent } from '../types';
3
+ export declare class TimePrompt extends Prompt<string, TimeOptions> {
4
+ private hour;
5
+ private minute;
6
+ private activeCol;
7
+ constructor(options: TimeOptions);
8
+ protected render(_firstRender: boolean): void;
9
+ protected handleMouse(event: MouseEvent): void;
10
+ protected handleInput(char: string, _key: Buffer): void;
11
+ private adjustValue;
12
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"TimePrompt",{enumerable:true,get:function(){return TimePrompt}});const _base=require("../base");const _ansi=require("../ansi");function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}let TimePrompt=class TimePrompt extends _base.Prompt{render(_firstRender){const is12h=this.options.format==="12h";const step=this.options.step||1;const getHourDisplay=h=>{if(is12h){const val=h%12||12;return val.toString().padStart(2,"0")}return h.toString().padStart(2,"0")};const getMinDisplay=m=>m.toString().padStart(2,"0");const getMeridiem=h=>h>=12?"PM":"AM";const adjustH=(val,delta)=>{let n=val+delta;if(n<0)n=24+n;return n%24};const adjustM=(val,delta)=>{let n=val+delta;if(n<0)n=60+n;return n%60};const curH=this.hour;const curM=this.minute;const prevH=adjustH(curH,-1);const nextH=adjustH(curH,1);const prevM=adjustM(curM,-step);const nextM=adjustM(curM,step);const colHour=[getHourDisplay(prevH),getHourDisplay(curH),getHourDisplay(nextH)];const colMin=[getMinDisplay(prevM),getMinDisplay(curM),getMinDisplay(nextM)];let colMer=[];if(is12h){const curMer=getMeridiem(curH);const otherMer=curMer==="AM"?"PM":"AM";colMer=[otherMer,curMer,otherMer]}const dim=_ansi.ANSI.FG_GRAY;let output=`${_ansi.ANSI.FG_CYAN}? ${this.options.message}${_ansi.ANSI.RESET}
2
+ `;for(let i=0;i<3;i++){const isCenter=i===1;let hStr=colHour[i];if(this.activeCol===0&&isCenter){hStr=`${_ansi.ANSI.FG_CYAN}${_ansi.ANSI.REVERSE} ${hStr} ${_ansi.ANSI.RESET}`}else if(isCenter){hStr=`${_ansi.ANSI.BOLD} ${hStr} ${_ansi.ANSI.RESET}`}else{hStr=`${dim} ${hStr} ${_ansi.ANSI.RESET}`}const sep=isCenter?":":" ";let mStr=colMin[i];if(this.activeCol===1&&isCenter){mStr=`${_ansi.ANSI.FG_CYAN}${_ansi.ANSI.REVERSE} ${mStr} ${_ansi.ANSI.RESET}`}else if(isCenter){mStr=`${_ansi.ANSI.BOLD} ${mStr} ${_ansi.ANSI.RESET}`}else{mStr=`${dim} ${mStr} ${_ansi.ANSI.RESET}`}let line=` ${hStr} ${sep} ${mStr}`;if(is12h){let merStr=colMer[i];if(this.activeCol===2&&isCenter){merStr=`${_ansi.ANSI.FG_CYAN}${_ansi.ANSI.REVERSE} ${merStr} ${_ansi.ANSI.RESET}`}else if(isCenter){merStr=`${_ansi.ANSI.BOLD} ${merStr} ${_ansi.ANSI.RESET}`}else{merStr=`${dim} ${merStr} ${_ansi.ANSI.RESET}`}line+=` ${merStr}`}output+=line+"\n"}output+=_ansi.ANSI.FG_GRAY+"(Use Arrows/Tab to navigate)"+_ansi.ANSI.RESET;this.renderFrame(output)}handleMouse(event){if(event.action==="scroll"){if(event.scroll==="up"){this.adjustValue(-1)}else if(event.scroll==="down"){this.adjustValue(1)}this.render(false)}}handleInput(char,_key){const is12h=this.options.format==="12h";const maxCols=is12h?2:1;if(char==="\r"||char==="\n"){const h=this.hour.toString().padStart(2,"0");const m=this.minute.toString().padStart(2,"0");const result=is12h?`${(this.hour%12||12).toString().padStart(2,"0")}:${m} ${this.hour>=12?"PM":"AM"}`:`${h}:${m}`;this.submit(result);return}if(char===" "||this.isRight(char)){this.activeCol++;if(this.activeCol>maxCols)this.activeCol=0;this.render(false);return}if(char==="\x1b[Z"||this.isLeft(char)){this.activeCol--;if(this.activeCol<0)this.activeCol=maxCols;this.render(false);return}if(this.isUp(char)){this.adjustValue(-1);this.render(false)}else if(this.isDown(char)){this.adjustValue(1);this.render(false)}}adjustValue(direction){if(this.activeCol===0){let newH=this.hour+direction;if(newH<0)newH=23;if(newH>23)newH=0;this.hour=newH}else if(this.activeCol===1){const step=this.options.step||1;let newM=this.minute+direction*step;if(newM<0)newM=60-step;if(newM<0)newM=60+newM;if(newM>=60)newM=newM%60;this.minute=newM}else if(this.activeCol===2){this.hour=(this.hour+12)%24}}constructor(options){super(options),_define_property(this,"hour",0),_define_property(this,"minute",0),_define_property(this,"activeCol",0);const now=options.initial?typeof options.initial==="string"?new Date(options.initial):options.initial:new Date;if(isNaN(now.getTime())){this.hour=0;this.minute=0}else{this.hour=now.getHours();this.minute=now.getMinutes()}if(options.step){this.minute=Math.round(this.minute/options.step)*options.step;if(this.minute>=60){this.minute=0;this.hour=(this.hour+1)%24}}}};
@@ -0,0 +1,8 @@
1
+ import { Prompt } from '../base';
2
+ import { ToggleOptions, MouseEvent } from '../types';
3
+ export declare class TogglePrompt extends Prompt<boolean, ToggleOptions> {
4
+ constructor(options: ToggleOptions);
5
+ protected render(_firstRender: boolean): void;
6
+ protected handleInput(char: string): void;
7
+ protected handleMouse(event: MouseEvent): void;
8
+ }
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"TogglePrompt",{enumerable:true,get:function(){return TogglePrompt}});const _ansi=require("../ansi");const _base=require("../base");const _theme=require("../theme");let TogglePrompt=class TogglePrompt extends _base.Prompt{render(_firstRender){const activeText=this.options.activeText||"ON";const inactiveText=this.options.inactiveText||"OFF";let toggleDisplay="";if(this.value){toggleDisplay=`${_theme.theme.main}[${_ansi.ANSI.BOLD}${activeText}${_ansi.ANSI.RESET}${_theme.theme.main}]${_ansi.ANSI.RESET} ${_theme.theme.muted}${inactiveText}${_ansi.ANSI.RESET}`}else{toggleDisplay=`${_theme.theme.muted}${activeText}${_ansi.ANSI.RESET} ${_theme.theme.main}[${_ansi.ANSI.BOLD}${inactiveText}${_ansi.ANSI.RESET}${_theme.theme.main}]${_ansi.ANSI.RESET}`}const output=`${_theme.theme.success}?${_ansi.ANSI.RESET} ${_ansi.ANSI.BOLD}${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET} ${toggleDisplay}`;this.renderFrame(output)}handleInput(char){if(char==="\r"||char==="\n"){this.submit(this.value);return}if(this.isLeft(char)||this.isRight(char)||char==="h"||char==="l"){this.value=!this.value;this.render(false)}if(char===" "){this.value=!this.value;this.render(false)}}handleMouse(event){if(event.action==="scroll"){this.value=!this.value;this.render(false)}}constructor(options){super(options);this.value=options.initial??false}};
@@ -0,0 +1,18 @@
1
+ import { Prompt } from '../base';
2
+ import { TransferOptions, MouseEvent } from '../types';
3
+ export declare class TransferPrompt<V> extends Prompt<[V[], V[]], TransferOptions<V>> {
4
+ private leftList;
5
+ private rightList;
6
+ private cursorLeft;
7
+ private cursorRight;
8
+ private scrollTopLeft;
9
+ private scrollTopRight;
10
+ private activeSide;
11
+ private readonly pageSize;
12
+ constructor(options: TransferOptions<V>);
13
+ private normalize;
14
+ protected truncate(str: string, width: number): string;
15
+ protected render(_firstRender: boolean): void;
16
+ protected handleInput(char: string): void;
17
+ protected handleMouse(event: MouseEvent): void;
18
+ }
@@ -0,0 +1,5 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"TransferPrompt",{enumerable:true,get:function(){return TransferPrompt}});const _ansi=require("../ansi");const _base=require("../base");const _theme=require("../theme");const _symbols=require("../symbols");const _utils=require("../utils");function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}let TransferPrompt=class TransferPrompt extends _base.Prompt{normalize(items){return items.map(item=>{if(typeof item==="string"){return{title:item,value:item}}return item})}truncate(str,width){if((0,_utils.stringWidth)(str)<=width)return str;let res=str;while((0,_utils.stringWidth)(res+"...")>width&&res.length>0){res=res.slice(0,-1)}return res+"..."}render(_firstRender){const termWidth=process.stdout.columns||80;const colWidth=Math.floor((termWidth-6)/2);if(this.activeSide==="left"){if(this.cursorLeft<this.scrollTopLeft)this.scrollTopLeft=this.cursorLeft;if(this.cursorLeft>=this.scrollTopLeft+this.pageSize)this.scrollTopLeft=this.cursorLeft-this.pageSize+1}else{if(this.cursorRight<this.scrollTopRight)this.scrollTopRight=this.cursorRight;if(this.cursorRight>=this.scrollTopRight+this.pageSize)this.scrollTopRight=this.cursorRight-this.pageSize+1}let output=`${_theme.theme.success}?${_ansi.ANSI.RESET} ${_ansi.ANSI.BOLD}${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET}
2
+ `;const leftTitle=this.activeSide==="left"?`${_theme.theme.main}Source${_ansi.ANSI.RESET}`:"Source";const rightTitle=this.activeSide==="right"?`${_theme.theme.main}Target${_ansi.ANSI.RESET}`:"Target";output+=` ${leftTitle}`.padEnd(colWidth+2)+" "+` ${rightTitle}
3
+ `;output+=` ${_ansi.ANSI.DIM}${_symbols.symbols.line.repeat(colWidth)}${_ansi.ANSI.RESET} ${_ansi.ANSI.DIM}${_symbols.symbols.line.repeat(colWidth)}${_ansi.ANSI.RESET}
4
+ `;for(let i=0;i<this.pageSize;i++){const idxLeft=this.scrollTopLeft+i;const idxRight=this.scrollTopRight+i;const itemLeft=this.leftList[idxLeft];const itemRight=this.rightList[idxRight];let leftStr="";if(itemLeft){const isSelected=this.activeSide==="left"&&idxLeft===this.cursorLeft;const title=this.truncate(itemLeft.title,colWidth-2);if(isSelected){leftStr=`${_theme.theme.main}${_symbols.symbols.pointer} ${title}${_ansi.ANSI.RESET}`}else{leftStr=` ${title}`}}else{leftStr=""}let rightStr="";if(itemRight){const isSelected=this.activeSide==="right"&&idxRight===this.cursorRight;const title=this.truncate(itemRight.title,colWidth-2);if(isSelected){rightStr=`${_theme.theme.main}${_symbols.symbols.pointer} ${title}${_ansi.ANSI.RESET}`}else{rightStr=` ${title}`}}const leftVisualWidth=itemLeft?(0,_utils.stringWidth)(this.truncate(itemLeft.title,colWidth-2))+2:0;const padding=" ".repeat(Math.max(0,colWidth-leftVisualWidth));output+=leftStr+padding+" | "+rightStr+"\n"}output+=`
5
+ ${_ansi.ANSI.DIM}(Tab: Switch | a: Move All Right | r: Reset/All Left)${_ansi.ANSI.RESET}`;this.renderFrame(output)}handleInput(char){if(char==="\r"||char==="\n"){const leftValues=this.leftList.map(i=>i.value);const rightValues=this.rightList.map(i=>i.value);this.submit([leftValues,rightValues]);return}if(char===" "||this.isLeft(char)||this.isRight(char)){this.activeSide=this.activeSide==="left"?"right":"left";this.render(false);return}if(char==="a"||char===">"){if(this.leftList.length>0){this.rightList.push(...this.leftList);this.leftList=[];this.cursorLeft=0;this.activeSide="right";this.render(false)}return}if(char==="r"||char==="<"){if(this.rightList.length>0){this.leftList.push(...this.rightList);this.rightList=[];this.cursorRight=0;this.activeSide="left";this.render(false)}return}if(this.isUp(char)){if(this.activeSide==="left"){this.cursorLeft=Math.max(0,this.cursorLeft-1)}else{this.cursorRight=Math.max(0,this.cursorRight-1)}this.render(false);return}if(this.isDown(char)){if(this.activeSide==="left"){this.cursorLeft=Math.min(this.leftList.length-1,this.cursorLeft+1)}else{this.cursorRight=Math.min(this.rightList.length-1,this.cursorRight+1)}this.render(false);return}if(char===" "){if(this.activeSide==="left"){if(this.leftList.length>0){const[item]=this.leftList.splice(this.cursorLeft,1);this.rightList.push(item);if(this.cursorLeft>=this.leftList.length){this.cursorLeft=Math.max(0,this.leftList.length-1)}}}else{if(this.rightList.length>0){const[item]=this.rightList.splice(this.cursorRight,1);this.leftList.push(item);if(this.cursorRight>=this.rightList.length){this.cursorRight=Math.max(0,this.rightList.length-1)}}}this.render(false)}}handleMouse(event){if(event.action==="scroll"){if(event.scroll==="up"){if(this.activeSide==="left"){this.cursorLeft=Math.max(0,this.cursorLeft-1)}else{this.cursorRight=Math.max(0,this.cursorRight-1)}}else{if(this.activeSide==="left"){this.cursorLeft=Math.min(this.leftList.length-1,this.cursorLeft+1)}else{this.cursorRight=Math.min(this.rightList.length-1,this.cursorRight+1)}}this.render(false)}}constructor(options){super(options),_define_property(this,"leftList",[]),_define_property(this,"rightList",[]),_define_property(this,"cursorLeft",0),_define_property(this,"cursorRight",0),_define_property(this,"scrollTopLeft",0),_define_property(this,"scrollTopRight",0),_define_property(this,"activeSide","left"),_define_property(this,"pageSize",10);this.leftList=this.normalize(options.source);this.rightList=this.normalize(options.target||[])}};
@@ -0,0 +1,31 @@
1
+ import { Prompt } from '../base';
2
+ import { TreeSelectOptions, MouseEvent } from '../types';
3
+ /**
4
+ * FIXED-ISH: This prompt may hang on Windows TTY after multiple prompt cycles.
5
+ * Current workaround: User must press 'Enter' to flush the stdin buffer.
6
+ * Potential root cause: Synchronous recursion during initialization blocking setRawMode.
7
+ */
8
+ export declare class TreeSelectPrompt<V> extends Prompt<V[], TreeSelectOptions<V>> {
9
+ private cursor;
10
+ private expandedNodes;
11
+ private flatList;
12
+ private scrollTop;
13
+ private readonly pageSize;
14
+ private parentMap;
15
+ private readonly ICON_CLOSED;
16
+ private readonly ICON_OPEN;
17
+ constructor(options: TreeSelectOptions<V>);
18
+ private buildParentMap;
19
+ private initializeExpanded;
20
+ private initializeSelection;
21
+ private recalculateAllParents;
22
+ private updateNodeStateFromChildren;
23
+ private setNodeState;
24
+ private recalculateFlatList;
25
+ private traverse;
26
+ private toggleRecursive;
27
+ protected render(_firstRender: boolean): void;
28
+ protected handleInput(char: string, _key: Buffer): void;
29
+ private collectSelected;
30
+ protected handleMouse(event: MouseEvent): void;
31
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"TreeSelectPrompt",{enumerable:true,get:function(){return TreeSelectPrompt}});const _ansi=require("../ansi");const _base=require("../base");const _theme=require("../theme");const _symbols=require("../symbols");function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}let TreeSelectPrompt=class TreeSelectPrompt extends _base.Prompt{buildParentMap(nodes,parent){for(const node of nodes){if(parent)this.parentMap.set(node,parent);if(node.children){this.buildParentMap(node.children,node)}}}initializeExpanded(nodes){for(const node of nodes){if(node.expanded){this.expandedNodes.add(node)}if(node.children){this.initializeExpanded(node.children)}}}initializeSelection(nodes,initialValues){for(const node of nodes){if(initialValues.has(node.value)){this.setNodeState(node,true,false)}if(node.children){this.initializeSelection(node.children,initialValues)}}}recalculateAllParents(nodes){for(const node of nodes){if(node.children){this.recalculateAllParents(node.children);this.updateNodeStateFromChildren(node)}}}updateNodeStateFromChildren(node){if(!node.children||node.children.length===0)return;const allChecked=node.children.every(c=>c.selected===true);const allUnchecked=node.children.every(c=>!c.selected);if(allChecked){node.selected=true}else if(allUnchecked){node.selected=false}else{node.selected="indeterminate"}}setNodeState(node,state,updateParents=true){node.selected=state;if(node.children){node.children.forEach(c=>this.setNodeState(c,state,false))}if(updateParents){let curr=node;while(this.parentMap.has(curr)){const parent=this.parentMap.get(curr);this.updateNodeStateFromChildren(parent);curr=parent}}}recalculateFlatList(){this.flatList=[];this.traverse(this.options.data,0,null);if(this.cursor>=this.flatList.length){this.cursor=Math.max(0,this.flatList.length-1)}}traverse(nodes,depth,parent){for(const node of nodes){this.flatList.push({node,depth,parent});if(node.children&&node.children.length>0&&this.expandedNodes.has(node)){this.traverse(node.children,depth+1,node)}}}toggleRecursive(node,expand){if(expand)this.expandedNodes.add(node);else this.expandedNodes.delete(node);if(node.children){node.children.forEach(child=>this.toggleRecursive(child,expand))}}render(_firstRender){let output=`${_theme.theme.success}?${_ansi.ANSI.RESET} ${_ansi.ANSI.BOLD}${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET}
2
+ `;if(this.flatList.length===0){output+=` ${_theme.theme.muted}No data${_ansi.ANSI.RESET}`;this.renderFrame(output);return}if(this.cursor<this.scrollTop){this.scrollTop=this.cursor}else if(this.cursor>=this.scrollTop+this.pageSize){this.scrollTop=this.cursor-this.pageSize+1}const visible=this.flatList.slice(this.scrollTop,this.scrollTop+this.pageSize);visible.forEach((item,index)=>{const actualIndex=this.scrollTop+index;const isSelected=actualIndex===this.cursor;const indentSize=this.options.indent||2;const indentation=" ".repeat(item.depth*indentSize);const linePrefix=isSelected?`${_theme.theme.main}${_symbols.symbols.pointer} `:" ";let folderIcon=" ";const hasChildren=item.node.children&&item.node.children.length>0;if(hasChildren){folderIcon=this.expandedNodes.has(item.node)?`${this.ICON_OPEN} `:`${this.ICON_CLOSED} `}let checkIcon=`[ ]`;if(item.node.selected===true){checkIcon=`${_theme.theme.success}[x]${_ansi.ANSI.RESET}`}else if(item.node.selected==="indeterminate"){checkIcon=`${_ansi.ANSI.FG_YELLOW}[-]${_ansi.ANSI.RESET}`}else{checkIcon=`${_theme.theme.muted}[ ]${_ansi.ANSI.RESET}`}let title=item.node.title;if(item.node.disabled){title=`${_theme.theme.muted}${title} (disabled)${_ansi.ANSI.RESET}`}let line=`${indentation}${folderIcon}${checkIcon} ${title}`;if(isSelected){line=`${_theme.theme.main}${line}${_ansi.ANSI.RESET}`}output+=linePrefix+line;if(index<visible.length-1)output+="\n"});output+=`
3
+ ${_theme.theme.muted}(e: Expand All, c: Collapse All, Space: Toggle)${_ansi.ANSI.RESET}`;this.renderFrame(output)}handleInput(char,_key){if(this.flatList.length===0)return;if(this.isUp(char)){this.cursor=(this.cursor-1+this.flatList.length)%this.flatList.length;this.render(false);return}if(this.isDown(char)){this.cursor=(this.cursor+1)%this.flatList.length;this.render(false);return}const currentItem=this.flatList[this.cursor];if(!currentItem)return;const node=currentItem.node;const hasChildren=node.children&&node.children.length>0;if(this.isRight(char)){if(hasChildren&&!this.expandedNodes.has(node)){this.expandedNodes.add(node);this.recalculateFlatList()}else if(this.cursor+1<this.flatList.length){this.cursor++}this.render(false);return}if(this.isLeft(char)){if(hasChildren&&this.expandedNodes.has(node)){this.expandedNodes.delete(node);this.recalculateFlatList()}else if(currentItem.parent){const parentIndex=this.flatList.findIndex(x=>x.node===currentItem.parent);if(parentIndex!==-1){this.cursor=parentIndex}}this.render(false);return}if(char===" "){if(!node.disabled){const newState=node.selected===true?false:true;this.setNodeState(node,newState);this.render(false)}return}if(char==="e"&&hasChildren){this.toggleRecursive(node,true);this.recalculateFlatList();this.render(false);return}if(char==="c"&&hasChildren){this.toggleRecursive(node,false);this.recalculateFlatList();this.render(false);return}if(char==="\r"||char==="\n"){const selectedValues=[];this.collectSelected(this.options.data,selectedValues);this.submit(selectedValues)}}collectSelected(nodes,result){for(const node of nodes){if(node.selected===true){result.push(node.value)}if(node.children){this.collectSelected(node.children,result)}}}handleMouse(event){if(event.action==="scroll"){if(event.scroll==="up"){this.cursor=(this.cursor-1+this.flatList.length)%this.flatList.length;this.render(false)}else if(event.scroll==="down"){this.cursor=(this.cursor+1)%this.flatList.length;this.render(false)}}}constructor(options){super(options),_define_property(this,"cursor",0),_define_property(this,"expandedNodes",new Set),_define_property(this,"flatList",[]),_define_property(this,"scrollTop",0),_define_property(this,"pageSize",15),_define_property(this,"parentMap",new Map),_define_property(this,"ICON_CLOSED",_symbols.symbols.pointer===">"?"+":"▸"),_define_property(this,"ICON_OPEN",_symbols.symbols.pointer===">"?"-":"▾");this.buildParentMap(this.options.data,null);this.initializeExpanded(this.options.data);if(this.options.initial){const initialSet=new Set(this.options.initial);this.initializeSelection(this.options.data,initialSet);this.recalculateAllParents(this.options.data)}this.checkWindowsAttention();this.recalculateFlatList()}};
@@ -0,0 +1,20 @@
1
+ import { Prompt } from '../base';
2
+ import { TreeOptions, MouseEvent } from '../types';
3
+ export declare class TreePrompt<V> extends Prompt<V, TreeOptions<V>> {
4
+ private cursor;
5
+ private expandedNodes;
6
+ private flatList;
7
+ private scrollTop;
8
+ private readonly pageSize;
9
+ private readonly ICON_CLOSED;
10
+ private readonly ICON_OPEN;
11
+ constructor(options: TreeOptions<V>);
12
+ private expandPathTo;
13
+ private initializeExpanded;
14
+ private recalculateFlatList;
15
+ private traverse;
16
+ private toggleRecursive;
17
+ protected render(_firstRender: boolean): void;
18
+ protected handleInput(char: string, _key: Buffer): void;
19
+ protected handleMouse(event: MouseEvent): void;
20
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"TreePrompt",{enumerable:true,get:function(){return TreePrompt}});const _ansi=require("../ansi");const _base=require("../base");const _theme=require("../theme");const _symbols=require("../symbols");function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}let TreePrompt=class TreePrompt extends _base.Prompt{expandPathTo(value){const find=nodes=>{for(const node of nodes){if(node.value===value)return true;if(node.children){if(find(node.children)){this.expandedNodes.add(node);return true}}}return false};find(this.options.data)}initializeExpanded(nodes){for(const node of nodes){if(node.expanded){this.expandedNodes.add(node)}if(node.children){this.initializeExpanded(node.children)}}}recalculateFlatList(){this.flatList=[];this.traverse(this.options.data,0,null);if(this.cursor>=this.flatList.length){this.cursor=Math.max(0,this.flatList.length-1)}}traverse(nodes,depth,parent){for(const node of nodes){this.flatList.push({node,depth,parent});if(node.children&&node.children.length>0&&this.expandedNodes.has(node)){this.traverse(node.children,depth+1,node)}}}toggleRecursive(node,expand){if(expand)this.expandedNodes.add(node);else this.expandedNodes.delete(node);if(node.children){node.children.forEach(child=>this.toggleRecursive(child,expand))}}render(_firstRender){let output=`${_theme.theme.success}?${_ansi.ANSI.RESET} ${_ansi.ANSI.BOLD}${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET}
2
+ `;if(this.flatList.length===0){output+=` ${_theme.theme.muted}No data${_ansi.ANSI.RESET}`;this.renderFrame(output);return}if(this.cursor<this.scrollTop){this.scrollTop=this.cursor}else if(this.cursor>=this.scrollTop+this.pageSize){this.scrollTop=this.cursor-this.pageSize+1}const visible=this.flatList.slice(this.scrollTop,this.scrollTop+this.pageSize);visible.forEach((item,index)=>{const actualIndex=this.scrollTop+index;const isSelected=actualIndex===this.cursor;const indentSize=this.options.indent||2;const indentation=" ".repeat(item.depth*indentSize);let linePrefix="";if(isSelected){linePrefix=`${_theme.theme.main}${_symbols.symbols.pointer} `}else{linePrefix=" "}let icon=" ";const hasChildren=item.node.children&&item.node.children.length>0;if(hasChildren){if(this.expandedNodes.has(item.node)){icon=`${this.ICON_OPEN} `}else{icon=`${this.ICON_CLOSED} `}}let title=item.node.title;if(item.node.disabled){title=`${_theme.theme.muted}${title} (disabled)${_ansi.ANSI.RESET}`}let line=`${indentation}${icon}${title}`;if(isSelected){line=`${_theme.theme.main}${line}${_ansi.ANSI.RESET}`}output+=linePrefix+line;if(index<visible.length-1)output+="\n"});output+=`
3
+ ${_theme.theme.muted}(Arrows: Nav, e: Expand All, c: Collapse All)${_ansi.ANSI.RESET}`;this.renderFrame(output)}handleInput(char,_key){if(this.flatList.length===0)return;if(this.isUp(char)){this.cursor=(this.cursor-1+this.flatList.length)%this.flatList.length;this.render(false);return}if(this.isDown(char)){this.cursor=(this.cursor+1)%this.flatList.length;this.render(false);return}const currentItem=this.flatList[this.cursor];const node=currentItem.node;const hasChildren=node.children&&node.children.length>0;if(char==="e"&&hasChildren){this.toggleRecursive(node,true);this.recalculateFlatList();this.render(false);return}if(char==="c"&&hasChildren){this.toggleRecursive(node,false);this.recalculateFlatList();this.render(false);return}if(this.isRight(char)){if(hasChildren){if(!this.expandedNodes.has(node)){this.expandedNodes.add(node);this.recalculateFlatList()}else{if(this.cursor+1<this.flatList.length){this.cursor++}}this.render(false);return}}if(this.isLeft(char)){if(hasChildren&&this.expandedNodes.has(node)){this.expandedNodes.delete(node);this.recalculateFlatList();this.render(false);return}else{if(currentItem.parent){const parentIndex=this.flatList.findIndex(x=>x.node===currentItem.parent);if(parentIndex!==-1){this.cursor=parentIndex;this.render(false);return}}}}if(char===" "){if(hasChildren){if(this.expandedNodes.has(node)){this.expandedNodes.delete(node)}else{this.expandedNodes.add(node)}this.recalculateFlatList();this.render(false)}return}if(char==="\r"||char==="\n"){if(!node.disabled){this.submit(node.value)}}}handleMouse(event){if(event.action==="scroll"){if(event.scroll==="up"){this.cursor=(this.cursor-1+this.flatList.length)%this.flatList.length;this.render(false)}else if(event.scroll==="down"){this.cursor=(this.cursor+1)%this.flatList.length;this.render(false)}}}constructor(options){super(options),_define_property(this,"cursor",0),_define_property(this,"expandedNodes",new Set),_define_property(this,"flatList",[]),_define_property(this,"scrollTop",0),_define_property(this,"pageSize",15),_define_property(this,"ICON_CLOSED",_symbols.symbols.pointer===">"?"+":"▸"),_define_property(this,"ICON_OPEN",_symbols.symbols.pointer===">"?"-":"▾");this.initializeExpanded(this.options.data);if(this.options.initial!==undefined){this.expandPathTo(this.options.initial)}this.recalculateFlatList();if(this.options.initial!==undefined){const index=this.flatList.findIndex(item=>item.node.value===this.options.initial);if(index!==-1){this.cursor=index}}}};
@@ -0,0 +1,18 @@
1
+ import { Prompt } from '../base';
2
+ import { BaseOptions } from '../types';
3
+ interface WaitOptions extends BaseOptions {
4
+ seconds: number;
5
+ autoSubmit?: boolean;
6
+ }
7
+ export declare class WaitPrompt extends Prompt<void, WaitOptions> {
8
+ private remaining;
9
+ private timer?;
10
+ private isDone;
11
+ constructor(options: WaitOptions);
12
+ run(): Promise<void>;
13
+ private stopTimer;
14
+ protected cleanup(): void;
15
+ protected render(_firstRender: boolean): void;
16
+ protected handleInput(char: string): void;
17
+ }
18
+ export {};
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"WaitPrompt",{enumerable:true,get:function(){return WaitPrompt}});const _ansi=require("../ansi");const _base=require("../base");const _theme=require("../theme");function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}let WaitPrompt=class WaitPrompt extends _base.Prompt{run(){this.timer=setInterval(()=>{this.remaining--;if(this.remaining<=0){this.isDone=true;this.stopTimer();if(this.options.autoSubmit){this.submit()}else{this.render(false)}}else{this.render(false)}},1e3);return super.run()}stopTimer(){if(this.timer){clearInterval(this.timer);this.timer=undefined}}cleanup(){this.stopTimer();super.cleanup()}render(_firstRender){let output=`${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET} `;if(this.isDone){output+=`${_theme.theme.success}Done! Press Enter to continue.${_ansi.ANSI.RESET}`}else{output+=`${_theme.theme.muted}Please wait... ${this.remaining}s${_ansi.ANSI.RESET}`}this.renderFrame(output)}handleInput(char){if(this.isDone&&(char==="\r"||char==="\n")){this.submit()}}constructor(options){super(options),_define_property(this,"remaining",void 0),_define_property(this,"timer",void 0),_define_property(this,"isDone",false);this.remaining=options.seconds}};
@@ -0,0 +1,33 @@
1
+ export declare class Spinner {
2
+ private text;
3
+ private timer?;
4
+ private frameIndex;
5
+ private isSpinning;
6
+ constructor(text: string);
7
+ /**
8
+ * Starts the spinner animation.
9
+ */
10
+ start(): this;
11
+ /**
12
+ * Stops the spinner animation.
13
+ */
14
+ stop(): this;
15
+ /**
16
+ * Updates the spinner text.
17
+ */
18
+ update(text: string): this;
19
+ /**
20
+ * Stops the spinner and shows a success message.
21
+ */
22
+ success(message?: string): this;
23
+ /**
24
+ * Stops the spinner and shows an error message.
25
+ */
26
+ error(message?: string): this;
27
+ /**
28
+ * Stops the spinner and clears the line.
29
+ */
30
+ clear(): this;
31
+ private render;
32
+ private handleSignal;
33
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"Spinner",{enumerable:true,get:function(){return Spinner}});const _ansi=require("./ansi");const _symbols=require("./symbols");const _theme=require("./theme");function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}let Spinner=class Spinner{start(){if(this.isSpinning)return this;this.isSpinning=true;process.stdout.write(_ansi.ANSI.HIDE_CURSOR);this.render();this.timer=setInterval(()=>{this.render()},80);process.on("SIGINT",this.handleSignal);return this}stop(){if(this.timer){clearInterval(this.timer);this.timer=undefined}if(this.isSpinning){this.isSpinning=false;process.stdout.write(_ansi.ANSI.SHOW_CURSOR);process.removeListener("SIGINT",this.handleSignal)}return this}update(text){this.text=text;return this}success(message){this.stop();const text=message??this.text;process.stdout.write(`${_ansi.ANSI.ERASE_LINE}${_ansi.ANSI.CURSOR_LEFT}${_theme.theme.success}${_symbols.symbols.tick}${_ansi.ANSI.RESET} ${text}
2
+ `);return this}error(message){this.stop();const text=message??this.text;process.stdout.write(`${_ansi.ANSI.ERASE_LINE}${_ansi.ANSI.CURSOR_LEFT}${_theme.theme.error}${_symbols.symbols.cross}${_ansi.ANSI.RESET} ${text}
3
+ `);return this}clear(){this.stop();process.stdout.write(`${_ansi.ANSI.ERASE_LINE}${_ansi.ANSI.CURSOR_LEFT}`);return this}render(){const frame=_symbols.symbols.spinner[this.frameIndex];process.stdout.write(`${_ansi.ANSI.ERASE_LINE}${_ansi.ANSI.CURSOR_LEFT}${_theme.theme.main}${frame}${_ansi.ANSI.RESET} ${this.text}`);this.frameIndex=(this.frameIndex+1)%_symbols.symbols.spinner.length}constructor(text){_define_property(this,"text",void 0);_define_property(this,"timer",void 0);_define_property(this,"frameIndex",0);_define_property(this,"isSpinning",false);_define_property(this,"handleSignal",()=>{this.stop();process.exit(0)});this.text=text}};
@@ -0,0 +1,33 @@
1
+ export interface SymbolDefinition {
2
+ /** Used for success messages or valid states */
3
+ tick: string;
4
+ /** Used for error messages or invalid states */
5
+ cross: string;
6
+ /** Used to point to the current selection */
7
+ pointer: string;
8
+ /** Used for separators or sliders */
9
+ line: string;
10
+ /** Used for checked state in checkboxes/radio */
11
+ checked: string;
12
+ /** Used for unchecked state in checkboxes/radio */
13
+ unchecked: string;
14
+ /** Animation frames for the spinner */
15
+ spinner: string[];
16
+ /** Star symbol for rating */
17
+ star: string;
18
+ /** Empty star symbol for rating */
19
+ starEmpty: string;
20
+ /** Box drawing top-left corner */
21
+ topLeft: string;
22
+ /** Box drawing top-right corner */
23
+ topRight: string;
24
+ /** Box drawing bottom-left corner */
25
+ bottomLeft: string;
26
+ /** Box drawing bottom-right corner */
27
+ bottomRight: string;
28
+ /** Box drawing horizontal line */
29
+ horizontal: string;
30
+ /** Box drawing vertical line */
31
+ vertical: string;
32
+ }
33
+ export declare const symbols: SymbolDefinition;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"symbols",{enumerable:true,get:function(){return symbols}});const _utils=require("./utils");const UnicodeSymbols={tick:"✔",cross:"✖",pointer:"❯",line:"─",checked:"◉",unchecked:"◯",spinner:["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"],star:"★",starEmpty:"☆",topLeft:"┌",topRight:"┐",bottomLeft:"└",bottomRight:"┘",horizontal:"─",vertical:"│"};const AsciiSymbols={tick:"+",cross:"x",pointer:">",line:"-",checked:"[x]",unchecked:"[ ]",spinner:["|","/","-","\\"],star:"*",starEmpty:" ",topLeft:"+",topRight:"+",bottomLeft:"+",bottomRight:"+",horizontal:"-",vertical:"|"};const capabilities=(0,_utils.detectCapabilities)();const useUnicode=capabilities.hasUnicode&&process.env.MEP_NO_UNICODE!=="1";const symbols=useUnicode?UnicodeSymbols:AsciiSymbols;
@@ -0,0 +1,57 @@
1
+ import { TaskConfig, TaskGroupOptions, TaskState } from './types';
2
+ export declare class TaskRunner {
3
+ private tasks;
4
+ private options;
5
+ private timer?;
6
+ private frameIndex;
7
+ private isRunning;
8
+ private lastOutputLines;
9
+ private lastOutputHeight;
10
+ private stdout;
11
+ private originalConsole;
12
+ private logBuffer;
13
+ constructor(options?: TaskGroupOptions);
14
+ /**
15
+ * Registers a new task.
16
+ */
17
+ add(id: string, config: Omit<TaskConfig, 'id'>): TaskRunner;
18
+ /**
19
+ * Updates an existing task.
20
+ */
21
+ update(id: string, updates: Partial<Omit<TaskState, 'id' | 'type' | 'title'>> & {
22
+ title?: string;
23
+ }): void;
24
+ /**
25
+ * Starts a task (sets status to loading).
26
+ */
27
+ start(id: string, message?: string): void;
28
+ /**
29
+ * Mark task as success.
30
+ */
31
+ success(id: string, message?: string): void;
32
+ /**
33
+ * Mark task as error.
34
+ */
35
+ error(id: string, message?: string): void;
36
+ /**
37
+ * Mark task as warning.
38
+ */
39
+ warning(id: string, message?: string): void;
40
+ /**
41
+ * Starts the rendering loop.
42
+ */
43
+ run(): void;
44
+ /**
45
+ * Stops the rendering loop and finalizes output.
46
+ */
47
+ stop(): void;
48
+ private handleSigInt;
49
+ private hijackConsole;
50
+ private restoreConsole;
51
+ /**
52
+ * The core rendering logic using Linear Scan Diffing.
53
+ */
54
+ private render;
55
+ private buildLines;
56
+ private getIcon;
57
+ }
package/dist/tasks.js ADDED
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"TaskRunner",{enumerable:true,get:function(){return TaskRunner}});const _ansi=require("./ansi");const _symbols=require("./symbols");const _utils=require("./utils");function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}let TaskRunner=class TaskRunner{add(id,config){this.tasks.set(id,{id,...config,status:"pending",current:0});return this}update(id,updates){const task=this.tasks.get(id);if(task){Object.assign(task,updates)}}start(id,message){this.update(id,{status:"loading",message})}success(id,message){this.update(id,{status:"success",message})}error(id,message){this.update(id,{status:"error",message})}warning(id,message){this.update(id,{status:"warning",message})}run(){if(this.isRunning)return;this.isRunning=true;this.stdout.write(_ansi.ANSI.HIDE_CURSOR);this.hijackConsole();process.on("SIGINT",this.handleSigInt);this.render();this.timer=setInterval(()=>{this.frameIndex++;this.render()},80)}stop(){if(!this.isRunning)return;if(this.timer){clearInterval(this.timer);this.timer=undefined}this.render();this.isRunning=false;this.restoreConsole();this.stdout.write(_ansi.ANSI.SHOW_CURSOR+"\n");if(this.logBuffer.length>0){this.stdout.write(this.logBuffer.join("\n")+"\n");this.logBuffer=[]}process.removeListener("SIGINT",this.handleSigInt)}hijackConsole(){this.originalConsole={log:console.log,warn:console.warn,error:console.error};const logger=_type=>(...args)=>{const util=require("util");const msg=util.format(...args);this.logBuffer.push(msg)};console.log=logger("log");console.warn=logger("warn");console.error=logger("error")}restoreConsole(){if(this.originalConsole){console.log=this.originalConsole.log;console.warn=this.originalConsole.warn;console.error=this.originalConsole.error;this.originalConsole=null}}render(){const lines=this.buildLines();if(this.lastOutputLines.length===0){this.stdout.write(lines.join("\n"));this.lastOutputLines=lines;this.lastOutputHeight=lines.length;return}let output="";if(this.lastOutputHeight>1){output+=`\x1b[${this.lastOutputHeight-1}A`}output+="\r";for(let i=0;i<lines.length;i++){const newLine=lines[i];output+=_ansi.ANSI.ERASE_LINE+newLine;if(i<lines.length-1){output+="\n"}}if(lines.length<this.lastOutputLines.length){output+=_ansi.ANSI.ERASE_DOWN}this.stdout.write(output);this.lastOutputLines=lines;this.lastOutputHeight=lines.length}buildLines(){const lines=[];for(const task of this.tasks.values()){const icon=this.getIcon(task);const title=task.title;let line=`${icon} ${title}`;if(task.type==="progress"&&task.total){const bar=(0,_utils.generateProgressBar)(task.current,task.total);line+=` ${_ansi.ANSI.FG_GRAY}${bar}${_ansi.ANSI.RESET}`}if(task.message){line+=` ${_ansi.ANSI.DIM}- ${task.message}${_ansi.ANSI.RESET}`}lines.push(line)}return lines}getIcon(task){switch(task.status){case"pending":return`${_ansi.ANSI.FG_GRAY}${_symbols.symbols.unchecked}${_ansi.ANSI.RESET}`;case"loading":{const frame=_symbols.symbols.spinner[this.frameIndex%_symbols.symbols.spinner.length];return`${_ansi.ANSI.FG_CYAN}${frame}${_ansi.ANSI.RESET}`}case"success":return`${_ansi.ANSI.FG_GREEN}${_symbols.symbols.tick}${_ansi.ANSI.RESET}`;case"error":return`${_ansi.ANSI.FG_RED}${_symbols.symbols.cross}${_ansi.ANSI.RESET}`;case"warning":return`${_ansi.ANSI.FG_YELLOW}!${_ansi.ANSI.RESET}`;default:return" "}}constructor(options={}){_define_property(this,"tasks",new Map);_define_property(this,"options",void 0);_define_property(this,"timer",void 0);_define_property(this,"frameIndex",0);_define_property(this,"isRunning",false);_define_property(this,"lastOutputLines",[]);_define_property(this,"lastOutputHeight",0);_define_property(this,"stdout",process.stdout);_define_property(this,"originalConsole",null);_define_property(this,"logBuffer",[]);_define_property(this,"handleSigInt",()=>{this.restoreConsole();this.stdout.write(_ansi.ANSI.SHOW_CURSOR+"\n");process.exit(0)});this.options=options;this.handleSigInt=this.handleSigInt.bind(this)}};
@@ -0,0 +1,2 @@
1
+ import { ThemeConfig } from './types';
2
+ export declare const theme: ThemeConfig;
package/dist/theme.js ADDED
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"theme",{enumerable:true,get:function(){return theme}});const _ansi=require("./ansi");const theme={main:_ansi.ANSI.FG_CYAN,success:_ansi.ANSI.FG_GREEN,error:_ansi.ANSI.FG_RED,muted:_ansi.ANSI.FG_GRAY,title:_ansi.ANSI.RESET,syntax:{key:_ansi.ANSI.FG_CYAN,string:_ansi.ANSI.FG_GREEN,number:_ansi.ANSI.FG_YELLOW,boolean:_ansi.ANSI.FG_MAGENTA,null:_ansi.ANSI.FG_RED,punctuation:_ansi.ANSI.FG_WHITE}};