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
@@ -1,176 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- Object.defineProperty(exports, "MultiColumnSelectPrompt", {
6
- enumerable: true,
7
- get: function() {
8
- return MultiColumnSelectPrompt;
9
- }
10
- });
11
- const _select = require("./select");
12
- const _theme = require("../theme");
13
- const _ansi = require("../ansi");
14
- const _utils = require("../utils");
15
- const _symbols = require("../symbols");
16
- function _define_property(obj, key, value) {
17
- if (key in obj) {
18
- Object.defineProperty(obj, key, {
19
- value: value,
20
- enumerable: true,
21
- configurable: true,
22
- writable: true
23
- });
24
- } else {
25
- obj[key] = value;
26
- }
27
- return obj;
28
- }
29
- let MultiColumnSelectPrompt = class MultiColumnSelectPrompt extends _select.SelectPrompt {
30
- calculateLayout() {
31
- const termWidth = process.stdout.columns || 80;
32
- const choices = this.options.choices.filter((c)=>!this.isSeparator(c));
33
- if (choices.length === 0) {
34
- this.cols = 1;
35
- this.colWidth = termWidth;
36
- return;
37
- }
38
- // Calculate max item width
39
- let maxLen = 0;
40
- for (const c of choices){
41
- const len = (0, _utils.stringWidth)(c.title);
42
- if (len > maxLen) maxLen = len;
43
- }
44
- // Add padding (pointer + space + item + space)
45
- const itemWidth = maxLen + 4;
46
- if (typeof this.options.cols === 'number') {
47
- this.cols = this.options.cols;
48
- } else {
49
- // Auto
50
- this.cols = Math.floor(termWidth / itemWidth);
51
- if (this.cols < 1) this.cols = 1;
52
- }
53
- // Final column width
54
- this.colWidth = Math.floor(termWidth / this.cols);
55
- }
56
- render(_firstRender) {
57
- let output = '';
58
- const choices = this.getFilteredChoices();
59
- // Header
60
- const searchStr = this.searchBuffer ? ` ${_theme.theme.muted}(Filter: ${this.searchBuffer})${_ansi.ANSI.RESET}` : '';
61
- output += `${_theme.theme.success}?${_ansi.ANSI.RESET} ${_ansi.ANSI.BOLD}${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET}${searchStr}\n`;
62
- if (choices.length === 0) {
63
- output += ` ${_theme.theme.muted}No results found${_ansi.ANSI.RESET}`;
64
- this.renderFrame(output);
65
- return;
66
- }
67
- // Grid Render
68
- const totalRows = Math.ceil(choices.length / this.cols);
69
- // Adjust Scroll
70
- const currentRow = Math.floor(this.selectedIndex / this.cols);
71
- if (currentRow < this.scrollTop) {
72
- this.scrollTop = currentRow;
73
- } else if (currentRow >= this.scrollTop + this.pageSize) {
74
- this.scrollTop = currentRow - this.pageSize + 1;
75
- }
76
- // Edge case: if list shrinks
77
- if (this.scrollTop > totalRows - 1) {
78
- this.scrollTop = Math.max(0, totalRows - this.pageSize);
79
- }
80
- const startRow = this.scrollTop;
81
- const endRow = Math.min(totalRows, startRow + this.pageSize);
82
- for(let r = startRow; r < endRow; r++){
83
- let rowStr = '';
84
- for(let c = 0; c < this.cols; c++){
85
- const idx = r * this.cols + c;
86
- if (idx >= choices.length) break;
87
- const choice = choices[idx];
88
- // Truncate if needed
89
- let title = choice.title || '';
90
- if ((0, _utils.stringWidth)(title) > this.colWidth - 3) {
91
- title = title.slice(0, this.colWidth - 4) + '…';
92
- }
93
- let cellContent = '';
94
- if (idx === this.selectedIndex) {
95
- cellContent = `${_theme.theme.main}${_symbols.symbols.pointer} ${title}${_ansi.ANSI.RESET}`;
96
- } else {
97
- cellContent = ` ${title}`;
98
- }
99
- // Pad cell to colWidth
100
- const currentWidth = (0, _utils.stringWidth)(this.stripAnsi(cellContent));
101
- const padding = Math.max(0, this.colWidth - currentWidth);
102
- // Add cell to row
103
- rowStr += cellContent + ' '.repeat(padding);
104
- }
105
- output += rowStr + '\n';
106
- }
107
- // Remove trailing newline
108
- if (output.endsWith('\n')) output = output.slice(0, -1);
109
- this.renderFrame(output);
110
- }
111
- handleInput(char) {
112
- const choices = this.getFilteredChoices();
113
- if (char === '\r' || char === '\n') {
114
- if (choices.length > 0) {
115
- this.submit(choices[this.selectedIndex].value);
116
- }
117
- return;
118
- }
119
- if (this.isUp(char)) {
120
- const newIndex = this.selectedIndex - this.cols;
121
- if (newIndex >= 0) {
122
- this.selectedIndex = newIndex;
123
- }
124
- this.render(false);
125
- return;
126
- }
127
- if (this.isDown(char)) {
128
- const newIndex = this.selectedIndex + this.cols;
129
- if (newIndex < choices.length) {
130
- this.selectedIndex = newIndex;
131
- }
132
- this.render(false);
133
- return;
134
- }
135
- if (this.isLeft(char)) {
136
- if (this.selectedIndex > 0) {
137
- this.selectedIndex--;
138
- } else {
139
- this.selectedIndex = choices.length - 1;
140
- }
141
- this.render(false);
142
- return;
143
- }
144
- if (this.isRight(char)) {
145
- if (this.selectedIndex < choices.length - 1) {
146
- this.selectedIndex++;
147
- } else {
148
- this.selectedIndex = 0;
149
- }
150
- this.render(false);
151
- return;
152
- }
153
- // Backspace
154
- if (char === '\u0008' || char === '\x7f') {
155
- if (this.searchBuffer.length > 0) {
156
- this.searchBuffer = this.searchBuffer.slice(0, -1);
157
- this.selectedIndex = 0;
158
- this.calculateLayout();
159
- this.render(false);
160
- }
161
- return;
162
- }
163
- // Typing
164
- if (char.length === 1 && !/^[\x00-\x1F]/.test(char) && !char.startsWith('\x1b')) {
165
- this.searchBuffer += char;
166
- this.selectedIndex = 0;
167
- this.render(false);
168
- }
169
- }
170
- constructor(options){
171
- super(options), _define_property(this, "cols", 1), _define_property(this, "colWidth", 0);
172
- this.calculateLayout();
173
- }
174
- };
175
-
176
- //# sourceMappingURL=multi-column-select.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/prompts/multi-column-select.ts"],"sourcesContent":["import { SelectPrompt } from './select';\nimport { MultiColumnSelectOptions, SelectChoice } from '../types';\nimport { theme } from '../theme';\nimport { ANSI } from '../ansi';\nimport { stringWidth } from '../utils';\nimport { symbols } from '../symbols';\n\nexport class MultiColumnSelectPrompt<V> extends SelectPrompt<V, MultiColumnSelectOptions<V>> {\n protected cols: number = 1;\n protected colWidth: number = 0;\n\n constructor(options: MultiColumnSelectOptions<V>) {\n super(options);\n this.calculateLayout();\n }\n\n private calculateLayout() {\n const termWidth = process.stdout.columns || 80;\n const choices = this.options.choices.filter(c => !this.isSeparator(c)) as SelectChoice<V>[];\n\n if (choices.length === 0) {\n this.cols = 1;\n this.colWidth = termWidth;\n return;\n }\n\n // Calculate max item width\n let maxLen = 0;\n for (const c of choices) {\n const len = stringWidth(c.title);\n if (len > maxLen) maxLen = len;\n }\n\n // Add padding (pointer + space + item + space)\n const itemWidth = maxLen + 4;\n\n if (typeof this.options.cols === 'number') {\n this.cols = this.options.cols;\n } else {\n // Auto\n this.cols = Math.floor(termWidth / itemWidth);\n if (this.cols < 1) this.cols = 1;\n }\n\n // Final column width\n this.colWidth = Math.floor(termWidth / this.cols);\n }\n\n protected render(_firstRender: boolean) {\n let output = '';\n const choices = this.getFilteredChoices();\n\n // Header\n const searchStr = this.searchBuffer ? ` ${theme.muted}(Filter: ${this.searchBuffer})${ANSI.RESET}` : '';\n output += `${theme.success}?${ANSI.RESET} ${ANSI.BOLD}${theme.title}${this.options.message}${ANSI.RESET}${searchStr}\\n`;\n\n if (choices.length === 0) {\n output += ` ${theme.muted}No results found${ANSI.RESET}`;\n this.renderFrame(output);\n return;\n }\n\n // Grid Render\n const totalRows = Math.ceil(choices.length / this.cols);\n\n // Adjust Scroll\n const currentRow = Math.floor(this.selectedIndex / this.cols);\n if (currentRow < this.scrollTop) {\n this.scrollTop = currentRow;\n } else if (currentRow >= this.scrollTop + this.pageSize) {\n this.scrollTop = currentRow - this.pageSize + 1;\n }\n\n // Edge case: if list shrinks\n if (this.scrollTop > totalRows - 1) {\n this.scrollTop = Math.max(0, totalRows - this.pageSize);\n }\n\n const startRow = this.scrollTop;\n const endRow = Math.min(totalRows, startRow + this.pageSize);\n\n for (let r = startRow; r < endRow; r++) {\n let rowStr = '';\n for (let c = 0; c < this.cols; c++) {\n const idx = r * this.cols + c;\n if (idx >= choices.length) break;\n\n const choice = choices[idx];\n\n // Truncate if needed\n let title = (choice as any).title || '';\n if (stringWidth(title) > this.colWidth - 3) {\n title = title.slice(0, this.colWidth - 4) + '…';\n }\n\n let cellContent = '';\n if (idx === this.selectedIndex) {\n cellContent = `${theme.main}${symbols.pointer} ${title}${ANSI.RESET}`;\n } else {\n cellContent = ` ${title}`;\n }\n\n // Pad cell to colWidth\n const currentWidth = stringWidth(this.stripAnsi(cellContent));\n const padding = Math.max(0, this.colWidth - currentWidth);\n\n // Add cell to row\n rowStr += cellContent + ' '.repeat(padding);\n }\n output += rowStr + '\\n';\n }\n\n // Remove trailing newline\n if (output.endsWith('\\n')) output = output.slice(0, -1);\n\n this.renderFrame(output);\n }\n\n protected handleInput(char: string) {\n const choices = this.getFilteredChoices();\n\n if (char === '\\r' || char === '\\n') {\n if (choices.length > 0) {\n this.submit((choices[this.selectedIndex] as any).value);\n }\n return;\n }\n\n if (this.isUp(char)) {\n const newIndex = this.selectedIndex - this.cols;\n if (newIndex >= 0) {\n this.selectedIndex = newIndex;\n }\n this.render(false);\n return;\n }\n\n if (this.isDown(char)) {\n const newIndex = this.selectedIndex + this.cols;\n if (newIndex < choices.length) {\n this.selectedIndex = newIndex;\n }\n this.render(false);\n return;\n }\n\n if (this.isLeft(char)) {\n if (this.selectedIndex > 0) {\n this.selectedIndex--;\n } else {\n this.selectedIndex = choices.length - 1;\n }\n this.render(false);\n return;\n }\n\n if (this.isRight(char)) {\n if (this.selectedIndex < choices.length - 1) {\n this.selectedIndex++;\n } else {\n this.selectedIndex = 0;\n }\n this.render(false);\n return;\n }\n\n // Backspace\n if (char === '\\u0008' || char === '\\x7f') {\n if (this.searchBuffer.length > 0) {\n this.searchBuffer = this.searchBuffer.slice(0, -1);\n this.selectedIndex = 0;\n this.calculateLayout();\n this.render(false);\n }\n return;\n }\n\n // Typing\n if (char.length === 1 && !/^[\\x00-\\x1F]/.test(char) && !char.startsWith('\\x1b')) {\n this.searchBuffer += char;\n this.selectedIndex = 0;\n this.render(false);\n }\n }\n}\n\n"],"names":["MultiColumnSelectPrompt","SelectPrompt","calculateLayout","termWidth","process","stdout","columns","choices","options","filter","c","isSeparator","length","cols","colWidth","maxLen","len","stringWidth","title","itemWidth","Math","floor","render","_firstRender","output","getFilteredChoices","searchStr","searchBuffer","theme","muted","ANSI","RESET","success","BOLD","message","renderFrame","totalRows","ceil","currentRow","selectedIndex","scrollTop","pageSize","max","startRow","endRow","min","r","rowStr","idx","choice","slice","cellContent","main","symbols","pointer","currentWidth","stripAnsi","padding","repeat","endsWith","handleInput","char","submit","value","isUp","newIndex","isDown","isLeft","isRight","test","startsWith"],"mappings":"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"}
@@ -1,189 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- Object.defineProperty(exports, "MultiRangePrompt", {
6
- enumerable: true,
7
- get: function() {
8
- return MultiRangePrompt;
9
- }
10
- });
11
- const _selectrange = require("./select-range");
12
- const _theme = require("../theme");
13
- const _ansi = require("../ansi");
14
- const _symbols = require("../symbols");
15
- function _define_property(obj, key, value) {
16
- if (key in obj) {
17
- Object.defineProperty(obj, key, {
18
- value: value,
19
- enumerable: true,
20
- configurable: true,
21
- writable: true
22
- });
23
- } else {
24
- obj[key] = value;
25
- }
26
- return obj;
27
- }
28
- let MultiRangePrompt = class MultiRangePrompt extends _selectrange.SelectRangePrompt {
29
- mergeRanges() {
30
- if (this.committedRanges.length === 0) return;
31
- // Sort by start index
32
- this.committedRanges.sort((a, b)=>a.start - b.start);
33
- const merged = [];
34
- let current = this.committedRanges[0];
35
- for(let i = 1; i < this.committedRanges.length; i++){
36
- const next = this.committedRanges[i];
37
- if (current.end >= next.start - 1) {
38
- current.end = Math.max(current.end, next.end);
39
- } else {
40
- merged.push(current);
41
- current = next;
42
- }
43
- }
44
- merged.push(current);
45
- this.committedRanges = merged;
46
- }
47
- handleInput(char, key) {
48
- // Handle Enter (Submit)
49
- if (char === '\r' || char === '\n') {
50
- const choices = this.getFilteredChoices();
51
- if (choices.length === 0) return;
52
- // If user was dragging, commit that range first
53
- if (this.anchorIndex !== null) {
54
- const start = Math.min(this.anchorIndex, this.selectedIndex);
55
- const end = Math.max(this.anchorIndex, this.selectedIndex);
56
- this.committedRanges.push({
57
- start,
58
- end
59
- });
60
- this.mergeRanges();
61
- this.anchorIndex = null;
62
- }
63
- // Collect all indices from committed ranges
64
- const allIndices = new Set();
65
- for (const range of this.committedRanges){
66
- for(let i = range.start; i <= range.end; i++){
67
- allIndices.add(i);
68
- }
69
- }
70
- if (allIndices.size === 0) {
71
- allIndices.add(this.selectedIndex);
72
- }
73
- const selectedItems = [];
74
- const sortedIndices = Array.from(allIndices).sort((a, b)=>a - b);
75
- for (const idx of sortedIndices){
76
- if (idx < choices.length) {
77
- const choice = choices[idx];
78
- if (!this.isSeparator(choice)) {
79
- selectedItems.push(choice.value);
80
- }
81
- }
82
- }
83
- this.submit(selectedItems);
84
- return;
85
- }
86
- // Handle Space (Anchor/Commit)
87
- if (char === ' ') {
88
- if (this.anchorIndex === null) {
89
- // Start dragging
90
- this.anchorIndex = this.selectedIndex;
91
- } else {
92
- // Commit range
93
- const start = Math.min(this.anchorIndex, this.selectedIndex);
94
- const end = Math.max(this.anchorIndex, this.selectedIndex);
95
- this.committedRanges.push({
96
- start,
97
- end
98
- });
99
- this.mergeRanges();
100
- this.anchorIndex = null;
101
- }
102
- this.render(false);
103
- return;
104
- }
105
- super.handleInput(char, key);
106
- }
107
- render(_firstRender) {
108
- let output = '';
109
- const choices = this.getFilteredChoices();
110
- // Scroll Logic (inherited from SelectPrompt basically, but good to ensure)
111
- if (this.selectedIndex < this.scrollTop) {
112
- this.scrollTop = this.selectedIndex;
113
- } else if (this.selectedIndex >= this.scrollTop + this.pageSize) {
114
- this.scrollTop = this.selectedIndex - this.pageSize + 1;
115
- }
116
- if (this.scrollTop > choices.length - 1) {
117
- this.scrollTop = Math.max(0, choices.length - this.pageSize);
118
- }
119
- // Header
120
- const searchStr = this.searchBuffer ? ` ${_theme.theme.muted}(Filter: ${this.searchBuffer})${_ansi.ANSI.RESET}` : '';
121
- output += `${_theme.theme.success}?${_ansi.ANSI.RESET} ${_ansi.ANSI.BOLD}${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET}${searchStr}\n`;
122
- if (choices.length === 0) {
123
- output += ` ${_theme.theme.muted}No results found${_ansi.ANSI.RESET}`;
124
- } else {
125
- const visibleChoices = choices.slice(this.scrollTop, this.scrollTop + this.pageSize);
126
- visibleChoices.forEach((choice, index)=>{
127
- const actualIndex = this.scrollTop + index;
128
- if (index > 0) output += '\n';
129
- let isCommitted = false;
130
- for (const range of this.committedRanges){
131
- if (actualIndex >= range.start && actualIndex <= range.end) {
132
- isCommitted = true;
133
- break;
134
- }
135
- }
136
- let isDragging = false;
137
- if (this.anchorIndex !== null) {
138
- const min = Math.min(this.anchorIndex, this.selectedIndex);
139
- const max = Math.max(this.anchorIndex, this.selectedIndex);
140
- if (actualIndex >= min && actualIndex <= max) {
141
- isDragging = true;
142
- }
143
- }
144
- if (this.isSeparator(choice)) {
145
- output += ` ${_ansi.ANSI.DIM}${choice.text || _symbols.symbols.line.repeat(8)}${_ansi.ANSI.RESET}`;
146
- } else {
147
- let prefix = ' ';
148
- const title = choice.title;
149
- let content = title;
150
- // Markers
151
- if (actualIndex === this.anchorIndex) {
152
- prefix = `${_theme.theme.muted}> ${_ansi.ANSI.RESET}`;
153
- }
154
- if (actualIndex === this.selectedIndex) {
155
- prefix = `${_theme.theme.main}${_symbols.symbols.pointer} `;
156
- }
157
- if (actualIndex === this.selectedIndex && actualIndex === this.anchorIndex) {
158
- prefix = `${_theme.theme.main}${_symbols.symbols.pointer}>`;
159
- }
160
- // Highlighting
161
- if (isCommitted || isDragging) {
162
- // Apply highlighting style
163
- // If committed, maybe green? If dragging, maybe yellow or just highlighted?
164
- if (actualIndex !== this.selectedIndex && actualIndex !== this.anchorIndex) {
165
- prefix = `${_theme.theme.success}* ${_ansi.ANSI.RESET}`;
166
- }
167
- content = `${_theme.theme.success}${title}${_ansi.ANSI.RESET}`;
168
- if (isDragging && !isCommitted) {
169
- // Distinguish dragging visual? Maybe dim?
170
- // Using same style as single range prompt for consistency
171
- }
172
- }
173
- // Cursor Underline
174
- if (actualIndex === this.selectedIndex) {
175
- content = `${_ansi.ANSI.UNDERLINE}${content}${_ansi.ANSI.RESET}`;
176
- }
177
- output += `${prefix}${content}`;
178
- }
179
- });
180
- }
181
- output += `\n${_theme.theme.muted}(Space to anchor/commit, Enter to submit)${_ansi.ANSI.RESET}`;
182
- this.renderFrame(output);
183
- }
184
- constructor(options){
185
- super(options), _define_property(this, "committedRanges", []);
186
- }
187
- };
188
-
189
- //# sourceMappingURL=multi-range.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/prompts/multi-range.ts"],"sourcesContent":["import { SelectRangePrompt } from './select-range';\nimport { SelectRangeOptions } from '../types';\nimport { theme } from '../theme';\nimport { ANSI } from '../ansi';\nimport { symbols } from '../symbols';\n\nexport class MultiRangePrompt<V> extends SelectRangePrompt<V> {\n private committedRanges: { start: number; end: number }[] = [];\n\n constructor(options: SelectRangeOptions<V>) {\n super(options);\n }\n\n private mergeRanges() {\n if (this.committedRanges.length === 0) return;\n\n // Sort by start index\n this.committedRanges.sort((a, b) => a.start - b.start);\n\n const merged: { start: number; end: number }[] = [];\n let current = this.committedRanges[0];\n\n for (let i = 1; i < this.committedRanges.length; i++) {\n const next = this.committedRanges[i];\n\n if (current.end >= next.start - 1) { // Overlap or adjacent\n current.end = Math.max(current.end, next.end);\n } else {\n merged.push(current);\n current = next;\n }\n }\n merged.push(current);\n this.committedRanges = merged;\n }\n\n protected handleInput(char: string, key?: Buffer) {\n // Handle Enter (Submit)\n if (char === '\\r' || char === '\\n') {\n const choices = this.getFilteredChoices();\n if (choices.length === 0) return;\n\n // If user was dragging, commit that range first\n if (this.anchorIndex !== null) {\n const start = Math.min(this.anchorIndex, this.selectedIndex);\n const end = Math.max(this.anchorIndex, this.selectedIndex);\n this.committedRanges.push({ start, end });\n this.mergeRanges();\n this.anchorIndex = null;\n }\n\n // Collect all indices from committed ranges\n const allIndices = new Set<number>();\n for (const range of this.committedRanges) {\n for (let i = range.start; i <= range.end; i++) {\n allIndices.add(i);\n }\n }\n\n if (allIndices.size === 0) {\n allIndices.add(this.selectedIndex);\n }\n\n const selectedItems: V[] = [];\n const sortedIndices = Array.from(allIndices).sort((a, b) => a - b);\n\n for (const idx of sortedIndices) {\n if (idx < choices.length) {\n const choice = choices[idx];\n if (!this.isSeparator(choice)) {\n selectedItems.push((choice as any).value);\n }\n }\n }\n\n this.submit(selectedItems as any);\n return;\n }\n\n // Handle Space (Anchor/Commit)\n if (char === ' ') {\n if (this.anchorIndex === null) {\n // Start dragging\n this.anchorIndex = this.selectedIndex;\n } else {\n // Commit range\n const start = Math.min(this.anchorIndex, this.selectedIndex);\n const end = Math.max(this.anchorIndex, this.selectedIndex);\n\n this.committedRanges.push({ start, end });\n this.mergeRanges();\n\n this.anchorIndex = null;\n }\n this.render(false);\n return;\n }\n super.handleInput(char, key);\n }\n\n protected render(_firstRender: boolean) {\n let output = '';\n const choices = this.getFilteredChoices();\n\n // Scroll Logic (inherited from SelectPrompt basically, but good to ensure)\n if (this.selectedIndex < this.scrollTop) {\n this.scrollTop = this.selectedIndex;\n } else if (this.selectedIndex >= this.scrollTop + this.pageSize) {\n this.scrollTop = this.selectedIndex - this.pageSize + 1;\n }\n if (this.scrollTop > choices.length - 1) {\n this.scrollTop = Math.max(0, choices.length - this.pageSize);\n }\n\n // Header\n const searchStr = this.searchBuffer ? ` ${theme.muted}(Filter: ${this.searchBuffer})${ANSI.RESET}` : '';\n output += `${theme.success}?${ANSI.RESET} ${ANSI.BOLD}${theme.title}${this.options.message}${ANSI.RESET}${searchStr}\\n`;\n\n if (choices.length === 0) {\n output += ` ${theme.muted}No results found${ANSI.RESET}`;\n } else {\n const visibleChoices = choices.slice(this.scrollTop, this.scrollTop + this.pageSize);\n\n visibleChoices.forEach((choice, index) => {\n const actualIndex = this.scrollTop + index;\n if (index > 0) output += '\\n';\n\n let isCommitted = false;\n for (const range of this.committedRanges) {\n if (actualIndex >= range.start && actualIndex <= range.end) {\n isCommitted = true;\n break;\n }\n }\n\n let isDragging = false;\n if (this.anchorIndex !== null) {\n const min = Math.min(this.anchorIndex, this.selectedIndex);\n const max = Math.max(this.anchorIndex, this.selectedIndex);\n if (actualIndex >= min && actualIndex <= max) {\n isDragging = true;\n }\n }\n\n if (this.isSeparator(choice)) {\n output += ` ${ANSI.DIM}${(choice as any).text || symbols.line.repeat(8)}${ANSI.RESET}`;\n } else {\n let prefix = ' ';\n const title = (choice as any).title;\n let content = title;\n\n // Markers\n if (actualIndex === this.anchorIndex) {\n prefix = `${theme.muted}> ${ANSI.RESET}`;\n }\n if (actualIndex === this.selectedIndex) {\n prefix = `${theme.main}${symbols.pointer} `;\n }\n if (actualIndex === this.selectedIndex && actualIndex === this.anchorIndex) {\n prefix = `${theme.main}${symbols.pointer}>`;\n }\n\n // Highlighting\n if (isCommitted || isDragging) {\n // Apply highlighting style\n // If committed, maybe green? If dragging, maybe yellow or just highlighted?\n\n if (actualIndex !== this.selectedIndex && actualIndex !== this.anchorIndex) {\n prefix = `${theme.success}* ${ANSI.RESET}`;\n }\n\n content = `${theme.success}${title}${ANSI.RESET}`;\n\n if (isDragging && !isCommitted) {\n // Distinguish dragging visual? Maybe dim? \n // Using same style as single range prompt for consistency\n }\n }\n\n // Cursor Underline\n if (actualIndex === this.selectedIndex) {\n content = `${ANSI.UNDERLINE}${content}${ANSI.RESET}`;\n }\n\n output += `${prefix}${content}`;\n }\n });\n }\n\n output += `\\n${theme.muted}(Space to anchor/commit, Enter to submit)${ANSI.RESET}`;\n\n this.renderFrame(output);\n }\n}\n"],"names":["MultiRangePrompt","SelectRangePrompt","mergeRanges","committedRanges","length","sort","a","b","start","merged","current","i","next","end","Math","max","push","handleInput","char","key","choices","getFilteredChoices","anchorIndex","min","selectedIndex","allIndices","Set","range","add","size","selectedItems","sortedIndices","Array","from","idx","choice","isSeparator","value","submit","render","_firstRender","output","scrollTop","pageSize","searchStr","searchBuffer","theme","muted","ANSI","RESET","success","BOLD","title","options","message","visibleChoices","slice","forEach","index","actualIndex","isCommitted","isDragging","DIM","text","symbols","line","repeat","prefix","content","main","pointer","UNDERLINE","renderFrame"],"mappings":"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"}
@@ -1,183 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- Object.defineProperty(exports, "MultiSelectPrompt", {
6
- enumerable: true,
7
- get: function() {
8
- return MultiSelectPrompt;
9
- }
10
- });
11
- const _ansi = require("../ansi");
12
- const _base = require("../base");
13
- const _theme = require("../theme");
14
- const _symbols = require("../symbols");
15
- function _define_property(obj, key, value) {
16
- if (key in obj) {
17
- Object.defineProperty(obj, key, {
18
- value: value,
19
- enumerable: true,
20
- configurable: true,
21
- writable: true
22
- });
23
- } else {
24
- obj[key] = value;
25
- }
26
- return obj;
27
- }
28
- let MultiSelectPrompt = class MultiSelectPrompt extends _base.Prompt {
29
- getFilteredChoices() {
30
- if (!this.searchBuffer) return this.options.choices.map((c, i)=>({
31
- ...c,
32
- originalIndex: i
33
- }));
34
- return this.options.choices.map((c, i)=>({
35
- ...c,
36
- originalIndex: i
37
- })).filter((c)=>c.title.toLowerCase().includes(this.searchBuffer.toLowerCase()));
38
- }
39
- render(_firstRender) {
40
- let output = '';
41
- const choices = this.getFilteredChoices();
42
- // Adjust Scroll
43
- if (this.selectedIndex < this.scrollTop) {
44
- this.scrollTop = this.selectedIndex;
45
- } else if (this.selectedIndex >= this.scrollTop + this.pageSize) {
46
- this.scrollTop = this.selectedIndex - this.pageSize + 1;
47
- }
48
- if (this.scrollTop > choices.length - 1) {
49
- this.scrollTop = Math.max(0, choices.length - this.pageSize);
50
- }
51
- const icon = this.errorMsg ? `${_theme.theme.error}${_symbols.symbols.cross}` : `${_theme.theme.success}?`;
52
- const searchStr = this.searchBuffer ? ` ${_theme.theme.muted}(Filter: ${this.searchBuffer})${_ansi.ANSI.RESET}` : '';
53
- output += `${icon} ${_ansi.ANSI.BOLD}${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET}${searchStr}\n`;
54
- if (choices.length === 0) {
55
- output += ` ${_theme.theme.muted}No results found${_ansi.ANSI.RESET}`;
56
- } else {
57
- const visible = choices.slice(this.scrollTop, this.scrollTop + this.pageSize);
58
- visible.forEach((choice, index)=>{
59
- if (index > 0) output += '\n';
60
- const actualIndex = this.scrollTop + index;
61
- const cursor = actualIndex === this.selectedIndex ? `${_theme.theme.main}${_symbols.symbols.pointer}${_ansi.ANSI.RESET}` : ' ';
62
- const isChecked = this.checkedState[choice.originalIndex];
63
- const checkbox = isChecked ? `${_theme.theme.success}${_symbols.symbols.checked}${_ansi.ANSI.RESET}` : `${_theme.theme.muted}${_symbols.symbols.unchecked}${_ansi.ANSI.RESET}`;
64
- output += `${cursor} ${checkbox} ${choice.title}`;
65
- });
66
- }
67
- // Hints
68
- if (!this.searchBuffer && !this.errorMsg) {
69
- output += `\n${_ansi.ANSI.DIM}(Ctrl+A: All, Ctrl+X: None)${_ansi.ANSI.RESET}`;
70
- }
71
- if (this.errorMsg) {
72
- output += `\n${_theme.theme.error}>> ${this.errorMsg}${_ansi.ANSI.RESET}`;
73
- }
74
- this.renderFrame(output);
75
- }
76
- handleInput(char) {
77
- const choices = this.getFilteredChoices();
78
- // Enter
79
- if (char === '\r' || char === '\n') {
80
- const selectedCount = this.checkedState.filter(Boolean).length;
81
- const { min = 0, max } = this.options;
82
- if (selectedCount < min) {
83
- this.errorMsg = `Select at least ${min}.`;
84
- this.render(false);
85
- return;
86
- }
87
- if (max && selectedCount > max) {
88
- this.errorMsg = `Max ${max} allowed.`;
89
- this.render(false);
90
- return;
91
- }
92
- const results = this.options.choices.filter((_, i)=>this.checkedState[i]).map((c)=>c.value);
93
- this.submit(results);
94
- return;
95
- }
96
- // --- Batch Shortcuts (Visible Items Only) ---
97
- // Ctrl+A (\x01): Select All Visible
98
- if (char === '\x01') {
99
- const newCheckedState = [
100
- ...this.checkedState
101
- ];
102
- let potentialAdd = 0;
103
- // Calculate potential selections
104
- choices.forEach((c)=>{
105
- if (!newCheckedState[c.originalIndex]) potentialAdd++;
106
- });
107
- const currentSelected = newCheckedState.filter(Boolean).length;
108
- if (this.options.max && currentSelected + potentialAdd > this.options.max) {
109
- this.errorMsg = `Max limit ${this.options.max} reached`;
110
- } else {
111
- choices.forEach((c)=>newCheckedState[c.originalIndex] = true);
112
- this.checkedState = newCheckedState;
113
- this.errorMsg = '';
114
- }
115
- this.render(false);
116
- return;
117
- }
118
- // Ctrl+X (\x18): Deselect All Visible
119
- if (char === '\x18') {
120
- choices.forEach((c)=>this.checkedState[c.originalIndex] = false);
121
- this.errorMsg = '';
122
- this.render(false);
123
- return;
124
- }
125
- if (char === ' ') {
126
- if (choices.length > 0) {
127
- const choice = choices[this.selectedIndex];
128
- const originalIndex = choice.originalIndex;
129
- this.checkedState[originalIndex] = !this.checkedState[originalIndex];
130
- this.render(false);
131
- }
132
- return;
133
- }
134
- if (this.isUp(char)) {
135
- if (choices.length > 0) {
136
- this.selectedIndex = (this.selectedIndex - 1 + choices.length) % choices.length;
137
- this.render(false);
138
- }
139
- return;
140
- }
141
- if (this.isDown(char)) {
142
- if (choices.length > 0) {
143
- this.selectedIndex = (this.selectedIndex + 1) % choices.length;
144
- this.render(false);
145
- }
146
- return;
147
- }
148
- if (char === '\u0008' || char === '\x7f') {
149
- if (this.searchBuffer.length > 0) {
150
- this.searchBuffer = this.searchBuffer.slice(0, -1);
151
- this.selectedIndex = 0;
152
- this.render(false);
153
- }
154
- return;
155
- }
156
- // Typing search
157
- if (!/^[\x00-\x1F]/.test(char) && !char.startsWith('\x1b')) {
158
- this.searchBuffer += char;
159
- this.selectedIndex = 0;
160
- this.render(false);
161
- }
162
- }
163
- handleMouse(event) {
164
- const choices = this.getFilteredChoices();
165
- if (choices.length === 0) return;
166
- if (event.action === 'scroll') {
167
- if (event.scroll === 'up') {
168
- this.selectedIndex = (this.selectedIndex - 1 + choices.length) % choices.length;
169
- this.render(false);
170
- } else if (event.scroll === 'down') {
171
- this.selectedIndex = (this.selectedIndex + 1) % choices.length;
172
- this.render(false);
173
- }
174
- }
175
- }
176
- constructor(options){
177
- super(options), _define_property(this, "selectedIndex", 0), _define_property(this, "checkedState", void 0), _define_property(this, "searchBuffer", ''), _define_property(this, "scrollTop", 0), _define_property(this, "pageSize", 7), _define_property(this, "errorMsg", '');
178
- this.checkedState = options.choices.map((c)=>!!c.selected);
179
- this.selectedIndex = 0;
180
- }
181
- };
182
-
183
- //# sourceMappingURL=multi-select.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/prompts/multi-select.ts"],"sourcesContent":["import { ANSI } from '../ansi';\nimport { Prompt } from '../base';\nimport { theme } from '../theme';\nimport { symbols } from '../symbols';\nimport { MultiSelectOptions, MouseEvent } from '../types';\n\n// --- Implementation: MultiSelect Prompt ---\nexport class MultiSelectPrompt<V> extends Prompt<any[], MultiSelectOptions<V>> {\n private selectedIndex: number = 0;\n private checkedState: boolean[];\n private searchBuffer: string = '';\n private scrollTop: number = 0;\n private readonly pageSize: number = 7;\n private errorMsg: string = '';\n\n constructor(options: MultiSelectOptions<V>) {\n super(options);\n this.checkedState = options.choices.map(c => !!c.selected);\n this.selectedIndex = 0;\n }\n\n private getFilteredChoices() {\n if (!this.searchBuffer) return this.options.choices.map((c, i) => ({ ...c, originalIndex: i }));\n return this.options.choices\n .map((c, i) => ({ ...c, originalIndex: i }))\n .filter(c => c.title.toLowerCase().includes(this.searchBuffer.toLowerCase()));\n }\n\n protected render(_firstRender: boolean) {\n let output = '';\n const choices = this.getFilteredChoices();\n\n // Adjust Scroll\n if (this.selectedIndex < this.scrollTop) {\n this.scrollTop = this.selectedIndex;\n } else if (this.selectedIndex >= this.scrollTop + this.pageSize) {\n this.scrollTop = this.selectedIndex - this.pageSize + 1;\n }\n if (this.scrollTop > choices.length - 1) {\n this.scrollTop = Math.max(0, choices.length - this.pageSize);\n }\n\n const icon = this.errorMsg ? `${theme.error}${symbols.cross}` : `${theme.success}?`;\n const searchStr = this.searchBuffer ? ` ${theme.muted}(Filter: ${this.searchBuffer})${ANSI.RESET}` : '';\n output += `${icon} ${ANSI.BOLD}${theme.title}${this.options.message}${ANSI.RESET}${searchStr}\\n`;\n\n if (choices.length === 0) {\n output += ` ${theme.muted}No results found${ANSI.RESET}`;\n } else {\n const visible = choices.slice(this.scrollTop, this.scrollTop + this.pageSize);\n visible.forEach((choice, index) => {\n if (index > 0) output += '\\n';\n\n const actualIndex = this.scrollTop + index;\n const cursor = actualIndex === this.selectedIndex ? `${theme.main}${symbols.pointer}${ANSI.RESET}` : ' ';\n const isChecked = this.checkedState[choice.originalIndex];\n const checkbox = isChecked\n ? `${theme.success}${symbols.checked}${ANSI.RESET}`\n : `${theme.muted}${symbols.unchecked}${ANSI.RESET}`;\n\n output += `${cursor} ${checkbox} ${choice.title}`;\n });\n }\n\n // Hints\n if (!this.searchBuffer && !this.errorMsg) {\n output += `\\n${ANSI.DIM}(Ctrl+A: All, Ctrl+X: None)${ANSI.RESET}`;\n }\n\n if (this.errorMsg) {\n output += `\\n${theme.error}>> ${this.errorMsg}${ANSI.RESET}`;\n }\n\n this.renderFrame(output);\n }\n\n protected handleInput(char: string) {\n const choices = this.getFilteredChoices();\n\n // Enter\n if (char === '\\r' || char === '\\n') {\n const selectedCount = this.checkedState.filter(Boolean).length;\n const { min = 0, max } = this.options;\n if (selectedCount < min) {\n this.errorMsg = `Select at least ${min}.`;\n this.render(false);\n return;\n }\n if (max && selectedCount > max) {\n this.errorMsg = `Max ${max} allowed.`;\n this.render(false);\n return;\n }\n\n const results = this.options.choices\n .filter((_, i) => this.checkedState[i])\n .map(c => c.value);\n this.submit(results);\n return;\n }\n\n // --- Batch Shortcuts (Visible Items Only) ---\n\n // Ctrl+A (\\x01): Select All Visible\n if (char === '\\x01') {\n const newCheckedState = [...this.checkedState];\n let potentialAdd = 0;\n\n // Calculate potential selections\n choices.forEach(c => {\n if (!newCheckedState[c.originalIndex]) potentialAdd++;\n });\n\n const currentSelected = newCheckedState.filter(Boolean).length;\n if (this.options.max && (currentSelected + potentialAdd) > this.options.max) {\n this.errorMsg = `Max limit ${this.options.max} reached`;\n } else {\n choices.forEach(c => newCheckedState[c.originalIndex] = true);\n this.checkedState = newCheckedState;\n this.errorMsg = '';\n }\n this.render(false);\n return;\n }\n\n // Ctrl+X (\\x18): Deselect All Visible\n if (char === '\\x18') {\n choices.forEach(c => this.checkedState[c.originalIndex] = false);\n this.errorMsg = '';\n this.render(false);\n return;\n }\n\n if (char === ' ') {\n if (choices.length > 0) {\n const choice = choices[this.selectedIndex];\n const originalIndex = choice.originalIndex;\n this.checkedState[originalIndex] = !this.checkedState[originalIndex];\n this.render(false);\n }\n return;\n }\n\n if (this.isUp(char)) {\n if (choices.length > 0) {\n this.selectedIndex = (this.selectedIndex - 1 + choices.length) % choices.length;\n this.render(false);\n }\n return;\n }\n if (this.isDown(char)) {\n if (choices.length > 0) {\n this.selectedIndex = (this.selectedIndex + 1) % choices.length;\n this.render(false);\n }\n return;\n }\n\n if (char === '\\u0008' || char === '\\x7f') { // Backspace\n if (this.searchBuffer.length > 0) {\n this.searchBuffer = this.searchBuffer.slice(0, -1);\n this.selectedIndex = 0;\n this.render(false);\n }\n return;\n }\n\n // Typing search\n if (!/^[\\x00-\\x1F]/.test(char) && !char.startsWith('\\x1b')) {\n this.searchBuffer += char;\n this.selectedIndex = 0;\n this.render(false);\n }\n }\n\n protected handleMouse(event: MouseEvent) {\n const choices = this.getFilteredChoices();\n if (choices.length === 0) return;\n\n if (event.action === 'scroll') {\n if (event.scroll === 'up') {\n this.selectedIndex = (this.selectedIndex - 1 + choices.length) % choices.length;\n this.render(false);\n } else if (event.scroll === 'down') {\n this.selectedIndex = (this.selectedIndex + 1) % choices.length;\n this.render(false);\n }\n }\n }\n}\n"],"names":["MultiSelectPrompt","Prompt","getFilteredChoices","searchBuffer","options","choices","map","c","i","originalIndex","filter","title","toLowerCase","includes","render","_firstRender","output","selectedIndex","scrollTop","pageSize","length","Math","max","icon","errorMsg","theme","error","symbols","cross","success","searchStr","muted","ANSI","RESET","BOLD","message","visible","slice","forEach","choice","index","actualIndex","cursor","main","pointer","isChecked","checkedState","checkbox","checked","unchecked","DIM","renderFrame","handleInput","char","selectedCount","Boolean","min","results","_","value","submit","newCheckedState","potentialAdd","currentSelected","isUp","isDown","test","startsWith","handleMouse","event","action","scroll","selected"],"mappings":"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"}