mepcli 2.0.0-beta.1 → 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 (357) hide show
  1. package/README.md +32 -10
  2. package/dist/ansi.d.ts +36 -0
  3. package/dist/ansi.js +1 -0
  4. package/dist/base.d.ts +60 -0
  5. package/dist/base.js +1 -0
  6. package/dist/{src/core.js → core.d.ts} +175 -347
  7. package/dist/core.js +1 -0
  8. package/dist/data/countries.d.ts +2 -0
  9. package/dist/data/countries.js +1 -0
  10. package/dist/data/licenses.d.ts +2 -0
  11. package/dist/data/licenses.js +1 -0
  12. package/dist/highlight.d.ts +7 -0
  13. package/dist/highlight.js +1 -0
  14. package/dist/index.d.ts +48 -0
  15. package/dist/index.js +1 -0
  16. package/dist/input.d.ts +14 -0
  17. package/dist/input.js +1 -0
  18. package/dist/pipeline.d.ts +90 -0
  19. package/dist/pipeline.js +1 -0
  20. package/dist/prompts/autocomplete.d.ts +22 -0
  21. package/dist/prompts/autocomplete.js +1 -0
  22. package/dist/prompts/box.d.ts +21 -0
  23. package/dist/prompts/box.js +4 -0
  24. package/dist/prompts/breadcrumb-search.d.ts +14 -0
  25. package/dist/prompts/breadcrumb-search.js +2 -0
  26. package/dist/prompts/breadcrumb.d.ts +32 -0
  27. package/dist/prompts/breadcrumb.js +3 -0
  28. package/dist/prompts/byte.d.ts +13 -0
  29. package/dist/prompts/byte.js +5 -0
  30. package/dist/prompts/calculator.d.ts +17 -0
  31. package/dist/prompts/calculator.js +3 -0
  32. package/dist/prompts/calendar.d.ts +33 -0
  33. package/dist/prompts/calendar.js +3 -0
  34. package/dist/prompts/checkbox.d.ts +13 -0
  35. package/dist/prompts/checkbox.js +2 -0
  36. package/dist/prompts/code.d.ts +19 -0
  37. package/dist/prompts/code.js +4 -0
  38. package/dist/prompts/color.d.ts +14 -0
  39. package/dist/prompts/color.js +10 -0
  40. package/dist/prompts/confirm.d.ts +8 -0
  41. package/dist/prompts/confirm.js +1 -0
  42. package/dist/prompts/connection-string.d.ts +18 -0
  43. package/dist/prompts/connection-string.js +1 -0
  44. package/dist/prompts/cron.d.ts +13 -0
  45. package/dist/prompts/cron.js +4 -0
  46. package/dist/prompts/curl-utils.d.ts +25 -0
  47. package/dist/prompts/curl-utils.js +1 -0
  48. package/dist/prompts/curl.d.ts +41 -0
  49. package/dist/prompts/curl.js +12 -0
  50. package/dist/prompts/data-inspector.d.ts +22 -0
  51. package/dist/prompts/data-inspector.js +5 -0
  52. package/dist/prompts/date.d.ts +12 -0
  53. package/dist/prompts/date.js +2 -0
  54. package/dist/prompts/dependency.d.ts +16 -0
  55. package/dist/prompts/dependency.js +3 -0
  56. package/dist/prompts/dial.d.ts +10 -0
  57. package/dist/prompts/dial.js +3 -0
  58. package/dist/prompts/diff.d.ts +10 -0
  59. package/dist/prompts/diff.js +10 -0
  60. package/dist/prompts/draw.d.ts +20 -0
  61. package/dist/prompts/draw.js +6 -0
  62. package/dist/prompts/editor.d.ts +14 -0
  63. package/dist/prompts/editor.js +2 -0
  64. package/dist/prompts/emoji.d.ts +18 -0
  65. package/dist/prompts/emoji.js +5 -0
  66. package/dist/prompts/exec.d.ts +17 -0
  67. package/dist/prompts/exec.js +1 -0
  68. package/dist/prompts/file.d.ts +21 -0
  69. package/dist/prompts/file.js +2 -0
  70. package/dist/prompts/form.d.ts +18 -0
  71. package/dist/prompts/form.js +1 -0
  72. package/dist/prompts/fuzzy-multi-column.d.ts +12 -0
  73. package/dist/prompts/fuzzy-multi-column.js +2 -0
  74. package/dist/prompts/fuzzy.d.ts +12 -0
  75. package/dist/prompts/fuzzy.js +2 -0
  76. package/dist/prompts/gauge.d.ts +21 -0
  77. package/dist/prompts/gauge.js +4 -0
  78. package/dist/prompts/grid.d.ts +14 -0
  79. package/dist/prompts/grid.js +2 -0
  80. package/dist/prompts/heatmap.d.ts +13 -0
  81. package/dist/prompts/heatmap.js +2 -0
  82. package/dist/prompts/ip.d.ts +11 -0
  83. package/dist/prompts/ip.js +3 -0
  84. package/dist/prompts/kanban.d.ts +17 -0
  85. package/dist/prompts/kanban.js +4 -0
  86. package/dist/prompts/keypress.d.ts +7 -0
  87. package/dist/prompts/keypress.js +1 -0
  88. package/dist/prompts/license.d.ts +9 -0
  89. package/dist/prompts/license.js +13 -0
  90. package/dist/prompts/list.d.ts +9 -0
  91. package/dist/prompts/list.js +1 -0
  92. package/dist/prompts/map.d.ts +17 -0
  93. package/dist/prompts/map.js +5 -0
  94. package/dist/prompts/match.d.ts +19 -0
  95. package/dist/prompts/match.js +7 -0
  96. package/dist/prompts/miller.d.ts +15 -0
  97. package/dist/prompts/miller.js +2 -0
  98. package/dist/prompts/multi-column-select.d.ts +10 -0
  99. package/dist/prompts/multi-column-select.js +2 -0
  100. package/dist/prompts/multi-range.d.ts +9 -0
  101. package/dist/prompts/multi-range.js +3 -0
  102. package/dist/prompts/multi-select.d.ts +15 -0
  103. package/dist/prompts/multi-select.js +4 -0
  104. package/dist/prompts/number.d.ts +11 -0
  105. package/dist/prompts/number.js +2 -0
  106. package/dist/prompts/otp.d.ts +10 -0
  107. package/dist/prompts/otp.js +2 -0
  108. package/dist/prompts/pattern.d.ts +22 -0
  109. package/dist/prompts/pattern.js +4 -0
  110. package/dist/prompts/phone.d.ts +41 -0
  111. package/dist/prompts/phone.js +3 -0
  112. package/dist/prompts/quiz-select.d.ts +10 -0
  113. package/dist/prompts/quiz-select.js +7 -0
  114. package/dist/prompts/quiz-text.d.ts +11 -0
  115. package/dist/prompts/quiz-text.js +8 -0
  116. package/dist/prompts/range.d.ts +9 -0
  117. package/dist/prompts/range.js +1 -0
  118. package/dist/prompts/rating.d.ts +8 -0
  119. package/dist/prompts/rating.js +1 -0
  120. package/dist/prompts/regex.d.ts +13 -0
  121. package/dist/prompts/regex.js +5 -0
  122. package/dist/prompts/region.d.ts +11 -0
  123. package/dist/prompts/region.js +5 -0
  124. package/dist/prompts/schedule.d.ts +20 -0
  125. package/dist/prompts/schedule.js +5 -0
  126. package/dist/prompts/scroll.d.ts +13 -0
  127. package/dist/prompts/scroll.js +1 -0
  128. package/dist/prompts/seat.d.ts +17 -0
  129. package/dist/prompts/seat.js +5 -0
  130. package/dist/prompts/select-range.d.ts +8 -0
  131. package/dist/prompts/select-range.js +3 -0
  132. package/dist/prompts/select.d.ts +15 -0
  133. package/dist/prompts/select.js +2 -0
  134. package/dist/prompts/semver.d.ts +6 -0
  135. package/dist/prompts/semver.js +1 -0
  136. package/dist/prompts/shortcut.d.ts +9 -0
  137. package/dist/prompts/shortcut.js +1 -0
  138. package/dist/prompts/slider.d.ts +8 -0
  139. package/dist/prompts/slider.js +1 -0
  140. package/dist/prompts/slot.d.ts +16 -0
  141. package/dist/prompts/slot.js +8 -0
  142. package/dist/prompts/snippet.d.ts +19 -0
  143. package/dist/prompts/snippet.js +4 -0
  144. package/dist/prompts/sort-grid.d.ts +16 -0
  145. package/dist/prompts/sort-grid.js +2 -0
  146. package/dist/prompts/sort.d.ts +14 -0
  147. package/dist/prompts/sort.js +2 -0
  148. package/dist/prompts/spam.d.ts +17 -0
  149. package/dist/prompts/spam.js +2 -0
  150. package/dist/prompts/spreadsheet.d.ts +21 -0
  151. package/dist/prompts/spreadsheet.js +7 -0
  152. package/dist/prompts/table.d.ts +14 -0
  153. package/dist/prompts/table.js +3 -0
  154. package/dist/prompts/text.d.ts +17 -0
  155. package/dist/prompts/text.js +2 -0
  156. package/dist/prompts/time.d.ts +12 -0
  157. package/dist/prompts/time.js +2 -0
  158. package/dist/prompts/toggle.d.ts +8 -0
  159. package/dist/prompts/toggle.js +1 -0
  160. package/dist/prompts/transfer.d.ts +18 -0
  161. package/dist/prompts/transfer.js +5 -0
  162. package/dist/prompts/tree-select.d.ts +31 -0
  163. package/dist/prompts/tree-select.js +3 -0
  164. package/dist/prompts/tree.d.ts +20 -0
  165. package/dist/prompts/tree.js +3 -0
  166. package/dist/prompts/wait.d.ts +18 -0
  167. package/dist/prompts/wait.js +1 -0
  168. package/dist/spinner.d.ts +33 -0
  169. package/dist/spinner.js +3 -0
  170. package/dist/symbols.d.ts +33 -0
  171. package/dist/symbols.js +1 -0
  172. package/dist/tasks.d.ts +57 -0
  173. package/dist/tasks.js +1 -0
  174. package/dist/theme.d.ts +2 -0
  175. package/dist/theme.js +1 -0
  176. package/dist/types.d.ts +503 -0
  177. package/dist/types.js +1 -0
  178. package/dist/utils.d.ts +81 -0
  179. package/dist/utils.js +1 -0
  180. package/package.json +12 -17
  181. package/dist/src/ansi.js +0 -50
  182. package/dist/src/ansi.js.map +0 -1
  183. package/dist/src/base.js +0 -258
  184. package/dist/src/base.js.map +0 -1
  185. package/dist/src/core.js.map +0 -1
  186. package/dist/src/data/countries.js +0 -569
  187. package/dist/src/data/countries.js.map +0 -1
  188. package/dist/src/data/licenses.js +0 -480
  189. package/dist/src/data/licenses.js.map +0 -1
  190. package/dist/src/highlight.js +0 -185
  191. package/dist/src/highlight.js.map +0 -1
  192. package/dist/src/index.js +0 -66
  193. package/dist/src/index.js.map +0 -1
  194. package/dist/src/input.js +0 -158
  195. package/dist/src/input.js.map +0 -1
  196. package/dist/src/pipeline.js +0 -273
  197. package/dist/src/pipeline.js.map +0 -1
  198. package/dist/src/prompts/autocomplete.js +0 -171
  199. package/dist/src/prompts/autocomplete.js.map +0 -1
  200. package/dist/src/prompts/box.js +0 -225
  201. package/dist/src/prompts/box.js.map +0 -1
  202. package/dist/src/prompts/breadcrumb-search.js +0 -260
  203. package/dist/src/prompts/breadcrumb-search.js.map +0 -1
  204. package/dist/src/prompts/breadcrumb.js +0 -307
  205. package/dist/src/prompts/breadcrumb.js.map +0 -1
  206. package/dist/src/prompts/byte.js +0 -176
  207. package/dist/src/prompts/byte.js.map +0 -1
  208. package/dist/src/prompts/calculator.js +0 -243
  209. package/dist/src/prompts/calculator.js.map +0 -1
  210. package/dist/src/prompts/calendar.js +0 -430
  211. package/dist/src/prompts/calendar.js.map +0 -1
  212. package/dist/src/prompts/checkbox.js +0 -159
  213. package/dist/src/prompts/checkbox.js.map +0 -1
  214. package/dist/src/prompts/code.js +0 -271
  215. package/dist/src/prompts/code.js.map +0 -1
  216. package/dist/src/prompts/color.js +0 -165
  217. package/dist/src/prompts/color.js.map +0 -1
  218. package/dist/src/prompts/confirm.js +0 -55
  219. package/dist/src/prompts/confirm.js.map +0 -1
  220. package/dist/src/prompts/connection-string.js +0 -120
  221. package/dist/src/prompts/connection-string.js.map +0 -1
  222. package/dist/src/prompts/cron.js +0 -207
  223. package/dist/src/prompts/cron.js.map +0 -1
  224. package/dist/src/prompts/curl-utils.js +0 -71
  225. package/dist/src/prompts/curl-utils.js.map +0 -1
  226. package/dist/src/prompts/curl.js +0 -431
  227. package/dist/src/prompts/curl.js.map +0 -1
  228. package/dist/src/prompts/data-inspector.js +0 -261
  229. package/dist/src/prompts/data-inspector.js.map +0 -1
  230. package/dist/src/prompts/date.js +0 -185
  231. package/dist/src/prompts/date.js.map +0 -1
  232. package/dist/src/prompts/dependency.js +0 -283
  233. package/dist/src/prompts/dependency.js.map +0 -1
  234. package/dist/src/prompts/dial.js +0 -124
  235. package/dist/src/prompts/dial.js.map +0 -1
  236. package/dist/src/prompts/diff.js +0 -118
  237. package/dist/src/prompts/diff.js.map +0 -1
  238. package/dist/src/prompts/draw.js +0 -191
  239. package/dist/src/prompts/draw.js.map +0 -1
  240. package/dist/src/prompts/editor.js +0 -234
  241. package/dist/src/prompts/editor.js.map +0 -1
  242. package/dist/src/prompts/emoji.js +0 -226
  243. package/dist/src/prompts/emoji.js.map +0 -1
  244. package/dist/src/prompts/exec.js +0 -151
  245. package/dist/src/prompts/exec.js.map +0 -1
  246. package/dist/src/prompts/file.js +0 -217
  247. package/dist/src/prompts/file.js.map +0 -1
  248. package/dist/src/prompts/form.js +0 -241
  249. package/dist/src/prompts/form.js.map +0 -1
  250. package/dist/src/prompts/fuzzy-multi-column.js +0 -161
  251. package/dist/src/prompts/fuzzy-multi-column.js.map +0 -1
  252. package/dist/src/prompts/fuzzy.js +0 -147
  253. package/dist/src/prompts/fuzzy.js.map +0 -1
  254. package/dist/src/prompts/gauge.js +0 -137
  255. package/dist/src/prompts/gauge.js.map +0 -1
  256. package/dist/src/prompts/grid.js +0 -191
  257. package/dist/src/prompts/grid.js.map +0 -1
  258. package/dist/src/prompts/heatmap.js +0 -147
  259. package/dist/src/prompts/heatmap.js.map +0 -1
  260. package/dist/src/prompts/ip.js +0 -138
  261. package/dist/src/prompts/ip.js.map +0 -1
  262. package/dist/src/prompts/kanban.js +0 -233
  263. package/dist/src/prompts/kanban.js.map +0 -1
  264. package/dist/src/prompts/keypress.js +0 -54
  265. package/dist/src/prompts/keypress.js.map +0 -1
  266. package/dist/src/prompts/license.js +0 -144
  267. package/dist/src/prompts/license.js.map +0 -1
  268. package/dist/src/prompts/list.js +0 -124
  269. package/dist/src/prompts/list.js.map +0 -1
  270. package/dist/src/prompts/map.js +0 -262
  271. package/dist/src/prompts/map.js.map +0 -1
  272. package/dist/src/prompts/match.js +0 -271
  273. package/dist/src/prompts/match.js.map +0 -1
  274. package/dist/src/prompts/miller.js +0 -228
  275. package/dist/src/prompts/miller.js.map +0 -1
  276. package/dist/src/prompts/multi-column-select.js +0 -176
  277. package/dist/src/prompts/multi-column-select.js.map +0 -1
  278. package/dist/src/prompts/multi-range.js +0 -189
  279. package/dist/src/prompts/multi-range.js.map +0 -1
  280. package/dist/src/prompts/multi-select.js +0 -183
  281. package/dist/src/prompts/multi-select.js.map +0 -1
  282. package/dist/src/prompts/number.js +0 -166
  283. package/dist/src/prompts/number.js.map +0 -1
  284. package/dist/src/prompts/otp.js +0 -107
  285. package/dist/src/prompts/otp.js.map +0 -1
  286. package/dist/src/prompts/pattern.js +0 -252
  287. package/dist/src/prompts/pattern.js.map +0 -1
  288. package/dist/src/prompts/phone.js +0 -398
  289. package/dist/src/prompts/phone.js.map +0 -1
  290. package/dist/src/prompts/quiz-select.js +0 -114
  291. package/dist/src/prompts/quiz-select.js.map +0 -1
  292. package/dist/src/prompts/quiz-text.js +0 -98
  293. package/dist/src/prompts/quiz-text.js.map +0 -1
  294. package/dist/src/prompts/range.js +0 -164
  295. package/dist/src/prompts/range.js.map +0 -1
  296. package/dist/src/prompts/rating.js +0 -83
  297. package/dist/src/prompts/rating.js.map +0 -1
  298. package/dist/src/prompts/regex.js +0 -145
  299. package/dist/src/prompts/regex.js.map +0 -1
  300. package/dist/src/prompts/region.js +0 -170
  301. package/dist/src/prompts/region.js.map +0 -1
  302. package/dist/src/prompts/schedule.js +0 -270
  303. package/dist/src/prompts/schedule.js.map +0 -1
  304. package/dist/src/prompts/scroll.js +0 -155
  305. package/dist/src/prompts/scroll.js.map +0 -1
  306. package/dist/src/prompts/seat.js +0 -164
  307. package/dist/src/prompts/seat.js.map +0 -1
  308. package/dist/src/prompts/select-range.js +0 -148
  309. package/dist/src/prompts/select-range.js.map +0 -1
  310. package/dist/src/prompts/select.js +0 -163
  311. package/dist/src/prompts/select.js.map +0 -1
  312. package/dist/src/prompts/semver.js +0 -43
  313. package/dist/src/prompts/semver.js.map +0 -1
  314. package/dist/src/prompts/shortcut.js +0 -133
  315. package/dist/src/prompts/shortcut.js.map +0 -1
  316. package/dist/src/prompts/slider.js +0 -69
  317. package/dist/src/prompts/slider.js.map +0 -1
  318. package/dist/src/prompts/slot.js +0 -117
  319. package/dist/src/prompts/slot.js.map +0 -1
  320. package/dist/src/prompts/snippet.js +0 -228
  321. package/dist/src/prompts/snippet.js.map +0 -1
  322. package/dist/src/prompts/sort-grid.js +0 -151
  323. package/dist/src/prompts/sort-grid.js.map +0 -1
  324. package/dist/src/prompts/sort.js +0 -166
  325. package/dist/src/prompts/sort.js.map +0 -1
  326. package/dist/src/prompts/spam.js +0 -80
  327. package/dist/src/prompts/spam.js.map +0 -1
  328. package/dist/src/prompts/spreadsheet.js +0 -240
  329. package/dist/src/prompts/spreadsheet.js.map +0 -1
  330. package/dist/src/prompts/table.js +0 -120
  331. package/dist/src/prompts/table.js.map +0 -1
  332. package/dist/src/prompts/text.js +0 -317
  333. package/dist/src/prompts/text.js.map +0 -1
  334. package/dist/src/prompts/time.js +0 -211
  335. package/dist/src/prompts/time.js.map +0 -1
  336. package/dist/src/prompts/toggle.js +0 -53
  337. package/dist/src/prompts/toggle.js.map +0 -1
  338. package/dist/src/prompts/transfer.js +0 -207
  339. package/dist/src/prompts/transfer.js.map +0 -1
  340. package/dist/src/prompts/tree-select.js +0 -270
  341. package/dist/src/prompts/tree-select.js.map +0 -1
  342. package/dist/src/prompts/tree.js +0 -233
  343. package/dist/src/prompts/tree.js.map +0 -1
  344. package/dist/src/prompts/wait.js +0 -79
  345. package/dist/src/prompts/wait.js.map +0 -1
  346. package/dist/src/spinner.js +0 -105
  347. package/dist/src/spinner.js.map +0 -1
  348. package/dist/src/symbols.js +0 -66
  349. package/dist/src/symbols.js.map +0 -1
  350. package/dist/src/tasks.js +0 -231
  351. package/dist/src/tasks.js.map +0 -1
  352. package/dist/src/theme.js +0 -29
  353. package/dist/src/theme.js.map +0 -1
  354. package/dist/src/types.js +0 -8
  355. package/dist/src/types.js.map +0 -1
  356. package/dist/src/utils.js +0 -480
  357. package/dist/src/utils.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/prompts/file.ts"],"sourcesContent":["import { ANSI } from '../ansi';\nimport { Prompt } from '../base';\nimport { theme } from '../theme';\nimport { symbols } from '../symbols';\nimport { FileOptions } from '../types';\nimport * as fs from 'fs';\nimport * as path from 'path';\n\n/**\n * Implementation of FilePrompt with autocomplete.\n */\nexport class FilePrompt extends Prompt<string, FileOptions> {\n private input: string = '';\n private cursor: number = 0;\n private suggestions: string[] = [];\n private selectedSuggestion: number = -1;\n private errorMsg: string = '';\n private lastLinesUp: number = 0;\n\n constructor(options: FileOptions) {\n super(options);\n this.input = options.basePath || '';\n this.cursor = this.input.length;\n this.updateSuggestions();\n }\n\n /**\n * Updates the suggestions list based on the current input path.\n */\n private updateSuggestions() {\n try {\n // Determine the directory to scan and the partial file name\n const isDirQuery = this.input.endsWith('/') || this.input.endsWith('\\\\');\n const dir = isDirQuery ? this.input : (path.dirname(this.input) || '.');\n const partial = isDirQuery ? '' : path.basename(this.input);\n\n if (fs.existsSync(dir) && fs.statSync(dir).isDirectory()) {\n const files = fs.readdirSync(dir);\n this.suggestions = files\n .filter(f => f.toLowerCase().startsWith(partial.toLowerCase()))\n .filter(f => {\n const fullPath = path.join(dir, f);\n try {\n const stats = fs.statSync(fullPath);\n const isDir = stats.isDirectory();\n if (this.options.onlyDirectories && !isDir) return false;\n if (this.options.extensions && !isDir) {\n return this.options.extensions.some(ext => f.endsWith(ext));\n }\n return true;\n } catch (_e) {\n return false;\n }\n })\n .map(f => {\n const fullPath = path.join(dir, f);\n try {\n // Append separator if the file is a directory\n if (fs.statSync(fullPath).isDirectory()) return f + path.sep;\n } catch (_e) { /* ignore */ }\n return f;\n });\n } else {\n this.suggestions = [];\n }\n } catch (_e) {\n this.suggestions = [];\n }\n this.selectedSuggestion = -1;\n }\n\n protected render(firstRender: boolean) {\n // Restore cursor position to the bottom before renderFrame clears the area\n if (!firstRender && this.lastLinesUp > 0) {\n this.print(`\\x1b[${this.lastLinesUp}B`);\n this.lastLinesUp = 0;\n }\n\n const icon = this.errorMsg ? `${theme.error}${symbols.cross}` : `${theme.success}?`;\n let output = `${icon} ${ANSI.BOLD}${theme.title}${this.options.message}${ANSI.RESET} ${this.input}`;\n\n if (this.suggestions.length > 0) {\n output += '\\n';\n const maxShow = 5;\n const displayed = this.suggestions.slice(0, maxShow);\n\n displayed.forEach((s, i) => {\n if (i > 0) output += '\\n';\n if (i === this.selectedSuggestion) {\n output += `${theme.main}${symbols.pointer} ${s}${ANSI.RESET}`;\n } else {\n output += ` ${s}`;\n }\n });\n if (this.suggestions.length > maxShow) {\n output += `\\n ${theme.muted}...and ${this.suggestions.length - maxShow} more${ANSI.RESET}`;\n }\n }\n\n this.renderFrame(output);\n\n // Move cursor back up to the input line\n const totalLines = this.lastRenderHeight;\n if (totalLines > 1) {\n this.lastLinesUp = totalLines - 1;\n this.print(`\\x1b[${this.lastLinesUp}A`);\n }\n\n // Calculate horizontal cursor position on the input line\n const prefix = `${icon} ${theme.title}${this.options.message} `;\n const prefixLen = this.stripAnsi(prefix).length;\n const targetCol = prefixLen + this.input.length;\n\n this.print(ANSI.CURSOR_LEFT);\n if (targetCol > 0) this.print(`\\x1b[${targetCol}C`);\n this.print(ANSI.SHOW_CURSOR);\n }\n\n protected cleanup() {\n if (this.lastLinesUp > 0) {\n this.print(`\\x1b[${this.lastLinesUp}B`);\n this.lastLinesUp = 0;\n }\n super.cleanup();\n }\n\n protected handleInput(char: string) {\n if (char === '\\t') {\n if (this.suggestions.length > 0) {\n // Use the selected suggestion or the first one available\n const idx = this.selectedSuggestion === -1 ? 0 : this.selectedSuggestion;\n const suggestion = this.suggestions[idx];\n\n const isDir = this.input.endsWith('/') || this.input.endsWith('\\\\');\n const dir = isDir ? this.input : path.dirname(this.input);\n\n // Construct the new path accurately\n const baseDir = (dir === '.' && !this.input.startsWith('.')) ? '' : dir;\n this.input = path.join(baseDir, suggestion);\n this.cursor = this.input.length;\n\n // Immediately refresh suggestions for the new path\n this.updateSuggestions();\n this.render(false);\n }\n return;\n }\n\n if (char === '\\r' || char === '\\n') {\n this.submit(this.input);\n return;\n }\n\n if (this.isDown(char)) {\n if (this.suggestions.length > 0) {\n const count = Math.min(this.suggestions.length, 5);\n this.selectedSuggestion = (this.selectedSuggestion + 1) % count;\n this.render(false);\n }\n return;\n }\n\n if (this.isUp(char)) {\n if (this.suggestions.length > 0) {\n const count = Math.min(this.suggestions.length, 5);\n this.selectedSuggestion = (this.selectedSuggestion - 1 + count) % count;\n this.render(false);\n }\n return;\n }\n\n if (char === '\\u0008' || char === '\\x7f') {\n if (this.input.length > 0) {\n this.input = this.input.slice(0, -1);\n this.updateSuggestions();\n this.render(false);\n }\n return;\n }\n\n if (!/^[\\x00-\\x1F]/.test(char) && !char.startsWith('\\x1b')) {\n this.input += char;\n this.updateSuggestions();\n this.render(false);\n }\n }\n}"],"names":["FilePrompt","Prompt","updateSuggestions","isDirQuery","input","endsWith","dir","path","dirname","partial","basename","fs","existsSync","statSync","isDirectory","files","readdirSync","suggestions","filter","f","toLowerCase","startsWith","fullPath","join","stats","isDir","options","onlyDirectories","extensions","some","ext","_e","map","sep","selectedSuggestion","render","firstRender","lastLinesUp","print","icon","errorMsg","theme","error","symbols","cross","success","output","ANSI","BOLD","title","message","RESET","length","maxShow","displayed","slice","forEach","s","i","main","pointer","muted","renderFrame","totalLines","lastRenderHeight","prefix","prefixLen","stripAnsi","targetCol","CURSOR_LEFT","SHOW_CURSOR","cleanup","handleInput","char","idx","suggestion","baseDir","cursor","submit","isDown","count","Math","min","isUp","test","basePath"],"mappings":"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"}
@@ -1,241 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- Object.defineProperty(exports, "FormPrompt", {
6
- enumerable: true,
7
- get: function() {
8
- return FormPrompt;
9
- }
10
- });
11
- const _ansi = require("../ansi");
12
- const _base = require("../base");
13
- const _theme = require("../theme");
14
- const _symbols = require("../symbols");
15
- const _utils = require("../utils");
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 FormPrompt = class FormPrompt extends _base.Prompt {
30
- render(firstRender) {
31
- if (!firstRender && this.lastLinesUp > 0) {
32
- this.print(`\x1b[${this.lastLinesUp}B`);
33
- }
34
- this.lastLinesUp = 0;
35
- const outputLines = [];
36
- // Title
37
- outputLines.push(`${_theme.theme.success}? ${_ansi.ANSI.BOLD}${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET}`);
38
- if (this.globalError) {
39
- outputLines.push(`${_theme.theme.error}>> ${this.globalError}${_ansi.ANSI.RESET}`);
40
- }
41
- let cursorLineIndex = -1;
42
- let cursorColIndex = 0;
43
- this.options.fields.forEach((field, index)=>{
44
- const isActive = index === this.activeIndex;
45
- const value = this.values[field.name];
46
- const error = this.fieldErrors[field.name];
47
- // Icon
48
- let icon = '';
49
- if (isActive) {
50
- icon = `${_theme.theme.main}${_symbols.symbols.pointer}`; // >
51
- } else {
52
- icon = ' '; // indent
53
- }
54
- // Label
55
- const labelStyle = isActive ? `${_theme.theme.main}${_ansi.ANSI.BOLD}` : _theme.theme.muted;
56
- const label = `${labelStyle}${field.message}:${_ansi.ANSI.RESET}`;
57
- // Value
58
- // Note: Use Secret/Password prompt for case sensitive input, Form prompt is for general text input
59
- const displayValue = isActive ? value : `${_theme.theme.muted}${value}${_ansi.ANSI.RESET}`;
60
- // Construct Line
61
- const line = `${icon} ${label} ${displayValue}`;
62
- outputLines.push(line);
63
- if (isActive) {
64
- // Determine cursor position
65
- // We need visual length of "icon + label + value_up_to_cursor"
66
- const prefix = `${icon} ${label} `;
67
- const valuePrefix = value.substring(0, this.cursor);
68
- cursorLineIndex = outputLines.length - 1;
69
- cursorColIndex = (0, _utils.stringWidth)(this.stripAnsi(prefix)) + (0, _utils.stringWidth)(this.stripAnsi(valuePrefix));
70
- }
71
- // Error for this field
72
- if (error) {
73
- outputLines.push(` ${_theme.theme.error}>> ${error}${_ansi.ANSI.RESET}`);
74
- }
75
- });
76
- // Instructions
77
- outputLines.push('');
78
- outputLines.push(`${_ansi.ANSI.RESET}${_theme.theme.muted}(Use Up/Down/Tab to navigate, Enter to submit)${_ansi.ANSI.RESET}`);
79
- const output = outputLines.join('\n');
80
- this.renderFrame(output);
81
- // Position Cursor
82
- this.print(_ansi.ANSI.SHOW_CURSOR);
83
- if (cursorLineIndex !== -1) {
84
- // Calculate lines up from bottom
85
- const totalLines = outputLines.length;
86
- const linesUp = totalLines - 1 - cursorLineIndex;
87
- if (linesUp > 0) {
88
- this.print(`\x1b[${linesUp}A`);
89
- this.lastLinesUp = linesUp;
90
- }
91
- this.print(_ansi.ANSI.CURSOR_LEFT);
92
- if (cursorColIndex > 0) {
93
- this.print(`\x1b[${cursorColIndex}C`);
94
- }
95
- }
96
- }
97
- handleInput(char, key) {
98
- // Navigation: Up / Shift+Tab
99
- if (this.isUp(char) || char === '\t' && key /* how to detect Shift+Tab? usually \u001b[Z */ || char === '\u001b[Z') {
100
- this.validateCurrentField();
101
- this.moveFocus(-1);
102
- return;
103
- }
104
- // Navigation: Down / Tab
105
- if (this.isDown(char) || char === '\t') {
106
- this.validateCurrentField();
107
- this.moveFocus(1);
108
- return;
109
- }
110
- // Enter
111
- if (char === '\r' || char === '\n') {
112
- this.validateCurrentField().then((isValid)=>{
113
- if (isValid) {
114
- if (this.activeIndex < this.options.fields.length - 1) {
115
- this.moveFocus(1);
116
- } else {
117
- // Submit
118
- this.submitForm();
119
- }
120
- }
121
- });
122
- return;
123
- }
124
- // Editing Active Field
125
- const activeField = this.options.fields[this.activeIndex];
126
- const val = this.values[activeField.name];
127
- if (char === '\u0008' || char === '\x7f') {
128
- if (this.cursor > 0) {
129
- const pre = val.slice(0, this.cursor - 1);
130
- const post = val.slice(this.cursor);
131
- this.values[activeField.name] = pre + post;
132
- this.cursor--;
133
- this.render(false);
134
- }
135
- return;
136
- }
137
- // Left/Right arrow to move cursor within field
138
- if (this.isLeft(char)) {
139
- if (this.cursor > 0) this.cursor--;
140
- this.render(false);
141
- return;
142
- }
143
- if (this.isRight(char)) {
144
- if (this.cursor < val.length) this.cursor++;
145
- this.render(false);
146
- return;
147
- }
148
- // Typing
149
- if (!/^[\x00-\x1F]/.test(char) && !char.startsWith('\x1b')) {
150
- const pre = val.slice(0, this.cursor);
151
- const post = val.slice(this.cursor);
152
- this.values[activeField.name] = pre + char + post;
153
- this.cursor += char.length;
154
- this.fieldErrors[activeField.name] = ''; // Clear error on type
155
- this.render(false);
156
- }
157
- }
158
- handleMouse(event) {
159
- if (event.action === 'scroll') {
160
- if (event.scroll === 'up') {
161
- this.validateCurrentField();
162
- this.moveFocus(-1);
163
- } else if (event.scroll === 'down') {
164
- this.validateCurrentField();
165
- this.moveFocus(1);
166
- }
167
- }
168
- }
169
- moveFocus(direction) {
170
- const nextIndex = this.activeIndex + direction;
171
- if (nextIndex >= 0 && nextIndex < this.options.fields.length) {
172
- this.activeIndex = nextIndex;
173
- // "cursor must jump to end of data"
174
- this.cursor = this.values[this.options.fields[this.activeIndex].name].length;
175
- this.render(false);
176
- }
177
- }
178
- async validateCurrentField() {
179
- const field = this.options.fields[this.activeIndex];
180
- const val = this.values[field.name];
181
- if (field.validate) {
182
- try {
183
- const res = await field.validate(val);
184
- if (res !== true) {
185
- this.fieldErrors[field.name] = typeof res === 'string' ? res : 'Invalid value';
186
- this.render(false);
187
- return false;
188
- }
189
- } catch (err) {
190
- this.fieldErrors[field.name] = err.message || 'Validation failed';
191
- this.render(false);
192
- return false;
193
- }
194
- }
195
- // Clear error if valid
196
- delete this.fieldErrors[field.name];
197
- this.render(false);
198
- return true;
199
- }
200
- cleanup() {
201
- if (this.lastLinesUp > 0) {
202
- this.print(`\x1b[${this.lastLinesUp}B`);
203
- this.lastLinesUp = 0;
204
- }
205
- super.cleanup();
206
- }
207
- async submitForm() {
208
- this.globalError = '';
209
- // Validate all fields
210
- let allValid = true;
211
- for (const field of this.options.fields){
212
- const val = this.values[field.name];
213
- if (field.validate) {
214
- const res = await field.validate(val);
215
- if (res !== true) {
216
- this.fieldErrors[field.name] = typeof res === 'string' ? res : 'Invalid value';
217
- allValid = false;
218
- } else {
219
- delete this.fieldErrors[field.name];
220
- }
221
- }
222
- }
223
- if (allValid) {
224
- this.submit(this.values);
225
- } else {
226
- this.globalError = 'Please fix errors before submitting.';
227
- this.render(false);
228
- }
229
- }
230
- constructor(options){
231
- super(options), _define_property(this, "values", {}), _define_property(this, "activeIndex", 0), _define_property(this, "fieldErrors", {}), _define_property(this, "globalError", ''), _define_property(this, "cursor", 0) // Cursor position for the ACTIVE field.
232
- , _define_property(this, "lastLinesUp", 0) // To track cursor position after render
233
- ;
234
- this.options.fields.forEach((field)=>{
235
- this.values[field.name] = field.initial || '';
236
- });
237
- this.cursor = this.values[this.options.fields[0].name].length;
238
- }
239
- };
240
-
241
- //# sourceMappingURL=form.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/prompts/form.ts"],"sourcesContent":["import { ANSI } from '../ansi';\nimport { Prompt } from '../base';\nimport { theme } from '../theme';\nimport { symbols } from '../symbols';\nimport { FormOptions, MouseEvent } from '../types';\nimport { stringWidth } from '../utils';\n\nexport class FormPrompt extends Prompt<Record<string, string>, FormOptions> {\n private values: Record<string, string> = {};\n private activeIndex: number = 0;\n private fieldErrors: Record<string, string> = {};\n private globalError: string = '';\n private cursor: number = 0; // Cursor position for the ACTIVE field.\n private lastLinesUp: number = 0; // To track cursor position after render\n\n constructor(options: FormOptions) {\n super(options);\n this.options.fields.forEach(field => {\n this.values[field.name] = field.initial || '';\n });\n this.cursor = this.values[this.options.fields[0].name].length;\n }\n\n protected render(firstRender: boolean) {\n if (!firstRender && this.lastLinesUp > 0) {\n this.print(`\\x1b[${this.lastLinesUp}B`);\n }\n this.lastLinesUp = 0;\n\n const outputLines: string[] = [];\n\n // Title\n outputLines.push(`${theme.success}? ${ANSI.BOLD}${theme.title}${this.options.message}${ANSI.RESET}`);\n if (this.globalError) {\n outputLines.push(`${theme.error}>> ${this.globalError}${ANSI.RESET}`);\n }\n\n let cursorLineIndex = -1;\n let cursorColIndex = 0;\n\n this.options.fields.forEach((field, index) => {\n const isActive = index === this.activeIndex;\n const value = this.values[field.name];\n const error = this.fieldErrors[field.name];\n\n // Icon\n let icon = '';\n if (isActive) {\n icon = `${theme.main}${symbols.pointer}`; // >\n } else {\n icon = ' '; // indent\n }\n\n // Label\n const labelStyle = isActive ? `${theme.main}${ANSI.BOLD}` : theme.muted;\n const label = `${labelStyle}${field.message}:${ANSI.RESET}`;\n\n // Value\n // Note: Use Secret/Password prompt for case sensitive input, Form prompt is for general text input\n const displayValue = isActive ? value : `${theme.muted}${value}${ANSI.RESET}`;\n\n // Construct Line\n const line = `${icon} ${label} ${displayValue}`;\n outputLines.push(line);\n\n if (isActive) {\n // Determine cursor position\n // We need visual length of \"icon + label + value_up_to_cursor\"\n const prefix = `${icon} ${label} `;\n const valuePrefix = value.substring(0, this.cursor);\n cursorLineIndex = outputLines.length - 1;\n cursorColIndex = stringWidth(this.stripAnsi(prefix)) + stringWidth(this.stripAnsi(valuePrefix));\n }\n\n // Error for this field\n if (error) {\n outputLines.push(` ${theme.error}>> ${error}${ANSI.RESET}`);\n }\n });\n\n // Instructions\n outputLines.push('');\n outputLines.push(`${ANSI.RESET}${theme.muted}(Use Up/Down/Tab to navigate, Enter to submit)${ANSI.RESET}`);\n\n const output = outputLines.join('\\n');\n this.renderFrame(output);\n\n // Position Cursor\n this.print(ANSI.SHOW_CURSOR);\n\n if (cursorLineIndex !== -1) {\n // Calculate lines up from bottom\n const totalLines = outputLines.length;\n const linesUp = (totalLines - 1) - cursorLineIndex;\n\n if (linesUp > 0) {\n this.print(`\\x1b[${linesUp}A`);\n this.lastLinesUp = linesUp;\n }\n\n this.print(ANSI.CURSOR_LEFT);\n if (cursorColIndex > 0) {\n this.print(`\\x1b[${cursorColIndex}C`);\n }\n }\n }\n\n protected handleInput(char: string, key: Buffer) {\n // Navigation: Up / Shift+Tab\n if (this.isUp(char) || (char === '\\t' && key /* how to detect Shift+Tab? usually \\u001b[Z */) || char === '\\u001b[Z') {\n this.validateCurrentField();\n this.moveFocus(-1);\n return;\n }\n\n // Navigation: Down / Tab\n if (this.isDown(char) || char === '\\t') {\n this.validateCurrentField();\n this.moveFocus(1);\n return;\n }\n\n // Enter\n if (char === '\\r' || char === '\\n') {\n this.validateCurrentField().then(isValid => {\n if (isValid) {\n if (this.activeIndex < this.options.fields.length - 1) {\n this.moveFocus(1);\n } else {\n // Submit\n this.submitForm();\n }\n }\n });\n return;\n }\n\n // Editing Active Field\n const activeField = this.options.fields[this.activeIndex];\n const val = this.values[activeField.name];\n\n if (char === '\\u0008' || char === '\\x7f') { // Backspace\n if (this.cursor > 0) {\n const pre = val.slice(0, this.cursor - 1);\n const post = val.slice(this.cursor);\n this.values[activeField.name] = pre + post;\n this.cursor--;\n this.render(false);\n }\n return;\n }\n\n // Left/Right arrow to move cursor within field\n if (this.isLeft(char)) {\n if (this.cursor > 0) this.cursor--;\n this.render(false);\n return;\n }\n if (this.isRight(char)) {\n if (this.cursor < val.length) this.cursor++;\n this.render(false);\n return;\n }\n\n // Typing\n if (!/^[\\x00-\\x1F]/.test(char) && !char.startsWith('\\x1b')) {\n const pre = val.slice(0, this.cursor);\n const post = val.slice(this.cursor);\n this.values[activeField.name] = pre + char + post;\n this.cursor += char.length;\n this.fieldErrors[activeField.name] = ''; // Clear error on type\n this.render(false);\n }\n }\n\n protected handleMouse(event: MouseEvent) {\n if (event.action === 'scroll') {\n if (event.scroll === 'up') {\n this.validateCurrentField();\n this.moveFocus(-1);\n } else if (event.scroll === 'down') {\n this.validateCurrentField();\n this.moveFocus(1);\n }\n }\n }\n\n private moveFocus(direction: number) {\n const nextIndex = this.activeIndex + direction;\n if (nextIndex >= 0 && nextIndex < this.options.fields.length) {\n this.activeIndex = nextIndex;\n // \"cursor must jump to end of data\"\n this.cursor = this.values[this.options.fields[this.activeIndex].name].length;\n this.render(false);\n }\n }\n\n private async validateCurrentField(): Promise<boolean> {\n const field = this.options.fields[this.activeIndex];\n const val = this.values[field.name];\n\n if (field.validate) {\n try {\n const res = await field.validate(val);\n if (res !== true) {\n this.fieldErrors[field.name] = typeof res === 'string' ? res : 'Invalid value';\n this.render(false);\n return false;\n }\n } catch (err: any) {\n this.fieldErrors[field.name] = err.message || 'Validation failed';\n this.render(false);\n return false;\n }\n }\n\n // Clear error if valid\n delete this.fieldErrors[field.name];\n this.render(false);\n return true;\n }\n\n protected cleanup() {\n if (this.lastLinesUp > 0) {\n this.print(`\\x1b[${this.lastLinesUp}B`);\n this.lastLinesUp = 0;\n }\n super.cleanup();\n }\n\n private async submitForm() {\n this.globalError = '';\n\n // Validate all fields\n let allValid = true;\n for (const field of this.options.fields) {\n const val = this.values[field.name];\n if (field.validate) {\n const res = await field.validate(val);\n if (res !== true) {\n this.fieldErrors[field.name] = typeof res === 'string' ? res : 'Invalid value';\n allValid = false;\n } else {\n delete this.fieldErrors[field.name];\n }\n }\n }\n\n if (allValid) {\n this.submit(this.values);\n } else {\n this.globalError = 'Please fix errors before submitting.';\n this.render(false);\n }\n }\n}\n"],"names":["FormPrompt","Prompt","render","firstRender","lastLinesUp","print","outputLines","push","theme","success","ANSI","BOLD","title","options","message","RESET","globalError","error","cursorLineIndex","cursorColIndex","fields","forEach","field","index","isActive","activeIndex","value","values","name","fieldErrors","icon","main","symbols","pointer","labelStyle","muted","label","displayValue","line","prefix","valuePrefix","substring","cursor","length","stringWidth","stripAnsi","output","join","renderFrame","SHOW_CURSOR","totalLines","linesUp","CURSOR_LEFT","handleInput","char","key","isUp","validateCurrentField","moveFocus","isDown","then","isValid","submitForm","activeField","val","pre","slice","post","isLeft","isRight","test","startsWith","handleMouse","event","action","scroll","direction","nextIndex","validate","res","err","cleanup","allValid","submit","initial"],"mappings":"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"}
@@ -1,161 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- Object.defineProperty(exports, "FuzzyMultiColumnPrompt", {
6
- enumerable: true,
7
- get: function() {
8
- return FuzzyMultiColumnPrompt;
9
- }
10
- });
11
- const _multicolumnselect = require("./multi-column-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 FuzzyMultiColumnPrompt = class FuzzyMultiColumnPrompt extends _multicolumnselect.MultiColumnSelectPrompt {
30
- getFilteredChoices() {
31
- return this.filteredResults || this.options.choices;
32
- }
33
- handleInput(char) {
34
- // Backspace
35
- if (char === '\u0008' || char === '\x7f') {
36
- if (this.searchBuffer.length > 0) {
37
- this.searchBuffer = this.searchBuffer.slice(0, -1);
38
- this.performSearch();
39
- }
40
- return;
41
- }
42
- // Intercept typing to add debounce
43
- if (char.length === 1 && !/^[\x00-\x1F]/.test(char) && !char.startsWith('\x1b')) {
44
- this.searchBuffer += char;
45
- // Check if debounce is needed
46
- if (this.options.choices.length > 1000) {
47
- if (this.debounceTimer) clearTimeout(this.debounceTimer);
48
- this.debounceTimer = setTimeout(()=>{
49
- this.performSearch();
50
- }, 150); // 150ms debounce
51
- } else {
52
- this.performSearch();
53
- }
54
- return;
55
- }
56
- super.handleInput(char);
57
- }
58
- performSearch() {
59
- if (!this.searchBuffer) {
60
- this.filteredResults = this.options.choices;
61
- } else {
62
- const results = this.options.choices.map((c)=>{
63
- if (this.isSeparator(c)) return null;
64
- const match = (0, _utils.fuzzyMatch)(this.searchBuffer, c.title);
65
- return {
66
- choice: c,
67
- match
68
- };
69
- }).filter((item)=>item && item.match !== null)// Sort by score descending
70
- .sort((a, b)=>b.match.score - a.match.score);
71
- this.filteredResults = results.map((r)=>{
72
- r.choice._match = r.match;
73
- return r.choice;
74
- });
75
- }
76
- this.selectedIndex = 0;
77
- this.render(false);
78
- }
79
- highlight(text, indices, isSelected) {
80
- let output = '';
81
- const indexSet = new Set(indices);
82
- for(let i = 0; i < text.length; i++){
83
- if (indexSet.has(i)) {
84
- if (isSelected) {
85
- output += `${_ansi.ANSI.BOLD}${_ansi.ANSI.FG_WHITE}${text[i]}${_theme.theme.main}`; // Reset to main theme
86
- } else {
87
- output += `${_ansi.ANSI.BOLD}${_ansi.ANSI.FG_CYAN}${text[i]}${_ansi.ANSI.RESET}`;
88
- }
89
- } else {
90
- output += text[i];
91
- }
92
- }
93
- return output;
94
- }
95
- render(_firstRender) {
96
- let output = '';
97
- const choices = this.getFilteredChoices();
98
- // Header
99
- const searchStr = this.searchBuffer ? ` ${_theme.theme.muted}(Fuzzy: ${this.searchBuffer})${_ansi.ANSI.RESET}` : '';
100
- output += `${_theme.theme.success}?${_ansi.ANSI.RESET} ${_ansi.ANSI.BOLD}${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET}${searchStr}\n`;
101
- if (choices.length === 0) {
102
- output += ` ${_theme.theme.muted}No results found${_ansi.ANSI.RESET}`;
103
- this.renderFrame(output);
104
- return;
105
- }
106
- // Grid Render
107
- const totalRows = Math.ceil(choices.length / this.cols);
108
- // Adjust Scroll
109
- const currentRow = Math.floor(this.selectedIndex / this.cols);
110
- if (currentRow < this.scrollTop) {
111
- this.scrollTop = currentRow;
112
- } else if (currentRow >= this.scrollTop + this.pageSize) {
113
- this.scrollTop = currentRow - this.pageSize + 1;
114
- }
115
- // Edge case: if list shrinks
116
- if (this.scrollTop > totalRows - 1) {
117
- this.scrollTop = Math.max(0, totalRows - this.pageSize);
118
- }
119
- const startRow = this.scrollTop;
120
- const endRow = Math.min(totalRows, startRow + this.pageSize);
121
- for(let r = startRow; r < endRow; r++){
122
- let rowStr = '';
123
- for(let c = 0; c < this.cols; c++){
124
- const idx = r * this.cols + c;
125
- if (idx >= choices.length) break;
126
- const choice = choices[idx];
127
- // Truncate if needed
128
- let title = choice.title || '';
129
- if ((0, _utils.stringWidth)(title) > this.colWidth - 3) {
130
- title = title.slice(0, this.colWidth - 4) + '…';
131
- }
132
- const match = choice._match;
133
- const isSelected = idx === this.selectedIndex;
134
- if (match && this.searchBuffer) {
135
- title = this.highlight(title, match.indices, isSelected);
136
- }
137
- let cellContent = '';
138
- if (isSelected) {
139
- cellContent = `${_theme.theme.main}${_symbols.symbols.pointer} ${title}${_ansi.ANSI.RESET}`;
140
- } else {
141
- cellContent = ` ${title}`;
142
- }
143
- // Pad cell to colWidth
144
- const currentWidth = (0, _utils.stringWidth)(this.stripAnsi(cellContent));
145
- const padding = Math.max(0, this.colWidth - currentWidth);
146
- // Add cell to row
147
- rowStr += cellContent + ' '.repeat(padding);
148
- }
149
- output += rowStr + '\n';
150
- }
151
- // Remove trailing newline
152
- if (output.endsWith('\n')) output = output.slice(0, -1);
153
- this.renderFrame(output);
154
- }
155
- constructor(options){
156
- super(options), _define_property(this, "filteredResults", []), _define_property(this, "debounceTimer", void 0);
157
- this.filteredResults = this.options.choices;
158
- }
159
- };
160
-
161
- //# sourceMappingURL=fuzzy-multi-column.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/prompts/fuzzy-multi-column.ts"],"sourcesContent":["import { MultiColumnSelectPrompt } from './multi-column-select';\nimport { MultiColumnSelectOptions } from '../types';\nimport { theme } from '../theme';\nimport { ANSI } from '../ansi';\nimport { fuzzyMatch, stringWidth } from '../utils';\nimport { symbols } from '../symbols';\n\nexport class FuzzyMultiColumnPrompt<V> extends MultiColumnSelectPrompt<V> {\n private filteredResults: any[] = [];\n private debounceTimer: any;\n\n constructor(options: MultiColumnSelectOptions<V>) {\n super(options);\n this.filteredResults = this.options.choices;\n }\n\n protected getFilteredChoices() {\n return this.filteredResults || this.options.choices;\n }\n\n protected handleInput(char: string) {\n // Backspace\n if (char === '\\u0008' || char === '\\x7f') {\n if (this.searchBuffer.length > 0) {\n this.searchBuffer = this.searchBuffer.slice(0, -1);\n this.performSearch();\n }\n return;\n }\n\n // Intercept typing to add debounce\n if (char.length === 1 && !/^[\\x00-\\x1F]/.test(char) && !char.startsWith('\\x1b')) {\n this.searchBuffer += char;\n\n // Check if debounce is needed\n if (this.options.choices.length > 1000) {\n if (this.debounceTimer) clearTimeout(this.debounceTimer);\n this.debounceTimer = setTimeout(() => {\n this.performSearch();\n }, 150); // 150ms debounce\n } else {\n this.performSearch();\n }\n return;\n }\n\n super.handleInput(char);\n }\n\n private performSearch() {\n if (!this.searchBuffer) {\n this.filteredResults = this.options.choices;\n } else {\n const results = this.options.choices.map(c => {\n if (this.isSeparator(c)) return null;\n const match = fuzzyMatch(this.searchBuffer, (c as any).title);\n return { choice: c, match };\n }).filter(item => item && item.match !== null)\n // Sort by score descending\n .sort((a, b) => b!.match!.score - a!.match!.score);\n\n this.filteredResults = results.map(r => {\n (r!.choice as any)._match = r!.match;\n return r!.choice;\n });\n }\n\n this.selectedIndex = 0;\n this.render(false);\n }\n\n private highlight(text: string, indices: number[], isSelected: boolean): string {\n let output = '';\n const indexSet = new Set(indices);\n for (let i = 0; i < text.length; i++) {\n if (indexSet.has(i)) {\n if (isSelected) {\n output += `${ANSI.BOLD}${ANSI.FG_WHITE}${text[i]}${theme.main}`; // Reset to main theme\n } else {\n output += `${ANSI.BOLD}${ANSI.FG_CYAN}${text[i]}${ANSI.RESET}`;\n }\n } else {\n output += text[i];\n }\n }\n return output;\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}(Fuzzy: ${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 const match = (choice as any)._match;\n const isSelected = idx === this.selectedIndex;\n\n if (match && this.searchBuffer) {\n title = this.highlight(title, match.indices, isSelected);\n }\n\n let cellContent = '';\n if (isSelected) {\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"],"names":["FuzzyMultiColumnPrompt","MultiColumnSelectPrompt","getFilteredChoices","filteredResults","options","choices","handleInput","char","searchBuffer","length","slice","performSearch","test","startsWith","debounceTimer","clearTimeout","setTimeout","results","map","c","isSeparator","match","fuzzyMatch","title","choice","filter","item","sort","a","b","score","r","_match","selectedIndex","render","highlight","text","indices","isSelected","output","indexSet","Set","i","has","ANSI","BOLD","FG_WHITE","theme","main","FG_CYAN","RESET","_firstRender","searchStr","muted","success","message","renderFrame","totalRows","Math","ceil","cols","currentRow","floor","scrollTop","pageSize","max","startRow","endRow","min","rowStr","idx","stringWidth","colWidth","cellContent","symbols","pointer","currentWidth","stripAnsi","padding","repeat","endsWith"],"mappings":"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"}
@@ -1,147 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- Object.defineProperty(exports, "FuzzySelectPrompt", {
6
- enumerable: true,
7
- get: function() {
8
- return FuzzySelectPrompt;
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 FuzzySelectPrompt = class FuzzySelectPrompt extends _select.SelectPrompt {
30
- getFilteredChoices() {
31
- // Safety check: this.filteredResults might be undefined if called from super() constructor
32
- return this.filteredResults || this.options.choices;
33
- }
34
- handleInput(char) {
35
- // Backspace
36
- if (char === '\u0008' || char === '\x7f') {
37
- if (this.searchBuffer.length > 0) {
38
- this.searchBuffer = this.searchBuffer.slice(0, -1);
39
- this.performSearch();
40
- }
41
- return;
42
- }
43
- // Intercept typing to add debounce
44
- if (char.length === 1 && !/^[\x00-\x1F]/.test(char) && !char.startsWith('\x1b')) {
45
- this.searchBuffer += char;
46
- // Check if debounce is needed
47
- if (this.options.choices.length > 1000) {
48
- if (this.debounceTimer) clearTimeout(this.debounceTimer);
49
- this.debounceTimer = setTimeout(()=>{
50
- this.performSearch();
51
- }, 150); // 150ms debounce
52
- } else {
53
- this.performSearch();
54
- }
55
- return; // Skip super.handleInput for typing
56
- }
57
- super.handleInput(char);
58
- }
59
- performSearch() {
60
- if (!this.searchBuffer) {
61
- this.filteredResults = this.options.choices;
62
- } else {
63
- const results = this.options.choices.map((c)=>{
64
- if (this.isSeparator(c)) return null;
65
- const match = (0, _utils.fuzzyMatch)(this.searchBuffer, c.title);
66
- return {
67
- choice: c,
68
- match
69
- };
70
- }).filter((item)=>item && item.match !== null)// Sort by score descending
71
- .sort((a, b)=>b.match.score - a.match.score);
72
- this.filteredResults = results.map((r)=>{
73
- r.choice._match = r.match;
74
- return r.choice;
75
- });
76
- }
77
- this.selectedIndex = 0;
78
- this.render(false);
79
- }
80
- highlight(text, indices, isSelected) {
81
- let output = '';
82
- const indexSet = new Set(indices);
83
- for(let i = 0; i < text.length; i++){
84
- if (indexSet.has(i)) {
85
- if (isSelected) {
86
- output += `${_ansi.ANSI.BOLD}${_ansi.ANSI.FG_WHITE}${text[i]}${_theme.theme.main}`; // Reset to main theme
87
- } else {
88
- output += `${_ansi.ANSI.BOLD}${_ansi.ANSI.FG_CYAN}${text[i]}${_ansi.ANSI.RESET}`;
89
- }
90
- } else {
91
- output += text[i];
92
- }
93
- }
94
- return output;
95
- }
96
- render(_firstRender) {
97
- let output = '';
98
- const choices = this.getFilteredChoices();
99
- // Adjust Scroll Top
100
- if (this.selectedIndex < this.scrollTop) {
101
- this.scrollTop = this.selectedIndex;
102
- } else if (this.selectedIndex >= this.scrollTop + this.pageSize) {
103
- this.scrollTop = this.selectedIndex - this.pageSize + 1;
104
- }
105
- if (this.scrollTop > choices.length - 1) {
106
- this.scrollTop = Math.max(0, choices.length - this.pageSize);
107
- }
108
- // Header
109
- const searchStr = this.searchBuffer ? ` ${_theme.theme.muted}(Fuzzy: ${this.searchBuffer})${_ansi.ANSI.RESET}` : '';
110
- output += `${_theme.theme.success}?${_ansi.ANSI.RESET} ${_ansi.ANSI.BOLD}${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET}${searchStr}\n`;
111
- if (choices.length === 0) {
112
- output += ` ${_theme.theme.muted}No results found${_ansi.ANSI.RESET}`;
113
- } else {
114
- const visibleChoices = choices.slice(this.scrollTop, this.scrollTop + this.pageSize);
115
- visibleChoices.forEach((choice, index)=>{
116
- const actualIndex = this.scrollTop + index;
117
- if (index > 0) output += '\n';
118
- if (this.isSeparator(choice)) {
119
- output += ` ${_ansi.ANSI.DIM}${choice.text || _symbols.symbols.line.repeat(8)}${_ansi.ANSI.RESET}`;
120
- } else {
121
- let title = choice.title;
122
- const match = choice._match;
123
- const isSelected = actualIndex === this.selectedIndex;
124
- if (match && this.searchBuffer) {
125
- title = this.highlight(title, match.indices, isSelected);
126
- }
127
- if (isSelected) {
128
- output += `${_theme.theme.main}${_symbols.symbols.pointer} ${title}${_ansi.ANSI.RESET}`;
129
- if (match && this.searchBuffer) {
130
- // Show score
131
- // output += ` ${theme.muted}(${Math.round(match.score)})${ANSI.RESET}`;
132
- }
133
- } else {
134
- output += ` ${title}`;
135
- }
136
- }
137
- });
138
- }
139
- this.renderFrame(output);
140
- }
141
- constructor(options){
142
- super(options), _define_property(this, "filteredResults", []), _define_property(this, "debounceTimer", void 0);
143
- this.filteredResults = this.options.choices;
144
- }
145
- };
146
-
147
- //# sourceMappingURL=fuzzy.js.map